ZGlmZiAtLWdpdCBhL3YxL0NIQU5HRVMudHh0IGIvdjEvQ0hBTkdFUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjNjYwYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL0NIQU5HRVMudHh0CkBAIC0wLDAgKzEsMTIgQEAKK0NoYW5nZXMgc2luY2UgdjEuMC4yOgorCistIGludGVyZmFjZSBleHRlbnNpb24gKENlemFyIEFuZHJlaSkKKy0gcHJlL3Bvc3QgZXh0ZW5zaW9uIChDZXphciBBbmRyZWkpCistIGludGVyZmFjZSBleHRlbnNpb24gdGVzdHMgKFlhbmEgS2FkaXlza2EpCistIHByZS9wb3N0IGV4dGVuc2lvbiB0ZXN0cyAoWWFuYSBLYWRpeXNrYSkKKy0gYnVpbGQgeGJlYW5feHBhdGguamFyIGJ5IGRlZmF1bHQgKENlemFyIEFuZHJlaSkKKy0gZml4ZWQgYW4gTlBFIGluIHRoZSBWYWxpZGF0b3IgKENlemFyIEFuZHJlaSkKKy0gcGVyZiBpbXByb3ZlbWVudCB3aGVuIHVzaW5nIExpc3QudG9BcnJheSgpIGJ5IHBhc3NpbmcgaW4KKyAgICBhbiBhcnJheSBvZiByaWdodCBzaXplIChLZXZpbiBLcm91c2UpCistIGZpeGVkIG1lbW9yeSBsZWFrIGluIEN1cnNvckRhdGEgKENpZCBEZW5uaXMvS2V2aW4gS3JvdXNlKQorLSBhZGQgb3B0aW9uIHRvIHBhc3MgaW4gIiMjbG9jYWwiIHRvIC1hbGxvd21kZWYgKFJheSBCaXJrbGlkL1JhZHUgUHJlb3RpdWMpCmRpZmYgLS1naXQgYS92MS9MSUNFTlNFLnR4dCBiL3YxL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGIxMjcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDIwMyBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwpkaWZmIC0tZ2l0IGEvdjEvTk9USUNFLnR4dCBiL3YxL05PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5ZWI4MwotLS0gL2Rldi9udWxsCisrKyBiL3YxL05PVElDRS50eHQKQEAgLTAsMCArMSwzIEBACitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5CitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorCmRpZmYgLS1naXQgYS92MS9SRUFETUUudHh0IGIvdjEvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZjMmYzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvUkVBRE1FLnR4dApAQCAtMCwwICsxLDkzIEBACitYTUxCZWFucyB2MS4wLjMKKworV2VsY29tZSB0byBYbWxCZWFucyEKKworCitJZiB5b3UndmUgY29tZSBoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgWG1sQmVhbnMsIGhlcmUgYXJlIGEgZmV3CitzdGFydGluZyBwb2ludHM6CisKKworCisKKygxKSBEb2NzCisKK0lmIHlvdSAiYW50IGRvY3MiIHRoZW4geW91IGNhbiBnZXQgamF2YWRvY3MgYnVpbHQgZm9yIGEgYnVuY2gKK29mIG91ciBzdHVmZi4gSW4gcGFydGljdWxhciwgbG9vayBhdCB0aGUgb3JnLmFwYWNoZS54bWxiZWFucyBwYWNrYWdlLAorc3RhcnRpbmcgd2l0aCBYbWxPYmplY3QgYW5kIFhtbEN1cnNvci4KKworTm90IGEgbG90IGlzIGRvYydlZCB5ZXQsIHNvIHlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlIHNhbXBsZXMKK3RvIGxlYXJuIG1vcmUgLSB3ZSByZWFsbHkgbmVlZCBhIGxpdHRsZSB0dXRvcmlhbC4KKworSW4gdGhlIG1lYW4gdGltZSwgaWYgeW91J3ZlIGdvdCBtb3JlIHF1ZXN0aW9ucywgcGxlYXNlIHBvc3QgeW91ciBxdWVzdGlvbnMKK3RvIHhtbGJlYW5zLXVzZXJAeG1sLmFwYWNoZS5vcmcgKHlvdSBuZWVkIHRvIHN1YnNjcmliZSBwcmlvciB0byBwb3N0aW5nLAorYnkgc2VuZGluZyBhIGJsYW5rIG1haWwgdG8geG1sYmVhbnMtdXNlci1zdWJzY3JpYmVAeG1sLmFwYWNoZS5vcmcpLgorCisKKworKDIpIEJ1aWxkCisKK1RoZSBkZWZhdWx0IHRhcmdldCwgYWthICJhbnQgZGVmYXVsdCIsIGJ1aWxkcyBldmVyeXRoaW5nIHlvdSBuZWVkCit0byB0ZXN0IGFuZCBydW4uCisKKworT3RoZXIgdGFyZ2V0czoKKyAgYW50IGJ1aWxkOiBidWlsZHMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgamFycyBzbyBvdGhlciBkZXBlbmRlbmNpZXMgY2FuIGNvbXBpbGUKKyAgYW50IGRlcGxveTogYnVpbGRzIHhiZWFuLmphciB0b28KKyAgYW50IGRydDogYnVpbGRzIGRydCB0ZXN0cyB0b28KKyAgYW50IGJvb3RzdHJhcDogYnVpbGRzIHhiZWFuLmphciwgdGhlbiBidWlsZHMgaXQgYWdhaW4gdXNpbmcgaXRzZWxmLgorCisKK0ludGVyZmFjZSBKQVJzOgorCit4bWxwdWJsaWMuamFyIC0gdGhlIFhCZWFucyBwdWJsaWMgaW50ZXJmYWNlcywgZm9yIHVzZSBieSBvdXIgdXNlcnMuCit3bHhiZWFuLmphciAtIGludGVyZmFjZXMgc3BlY2lmaWMgdG8gdGhlIElERS9ydW50aW1lLCBub3QgZm9yIHVzZSBieSBvdGhlcnMuCisKKworSW1wbGVtZW50YXRpb24gSkFSczoKKworeGJlYW4uamFyIC0gdGhlIHdob2xlIHhiZWFuLmphciAtIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8gcnVuLiBXaGVuIHRoaXMKKyBpcyBvbiB5b3VyIGNsYXNzcGF0aCwgeW91IGRvbid0IG5lZWQgeG1scHVibGljLmphciBvciB3bHhiZWFuLmphcgorCisKK1Rlc3RpbmcgSkFSczoKKworZHJ0LmphciAtIG91ciBEUlQKK2VudW10ZXN0LmphciwgZWFzeXBvLmphciwgbmFtZXdvcmxkLmphciwgeHN0eXBlcy5qYXIgLSBzYW1wbGUgWEJlYW4gSkFScy4KKworCitPdGhlciBKQVJzOgorCitvbGR4YmVhbi5qYXIgLSBhIGZ1bGx5IGJ1aWx0IHByZXZpb3VzLXZlcnNpb24gb2YgeGJlYW4uamFyLCB1c2VkIGZvcgorICBib290c3RyYXBwaW5nLCBzaW5jZSB4YmVhbnMgYXJlIHVzZWQgaW4gYnVpbGRpbmcgeGJlYW4uamFyIGl0c2VsZi4KKworCisKKworCisoMykgUnVubmluZworCitUaGVyZSBhcmUgYSBmZXcgd2F5cyB5b3UgY2FuIHJ1bi4gIFRoZXJlIGlzIHNvbWUgcHJldHR5IHBsYWluLWphbmUKK0pVbml0IHRlc3RpbmcgY29kZSBjaGVja2VkIGludG8geGJlYW5cdGVzdFxzcmNcZHJ0IHRoYXQgeW91IGNhbgordXNlIHRvIHNlZSBob3cgdG8gZXhlcmNpc2Ugb3VyIGZ1bmN0aW9uYWxpdHkuIChUaGUgdGVzdHMgaW4gdGhhdAorZGlyZWN0b3J5IGFyZSBvdXIgRGV2ZWxvcGVyIFJlZ3Jlc3Npb24gVGVzdHMuKQorCitZb3UgY2FuIHJ1biB0aGUgZHJ0IHVzaW5nIHhiZWFuXGJpblxkcnRbLnNofC5jbWRdLgorCitBbm90aGVyIHRvb2wgdGhhdCB5b3UgY2FuIHVzZSBpcyAic2NvbXAiLCB0aGUgWEJlYW4gc2NoZW1hCitjb21waWxlci4gVGhlIHNjb21wIHNjcmlwdCBpcyBhdCB4YmVhblxiaW5cc2NvbXBbLnNofC5jbWRdLgorCitUbyBydW4gc2NvbXAsIGp1c3QgcG9pbnQgaXQgYXQgYW4gWFNEIGZpbGUgb3IgYSBkaXJlY3RvcnkgZnVsbAorb2YgWFNEIGZpbGVzLCBhbmQgaXQgd2lsbCBwcm9kdWNlIGFuIG91dHB1dCAuamFyIHdpdGggYWxsIHlvdXIKK3R5cGVzLgorCitTaW5jZSBzY29tcCBqYXJzIHVwIGl0cyByZXN1bHRzLCBpdCBjYW4gYmUgaGFyZCB0byBzZWUgd2hhdCBpdAoraXMgZG9pbmcuIEJ1dCBpZiB5b3UgdXNlIHRoZSAiLXNyYyBteWRpciIgb3B0aW9uIHdpdGggc2NvbXAsCit5b3UgY2FuIHNwZWNpZnkgYSBkaXJlY3RvcnkgaW50byB3aGljaCBpdCB3aWxsIGR1bXAgLmphdmEgc291cmNlCitjb2RlIGZpbGVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgamF2YSB0eXBlcyBpdCBpcyBnZW5lcmF0aW5nLgorCitGaW5hbGx5LCB0aGVyZSBpcyBhIHV0aWxpdHkgY2FsbGVkICJkdW1weHNiIi4gSWYgeW91IHVuamFyCithIGJ1aWx0IHhiZWFuIGphciwgeW91J2xsIG5vdGljZSBhIGJ1bmNoIG9mIC54c2IgZmlsZXMgc2NhdHRlcmVkCithYm91dC4gRWFjaCBvbmUgb2YgdGhlc2UgZmlsZXMgcmVwcmVzZW50cyBhIHNjaGVtYSB0eXBlLCBhdHRyaWJ1dGUsCitvciBlbGVtZW50IGRlZmluaXRpb24sIGFuZCB5b3UgY2FuIHVzZSAiZHVtcHhzYiIgdG8gc2VlIHRoZQorY29udGVudHMuCisKZGlmZiAtLWdpdCBhL3YxL2Jpbi9kdW1weHNiIGIvdjEvYmluL2R1bXB4c2IKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyNGRhNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi9kdW1weHNiCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorI1hTQiBmaWxlIGR1bXBlcgorI1ByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZG1ibGUgZm9ybQorCitjcD0KKworaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXIgXTsgdGhlbgorICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXI7CitlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CitmaQorCitjYXNlICJgdW5hbWVgIiBpbgorICAgIENZR1dJTiopCisgICAgICAgIGNwPWBjeWdwYXRoIC13IC1wICRjcGAKKyAgICAgICAgOzsKK2VzYWMKKworamF2YSAtY2xhc3NwYXRoICRjcCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Yc2JEdW1wZXIgJCoKZGlmZiAtLWdpdCBhL3YxL2Jpbi9kdW1weHNiLmNtZCBiL3YxL2Jpbi9kdW1weHNiLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDlmZTFhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvYmluL2R1bXB4c2IuY21kCkBAIC0wLDAgKzEsMTkgQEAKK0ByZW0gWFNCIGZpbGUgZHVtcGVyCitAcmVtCitAcmVtIFByaW50cyB0aGUgY29udGVudHMgb2YgYW4geHNiIGZpbGUgaW4gaHVtYW4tcmVhZGFibGUgZm9ybQorQGVjaG8gb2ZmCisKK3NldGxvY2FsCitpZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCisKK3NldCBjcD0KKworaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCispIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKykKKworamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWHNiRHVtcGVyICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vamF4YmMuY21kIGIvdjEvYmluL2pheGJjLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQyMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvYmluL2pheGJjLmNtZApAQCAtMCwwICsxLDE2IEBACitAcmVtIFNjaGVtYSBjb21waWxlcgorQHJlbQorQHJlbSBCdWlsZHMgamF4YiB0eXBlcyBmcm9tIHhzZCBmaWxlcy4KKworQGVjaG8gb2ZmCisKK3NldGxvY2FsCitpZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCisKK3NldCBjcD0KK3NldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIKK3NldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxleHRlcm5hbFxsaWJcamF4Yi0xLjBcamF4Yi1hcGkuamFyCisKK2phdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIC1qYXhiICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vcmFuZG9tLmNtZCBiL3YxL2Jpbi9yYW5kb20uY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjdkMjYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9iaW4vcmFuZG9tLmNtZApAQCAtMCwwICsxLDE2IEBACitAZWNobyBvZmYKKworQHJlbSBEUlQKK0ByZW0KK0ByZW0gSW52b2tlcyBSYW5kb20gdGVzdAorCitzZXRsb2NhbAoraWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQorCitzZXQgY3A9CitzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyCitzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRccHJpdmF0ZVxsaWJccmFuZG9tLmphcgorc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXHByaXZhdGVcbGliXGVhc3lwby5qYXIKKworcmVtIGphdmEgLWVhIC1EdHJlZWFzc2VydHM9dHJ1ZSAgLUR4YmVhbi5yb290ZGlyPSVYTUxCRUFOU19IT01FJSAtY2xhc3NwYXRoICVjcCUgUmFuZG9tIC1ub3F1ZXJ5ICUqCisgICAgamF2YSAtZWEgLUR0cmVlYXNzZXJ0cz1mYWxzZSAtRHhiZWFuLnJvb3RkaXI9JVhNTEJFQU5TX0hPTUUlIC1jbGFzc3BhdGggJWNwJSBSYW5kb20gLW5vcXVlcnkgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi9zY29tcCBiL3YxL2Jpbi9zY29tcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2NiZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvYmluL3Njb21wCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjU2NoZW1hIGNvbXBpbGVyCisjQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgorCitjcD0KKworaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXIgXTsgdGhlbgorICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXI7CitlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CitmaQorCitjYXNlICJgdW5hbWVgIiBpbgorICAgIENZR1dJTiopCisgICAgICAgIGNwPWBjeWdwYXRoIC13IC1wICRjcGAKKyAgICAgICAgOzsKK2VzYWMKKworamF2YSAtY2xhc3NwYXRoICRjcCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb21wLmNtZCBiL3YxL2Jpbi9zY29tcC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmYjA1NgotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi9zY29tcC5jbWQKQEAgLTAsMCArMSwyMCBAQAorQHJlbSBTY2hlbWEgY29tcGlsZXIKK0ByZW0KK0ByZW0gQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgorCitAZWNobyBvZmYKKworc2V0bG9jYWwKK2lmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKKworc2V0IGNwPQorCitpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCisgICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KKykgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorKQorCitqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciAlKgorCis6ZG9uZQpkaWZmIC0tZ2l0IGEvdjEvYmluL3Njb3B5LmNtZCBiL3YxL2Jpbi9zY29weS5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyOWE2MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi9zY29weS5jbWQKQEAgLTAsMCArMSwyMCBAQAorQHJlbSBTY2hlbWEgY29tcGlsZXIKK0ByZW0KK0ByZW0gQnVpbGRzIFhCZWFuIHR5cGVzIGZyb20geHNkIGZpbGVzLgorCitAZWNobyBvZmYKKworc2V0bG9jYWwKK2lmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKKworc2V0IGNwPQorCitpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCisgICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KKykgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorKQorCitqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb3B5ICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vc2Rvd25sb2FkLmNtZCBiL3YxL2Jpbi9zZG93bmxvYWQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjNlMmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9iaW4vc2Rvd25sb2FkLmNtZApAQCAtMCwwICsxLDIwIEBACitAcmVtIFNjaGVtYSBkb3dubG9hZGVyCitAcmVtCitAcmVtIFRvb2wgdG8gZG93bmxvYWQgc2NoZW1hcy4KKworQGVjaG8gb2ZmCisKK3NldGxvY2FsCitpZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCisKK3NldCBjcD0KKworaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCispIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKykKKworamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuU2NoZW1hUmVzb3VyY2VNYW5hZ2VyICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vc2ZhY3Rvci5jbWQgYi92MS9iaW4vc2ZhY3Rvci5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzNGUzMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi9zZmFjdG9yLmNtZApAQCAtMCwwICsxLDIwIEBACitAcmVtIFNjaGVtYSBGYWN0b3JpbmcgdG9vbAorQHJlbQorQHJlbSBGYWN0b3JlcyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb3V0IG9mIGEgc2V0IG9mIHNjaGVtYXMgYW5kIHVzZXMgaW1wb3J0cyBpbnN0ZWFkLgorCitAZWNobyBvZmYKKworc2V0bG9jYWwKK2lmICIlWE1MQkVBTlNfSE9NRSUiIEVRVSAiIiAoc2V0IFhNTEJFQU5TX0hPTUU9JX5kcDAuLikKKworc2V0IGNwPQorCitpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLiAoCisgICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4KKykgZWxzZSBpZiBFWElTVCAlWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLgorKQorCitqYXZhIC1jbGFzc3BhdGggJWNwJSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5GYWN0b3JJbXBvcnRzICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4vdmFsaWRhdGUgYi92MS9iaW4vdmFsaWRhdGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTU4OWRjOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi92YWxpZGF0ZQpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKyMKKyMgSW5zdGFuY2UgVmFsaWRhdG9yCisjCisjIFZhbGlkYXRlcyBhbiBpbnN0YW5jZSBhZ2FpbnN0IGEgc2NoZW1hLgorCitDUD0KKworaWYgWyAtZSAkWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXIgXTsgdGhlbgorICAgIGNwPSRjcDokWE1MQkVBTlNfSE9NRS9idWlsZC9hci94YmVhbi5qYXI7CitlbGlmIFsgLWUgJFhNTEJFQU5TX0hPTUUvbGliL3hiZWFuLmphciBdOyB0aGVuCisgICAgY3A9JGNwOiRYTUxCRUFOU19IT01FL2xpYi94YmVhbi5qYXI7CitmaQorCitjYXNlICJgdW5hbWVgIiBpbgorICAgIENZR1dJTiopCisgICAgICAgIENQPWBjeWdwYXRoIC13IC1wICRDUGAKKyAgICAgICAgOzsKK2VzYWMKKworamF2YSAtY2xhc3NwYXRoICRDUCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5JbnN0YW5jZVZhbGlkYXRvciAkKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3ZhbGlkYXRlLmNtZCBiL3YxL2Jpbi92YWxpZGF0ZS5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZGQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi92YWxpZGF0ZS5jbWQKQEAgLTAsMCArMSwyMCBAQAorQHJlbSBJbnN0YW5jZSBWYWxpZGF0b3IKK0ByZW0KK0ByZW0gVmFsaWRhdGVzIGFuIGluc3RhbmNlIGFnYWluc3QgYSBzY2hlbWEuCisKK0BlY2hvIG9mZgorCitzZXRsb2NhbAoraWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQorCitzZXQgY3A9CisKK2lmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgorKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCisgICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCispCisKK2phdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkluc3RhbmNlVmFsaWRhdG9yICUqCisKKzpkb25lCmRpZmYgLS1naXQgYS92MS9iaW4veHByZXR0eS5jbWQgYi92MS9iaW4veHByZXR0eS5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmZTEzYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL2Jpbi94cHJldHR5LmNtZApAQCAtMCwwICsxLDE2IEBACitAZWNobyBvZmYKKworQHJlbSBJbnZva2VzIHByZXR0eSBwcmludGVyCisKK3NldGxvY2FsCitpZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCisKK3NldCBjcD0KKworaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCispIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKykKKworamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuUHJldHR5UHJpbnRlciAlKgpkaWZmIC0tZ2l0IGEvdjEvYmluL3hzZHRyZWUuY21kIGIvdjEvYmluL3hzZHRyZWUuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9iaW4veHNkdHJlZS5jbWQKQEAgLTAsMCArMSwxNiBAQAorQGVjaG8gb2ZmCisKK0ByZW0gSW52b2tlcyB0eXBlIGhpZXJhcmNoeSBwcmludGVyCisKK3NldGxvY2FsCitpZiAiJVhNTEJFQU5TX0hPTUUlIiBFUVUgIiIgKHNldCBYTUxCRUFOU19IT01FPSV+ZHAwLi4pCisKK3NldCBjcD0KKworaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGJ1aWxkXGFyXHhiZWFuLmphci4gKAorICAgIHNldCBjcD0lY3AlOyVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuCispIGVsc2UgaWYgRVhJU1QgJVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcbGliXHhiZWFuLmphci4KKykKKworamF2YSAtY2xhc3NwYXRoICVjcCUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuVHlwZUhpZXJhcmNoeVByaW50ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2Jpbi94c3RjLmNtZCBiL3YxL2Jpbi94c3RjLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I4ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvYmluL3hzdGMuY21kCkBAIC0wLDAgKzEsMTYgQEAKK0BlY2hvIG9mZgorCitAcmVtIEludm9rZXMgWFNUQworCitzZXRsb2NhbAoraWYgIiVYTUxCRUFOU19IT01FJSIgRVFVICIiIChzZXQgWE1MQkVBTlNfSE9NRT0lfmRwMC4uKQorCitzZXQgY3A9CisKK2lmIEVYSVNUICVYTUxCRUFOU19IT01FJVxidWlsZFxhclx4YmVhbi5qYXIuICgKKyAgICBzZXQgY3A9JWNwJTslWE1MQkVBTlNfSE9NRSVcYnVpbGRcYXJceGJlYW4uamFyLgorKSBlbHNlIGlmIEVYSVNUICVYTUxCRUFOU19IT01FJVxsaWJceGJlYW4uamFyLiAoCisgICAgc2V0IGNwPSVjcCU7JVhNTEJFQU5TX0hPTUUlXGxpYlx4YmVhbi5qYXIuCispCisKK2phdmEgLWNsYXNzcGF0aCAlY3AlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhTVENUZXN0ZXIgJSoKZGlmZiAtLWdpdCBhL3YxL2J1aWxkLnhtbCBiL3YxL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg3MzNlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTExOCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8cHJvamVjdCBuYW1lPSJYYmVhbiIgZGVmYXVsdD0iZGVmYXVsdCIgYmFzZWRpcj0iLiI+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0iamF2YWMxLjQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InByb2R1Y3QudmVyc2lvbiIgdmFsdWU9IjEuMC4zIi8+CisKKyAgPHRhcmdldCBuYW1lPSJ1c2FnZSI+CisgICAgPGVjaG8gbWVzc2FnZT0iVGhlIGZvbGxvd2luZyBhbnQgdGFyZ2V0cyBhcmUgZGVmaW5lZDoiLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJ1c2FnZSAgICAtIHRoaXMgaGVscCB0ZXh0Ii8+CisgICAgPGVjaG8gbWVzc2FnZT0iYnVpbGQgICAgLSBidWlsZHMgb3VyIHB1YmxpYyBpbnRlcmZhY2UgamFycyBzbyBvdGhlcnMgY2FuIGNvbXBpbGUiLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJkZXBsb3kgICAtIGJ1aWxkcyBvdXIgaW1wbGVtZW50YXRpb24gamFyICh4YmVhbi5qYXIpIi8+CisgICAgPGVjaG8gbWVzc2FnZT0iY2xlYW4gICAgLSBjbGVhbnMgb3V0IHRoZSB4YmVhbnMgZGlyZWN0b3JpZXMiLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJidWlsZGRydCAtIGJ1aWxkcywgYnV0IGRvZXMgbm90IHJ1biwgdGhlIHhiZWFuIGRydCIvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImRydCAgICAgIC0gcnVucyB0aGUgeGJlYW4gZHJ0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSJidWlsZCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0ic291cmNlcywgeGJlYW4sIGRydC5qYXIsIHJhbmRvbS5qYXIiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJzb3VyY2VzIiBkZXBlbmRzPSJkaXJzIj4KKyAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9hci94YmVhbnNyYy56aXAiIGJhc2VkaXI9Ii4iIGV4Y2x1ZGVzPSJidWlsZC8qKiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InhiZWFuIiBkZXBlbmRzPSJ4YmVhbi5qYXIiPgorICAgIDxjb3B5IGZpbGU9ImJ1aWxkL2xpYi94YmVhbi5qYXIiIHRvZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlycyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQiLz4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvbGliIi8+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvYXIiLz4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9zcmMiLz4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlIi8+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9saWIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkcnQiID4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgcmFuZG9tIHRlc3RlciIvPgorICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iUmFuZG9tIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIi8+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiLz4KKyAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvcmFuZG9tLmphciIvPgorICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgICA8YXJnIGxpbmU9Ii1zZWVkIDAgLWkgMjAgLW5vcXVlcnkiLz4KKyAgICAgICA8L2phdmE+CisKKyAgICA8bWtkaXIgZGlyPSJidWlsZC90ZXN0L291dHB1dCIvPgorICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgeGJlYW4gcHJvZHVjdCBkcnQgdGVzdHMiLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJKVW5pdCBvdXRwdXQgYmVpbmcgc2VudCB0byBidWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdC50eHQiLz4KKyAgICA8anVuaXQgZm9yaz0ieWVzIiBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBzaG93b3V0cHV0PSJ5ZXMiPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJ4YmVhbi5yb290ZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0idHJlZWFzc2VydHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9kcnQuamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIveHN0eXBlcy5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9udW1lcmFscy5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGJlYW5feHBhdGguamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL2pheGVuLmphciIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+CisgICAgICA8dGVzdCBuYW1lPSJkcnRjYXNlcy5TbW9rZVRlc3RzIiBvdXRmaWxlPSJidWlsZC90ZXN0L291dHB1dC9kcnQtcHJvZHVjdCIgLz4KKyAgICA8L2p1bml0PgorCisgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImV4dGVuc2lvbnNUZXN0IiAvPgorICA8L3RhcmdldD4KKworICAgIDwhLS0gZXh0ZW5zaW9ucyB0ZXN0IC0tPgorICAgIDxmaWxlc2V0IGlkPSJleHRlbnNpb24uamFycyIgZGlyPSJidWlsZC9wcml2YXRlL2xpYiI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJleHRlbnNpb25zLmphciIvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iZml4ZWRBdHRyQmVhbi5qYXIiLz4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImF2ZXJhZ2VDYXNlLmphciIvPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibXVsdEludGVyZmFjZXMuamFyIi8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJyZWFkT25seUJlYW4uamFyIi8+CisgICAgICA8aW5jbHVkZSBuYW1lPSJWYWx1ZVJlc3RyaWN0aW9uLmphciIvPgorICAgIDwvZmlsZXNldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZXh0ZW5zaW9uc1Rlc3QiIGRlcGVuZHM9ImV4dGVuc2lvbnMuY29tcGlsZSI+CisgICAgICA8ZWNobyBtZXNzYWdlPSJKVW5pdCBvdXRwdXQgYmVpbmcgc2VudCB0byBidWlsZC90ZXN0L291dHB1dC9kcnQtZXh0ZW5zaW9ucy50eHQiLz4KKyAgICAgIDxqdW5pdCBmb3JrPSJ5ZXMiIHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiIHNob3dvdXRwdXQ9InllcyI+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgorICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJleHRlbnNpb24uamFycyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zdXNlIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+CisgICAgICAgIDx0ZXN0IG5hbWU9ImRydGNhc2VzLkV4dGVuc2lvbnNUZXN0IiBvdXRmaWxlPSJidWlsZC90ZXN0L291dHB1dC9kcnQtZXh0ZW5zaW9ucyIvPgorICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS1UaGUgZXh0ZW5zaW9ucyB1c2UgdGhlIGJlYW4gdHlwZXMsIGNvbXBpbGUgZmlyc3QtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InNpbXBsZUJlYW5zLmNoZWNrIj4KKyAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ic2ltcGxlQmVhbnMubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2ZpeGVkQXR0ckJlYW4uamFyIj4KKyAgICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZXh0ZW5zaW9ucyIgaW5jbHVkZXM9IioqLyoiLz4KKyAgICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZXh0ZW5zaW9uc3VzZSIgaW5jbHVkZXM9IioqLyoiLz4KKyAgICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KKyAgICAgIDwvdXB0b2RhdGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLnNpbXBsZUJlYW5zIiB1bmxlc3M9InNpbXBsZUJlYW5zLm5vdFJlcXVpcmVkIiBkZXBlbmRzPSJzaW1wbGVCZWFucy5jaGVjayI+CisgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2ZpeGVkQXR0ckJlYW4uamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9wby54c2QiLz4KKyAgICAgIDwvamF2YT4KKworICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9hdmVyYWdlQ2FzZS5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9wby54c2QiLz4KKyAgICAgIDwvamF2YT4KKworICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9tdWx0SW50ZXJmYWNlcy5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9wby54c2QiLz4KKyAgICAgIDwvamF2YT4KKworICAgICAgPCEtLSAqKlByZS9Qb3N0IEhhbmRsZXJzIC0tPgorICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9yZWFkT25seUJlYW4uamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL3BvLnhzZCIvPgorICAgICAgPC9qYXZhPgorCisgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL1ZhbHVlUmVzdHJpY3Rpb24uamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbi9jb21wYW55LnhzZCIvPgorICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJleHRlbnNpb25zLmNvbXBpbGUiIGRlcGVuZHM9ImJ1aWxkLnNpbXBsZUJlYW5zLCBzaW1wbGVCZWFucy5jaGVjayIgdW5sZXNzPSJzaW1wbGVCZWFucy5ub3RSZXF1aXJlZCI+CisgICAgICA8bWtkaXIgZGlyPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgIDxqYXZhYyBzcmNkaXI9InRlc3Qvc3JjL2V4dGVuc2lvbnMiIGRlc3RkaXI9ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIgZGVidWc9Im9uIj4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KKyAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iZXh0ZW5zaW9uLmphcnMiLz4KKyAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICA8L2phdmFjPgorCisgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2V4dGVuc2lvbnMuamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlIi8+CisgICAgICA8L2phdmE+CisKKyAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZml4ZWRBdHRyQmVhbi5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9maXhlZEF0dHJCZWFuIi8+CisgICAgICA8L2phdmE+CisKKyAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvYXZlcmFnZUNhc2UuamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvYXZlcmFnZUNhc2UiLz4KKyAgICAgIDwvamF2YT4KKworICAgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiIC8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC90ZXN0L2V4dGVuc2lvbnMiLz4KKyAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9tdWx0SW50ZXJmYWNlcy5qYXIgdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcyIvPgorICAgICAgPC9qYXZhPgorICAgICAgPCEtLVByZSBQb3N0IEZlYXR1cmUgLS0+CisKKyAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvcmVhZE9ubHlCZWFuLmphciB0ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbiIvPgorICAgICAgPC9qYXZhPgorCisgICAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIgLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9ucyIvPgorICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL1ZhbHVlUmVzdHJpY3Rpb24uamFyIHRlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbiIvPgorICAgICAgPC9qYXZhPgorCisKKyAgICAgIDxta2RpciBkaXI9ImJ1aWxkL3Rlc3QvZXh0ZW5zaW9uc3VzZSIvPgorICAgICAgPGphdmFjIHNyY2Rpcj0idGVzdC9zcmMvZXh0ZW5zaW9uc3VzZSIgZGVzdGRpcj0iYnVpbGQvdGVzdC9leHRlbnNpb25zdXNlIiBkZWJ1Zz0ib24iPgorICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvYXIveGJlYW4uamFyIiAvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgorICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJleHRlbnNpb24uamFycyIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvdGVzdC9leHRlbnNpb25zdXNlIi8+CisgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgPC9qYXZhYz4KKyAgICA8L3RhcmdldD4KKworICA8IS0tIGJ1aWxkZHJ0IHRhcmdldCAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZGRydCIgZGVwZW5kcz0iZHJ0LmphciwgcmFuZG9tLmphciwgZXJpYyIvPgorCisgIDx0YXJnZXQgbmFtZT0iZXJpYyIgZGVwZW5kcz0iZXJpY3Rlc3QuamFyIi8+CisKKyAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJkZXBsb3ksIGJ1aWxkZHJ0Ii8+CisKKyAgPHRhcmdldCBuYW1lPSJyZWRlcGxveSIgZGVwZW5kcz0iY2xlYW4sIGRlcGxveSIvPgorCisgIDwhLS0gb2xkeGJlYW4uamFyIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0ib2xkeGJlYW4uamFyIj4KKyAgICA8Y29weSBmaWxlPSJleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIiB0b2ZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIvPgorICA8L3RhcmdldD4KKworICA8IS0tIGJvb3RzdHJhcCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImJvb3RzdHJhcCIgZGVwZW5kcz0ieGJlYW4iPgorCisgICAgPCEtLSBhZnRlciB4YmVhbi5qYXIgaXMgYnVpbHQsIG1vdmUgaXQgb3V0IG9mIHRoZSB3YXkgYW5kIGNsZWFuIHRoZSBwcm9qZWN0IC0tPgorICAgIDx0ZW1wZmlsZSBwcm9wZXJ0eT0iYm9vdHN0cmFwLmphcmZpbGUiIHByZWZpeD0ib2xkeGJlYW4iIHN1ZmZpeD0iLmphciIvPgorICAgIDxtb3ZlIGZpbGU9ImJ1aWxkL2FyL3hiZWFuLmphciIgdG9maWxlPSIke2Jvb3RzdHJhcC5qYXJmaWxlfSIvPgorICAgIDxhbnRjYWxsIHRhcmdldD0iY2xlYW4iIGluaGVyaXRBbGw9ImZhbHNlIi8+CisKKyAgICA8IS0tIHRoZW4gbW92ZSBpdCBiYWNrIGludG8gcGxhY2UgYXMgb2xkeGJlYW4uamFyIGFuZCBkbyBhbm90aGVyIGJ1aWxkIC0tPgorICAgIDxtb3ZlIGZpbGU9IiR7Ym9vdHN0cmFwLmphcmZpbGV9IiB0b2ZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL29sZHhiZWFuLmphciIvPgorICAgIDxhbnRjYWxsIHRhcmdldD0ieGJlYW4iIGluaGVyaXRBbGw9ImZhbHNlIi8+CisKKyAgICA8IS0tIGNvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBqYXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWNvbmQgamFyIC0tPgorICAgIDxhbnRjYWxsIHRhcmdldD0iemlwY29tcGFyZS5jbGFzc2VzIiBpbmhlcml0QWxsPSJmYWxzZSIvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iemlwY29tcGFyZS5aaXBDb21wYXJlIgorICAgICAgICAgIGNsYXNzcGF0aD0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3ppcGNvbXBhcmUiCisgICAgICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9ImJ1aWxkL2FyL3hiZWFuLmphciBidWlsZC9wcml2YXRlL2xpYi9vbGR4YmVhbi5qYXIiLz4KKyAgICA8L2phdmE+CisKKyAgICA8IS0tIHdoZW4gZXZlcnl0aGluZyBzdWNjZWVkcywgY29weSBvbGR4YmVhbi5qYXIgdG8gZXh0ZXJuYWwvbGliIC0tPgorICAgIDxlY2hvIG1lc3NhZ2U9Ij09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ii8+CisgICAgPGVjaG8gbWVzc2FnZT0iUmVzdWx0cyBtYXRjaCEgQm9vdHN0cmFwIHN1Y2NlZWRlZC4iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIvPgorICAgIDxlY2hvIG1lc3NhZ2U9IkF0dGVtcHRpbmcgdG8gY29weSBvbGR4YmVhbi5qYXIiLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJJZiB0aGUgY29weSBmYWlscywgeW91IG11c3QgY2hlY2sgb3V0IG9sZHhiZWFuLmphciIvPgorICAgIDxlY2hvIG1lc3NhZ2U9Im92ZXJ3cml0aW5nIG9sZCBleHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIi8+CisgICAgPGNvcHkgZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIiB0b2ZpbGU9ImV4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJxdWlja2Jvb3RzdHJhcCI+CisgICAgPGVjaG8gbWVzc2FnZT0iPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIvPgorICAgIDxlY2hvIG1lc3NhZ2U9IkJvb3RzdHJhcHBpbmcgY3VycmVudGx5IGJ1aWx0IHhiZWFuLmphciB3aXRob3V0IHZlcmlmeWluZy4iLz4KKyAgICA8ZWNobyBtZXNzYWdlPSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ii8+CisgICAgPGNvcHkgZmlsZT0iYnVpbGQvYXIveGJlYW4uamFyIiB0b2ZpbGU9ImV4dGVybmFsL2xpYi9vbGR4YmVhbi5qYXIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB6aXBjb21wYXJlIChmb3IgY2hlY2tpbmcgYm9vdHN0cmFwKSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iemlwY29tcGFyZS5jbGFzc2VzIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIvPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy96aXBjb21wYXJlIgorICAgICAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvemlwY29tcGFyZSIKKyAgICAgICAgICAgZGVidWc9Im9uIi8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHBhdGggaWQ9InRlc3QuY29tcGlsZS5wYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImV4dGVybmFsL2xpYi9qdW5pdC5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvZXJpY3NjaGVtYS5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3hzdHlwZXMuamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGJlYW5feHBhdGguamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2xpYi9udW1lcmFscy5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi9qYXhlbi5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KKyAgPC9wYXRoPgorCisgIDxwYXRoIGlkPSJ0ZXN0LnJ1bi5wYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgorICA8L3BhdGg+CisKKyAgPCEtLSBidWlsZGRydCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImRydC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBlYXN5cG8uamFyLCBzY2hlbWFzLmphciwKKyAgCSAgeHN0eXBlcy5qYXIsIGVudW10ZXN0LmphciwgeGJlYW5feHBhdGguamFyLCBudW1lcmFscy5qYXIiPgorICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9kcnQiLz4KKyAgICA8amF2YWMKKyAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2RydCIKKyAgICAgICBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZHJ0IgorICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jb21waWxlLnBhdGgiCisgICAgICAgc291cmNlPSIxLjQiCisgICAgICAgZGVidWc9Im9uIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZHJ0LmphciIgZGVwZW5kcz0iZHJ0LmNsYXNzZXMiPgorICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvZHJ0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL2RydCIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHN0c3NjaGVtYSAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8cGF0aCBpZD0ic2NvbXAucnVuLnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hiZWFuLmphciIvPgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJzdHNzY2hlbWEuY2hlY2siPgorICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0ic3Rzc2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIj4KKyAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL3N0c3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic3Rzc2NoZW1hLmphciIgZGVwZW5kcz0ic3Rzc2NoZW1hLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJzdHNzY2hlbWEubm90UmVxdWlyZWQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9zdHNzY2hlbWEuamFyIHRlc3Qvc3JjL3N0c3NjaGVtYSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBzb2FwdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCBzdHNzY2hlbWEuamFyIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KKyAgICA8amF2YWMgc3JjZGlyPSJ0ZXN0L3NyYy9zb2FwdGVzdCIgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NvYXB0ZXN0IiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2pkb20uamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iZXh0ZXJuYWwvbGliL2p1bml0LmphciIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2FyL3hiZWFuLmphciIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvbGliL3N0c3NjaGVtYS5qYXIiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzb2FwdGVzdC5qYXIiIGRlcGVuZHM9InNvYXB0ZXN0LmNsYXNzZXMiPgorICAgIDxqYXIgamFyZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvc29hcHRlc3QuamFyIiBiYXNlZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc29hcHRlc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBlcmljdGVzdCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iZXJpY3Rlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeGJlYW4sIGVyaWNzY2hlbWEuamFyIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvZXJpY3Rlc3QiLz4KKyAgICA8amF2YWMKKyAgICAgICBzcmNkaXI9InRlc3Qvc3JjL2VyaWN0ZXN0IgorICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIKKyAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgorICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIGRlYnVnPSJvbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImVyaWN0ZXN0LmphciIgZGVwZW5kcz0iZXJpY3Rlc3QuY2xhc3NlcyI+CisgICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9lcmljdGVzdC5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9lcmljdGVzdCIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHJhbmRvbSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0icmFuZG9tLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhiZWFuLCBlYXN5cG8uamFyIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvcmFuZG9tIi8+CisgICAgPGphdmFjCisgICAgICAgc3JjZGlyPSJ0ZXN0L3NyYy9yYW5kb20iCisgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3JhbmRvbSIKKyAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY29tcGlsZS5wYXRoIgorICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIGRlYnVnPSJvbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJhbmRvbS5qYXIiIGRlcGVuZHM9InJhbmRvbS5jbGFzc2VzIj4KKyAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3JhbmRvbS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9yYW5kb20iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB0ZXN0c3RvcmUgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIi8+CisgICAgPGphdmFjIHNyY2Rpcj0idGVzdC9zcmMvdGVzdHN0b3JlIiBkZXN0ZGlyPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdGVzdHN0b3JlIiBzb3VyY2U9IjEuNCIgZGVidWc9Im9uIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3NpbXBsZXR5cGVzIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbGNvbXAiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvdHlwZXN0b3JlIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3htbHB1YmxpYyIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90eXBlaW1wbCIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RzdG9yZS5qYXIiIGRlcGVuZHM9InRlc3RzdG9yZS5jbGFzc2VzIj4KKyAgICA8amFyIGphcmZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3Rlc3RzdG9yZS5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0c3RvcmUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBzaW1wbGV0eXBlcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InNpbXBsZXR5cGVzLmNoZWNrIj4KKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9InNpbXBsZXR5cGVzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zaW1wbGV0eXBlcy5qYXIiPgorICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KKyAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL3ByaXZhdGUvbGliIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzaW1wbGV0eXBlcy5qYXIiIGRlcGVuZHM9InNpbXBsZXR5cGVzLmNoZWNrLCBkaXJzIiB1bmxlc3M9InNpbXBsZXR5cGUubm90UmVxdWlyZWQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iLW5hbWUgc2NoZW1hLnRlc3Quc2ltcGxlIC1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvc2ltcGxldHlwZXMuamFyIHRlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBlYXN5cG8gKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJlYXN5cG8ubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2Vhc3lwby5qYXIiPgorICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZWFzeXBvIiBpbmNsdWRlcz0iKiovKiIvPgorICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KKyAgICA8L3VwdG9kYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImVhc3lwby5qYXIiIGRlcGVuZHM9ImVhc3lwby5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZWFzeXBvLm5vdFJlcXVpcmVkIj4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7c2NoZW1hX2NvbXBpbGVyfSIgY2xhc3NwYXRocmVmPSJzY29tcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8YXJnIGxpbmU9Ii1vdXQgYnVpbGQvcHJpdmF0ZS9saWIvZWFzeXBvLmphciB0ZXN0L3NyYy9lYXN5cG8iLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbnVtZXJhbHMgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJudW1lcmFscy5jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJudW1lcmFscy5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvbnVtZXJhbHMuamFyIj4KKyAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3Qvc3JjL251bWVyYWxzIiBpbmNsdWRlcz0iKiovKiIvPgorICAgICAgPHNyY2ZpbGVzIGRpcj0iYnVpbGQvYXIiIGluY2x1ZGVzPSJ4YmVhbi5qYXIiLz4KKyAgICA8L3VwdG9kYXRlPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJudW1lcmFscy5qYXIiIGRlcGVuZHM9Im51bWVyYWxzLmNoZWNrLCBkaXJzLCB4YmVhbiIgdW5sZXNzPSJudW1lcmFscy5ub3RSZXF1aXJlZCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL251bWVyYWxzLmphciB0ZXN0L3NyYy9udW1lcmFscyIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBzY2hlbWFzIChmb3IgdGVzdGluZykgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0ic2NoZW1hcy5jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJzY2hlbWFzLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zY2hlbWFzLmphciI+CisgICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L3NyYy9zY2hlbWFzIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KKyAgICAgIDxzcmNmaWxlcyBkaXI9ImJ1aWxkL2FyIiBpbmNsdWRlcz0ieGJlYW4uamFyIi8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJzY2hlbWFzLmphciIgZGVwZW5kcz0ic2NoZW1hcy5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0ic2NoZW1hcy5ub3RSZXF1aXJlZCI+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0ic2NvbXAucnVuLnBhdGgiIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1lYSIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0IGJ1aWxkL3ByaXZhdGUvbGliL3NjaGVtYXMuamFyIHRlc3Qvc3JjL3NjaGVtYXMiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gZXJpY3NjaGVtYSAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImVyaWNzY2hlbWEuY2hlY2siPgorICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZXJpY3NjaGVtYS5ub3RSZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iYnVpbGQvcHJpdmF0ZS9saWIvZXJpY3NjaGVtYS5qYXIiPgorICAgICAgPHNyY2ZpbGVzIGRpcj0idGVzdC9zcmMvZXJpY3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXJpY3NjaGVtYS5qYXIiIGRlcGVuZHM9ImVyaWNzY2hlbWEuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9ImVyaWNzY2hlbWEubm90UmVxdWlyZWQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iLXNyYyBidWlsZC9wcml2YXRlL3NyYyAtb3V0IGJ1aWxkL3ByaXZhdGUvbGliL2VyaWNzY2hlbWEuamFyIHRlc3Qvc3JjL2VyaWNzY2hlbWEiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gZW51bXRlc3QgKGZvciB0ZXN0aW5nKSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iZW51bXRlc3QuY2hlY2siPgorICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iZW51bXRlc3Qubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL2VudW10ZXN0LmphciI+CisgICAgICA8c3JjZmlsZXMgZGlyPSJ0ZXN0L3NyYy9lbnVtdGVzdCIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW51bXRlc3QuamFyIiBkZXBlbmRzPSJlbnVtdGVzdC5jaGVjaywgZGlycywgeGJlYW4iIHVubGVzcz0iZW51bXRlc3Qubm90UmVxdWlyZWQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi9lbnVtdGVzdC5qYXIgdGVzdC9zcmMvZW51bXRlc3QiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0geHN0eXBlcyAoZm9yIHRlc3RpbmcpIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ4c3R5cGVzLmNoZWNrIj4KKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9InhzdHlwZXMubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL3ByaXZhdGUvbGliL3hzdHlwZXMuamFyIj4KKyAgICAgIDxzcmNmaWxlcyBkaXI9InRlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZSIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgICA8c3JjZmlsZXMgZGlyPSJidWlsZC9hciIgaW5jbHVkZXM9InhiZWFuLmphciIvPgorICAgIDwvdXB0b2RhdGU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieHN0eXBlcy5qYXIiIGRlcGVuZHM9InhzdHlwZXMuY2hlY2ssIGRpcnMsIHhiZWFuIiB1bmxlc3M9InhzdHlwZXMubm90UmVxdWlyZWQiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHtzY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9InNjb21wLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCBidWlsZC9wcml2YXRlL2xpYi94c3R5cGVzLmphciB0ZXN0L3NyYy94c3R5cGVzIi8+CisgICAgPC9qYXZhPgorICA8L3RhcmdldD4KKworICA8IS0tIGphdmFkb2NzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIEFsbCBkb2NzIHRvIGJ1aWxkL2RvY3MsIGluY2x1ZGluZyBndWlkZSBhbmQgamF2YWRvY3MuIC0tPgorCisgIDx0YXJnZXQgbmFtZT0iZG9jcyIgZGVwZW5kcz0ieGJlYW4iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLmRpciIgdmFsdWU9ImJ1aWxkL2RvY3MiLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkb2NzLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2RvY3MuZGlyfSIvPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iKiIgc291cmNlcGF0aD0ic3JjL3htbHB1YmxpYyIgY2xhc3NwYXRoPSIke2phdmFkb2MucGF0aH0iIGRlc3RkaXI9IiR7ZG9jcy5kaXJ9L3JlZmVyZW5jZSIgd2luZG93dGl0bGU9IlhNTEJlYW5zIERvY3VtZW50YXRpb24iIHNvdXJjZT0iMS40IiBzdHlsZXNoZWV0ZmlsZT0iZG9jcy9zdHlsZXNoZWV0LmNzcyI+CisgICAgICA8bGluayBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvZG9jcy9yZWZlcmVuY2UvaW5kZXguaHRtbCIvPgorICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpLyIvPgorICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaS8iLz4KKyAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9hcGlEb2NzLyIvPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9hci94YmVhbi5qYXIiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWRvYz4KKyAgICA8Y29weSBmaWxlPSJkb2NzL3htbGJlYW5zLmNzcyIgdG9maWxlPSIke2RvY3MuZGlyfS94bWxiZWFucy5jc3MiIC8+CisgICAgPGNvcHkgdG9kaXI9IiR7ZG9jcy5kaXJ9L2d1aWRlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9ndWlkZSIvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHtkb2NzLmRpcn0vaW1hZ2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZG9jcy9pbWFnZXMiLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gc3RyZWFtIGNvbmZvcm1hbmNlIHRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InN0cmVhbXRlc3QuY2xhc3NlcyIgZGVwZW5kcz0iZGlycyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KKyAgICA8amF2YWMKKyAgICAgIHNyY2Rpcj0idGVzdC9zcmMvc3RyZWFtdGVzdCIKKyAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy9zdHJlYW10ZXN0IgorICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNvbXBpbGUucGF0aCIKKyAgICAgIHNvdXJjZT0iMS40IgorICAgICAgZGVidWc9Im9uIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic3RyZWFtdGVzdC5qYXIiIGRlcGVuZHM9InN0cmVhbXRlc3QuY2xhc3NlcyI+CisgICAgPGphciBqYXJmaWxlPSJidWlsZC9wcml2YXRlL2xpYi9zdHJlYW10ZXN0LmphciIgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3N0cmVhbXRlc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHBhdGggaWQ9InJ1bi5zdHJlYW1jb25mLnBhdGgiPgorICAgIDxwYXRoIHJlZmlkPSJ0ZXN0LnJ1bi5wYXRoIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9wcml2YXRlL2NsYXNzZXMvc3RyZWFtdGVzdC8iLz4KKyAgPC9wYXRoPgorCisgIDx0YXJnZXQgbmFtZT0ic3RyZWFtY29uZiIgZGVwZW5kcz0ic3RyZWFtdGVzdC5qYXIiPgorICAgIDxqYXZhIGNsYXNzbmFtZT0ic3RyZWFtdGVzdC5YbWxTdHJlYW1Db25mb3JtYW5jZSIKKyAgICAgICAgICBjbGFzc3BhdGhyZWY9InJ1bi5zdHJlYW1jb25mLnBhdGgiCisgICAgICAgICAgZm9yaz0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDwhLS1hcmcgbGluZT0idGVzdC9jYXNlcy9zdHJlYW1jb25mL3NtYWxsLnhtbCIgLy0tPgorICAgICAgPGFyZyBsaW5lPSJ0ZXN0L2Nhc2VzL3N0cmVhbWNvbmYvZHRkLnhtbCIgLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJkaXN0LXNyYywgZGlzdC1iaW4iPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QtYmluIiBkZXBlbmRzPSJ4YmVhbiwgZG9jcyI+CisgICAgIDxkZWxldGUgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSIvPgorICAgICA8ZGVsZXRlIGZpbGU9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LnppcCIvPgorICAgICA8ZGVsZXRlIGZpbGU9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LnRneiIvPgorCisgICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+CisgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ieGtpdCIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJiaW4vKioiIC8+CisgICAgICAgIDxmaWxlc2V0IGZpbGU9IkNIQU5HRVMudHh0IiAvPgorICAgICA8L2NvcHk+CisgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zY2hlbWFzL3M0cyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3hzZHNjaGVtYS9zY2hlbWEiIGluY2x1ZGVzPSJYTUxTY2hlbWEueHNkLHczYy1zY2hlbWEtbGljZW5zZS5odG1sIi8+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3htbHNjaGVtYS9zY2hlbWEiIGluY2x1ZGVzPSJYTUwueHNkLHczYy14bWwtbGljZW5zZS5odG1sIi8+CisgICAgIDwvY29weT4KKyAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L3NjaGVtYXMiPgorICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvc3JjIiBpbmNsdWRlcz0iZWFzeXBvLyoueHNkLCBlYXN5cG8vKi54c2Rjb25maWciLz4KKyAgICAgPC9jb3B5PgorCisgICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2xpYiIvPgorICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vbGliIiBmaWxlPSJidWlsZC9hci94YmVhbi5qYXIiLz4KKyAgICAgPGNvcHkgdG9kaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2xpYiIgZmlsZT0iZXh0ZXJuYWwvbGliL2pheGVuLTEuMS1iZXRhLTIuamFyIi8+CisgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9saWIiIGZpbGU9ImJ1aWxkL2xpYi94YmVhbl94cGF0aC5qYXIiLz4KKworICAgICA8bWtkaXIgZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zcmMvc2NoZW1hIi8+CisgICAgIDxjb3B5IHRvZGlyPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9zcmMvc2NoZW1hIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdG9vbHNjaGVtYSIvPgorICAgICA8L2NvcHk+CisKKyAgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vZG9jcyIvPgorICAgICA8Y29weSB0b2Rpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vZG9jcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvZG9jcyIvPgorICAgICA8L2NvcHk+CisKKyAgICAgPGNobW9kIGRpcj0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluIiBwZXJtPSJ1Z28rcngiIGluY2x1ZGVzPSIqKiIgLz4KKworICAgICA8emlwIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS56aXAiCisgICAgICAgICAgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZSIKKyAgICAgICAgICBpbmNsdWRlcz0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LyoqIgorICAgICAgICAgIGV4Y2x1ZGVzPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluL2R1bXB4c2IsIAorICAgICAgICAgICAgICAgICAgICB4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluL3Njb21wLCAKKyAgICAgICAgICAgICAgICAgICAgeG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2Jpbi92YWxpZGF0ZSI+CisgICAgICAgICA8emlwZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9MSUNFTlNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9MSUNFTlNFLnR4dCIvPgorICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTk9USUNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9OT1RJQ0UudHh0Ii8+CisgICAgICAgICA8emlwZmlsZXNldCBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2JpbiIgaW5jbHVkZXM9ImR1bXB4c2IsIHNjb21wLCB2YWxpZGF0ZSIgcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluIiBmaWxlbW9kZT0iNzU1Ii8+CisgICAgIDwvemlwPgorICAgICA8dGFyIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS50Z3oiCisgICAgICAgICAgYmFzZWRpcj0iYnVpbGQvcHJpdmF0ZSIKKyAgICAgICAgICBpbmNsdWRlcz0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LyoqIgorICAgICAgICAgIGV4Y2x1ZGVzPSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluL2R1bXB4c2IsIAorICAgICAgICAgICAgICAgICAgICB4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluL3Njb21wLCAKKyAgICAgICAgICAgICAgICAgICAgeG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2Jpbi92YWxpZGF0ZSIKKyAgICAgICAgICBjb21wcmVzc2lvbj0iZ3ppcCI+CisgICAgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9MSUNFTlNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9MSUNFTlNFLnR4dCIvPgorICAgICAgICAgPHRhcmZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTk9USUNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9OT1RJQ0UudHh0Ii8+CisgICAgICAgICA8dGFyZmlsZXNldCBkaXI9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259L2JpbiIgaW5jbHVkZXM9ImR1bXB4c2IsIHNjb21wLCB2YWxpZGF0ZSIgcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluIiBtb2RlPSI3NTUiLz4KKyAgICAgPC90YXI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdC1zcmMiIGRlcGVuZHM9ImNsZWFuLCBkaXJzIj4KKyAgICAgPGRlbGV0ZSBmaWxlPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMuemlwIi8+CisgICAgIDxkZWxldGUgZmlsZT0iYnVpbGQvcHJpdmF0ZS94bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0tc3JjLnRneiIvPgorCisgICAgIDx6aXAgZGVzdGZpbGU9ImJ1aWxkL3ByaXZhdGUveG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259LXNyYy56aXAiPgorICAgICAJPHppcGZpbGVzZXQKKyAgICAgCQlkaXI9Ii4iCisgICAgICAgCQlpbmNsdWRlcz0iKioiCisgICAgICAgICAgICAgICAgZXhjbHVkZXM9ImJ1aWxkLyoqLCB0ZXN0L3NyYy90ZXN0c3RvcmUvKiosIHRlc3Qvc3JjL2Vhc3lwb3VzZS8qKiwgdGVzdC9zcmMvbmFtZXdvcmxkdXNlLyoqLAorICAgICAgICAgICAgICAgIHRlc3Qvc3JjL3N0c3NjaGVtYS8qKiwgdGVzdC9zcmMvdW5tYXJzaGFsLyoqLCB0ZXN0L2Nhc2VzL3NjaGVtYS8qKiwgZXh0ZXJuYWwvbGliL2p1bml0LmphciwgYmluL2R1bXB4c2IsIGJpbi9zY29tcCwgYmluL3ZhbGlkYXRlIgorICAgICAgIAkJcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0iIC8+CisgICAgICAgICA8emlwZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9MSUNFTlNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9MSUNFTlNFLnR4dCIvPgorICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTk9USUNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9OT1RJQ0UudHh0Ii8+CisgICAgICAgICA8emlwZmlsZXNldCBkaXI9ImJpbiIgaW5jbHVkZXM9ImR1bXB4c2IsIHNjb21wLCB2YWxpZGF0ZSIgcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluIiBmaWxlbW9kZT0iNzU1Ii8+CisgICAgIDwvemlwPgorICAgICA8dGFyIGRlc3RmaWxlPSJidWlsZC9wcml2YXRlL3htbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS1zcmMudGd6IgorCSAJICBjb21wcmVzc2lvbj0iZ3ppcCI+CisgICAgIAk8dGFyZmlsZXNldAorICAgICAJCWRpcj0iLiIKKyAgICAgICAJCWluY2x1ZGVzPSIqKiIKKyAgICAgICAJCWV4Y2x1ZGVzPSJidWlsZC8qKiwgdGVzdC9zcmMvdGVzdHN0b3JlLyoqLCB0ZXN0L3NyYy9lYXN5cG91c2UvKiosIHRlc3Qvc3JjL25hbWV3b3JsZHVzZS8qKiwKKyAgICAgICAgICAgICAgICB0ZXN0L3NyYy9zdHNzY2hlbWEvKiosIHRlc3Qvc3JjL3VubWFyc2hhbC8qKiwgdGVzdC9jYXNlcy9zY2hlbWEvKiosIGV4dGVybmFsL2xpYi9qdW5pdC5qYXIsIGJpbi9kdW1weHNiLCBiaW4vc2NvbXAsIGJpbi92YWxpZGF0ZSIKKyAgICAgICAJCXByZWZpeD0ieG1sYmVhbnMtJHtwcm9kdWN0LnZlcnNpb259Ii8+CisgICAgICAgICA8dGFyZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJzcmMvbGljZW5zZS9MSUNFTlNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9MSUNFTlNFLnR4dCIvPgorICAgICAgICAgPHRhcmZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ic3JjL2xpY2Vuc2UvTk9USUNFLnR4dCIgZnVsbHBhdGg9InhtbGJlYW5zLSR7cHJvZHVjdC52ZXJzaW9ufS9OT1RJQ0UudHh0Ii8+CisgICAgICAgICA8dGFyZmlsZXNldCBkaXI9ImJpbiIgaW5jbHVkZXM9ImR1bXB4c2IsIHNjb21wLCB2YWxpZGF0ZSIgcHJlZml4PSJ4bWxiZWFucy0ke3Byb2R1Y3QudmVyc2lvbn0vYmluIiBtb2RlPSI3NTUiLz4KKyAgICAgPC90YXI+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gcHJldmlvdXNseSBpbiB4YmVhbi54bWwgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ4YmVhbi5qYXIiCisgICAgICAgIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5jbGFzc2VzLCB0eXBlc3RvcmUuY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgY29tbW9uLmNsYXNzZXMsIHR5cGVpbXBsLmNsYXNzZXMsIHhtbGNvbXAuY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgeG1sc3RvcmUuY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgb2xkeGJlYW4uamFyLCB4c2RzY2hlbWEuY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgeG1saW5wdXRzdHJlYW0uY2xhc3NlcywgeGJlYW5feHBhdGguamFyIj4KKyAgICA8amFyIGphcmZpbGU9ImJ1aWxkL2xpYi94YmVhbi5qYXIiIGluZGV4PSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbXAiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy90b29sc2NoZW1hIi8+CisgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+CisgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+CisgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc3RvcmUiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxpbnB1dHN0cmVhbSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvbGljZW5zZSIvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8IS0tIGJ1aWxkIFhNTElucHV0U3RyZWFtIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxpbnB1dHN0cmVhbS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3htbGlucHV0c3RyZWFtIgorICAgICAgICBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIgorICAgICAgICBkZWJ1Zz0ib24iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB4bWxwdWJsaWMgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxwdWJsaWMuY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1saW5wdXRzdHJlYW0uY2xhc3NlcyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1scHVibGljIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxwdWJsaWMuamFyIiBkZXBlbmRzPSJkaXJzLCB4bWxpbnB1dHN0cmVhbS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgeG1sc2NoZW1hLmNsYXNzZXMsIHhzZHNjaGVtYS5jbGFzc2VzIj4KKyAgICA8amFyIGphcmZpbGU9ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIiAgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3htbHNjaGVtYSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgorICAgIDwvamFyPgorICA8L3RhcmdldD4KKworICA8IS0tIHR5cGVzdG9yZSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InR5cGVzdG9yZS5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuY2xhc3NlcywgY29tbW9uLmNsYXNzZXMsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgorICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3R5cGVzdG9yZSIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy90eXBlc3RvcmUiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworICA8IS0tIGNvbW1vbiB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iY29tbW9uLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5qYXIsIHhtbGlucHV0c3RyZWFtLmNsYXNzZXMiPgorICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMvY29tbW9uIi8+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL2NvbW1vbiIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB0eXBlaW1wbCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InR5cGVpbXBsLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHJlcGFja2FnZS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMsIHhzZHNjaGVtYS5jbGFzc2VzLCBjb25maWdzY2hlbWEuY2xhc3NlcywgdG9vbHNjaGVtYS5jbGFzc2VzIj4KKyAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3R5cGVpbXBsIi8+CisgICAgPGphdmFjIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvdHlwZXN0b3JlIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGNvbmZpZyIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94c2RzY2hlbWEiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorCisgICAgICAgIDxzcmMgcGF0aD0ic3JjL3R5cGVpbXBsIi8+CisgICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL3htbHNjaGVtYSIvPgorICAgICAgICA8c3JjIHBhdGg9ImJ1aWxkL3NyYy94c2RzY2hlbWEiLz4KKyAgICAgICAgPHNyYyBwYXRoPSJidWlsZC9zcmMvY29uZmlnc2NoZW1hIi8+CisgICAgICAgIDxzcmMgcGF0aD0iYnVpbGQvc3JjL3Rvb2xzY2hlbWEiLz4KKyAgICAgICAgPHNyYyBwYXRoPSJzcmMveG1sY29uZmlnIi8+CisgICAgPC9qYXZhYz4KKworICAgIDwhLS0gTmVlZCBwcm9wZXJ0aWVzIGZpbGVzIGZvciByZWdleCAtLT4KKyAgICA8Y29weQorICAgICAgdG9kaXI9ImJ1aWxkL2NsYXNzZXMvdHlwZWltcGwiPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdHlwZWltcGwiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0geG1sY29tcCB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxjb21wLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHJlcGFja2FnZS5jbGFzc2VzLCB0eXBlaW1wbC5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcywgdHlwZXN0b3JlLmNsYXNzZXMiPgorICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sY29tcCIvPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxjb21wIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbXAiIHNvdXJjZT0iMS40IiBkZWJ1Zz0ib24iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxwdWJsaWMiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL2NvbW1vbiIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy90eXBlaW1wbCIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1sY29uZmlnIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3hzZHNjaGVtYSIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworICA8IS0tIHhtbHN0b3JlIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YXJnZXQgbmFtZT0ieG1sc3RvcmUuY2xhc3NlcyIKKyAgICAgICAgZGVwZW5kcz0iZGlycywgY29tbW9uLmNsYXNzZXMsIHR5cGVzdG9yZS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3NlcyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIvPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy94bWxzdG9yZSIgZGVzdGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxzdG9yZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgICA8Y2xhc3NwYXRoIGlkPSJ4bWxzdG9yZS5jb21waWxlLnBhdGgiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1saW5wdXRzdHJlYW0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3R5cGVzdG9yZSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb21tb24iLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBib290c3RyYXAgc2NoZW1hIHRhcmdldCBzdXBwb3J0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSB4c2RzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KKyAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgorCisgIDxwYXRoIGlkPSJib290c3RyYXAucnVuLnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9saWIvb2xkeGJlYW4uamFyIi8+CisgIDwvcGF0aD4KKworICA8cGF0aCBpZD0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbHB1YmxpYyIvPgorICA8L3BhdGg+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiIHJlZmlkPSJib290c3RyYXAuY29tcGlsZS5wYXRoIi8+CisKKyAgPHBhdGggaWQ9InhzZHNjaGVtYS5jb21waWxlLnBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy94bWxzY2hlbWEiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1scHVibGljIi8+CisgIDwvcGF0aD4KKworICA8cHJvcGVydHkgbmFtZT0ieHNkc2NoZW1hLmNvbXBpbGUucGF0aCIgcmVmaWQ9InhzZHNjaGVtYS5jb21waWxlLnBhdGgiLz4KKworICA8dGFyZ2V0IG5hbWU9InhzZHNjaGVtYS5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ieHNkc2NoZW1hLm5vdFJlcXVpcmVkIj4KKyAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ4c2RzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTFNDSEVNQS9pbmRleC54c2IiPgorICAgICAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy94c2RzY2hlbWEiIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgorICAgICAgICA8L3VwdG9kYXRlPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InhzZHNjaGVtYS5jbGFzc2VzIiBkZXBlbmRzPSJ4c2RzY2hlbWEuY2hlY2ssIHhtbHNjaGVtYS5jbGFzc2VzLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9InhzZHNjaGVtYS5ub3RSZXF1aXJlZCI+CisgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIi8+CisgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy94c2RzY2hlbWEiLz4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MU0NIRU1BIC1jcCAke3hzZHNjaGVtYS5jb21waWxlLnBhdGh9IC1zcmNvbmx5IC1kIGJ1aWxkL2NsYXNzZXMveHNkc2NoZW1hIC1zcmMgYnVpbGQvc3JjL3hzZHNjaGVtYSBzcmMveHNkc2NoZW1hL3NjaGVtYSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB4bWxzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIE5vdGUgdGhhdCB0aGlzIGlzIGEgdHJpY2t5IHRhcmdldCBiZWNhdXNlIGl0IGJvb3RzdHJhcHMgeGJlYW5zIG9uIGl0c2VsZi4gLS0+CisgIDwhLS0gVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIHJlbHkgb24gdGhlIG9sZHhiZWFucy5qYXIgY2hlY2tlZCBpbnRvIGV4dGVybmFsL2xpYiAtLT4KKworICA8dGFyZ2V0IG5hbWU9InhtbHNjaGVtYS5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ieG1sc2NoZW1hLm5vdFJlcXVpcmVkIj4KKyAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ4bWxzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTExBTkcvaW5kZXgueHNiIj4KKyAgICAgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMveG1sc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KKyAgICAgICAgPC91cHRvZGF0ZT4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ4bWxzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0ieG1sc2NoZW1hLmNoZWNrLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9InhtbHNjaGVtYS5ub3RSZXF1aXJlZCI+CisgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMveG1sc2NoZW1hIi8+CisgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL3NyYy94bWxzY2hlbWEiLz4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MTEFORyAtZCBidWlsZC9jbGFzc2VzL3htbHNjaGVtYSAtc3JjIGJ1aWxkL3NyYy94bWxzY2hlbWEgLXNyY29ubHkgc3JjL3htbHNjaGVtYS9zY2hlbWEiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0geG1sY29uZmlnIHRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InhtbGNvbmZpZy5jbGFzc2VzIiBkZXBlbmRzPSJkaXJzLCB4bWxwdWJsaWMuamFyLCBjb25maWdzY2hlbWEuY2xhc3NlcyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvY2xhc3Nlcy94bWxjb25maWciLz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMveG1sY29uZmlnIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3htbGNvbmZpZyIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBjb25maWdzY2hlbWEgdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIE5vdGUgdGhhdCB0aGlzIGlzIGEgdHJpY2t5IHRhcmdldCBiZWNhdXNlIGl0IGJvb3RzdHJhcHMgeGJlYW5zIG9uIGl0c2VsZi4gLS0+CisgIDwhLS0gVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIHRvIHJlbHkgb24gdGhlIG9sZHhiZWFucy5qYXIgY2hlY2tlZCBpbnRvIGV4dGVybmFsL2xpYiAtLT4KKworICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIgcmVmaWQ9ImJvb3RzdHJhcC5jb21waWxlLnBhdGgiLz4KKworICA8dGFyZ2V0IG5hbWU9ImNvbmZpZ3NjaGVtYS5jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJjb25maWdzY2hlbWEubm90UmVxdWlyZWQiIHRhcmdldGZpbGU9ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hL3NjaGVtYS9zeXN0ZW0vc1hNTENPTkZJRy9pbmRleC54c2IiPgorICAgICAgPHNyY2ZpbGVzIGRpcj0ic3JjL2NvbmZpZ3NjaGVtYSIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb25maWdzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0iY29uZmlnc2NoZW1hLmNoZWNrLCB4bWxwdWJsaWMuY2xhc3Nlcywgb2xkeGJlYW4uamFyIiB1bmxlc3M9ImNvbmZpZ3NjaGVtYS5ub3RSZXF1aXJlZCI+CisgICAgPGRlbGV0ZSBkaXI9ImJ1aWxkL2NsYXNzZXMvY29uZmlnc2NoZW1hIi8+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke2Jvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXJ9IiBjbGFzc3BhdGhyZWY9ImJvb3RzdHJhcC5ydW4ucGF0aCIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+CisgICAgICA8YXJnIGxpbmU9IiR7cmVwYWNrYWdlX2FyZ30gLW5hbWUgc1hNTENPTkZJRyAtc3Jjb25seSAtc3JjIGJ1aWxkL3NyYy9jb25maWdzY2hlbWEgLWQgYnVpbGQvY2xhc3Nlcy9jb25maWdzY2hlbWEgc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdG9vbHNjaGVtYSB0YXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gTm90ZSB0aGF0IHRoaXMgaXMgYSB0cmlja3kgdGFyZ2V0IGJlY2F1c2UgaXQgYm9vdHN0cmFwcyB4YmVhbnMgb24gaXRzZWxmLiAtLT4KKyAgPCEtLSBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gcmVseSBvbiB0aGUgb2xkeGJlYW5zLmphciBjaGVja2VkIGludG8gZXh0ZXJuYWwvbGliIC0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuY29tcGlsZS5wYXRoIiByZWZpZD0iYm9vdHN0cmFwLmNvbXBpbGUucGF0aCIvPgorCisgIDx0YXJnZXQgbmFtZT0idG9vbHNjaGVtYS5jaGVjayI+CisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJ0b29sc2NoZW1hLm5vdFJlcXVpcmVkIiB0YXJnZXRmaWxlPSJidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEvc2NoZW1hL3N5c3RlbS9zWE1MVE9PTFMvaW5kZXgueHNiIj4KKyAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy90b29sc2NoZW1hIiBpbmNsdWRlcz0iKiovKi54c2QiLz4KKyAgICA8L3VwdG9kYXRlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRvb2xzY2hlbWEuY2xhc3NlcyIgZGVwZW5kcz0idG9vbHNjaGVtYS5jaGVjaywgeG1scHVibGljLmNsYXNzZXMsIG9sZHhiZWFuLmphciIgdW5sZXNzPSJ0b29sc2NoZW1hLm5vdFJlcXVpcmVkIj4KKyAgICA8ZGVsZXRlIGRpcj0iYnVpbGQvY2xhc3Nlcy90b29sc2NoZW1hIi8+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvc3JjL3Rvb2xzY2hlbWEiLz4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7Ym9vdHN0cmFwX3NjaGVtYV9jb21waWxlcn0iIGNsYXNzcGF0aHJlZj0iYm9vdHN0cmFwLnJ1bi5wYXRoIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KKyAgICAgIDxhcmcgbGluZT0iJHtyZXBhY2thZ2VfYXJnfSAtbmFtZSBzWE1MVE9PTFMgLXNyY29ubHkgLXNyYyBidWlsZC9zcmMvdG9vbHNjaGVtYSAtZCBidWlsZC9jbGFzc2VzL3Rvb2xzY2hlbWEgc3JjL3Rvb2xzY2hlbWEiLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tID09PT09ICAgUmVwYWNrYWdpbmcgID09PT09PSAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iZWRpdF9idWlsZF9zY3JpcHQiPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJlZGl0aW5nIHJlcGFja2FnZSBidWlsZCBmaWxlOiAke3Rva2VufSAtLT4ke3JlcGxhY2VtZW50fSIvPgorCisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0icmVwYWNrYWdlLkVkaXRCdWlsZFNjcmlwdCIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtiYXNlZGlyfS9idWlsZC9yZXBhY2thZ2UvYnVpbGQueG1sIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke3Rva2VufSIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtyZXBsYWNlbWVudH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBhY2thZ2VfYXJnIiB2YWx1ZT0iIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYV9jb21waWxlciIgdmFsdWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJvb3RzdHJhcF9zY2hlbWFfY29tcGlsZXIiIHZhbHVlPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlciIvPgorCisgICAgPCEtLQorICAgICAgICBQYXJhbXMgdG8gcmVwYWNrYWdlIGFyZToKKworICAgICAgICAgICAgcmVwYWNrYWdlX3NwZWM6CisKKyAgICAgICAgICAgICAgICBPZiB0aGUgZm9ybSBmcm9tX3BrZ18xOnRvX3BrZ18xO2Zyb21fcGtnXzI6dG9fcGtnXzIgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIHBhY2thZ2VzCisgICAgICAgICAgICAgICAgYXJlIHRvIGJlIGNvbnZlcnRlZCB3aGljaCB3aGljaCB3aGljaCBvdGhlciBwYWNrYWdlcy4gIFJpZ2h0IG5vdywgdGhlcmUgYXJlIHR3by4KKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zIGFuZCBhcGFjaGUueG1sYmVhbnMuaW1wbCwgdGhlIHB1YmxpYyBhbmQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICBwYWNrYWdlcy4KKworICAgICAgICAgICAgbmV3X3NjaGVtYV9jb21waWxlcgorCisgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHdoaWNoIHdpbGwgbmV3IHRoZSBuZXcgc2NoZW1hIGNvbXBpbGVyLiAgV2lsbCByZXBsYWNlCisgICAgICAgICAgICAgICAgJHtzY2hlbWFfY29tcGlsZXJ9IGR1cmluZyB0aGUgYm9vdHN0cmFwIHByb2Nlc3MuCisgICAgLS0+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlcGFja2FnZSIgZGVwZW5kcz0icmVwYWNrYWdlLmNsYXNzZXMiPgorCisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlJlLXBhY2thZ2luZyBYTWxCZWFucyIvPgorCisgICAgICAgIDxwcm9wZXJ0eQorICAgICAgICAgICAgbmFtZT0ibmV3X3JlcGFja2FnZV9hcmciCisgICAgICAgICAgICB2YWx1ZT0iLXJlcGFja2FnZSAke3JlcGFja2FnZV9zcGVjfSIvPgorCisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0icmVwYWNrYWdlLlJlcGFja2FnZSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMvcmVwYWNrYWdlIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxhcmcgbGluZT0iJHtuZXdfcmVwYWNrYWdlX2FyZ30iLz4KKyAgICAgICAgPC9qYXZhPgorCisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0icmVwYWNrYWdlX2FyZyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlcGxhY2VtZW50IiB2YWx1ZT0iJHtuZXdfcmVwYWNrYWdlX2FyZ30iLz4KKyAgICAgICAgPC9hbnRjYWxsPgorCisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0ic2NoZW1hX2NvbXBpbGVyIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0icmVwbGFjZW1lbnQiIHZhbHVlPSIke25ld19zY2hlbWFfY29tcGlsZXJ9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKworICAgICAgICA8YW50IGRpcj0iYnVpbGQvcmVwYWNrYWdlIiB0YXJnZXQ9InhiZWFuIiBpbmhlcml0QWxsPSJmYWxzZSIvPgorCisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZWRpdF9idWlsZF9zY3JpcHQiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InRva2VuIiAgICAgICB2YWx1ZT0iYm9vdHN0cmFwX3NjaGVtYV9jb21waWxlciIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlcGxhY2VtZW50IiB2YWx1ZT0iJHtuZXdfc2NoZW1hX2NvbXBpbGVyfSIvPgorICAgICAgICA8L2FudGNhbGw+CisKKyAgICAgICAgPGFudCBkaXI9ImJ1aWxkL3JlcGFja2FnZSIgdGFyZ2V0PSJib290c3RyYXAiIGluaGVyaXRBbGw9ImZhbHNlIi8+CisKKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0icmVwYWNrYWdlLmNsYXNzZXMiPgorICAgICAgICA8bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIvPgorICAgICAgICA8amF2YWMgc3JjZGlyPSJzcmMvcmVwYWNrYWdlIiBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzL3JlcGFja2FnZSIgc291cmNlPSIxLjQiIGRlYnVnPSJvbiIvPgorICAgIDwvdGFyZ2V0PgorCisgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLmpheGVuLmphciI+CisgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpheGVuLmphci5leGlzdHMiPgorICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJidWlsZC9saWIvamF4ZW4uamFyIi8+CisgICAgIDwvY29uZGl0aW9uPgorICAgPC90YXJnZXQ+CisKKyAgIDx0YXJnZXQgbmFtZT0iamF4ZW4uamFyIiBkZXBlbmRzPSJjaGVjay5qYXhlbi5qYXIsIGRpcnMiIHVubGVzcz0iamF4ZW4uamFyLmV4aXN0cyI+CisgICAgIDwhLS1nZXQgZGVzdD0iYnVpbGQvbGliL2pheGVuLmphciIKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4vamF4ZW4vamFycy9qYXhlbi0xLjEtYmV0YS0yLmphciIKKyAgICAgICAgICB2ZXJib3NlPSJ0cnVlIiB1c2V0aW1lc3RhbXA9InRydWUiIGlnbm9yZWVycm9ycz0idHJ1ZSIvIC0tPgorICAgICA8Y29weSBmaWxlPSJleHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIiIHRvZmlsZT0iYnVpbGQvbGliL2pheGVuLmphciIgLz4KKyAgIDwvdGFyZ2V0PgorCisgIDwhLS0geHBhdGggdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InhwYXRoLmNsYXNzZXMiIGRlcGVuZHM9ImRpcnMsIHhtbHB1YmxpYy5qYXIsIGpheGVuLmphciwgeG1sc3RvcmUuY2xhc3NlcyI+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3hwYXRoIi8+CisgICAgPGphdmFjCisgICAgICAgc3JjZGlyPSJzcmMveHBhdGgiCisgICAgICAgZGVzdGRpcj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3hwYXRoIgorICAgICAgIGNsYXNzcGF0aHJlZj0ieHBhdGguY29tcGlsZS5wYXRoIgorICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIGRlYnVnPSJvbiI+CisgICAgICA8Y2xhc3NwYXRoIGlkPSJ4cGF0aC5jb21waWxlLnBhdGgiPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3htbHB1YmxpYy5qYXIiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi9qYXhlbi5qYXIiLz4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2NsYXNzZXMveG1sc3RvcmUiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ieGJlYW5feHBhdGguamFyIiBkZXBlbmRzPSJ4cGF0aC5jbGFzc2VzIj4KKyAgICA8amFyIGphcmZpbGU9ImJ1aWxkL2xpYi94YmVhbl94cGF0aC5qYXIiIGJhc2VkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy94cGF0aCIvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRlc3QgeHBhdGggdGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RfeHBhdGguY2xhc3NlcyIgZGVwZW5kcz0iZGlycywgeG1scHVibGljLmphciwgamF4ZW4uamFyLCB4YmVhbl94cGF0aC5qYXIiPgorICAgIDxta2RpciBkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiLz4KKyAgICA8amF2YWMKKyAgICAgICBzcmNkaXI9InRlc3Qvc3JjL3hwYXRoIgorICAgICAgIGRlc3RkaXI9ImJ1aWxkL3ByaXZhdGUvY2xhc3Nlcy90ZXN0eHBhdGgiCisgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0eHBhdGguY29tcGlsZS5wYXRoIgorICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgIGRlYnVnPSJvbiI+CisgICAgICA8Y2xhc3NwYXRoIGlkPSJ0ZXN0eHBhdGguY29tcGlsZS5wYXRoIj4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249ImJ1aWxkL2xpYi94bWxwdWJsaWMuamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIvamF4ZW4uamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9saWIveGJlYW5feHBhdGguamFyIi8+CisgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzL3htbGlucHV0c3RyZWFtIi8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2phdmFjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJ1bl90ZXN0X3hwYXRoIiBkZXBlbmRzPSJ0ZXN0X3hwYXRoLmNsYXNzZXMsIHhiZWFuIj4KKyAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbi5YQmVhbnNEZW1vIiBmb3JrPSJ0cnVlIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hiZWFuLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL2pheGVuLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvbGliL3hiZWFuX3hwYXRoLmphciIvPgorICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQvcHJpdmF0ZS9jbGFzc2VzL3Rlc3R4cGF0aCIvPgorICAgICAgPC9jbGFzc3BhdGg+CisgICAgICA8anZtYXJnIHZhbHVlPSItZGEiLz4KKyAgICAgIDxhcmcgbGluZT0ndGVzdC9jYXNlcy94cGF0aC9tdWNoX2Fkby54bWwgIlBMQVkvQUNUL1NDRU5FL1NQRUVDSC9TUEVBS0VSIicvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwgYi92MS9kb2NzL2d1aWRlL2FudFhtbGJlYW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzg3ZjAyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvZG9jcy9ndWlkZS9hbnRYbWxiZWFuLmh0bWwKQEAgLTAsMCArMSwzMTQgQEAKKzwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGh0bWw+PCEtLSBJbnN0YW5jZUJlZ2luIHRlbXBsYXRlPSJmaWxlOi8vL0N8L3A0L21haW4vaGVscC9pZGUvZW4vVGVtcGxhdGVzL0NvbW1hbmQuZHd0IiBjb2RlT3V0c2lkZUhUTUxJc0xvY2tlZD0iZmFsc2UiIC0tPgorPGhlYWQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Cis8dGl0bGU+eG1sYmVhbiBBbnQgVGFzazwvdGl0bGU+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JENIQVJTRVQ7Ij4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KKzxtZXRhIG5hbWU9ImNvbXBvbmVudCIgY29udGVudD0iIj4KKzwhLS0gSW4gdGhlIGRlc2NyaXB0aW9uIG1ldGF0YWcsIHBsZWFzZSBwcm92aWRlIGEgQlJJRUYgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiAtLT4KKzxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiPgorPCEtLSBJbiB0aGUgY29tcG9uZW50IG1ldGF0YWcsIHBsZWFzZSBsaXN0IGtleXdvcmRzIHRoYXQgd2lsbCBoZWxwIGEgdXNlciBzZWFyY2ggZm9yIHRoaXMgdG9waWMuIC0tPgorPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IiI+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+CisKKzwhLS0oTGlua3MpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJoZWFkIiAtLT4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8L2hlYWQ+CisKKzwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8Ym9keT4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgorPGRpdiBpZD10b3BpY3RpdGxlPgorICA8SDEgY2xhc3M9VGl0bGU+eG1sYmVhbiBBbnQgVGFzazwvaDE+Cis8L2Rpdj4KKzxkaXYgaWQ9dG9waWN0ZXh0PgorICA8cD5Db21waWxlcyBhIHNldCBvZiBYU0QgYW5kL29yIFdTREwgZmlsZXMgaW50byBYTUxCZWFucy4gVGhpcyBpcyB1c2VmdWwgZm9yCisgICAgYnVpbGRpbmcgYW4gWE1MQmVhbiBKQVIgZnJvbSBYU0QgYW5kIFdTREwgZmlsZXMuIElmIGRlc2lyZWQsIHRoZSB0YXNrIGNhbgorICAgIGFsc28gZ2VuZXJhdGUgdGhlIHNvdXJjZSBjb2RlIHRoYXQgbWFrZXMgdXAgdGhlIFhNTEJlYW4gdHlwZSBzeXN0ZW0gc3BlY2lmaWVkCisgICAgYnkgdGhlIHNjaGVtYSBmaWxlcy48L3A+CisgIDxwIGNsYXNzPSJub3RlcGFyYSI+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGFuIGV4dGVybmFsIGxpYnJhcnkgbm90CisgICAgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24gY2FsbGVkIHhiZWFuLmphci4gJm5ic3A7SXQgY2FuIGJlIGZvdW5kIGluCisgICAgdGhlIFhNTEJlYW5zIGRldmVsb3BlciBraXQgYXQgPGEKKyBocmVmPSJodHRwOi8veG1sYmVhbnMuYXBhY2hlLm9yZy8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8veG1sYmVhbnMuYXBhY2hlLm9yZy88L2E+LgorICAgIFRoZSBidWlsZCBzY3JpcHQgd2lsbCBuZWVkIHRvIGluY2x1ZGUgYSB0YXNrZGVmIGZvciB4bWxiZWFuLCB3aGljaCBjb3VsZCBsb29rCisgICAgbGlrZSB0aGlzOjwvcD4KKzwvZGl2PgorPGJsb2NrcXVvdGU+CisgIDxkaXYgY2xhc3M9Im5vdGVwYXJhIj4KKyAgICA8cHJlIGNsYXNzPSJub3RlcGFyYSI+Jmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+CisgIDwvZGl2PgorPC9ibG9ja3F1b3RlPgorPGRpdj4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC4gVGhpcworICAgIGNhbiBiZSBkb25lIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlc2ZpbGU8L3NwYW4+LAorICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlc2ZpbGU8L3NwYW4+CisgICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kZWZhdWx0ZXhjbHVkZXM8L3NwYW4+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbmNsdWRlczwvc3Bhbj4KKyAgICBvciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW5jbHVkZXNmaWxlPC9zcGFuPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlCisgICAgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlPC9zcGFuPgorICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGNsdWRlc2ZpbGU8L3NwYW4+IGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeQorICAgIHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKKyAgICBmaW5hbGx5IHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kZWZhdWx0ZXhjbHVkZXM8L3NwYW4+IGF0dHJpYnV0ZSwKKyAgICB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZQorICAgIHNlY3Rpb24gb24gPGEKKyBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyIgdGFyZ2V0PSJfYmxhbmsiPmRpcmVjdG9yeQorICAgIGJhc2VkIHRhc2tzPC9hPiBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC8iIHRhcmdldD0iX2JsYW5rIj5BbnQKKyAgICBkb2N1bWVudGF0aW9uPC9hPiwgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93CisgICAgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgorICA8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEKKyBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj5GaWxlU2V0PC9hPgorICAgIGFuZCBzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8Y29kZT5kaXI8L2NvZGU+CisgICAgYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sCisgICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KKyAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGJvZHk+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zY2hlbWE8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZQorICAgICAgICAgIG9yIGEgZGlyZWN0b3J5IG9mIGZpbGVzLiAmbmJzcDtOb3QgYSBwYXRoIHJlZmVyZW5jZS4gJm5ic3A7SWYgbXVsdGlwbGUKKyAgICAgICAgICBzY2hlbWEgZmlsZXMgbmVlZCB0byBiZSBidWlsdCB0b2dldGhlciwgdXNlIGEgbmVzdGVkIGZpbGVzZXQgaW5zdGVhZAorICAgICAgICAgIG9mIHNldHRpbmcgc2NoZW1hLjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3MgYSBmaWxlc2V0IGVsZW1lbnQgaXMgbmVzdGVkLjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGphciBmaWxlIGNyZWF0ZWQuJm5ic3A7IEZvciBpbnN0YW5jZSwKKyAgICAgICAgICAibXlYTUxCZWFuLmphciIgd2lsbCBvdXRwdXQgdGhlIHJlc3VsdHMgb2YgdGhpcyB0YXNrIGludG8gYSBqYXIgd2l0aAorICAgICAgICAgIHRoZSBzYW1lIG5hbWUuPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAieG1sdHlwZXMuamFyIi48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kb3dubG9hZDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRvIHRydWUgdG8gcGVybWl0IHRoZSBjb21waWxlciB0byBkb3dubG9hZCBVUkxzIGZvcgorICAgICAgICAgIGltcG9ydHMgYW5kIGluY2x1ZGVzLiZuYnNwOyBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQKKyAgICAgICAgICBpbmNsdWRlcyBtdXN0IGJlIGNvcGllZCBsb2NhbGx5Ljxicj4gPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGFudCB0YXJnZXQgd2lsbCBjb250aW51ZQorICAgICAgICAgIGlmIHRoZSBYTUxCZWFuIGNyZWF0aW9uIGVuY291bnRlcnMgYSBidWlsZCBlcnJvci48YnI+IDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPGJyPiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHRoZSBhbW91bnQgb2YgYnVpbGQgbWVzc2FnZSBvdXRwdXQuPGJyPiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHRydWUuPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZXN5c3RlbW5hbWU8YnI+IDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCB0aGUgVHlwZVN5c3RlbUhvbGRlciBjbGFzcworICAgICAgICAgIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4uJm5ic3A7IE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuCisgICAgICAgICAgTm9uZSBvZiB0aGUgWE1MQmVhbnMgYXJlIGdlbmVyYXRlZCBpbiB0aGlzIHBhY2thZ2UuIFVzZSAueHNkY29uZmlnIGZpbGVzCisgICAgICAgICAgdG8gbW9kaWZ5IFhNTEJlYW4gcGFja2FnZSBvciBjbGFzcyBuYW1lcy48YnI+IDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+IDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzZ2VuZGlyPGJyPiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIGxvY2F0aW9uIHRvIGdlbmVyYXRlIENMQVNTIGZpbGVzIGludG8uPGJyPiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPGJyPiA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNvbmx5PGJyPiA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLjxicj4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNnZW5kaXI8YnI+IDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgSkFWQSBmaWxlcyBpbnRvLjxicj4gPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4gPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBpZiBzY2hlbWFzIGluIHRoZSBmaWxlc2V0IGltcG9ydAorICAgICAgICAgIGRlZmluaXRpb25zIHRoYXQgYXJlIHN1cHBsaWVkIGJ5IG90aGVyIGNvbXBpbGVkIFhNTEJlYW5zIEpBUiBmaWxlcywKKyAgICAgICAgICBvciBpZiBKQVZBIGZpbGVzIGFyZSBpbiB0aGUgc2NoZW1hIGZpbGVzZXQuIEFsc28gc3VwcG9ydHMgYSBuZXN0ZWQgY2xhc3NwYXRoLjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFkZHMgYSBjbGFzc3BhdGgsIGdpdmVuIGFzIDxhCisgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC91c2luZy5odG1sI3JlZmVyZW5jZXMiIHRhcmdldD0iX2JsYW5rIj5yZWZlcmVuY2U8L2E+CisgICAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQKKyAgICAgICAgICBtdXN0IGJlIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8KKyAgICAgICAgICBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAorICAgICAgICAgIG11c3QgYmUgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4KKyAgICAgICAgICBvbWl0dGVkLjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0bworICAgICAgICAgIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yCisgICAgICAgICAgbm90ICgieWVzIi8ibm8iKS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggZGVidWcKKyAgICAgICAgICBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi4gSWYgc2V0IHRvIDxjb2RlPm9mZjwvY29kZT4sCisgICAgICAgICAgPGNvZGU+LWc6bm9uZTwvY29kZT4gd2lsbCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgY29tcGlsZXJzCisgICAgICAgICAgdGhhdCBzdXBwb3J0IGl0IChmb3Igb3RoZXIgY29tcGlsZXJzLCBubyBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2lsbAorICAgICAgICAgIGJlIHVzZWQpLiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4KKyAgICAgICAgICBhdHRyaWJ1dGUgZGV0ZXJtaW5lcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1Z2xldmVsPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxjb2RlPi1nPC9jb2RlPiBjb21tYW5kLWxpbmUKKyAgICAgICAgICBzd2l0Y2guIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IDxjb2RlPm1vZGVybjwvY29kZT4KKyAgICAgICAgICBhbmQgPGNvZGU+Y2xhc3NpYyh2ZXIgJmd0Oz0gMS4yKTwvY29kZT4uIExlZ2FsIHZhbHVlcyBhcmUgPGNvZGU+bm9uZTwvY29kZT4KKyAgICAgICAgICBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IDxjb2RlPmxpbmVzPC9jb2RlPiwKKyAgICAgICAgICA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uIElmIDxjb2RlPmRlYnVnbGV2ZWw8L2NvZGU+CisgICAgICAgICAgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGJlIGFwcGVuZGVkIHRvIDxjb2RlPi1nPC9jb2RlPi4KKyAgICAgICAgICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW1pemU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb247CisgICAgICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUFudFJ1bnRpbWU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcyBpbiB0aGUKKyAgICAgICAgICBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lIGxpYnJhcmllcyBmcm9tCisgICAgICAgICAgdGhlIGV4ZWN1dGluZyBWTSBpbiB0aGUgY2xhc3NwYXRoOyBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZXhlY3V0ZSA8Y29kZT5qYXZhYzwvY29kZT4gdXNpbmcgdGhlIEpESyBjb21waWxlcgorICAgICAgICAgIGV4dGVybmFsbHk7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGxldGUgcGF0aCB0byB0aGUgPGNvZGU+amF2YWM8L2NvZGU+IGV4ZWN1dGFibGUgdG8KKyAgICAgICAgICB1c2UgaW4gY2FzZSBvZiA8Y29kZT5mb3JrPSZxdW90O3llcyZxdW90OzwvY29kZT4uIERlZmF1bHRzIHRvIHRoZSBjb21waWxlcgorICAgICAgICAgIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZyBBbnQuIElnbm9yZWQgaWYgPGNvZGU+Zm9yaz0mcXVvdDtubyZxdW90OzwvY29kZT48L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWVtb3J5SW5pdGlhbFNpemU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCisgICAgICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKKyAgICAgICAgICB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LAorICAgICAgICAgIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yIDxjb2RlPjgwbTwvY29kZT4pPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeU1heGltdW1TaXplPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLAorICAgICAgICAgIGlmIDxjb2RlPmphdmFjPC9jb2RlPiBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuIERlZmF1bHRzCisgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLiAoRXhhbXBsZXM6IDxjb2RlPjgzODg2MDgwPC9jb2RlPiwKKyAgICAgICAgICA8Y29kZT44MTkyMGs8L2NvZGU+LCBvciA8Y29kZT44MG08L2NvZGU+KTwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gSWYgdGhpcyBhdHRyaWJ1dGUKKyAgICAgICAgICBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgaWYKKyAgICAgICAgICBzZXQsIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0KKyAgICAgICAgICB3aWxsIGJlIHVzZWQuCisgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVEdXBsaWNhdGVzSW5OYW1lc3BhY2VzPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBuYW1lc3BhY2VzCisgICAgICAgIGluIHdoaWNoIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBhcmUgdG8gYmUgaWdub3JlZC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGJvZHk+CisgIDwvdGFibGU+CisgIDxoMz5FeGFtcGxlPC9oMz4KKzwvZGl2PgorPGRpdiBpZD10b3BpY3RleHQ+IEJlIHN1cmUgdG8gZGVmaW5lIHRoZSB0YXNrIGluIHlvdXIgc2NyaXB0LCBsaWtlIHRoaXM6PC9kaXY+Cis8ZGl2PgorICA8cHJlPiZsdDt0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWE1MQmVhbiIgY2xhc3NwYXRoPSJwYXRoL3RvL3hiZWFuLmphciI8L3ByZT4KKyAgPHA+VGhlIGZvbGxvd2luZyBidWlsZHMgYWxsIHRoZSBzY2hlbWFzIGluIHRoZSBzY2hlbWFzIGRpcmVjdG9yeSBhbmQgY3JlYXRlcworICAgIGEgamFyIGNhbGxlZCAmcXVvdDtTY2hlbWFzLmphciZxdW90Oy48L3A+Cis8L2Rpdj4KKzxkaXY+CisgIDxwcmU+CismbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMiIGRlc3RmaWxlPSJTY2hlbWFzLmphciIvJmd0OzwvcHJlPgorICBUaGUgZm9sbG93aW5nIGNvbXBpbGVzIHRoZSBzY2hlbWEgJnF1b3Q7b3VyU2NoZW1hLnhzZCZxdW90OyBpbnRvIHRoZSBkZWZhdWx0CisgIGphciAmcXVvdDt4bWx0eXBlcy5qYXImcXVvdDsuICZuYnNwO0lmICZuYnNwO2FueSBpbXBvcnRzIGFuZCBpbmNsdWRlcyBhcmUgZGVmaW5lZAorICBieSByZW1vdGUgVVJMcywgdGhleSBhcmUgZG93bmxvYWRlZCBkdXJpbmcgdGhlIGJ1aWxkLgorICA8ZGl2PgorICAgIDxwcmU+Jmx0O3htbGJlYW4gc2NoZW1hPSJzY2hlbWFzL291clNjaGVtYS54c2QiIGRvd25sb2FkPSJ0cnVlIi8mZ3Q7PC9wcmU+CisgIDwvZGl2PgorICA8ZGl2PgorICAgIDxoND5Vc2luZyBhIGZpbGVzZXQ8L2g0PgorICA8L2Rpdj4KKyAgPGRpdj4KKyAgICA8cHJlPiZsdDt4bWxiZWFuIGNsYXNzZ2VuZGlyPSIke2J1aWxkLmRpcn0iIGNsYXNzcGF0aD0iJHtjbGFzcy5wYXRofSI8YnI+ICAgICAgZmFpbG9uZXJyb3I9InRydWUiJmd0Ozxicj4gICZsdDtmaWxlc2V0IGJhc2VkaXI9InNyYyIgZXhjbHVkZXM9IioqLyoueHNkIi8mZ3Q7PGJyPiAgJmx0O2ZpbGVzZXQgYmFzZWRpcj0ic2NoZW1hcyIgaW5jbHVkZXM9IioqLyouKiIvJmd0Ozxicj4mbHQ7L3htbGJlYW4mZ3Q7PC9wcmU+CisgIDwvZGl2PgorICA8ZGl2PiBHYXRoZXJzIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkgZXhjZXB0IFhTRCBmaWxlcywgYWxvbmcgd2l0aAorICAgIGV2ZXJ5IGZpbGUgaW4gdGhlIHNjaGVtYXMgZGlyZWN0b3J5LCBhbmQgY29tcGlsZXMgdGhlbS4gVGhlIGZpbGVzZXQgY2FuIGluY2x1ZGUKKyAgICBzY2hlbWEgZmlsZXMgdGhhdCByZWZlciB0byBwcmV2aW91c2x5IGNvbXBpbGVkIHNjaGVtYSBjb21wb25lbnRzLiZuYnNwOyBUaGUKKyAgICBmaWxlc2V0IGNhbiBhbHNvIGNvbnRhaW4gSkFWQSBmaWxlcy4mbmJzcDsgVGhlIGNsYXNzcGF0aCBwYXJhbWV0ZXIgZGVmaW5lcworICAgIHRoZSBjbGFzc3BhdGggbmVjZXNzYXJ5IHRvIHJlc29sdmUgY29tcGlsZWQgc2NoZW1hIGFuZCBqYXZhIHJlZmVyZW5jZXMuPGJyPgorICAgIDxicj4KKyAgICBUaGUgYnVpbHQgY2xhc3NlcyB3aWxsIGdvIGludG8gJHtidWlsZC5kaXJ9LjwvZGl2PgorICA8ZGl2PgorICAgIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+CisgICAgPHA+Tm9uZS48L3A+CisgIDwvZGl2PgorPC9kaXY+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8L2JvZHk+Cis8IS0tIEluc3RhbmNlRW5kIC0tPjwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjVjY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvZG9jcy9ndWlkZS9jb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sCkBAIC0wLDAgKzEsNTMxIEBACis8IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxodG1sPgorPGhlYWQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Cis8dGl0bGU+R2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L3RpdGxlPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CisKKworPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgorCis8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KKzxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Cis8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPGJvZHk+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KKzxoMT4gR2V0dGluZyBTdGFydGVkIHdpdGggWE1MQmVhbnM8L2gxPgorPGRpdiBpZD0idG9waWN0ZXh0Ij4KKyAgPHA+WE1MQmVhbnMgcHJvdmlkZXMgaW50dWl0aXZlIHdheXMgdG8gaGFuZGxlIFhNTCB0aGF0IG1ha2UgaXQgZWFzaWVyIGZvciB5b3UKKyAgICB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgWE1MIGRhdGEgYW5kIGRvY3VtZW50cyBpbiBKYXZhLiA8L3A+CisgIDxwPkNoYXJhY3RlcmlzdGljcyBvZiBYTUxCZWFucyBhcHByb2FjaCB0byBYTUw6PC9wPgorPC9kaXY+Cis8dWw+CisgIDxsaT4KKyAgICA8ZGl2Pkl0IHByb3ZpZGVzIGEgZmFtaWxpYXIgSmF2YSBvYmplY3QtYmFzZWQgdmlldyBvZiBYTUwgZGF0YSB3aXRob3V0IGxvc2luZworICAgICAgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCwgbmF0aXZlIFhNTCBzdHJ1Y3R1cmUuPC9kaXY+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8ZGl2PlRoZSBYTUwncyBpbnRlZ3JpdHkgYXMgYSBkb2N1bWVudCBpcyBub3QgbG9zdCB3aXRoIFhNTEJlYW5zLiBYTUwtb3JpZW50ZWQKKyAgICAgIEFQSXMgY29tbW9ubHkgdGFrZSB0aGUgWE1MIGFwYXJ0IGluIG9yZGVyIHRvIGJpbmQgdG8gaXRzIHBhcnRzLiBXaXRoIFhNTEJlYW5zLAorICAgICAgdGhlIGVudGlyZSBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgaXMgaGFuZGxlZCBhcyBhIHdob2xlLiBUaGUgWE1MIGRhdGEgaXMKKyAgICAgIHN0b3JlZCBpbiBtZW1vcnkgYXMgWE1MLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRvY3VtZW50IG9yZGVyIGlzIHByZXNlcnZlZAorICAgICAgYXMgd2VsbCBhcyB0aGUgb3JpZ2luYWwgZWxlbWVudCBjb250ZW50IHdpdGggd2hpdGVzcGFjZS48L2Rpdj4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxkaXY+V2l0aCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIGFjY2VzcyB0byBYTUwgaW5zdGFuY2VzIGlzIHRocm91Z2gKKyAgICAgIEphdmFCZWFuLWxpa2UgYWNjZXNzb3JzLCB3aXRoIGdldCBhbmQgc2V0IG1ldGhvZHMuPC9kaXY+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8ZGl2Pkl0IGlzIGRlc2lnbmVkIHdpdGggWE1MIHNjaGVtYSBpbiBtaW5kIGZyb20gdGhlIGJlZ2lubmluZyAmIzgyMTI7IFhNTEJlYW5zCisgICAgICBzdXBwb3J0cyBhbGwgWE1MIHNjaGVtYSBkZWZpbml0aW9ucy48L2Rpdj4KKyAgPC9saT4KKyAgPGxpPkFjY2VzcyB0byBYTUwgaXMgZmFzdC48L2xpPgorPC91bD4KKzxkaXY+CisgIDxwPlRoZSBzdGFydGluZyBwb2ludCBmb3IgWE1MQmVhbnMgaXMgWE1MIHNjaGVtYS4gQSBzY2hlbWEgKGNvbnRhaW5lZCBpbiBhbgorICAgIFhTRCBmaWxlKSBpcyBhbiBYTUwgZG9jdW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJ1bGVzIHRvIHdoaWNoIG90aGVyIFhNTAorICAgIGRvY3VtZW50cyBtdXN0IGNvbmZvcm0uIFRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSByaWNoIGRhdGEKKyAgICBtb2RlbCB0aGF0IGFsbG93cyB5b3UgdG8gZXhwcmVzcyBzb3BoaXN0aWNhdGVkIHN0cnVjdHVyZSBhbmQgY29uc3RyYWludHMgb24KKyAgICB5b3VyIGRhdGEuIEZvciBleGFtcGxlLCBhbiBYTUwgc2NoZW1hIGNhbiBlbmZvcmNlIGNvbnRyb2wgb3ZlciBob3cgZGF0YSBpcworICAgIG9yZGVyZWQgaW4gYSBkb2N1bWVudCwgb3IgY29uc3RyYWludHMgb24gcGFydGljdWxhciB2YWx1ZXMgKGZvciBleGFtcGxlLCBhCisgICAgYmlydGggZGF0ZSB0aGF0IG11c3QgYmUgbGF0ZXIgdGhhbiAxOTAwKS4gVW5mb3J0dW5hdGVseSwgdGhlIGFiaWxpdHkgdG8gZW5mb3JjZQorICAgIHJ1bGVzIGxpa2UgdGhpcyBpcyB0eXBpY2FsbHkgbm90IGF2YWlsYWJsZSBpbiBKYXZhIHdpdGhvdXQgd3JpdGluZyBjdXN0b20KKyAgICBjb2RlLiBYTUxCZWFucyBob25vcnMgc2NoZW1hIGNvbnN0cmFpbnRzLjwvcD4KKyAgPHAgY2xhc3M9Im5vdGVwYXJhIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZXJlIGFuIFhNTCBzY2hlbWEgZGVmaW5lcyBydWxlcworICAgIGZvciBhbiBYTUwgZG9jdW1lbnQsIGFuIFhNTCA8ZW0+aW5zdGFuY2U8L2VtPiBpcyBhbiBYTUwgZG9jdW1lbnQgdGhhdCBjb25mb3JtcworICAgIHRvIHRoZSBzY2hlbWEuPC9wPgorICA8cD5Zb3UgY29tcGlsZSBhIHNjaGVtYSAoWFNEKSBmaWxlIHRvIGdlbmVyYXRlIGEgc2V0IG9mIEphdmEgaW50ZXJmYWNlcyB0aGF0CisgICAgbWlycm9yIHRoZSBzY2hlbWEuIFdpdGggdGhlc2UgdHlwZXMsIHlvdSBwcm9jZXNzIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMgdGhhdAorICAgIGNvbmZvcm0gdG8gdGhlIHNjaGVtYS4gWW91IGJpbmQgYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IHRvIHRoZXNlIHR5cGVzOyBjaGFuZ2VzCisgICAgbWFkZSB0aHJvdWdoIHRoZSBKYXZhIGludGVyZmFjZSBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgWE1MIHJlcHJlc2VudGF0aW9uLjwvcD4KKyAgPHA+UHJldmlvdXMgb3B0aW9ucyBmb3IgaGFuZGxpbmcgWE1MIGluY2x1ZGUgdXNpbmcgWE1MIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyAgICAoc3VjaCBhcyBET00gb3IgU0FYKSBvciBhbiBYTUwgbWFyc2hhbGxpbmcvYmluZGluZyB0b29sIChzdWNoIGFzIEpBWEIpLiBCZWNhdXNlCisgICAgaXQgbGFja3Mgc3Ryb25nIHNjaGVtYS1vcmllbnRlZCB0eXBpbmcsIG5hdmlnYXRpb24gaW4gYSBET00tb3JpZW50ZWQgbW9kZWwKKyAgICBpcyBtb3JlIHRlZGlvdXMgYW5kIHJlcXVpcmVzIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNvbXBsZXRlIG9iamVjdCBtb2RlbC4KKyAgICBKQVhCIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24sIGJ1dCBoYW5kbGVzIG9ubHkgYQorICAgIHN1YnNldCBvZiBpdDsgWE1MQmVhbnMgc3VwcG9ydHMgYWxsIG9mIGl0LiBBbHNvLCBieSBzdG9yaW5nIHRoZSBkYXRhIGluIG1lbW9yeQorICAgIGFzIFhNTCwgWE1MQmVhbnMgaXMgYWJsZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIG1hcnNoYWxsaW5nIGFuZCBkZW1hcnNoYWxsaW5nLjwvcD4KKyAgPGgxPkFjY2Vzc2luZyBYTUwgVXNpbmcgSXRzIFNjaGVtYTwvaDE+CisgIDxwPlRvIGdldCBhIGdsaW1wc2Ugb2YgdGhlIGtpbmRzIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggWE1MQmVhbnMsIHRha2UgYQorICAgIGxvb2sgYXQgYW4gZXhhbXBsZSB1c2luZyBYTUwgZm9yIGEgcHVyY2hhc2Ugb3JkZXIuIFRoZSBwdXJjaGFzZSBvcmRlciBYTUwKKyAgICBjb250YWlucyBkYXRhIGV4Y2hhbmdlZCBieSB0d28gcGFydGllcywgc3VjaCBhcyB0d28gY29tcGFuaWVzLiBCb3RoIHBhcnRpZXMKKyAgICBuZWVkIHRvIGJlIGFibGUgdG8gcmVseSBvbiBhIGNvbnNpc3RlbnQgbWVzc2FnZSBzaGFwZSwgYW5kIGEgc2NoZW1hIHNwZWNpZmllcworICAgIHRoZSBjb21tb24gZ3JvdW5kLiA8L3A+CisgIDxwPkhlcmUncyB3aGF0IGEgcHVyY2hhc2Ugb3JkZXIgWE1MIGluc3RhbmNlIG1pZ2h0IGxvb2sgbGlrZS48L3A+CisgIDxwcmU+CismbHQ7cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iJmd0OworICAgICZsdDtwbzpjdXN0b21lciZndDsKKyAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7R2xhZHlzIEtyYXZpdHombHQ7L3BvOm5hbWUmZ3Q7CisgICAgICAgICZsdDtwbzphZGRyZXNzJmd0O0FueXRvd24sIFBBJmx0Oy9wbzphZGRyZXNzJmd0OworICAgICZsdDsvcG86Y3VzdG9tZXImZ3Q7CisgICAgJmx0O3BvOmRhdGUmZ3Q7MjAwMy0wMS0wN1QxNDoxNjowMC0wNTowMCZsdDsvcG86ZGF0ZSZndDsKKyAgICAmbHQ7cG86bGluZS1pdGVtJmd0OworICAgICAgICAmbHQ7cG86ZGVzY3JpcHRpb24mZ3Q7QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEmbHQ7L3BvOmRlc2NyaXB0aW9uJmd0OworICAgICAgICAmbHQ7cG86cGVyLXVuaXQtb3VuY2VzJmd0OzUmbHQ7L3BvOnBlci11bml0LW91bmNlcyZndDsKKyAgICAgICAgJmx0O3BvOnByaWNlJmd0OzIxLjc5Jmx0Oy9wbzpwcmljZSZndDsKKyAgICAgICAgJmx0O3BvOnF1YW50aXR5Jmd0OzImbHQ7L3BvOnF1YW50aXR5Jmd0OworICAgICZsdDsvcG86bGluZS1pdGVtJmd0OworICAgICZsdDtwbzpsaW5lLWl0ZW0mZ3Q7CisgICAgICAgICZsdDtwbzpkZXNjcmlwdGlvbiZndDtCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiZsdDsvcG86ZGVzY3JpcHRpb24mZ3Q7CisgICAgICAgICZsdDtwbzpwZXItdW5pdC1vdW5jZXMmZ3Q7NSZsdDsvcG86cGVyLXVuaXQtb3VuY2VzJmd0OworICAgICAgICAmbHQ7cG86cHJpY2UmZ3Q7MTkuODkmbHQ7L3BvOnByaWNlJmd0OworICAgICAgICAmbHQ7cG86cXVhbnRpdHkmZ3Q7MiZsdDsvcG86cXVhbnRpdHkmZ3Q7CisgICAgJmx0Oy9wbzpsaW5lLWl0ZW0mZ3Q7CismbHQ7cG86c2hpcHBlciZndDsKKyAgICAgICAgJmx0O3BvOm5hbWUmZ3Q7WmlwU2hpcCZsdDsvcG86bmFtZSZndDsKKyAgICAgICAgJmx0O3BvOnBlci1vdW5jZS1yYXRlJmd0OzAuNzQmbHQ7L3BvOnBlci1vdW5jZS1yYXRlJmd0OworICAgICZsdDsvcG86c2hpcHBlciZndDsKKyZsdDsvcG86cHVyY2hhc2Utb3JkZXImZ3Q7PC9wcmU+CisgIDxwPlRoaXMgWE1MIGluY2x1ZGVzIGEgcm9vdCBlbGVtZW50LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVyY2hhc2Utb3JkZXI8L3NwYW4+LAorICAgIHRoYXQgaGFzIHRocmVlIGtpbmRzIG9mIGNoaWxkIGVsZW1lbnRzOiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3VzdG9tZXI8L3NwYW4+LAorICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kYXRlPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sCisgICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaGlwcGVyPC9zcGFuPi4gQW4gaW50dWl0aXZlLCBvYmplY3QtYmFzZWQgdmlldworICAgIG9mIHRoaXMgWE1MIHdvdWxkIHByb3ZpZGUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPgorICAgIGVsZW1lbnQsIGFuZCBpdCB3b3VsZCBoYXZlIG1ldGhvZHMgZm9yIGdldHRpbmcgdGhlIGRhdGUgYW5kIGZvciBnZXR0aW5nIHN1Ym9yZGluYXRlCisgICAgb2JqZWN0cyBmb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4sCisgICAgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zaGlwcGVyPC9zcGFuPiBlbGVtZW50cy4gRWFjaCBvZiB0aGUgbGFzdCB0aHJlZQorICAgIHdvdWxkIGhhdmUgaXRzIG93biBtZXRob2RzIGZvciBnZXR0aW5nIHRoZSBkYXRhIGluc2lkZSB0aGVtIGFzIHdlbGwuPC9wPgorICA8aDI+TG9va2luZyBhdCB0aGUgU2NoZW1hPC9oMj4KKyAgPHA+VGhlIGZvbGxvd2luZyBYTUwgaXMgdGhlIHRoZSBzY2hlbWEgZm9yIHRoZSBwcmVjZWRpbmcgcHVyY2hhc2Ugb3JkZXIgWE1MLgorICAgIEl0IGRlZmluZXMgdGhlIFhNTCdzICZxdW90O3NoYXBlJnF1b3Q7ICYjODIxMjsgd2hhdCBpdHMgZWxlbWVudHMgYXJlLCB3aGF0CisgICAgb3JkZXIgdGhleSBhcHBlYXIgaW4sIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB3aGljaCwgYW5kIHNvIG9uLjwvcD4KKzwvZGl2PgorPGRpdj4KKyAgPHByZT4KKyZsdDt4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgorICAgIHhtbG5zOnBvPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIgorICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCImZ3Q7CisKKyAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciImZ3Q7CisgICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKKyAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKKyAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJ4czpkYXRlVGltZSIvJmd0OworICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImxpbmUtaXRlbSIgdHlwZT0icG86bGluZS1pdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworICAgICAgICAmbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OworICAgICZsdDsveHM6ZWxlbWVudCZndDsKKyAgICAmbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tZXIiJmd0OworICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CisgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKKyAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InhzOnN0cmluZyIvJmd0OworICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CisgICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9ImxpbmUtaXRlbSImZ3Q7CisgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKKyAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKKyAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci11bml0LW91bmNlcyIgdHlwZT0ieHM6ZGVjaW1hbCIvJmd0OworICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzOmRvdWJsZSIvJmd0OworICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvJmd0OworICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CisgICAgJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9InNoaXBwZXIiJmd0OworICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CisgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKKyAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InBlci1vdW5jZS1yYXRlIiB0eXBlPSJ4czpkZWNpbWFsIi8mZ3Q7CisgICAgICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CisgICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKKyZsdDsveHM6c2NoZW1hJmd0OzwvcHJlPgorICA8ZGl2PgorICAgIDxwPlRoaXMgc2NoZW1hIGRlc2NyaWJlcyB0aGUgcHVyY2hhc2Ugb3JkZXIgWE1MIGluc3RhbmNlIGJ5IGRlZmluaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgorICA8L2Rpdj4KKyAgPHVsPgorICAgIDxsaT4KKyAgICAgIDxkaXY+RGVmaW5pdGlvbnMgZm9yIHRocmVlIGNvbXBsZXggdHlwZXMgJiM4MjEyOyBjdXN0b21lciwgbGluZS1pdGVtLCBhbmQKKyAgICAgICAgc2hpcHBlci4gVGhlc2UgYXJlIHRoZSB0eXBlcyB1c2VkIGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIHB1cmNoYXNlLW9yZGVyCisgICAgICAgIGVsZW1lbnQuIEluIHNjaGVtYSwgYSBjb21wbGV4IHR5cGUgaXMgb25lIHRoYXQgZGVmaW5lcyBhbiBlbGVtZW50IHRoYXQKKyAgICAgICAgbWF5IGhhdmUgY2hpbGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuIFRoZSBzZXF1ZW5jZSBlbGVtZW50IG5lc3RlZCBpbgorICAgICAgICB0aGUgY29tcGxleCB0eXBlIGxpc3RzIGl0cyBjaGlsZCBlbGVtZW50cy48L2Rpdj4KKyAgICAgIDxwPlRoZXNlIGFyZSBhbHNvIDxlbT5nbG9iYWw8L2VtPiB0eXBlcy4gVGhleSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUKKyAgICAgICAgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgc2NoZW1hIChpbiBvdGhlciB3b3JkcywganVzdCBiZW5lYXRoIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2NoZW1hPC9zcGFuPgorICAgICAgICByb290IGVsZW1lbnQpLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIGFueXdoZXJlIGVsc2UKKyAgICAgICAgaW4gdGhlIHNjaGVtYS48L3A+CisgICAgPC9saT4KKyAgPC91bD4KKzwvZGl2PgorPGRpdj4KKyAgPHVsPgorICAgIDxsaT5Vc2Ugb2Ygc2ltcGxlIHR5cGVzIHdpdGhpbiB0aGUgY29tcGxleCB0eXBlcy4gVGhlIG5hbWUsIGFkZHJlc3MsIGFuZCBkZXNjcmlwdGlvbgorICAgICAgZWxlbWVudHMgKGFtb25nIG90aGVycykgYXJlIHR5cGVkIGFzIHNpbXBsZSB0eXBlcy4gQXMgaXQgaGFwcGVucywgdGhlc2UKKyAgICAgIGFyZSBhbHNvIDxlbT5idWlsdC1pbjwvZW0+IHR5cGVzLiBBIGJ1aWx0LWluIHR5cGUgKGhlcmUsIG9uZSB3aXRoIHRoZSAmcXVvdDt4cyZxdW90OworICAgICAgcHJlZml4KSBpcyBwYXJ0IG9mIHRoZSBzY2hlbWEgc3BlY2lmaWNhdGlvbi4gKFRoZSBzcGVjaWZpY2F0aW9uIGRlZmluZXMKKyAgICAgIDQ2IGJ1aWx0LWluIHR5cGVzLik8L2xpPgorICAgIDxsaT5BIGdsb2JhbCBlbGVtZW50IGNhbGxlZCBwdXJjaGFzZS1vcmRlci4gVGhpcyBlbGVtZW50IGRlZmluaXRpb24gaW5jbHVkZXMKKyAgICAgIGEgbmVzdGVkIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBjaGlsZCBlbGVtZW50cyBmb3IgYQorICAgICAgcHVyY2hhc2Utb3JkZXIgZWxlbWVudC4gTm90aWNlIHRoYXQgdGhlIGNvbXBsZXggdHlwZSBpbmNsdWRlcyByZWZlcmVuY2VzCisgICAgICB0byB0aGUgb3RoZXIgY29tcGxleCB0eXBlcyBkZWZpbmVkIGluIHRoaXMgc2NoZW1hLjwvbGk+CisgIDwvdWw+CisgIDxkaXY+PC9kaXY+CisgIDxwPkluIG90aGVyIHdvcmRzLCB0aGUgc2NoZW1hIGRlZmluZXMgdHlwZXMgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBhbmQgZGVzY3JpYmVzCisgICAgdGhlaXIgcG9zaXRpb24gYXMgc3Vib3JkaW5hdGUgdG8gdGhlIHJvb3QgZWxlbWVudCwgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1cmNoYXNlLW9yZGVyPC9zcGFuPi48L3A+CisgIDxwPldoZW4geW91IHVzZSB0aGUgWE1MQmVhbiBjb21waWxlciB3aXRoIGFuIFhTRCBmaWxlIHN1Y2ggYXMgdGhpcyBvbmUsIHlvdQorICAgIGdlbmVyYXRlIGEgSkFSIGZpbGUgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLjwvcD4KKyAgPGgyPldyaXRpbmcgSmF2YSBDb2RlIFRoYXQgVXNlcyB0aGUgSW50ZXJmYWNlczwvaDI+CisgIDxwPldpdGggdGhlIFhNTEJlYW5zIGludGVyZmFjZXMgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB3cml0ZSBjb2RlIHRoYXQKKyAgICB1c2VzIHRoZSBuZXcgdHlwZXMgdG8gaGFuZGxlIFhNTCBiYXNlZCBvbiB0aGUgc2NoZW1hLiBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0CisgICAgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgb3JkZXJlZCBpdGVtcyBpbiB0aGUgcHVyY2hhc2Ugb3JkZXIKKyAgICBYTUwsIGNvdW50cyB0aGUgaXRlbXMsIGFuZCBjYWxjdWxhdGVzIGEgdG90YWwgb2YgdGhlaXIgcHJpY2VzLiBJbiBwYXJ0aWN1bGFyLAorICAgIGxvb2sgYXQgdGhlIHVzZSBvZiB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hIGFuZCBpbXBvcnRlZCBhcyBwYXJ0IG9mCisgICAgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5vcmcub3BlbnVyaS5lYXN5cG88L3NwYW4+IHBhY2thZ2UuIDwvcD4KKyAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmludEl0ZW1zPC9zcGFuPiBtZXRob2QgcmVjZWl2ZXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4KKyAgICBvYmplY3QgY29udGFpbmluZyB0aGUgcHVyY2hhc2Ugb3JkZXIgWE1MIGZpbGUuPC9wPgorICA8cHJlPgorcGFja2FnZSBkb2NzLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKK2ltcG9ydCBvcmcub3BlbnVyaS5lYXN5cG8uUHVyY2hhc2VPcmRlckRvY3VtZW50OworaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5QdXJjaGFzZU9yZGVyOworaW1wb3J0IG9yZy5vcGVudXJpLmVhc3lwby5MaW5lSXRlbTsKKworcHVibGljIGNsYXNzIFBPSGFuZGxlcgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEl0ZW1zKEZpbGUgcG8pIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEFsbCBYTUxCZWFucyBzY2hlbWEgdHlwZXMgcHJvdmlkZSBhIG5lc3RlZCBGYWN0b3J5IGNsYXNzIHlvdSBjYW4KKyAgICAgICAgICogdXNlIHRvIGJpbmQgWE1MIHRvIHRoZSB0eXBlLCBvciB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdHlwZS4KKyAgICAgICAgICogTm90ZSB0aGF0IGEgIkRvY3VtZW50IiB0eXBlIHN1Y2ggYXMgdGhpcyBvbmUgaXMgYW4gWE1MQmVhbnMKKyAgICAgICAgICogY29uc3RydWN0IGZvciByZXByZXNlbnRpbmcgYSBnbG9iYWwgZWxlbWVudC4gSXQgcHJvdmlkZXMgYSB3YXkKKyAgICAgICAgICogZm9yIHlvdSB0byBnZXQgYW5kIHNldCB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBBbHNvLCBub3RlIHRoYXQgdGhlIHBhcnNlIG1ldGhvZCB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUKKyAgICAgICAgICogWE1MIHlvdSdyZSBwYXJzaW5nIGFwcGVhcnMgdG8gY29uZm9ybSB0byB0aGUgc2NoZW1hLgorICAgICAgICAgKi8KKyAgICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50IHBvRG9jID0KKyAgICAgICAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgUHVyY2hhc2VPcmRlciB0eXBlIHJlcHJlc2VudHMgdGhlIHB1cmNoYXNlLW9yZGVyIGVsZW1lbnQncworICAgICAgICAgKiBjb21wbGV4IHR5cGUuCisgICAgICAgICAqLworICAgICAgICBQdXJjaGFzZU9yZGVyIHBvID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gYW4gZWxlbWVudCBtYXkgb2NjdXIgbW9yZSB0aGFuIG9uY2UgYXMgYSBjaGlsZCBlbGVtZW50LAorICAgICAgICAgKiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0IHJlZmVyIHRvIGFuCisgICAgICAgICAqIGFycmF5IG9mIHRoYXQgZWxlbWVudC4gVGhlIGxpbmUtaXRlbSBlbGVtZW50IGlzIGRlZmluZWQgd2l0aAorICAgICAgICAgKiBhIG1heE9jY3VycyBhdHRyaWJ1dGUgdmFsdWUgb2YgInVuYm91bmRlZCIsIG1lYW5pbmcgdGhhdAorICAgICAgICAgKiBpdCBtYXkgb2NjdXIgYXMgbWFueSB0aW1lcyBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCBhcyBuZWVkZWQuCisgICAgICAgICAqIFNvIHRoZXJlIGFyZSBtZXRob2RzIHN1Y2ggYXMgZ2V0TGluZUl0ZW1BcnJheSBhbmQgc2V0TGluZUl0ZW1BcnJheS4KKyAgICAgICAgICovCisgICAgICAgIExpbmVJdGVtW10gbGluZWl0ZW1zID0gcG8uZ2V0TGluZUl0ZW1BcnJheSgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlB1cmNoYXNlIG9yZGVyIGhhcyAiICsgbGluZWl0ZW1zLmxlbmd0aCArICIgbGluZSBpdGVtcy4iKTsKKworICAgICAgICBkb3VibGUgdG90YWxBbW91bnQgPSAwLjA7CisgICAgICAgIGludCBudW1iZXJPZkl0ZW1zID0gMDsKKworICAgICAgICAvKgorICAgICAgICAgKiBMb29wIHRocm91Z2ggdGhlIGxpbmUtaXRlbSBlbGVtZW50cywgdXNpbmcgZ2VuZXJhdGVkIGFjY2Vzc29ycyB0bworICAgICAgICAgKiBnZXQgdmFsdWVzIGZvciBjaGlsZCBlbGVtZW50cyBzdWNoIGEgZGVzY3JpcHRpb24sIHF1YW50aXR5LCBhbmQKKyAgICAgICAgICogcHJpY2UuCisgICAgICAgICAqLworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpbmVpdGVtcy5sZW5ndGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgTGluZSBpdGVtOiAiICsgaik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIiAgIERlc2NyaXB0aW9uOiAiICsgbGluZWl0ZW1zW2pdLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBRdWFudGl0eTogIiArIGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgUHJpY2U6ICIgKyBsaW5laXRlbXNbal0uZ2V0UHJpY2UoKSk7CisgICAgICAgICAgICBudW1iZXJPZkl0ZW1zICs9IGxpbmVpdGVtc1tqXS5nZXRRdWFudGl0eSgpOworICAgICAgICAgICAgdG90YWxBbW91bnQgKz0gbGluZWl0ZW1zW2pdLmdldFByaWNlKCkgKiBsaW5laXRlbXNbal0uZ2V0UXVhbnRpdHkoKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGl0ZW1zOiAiICsgbnVtYmVyT2ZJdGVtcyk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgYW1vdW50OiAiICsgdG90YWxBbW91bnQpOworICAgIH0KK30KKzwvcHJlPgorICA8cD5Ob3RpY2UgdGhhdCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hIHJlZmxlY3Qgd2hhdCdzIGluIHRoZSBYTUw6PC9wPgorPC9kaXY+Cis8dWw+CisgIDxsaT4KKyAgICA8ZGl2PkEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlB1cmNoYXNlT3JkZXJEb2N1bWVudDwvc3Bhbj4gcmVwcmVzZW50cyB0aGUKKyAgICAgIGdsb2JhbCByb290IGVsZW1lbnQuPC9kaXY+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8ZGl2PkEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdldFB1cmNoYXNlT3JkZXI8L3NwYW4+IG1ldGhvZCByZXR1cm5zIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlB1cmNoYXNlT3JkZXJEb2N1bWVudC5QdXJjaGFzZU9yZGVyPC9zcGFuPgorICAgICAgdHlwZSB0aGF0IGNvbnRhaW5zIGNoaWxkIGVsZW1lbnRzLCBpbmNsdWRpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmxpbmUtaXRlbTwvc3Bhbj4uCisgICAgICBBIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRMaW5lSXRlbUFycmF5PC9zcGFuPiBtZXRob2QgcmV0dXJucyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5MaW5lSXRlbTwvc3Bhbj4KKyAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnRzLjwvZGl2PgorICA8L2xpPgorICA8bGk+T3RoZXIgbWV0aG9kcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UXVhbnRpdHk8L3NwYW4+LCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0UHJpY2U8L3NwYW4+LAorICAgIGFuZCBzbyBvbiwgZm9sbG93IG5hdHVyYWxseSBmcm9tIHdoYXQgdGhlIHNjaGVtYSBkZXNjcmliZXMsIHJldHVybmluZyBjb3JyZXNwb25kaW5nCisgICAgY2hpbGRyZW4gb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+IGVsZW1lbnQuPC9saT4KKyAgPGxpPlRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlc2UgdHlwZXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEncworICAgIHRhcmdldCBuYW1lc3BhY2UuPC9saT4KKzwvdWw+Cis8ZGl2PgorICA8cD5DYXBpdGFsaXphdGlvbiBhbmQgcHVuY3R1YXRpb24gZm9yIGdlbmVyYXRlZCB0eXBlIG5hbWVzIGZvbGxvdyBKYXZhIGNvbnZlbnRpb24uCisgICAgQWxzbywgd2hpbGUgdGhpcyBleGFtcGxlIHBhcnNlcyB0aGUgWE1MIGZyb20gYSBmaWxlLCBvdGhlciA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cGFyc2U8L3NwYW4+CisgICAgbWV0aG9kcyBzdXBwb3J0IGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SW5wdXRTdHJlYW08L3NwYW4+IG9iamVjdCwKKyAgICBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5SZWFkZXI8L3NwYW4+IG9iamVjdCwgYW5kIHNvIG9uLjwvcD4KKyAgPHA+VGhlIHByZWNlZGluZyBKYXZhIGNvZGUgcHJpbnRzIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGNvbnNvbGU6PC9wPgorPC9kaXY+Cis8ZGl2PgorICA8cHJlPgorUHVyY2hhc2Ugb3JkZXIgaGFzIDMgbGluZSBpdGVtcy4KKyBMaW5lIGl0ZW0gMAorICAgRGVzY3JpcHRpb246IEJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxCisgICBRdWFudGl0eTogMgorICAgUHJpY2U6IDIxLjc5CisgTGluZSBpdGVtIDEKKyAgIERlc2NyaXB0aW9uOiBCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMgorICAgUXVhbnRpdHk6IDIKKyAgIFByaWNlOiAxOS44OQorVG90YWwgaXRlbXM6IDQKK1RvdGFsIGFtb3VudDogNDEuNjg8L3ByZT4KKyAgPGgyPkNyZWF0aW5nIE5ldyBYTUwgSW5zdGFuY2VzIGZyb20gU2NoZW1hPC9oMj4KKyAgPHA+QXMgeW91J3ZlIHNlZW4gWE1MQmVhbnMgcHJvdmlkZXMgYSAmcXVvdDtmYWN0b3J5JnF1b3Q7IGNsYXNzIHlvdSBjYW4gdXNlCisgICAgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgbmV3IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4KKyAgICBlbGVtZW50IGFuZCBhZGRzIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmN1c3RvbWVyPC9zcGFuPiBjaGlsZCBlbGVtZW50LgorICAgIEl0IHRoZW4gaW5zZXJ0cyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5hZGRyZXNzPC9zcGFuPgorICAgIGNoaWxkIGVsZW1lbnRzLCBjcmVhdGluZyB0aGUgZWxlbWVudHMgYW5kIHNldHRpbmcgdGhlaXIgdmFsdWVzIHdpdGggYSBzaW5nbGUKKyAgICBjYWxsIHRvIHRoZWlyIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZXQ8L3NwYW4+IG1ldGhvZHMuPC9wPgorICA8cHJlPgorcHVibGljIFB1cmNoYXNlT3JkZXJEb2N1bWVudCBjcmVhdGVQTygpCit7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtQdXJjaGFzZU9yZGVyRG9jdW1lbnQgbmV3UE9Eb2MgPSBQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7UHVyY2hhc2VPcmRlciBuZXdQTyA9IG5ld1BPRG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0N1c3RvbWVyIG5ld0N1c3RvbWVyID0gbmV3UE8uYWRkTmV3Q3VzdG9tZXIoKTsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25ld0N1c3RvbWVyLnNldE5hbWUoJnF1b3Q7RG9yaXMgS3Jhdml0eiZxdW90Oyk7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuZXdDdXN0b21lci5zZXRBZGRyZXNzKCZxdW90O0JlbGxmbG93ZXIsIENBJnF1b3Q7KTsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3JldHVybiBuZXdQT0RvYzsKK30KKzwvcHJlPgorICA8cD5UaGUgZm9sbG93aW5nIGlzIHRoZSBYTUwgdGhhdCByZXN1bHRzLiBOb3RlIHRoYXQgWE1MQmVhbnMgYXNzaWducyB0aGUgY29ycmVjdAorICAgIG5hbWVzcGFjZSBiYXNlZCBvbiB0aGUgc2NoZW1hLCB1c2luZyBhbiAmcXVvdDtuczEmcXVvdDsgKG9yLCAmcXVvdDtuYW1lc3BhY2UKKyAgICAxJnF1b3Q7KSBwcmVmaXguIEZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcmVmaXggaXRzZWxmIGRvZXNuJ3QgcmVhbGx5CisgICAgbWF0dGVyICYjODIxMjsgaXQncyB0aGUgbmFtZXNwYWNlIFVSSSAoaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbykgdGhhdCBkZWZpbmVzCisgICAgdGhlIG5hbWVzcGFjZS4gVGhlIHByZWZpeCBpcyBtZXJlbHkgYSBtYXJrZXIgdGhhdCByZXByZXNlbnRzIGl0LjwvcD4KKyAgPHByZT4mbHQ7bnMxOnB1cmNoYXNlLW9yZGVyIHhtbG5zOm5zMT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJnF1b3Q7Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O25zMTpjdXN0b21lciZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6bmFtZSZndDtEb3JpcyBLcmF2aXR6Jmx0Oy9uczE6bmFtZSZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtuczE6YWRkcmVzcyZndDtCZWxsZmxvd2VyLCBDQSZsdDsvbnMxOmFkZHJlc3MmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L25zMTpjdXN0b21lciZndDsKKyZsdDsvbnMxOnB1cmNoYXNlLW9yZGVyJmd0OworPC9wcmU+CisgIDxwPk5vdGUgdGhhdCBhbGwgdHlwZXMgKGluY2x1ZGluZyB0aG9zZSBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEpIGluaGVyaXQgZnJvbQorICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LCBhbmQgc28gcHJvdmlkZSBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5GYWN0b3J5PC9zcGFuPgorICAgIGNsYXNzLiBGb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIHR5cGUgc3lzdGVtIGluIHdoaWNoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+CisgICAgZml0cywgc2VlIDxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0CisgICAgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT4uIEZvciByZWZlcmVuY2UgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+WG1sT2JqZWN0CisgICAgSW50ZXJmYWNlPC9hPi48L3A+CisgIDxoMT5YTUxCZWFucyBIaWVyYXJjaHk8L2gxPgorICA8cD5UaGUgZ2VuZXJhdGVkIHR5cGVzIHlvdSBzYXcgdXNlZCBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUgYXJlIGFjdHVhbGx5IHBhcnQKKyAgICBvZiBhIGhpZXJhcmNoeSBvZiBYTUxCZWFucyB0eXBlcy4gVGhpcyBoaWVyYXJjaHkgaXMgb25lIG9mIHRoZSB3YXlzIGluIHdoaWNoCisgICAgWE1MQmVhbnMgcHJlc2VudHMgYW4gaW50dWl0aXZlIHZpZXcgb2Ygc2NoZW1hLiBBdCB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkKKyAgICBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiwgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBYTUxCZWFucworICAgIHR5cGVzLiBCZW5lYXRoIHRoaXMgbGV2ZWwsIHRoZXJlIGFyZSB0d28gbWFpbiB0eXBlIGNhdGVnb3JpZXM6IGdlbmVyYXRlZCB0eXBlcworICAgIHRoYXQgcmVwcmVzZW50IHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMsIGFuZCBpbmNsdWRlZCB0eXBlcyB0aGF0IHJlcHJlc2VudAorICAgIGJ1aWx0LWluIHNjaGVtYSB0eXBlcy48L3A+CisgIFRoaXMgdG9waWMgaGFzIGFscmVhZHkgaW50cm9kdWNlZCBnZW5lcmF0ZWQgdHlwZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyAgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEgVHlwZXMgR2VuZXJhdGVkIGZyb20KKyAgVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlcy48L2E+CisgIDxoMj5CdWlsdC1JbiBUeXBlIFN1cHBvcnQ8L2gyPgorICA8cD5JbiBhZGRpdGlvbiB0byB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBhIGdpdmVuIHNjaGVtYSwgWE1MQmVhbnMgcHJvdmlkZXMgNDYKKyAgICBKYXZhIHR5cGVzIHRoYXQgbWlycm9yIHRoZSA0NiBidWlsdC1pbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24uCisgICAgV2hlcmUgc2NoZW1hIGRlZmluZXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpkZWNpbWFsPC9zcGFuPiwKKyAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4sIGZvciBleGFtcGxlLCBYTUxCZWFucyBwcm92aWRlcworICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuaHRtbCI+WG1sU3RyaW5nPC9hPjwvc3Bhbj4sCisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuaHRtbCI+WG1sRGVjaW1hbDwvYT48L3NwYW4+LAorICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50Lmh0bWwiPlhtbEludDwvYT48L3NwYW4+LgorICAgIEVhY2ggb2YgdGhlc2UgYWxzbyBpbmhlcml0cyBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LAorICAgIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBidWlsdC1pbiBzY2hlbWEgdHlwZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6YW55VHlwZTwvc3Bhbj4uPC9wPgorICA8cD5YTUxCZWFucyBwcm92aWRlcyBhIHdheSBmb3IgeW91IHRvIGhhbmRsZSBYTUwgZGF0YSBhcyB0aGVzZSBidWlsdC1pbiB0eXBlcy4KKyAgICBXaGVyZSB5b3VyIHNjaGVtYSBpbmNsdWRlcyBhbiBlbGVtZW50IHdob3NlIHR5cGUgaXMsIGZvciBleGFtcGxlLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50PC9zcGFuPiwKKyAgICBYTUxCZWFucyB3aWxsIHByb3ZpZGUgYSBnZW5lcmF0ZWQgbWV0aG9kIGRlc2lnbmVkIHRvIHJldHVybiBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sSW50PC9zcGFuPi4KKyAgICBJbiBhZGRpdGlvbiwgYXMgeW91IHNhdyBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIGZvciBtb3N0IHR5cGVzIHRoZXJlIHdpbGwKKyAgICBhbHNvIGJlIGEgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5hdHVyYWwgSmF2YSB0eXBlIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmludDwvc3Bhbj4uCisgICAgVGhlIGZvbGxvd2luZyB0d28gbGluZXMgb2YgY29kZSByZXR1cm4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5xdWFudGl0eTwvc3Bhbj4KKyAgICBlbGVtZW50J3MgdmFsdWUsIGJ1dCByZXR1cm4gaXQgYXMgZGlmZmVyZW50IHR5cGVzLjwvcD4KKyAgPHByZT4KKy8vIE1ldGhvZHMgdGhhdCByZXR1cm4gc2ltcGxlIHR5cGVzIGJlZ2luIHdpdGggYW4gIngiLgorWG1sSW50IHhtbFF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLnhnZXRRdWFudGl0eSgpOworLy8gTWV0aG9kcyB0aGF0IHJldHVybiBhIG5hdHVyYWwgSmF2YSB0eXBlIGFyZSB1bmFkb3JuZWQuCitpbnQgamF2YVF1YW50aXR5ID0gbGluZWl0ZW1zW2pdLmdldFF1YW50aXR5KCk7Cis8L3ByZT4KKyAgPHA+SW4gYSBzZW5zZSBib3RoIGdldCBtZXRob2RzIG5hdmlnYXRlIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cXVhbnRpdHk8L3NwYW4+CisgICAgZWxlbWVudDsgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXRRdWFudGl0eTwvc3Bhbj4gbWV0aG9kIGdvZXMgYSBzdGVwCisgICAgZnVydGhlciBhbmQgY29udmVydHMgdGhlIGVsZW1lbnRzIHZhbHVlIHRvIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG5hdHVyYWwgSmF2YQorICAgIHR5cGUgYmVmb3JlIHJldHVybmluZyBpdC4gKFhNTEJlYW5zIGFsc28gcHJvdmlkZXMgYSBtZWFucyBmb3IgdmFsaWRhdGluZyB0aGUKKyAgICBYTUwgYXMgeW91IHdvcmsgd2l0aCBpdC4pPC9wPgorICA8cD5JZiB5b3Uga25vdyBhIGJpdCBhYm91dCBYTUwgc2NoZW1hLCBYTUxCZWFucyB0eXBlcyBzaG91bGQgc2VlbSBmYWlybHkgaW50dWl0aXZlLgorICAgIElmIHlvdSBkb24ndCwgeW91J2xsIGxlYXJuIGEgbG90IGJ5IGV4cGVyaW1lbnRpbmcgd2l0aCBYTUxCZWFucyB1c2luZyB5b3VyCisgICAgb3duIHNjaGVtYXMgYW5kIFhNTCBpbnN0YW5jZXMgYmFzZWQgb24gdGhlbS4gPC9wPgorICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbWV0aG9kcyBvZiB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIHNlZSA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMKKyAgICBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC9hPi4gRm9yIG1vcmUgYWJvdXQgdGhlIGhvdyBYTUxCZWFucyByZXByZXNlbnRzCisgICAgYnVpbHQtaW4gc2NoZW1hIHR5cGVzLCBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zCisgICAgU3VwcG9ydCBmb3IgQnVpbHQtSW4gU2NoZW1hIFR5cGVzPC9hPi48L3A+CisgIDxoMT5Vc2luZyBYUXVlcnkgRXhwcmVzc2lvbnM8L2gxPgorICA8cD5XaXRoIFhNTEJlYW5zIHlvdSBjYW4gdXNlIFhRdWVyeSB0byBxdWVyeSBYTUwgZm9yIHNwZWNpZmljIHBpZWNlcyBvZiBkYXRhLgorICAgIFhRdWVyeSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgJnF1b3Q7U1FMIGZvciBYTUwmcXVvdDsgYmVjYXVzZSBpdCBwcm92aWRlcworICAgIGEgbWVjaGFuaXNtIHRvIGFjY2VzcyBkYXRhIGRpcmVjdGx5IGZyb20gWE1MIGRvY3VtZW50cywgbXVjaCBhcyBTUUwgcHJvdmlkZXMKKyAgICBhIG1lY2hhbmlzbSBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gdHJhZGl0aW9uYWwgZGF0YWJhc2VzLjwvcD4KKyAgPHA+WFF1ZXJ5IGJvcnJvd3Mgc29tZSBvZiBpdHMgc3ludGF4IGZyb20gWFBhdGgsIGEgc3ludGF4IGZvciBzcGVjaWZ5aW5nIG5lc3RlZAorICAgIGRhdGEgaW4gWE1MLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmV0dXJucyBhbGwgb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5saW5lLWl0ZW08L3NwYW4+CisgICAgZWxlbWVudHMgd2hvc2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlPC9zcGFuPiBjaGlsZCBlbGVtZW50cyBoYXZlIHZhbHVlcworICAgIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMDo8L3A+CisgIDxwcmU+CitQdXJjaGFzZU9yZGVyRG9jdW1lbnQgZG9jID0gUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UocG8pOworCisvKgorICogVGhlIFhRdWVyeSBleHByZXNzaW9uIGlzIHRoZSBmb2xsb3dpbmcgdHdvIHN0cmluZ3MgY29tYmluZWQuIFRoZXkncmUKKyAqIGRlY2xhcmVkIHNlcGFyYXRlbHkgaGVyZSBmb3IgY29udmVuaWVuY2UuIFRoZSBmaXJzdCBzdHJpbmcgZGVjbGFyZXMKKyAqIHRoZSBuYW1lc3BhY2UgcHJlZml4IHRoYXQncyB1c2VkIGluIHRoZSBxdWVyeSBleHByZXNzaW9uOyB0aGUgc2Vjb25kCisgKiBkZWNsYXJlcyB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCisgKi8KK1N0cmluZyBuc1RleHQgPSAiZGVjbGFyZSBuYW1lc3BhY2UgcG8gPSAnaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyciOworU3RyaW5nIHBhdGhUZXh0ID0gIiR0aGlzL3BvOnB1cmNoYXNlLW9yZGVyL3BvOmxpbmUtaXRlbVtwbzpwcmljZSA8PSAyMC4wMF0iOworU3RyaW5nIHF1ZXJ5VGV4dCA9IG5zVGV4dCArIHBhdGhUZXh0OworCitYbWxDdXJzb3IgaXRlbUN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKS5leGVjUXVlcnkocXVlcnlUZXh0KTsKK1N5c3RlbS5vdXQucHJpbnRsbihpdGVtQ3Vyc29yLnhtbFRleHQoKSk7Cis8L3ByZT4KKyAgPHA+VGhpcyBjb2RlIGNyZWF0ZXMgYSBuZXcgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuIEZyb20gdGhlcmUsCisgICAgaXQgdXNlcyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4KKyAgICBtZXRob2QgdG8gZXhlY3V0ZSB0aGUgcXVlcnkgZXhwcmVzc2lvbi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVyCisgICAgaXMgYW4gWFF1ZXJ5IGV4cHJlc3Npb24gdGhhdCBzaW1wbHkgc2F5cywgJnF1b3Q7RnJvbSBteSBjdXJyZW50IGxvY2F0aW9uLAorICAgIG5hdmlnYXRlIHRocm91Z2ggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXJjaGFzZS1vcmRlcjwvc3Bhbj4gZWxlbWVudAorICAgIGFuZCByZXRyaWV2ZSB0aG9zZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bGluZS1pdGVtPC9zcGFuPiBlbGVtZW50cyB3aG9zZQorICAgIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyMC4wMC4mcXVvdDsgVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4KKyAgICB2YXJpYWJsZSBtZWFucyAmcXVvdDt0aGUgY3VycmVudCBwb3NpdGlvbi4mcXVvdDs8L3A+CisgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IFhRdWVyeSwgc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hxdWVyeS8iIHRhcmdldD0iX2JsYW5rIj5YUXVlcnkKKyAgICAxLjA6IEFuIFhNTCBRdWVyeSBMYW5ndWFnZTwvYT4gYXQgdGhlIFczQyB3ZWIgc2l0ZS48L3A+CisgIDxoMj5Vc2luZyBYTUwgQ3Vyc29yczwvaDI+CisgIDxwPkluIHRoZSBwcmVjZWRpbmcgZXhhbXBsZSB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3I8L2E+PC9zcGFuPgorICAgIGludGVyZmFjZS4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGEgd2F5IHRvIGV4ZWN1dGUgWFF1ZXJ5IGV4cHJlc3Npb24sIGFuCisgICAgWE1MIGN1cnNvcnMgb2ZmZXJzIGEgZmluZS1ncmFpbmVkIG1vZGVsIGZvciBtYW5pcHVsYXRpbmcgZGF0YS4gVGhlIFhNTCBjdXJzb3IKKyAgICBBUEksIGFuYWxvZ291cyB0byB0aGUgRE9NJ3Mgb2JqZWN0IEFQSSwgaXMgc2ltcGx5IGEgd2F5IHRvIHBvaW50IGF0IGEgcGFydGljdWxhcgorICAgIHBpZWNlIG9mIGRhdGEuIFNvLCBqdXN0IGxpa2UgYSBjdXJzb3IgaGVscHMgbmF2aWdhdGUgdGhyb3VnaCBhIHdvcmQgcHJvY2Vzc2luZworICAgIGRvY3VtZW50LCB0aGUgWE1MIGN1cnNvciBkZWZpbmVzIGEgbG9jYXRpb24gaW4gWE1MIHdoZXJlIHlvdSBjYW4gcGVyZm9ybSBhY3Rpb25zCisgICAgb24gdGhlIHNlbGVjdGVkIFhNTC48L3A+CisgIDxwPkN1cnNvcnMgYXJlIGlkZWFsIGZvciBtb3ZpbmcgdGhyb3VnaCBhbiBYTUwgZG9jdW1lbnQgd2hlbiB0aGVyZSdzIG5vIHNjaGVtYQorICAgIGF2YWlsYWJsZS4gT25jZSB5b3UndmUgZ290IHRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHlvdSdyZSBpbnRlcmVzdGVkIGluLAorICAgIHlvdSBjYW4gcGVyZm9ybSBhIHZhcmlldHkgb2Ygb3BlcmF0aW9ucyB3aXRoIGl0LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzZXQKKyAgICBhbmQgZ2V0IHZhbHVlcywgaW5zZXJ0IGFuZCByZW1vdmUgZnJhZ21lbnRzIG9mIFhNTCwgY29weSBmcmFnbWVudHMgb2YgWE1MCisgICAgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50LCBhbmQgbWFrZSBvdGhlciBmaW5lLWdyYWluZWQgY2hhbmdlcyB0byB0aGUKKyAgICBYTUwgZG9jdW1lbnQuPC9wPgorICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgdXNlcyBhbiBYTUwgY3Vyc29yIHRvIG5hdmlnYXRlIHRvIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3VzdG9tZXI8L3NwYW4+CisgICAgZWxlbWVudCdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiBjaGlsZCBlbGVtZW50LjwvcD4KKyAgPHByZT4KK1B1cmNoYXNlT3JkZXJEb2N1bWVudCBkb2MgPQorICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHBvKTsKKworWG1sQ3Vyc29yIGN1cnNvciA9IGRvYy5uZXdDdXJzb3IoKTsKK2N1cnNvci50b0ZpcnN0Q29udGVudFRva2VuKCk7CitjdXJzb3IudG9GaXJzdENoaWxkRWxlbWVudCgpOworY3Vyc29yLnRvRmlyc3RDaGlsZEVsZW1lbnQoKTsKK1N5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dCgpKTsKKworY3Vyc29yLmRpc3Bvc2UoKTsKKzwvcHJlPgorICA8cD5XaGF0J3MgaGFwcGVuaW5nIGhlcmU/IEFzIHdpdGggdGhlIGVhcmxpZXIgZXhhbXBsZSwgdGhlIGNvZGUgbG9hZHMgdGhlIFhNTAorICAgIGZyb20gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gb2JqZWN0LiBBZnRlciBsb2FkaW5nIHRoZSBkb2N1bWVudCwKKyAgICB0aGUgY29kZSBjcmVhdGVzIGEgY3Vyc29yIGF0IGl0cyBiZWdpbm5pbmcuIE1vdmluZyB0aGUgY3Vyc29yIGEgZmV3IHRpbWVzCisgICAgdGFrZXMgaXQgdG8gdGhlIG5lc3RlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bmFtZSA8L3NwYW4+IGVsZW1lbnQuIE9uY2UKKyAgICB0aGVyZSwgdGhlIGdldFRleHQgbWV0aG9kIHJldHJpZXZlcyB0aGUgZWxlbWVudCdzIHZhbHVlLjwvcD4KKyAgPHA+VGhpcyBpcyBqdXN0IGFuIGludHJvZHVjdGlvbiB0byBYTUwgY3Vyc29ycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcKKyAgICBjdXJzb3JzLCBzZWUgPGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGgKKyAgICBDdXJzb3JzPC9hPi48L3A+CisgIDxoMj5XaGVyZSB0byBHbyBOZXh0PC9oMj4KKzwvZGl2PgorPHVsPgorICA8bGk+CisgICAgPGRpdj5YTUxCZWFucyBwcm92aWRlcyBpbnR1aXRpdmUgd2F5cyB0byBoYW5kbGUgWE1MLCBwYXJ0aWN1bGFybHkgaWYgeW91J3JlCisgICAgICBzdGFydGluZyB3aXRoIHNjaGVtYS4gSWYgeW91J3JlIGFjY2Vzc2luZyBYTUwgdGhhdCdzIGJhc2VkIG9uIGEgc2NoZW1hLAorICAgICAgeW91J2xsIHByb2JhYmx5IGZpbmQgaXQgbW9zdCBlZmZpY2llbnQgdG8gYWNjZXNzIHRoZSBYTUwgdGhyb3VnaCBnZW5lcmF0ZWQKKyAgICAgIHR5cGVzIHNwZWNpZmljIHRvIHRoZSBzY2hlbWEuIFRvIGRvIHRoaXMsIHlvdSBiZWdpbiBieSBjb21waWxpbmcgdGhlIHNjaGVtYQorICAgICAgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgWE1MQmVhbnMgdHlwZXMgZ2VuZXJhdGVkCisgICAgICBieSBjb21waWxpbmcgc2NoZW1hLCBzZWUgPGEgaHJlZj0iY29uSmF2YVR5cGVzR2VuZXJhdGVkRnJvbVVzZXJEZXJpdmVkLmh0bWwiPkphdmEKKyAgICAgIFR5cGVzIEdlbmVyYXRlZCBGcm9tIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXM8L2E+IGFuZCA8YSBocmVmPSJjb25NZXRob2RzRm9yR2VuZXJhdGVkSmF2YVR5cGVzLmh0bWwiPk1ldGhvZHMKKyAgICAgIGZvciBUeXBlcyBHZW5lcmF0ZWQgRnJvbSBTY2hlbWE8L2E+LjwvZGl2PgorICA8L2xpPgorICA8bGk+CisgICAgPGRpdj5Zb3UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiByZWFkaW5nIG1vcmUgYWJvdXQgdGhlIHR5cGUgc3lzdGVtIG9uIHdoaWNoCisgICAgICBYTUxCZWFucyBpcyBiYXNlZCwgcGFydGljdWxhcmx5IGlmIHlvdSdyZSB1c2luZyB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEuCisgICAgICBYTUxCZWFucyBwcm92aWRlcyBhIGhpZXJhcmNoaWNhbCBzeXN0ZW0gb2YgdHlwZXMgdGhhdCBtaXJyb3Igd2hhdCB5b3UgZmluZAorICAgICAgaW4gdGhlIFhNTCBzY2hlbWEgc3BlY2lmaWNhdGlvbiBpdHNlbGYuIElmIHlvdSdyZSB3b3JraW5nIHdpdGggc2NoZW1hLCB5b3UKKyAgICAgIG1pZ2h0IGZpbmQgaXQgaGVscHMgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgdHlwZXMgd29yay4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCisgICAgICBzZWUgPGEgaHJlZj0iY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwiPlhNTEJlYW5zIFN1cHBvcnQKKyAgICAgIGZvciBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+IGFuZCA8YSBocmVmPSJjb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIj5JbnRyb2R1Y3Rpb24KKyAgICAgIHRvIFNjaGVtYSBUeXBlIFNpZ25hdHVyZXM8L2E+LjwvZGl2PgorICA8L2xpPgorICA8bGk+CisgICAgPGRpdj5YTUxCZWFucyBwcm92aWRlcyBhY2Nlc3MgdG8gWE1MIHRocm91Z2ggWFF1ZXJ5LCB3aGljaCBib3Jyb3dzIHBhdGggc3ludGF4CisgICAgICBmcm9tIFhQYXRoLiBXaXRoIFhRdWVyeSwgeW91IGNhbiBzcGVjaWZ5IHNwZWNpZmljIGZyYWdtZW50cyBvZiBYTUwgZGF0YQorICAgICAgd2l0aCBvciB3aXRob3V0IHNjaGVtYS4gVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBYUXVlcnkgYW5kIFhQYXRoIGluIFhNTEJlYW5zLAorICAgICAgc2VlIDxhIGhyZWY9ImNvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbCI+U2VsZWN0aW5nIFhNTCB3aXRoCisgICAgICBYUXVlcnkgYW5kIFhQYXRoPC9hPi48L2Rpdj4KKyAgPC9saT4KKyAgPGxpPllvdSBjYW4gdXNlIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UgZm9yCisgICAgZmluZS1ncmFpbmVkIG5hdmlnYXRpb24gYW5kIG1hbmlwdWxhdGlvbiBvZiBYTUwuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyAgICA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzPC9hPi48L2xpPgorPC91bD4KKzxkaXY+CisgIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgeGJlYW4uamFyIGZpbGUgdGhhdCBjb250YWlucworICAgIHRoZSBYTUxCZWFucyBsaWJyYXJ5IGlzIGZ1bGx5IGZ1bmN0aW9uYWwgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkuPC9wPgorICA8aDE+UmVsYXRlZCBUb3BpY3M8L2gxPgorICA8cD48YSBocmVmPSIuLi8uLi9zYW1wbGVzL25hdlhNTEJlYW5zU2FtcGxlcy5odG1sIj5YTUxCZWFucyBTYW1wbGVzPC9hPjwvcD4KKzwvZGl2PgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25JbnRyb1RvVGhlU2NoZW1hVHlwZVN5c3RlbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGYyMDYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2d1aWRlL2NvbkludHJvVG9UaGVTY2hlbWFUeXBlU3lzdGVtLmh0bWwKQEAgLTAsMCArMSwyMjkgQEAKKzwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KKworPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8aHRtbD4KKzxoZWFkPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgorPHRpdGxlPkludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSBTaWduYXR1cmVzPC90aXRsZT4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgorCisKKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KKworPG1ldGEgY29udGVudD0ieW91ciBuYW1lIiBuYW1lPSJhdXRob3IiPgorPG1ldGEgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIiBuYW1lPSJkZXNjcmlwdGlvbiI+Cis8bWV0YSBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIiBuYW1lPSJrZXl3b3JkcyI+Cis8bWV0YSBjb250ZW50PSIxMC8yNS8wMiIgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKworPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzxib2R5PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Cis8aDE+IEludHJvZHVjdGlvbiB0byBTY2hlbWEgVHlwZSBTaWduYXR1cmVzPC9oMT4KKzxkaXYgaWQ9InRvcGljdGV4dCI+CisgIDxwPldoZW4geW91IGNvbXBpbGUgc2NoZW1hLCB0aGUgQVBJIGdlbmVyYXRlZCBmcm9tIHlvdXIgc2NoZW1hIGlzIGludGVncmF0ZWQKKyAgICB3aXRoIHRoZSBYTUxCZWFucyB0eXBlIHN5c3RlbSB0aGF0IHJlcHJlc2VudHMgdGhlIHVuZGVybHlpbmcgWE1MIHNjaGVtYS4gQWxsCisgICAgdG9nZXRoZXIsIHRoZXNlIHR5cGVzIG1ha2UgdXAgdGhlIDxlbT5zY2hlbWEgdHlwZSBzeXN0ZW08L2VtPiB0byB3aGljaCB5b3VyCisgICAgY29kZSBoYXMgYWNjZXNzLiBXaGVuIGhhbmRsaW5nIFhNTCBiYXNlZCBvbiB0aGUgc2NoZW1hLCB5b3UgdHlwaWNhbGx5IGNhbGwKKyAgICBtZXRob2RzIG9mIHRoZSBBUEkgZ2VuZXJhdGVkIHdoZW4geW91IGNvbXBpbGVkIHRoZSBzY2hlbWEuIEhvd2V2ZXIsIGZvciB0aGUKKyAgICBjYXNlcyB3aGVuIHlvdSB3YW50IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2NoZW1hIGl0c2VsZiwgeW91IHVzZSB0aGUKKyAgICBzY2hlbWEgdHlwZSBzeXN0ZW0gQVBJLjwvcD4KKyAgPHA+SW4gdGhlIFhNTEJlYW5zIEFQSSwgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gaXRzZWxmIHRocm91Z2ggPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZVN5c3RlbS5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U2NoZW1hVHlwZVN5c3RlbTwvc3Bhbj48L2E+CisgICAgYW5kIHJlbGF0ZWQgY2xhc3Nlcy4gVGhlc2UgbWFrZSB1cCBhIGtpbmQgb2YgJnF1b3Q7bWV0YS1BUEksJnF1b3Q7IG9yIGEgdmlldworICAgIG9uIHRoZSBzY2hlbWEuIFlvdSBjYW4gdXNlIHRoZSBzY2hlbWEgdHlwZSBzeXN0ZW0gQVBJIHRvIGRpc2NvdmVyIHRoZSB0eXBlCisgICAgc3lzdGVtIGF0IHJ1biB0aW1lLiBTZWUgdGhlIHJlZmVyZW5jZSB0b3BpYyBvbiB0aGF0IGludGVyZmFjZSBmb3IgYW4gb3ZlcnZpZXcKKyAgICBvZiB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLjwvcD4KKyAgPGgyPlNjaGVtYSBUeXBlICZxdW90O1NpZ25hdHVyZXMmcXVvdDs8L2gyPgorICA8cD5BIHNjaGVtYSBpcyBtYWRlIHVwIG9mIHNjaGVtYSBjb21wb25lbnRzLiBTY2hlbWEgY29tcG9uZW50cyBhcmUgdGhlIHBpZWNlcworICAgIG9mIGEgc2NoZW1hLCBzdWNoIGFzIGEgdHlwZSBkZWZpbml0aW9uLCBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLCBhdHRyaWJ1dGUKKyAgICBkZWNsYXJhdGlvbiwgYW5kIHNvIG9uLiBUbyBtaXJyb3IgdGhlc2UgaW4gdGhlIHNjaGVtYSB0eXBlIHN5c3RlbSwgYSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFDb21wb25lbnQuaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlNjaGVtYUNvbXBvbmVudDwvc3Bhbj48L2E+CisgICAgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGNvbXBvbmVudCBpbiB0aGUgdW5kZXJseWluZyBzY2hlbWE7IHNlcGFyYXRlIGNvbXBvbmVudHMKKyAgICBoYXZlIGNvcnJlc3BvbmRpbmcgdHlwZXMuIEZvciBleGFtcGxlIHlvdSB3b3VsZCBoYXZlIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGUuaHRtbCI+U2NoZW1hVHlwZTwvYT48L3NwYW4+CisgICAgb2JqZWN0IGZvciBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5DdXN0b21lclR5cGU8L3NwYW4+IHlvdXIgc2NoZW1hIGRlZmluZWQsCisgICAgb3IgYSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50Lmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TY2hlbWFHbG9iYWxFbGVtZW50PC9zcGFuPjwvYT4KKyAgICBvYmplY3QgZm9yIGEgZ2xvYmFsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QdXJjaGFzZU9yZGVyPC9zcGFuPiBlbGVtZW50LgorICAgIFlvdSB3b3VsZCBhbHNvIGhhdmUgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+U2NoZW1hVHlwZTwvc3Bhbj4gZm9yIGJ1aWx0LWluCisgICAgc2NoZW1hIHR5cGVzLCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpzdHJpbmc8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czpkYXRldGltZTwvc3Bhbj4uCisgICAgWE1MQmVhbiBwcm92aWRlcyBhICZxdW90O3NpZ25hdHVyZSZxdW90OyB0byBkZXNjcmliZSBlYWNoIHR5cGUuIFlvdSBjYW4gcmV0cmlldmUKKyAgICB0aGlzIHNpZ25hdHVyZSBieSBjYWxsaW5nIHRoZSBTY2hlbWFUeXBlIGNsYXNzJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvU3RyaW5nPC9zcGFuPgorICAgIG1ldGhvZC48L3A+CisgIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9TdHJpbmc8L3NwYW4+IG1ldGhvZCByZXR1cm5zIFhNTEJlYW5zJyB2ZXJzaW9uCisgICAgb2YgYSB1bmlxdWUgc2lnbmF0dXJlIGZvciBhIHNjaGVtYSB0eXBlLiBUaGlzIHN0cmluZyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZworICAgIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgZ2l2ZW4gdHlwZSBldmVuIHdoZW4gdGhlIHR5cGUgZG9lc24ndCBoYXZlIGEgbmFtZS4KKyAgPC9wPgorICA8cCBjbGFzcz0ibm90ZXBhcmEiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSXQncyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCB0aGlzCisgICAgc2lnbmF0dXJlIGlzIGFuIFhNTEJlYW5zIGNvbnZlbnRpb24sIHJhdGhlciB0aGFuIGEgc3RhbmRhcmQgZnJvbSB0aGUgc2NoZW1hCisgICAgd29ya2luZyBncm91cC4gVGhlIHdvcmtpbmcgZ3JvdXAgaGFzIG5vdCB5ZXQgc3RhbmRhcmRpemVkIGEgc2lnbmF0dXJlIGZvcgorICAgIFhNTCBzY2hlbWEgdHlwZXMuIEFzIGEgcmVzdWx0IHRoZSBzaWduYXR1cmUgeW91J2xsIHNlZSBmcm9tIFhNTEJlYW5zIGlzIHN1YmplY3QKKyAgICB0byBjaGFuZ2UgJiM4MjEyOyB3aGF0ZXZlciB0aGUgc2NoZW1hIHdvcmtpbmcgZ3JvdXAgY29tZXMgdXAgd2l0aCBpbiB0aGUgZW5kCisgICAgKGlmIGFueXRoaW5nKSBpcyBwcm9iYWJseSB3aGF0IHdpbGwgYmUgdXNlZCBieSB0aGlzIEFQSS4gSW4gb3RoZXIgd29yZHMsIGRvbid0CisgICAgd3JpdGUgYSBwcm9ncmFtIHRvIGRlY29kZSB0aGUgc2lnbmF0dXJlLjwvcD4KKyAgPHA+WW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiB0byB1bmRlcnN0YW5kIGhvdyBhIHNpZ25hdHVyZSBpcyBjb25zdHJ1Y3RlZC48L3A+Cis8L2Rpdj4KKzx1bD4KKyAgPGxpPgorICAgIDxkaXY+PHN0cm9uZz5HbG9iYWwgdHlwZXMuPC9zdHJvbmc+IElmIHRoZSB0eXBlIGhhcyBhIG5hbWUsIGl0J3MgYSBnbG9iYWwKKyAgICAgIHR5cGUuIFRoZSBmb2xsb3dpbmcgZm9ybSBpcyB1c2VkOjwvZGl2PgorICAgIDxkaXY+CisgICAgICA8ZGl2PgorICAgICAgICA8cHJlPlQ9Jmx0O2xvY2FsbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDs8L3ByZT4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorICAgIDxwPlRoZSAmcXVvdDtUJnF1b3Q7IGlzIGZvciAmcXVvdDt0eXBlLCZxdW90OyBvZiBjb3Vyc2UuICZxdW90O2xvY2FsbmFtZSZxdW90OworICAgICAgaXMgYSBjb252ZW50aW9uIHVzZWQgYnkgcW5hbWVzIChxdWFsaWZpZWQgbmFtZXMpLCB3aGljaCBpbmNsdWRlIGEgbG9jYWwKKyAgICAgIG5hbWUgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiBTbyBhbiBleGFtcGxlIG1pZ2h0IGJlOjwvcD4KKyAgICA8cHJlPlQ9Y3VzdG9tZXJAb3BlbnVyaS5vcmc8L3ByZT4KKyAgPC9saT4KKyAgPGxpPjxzdHJvbmc+RG9jdW1lbnQgdHlwZXMgYW5kIGdsb2JhbCBhdHRyaWJ1dGUgdHlwZXMuPC9zdHJvbmc+IFRoZXNlIGNvcnJlc3BvbmQKKyAgICB0byBhIHNwZWNpYWwgYW5vbnltb3VzIHR5cGUgY29udGFpbmluZyBvbmUgZ2xvYmFsIGVsZW1lbnQgb3IgYXR0cmlidXRlLiBUaGVzZQorICAgIHNwZWNpYWwgdHlwZXMgYXJlIGdlbmVyYXRlZCBieSBYTUxCZWFucyB0byByZXByZXNlbnQgZ2xvYmFsIHR5cGVzIGRlY2xhcmVkCisgICAgd2l0aCB0aGUgJmx0O2VsZW1lbnQmZ3Q7IG9yICZsdDthdHRyaWJ1dGUmZ3Q7IHRhZyBpbiBzY2hlbWEuIEJlY2F1c2Ugc3VjaAorICAgIHR5cGVzIGFyZSB0eXBlcywgYnV0IGFyZSBkZWNsYXJlZCBhcyBlbGVtZW50cyBvciBhdHRyaWJ1dGVzLCB0aGV5IHJlcXVpcmUKKyAgICBzcGVjaWFsIHRyZWF0bWVudC4gVGhlIGZvbGxvd2luZyBzaWduYXR1cmUgZm9ybSBpcyB1c2VkOgorICAgIDxkaXY+CisgICAgICA8cHJlPgorRD0mbHQ7ZG9jdW1lbnQtZWxlbWVudC1uYW1lJmd0O0AmbHQ7dGFyZ2V0TmFtZXNwYWNlJmd0OworUj0mbHQ7YXR0cmlidXRlLXR5cGUtbmFtZSZndDtAJmx0O3RhcmdldE5hbWVzcGFjZSZndDsKKzwvcHJlPgorICAgICAgPGRpdj48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2PgorICAgICAgPGRpdj5Ob3RlIHRoYXQgdGhlc2UgYXJlIGFsc28gdGhlIHNpZ25hdHVyZXMgb2YgYSB0eXBlIHJldHVybmVkIGJ5IGEgRm9vRG9jdW1lbnQudHlwZQorICAgICAgICBvciBGb29BdHRyaWJ1dGUudHlwZSBtZXRob2QgY2FsbC48L2Rpdj4KKyAgICA8L2Rpdj4KKyAgPC9saT4KKyAgPGxpPjxzdHJvbmc+QW5vbnltb3VzIHR5cGVzLjwvc3Ryb25nPiBJZiB0aGUgdHlwZSBpcyBhbm9ueW1vdXMsIGl0IGlzIGRlZmluZWQKKyAgICBhcyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSwgb3Igd2l0aGluIGEgZnVydGhlciBhbm9ueW1vdXMgdHlwZS4gSW4gdGhpcyBjYXNlLAorICAgIHRoZSBzaWduYXR1cmUgaXMgYnVpbHQgYnkgZXN0YWJsaXNoaW5nIHRoZSBsb2NhbCBjb250ZXh0IChpbiBvcmRlciB3b3JkcywKKyAgICB3aGF0IGlzIHRoZSBhbm9ueW1vdXMgdHlwZSBuZXN0ZWQgaW4/KS4gRnJvbSB0aGUgbG9jYWwgY29udGV4dCwgdGhlIGxhcmdlcgorICAgIGNvbnRleHQgaXMgYnVpbHQgcmVjdXJzaXZlbHkuIEluIG90aGVyIHdvcmRzLCB0aGUgc2lnbmF0dXJlIGlzIGJ1aWx0IGJ5IGdpdmluZworICAgIG5vdCBvbmx5IHRoZSBhbm9ueW1vdXMgdHlwZSBpdHNlbGYsIGJ1dCBhbHNvIGJ5IGRlc2NyaWJpbmcgaXRzIGNvbnRleHQuCisgICAgPHA+IFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQgZm9yIGJ1aWxkaW5nIGEgc2lnbmF0dXJlIGZvciBhbiBhbm9ueW1vdXMKKyAgICAgIHR5cGUuIDwvcD4KKyAgICA8dWw+CisgICAgICA8bGk+IEl0IG1pZ2h0IGJlIGFuIGFub255bW91cyB0eXBlIGRlZmluZWQgaW5zaWRlIGEgbG9jYWwgZWxlbWVudCBvciBhdHRyaWJ1dGUsCisgICAgICAgIHdoaWNoIGluIHR1cm4gaXMgZGVmaW5lZCB3aXRoaW4gc29tZXRoaW5nIGVsc2U6CisgICAgICAgIDxwPklmIHRoZSBlbGVtZW50IGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIiBzdHlsZT0ibGFuZ2lubGluZSI+Zm9ybT0mcXVvdDtxdWFsaWZpZWQmcXVvdDs8L3NwYW4+CisgICAgICAgICAgKHRoZSB1c3VhbCBkZWZhdWx0KTo8L3A+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+CisgICAgICA8cHJlPkU9Jmx0O2VsdG5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHdoaWNoIHRoZSBlbHQgaXMgZGVmaW5lZCZndDs8L3ByZT4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2PklmIHRoZSBlbGVtZW50IGlzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIiBzdHlsZT0ibGFuZ2lubGluZSI+Zm9ybT0mcXVvdDt1bnF1YWxpZmllZCZxdW90Ozwvc3Bhbj46PC9kaXY+CisgICAgPGRpdj4KKyAgICAgIDxwcmU+VT0mbHQ7ZWx0bmFtZSZndDt8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgdHlwZSB3aXRoaW4gd2hpY2ggdGhlIGVsdCBpcyBkZWZpbmVkJmd0OzwvcHJlPgorICAgIDwvZGl2PgorICAgIDxkaXY+SWYgdGhlIGF0dHJpYnV0ZSBpcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSIgc3R5bGU9ImxhbmdsaW5lIj5mb3JtPSZxdW90O3VucXVhbGlmaWVkJnF1b3Q7PC9zcGFuPgorICAgICAgKHRoZSB1c3VhbCBkZWZhdWx0KTo8L2Rpdj4KKyAgICA8ZGl2PgorICAgICAgPHByZT5BPSZsdDthdHRybmFtZSZndDt8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgdHlwZSB3aXRoaW4gdGhlIGF0dHIgaXMgZGVmaW5lZCZndDs8L3ByZT4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2PmlmIHRoZSBhdHRyaWJ1dGUgaXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiIHN0eWxlPSJsYW5naW5saW5lIj5mb3JtPSZxdW90O3F1YWxpZmllZCZxdW90Ozwvc3Bhbj46PC9kaXY+CisgICAgPGRpdj4KKyAgICAgIDxwcmU+UT0mbHQ7YXR0cm5hbWUmZ3Q7fCZsdDtzaWduYXR1cmUgb2YgdGhlIHR5cGUgd2l0aGluIHRoZSBhdHRyIGlzIGRlZmluZWQmZ3Q7PC9wcmU+CisgICAgPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPHVsPgorICAgIDxsaT5JdCBtaWdodCBiZSBhbiBhbm9ueW1vdXMgdHlwZSBkZWZpbmVkIGEgc2ltcGxlIHJlc3RyaWN0aW9uLCB1bmlvbiwgb3IKKyAgICAgIGxpc3QgZGVmaW5pdGlvbjo8L2xpPgorICA8L3VsPgorICA8YmxvY2txdW90ZT4KKyAgICA8ZGl2PgorICAgICAgPHByZT5NPSN8Jmx0O3NpZ25hdHVyZSBvZiB0aGUgY29udGFpbmluZyB1bmlvbiB0eXBlJmd0OzwvcHJlPgorICAgICAgPHA+KFRoZSAjIGlzIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggdW5pb24gbWVtYmVyIGl0IGlzLCBieSBzb3VyY2Ugb3JkZXIKKyAgICAgICAgJiM4MjEyOyBzdWNoIGFzIDAsMSwyLCBldGMuKTwvcD4KKyAgICAgIDxwcmU+Qj18Jmx0O3NpZ25hdHVyZSBvZiB0aGUgY29udGFpbmluZyBiYXNlIHR5cGUgZm9yIGEgcmVzdHJpY3Rpb24mZ3Q7PC9wcmU+CisgICAgICA8cHJlPkk9fCZsdDtzaWduYXR1cmUgb2YgdGhlIGNvbnRhaW5pbmcgbGlzdCB0eXBlJmd0OzwvcHJlPgorICAgIDwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDx1bD4KKyAgICA8bGk+CisgICAgICA8ZGl2PiBJbiB0aGUgZnV0dXJlIGlmIGFub255bW91cyB0eXBlcyBhcmUgYWxsb3dlZCBpbiBzb21lIG90aGVyIGNvbnRleHQsCisgICAgICAgIHRoZXJlIG1heSBiZSBtb3JlIGNvZGVzLjwvZGl2PgorICAgIDwvbGk+CisgIDwvdWw+Cis8L3VsPgorPGgyPkFuIEV4YW1wbGU8L2gyPgorPHA+U28sIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGxpc3QgaXRlbXMgd2l0aGluIGFuCisgIGF0dHJpYnV0ZSBvZiBhbiBpbnN0YW5jZSB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+Cis8YmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8cHJlPiAmbHQ7cm9vdCBteWxpc3Q9JnF1b3Q7NDMyIDk5OSAxNDMgMTIzJnF1b3Q7LyZndDs8L3ByZT4KKyAgPC9kaXY+Cis8L2Jsb2NrcXVvdGU+Cis8ZGl2PiBUaGUgc2NoZW1hLCBpZiBkb25lIHdpdGggbG90cyBvZiBuZXN0ZWQgdHlwZXMsIGNvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UKKyAgdGhpczo8L2Rpdj4KKzxibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxwcmU+CismbHQ7c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtteU5hbWVzcGFjZSZxdW90OyBlbGVtZW50Rm9ybURlZmF1bHQ9JnF1b3Q7cXVhbGlmaWVkJnF1b3Q7Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2VsZW1lbnQgbmFtZT0mcXVvdDtyb290JnF1b3Q7Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NvbXBsZXhUeXBlJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O215bGlzdCZxdW90OyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzaW1wbGVUeXBlJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2xpc3QmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c2ltcGxlVHlwZSZndDsgJmx0OyEtLVRoaXMgaXMgdGhlIHR5cGUgdGhhdCB0aGUgc2lnbmF0dXJlIGlzIGZvciAtLSZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtyZXN0cmljdGlvbiBiYXNlPSZxdW90O3hzOm5vbk5lZ2F0aXZlSW50ZWdlciZxdW90OyZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDt0b3RhbERpZ2l0cyB2YWx1ZT0mcXVvdDszJnF1b3Q7LyZndDsuLgorPC9wcmU+CisgIDwvZGl2PgorPC9ibG9ja3F1b3RlPgorPGRpdj4gVGhlIHNpZ25hdHVyZSBmb3IgdGhlIHNpbXBsZVR5cGUgaW5kaWNhdGVkIGluIHRoZSBleGFtcGxlIHdvdWxkIGJlOjwvZGl2PgorPGJsb2NrcXVvdGU+CisgIDxwcmU+ST18QT1teWxpc3R8RT1yb290fEQ9cm9vdEBteU5hbWVzcGFjZTwvcHJlPgorPC9ibG9ja3F1b3RlPgorPGRpdj4KKyAgPHA+WW91IGNvdWxkIHJlYWQgdGhpcyBhczogPC9wPgorPC9kaXY+Cis8YmxvY2txdW90ZT4KKyAgPGRpdj4mcXVvdDtUaGUgdHlwZSBvZiB0aGUgbGlzdCBpdGVtIHwgd2l0aGluIHRoZSB0eXBlIG9mIHRoZSBteWxpc3QgYXR0cmlidXRlJ3MKKyAgICB0eXBlIHwgd2l0aGluIHRoZSB0eXBlIG9mIHRoZSByb290IGVsZW1lbnQgfCB3aXRoaW4gdGhlIGRvY3VtZW50IHR5cGUgZm9yCisgICAgJmx0O3Jvb3QmZ3Q7IGRvY3VtZW50cyB8IGluIHRoZSBteU5hbWVzcGFjZSBuYW1lc3BhY2UmcXVvdDsuPC9kaXY+Cis8L2Jsb2NrcXVvdGU+Cis8ZGl2PgorICA8cD5Ob3RlIHRoYXQgdGhlIHNpZ25hdHVyZSBzdHJ1Y3R1cmUgbWlycm9ycyB0aGUgSmF2YSBjbGFzcyBzdHJ1Y3R1cmUgZ2VuZXJhdGVkCisgICAgYnkgWE1MQmVhbnMgd2hlbiBjb21waWxpbmcgdGhlIHNjaGVtYS4gSW4gb3RoZXIgd29yZHMsIGlmIHlvdSB3ZXJlIHRvIGNvbXBpbGUKKyAgICBhIHNjaGVtYSB0aGF0IGluY2x1ZGVkIHRoZSBwcmVjZWRpbmcgc25pcHBldCwgeW91IHdvdWxkIGJlIGFibGUgdG8gYWNjZXNzCisgICAgYW4gaW5zdGFuY2Ugb2YgdGhlIHNjaGVtYSB3aXRoIEphdmEgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgorICA8cHJlPlNjaGVtYVR5cGUgc1R5cGUgPSBSb290RG9jdW1lbnQuUm9vdC5NeUxpc3QuSXRlbS50eXBlOzwvcHJlPgorPC9kaXY+Cis8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+Cis8cD48YSBocmVmPSJjb25HZXR0aW5nU3RhcnRlZHdpdGhYTUxCZWFucy5odG1sIj5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT48L3A+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2NvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQyMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvZG9jcy9ndWlkZS9jb25KYXZhVHlwZXNHZW5lcmF0ZWRGcm9tVXNlckRlcml2ZWQuaHRtbApAQCAtMCwwICsxLDQ3MSBAQAorPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgorCis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxodG1sPgorPGhlYWQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Cis8dGl0bGU+SmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBTY2hlbWE8L3RpdGxlPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKE1ldGEpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CisKKworPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgorCis8bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Cis8IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKzwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+CisKKzxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CisKKzwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKworCis8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9InlvdXIgbmFtZSI+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIj4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIj4KKzxtZXRhIG5hbWU9ImRhdGUgbGFzdCBtb2RpZmllZCIgY29udGVudD0iMTAvMjUvMDIiPgorPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+PCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPGJvZHk+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KKzxoMT4gSmF2YSBUeXBlcyBHZW5lcmF0ZWQgZnJvbSBVc2VyLURlcml2ZWQgU2NoZW1hIFR5cGVzPC9oMT4KKzxkaXYgaWQ9InRvcGljdGV4dCI+CisgIDxwPldoZW4geW91IGNvbXBpbGUgWE1MIHNjaGVtYSwgdGhlIHJlc3VsdGluZyBBUEkgaXMgbWFkZSB1cCBvZiB0d28gY2F0ZWdvcmllcworICAgIG9mIHR5cGVzOiBidWlsdC1pbiB0eXBlcyB0aGF0IG1pcnJvciB0aG9zZSBpbiB0aGUgc2NoZW1hIHNwZWNpZmljYXRpb24gYW5kCisgICAgb3RoZXJzIHRoYXQgYXJlIGdlbmVyYXRlZCBmcm9tIHVzZXItZGVyaXZlZCBzY2hlbWEgdHlwZXMuIFRoaXMgdG9waWMgcHJvdmlkZXMKKyAgICBhbiBvdmVydmlldyBvZiB0aGUgSmF2YSB0eXBlcyBnZW5lcmF0ZWQgZm9yIHVzZXItZGVyaXZlZCB0eXBlcywgZGVzY3JpYmluZworICAgIHRoZSBtZXRob2RzIHRoZSBKYXZhIHR5cGVzIHByb3ZpZGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGJ1aWx0LWluIHR5cGVzLAorICAgIHNlZSA8YSBocmVmPSJjb25YTUxCZWFuc1N1cHBvcnRCdWlsdEluU2NoZW1hVHlwZXMuaHRtbCI+WE1MQmVhbnMgU3VwcG9ydCBmb3IKKyAgICBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2E+LiBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1ldGhvZHMgZXhwb3NlZAorICAgIGJ5IGdlbmVyYXRlZCB0eXBlcywgc2VlIDxhIGhyZWY9ImNvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbCI+TWV0aG9kcworICAgIGZvciBHZW5lcmF0ZWQgSmF2YSBUeXBlczwvYT4uPC9wPgorICA8cD5JbiBnZW5lcmFsLCBhbiBBUEkgZ2VuZXJhdGVkIGZyb20gc2NoZW1hIGlzIGFuIGludHVpdGl2ZSBtZWFucyB0byBhY2Nlc3MKKyAgICBYTUwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBzY2hlbWEuIFlvdSdsbCBwcm9iYWJseSBmaW5kIHRoYXQgZm9yIG1vc3QgdXNlcworICAgIGl0J3MgdW5uZWNlc3NhcnkgdG8ga25vdyB0aGUgcnVsZXMgZm9yIGdlbmVyYXRpbmcgaXQgaW4gb3JkZXIgdG8gdXNlIGl0LiBIb3dldmVyLAorICAgIGZvciB0aG9zZSBjYXNlcyB3aGVuIGl0J3MgdW5jbGVhciB3aGF0J3MgZ29pbmcgb24gYmVoaW5kIHRoZSBzY2VuZXMgKG9yIGlmCisgICAgeW91J3JlIGp1c3QgY3VyaW91cyksIHRoaXMgdG9waWMgZGVzY3JpYmVzIHRoZSBydWxlcy48L3A+CisgIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgWE1MQmVhbnMgQVBJIGFsc28gcHJvdmlkZXMgYQorICAgIHdheSBmb3IgeW91IHRvIGdldCBpbmZvcm1hdGlvbiA8ZW0+YWJvdXQgPC9lbT50aGUgdHlwZSBzeXN0ZW0gaXRzZWxmICYjODIxMjsKKyAgICBpbiBvdGhlciB3b3JkcywgYWJvdXQgdGhlIEFQSSBhbmQgdGhlIHVuZGVybHlpbmcgc2NoZW1hLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKKyAgICBzZWUgPGEgaHJlZj0iY29uSW50cm9Ub1RoZVNjaGVtYVR5cGVTeXN0ZW0uaHRtbCI+SW50cm9kdWN0aW9uIHRvIFNjaGVtYSBUeXBlCisgICAgU2lnbmF0dXJlczwvYT4uPC9wPgorICA8cD5FYWNoIG9mIHRoZSB0eXBlcyBnZW5lcmF0ZWQgd2hlbiB5b3UgY29tcGlsZSBhIHNjaGVtYSBpcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkKKyAgICBmb3IgYWNjZXNzIHRvIFhNTCBpbnN0YW5jZXMgY29uZm9ybWluZyB0byB0aGF0IHBhcnQgb2YgdGhlIHNjaGVtYS4gU3RhcnQgYnkKKyAgICB0YWtpbmcgYSBsb29rIGF0IGEgc2ltcGxlIFhNTCBhbmQgc2NoZW1hIGV4YW1wbGUuIFRoZSBmb2xsb3dpbmcgc2NoZW1hIGRlc2NyaWJlcworICAgIGFuIFhNTCBkb2N1bWVudCB0byBjb250YWluIGEgc3RvY2sgcHJpY2UgcXVvdGUuPC9wPgorICA8cHJlPiZsdDt4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsKKyAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwcmljZS1xdW90ZSImZ3Q7CisgICAgICAgICZsdDt4czpjb21wbGV4VHlwZSZndDsKKyAgICAgICAgICAgICZsdDt4czpzZXF1ZW5jZSZndDsKKyAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJzdG9jay1zeW1ib2wiIHR5cGU9InhzOnN0cmluZyIvJmd0OworICAgICAgICAgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9InN0b2NrLXByaWNlIiB0eXBlPSJ4czpmbG9hdCIvJmd0OworICAgICAgICAgICAgJmx0Oy94czpzZXF1ZW5jZSZndDsKKyAgICAgICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsKKyAgICAmbHQ7L3hzOmVsZW1lbnQmZ3Q7CismbHQ7L3hzOnNjaGVtYSZndDsKKzwvcHJlPgorICA8cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgWE1MIHRoYXQgY29uZm9ybXMgdG8gdGhpcyBzY2hlbWEuPC9wPgorICA8cHJlPiZsdDtwcmljZS1xdW90ZSZndDsKKyAgICAmbHQ7c3RvY2stc3ltYm9sJmd0O0JFQVMmbHQ7L3N0b2NrLXN5bWJvbCZndDsKKyAgICAmbHQ7c3RvY2stcHJpY2UmZ3Q7NTkuMjEmbHQ7L3N0b2NrLXByaWNlJmd0OworJmx0Oy9wcmljZS1xdW90ZSZndDs8L3ByZT4KKyAgPHA+V2hlbiB5b3UgY29tcGlsZSB0aGlzIHNjaGVtYSwgeW91IGdldCB0d28gZ2VuZXJhdGVkIFhNTEJlYW5zIGludGVyZmFjZXM6CisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPiBQcmljZVF1b3RlRG9jdW1lbnQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50LlByaWNlUXVvdGU8L3NwYW4+LjwvcD4KKyAgPHA+RnJvbSB0aGUgc2NoZW1hIHBvaW50IG9mIHZpZXcsIHRoZSBnZW5lcmF0ZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+CisgICAgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIDxlbT5jb21wbGV4IHR5cGU8L2VtPiB5b3Ugc2VlIGluc2lkZSB0aGUgc2NoZW1hJ3MKKyAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IGVsZW1lbnQgZGVjbGFyYXRpb24uIExvb2tpbmcgYXQKKyAgICB0aGUgWE1MIGluc3RhbmNlLCB5b3UgY2FuIHNlZSB0aGF0IHRoaXMgY29tcGxleCB0eXBlIHRyYW5zbGF0ZXMgaW50byBhIHNlcXVlbmNlCisgICAgb2YgdHdvIGVsZW1lbnRzLCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c3RvY2stc3ltYm9sPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN0b2NrLXByaWNlPC9zcGFuPi4KKyAgICBTbyBpdCdzIG5vdCBzdXJwcmlzaW5nIHRoYXQgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5QcmljZVF1b3RlPC9zcGFuPgorICAgIGludGVyZmFjZSBleHBvc2VzIG1ldGhvZHMgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0U3RvY2tQcmljZTwvc3Bhbj4KKyAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNldFN0b2NrUHJpY2U8L3NwYW4+IHRvIHNldCB0aGUgdmFsdWUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN0b2NrLXByaWNlPC9zcGFuPgorICAgIGVsZW1lbnQuPC9wPgorICA8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGVEb2N1bWVudDwvc3Bhbj4gaW50ZXJmYWNlLCBvbiB0aGUKKyAgICBvdGhlciBoYW5kLCByZXByZXNlbnRzIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IDxlbT5kb2N1bWVudDwvZW0+CisgICAgdGhhdCBjb250YWlucyB0aGUgcm9vdCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2UtcXVvdGU8L3NwYW4+IGVsZW1lbnQuCisgICAgWE1MQmVhbnMgY3JlYXRlcyBhIHNwZWNpYWwgJnF1b3Q7ZG9jdW1lbnQmcXVvdDsgdHlwZSBmb3IgZ2xvYmFsIGVsZW1lbnQgdHlwZXMuCisgICAgQSBkb2N1bWVudCB0eXBlIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gZ2V0IGFuZCBzZXQgdGhlIHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nCisgICAgdHlwZSwgaGVyZSByZXByZXNlbnRlZCBieSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZTwvc3Bhbj4uIFRoZQorICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wcmljZS1xdW90ZTwvc3Bhbj4gZWxlbWVudCBpcyBjb25zaWRlcmVkIGEgPGVtPmdsb2JhbDwvZW0+CisgICAgZWxlbWVudCBiZWNhdXNlIGl0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgZWxzZSBpbiB0aGUgc2NoZW1hLiBGb3IKKyAgICBnbG9iYWwgZWxlbWVudHMsIHRoZSBYTUxCZWFucyBzY2hlbWEgY29tcGlsZXIgZ2VuZXJhdGVzIGFuIGludGVyZmFjZSB3aG9zZQorICAgIG5hbWUgZW5kcyB3aXRoICZxdW90O0RvY3VtZW50LiZxdW90OyBUaGlzIGlzIGJlY2F1c2UgYW4gWE1MIHNjaGVtYSBoYXMgbm8KKyAgICB3YXkgb2YgZGVmaW5pbmcgYSAmcXVvdDtyb290JnF1b3Q7IGVsZW1lbnQ7IGFueSBnbG9iYWwgZWxlbWVudCBjYW4gYmUgdGhlCisgICAgcm9vdC48L3A+CisgIDxwPlRoZSBmb2xsb3dpbmcgYml0IG9mIEphdmEgY29kZSBpbGx1c3RyYXRlcyBob3cgeW91IG1pZ2h0IHVzZSB0aGVzZSBpbnRlcmZhY2VzCisgICAgdG8gZ2V0IHRoZSBzdG9jayBwcmljZSBjb250YWluZWQgaW4gdGhlIFhNTC48L3A+CisgIDxwcmU+CitwdWJsaWMgc3RhdGljIGZsb2F0IGdldFN0b2NrUHJpY2UoamF2YS5pby5GaWxlIG9yZGVyWE1MKSB0aHJvd3MgRXhjZXB0aW9uCit7CisgICAgUHJpY2VRdW90ZURvY3VtZW50IGRvY1hNTCA9IFByaWNlUXVvdGVEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG9yZGVyWE1MKTsKKyAgICBQcmljZVF1b3RlIHF1b3RlWE1MID0gZG9jWE1MLmdldFByaWNlUXVvdGUoKTsKKyAgICBmbG9hdCBzdG9ja1ByaWNlID0gcXVvdGVYTUwuZ2V0U3RvY2tQcmljZSgpOworICAgIHJldHVybiBzdG9ja1ByaWNlOworfQorPC9wcmU+CisgIDxwPlRoaXMgY29kZSBsb2FkcyB0aGUgWE1MIGZyb20gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gb2JqZWN0LAorICAgIGNvbnZlcnRpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wYXJzZTwvc3Bhbj4gbWV0aG9kJ3MgcmV0dXJuIHZhbHVlCisgICAgdG8gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+UHJpY2VRdW90ZURvY3VtZW50PC9zcGFuPiBpbnN0YW5jZS4gSXQgdGhlbgorICAgIHVzZXMgdGhpcyBpbnN0YW5jZSB0byBnZXQgYW4gaW5zdGFuY2Ugb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LgorICAgIFdpdGggPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlByaWNlUXVvdGU8L3NwYW4+LCB0aGUgY29kZSBleHRyYWN0cyB0aGUgc3RvY2sKKyAgICBwcmljZS4gPC9wPgorPC9kaXY+Cis8ZGl2PgorICA8ZGl2IGlkPSJ0b3BpY3RleHQiPgorICAgIDxwPlRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSByaWNoIHNldCBvZiBydWxlcyB0aHJvdWdoIHdoaWNoCisgICAgICB5b3UgY2FuIGRlcml2ZSBuZXcgdHlwZXMuIFdoZW4geW91IGdlbmVyYXRlIGludGVyZmFjZXMgZnJvbSB5b3VyIHNjaGVtYSwKKyAgICAgIFhNTEJlYW5zIHVzZXMgdGhlIHNjaGVtYSdzIHJ1bGVzIHRvIGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcy4KKyAgICAgIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHNvbWUgb2YgdGhlIGd1aWRlbGluZXMgYnkgd2hpY2ggdGhpcyBpcyBkb25lLjwvcD4KKyAgICA8aDI+TmFtZXMgZm9yIEludGVyZmFjZXM8L2gyPgorICAgIDxwPkludGVyZmFjZXMgYXJlIGdlbmVyYXRlZCBmb3Igc2NoZW1hIHR5cGVzIChib3RoIHNpbXBsZSBhbmQgY29tcGxleCkuIEFub255bW91cworICAgICAgc2NoZW1hIHR5cGVzIHJlc3VsdCBpbiBpbm5lciBpbnRlcmZhY2VzIGluc2lkZSB0aGUgdHlwZSBpbnRlcmZhY2UgaW4gd2hpY2gKKyAgICAgIHRoZXkgYXJlIGRlZmluZWQuIFRoZWlyIG5hbWUgY29tZXMgZnJvbSB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gd2hpY2gKKyAgICAgIHRoZXkgaXMgZGVmaW5lZC48L3A+CisgICAgPHA+TmFtZXMgZm9yIHNjaGVtYSB0eXBlcyBiZWNvbWUgSmF2YS1mcmllbmRseSBuYW1lcyB3aGVuIHRoZSBzY2hlbWEgaXMgY29tcGlsZWQuCisgICAgICBJbiBvdGhlciB3b3JkcywgbmFtZXMgc3VjaCBhcyAicHJpY2UtcXVvdGUiIGJlY29tZSAiUHJpY2VRdW90ZS4iIEluIGFkZGl0aW9uLAorICAgICAgYSBzY2hlbWEncyBYTUwgbmFtZXNwYWNlIFVSSXMgYmVjb21lIHBhY2thZ2UgbmFtZXMgZm9yIFhNTEJlYW4gdHlwZXMgZ2VuZXJhdGVkCisgICAgICBmcm9tIHRoZSBzY2hlbWEuIFRoZSB3YXkgdGhpcyBuYW1lIHRyYW5zbGF0aW9uIGlzIGRvbmUgaXMgZGVzY3JpYmVkIGJ5IHNlY3Rpb24KKyAgICAgIEMgb2YgdGhlIEphdmEgQVBJIGZvciBYTUwgQmluZGluZyAoSkFYQikgc3BlY2lmaWNhdGlvbiBhdCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9kb3dubG9hZHMvamF4Yi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+CisgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiLmh0bWwuPC9hPiA8L3A+CisgICAgPHA+SGVyZSBhcmUgYSBmZXcgZXhhbXBsZXM6PC9wPgorICAgIDx0YWJsZT4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxzdHJvbmc+U2NoZW1hIFRhcmdldCBOYW1lc3BhY2U8L3N0cm9uZz48L3RkPgorICAgICAgICA8dGQgd2lkdGg9IjE1NSI+PHN0cm9uZz5YTUwgTG9jYWxuYW1lPC9zdHJvbmc+PC90ZD4KKyAgICAgICAgPHRkPjxzdHJvbmc+RnVsbHktUXVhbGlmaWVkIFhNTEJlYW4gVHlwZSBOYW1lPC9zdHJvbmc+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5odHRwOi8vd3d3Lm15Y29tcGFueS5jb20vMjAwMi9idXllcjwvdGQ+CisgICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij5wdXJjaGFzZS1vcmRlci00PC90ZD4KKyAgICAgICAgPHRkPmNvbS5teWNvbXBhbnkueDIwMDIuYnV5ZXIuUHVyY2hhc2VPcmRlcjQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmh0dHA6Ly9teWNvLmNvbS9zYW1wbGUuaHRtbDwvdGQ+CisgICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij5TYW1wbGVEb2N1bWVudDwvdGQ+CisgICAgICAgIDx0ZD5jb20ubXljby5zYW1wbGUuU2FtcGxlRG9jdW1lbnQ8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0X2Nhc2VfMTwvdGQ+CisgICAgICAgIDx0ZCB3aWR0aD0iMTU1Ij50ZXN0X3R5cGU8L3RkPgorICAgICAgICA8dGQ+b3JnLm9wZW51cmkudGVzdENhc2UxLlRlc3RUeXBlPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgICA8cD5XaGVuIHRoZXJlIGFyZSBuYW1lIGNvbGxpc2lvbnMsIHRoZSBnZW5lcmF0ZWQgdHlwZXMgd2lsbCBoYXZlIG5hbWVzIHdpdGgKKyAgICAgIG51bWVyYWxzIGFwcGVuZGVkJm5ic3A7lyBmb3IgZXhhbXBsZSwgIlRlc3RUeXBlMiIuPC9wPgorICAgIDxoMj5HbG9iYWwgRWxlbWVudHMgYW5kIEF0dHJpYnV0ZXM8L2gyPgorICAgIDxwPkluIHNjaGVtYSwgZ2xvYmFsIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBhcmUgdGhvc2UgdGhhdCBhcmUKKyAgICAgIGRlY2xhcmVkIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHNjaGVtYSAodGhhdCBpcywgaW1tZWRpYXRlbHkgd2l0aGluIHRoZQorICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNjaGVtYTwvc3Bhbj4gcm9vdCBlbGVtZW50KS4gQmVjYXVzZSB0aGV5IGFyZSBnbG9iYWwsCisgICAgICB0aGV5IG1heSBiZSByZWZlcmVuY2VkIGZyb20gaW5zaWRlIHRoZSBzY2hlbWEgYnkgbmFtZS4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5jcmVkaXRSZXBvcnQ8L3NwYW4+CisgICAgICAobm90IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y3JlZGl0UmVwb3J0VHlwZTwvc3Bhbj4gY29tcGxleCB0eXBlKQorICAgICAgZWxlbWVudCBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2NoZW1hIGlzIGFuIGV4YW1wbGUuPC9wPgorICAgIDxwcmU+CismbHQ7eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlcy9jcmVkaXRSZXBvcnQmcXVvdDsKKyAgICB4bWxuczpjcj0mcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvc2FtcGxlcy9jcmVkaXRSZXBvcnQmcXVvdDsKKyAgICB4bWxuczp4cz0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSZxdW90OworICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0mcXVvdDtxdWFsaWZpZWQmcXVvdDsKKyAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0mcXVvdDt1bnF1YWxpZmllZCZxdW90OyZndDsKKyAgICAmbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtjcmVkaXRSZXBvcnRUeXBlJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CisgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2JhbmtSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDt0YXhSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDt4czpzdHJpbmcmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworICAgICZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7CisgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtjcmVkaXRSZXBvcnQmcXVvdDsgdHlwZT0mcXVvdDtjcjpjcmVkaXRSZXBvcnRUeXBlJnF1b3Q7LyZndDsKKyZsdDsveHM6c2NoZW1hJmd0OzwvcHJlPgorICAgIDxwPlhNTEJlYW5zIGdlbmVyYXRlcyBhIHNlcGFyYXRlIGludGVyZmFjZSBmb3IgZWFjaCBvZiB0aGVzZS4gQWxzbywgZ2xvYmFsCisgICAgICBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgdHlwZXMgYXJlIHNvbWV3aGF0IHVuaXF1ZSBpbiB0aGF0IHRoZSBzY2hlbWEgY29tcGlsZXIKKyAgICAgIHdpbGwgY3JlYXRlIHNwZWNpYWwgdHlwZXMgdG8gaG9sZCB0aGUgZ2xvYmFsbHkgZGVmaW5lZCBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KKyAgICAgIFRoZSBuYW1lcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIGFwcGVuZGVkIHdpdGggJnF1b3Q7RG9jdW1lbnQmcXVvdDsgKGZvcgorICAgICAgZWxlbWVudHMpIG9yICZxdW90O0F0dHJpYnV0ZSZxdW90OyAoZm9yIGF0dHJpYnV0ZXMpLiBZb3UgY2FuIHJldHJpZXZlIHRoZQorICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXRzZWxmIChvciBjcmVhdGUgYSBuZXcgb25lKSBieSBjYWxsaW5nIHRoZSBhY2Nlc3NvcgorICAgICAgbWV0aG9kcyB0aGF0IHRoZSBzcGVjaWFsIHR5cGVzIHByb3ZpZGUuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3b3VsZCBjcmVhdGUKKyAgICAgIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjcmVkaXRSZXBvcnQgZWxlbWVudC48L3A+CisgICAgPHByZT4KKy8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lhbCBkb2N1bWVudCB0eXBlLgorQ3JlZGl0UmVwb3J0RG9jdW1lbnQgcmVwb3J0RG9jID0gQ3JlZGl0UmVwb3J0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworLyoKKyAqIFVzZSB0aGUgZG9jdW1lbnQgdHlwZSB0byBhZGQgYSBuZXcgY3JlZGl0UmVwb3J0IGVsZW1lbnQgdG8gdGhlIFhNTCBpbnN0YW5jZS4KKyAqIE5vdGUgdGhhdCB0aGUgdHlwZSByZXR1cm5lZCBieSB0aGUgYWRkTmV3Q3JlZGl0UmVwb3J0IG1ldGhvZCBpcyB0aGUKKyAqIGNyZWRpdFJlcG9ydFR5cGUgY29tcGxleCB0eXBlIGRlZmluZWQgZm9yIGl0IGluIHNjaGVtYS4KKyAqLworQ3JlZGl0UmVwb3J0VHlwZSByZXBvcnQgPSByZXBvcnREb2MuYWRkTmV3Q3JlZGl0UmVwb3J0KCk7Cis8L3ByZT4KKyAgICA8aDI+R2xvYmFsIFVzZXItRGVyaXZlZCBUeXBlczwvaDI+CisgICAgPHA+QSA8ZW0+dXNlci1kZXJpdmVkPC9lbT4gdHlwZSBpcyBvbmUgZGVmaW5lZCB3aXRoIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmNvbXBsZXhUeXBlPC9zcGFuPgorICAgICAgb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNpbXBsZVR5cGU8L3NwYW4+IGVsZW1lbnQgaW4gc2NoZW1hLiBVc2VyLWRlcml2ZWQKKyAgICAgIHR5cGVzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBzY2hlbWEgYXJlIGdsb2JhbC4gWE1MQmVhbnMgZ2VuZXJhdGVzIGFuIGludGVyZmFjZQorICAgICAgZm9yIGVhY2ggb2YgdGhlc2UsIGFzIGl0IGRvZXMgd2l0aCBnbG9iYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuIFRoZXNlCisgICAgICBpbnRlcmZhY2VzIGluY2x1ZGUgbWV0aG9kcyB0aHJvdWdoIHdoaWNoIHlvdSBjYW4gZ2V0IGFuZCBzZXQgdGhlIHR5cGUncworICAgICAgdmFsdWVzLCBpbmNsdWRpbmcgYW55IG5lc3RlZCBkZXJpdmVkIHR5cGVzIGl0IG1heSBjb250YWluLiBUaGUgZm9sbG93aW5nCisgICAgICBzY2hlbWEgc25pcHBldCBkZWZpbmVzIGEgdXNlci1kZXJpdmVkIGNvbXBsZXggdHlwZSBjYWxsZWQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW1UeXBlPC9zcGFuPiwKKyAgICAgIGFsb25nIHdpdGggYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHJpY2VUeXBlPC9zcGFuPiB0aGF0IHVzZXMgaXQgYXMgdGhlCisgICAgICB0eXBlIGZvciBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbTwvc3Bhbj4gY2hpbGQgZWxlbWVudC48L3A+CisgICAgPHByZT4KKyZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O2l0ZW1UeXBlJnF1b3Q7Jmd0OworICAgICZsdDt4czpzZXF1ZW5jZSZndDsKKyAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtuYW1lJnF1b3Q7IHR5cGU9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDthbW91bnQmcXVvdDsgdHlwZT0mcXVvdDt4czppbnQmcXVvdDsvJmd0OworICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O3ByaWNlJnF1b3Q7IHR5cGU9JnF1b3Q7eHM6ZG91YmxlJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworJmx0Oy94czpjb21wbGV4VHlwZSZndDsKKyZsdDt4czpjb21wbGV4VHlwZSBuYW1lPSZxdW90O3ByaWNlVHlwZSZxdW90OyZndDsKKyAgICAmbHQ7eHM6c2VxdWVuY2UmZ3Q7CisgICAgICAgICZsdDt4czplbGVtZW50IG5hbWU9JnF1b3Q7aXRlbSZxdW90OyB0eXBlPSZxdW90O3BzOml0ZW1UeXBlJnF1b3Q7IG1pbk9jY3Vycz0mcXVvdDswJnF1b3Q7IG1heE9jY3Vycz0mcXVvdDt1bmJvdW5kZWQmcXVvdDsvJmd0OworICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CismbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OworJmx0O3hzOmVsZW1lbnQgbmFtZT0mcXVvdDtwcmljZSZxdW90OyB0eXBlPSZxdW90O3BzOnByaWNlVHlwZSZxdW90Oy8mZ3Q7Cis8L3ByZT4KKyAgICA8cD5CeSBkZWZhdWx0LCB0aGUgZ2VuZXJhdGVkIEphdmEgdHlwZSBmb3IgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPml0ZW1UeXBlPC9zcGFuPgorICAgICAgd291bGQgYmUgYW4gaW50ZXJmYWNlIGNhbGxlZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+SXRlbVR5cGU8L3NwYW4+LiBXaXRoCisgICAgICB0aGlzIHR5cGUsIHlvdSB3b3VsZCBiZSBhYmxlIHRvIGdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uYW1lPC9zcGFuPiwKKyAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5hbW91bnQ8L3NwYW4+LCBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnByaWNlPC9zcGFuPgorICAgICAgY2hpbGQgZWxlbWVudHMuIEhvd2V2ZXIsIGEgdXNlci1kZXJpdmVkIHR5cGUgKGFzIG9wcG9zZWQgdG8gYW4gZWxlbWVudCBvcgorICAgICAgYXR0cmlidXRlKSBpcyBhbHdheXMgaW50ZW5kZWQgZm9yIHVzZSBhcyB0aGUgdHlwZSB0byB3aGljaCBhbiBlbGVtZW50IG9yCisgICAgICBhdHRyaWJ1dGUgaXMgYm91bmQuIEluIG90aGVyIHdvcmRzLCBpdCdzIGNvbnRhaW5lZCBieSBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4KKyAgICAgIFdoaWxlIHlvdSBjYW4gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgdXNlci1kZXJpdmVkIHR5cGUsIHRoZSBuZXcgaW5zdGFuY2UncworICAgICAgdW5kZXJseWluZyBYTUwgaXMgYSBmcmFnbWVudC4gQXMgdGhlIGdlbmVyYXRlZCBBUEkgd291bGQgbWFrZSBjbGVhciwgdGhlCisgICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXRlbVR5cGU8L3NwYW4+IGJlY29tZXMgdGhlIHJldHVybiB0eXBlIG9mIGEgZ2V0CisgICAgICBtZXRob2QsIG9yIHRoZSBwYXJhbWV0ZXIgb2YgYSBzZXQgbWV0aG9kLjwvcD4KKyAgICA8cHJlPgorLy8gQ3JlYXRlIGEgbmV3IHByaWNlIGRvY3VtZW50LgorUHJpY2VEb2N1bWVudCBwcmljZURvYyA9IFByaWNlRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworUHJpY2VUeXBlIHByaWNlID0gcHJpY2VEb2MuZ2V0UHJpY2UoKTsKKworLyoKKyAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBJdGVtVHlwZSBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgaXRzCisgKiBjaGlsZCBlbGVtZW50cy4KKyAqLworSXRlbVR5cGUgaXRlbSA9IEl0ZW1UeXBlLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKK2l0ZW0uc2V0TmFtZSgmcXVvdDtiaWN5Y2xlJnF1b3Q7KTsKK2l0ZW0uc2V0QW1vdW50KDEyKTsKK2l0ZW0uc2V0UHJpY2UoNTYwLjAwKTsKKworLyoKKyAqIFVzZSB0aGUgbmV3IEl0ZW1UeXBlIGluc3RhbmNlIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlCisgKiBwcmljZSBlbGVtZW50J3MgZmlyc3QgaXRlbSBjaGlsZCBlbGVtZW50LiBOb3RpY2UgdGhhdCB0aGUgc2V0IG1ldGhvZAorICogaGVyZSBpcyBhbiAiQXJyYXkiIG1ldGhvZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBpdGVtIGVsZW1lbnQKKyAqIGlzIGRlZmluZWQgd2l0aCBhIG1heE9jY3Vycz0idW5ib3VuZGVkIiBhdHRyaWJ1dGUuIEl0IGNhbiBvY2N1cgorICogbWFueSB0aW1lcyBhcyBhIGNoaWxkIG9mIHByaWNlLgorICovCitwcmljZS5zZXRJdGVtQXJyYXkoMCwgaXRlbSk7Cis8L3ByZT4KKyAgICA8aDI+TmVzdGVkIEVsZW1lbnRzIGFuZCBEZXJpdmVkIFR5cGVzPC9oMj4KKyAgICA8cD5XaGVuIHlvdXIgc2NoZW1hIGluY2x1ZGVzIG5hbWVkIHR5cGVzIHRoYXQgYXJlIGRlY2xhcmVkIGxvY2FsbHmXd2l0aGluCisgICAgICB0aGUgZGVjbGFyYXRpb24gb2YgYW5vdGhlciBlbGVtZW50IG9yIHR5cGWXdGhlIHNjaGVtYSB0eXBlJ3MgZ2VuZXJhdGVkIEphdmEKKyAgICAgIGludGVyZmFjZSB3aWxsIGJlIGFuIGlubmVyIGludGVyZmFjZSB3aXRoaW4gdGhlIHR5cGUgaXQncyBuZXN0ZWQgaW4uPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNjaGVtYSBzbmlwcGV0IGRlZmluZXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPm5hbWU8L3NwYW4+CisgICAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmdlbmRlcjwvc3Bhbj4gZWxlbWVudHMgbmVzdGVkIHdpdGhpbiBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wZXJzb248L3NwYW4+CisgICAgICBjb21wbGV4IHR5cGUuIEluIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZ2VuZGVyIGVsZW1lbnQgaXMgZGVmaW5lZCBhcworICAgICAgZGVyaXZpbmcgZnJvbSB0aGUgeHM6Tk1UT0tFTiBidWlsdC1pbiB0eXBlLjwvcD4KKyAgICA8cHJlPgorJmx0O3hzOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNvbiImZ3Q7CisgICAgJmx0O3hzOnNlcXVlbmNlJmd0OworICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLyZndDsKKyAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0iZ2VuZGVyIiZndDsKKyAgICAgICAgICAgICZsdDt4czpzaW1wbGVUeXBlJmd0OworICAgICAgICAgICAgICAgICZsdDt4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIiZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWxlIi8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmVtYWxlIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy94czpyZXN0cmljdGlvbiZndDsKKyAgICAgICAgICAgICZsdDsveHM6c2ltcGxlVHlwZSZndDsKKyAgICAgICAgJmx0Oy94czplbGVtZW50Jmd0OworICAgICZsdDsveHM6c2VxdWVuY2UmZ3Q7CismbHQ7L3hzOmNvbXBsZXhUeXBlJmd0OworPC9wcmU+CisgICAgPHA+VGhlIGdlbmVyYXRlZCBpbnRlcmZhY2VzIGZvciBwZXJzb24gYW5kIGdlbmRlciB3b3VsZCBiZSBvcmdhbml6ZWQgaW4gc291cmNlCisgICAgICBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLiBPZiBjb3Vyc2UsIHlvdSB3b3VsZG4ndCBzZWUgdGhlIHNvdXJjZSwgYnV0CisgICAgICB5b3UgY2FuIHNlZSBoZXJlIHRoYXQgdGhlIEdlbmRlciBpbnRlcmZhY2UgaXMgbmVzdGVkIHdpdGggUGVyc29uLiBBbHNvLAorICAgICAgbm90aWNlIHRoYXQgaXQgZXh0ZW5kcyBYbWxOTVRPS0VOLCBtaXJyb3JpbmcgdGhlIHNjaGVtYS48L3A+CisgICAgPHByZT5wdWJsaWMgaW50ZXJmYWNlIFBlcnNvbiBleHRlbmRzIFhtbE9iamVjdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgR2VuZGVyIGV4dGVuZHMgWG1sTk1UT0tFTgorICAgIHsKKyAgICAgICAgLy8gTWV0aG9kcyBvbWl0dGVkIGZvciB0aGlzIGV4YW1wbGUKKyAgICB9CisgICAgLy8gTWV0aG9kcyBvbWl0dGVkIGZvciB0aGlzIGV4YW1wbGUKK30KKzwvcHJlPgorICAgIDxwPllvdSBjb3VsZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5HZW5kZXI8L3NwYW4+CisgICAgICB0eXBlIGluIHRoaXMgd2F5ICh0aGVyZSBhcmUgYWxzbyB2YXJpb3VzIGFsdGVybmF0aXZlcyB0byB0aGlzKTo8L3A+CisgICAgPHByZT4KKy8vIENyZWF0ZSBhIG5ldyBQZXJzb24gaW5zdGFuY2UuCitQZXJzb24gcGVyc29uID0gUGVyc29uLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKy8qCisgKiBTZXQgdGhlIGdlbmRlciBlbGVtZW50J3MgdmFsdWUgdXNpbmcgdGhlCisgKiBlbnVtZXJhdGlvbiBnZW5lcmF0ZWQgZnJvbSB0aGUgc2NoZW1hLgorICovCitwZXJzb24uc2V0R2VuZGVyKEdlbmRlci5GRU1BTEUpOzwvcHJlPgorICAgIDxoMj5Vc2VyLURlcml2ZWQgU2ltcGxlIFR5cGVzPC9oMj4KKyAgICA8cD5JbiBhZGRpdGlvbiB0byB0aGUgNDYgYnVpbHQtaW4gc2ltcGxlIHR5cGVzIGluIFhNTCBzY2hlbWEsIGEgc2NoZW1hIGNhbgorICAgICAgaW5jbHVkZSBpdHMgb3duIGN1c3RvbSBzaW1wbGUgdHlwZXMgdXNpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnNpbXBsZVR5cGU8L3NwYW4+CisgICAgICBkZWNsYXJhdGlvbnMuIFRoZXNlIHVzZXItZGVyaXZlZCBzaW1wbGUgdHlwZXMgYXJlIGFsd2F5cyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4KKyAgICAgIFhNTCBzY2hlbWEgdHlwZXMuIFRoZSBidWlsdC1pbiB0eXBlcyBjYW4gYmUgbW9kaWZpZWQgYnkgPGVtPnJlc3RyaWN0aW5nPC9lbT4KKyAgICAgIHRoZW0sIHRha2luZyA8ZW0+dW5pb25zPC9lbT4gb2YgdGhlbSwgb3IgbWFraW5nIHNwYWNlLXNlcGFyYXRlZCA8ZW0+bGlzdHM8L2VtPgorICAgICAgb2YgdGhlbS4gRWFjaCBYTUwgc2ltcGxlIHR5cGUgaXMgdHJhbnNsYXRlZCBpbnRvIGEgSmF2YSB0eXBlIHRoYXQgcHJvdmlkZXMKKyAgICAgIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBkYXRhLjwvcD4KKyAgICA8aDM+VW5pb25zPC9oMz4KKyAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czp1bmlvbjwvc3Bhbj4gdG8gc3BlY2lmeQorICAgICAgYSBzaW1wbGUgdHlwZSB0aGF0IGlzIGFsbG93ZWQgdG8gY29udGFpbiB2YWx1ZXMgb2YgYSBudW1iZXIgb2Ygb3RoZXIgc2ltcGxlCisgICAgICB0eXBlcy4gWE1MQmVhbnMgZ2VuZXJhdGVzIGEgdHlwZSBmb3IgYSB1bmlvbiwganVzdCBhcyBpdCBnZW5lcmF0ZXMgYSB0eXBlCisgICAgICBmb3IgYW55IG90aGVyIHNjaGVtYSB0eXBlLiBBdCBydW4gdGltZSwgeW91IGNhbiBkaXNjb3ZlciB0aGUgdW5kZXJseWluZworICAgICAgdHlwZSBvZiBhbiBpbnN0YW5jZSBvZiBhIHVuaW9uIHR5cGUgYnkgY2FsbGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4KKyAgICAgIGludGVyZmFjZSdzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pbnN0YW5jZVR5cGU8L3NwYW4+IG1ldGhvZC4gT25jZSB5b3UKKyAgICAgIGhhdmUgZGV0ZXJtaW5lZCB0aGUgdHlwZSwgeW91IGNhbiBjYXN0IGFuIGluc3RhbmNlIG9mIGEgdW5pb24gdHlwZSB0byB0aGUKKyAgICAgIGFjdHVhbCB1bmRlcmx5aW5nIGluc3RhbmNlIHR5cGUuPC9wPgorICAgIDxwcmU+CismbHQ7eHM6c2ltcGxlVHlwZSBuYW1lPSZxdW90O2ludE9yU3RyaW5nJnF1b3Q7Jmd0OworICAgICZsdDt4czp1bmlvbiBtZW1iZXJUeXBlcz0mcXVvdDt4czppbnQgeHM6c3RyaW5nJnF1b3Q7Jmd0OworJmx0Oy94czpzaW1wbGVUeXBlJmd0OworPC9wcmU+CisgICAgPHA+R2l2ZW4gdGhlIHByZWNlZGluZyBzY2hlbWEgc25pcHBldCwgeW91IGNvdWxkIHNldCB0aGUgaW50T3JTdHJpbmcgdmFsdWUKKyAgICAgIHRvLCBzYXksIDYgb3IgJnF1b3Q7c2l4JnF1b3Q7LiBUaGUgdW5pb24gb2YgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmludDwvc3Bhbj4KKyAgICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6c3RyaW5nPC9zcGFuPiBtYWtlcyBib3RoIGFsbG93YWJsZS48L3A+CisgICAgPHByZT4KKy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHlwZS4KK0ludE9yU3RyaW5nIGludE9yU3RyaW5nID0gSW50T3JTdHJpbmcuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworaW50T3JTdHJpbmcuc2V0KCZxdW90OzUmcXVvdDspOworLy8gVGhpcyBjb2RlIHByaW50cyAiWG1sSW50IiB0byB0aGUgY29uc29sZS4KK1N5c3RlbS5vdXQucHJpbnRsbihpbnRPclN0cmluZy5pbnN0YW5jZVR5cGUoKS5nZXRTaG9ydEphdmFOYW1lKCkpOworPC9wcmU+CisgICAgPGgzPlJlc3RyaWN0aW9uczwvaDM+CisgICAgPHA+WE1MIHNjaGVtYSByZXN0cmljdGlvbnMgb24gc2ltcGxlIFhNTEJlYW5zIHR5cGVzIGFyZSBlbmZvcmNlZC4gU28sIGZvcgorICAgICAgZXhhbXBsZSwgaXQgaXMgaWxsZWdhbCB0byBzZXQgYSBudW1iZXIgb3V0c2lkZSBpdHMgcmVzdHJpY3RlZCByYW5nZS4gPC9wPgorICAgIDxoND5OdW1lcmljIFR5cGUgUmVzdHJpY3Rpb25zPC9oND4KKyAgICA8cD5JbiBzY2hlbWEsIHlvdSBjYW4gcmVzdHJpY3QgbnVtZXJpYyB0eXBlcyB0byBhbGxvdywgZm9yIGV4YW1wbGUsIG9ubHkgYQorICAgICAgcGFydGljdWxhciByYW5nZSBvZiB2YWx1ZXMuIEZvciBzdWNoIGEgcmVzdHJpY3Rpb24sIFhNTEJlYW5zIHRhaWxvcnMgdGhlCisgICAgICByZXN1bHRpbmcgbmF0dXJhbCBKYXZhIGFsdGVybmF0aXZlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nCisgICAgICBlbGVtZW50IGRlZmluZWQgaW4gc2NoZW1hOjwvcD4KKyAgICA8cHJlPgorJmx0O3hzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiZndDsKKyAgICAmbHQ7eHM6c2ltcGxlVHlwZSZndDsKKyAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiJmd0OworICAgICAgICAgICAgJmx0O3hzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvJmd0OworICAgICAgICAgICAgJmx0O3hzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAwMCIvJmd0OworICAgICAgICAmbHQ7L3hzOnJlc3RyaWN0aW9uJmd0OworICAgICZsdDsveHM6c2ltcGxlVHlwZSZndDsKKyZsdDsveHM6ZWxlbWVudCZndDsKKzwvcHJlPgorICAgIDxwPlRoZSB0eXBlIGlzIHJlc3RyaWN0ZWQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+eHM6aW50ZWdlcjwvc3Bhbj4sCisgICAgICBidXQgYmVjYXVzZSB0aGUgbnVtYmVyJ3MgcmFuZ2UgaXMgbGltaXRlZCB0byBiZXR3ZWVuIDEgYW5kIDEwMDAwMDAsIGl0IHdpbGwKKyAgICAgIGZpdCBpbnRvIGEgSmF2YSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aW50PC9zcGFuPi4gQSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+bG9uZzwvc3Bhbj4KKyAgICAgIG9yIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5qYXZhLm1hdGguQmlnSW50ZWdlcjwvc3Bhbj4gd291bGQgYmUgdG9vIGJpZworICAgICAgZm9yIHRoZSBuZWVkLiBJbiBvdGhlciB3b3JkcywgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5nZXROdW1iZXI8L3NwYW4+CisgICAgICBtZXRob2QgZ2VuZXJhdGVkIGZvciB0aGlzIHR5cGUgd2lsbCByZXR1cm4gYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmludDwvc3Bhbj4sCisgICAgICByYXRoZXIgdGhhbiBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5CaWdJbnRlZ2VyPC9zcGFuPiBvciBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPi48L3A+CisgICAgPHA+QnkgdGhlIHNhbWUgdG9rZW4sIGFuIGxvbmcgY2FuIGJlIGNvbXBpbGVkIHRvIGFuIGludCBpZiB0aGUgdG90YWxEaWdpdHMKKyAgICAgIGF0dHJpYnV0ZSBpcyAmbHQ7PTksIG9yIHRoZSBtaW4gYW5kIG1heCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSB3aXRoaW4gMzItYml0CisgICAgICAycyBjb21wbGVtZW50IHJhbmdlLjwvcD4KKyAgICA8cD5UaGUgc2luZ2xlIHByaW1pdGl2ZSBYTUwgdHlwZSB4czpkZWNpbWFsIGNhbiBiZSByZXN0cmljdGVkIGluIHNldmVyYWwgd2F5cworICAgICAgdGhhdCBpbmZsdWVuY2UgdGhlIHJlc3VsdGluZyBuYXR1cmFsIEphdmEgdHlwZS4gRm9yIGV4YW1wbGUsIGl0IGNhbiBiZTo8L3A+CisgIDwvZGl2PgorPC9kaXY+Cis8dWw+CisgIDxsaT4KKyAgICA8ZGl2PgorICAgICAgPGRpdj5Db21waWxlZCB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5CaWdJbnRlZ2VyPC9zcGFuPiBpZiBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmZyYWN0aW9uRGlnaXQ8L3NwYW4+CisgICAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gMC4gPC9kaXY+CisgICAgPC9kaXY+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8ZGl2PgorICAgICAgPGRpdj5Db21waWxlZCB0byBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5sb25nPC9zcGFuPiBpZiBpdHMgdG90YWxEaWdpdHMKKyAgICAgICAgYXR0cmlidXRlIGlzICZsdDs9MTgsIG9yIHRoZSBtaW4gYW5kIG1heCBhcmUgd2l0aGluIDY0LWJpdCAycyBjb21wbGVtZW50CisgICAgICAgIHJhbmdlLjwvZGl2PgorICAgIDwvZGl2PgorICA8L2xpPgorPC91bD4KKzxkaXY+CisgIDxkaXY+CisgICAgPGgzPkVudW1lcmF0aW9uczwvaDM+CisgICAgPHA+SW4gc2NoZW1hLCB5b3UgY2FuIGRlcml2ZSBhIG5ldyB0eXBlIGJ5IHJlc3RyaWN0aW5nIGEgYnVpbHQtaW4gdHlwZSBzbworICAgICAgdGhhdCBvbmx5IGEgZmluaXRlIHNldCBvZiB2YWx1ZXMgYXJlIGFsbG93YWJsZS4gV2hlcmUgc2NoZW1hIGRvZXMgdGhpcyBieQorICAgICAgcmVzdHJpY3RpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOnN0cmluZzwvc3Bhbj4sIFhNTEJlYW5zIGdlbmVyYXRlcworICAgICAgYSBzcGVjaWFsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5FbnVtPC9zcGFuPiB0eXBlLiBXaXRoIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5FbnVtPC9zcGFuPiwKKyAgICAgIHlvdSBjYW4gc2VsZWN0IHRoZSBlbnVtZXJhdGVkIHZhbHVlIGVpdGhlciBieSBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlN0cmluZzwvc3Bhbj4KKyAgICAgIHZhbHVlIG9yIGJ5IGEgbnVtZXJpYyBpbmRleC4gVGhlIGluZGV4J3MgdmFsdWUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUKKyAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5TdHJpbmc8L3NwYW4+IHZhbHVlJ3Mgb3JkZXIgaW4gdGhlIHNjaGVtYS4gSGF2aW5nCisgICAgICBhbiBpbmRleCBjYW4gYmUgdXNlZnVsIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuPC9wPgorICAgIDxwPkZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYSBkb2N1bWVudCBjb250YWluaW5nIHByaWNlIGVsZW1lbnRzIHdob3NlCisgICAgICB0eXBlIHdhcyB0aGUgcHJpY2VUeXBlIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBzY2hlbWEgc25pcHBldDo8L3A+CisgICAgPHByZT4mbHQ7eHM6Y29tcGxleFR5cGUgbmFtZT0mcXVvdDtwcmljZVR5cGUmcXVvdDsmZ3Q7CisgICAgJmx0O3hzOnNlcXVlbmNlJmd0OworICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSZxdW90O2l0ZW0mcXVvdDsgdHlwZT0mcXVvdDtwczppdGVtVHlwZSZxdW90OyBtaW5PY2N1cnM9JnF1b3Q7MCZxdW90OworICAgICAgICAgICAgICBtYXhPY2N1cnM9JnF1b3Q7dW5ib3VuZGVkJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OworICAgICZsdDt4czphdHRyaWJ1dGUgbmFtZT0mcXVvdDt0aHJlc2hvbGQmcXVvdDsmZ3Q7CisgICAgICAgICZsdDt4czpzaW1wbGVUeXBlJmd0OworICAgICAgICAgICAgJmx0O3hzOnJlc3RyaWN0aW9uIGJhc2U9JnF1b3Q7eHM6c3RyaW5nJnF1b3Q7Jmd0OworICAgICAgICAgICAgICAgICZsdDt4czplbnVtZXJhdGlvbiB2YWx1ZT0mcXVvdDtCZWxvdzEwRG9sbGFycyZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0JldHdlZW4xMEFuZDIwRG9sbGFycyZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3hzOmVudW1lcmF0aW9uIHZhbHVlPSZxdW90O0Fib3ZlMjBEb2xsYXJzJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDsveHM6cmVzdHJpY3Rpb24mZ3Q7CisgICAgICAgICZsdDsveHM6c2ltcGxlVHlwZSZndDsKKyAgICAmbHQ7L3hzOmF0dHJpYnV0ZSZndDsKKyZsdDsveHM6Y29tcGxleFR5cGUmZ3Q7PC9wcmU+CisgICAgPHA+VXNpbmcgdHlwZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNjaGVtYSwgeW91IHdvdWxkIGJlIGFibGUgdG8gd3JpdGUgdGhlIGZvbGxvd2luZworICAgICAgSmF2YSBjb2RlIHRvICZxdW90O3N3aXRjaCZxdW90OyBvbiB0aGUgdGhyZXNob2xkIGF0dHJpYnV0ZSdzIGVudW1lcmF0aW9uOjwvcD4KKyAgICA8cHJlPgorLyoKKyAqIFVzZSB0aGUgaW50VmFsdWUgbWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSBFbnVtIHR5cGUgdG8gZGV0ZXJtaW5lIHRoZSB0aHJlc2hvbGQKKyAqIGF0dHJpYnV0ZSdzIGN1cnJlbnQgZW51bWVyYXRpb24gdmFsdWUuCisgKi8KK3N3aXRjaChwcmljZUVsZW1lbnRzW2ldLmdldFRocmVzaG9sZCgpLmludFZhbHVlKCkpCit7CisgICAgLy8gVXNlIHRoZSBUaHJlc2hvbGQgdHlwZSdzIGVudW1lcmF0aW9uIHZhbHVlcyB0byB0ZXN0IGZvciBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgICAgY2FzZSBQcmljZVR5cGUuVGhyZXNob2xkLklOVF9CRUxPV18xMF9ET0xMQVJTOgorICAgICAgICB6ZXJvQnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQkVUV0VFTl8xMF9BTkRfMjBfRE9MTEFSUzoKKyAgICAgICAgdGVuQnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHJpY2VUeXBlLlRocmVzaG9sZC5JTlRfQUJPVkVfMjBfRE9MTEFSUzoKKyAgICAgICAgdHdlbnR5QnVmZmVyLmFwcGVuZChpdGVtLmdldFRpdGxlKCkgKyAmcXVvdDtcbiZxdW90Oyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigmcXVvdDtZbyEgU29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQhJnF1b3Q7KTsKKyAgICAgICAgYnJlYWs7Cit9PC9wcmU+CisgIDwvZGl2PgorICA8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+CisgIDxwPjxhIGhyZWY9ImNvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sIj5YTUxCZWFucyBTdXBwb3J0IGZvcgorICAgIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvYT48L3A+Cis8L2Rpdj4KKyA8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92MS9kb2NzL2d1aWRlL2Nvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbCBiL3YxL2RvY3MvZ3VpZGUvY29uTWV0aG9kc0ZvckdlbmVyYXRlZEphdmFUeXBlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjNjZjkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2d1aWRlL2Nvbk1ldGhvZHNGb3JHZW5lcmF0ZWRKYXZhVHlwZXMuaHRtbApAQCAtMCwwICsxLDI3NSBAQAorPCFkb2N0eXBlIEhUTUwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iPgorCis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxodG1sPgorPGhlYWQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJkb2N0aXRsZSIgLS0+Cis8dGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC90aXRsZT4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgorCisKKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KKworPG1ldGEgbmFtZT0iY29tcG9uZW50IiBjb250ZW50PSIiPgorPCEtLSBJbiB0aGUgZGVzY3JpcHRpb24gbWV0YXRhZywgcGxlYXNlIHByb3ZpZGUgYSBCUklFRiBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIC0tPgorPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiI+Cis8IS0tIEluIHRoZSBjb21wb25lbnQgbWV0YXRhZywgcGxlYXNlIGxpc3Qga2V5d29yZHMgdGhhdCB3aWxsIGhlbHAgYSB1c2VyIHNlYXJjaCBmb3IgdGhpcyB0b3BpYy4gLS0+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKworPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPGJvZHk+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KKzxkaXYgaWQ9dG9waWN0aXRsZT4KKyAgPHAgY2xhc3M9VGl0bGU+TWV0aG9kcyBmb3IgVHlwZXMgR2VuZXJhdGVkIEZyb20gU2NoZW1hPC9wPgorPC9kaXY+Cis8ZGl2IGlkPXRvcGljdGV4dD4KKyAgPHA+QXMgeW91IG1heSBoYXZlIHNlZW4gaW4gPGEgaHJlZj0iY29uR2V0dGluZ1N0YXJ0ZWR3aXRoWE1MQmVhbnMuaHRtbCI+R2V0dGluZworICAgIFN0YXJ0ZWQgd2l0aCBYTUxCZWFuczwvYT4sIHlvdSB1c2UgdGhlIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHNjaGVtYSB0byBhY2Nlc3MKKyAgICBYTUwgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBzY2hlbWEuIElmIHlvdSdyZSBmYW1pbGlhciB3aXRoIHRoZSBKYXZhQmVhbnMgdGVjaG5vbG9neSwKKyAgICB0aGUgY29udmVudGlvbnMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIEFQSSB3aWxsIGJlIHJlY29nbml6YWJsZS4gPC9wPgorICA8cD5JbiBnZW5lcmFsLCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdHJlYXRlZCBhcyAmcXVvdDtwcm9wZXJ0aWVzJnF1b3Q7CisgICAgaW4gdGhlIEphdmFCZWFucyBzZW5zZS4gSW4gb3RoZXIgd29yZHMsIGFzIHlvdSB3b3VsZCB3aXRoIEphdmFCZWFucyBwcm9wZXJ0aWVzLAorICAgIHlvdSBtYW5pcHVsYXRlIHBhcnRzIG9mIHRoZSBYTUwgdGhyb3VnaCBhY2Nlc3NvciBtZXRob2RzIHN1Y2ggYXMgZ2V0Q3VzdG9tZXIoKQorICAgICh3aGVyZSB5b3UgaGF2ZSBhICZxdW90O2N1c3RvbWVyJnF1b3Q7IGVsZW1lbnQpLCBzZXRJZChTdHJpbmcpICh3aGVyZSB5b3UKKyAgICBoYXZlIGFuICZxdW90O2lkJnF1b3Q7IGF0dHJpYnV0ZSksIGFuZCBzbyBvbi4gSG93ZXZlciwgYmVjYXVzZSBzY2hlbWEgc3RydWN0dXJlcworICAgIGNhbiBiZSBzb21ld2hhdCBjb21wbGV4LCBYTUxCZWFucyBwcm92aWRlcyBzZXZlcmFsIG90aGVyIG1ldGhvZCBzdHlsZXMgZm9yCisgICAgaGFuZGxpbmcgdGhvc2Ugc3RydWN0dXJlcyBpbiBYTUwgaW5zdGFuY2VzLjwvcD4KKyAgPGRpdj4KKyAgICA8aDI+UHJvdG90eXBlcyBmb3IgTWV0aG9kcyBpbiBHZW5lcmF0ZWQgSW50ZXJmYWNlczwvaDI+CisgICAgPHA+U2V2ZXJhbCBtZXRob2RzIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggZWxlbWVudCBvciBhdHRyaWJ1dGUgd2l0aGluIHRoZQorICAgICAgY29tcGxleCB0eXBlLiBUaGlzIHRvcGljIGxpc3RzIGVhY2ggbWV0aG9kIHRoYXQgY291bGQgYmUgZ2VuZXJhdGVkIGZvciBhCisgICAgICBnaXZlbiBlbGVtZW50IG9yIGF0dHJpYnV0ZS4gPC9wPgorICAgIDxwPk5vdGUgdGhhdCB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIG1ldGhvZCBpcyBnZW5lcmF0ZWQgaXMgYmFzZWQgb24gaG93IHRoZQorICAgICAgZWxlbWVudCBvciBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEuIEZvciBleGFtcGxlLCBhIGN1c3RvbWVyIGVsZW1lbnQKKyAgICAgIGRlZmluaXRpb24gd2l0aCBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5tYXhPY2N1cnM8L3NwYW4+IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAgb2YgMSB3aWxsIHJlc3VsdCBpbiBhIGdldEN1c3RvbWVyIG1ldGhvZCwgYnV0IG5vdCBhIGdldEN1c3RvbWVyQXJyYXkgbWV0aG9kCisgICAgICAmIzgyMTI7IGFmdGVyIGFsbCwgb25seSBvbmUgY3VzdG9tZXIgZWxlbWVudCBpcyBwb3NzaWJsZSBpbiBhbiBpbnN0YW5jZQorICAgICAgZG9jdW1lbnQuPC9wPgorICAgIDxwPk5vdGUsIHRvbywgdGhhdCB0aGVyZSBtYXkgYmUgdHdvIHNldHMgb2YgcGFyYWxsZWwgbWV0aG9kczogb25lIHdob3NlIHByb3RvdHlwZQorICAgICAgc3RhcnRzIHdpdGggYW4gJnF1b3Q7eCZxdW90Oy4gQW4gJnF1b3Q7eCZxdW90OyBtZXRob2Qgc3VjaCBhcyB4Z2V0TmFtZSBvcgorICAgICAgeHNldE5hbWUgd291bGQgYmUgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyBvciBhdHRyaWJ1dGUgd2hvc2UgdHlwZSBpcyBhIHNpbXBsZQorICAgICAgdHlwZS4gQSBzaW1wbGUgdHlwZSBtYXkgYmUgb25lIG9mIHRoZSA0NCBidWlsdC1pbiBzaW1wbGUgdHlwZXMgb3IgbWF5IGJlCisgICAgICBhIHJlc3RyaWN0aW9uIGluIHNjaGVtYSBvZiBvbmUgb2YgdGhvc2UgYnVpbHQtaW4gdHlwZXMuIE9mIGNvdXJzZSwgYW4gYXR0cmlidXRlCisgICAgICB3aWxsIGFsd2F5cyBiZSBvZiBhIHNpbXBsZSB0eXBlLiBGb3IgYnVpbHQtaW4gc2ltcGxlIHR5cGVzLCBhbiAmcXVvdDt4JnF1b3Q7CisgICAgICBtZXRob2Qgd2lsbCBnZXQgb3Igc2V0IG9uZSBvZiB0aGUgdHlwZXMgcHJvdmlkZWQgd2l0aCBYTUxCZWFucywgc3VjaCBhcworICAgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC9zcGFuPiwKKyAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmh0bWwiPlhtbEludGVnZXI8L2E+PC9zcGFuPiwKKyAgICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5Lmh0bWwiPlhtbEdEYXk8L2E+PC9zcGFuPiwKKyAgICAgIGFuZCBzbyBvbi4gRm9yIGRlcml2ZWQgdHlwZXMsIHRoZSAmcXVvdDt4JnF1b3Q7IG1ldGhvZCB3aWxsIGdldCBvciBzZXQgYQorICAgICAgZ2VuZXJhdGVkIHR5cGUuPC9wPgorICAgIDxoMz5TaW5nbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KKyAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFsbG93IGEgc2luZ2xlIG9jY3VycmVuY2UuCisgICAgICBBbiBlbGVtZW50IGlzIHNpbmd1bGFyIGlmIGl0IHdhcyBkZWNsYXJlZCB3aXRoIG1heE9jY3Vycz0mcXVvdDsxJnF1b3Q7LgorICAgICAgQW4gYXR0cmlidXRlIGlzIHNpbmd1bGFyIGlmIGl0IHdhcyBub3QgZGVjbGFyZWQgd2l0aCB1c2U9JnF1b3Q7cHJvaGliaXRlZCZxdW90Oy48L3A+CisgICAgPHByZT4KK1R5cGUgZ2V0Rm9vKCkKK3ZvaWQgc2V0Rm9vKFR5cGUgbmV3VmFsdWUpCis8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBGb28uIEdlbmVyYXRlZCB3aGVuIEZvbyBpcyBhbiBhdHRyaWJ1dGUsCisgICAgICBvciBpcyBhbiBlbGVtZW50IHRoYXQgY2FuIG9jY3VyIG9ubHkgb25jZSBhcyBhIGNoaWxkLjwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDxkaXY+CisgICAgPGhyIHNpemU9IjEiPgorICAgIDxwcmU+WG1sVHlwZSB4Z2V0Rm9vKCkKK3ZvaWQgeHNldEZvbyhYbWxUeXBlIG5ld1ZhbHVlKTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgdGhlIHZhbHVlIG9mIEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0eXBlLiBUaGVzZSBtZXRob2RzCisgICAgICBhcmUgZ2VuZXJhdGVkIGlmIEZvbydzIHR5cGUgaXMgZGVmaW5lZCBpbiBzY2hlbWEgYXMgYSBzaW1wbGVUeXBlLjwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDxkaXY+CisgICAgPGhyIHNpemU9IjEiPgorICAgIDxwcmU+Ym9vbGVhbiBpc05pbEZvbygpCit2b2lkIHNldE5pbEZvbygpPC9wcmU+CisgIDwvZGl2PgorICA8YmxvY2txdW90ZT4KKyAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGlzIG5pbCAoaW4gb3RoZXIgd29yZHMsCisgICAgICAmcXVvdDtudWxsJnF1b3Q7IGluIHNjaGVtYSB0ZXJtcyksIG1lYW5pbmcgaXQgY2FuIGJlIGVtcHR5LiBBIG5pbCBlbGVtZW50CisgICAgICBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOjwvZGl2PgorICAgIDxkaXY+CisgICAgICA8cHJlPiZsdDtmb28vJmd0OzwvcHJlPgorICAgIDwvZGl2PgorICAgIDxkaXY+VGhlc2UgbWV0aG9kcyBhcmUgb25seSBnZW5lcmF0ZWQgd2hlbiBhbiBlbGVtZW50IHR5cGUgaXMgZGVjbGFyZWQgYXMKKyAgICAgIG5pbGxhYmxlIGluIHNjaGVtYSAmIzgyMTI7IGl0IGhhcyBhIG5pbGxhYmxlPSZxdW90O3RydWUmcXVvdDsgYXR0cmlidXRlLjwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDxkaXY+CisgICAgPGhyIHNpemU9IjEiPgorICAgIDxwcmU+WG1sVHlwZSBhZGROZXdGb28oKTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5BZGRzIGEgbmV3IEZvbyBhcyBhbiBYTUxCZWFuIHNpbXBsZSB0byB0aGUgZG9jdW1lbnQsIG9yIHJldHVybnMgRm9vJ3MKKyAgICAgIHZhbHVlIGlmIG9uZSBleGlzdHMgYWxyZWFkeS48L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgICA8cHJlPmJvb2xlYW4gaXNTZXRGb28oKQordm9pZCB1blNldEZvbygpPC9wcmU+CisgIDwvZGl2PgorICA8YmxvY2txdW90ZT4KKyAgICA8ZGl2PkRldGVybWluZXMgd2hldGhlciB0aGUgRm9vIGVsZW1lbnQgb3IgYXR0cmlidXRlIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQ7CisgICAgICByZW1vdmVzIEZvby4gVGhlc2UgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkIGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB0aGF0CisgICAgICBhcmUgb3B0aW9uYWwuIEluIHNjaGVtYSwgYW5kIG9wdGlvbmFsIGVsZW1lbnQgaGFzIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5taW5PY2N1cnM8L3NwYW4+CisgICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90OzAmcXVvdDs7IGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dXNlPC9zcGFuPgorICAgICAgYXR0cmlidXRlIHNldCB0byAmcXVvdDtvcHRpb25hbCZxdW90Oy48L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgICA8aDM+TXVsdGlwbGUgT2NjdXJyZW5jZSBNZXRob2RzPC9oMz4KKyAgICA8cD5NZXRob2RzIGdlbmVyYXRlZCBmb3IgZWxlbWVudHMgdGhhdCBhbGxvdyBtdWx0aXBsZSBvY2N1cnJlbmNlcy4gPC9wPgorICAgIDxwPkFuIGVsZW1lbnQgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIGlmIGl0IGhhcyBhIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5tYXhPY2N1cnM8L3NwYW4+CisgICAgICBhdHRyaWJ1dGUgc2V0IHRvICZxdW90O3VuYm91bmRlZCZxdW90OyBvciBncmVhdGVyIHRoYW4gMS4gQXR0cmlidXRlcyBjYW4ndAorICAgICAgb2NjdXIgbXVsdGlwbGUgdGltZXMuPC9wPgorICAgIDxwcmU+VHlwZVtdIGdldEZvb0FycmF5KCkKK3ZvaWQgc2V0Rm9vQXJyYXkoVHlwZVtdIG5ld1ZhbHVlKSA8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIGFsbCBvZiB0aGUgRm9vIGVsZW1lbnRzLiA8L2Rpdj4KKyAgICA8ZGl2PgorICAgICAgPHByZT4KKy8vIEdldCBhbiBhcnJheSBvZiB0aGUgYWxsIG9mIHRoZSBwdXJjaGFzZS1vcmRlciBlbGVtZW50cyBpdGVtIGNoaWxkcmVuLgorSXRlbVtdIGl0ZW1zID0gbXlQTy5nZXRJdGVtQXJyYXkoKTsKKzwvcHJlPgorICAgIDwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDxkaXY+CisgICAgPGhyIHNpemU9IjEiPgorICAgIDxwcmU+VHlwZSBnZXRGb29BcnJheShpbnQgaW5kZXgpCit2b2lkIHNldEZvb0FycmF5KFR5cGUgbmV3VmFsdWUsIGludCBpbmRleCk8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gY2hpbGQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LjwvZGl2PgorICAgIDxkaXY+CisgICAgICA8cHJlPi8vIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aGlyZCBpdGVtIGNoaWxkIGVsZW1lbnQuCitteVBPLnNldEl0ZW0obmV3SXRlbSwgMik7PC9wcmU+CisgICAgPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8aHIgc2l6ZT0iMSI+CisgICAgPHByZT5pbnQgc2l6ZU9mRm9vQXJyYXkoKTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5SZXR1cm5zIHRoZSBudW1iZXIgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgorICAgIDxkaXY+CisgICAgICA8cHJlPi8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtIGNoaWxkIGVsZW1lbnRzLgoraW50IGl0ZW1Db3VudCA9IG15UE8uc2l6ZU9mSXRlbUFycmF5KCk7PC9wcmU+CisgICAgPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8aHIgc2l6ZT0iMSI+CisgICAgPHByZT52b2lkIHJlbW92ZUZvbyhpbnQgaW5kZXgpPC9wcmU+CisgIDwvZGl2PgorICA8YmxvY2txdW90ZT4KKyAgICA8ZGl2PlJlbW92ZXMgdGhlIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8aHIgc2l6ZT0iMSI+CisgICAgPHByZT5YbWxUeXBlW10geGdldEZvb0FycmF5KCkKK3ZvaWQgeHNldEZvb0FycmF5KFhtbFR5cGVbXSBhcnJheU9mTmV3VmFsdWVzKTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5SZXR1cm5zIG9yIHNldHMgYWxsIG9mIHRoZSBGb28gZWxlbWVudHMgYXMgWE1MQmVhbnMgc2ltcGxlIHR5cGVzLiBHZW5lcmF0ZWQKKyAgICAgIG9ubHkgd2hlbiB0aGUgRm9vIGVsZW1lbnQgaXMgZGVmaW5lZCBhcyBhIHNpbXBsZSB0eXBlLjwvZGl2PgorICAgIDxkaXY+CisgICAgICA8cHJlPi8qCisgKiBSZXR1cm5zIHZhbHVlcyBvZiBhbGwgdGhlIHBob25lIGNoaWxkIGVsZW1lbnRzIG9mIGFuIGVtcGxveWVlIGVsZW1lbnQsCisgKiB3aGVyZSB0aGUgcGhvbmUgZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGFzIHhzOnN0cmluZy4KKyAqLworWG1sU3RyaW5nW10gZW1wUGhvbmVzID0gY3VycmVudEVtcGxveWVlLnhHZXRQaG9uZUFycmF5KCk7Cis8L3ByZT4KKyAgICA8L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgICA8cHJlPlhtbFR5cGUgeGdldEZvb0FycmF5KGludCBpbmRleCkKK3ZvaWQgeHNldEZvb0FycmF5KGludCBpbmRleCwgWG1sVHlwZSBuZXdWYWx1ZSk8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+UmV0dXJucyBvciBzZXRzIHRoZSBGb28gZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCB1c2luZyBhbiBYTUxCZWFucworICAgICAgc2ltcGxlIHR5cGUgdmFsdWUuIEdlbmVyYXRlZCBmb3IgYW4gZWxlbWVudCBkZWZpbmVkIGFzIGEgc2ltcGxlIHR5cGUgaW4KKyAgICAgIHNjaGVtYS48L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgICA8cHJlPnZvaWQgaW5zZXJ0Rm9vKGludCBpbmRleCwgRm9vVHlwZSBuZXdWYWx1ZSk8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+SW5zZXJ0cyB0aGUgc3BlY2lmaWVkIEZvbyBjaGlsZCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8aHIgc2l6ZT0iMSI+CisgICAgPHByZT52b2lkIGFkZEZvbyhGb29UeXBlIG5ld1ZhbHVlKTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5BZGRzIHRoZSBzcGVjaWZpZWQgRm9vIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgRm9vIGNoaWxkIGVsZW1lbnRzLjwvZGl2PgorICA8L2Jsb2NrcXVvdGU+CisgIDxkaXY+CisgICAgPGhyIHNpemU9IjEiPgorICAgIDxwcmU+WG1sVHlwZSBpbnNlcnROZXdGb28oaW50IGluZGV4KTwvcHJlPgorICA8L2Rpdj4KKyAgPGJsb2NrcXVvdGU+CisgICAgPGRpdj5JbnNlcnRzIGEgbmV3IEZvbyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LCByZXR1cm5pbmcgYW4gWE1MQmVhbnMgc2ltcGxlCisgICAgICB0eXBlIHJlcHJlc2VudGluZyB0aGUgbmV3IGVsZW1lbnQ7IHJldHVybnMgdGhlIGV4aXN0aW5nIEZvbyBpZiB0aGVyZSdzIGFscmVhZHkKKyAgICAgIG9uZSBhdCBpbmRleC48L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgICA8cHJlPlhtbFR5cGUgYWRkTmV3Rm9vKCk8L3ByZT4KKyAgPC9kaXY+CisgIDxibG9ja3F1b3RlPgorICAgIDxkaXY+QWRkcyBhIG5ldyBGb28gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIEZvbyBjaGlsZCBlbGVtZW50cywKKyAgICAgIHJldHVybmluZyBhbiBYTUxCZWFucyBzaW1wbGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQuPC9kaXY+CisgIDwvYmxvY2txdW90ZT4KKyAgPGRpdj4KKyAgICA8aHIgc2l6ZT0iMSI+CisgICAgPHByZT5ib29sZWFuIGlzTmlsRm9vQXJyYXkoaW50IGluZGV4KQordm9pZCBzZXROaWxGb29BcnJheShpbnQgaW5kZXgpPC9wcmU+CisgIDwvZGl2PgorICA8YmxvY2txdW90ZT4KKyAgICA8ZGl2PkRldGVybWluZXMgb3Igc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEZvbyBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICAgIGlzIG5pbC48L2Rpdj4KKyAgPC9ibG9ja3F1b3RlPgorICA8ZGl2PgorICAgIDxociBzaXplPSIxIj4KKyAgPC9kaXY+CisgIDxkaXYgaWQ9InRvcGljdGV4dCI+PC9kaXY+CisgIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+CisgIDxwPjxhIGhyZWY9ImNvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIj5KYXZhIFR5cGVzIEdlbmVyYXRlZAorICAgIGZyb20gVXNlci1EZXJpdmVkIFNjaGVtYSBUeXBlczwvYT48L3A+Cis8L2Rpdj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2Nvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNGU4YWUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2d1aWRlL2Nvbk5hdmlnYXRpbmdYTUx3aXRoQ3Vyc29ycy5odG1sCkBAIC0wLDAgKzEsMjIyIEBACis8IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+CisKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KKzx0aXRsZT5OYXZpZ2F0aW5nIFhNTCB3aXRoIEN1cnNvcnM8L3RpdGxlPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CisKKworPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgorCis8bWV0YSBjb250ZW50PSJ5b3VyIG5hbWUiIG5hbWU9ImF1dGhvciI+Cis8bWV0YSBjb250ZW50PSJBIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4iIG5hbWU9ImRlc2NyaXB0aW9uIj4KKzxtZXRhIGNvbnRlbnQ9ImtleXdvcmRzIHRvIGhlbHAgaW4gc2VhcmNoZXMiIG5hbWU9ImtleXdvcmRzIj4KKzxtZXRhIGNvbnRlbnQ9IjEwLzI1LzAyIiBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Cis8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzxhIGhyZWY9Ii4uLy4uLy4uL2NvcmUvaW5kZXguaHRtbCIgaWQ9ImluZGV4Ij48L2E+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvdG9waWNJbmZvLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9Db29raWVDbGFzcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvZGlzcGxheUNvbnRlbnQuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorCis8IS0tKEJvZHkpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPGJvZHk+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKworPC9zY3JpcHQ+Cis8IS0tIEluc3RhbmNlQmVnaW5FZGl0YWJsZSBuYW1lPSJib2R5IiAtLT4KKzxoMT4gTmF2aWdhdGluZyBYTUwgd2l0aCBDdXJzb3JzIDwvaDE+Cis8ZGl2IGlkPSJ0b3BpY3RleHQiPgorICA8cD5YTUwgY3Vyc29ycyBhcmUgYSB3YXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQuIE9uY2UKKyAgICB5b3UgbG9hZCBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljCisgICAgcGxhY2UgaW4gdGhlIFhNTC4gQmVjYXVzZSB5b3UgY2FuIHVzZSBhIGN1cnNvciB3aXRoIG9yIHdpdGhvdXQgYSBzY2hlbWEgY29ycmVzcG9uZGluZworICAgIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIHdheSB0byBoYW5kbGUgWE1MIHdpdGhvdXQgYSBzY2hlbWEuPC9wPgorICA8cD5XaXRoIGFuIFhNTCBjdXJzb3IsIHlvdSBjYW46PC9wPgorPC9kaXY+Cis8VUw+CisgIDxsaT4KKyAgICA8ZGl2PjxhIGhyZWY9ImNvblVuZGVyc3RhbmRpbmdYTUxUb2tlbnMuaHRtbCI+VXNlIHRoZSB0b2tlbiBtb2RlbDwvYT4gdG8gbW92ZQorICAgICAgdGhyb3VnaCBYTUwgaW4gc21hbGwgaW5jcmVtZW50cywgb3IgaW4gYSBtYW5uZXIgc2ltaWxhciB0byB1c2luZyBhIERPTS1iYXNlZAorICAgICAgbW9kZWwuPC9kaXY+CisgIDxMST4KKyAgICA8RElWPkdldCBhbmQgc2V0IHZhbHVlcyB3aXRoaW4gdGhlIFhNTC48L0RJVj4KKyAgPExJPgorICAgIDxESVY+PGEgaHJlZj0iI2FkZGluZ19lbGVtZW50c19hdHRyaWJ1dGVzIj5DaGFuZ2UgdGhlIHN0cnVjdHVyZTwvYT4gb2YgYW4KKyAgICAgIFhNTCBkb2N1bWVudCBieSBpbnNlcnRpbmcsIHJlbW92aW5nLCBhbmQgbW92aW5nIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLjwvRElWPgorICA8TEk+CisgICAgPERJVj48YSBocmVmPSJjb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwiPkV4ZWN1dGUgWFF1ZXJ5IGV4cHJlc3Npb25zPC9hPgorICAgICAgYWdhaW5zdCB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoZSBjdXJzb3IuPC9ESVY+CisgIDxMST4KKyAgICA8RElWPjxhIGhyZWY9ImNvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sIj5JbnNlcnQgYm9va21hcmtzPC9hPiB0bworICAgICAgbWFyayBsb2NhdGlvbnMgaW4gWE1MLjwvRElWPgorPC9VTD4KKzxQPldoZW4geW91J3JlIGZpbmlzaGVkIHVzaW5nIGEgY3Vyc29yLCB5b3VyIGNvZGUgc2hvdWxkIGNhbGwgaXRzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5kaXNwb3NlPC9zcGFuPgorICBtZXRob2QuPC9QPgorPGgyPkNyZWF0aW5nIGFuZCBNb3ZpbmcgYSBDdXJzb3I8L2gyPgorPFA+V2l0aCBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgYm91bmQgdG8gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj5YbWxPYmplY3Q8L2E+PC9zcGFuPgorICAob3IgYSB0eXBlIGluaGVyaXRpbmcgZnJvbSBpdCksIHlvdSBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5IGNhbGxpbmcgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5uZXdDdXJzb3I8L3NwYW4+CisgIG1ldGhvZC4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yPC9hPjwvc3Bhbj4KKyAgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBjdXJzb3IuIEZyb20gYSBjdXJzb3Igc3RhbmRwb2ludCwgYW4gWE1MIGRvY3VtZW50IGlzCisgIGEgY29sbGVjdGlvbiBvZiA8RU0+dG9rZW5zPC9FTT4gdGhhdCByZXByZXNlbnQgdGhlIGtpbmRzIG9mIHRoaW5ncyB0aGF0IGNhbgorICBhcHBlYXIgaW4gWE1MLiBUaGVzZSBpbmNsdWRlJm5ic3A7YXR0cmlidXRlcywgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZWxlbWVudHMsCisgIGNvbW1lbnRzLCBhbmQgc28gb24uJm5ic3A7RWFjaCBwaWVjZSBvZiBpbmZvcm1hdGlvbiBpbiBYTUwgaXMgcmVwcmVzZW50ZWQgYnkKKyAgYSA8ZW0+dG9rZW4gdHlwZTwvZW0+LjwvUD4KKzxQIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBGb3IgYSBtb3JlIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mCisgIFhNTCB0b2tlbnMsIHNlZSA8YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvYT4uPC9QPgorPFA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBsb2FkcyB0aGUmbmJzcDtYTUwgaW5zdGFuY2UgZGVzY3JpYmVkIGFib3ZlCisgIGZyb20gYSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+RmlsZTwvc3Bhbj4gb2JqZWN0LCB0aGVuIGNyZWF0ZXMgYSBuZXcgY3Vyc29yLgorICBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvRmlyc3RDaGlsZDwvc3Bhbj4gdGFrZXMgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQKKyAgdGFnIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+YmF0Y2hXaWRnZXRPcmRlcjwvc3Bhbj4gZG9jdW1lbnQgZWxlbWVudC4KKyAgVGhlIGNvZGUgdGhlbiBwcmludHMgdGhlIHR5cGUgZm9yIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIGFsb25nCisgIHdpdGggdGhlIFhNTCB0aGUgY3Vyc29yIHJlcHJlc2VudHOXaW4gb3RoZXIgd29yZHMsIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+VG9rZW4KKyAgdHlwZTogU1RBUlQgLzwvc3Bhbj4gYW5kIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPmJhdGNoV2lkZ2V0T3JkZXJFbGVtZW50PC9zcGFuPgorICBhbmQgaXRzIGNvbnRlbnRzLjwvUD4KKzxwcmU+cHVibGljIHN0YXRpYyB2b2lkIGluc2VydEN1cnNvcihGaWxlIG9yZGVyRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbgoreworICAgIEJhdGNoV2lkZ2V0T3JkZXJEb2N1bWVudCB4bWxEb2MgPSBCYXRjaFdpZGdldE9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShvcmRlckZpbGUpOworICAgIFhtbEN1cnNvciBvcmRlckN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKKyAgICBvcmRlckN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRva2VuIHR5cGU6ICIgKyBvcmRlckN1cnNvci5jdXJyZW50VG9rZW5UeXBlKCkgKworICAgICAgICAiIC8gIiArIG9yZGVyQ3Vyc29yLnhtbFRleHQoKSk7Cit9Cis8L3ByZT4KKzxwIGNsYXNzPSJub3RlcGFyYSI+PFNUUk9ORz5Ob3RlPC9TVFJPTkc+OiBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4KKyAgaW50ZXJmYWNlIHByb3ZpZGVzIG1hbnkgbWV0aG9kcyB5b3UgY2FuIHVzZSB0byBwdXQgYSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgaXQuCisgIEZvciBhIGxpc3Qgb2YgdGhvc2UgbWV0aG9kcywgc2VlIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj5YbWxDdXJzb3IKKyAgSW50ZXJmYWNlPC9hPi48L3A+Cis8aDI+PGEgbmFtZT0iYWRkaW5nX2VsZW1lbnRzX2F0dHJpYnV0ZXMiIGlkPSJhZGRpbmdfZWxlbWVudHNfYXR0cmlidXRlcyI+PC9hPkFkZGluZworICBFbGVtZW50cyBhbmQgQXR0cmlidXRlczwvaDI+Cis8cD5UaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcworICB5b3UgY2FuIHVzZSB0byBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdG8gWE1MLiA8L3A+Cis8cD5PbmUgd2F5IHRvIGFkZCBuZXcgWE1MIGlzIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5iZWdpbkVsZW1lbnQ8L3NwYW4+CisgIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLAorICBhbmQgZG8gaXQgc28gdGhlIGN1cnNvciBlbmRzIHVwIGJldHdlZW4gdGhlIG5ldyBlbGVtZW50J3MgU1RBUlQgYW5kIEVORCB0b2tlbnMuCisgIEZyb20gdGhpcyBwb3NpdGlvbiwgeW91IGNhbiBpbnNlcnQgYXR0cmlidXRlcyAodGhleSdyZSBhdXRvbWF0aWNhbGx5IHBsYWNlZAorICBpbiB0aGUgc3RhcnQgdGFnLCB3aGVyZSB0aGV5IGJlbG9uZykgYW5kIGluc2VydCBhIHZhbHVlLiBIZXJlJ3MgYW4gZXhhbXBsZTo8L3A+Cis8cHJlPgorLy8gQ3JlYXRlIGEgbmV3IGNodW5rIG9mIFhNTC4KK1htbE9iamVjdCBuZXdYbWwgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworLyoKKyAqIEluc2VydCBhIG5ldyBjdXJzb3IgYW5kIG1vdmUgaXQgdG8gdGhlIGZpcnN0IFNUQVJUIHRva2VuICh3aGVyZSB0aGUKKyAqIFhNTCBhY3R1YWxseSBiZWdpbnMuCisgKi8KK1htbEN1cnNvciBjdXJzb3IgPSBuZXdYbWwubmV3Q3Vyc29yKCk7CitjdXJzb3IudG9OZXh0VG9rZW4oKTsKKy8vIEJlZ2luIGEgbmV3IGl0ZW0gZWxlbWVudCB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzICJodHRwOi8vb3BlbnVyaS5vcmciLgorY3Vyc29yLmJlZ2luRWxlbWVudCgmcXVvdDtpdGVtJnF1b3Q7LCAmcXVvdDtodHRwOi8vb3BlbnVyaS5vcmcvJnF1b3Q7KTsKKy8vIEluc2VydCBhbiBJRCBhdHRyaWJ1dGUgb24gdGhlIGl0ZW0gZWxlbWVudCwgYWxvbmcgd2l0aCBhbiBhdHRyaWJ1dGUgdmFsdWUuCitjdXJzb3IuaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCZxdW90O2lkJnF1b3Q7LCAmcXVvdDs0MDU2NDA0JnF1b3Q7KTsKKy8vIEluc2VydCAiYmljeWNsZSIgYXMgYW4gZWxlbWVudCB2YWx1ZS4KK2N1cnNvci5pbnNlcnRDaGFycygmcXVvdDtiaWN5Y2xlJnF1b3Q7KTsKK2N1cnNvci5kaXNwb3NlKCk7Cis8L3ByZT4KKzxwPlRoaXMgZXhhbXBsZSByZXN1bHRzIGluIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgorPHByZT4mbHQ7bnMxOml0ZW0gaWQ9JnF1b3Q7NDA1NjQwNCZxdW90OyB4bWxuczpuczE9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnLyZxdW90OyZndDtiaWN5Y2xlJmx0Oy9uczE6aXRlbSZndDsKKzwvcHJlPgorPGgyPiBVc2luZyBTdG9yZWQgQ3Vyc29yIExvY2F0aW9ucyB3aXRoIHB1c2goKSBhbmQgcG9wKCk8L2gyPgorPGRpdiBpZD0idG9waWN0ZXh0Ij4KKyAgPHA+V2hlbiB5b3Ugd2FudCB0byBtb3ZlIGEgY3Vyc29yIGFyb3VuZCwgYnV0IHdhbnQgdG8ga2VlcCB0cmFjayBvZiBhIGZvcm1lcgorICAgIGxvY2F0aW9uLCB5b3UgY2FuIHVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlJ3MKKyAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+CisgICAgbWV0aG9kcy4gVGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBtZXRob2QgcHVzaGVzIHRoZSBjdXJzb3IncworICAgIGN1cnJlbnQgbG9jYXRpb24gb250byBhIHN0YWNrIG9mIGxvY2F0aW9ucyBtYWludGFpbmVkIGZvciB0aGF0IHBhcnRpY3VsYXIKKyAgICBjdXJzb3I7IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiBtZXRob2QgcmVtb3ZlcyB0aGUgbG9jYXRpb24KKyAgICBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCBtb3ZlcyB0aGUgY3Vyc29yIHRvIHRoYXQgbG9jYXRpb24uPC9wPgorICA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyAmbHQ7ZW1wbG95ZWUmZ3Q7IGVsZW1lbnQsIHVzZWQgaW4gdGhlCisgICAgZXhhbXBsZSBiZWxvdy48L3A+CisgIDxwcmU+CismbHQ7ZW1wbG95ZWUmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7bmFtZSZndDtHbGFkeXMgS3Jhdml0eiZsdDsvbmFtZSZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDthZGRyZXNzIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7c3RyZWV0Jmd0OzEzMTMgTW9ja2luZ2JpcmQgTGFuZSZsdDsvc3RyZWV0Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7U2VhdHRsZSZsdDsvY2l0eSZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdGF0ZSZndDtXQSZsdDsvc3RhdGUmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7emlwJmd0Ozk4MTE1Jmx0Oy96aXAmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7L2FkZHJlc3MmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWRkcmVzcyBsb2NhdGlvbj0mcXVvdDt3b3JrJnF1b3Q7Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3N0cmVldCZndDsyMDExIDE1Mm5kIEF2ZW51ZSBORSZsdDsvc3RyZWV0Jmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2NpdHkmZ3Q7UmVkbW9uZCZsdDsvY2l0eSZndDsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDtzdGF0ZSZndDtXQSZsdDsvc3RhdGUmZ3Q7CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7emlwJmd0Ozk4MDUyJmx0Oy96aXAmZ3Q7CismbmJzcDsmbmJzcDsgJm5ic3A7Jmx0Oy9hZGRyZXNzJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7KDQyNSkgNTU1LTY4OTcmbHQ7L3Bob25lJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7KDIwNikgNTU1LTY1OTQmbHQ7L3Bob25lJmd0OworJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O3Bob25lIGxvY2F0aW9uPSZxdW90O21vYmlsZSZxdW90OyZndDsoMjA2KSA1NTUtNzg5NCZsdDsvcGhvbmUmZ3Q7CismbHQ7L2VtcGxveWVlJmd0OworPC9wcmU+CisgIDxwPlRoZSBmb2xsb3dpbmcgSmF2YSBjb2RlIGlsbHVzdHJhdGVzIGhvdyB5b3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4KKyAgICBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4gdG8gcHV0IHRoZSBjdXJzb3IgYmFjayB0byBhIHNhdmVkCisgICAgbG9jYXRpb24gYWZ0ZXIgYSBiaXQgb2YgdHJhdmVsaW5nLjwvcD4KKyAgPHByZT4KKy8qKgorICogUGFzcyB0byB0aGUgdHJ5U2VsZWN0UGF0aCBtZXRob2QgYW4gWG1sT2JqZWN0IGluc3RhbmNlIHRoYXQgY29udGFpbnMKKyAqIHRoZSBYTUwgYWJvdmUuCisgKi8KK3B1YmxpYyB2b2lkIHRyeVNlbGVjdFBhdGgoWG1sT2JqZWN0IHhtbCkKK3sKKyAgICAvKgorICAgICAqIEluc2VydHMgdGhlIGN1cnNvciBhdCB0aGUgU1RBUlRET0MgdG9rZW4gKHRoZSB2ZXJ5IGJlZ2lubmluZywKKyAgICAgKiBiZWZvcmUgYW55IGVsZW1lbnRzKS4KKyAgICAgKi8KKyAgICBYbWxDdXJzb3IgY3Vyc29yID0geG1sLm5ld0N1cnNvcigpOworICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgdG8ganVzdCBiZWZvcmUgJmx0O2VtcGxveWVlJmd0OworICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAvLyBQdXNoZXMgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24gb250byB0aGUgc3RhY2suCisgICAgY3Vyc29yLnB1c2goKTsKKyAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDt3b3JrJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4KKyAgICBjdXJzb3IudG9DaGlsZCgyKTsKKyAgICAvLyBNb3ZlcyB0aGUgY3Vyc29yIHRvIGp1c3QgYmVmb3JlIHRoZSAmcXVvdDtob21lJnF1b3Q7ICZsdDtwaG9uZSZndDsgZWxlbWVudC4KKyAgICBjdXJzb3IudG9OZXh0U2libGluZygpOworICAgIC8vIE1vdmVzIHRoZSBjdXJzb3IgYmFjayB0byBqdXN0IGJlZm9yZSAmbHQ7ZW1wbG95ZWUmZ3Q7CisgICAgY3Vyc29yLnBvcCgpOworfQorPC9wcmU+CisgIDxwPk9mIGNvdXJzZSwgeW91IGNhbiBjYWxsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4KKyAgICBtdWx0aXBsZSB0aW1lcy4gRWFjaCBuZXcgY2FsbCB0byB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+CisgICAgbWV0aG9kIHB1c2hlcyB0aGUgY3VycmVudCBsb2NhdGlvbiBvbnRvIHRoZSBzdGFjay4gQXMgeW91IGNhbGwgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+CisgICAgbWV0aG9kLCB5b3UncmUgYWx3YXlzIGdldHRpbmcgd2hhdCdzIG9uIHRvcCBvZiB0aGUgc3RhY2suIFNvIGlmIHlvdSBjYWxsZWQKKyAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gdGhyZWUgdGltZXMgYmVmb3JlIGNhbGxpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnBvcDwvc3Bhbj4KKyAgICAmIzgyMTI7IDEsIDIsIDMgJiM4MjEyOyBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+IHRocmVlCisgICAgdGltZXMgd291bGQgZ2V0IHRob3NlIGxvY2F0aW9ucyBpbiByZXZlcnNlIG9yZGVyICYjODIxMjsgMywgMiwgMS48L3A+CisgIDxwPlRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cHVzaDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wb3A8L3NwYW4+CisgICAgbWV0aG9kcyBjYW4gYmUgaGFuZHkgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gY3JlYXRpbmcgbmV3IGN1cnNvcnMgdGhhdCBhcmUgZGVzaWduZWQKKyAgICBzaW1wbHkgdG8gbWFyayBhIHBhcnRpY3VsYXIgbG9jYXRpb24gd2hpbGUgeW91IG1vdmUgYW5vdGhlciBjdXJzb3IgYXJvdW5kLgorICAgIFRoZSByZXNvdXJjZXMgcmVxdWlyZWQgdG8gbWFpbnRhaW4gYSBsb2NhdGlvbiBzdGFjayB0aHJvdWdoIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5wdXNoPC9zcGFuPgorICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPiBhcmUgZmFyIGxlc3MgdGhhbiB0aG9zZSBuZWVkZWQgYnkKKyAgICBjdXJzb3JzLiA8L3A+CisgIDxIMT5EaXNwb3Npbmcgb2YgYSBDdXJzb3I8L0gxPgorICA8cD5XaGVuIHlvdSdyZSB0aHJvdWdoIHdpdGggYSBjdXJzb3IsIHlvdXIgY29kZSBzaG91bGQgY2FsbCBpdHMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmRpc3Bvc2U8L3NwYW4+CisgICAgbWV0aG9kIHRvIGluZGljYXRlIHRoYXQgaXQncyBubyBsb25nZXIgbmVlZGVkLjwvcD4KKyAgPHAgY2xhc3M9InJlbGF0ZWR0b3BpY3MiPlJlbGF0ZWQgVG9waWNzPC9wPgorICA8cD48YSBocmVmPSJjb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwiPlVuZGVyc3RhbmRpbmcgWE1MIFRva2VuczwvYT48L3A+CisgIDxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KKzwvZGl2PgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblNlbGVjdGluZ1hNTHdpdGhYUXVlcnlQYXRoWFBhdGguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRhM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvZG9jcy9ndWlkZS9jb25TZWxlY3RpbmdYTUx3aXRoWFF1ZXJ5UGF0aFhQYXRoLmh0bWwKQEAgLTAsMCArMSwyNzAgQEAKKzwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KKworPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8aHRtbD4KKzxoZWFkPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgorPHRpdGxlPlNlbGVjdGluZyBYTUwgd2l0aCBYUXVlcnkgYW5kIFhQYXRoPC90aXRsZT4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgorCisKKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KKworPG1ldGEgY29udGVudD0ieW91ciBuYW1lIiBuYW1lPSJhdXRob3IiPgorPG1ldGEgY29udGVudD0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9waWMgY29udGVudHMuIiBuYW1lPSJkZXNjcmlwdGlvbiI+Cis8bWV0YSBjb250ZW50PSJrZXl3b3JkcyB0byBoZWxwIGluIHNlYXJjaGVzIiBuYW1lPSJrZXl3b3JkcyI+Cis8bWV0YSBjb250ZW50PSIxMC8yNS8wMiIgbmFtZT0iZGF0ZSBsYXN0IG1vZGlmaWVkIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKworPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzxib2R5PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Cis8aDE+IFNlbGVjdGluZyBYTUwgd2l0aCBYUXVlcnkgYW5kIFhQYXRoPC9oMT4KKzxkaXYgaWQ9InRvcGljdGV4dCI+CisgIDxwPllvdSBjYW4gdXNlIFhRdWVyeSBhbmQgWFBhdGggdG8gcmV0cmlldmUgc3BlY2lmaWMgcGllY2VzIG9mIFhNTCBhcyB5b3UgbWlnaHQKKyAgICByZXRyaWV2ZSBkYXRhIGZyb20gYSBkYXRhYmFzZS4gWFF1ZXJ5IGFuZCBYUGF0aCBwcm92aWRlIGEgc3ludGF4IGZvciBzcGVjaWZ5aW5nCisgICAgd2hpY2ggZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgeW91J3JlIGludGVyZXN0ZWQgaW4uIFRoZSBYTUxCZWFucyBBUEkgcHJvdmlkZXMKKyAgICB0d28gbWV0aG9kcyBmb3IgZXhlY3V0aW5nIFhRdWVyeSBhbmQgWFBhdGggZXhwcmVzc2lvbnMsIGFuZCB0d28gZGlmZmVyaW5nCisgICAgd2F5cyB0byB1c2UgdGhlbS4gVGhlIG1ldGhvZHMgYXJlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPgorICAgIGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+ZXhlY1F1ZXJ5PC9zcGFuPiwgYW5kIHlvdSBjYW4gY2FsbCB0aGVtIGZyb20KKyAgICA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxPYmplY3QuaHRtbCI+PHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj48L2E+CisgICAgKG9yIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gaXQpIG9yIDxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5odG1sIj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPjwvYT4uCisgICAgVGhlIHJlc3VsdHMgZm9yIHRoZSBtZXRob2RzIGRpZmZlciBzb21ld2hhdC4gPC9wPgorICA8aDI+VXNpbmcgdGhlIHNlbGVjdFBhdGggTWV0aG9kPC9oMj4KKzwvZGl2PgorPGRpdj4KKyAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiBtZXRob2QgaXMgdGhlIG1vc3QgZWZmaWNpZW50CisgICAgd2F5IHRvIGV4ZWN1dGUgWFBhdGggZXhwcmVzc2lvbnMuIFRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+c2VsZWN0UGF0aDwvc3Bhbj4KKyAgICBtZXRob2QgaXMgb3B0aW1pemVkIGZvciBYUGF0aC4gV2hlbiB5b3UgdXNlIFhQYXRoIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPgorICAgIG1ldGhvZCwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGFuIGFycmF5IG9mIHZhbHVlcyBmcm9tIHRoZSA8ZW0+Y3VycmVudCBkb2N1bWVudDwvZW0+LgorICAgIEluIGNvbnRyYXN0LCB3aGVuIHlvdSB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4sIHRoZSB2YWx1ZQorICAgIHJldHVybmVkIGlzIGEgPGVtPm5ldyBkb2N1bWVudDwvZW0+LjwvcD4KKyAgPGgzPkNhbGxpbmcgZnJvbSBYbWxPYmplY3Q8L2gzPgorICA8cD5XaGVuIGNhbGxlZCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IChvciBhIHR5cGUgdGhhdAorICAgIGluaGVyaXRzIGZyb20gaXQpLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMuIElmIHRoZSBleHByZXNzaW9uCisgICAgaXMgZXhlY3V0ZWQgYWdhaW5zdCB0eXBlcyBnZW5lcmF0ZWQgZnJvbSBzY2hlbWEsIHRoZW4gdGhlIHR5cGUgZm9yIHRoZSByZXR1cm5lZAorICAgIGFycmF5IGlzIG9uZSBvZiB0aGUgSmF2YSB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY2hlbWEuIDwvcD4KKyAgPHA+Rm9yIGV4YW1wbGUsIGltYWdpbmUgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBYTUwgY29udGFpbmluZyBlbXBsb3llZSBpbmZvcm1hdGlvbi4KKyAgICBZb3UndmUgY29tcGlsZWQgdGhlIHNjaGVtYSBkZXNjcmliaW5nIHRoaXMgWE1MIGFuZCB0aGUgdHlwZXMgZ2VuZXJhdGVkIGZyb20KKyAgICBzY2hlbWEgYXJlIGF2YWlsYWJsZSB0byB5b3VyIGNvZGUuPC9wPgorPHByZT4KKyZsdDt4cTplbXBsb3llZXMgeG1sbnM6eHE9JnF1b3Q7aHR0cDovL29wZW51cmkub3JnL3NlbGVjdFBhdGgmcXVvdDsmZ3Q7CisgICAgJmx0O3hxOmVtcGxveWVlJmd0OworICAgICAgICAmbHQ7eHE6bmFtZSZndDtGcmVkIEpvbmVzJmx0Oy94cTpuYW1lJmd0OworICAgICAgICAmbHQ7eHE6YWRkcmVzcyBsb2NhdGlvbj0mcXVvdDtob21lJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O3hxOnN0cmVldCZndDs5MDAgQXVyb3JhIEF2ZS4mbHQ7L3hxOnN0cmVldCZndDsKKyAgICAgICAgICAgICZsdDt4cTpjaXR5Jmd0O1NlYXR0bGUmbHQ7L3hxOmNpdHkmZ3Q7CisgICAgICAgICAgICAmbHQ7eHE6c3RhdGUmZ3Q7V0EmbHQ7L3hxOnN0YXRlJmd0OworICAgICAgICAgICAgJmx0O3hxOnppcCZndDs5ODExNSZsdDsveHE6emlwJmd0OworICAgICAgICAmbHQ7L3hxOmFkZHJlc3MmZ3Q7CisgICAgICAgICZsdDt4cTphZGRyZXNzIGxvY2F0aW9uPSZxdW90O3dvcmsmcXVvdDsmZ3Q7CisgICAgICAgICAgICAmbHQ7eHE6c3RyZWV0Jmd0OzIwMTEgMTUybmQgQXZlbnVlIE5FJmx0Oy94cTpzdHJlZXQmZ3Q7CisgICAgICAgICAgICAmbHQ7eHE6Y2l0eSZndDtSZWRtb25kJmx0Oy94cTpjaXR5Jmd0OworICAgICAgICAgICAgJmx0O3hxOnN0YXRlJmd0O1dBJmx0Oy94cTpzdGF0ZSZndDsKKyAgICAgICAgICAgICZsdDt4cTp6aXAmZ3Q7OTgwNTImbHQ7L3hxOnppcCZndDsKKyAgICAgICAgJmx0Oy94cTphZGRyZXNzJmd0OworICAgICAgICAmbHQ7eHE6cGhvbmUgbG9jYXRpb249JnF1b3Q7d29yayZxdW90OyZndDsoNDI1KTU1NS01NjY1Jmx0Oy94cTpwaG9uZSZndDsKKyAgICAgICAgJmx0O3hxOnBob25lIGxvY2F0aW9uPSZxdW90O2hvbWUmcXVvdDsmZ3Q7KDIwNik1NTUtNTU1NSZsdDsveHE6cGhvbmUmZ3Q7CisgICAgICAgICZsdDt4cTpwaG9uZSBsb2NhdGlvbj0mcXVvdDttb2JpbGUmcXVvdDsmZ3Q7KDIwNik1NTUtNDMyMSZsdDsveHE6cGhvbmUmZ3Q7CisgICAgJmx0Oy94cTplbXBsb3llZSZndDsKKyZsdDsveHE6ZW1wbG95ZWVzJmd0OworPC9wcmU+CisgIElmIHlvdSB3YW50ZWQgdG8gZmluZCB0aGUgcGhvbmUgbnVtYmVycyB3aG9zZSBhcmVhIGNvZGUgd2FzIDIwNiwgeW91IGNvdWxkIGNhcHR1cmUKKyAgdGhlIFhQYXRoIGV4cHJlc3Npb24gaW4gdGhpcyB3YXk6CisgIDxwcmU+CitTdHJpbmcgcXVlcnlFeHByZXNzaW9uID0KKyAgICAmcXVvdDtkZWNsYXJlIG5hbWVzcGFjZSB4cT0naHR0cDovL29wZW51cmkub3JnL3NlbGVjdFBhdGgnJnF1b3Q7ICsKKyAgICAmcXVvdDskdGhpcy94cTplbXBsb3llZXMveHE6ZW1wbG95ZWUveHE6cGhvbmVbY29udGFpbnMoLiwgJygyMDYpJyldJnF1b3Q7Cis8L3ByZT4KKyAgPHA+Tm90aWNlIGluIHRoZSBxdWVyeSBleHByZXNzaW9uIHRoYXQgdGhlIHZhcmlhYmxlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpczwvc3Bhbj4KKyAgICByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbnRleHQgbm9kZSAodGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+CisgICAgdGhhdCB5b3UgYXJlIHF1ZXJ5aW5nIGZyb20pLiBJbiB0aGlzIGV4YW1wbGUgeW91IGFyZSBxdWVyeWluZyBmcm9tIHRoZSBkb2N1bWVudAorICAgIGxldmVsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LjwvcD4KKyAgPHA+WW91IGNvdWxkIHRoZW4gcHJpbnQgdGhlIHJlc3VsdHMgd2l0aCBjb2RlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzo8L3A+CisgIDxwcmU+CisvKgorICogUmV0cmlldmUgdGhlIG1hdGNoaW5nIHBob25lIGVsZW1lbnRzIGFuZCBhc3NpZ24gdGhlIHJlc3VsdHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGdlbmVyYXRlZCB0eXBlLgorICovCitQaG9uZVR5cGVbXSBwaG9uZXMgPSAoUGhvbmVUeXBlW10pZW1wRG9jLnNlbGVjdFBhdGgocXVlcnlFeHByZXNzaW9uKTsKKy8qCisgKiBMb29wIHRocm91Z2ggdGhlIHJlc3VsdHMsIHByaW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgcGhvbmUgZWxlbWVudC4KKyAqLworZm9yIChpbnQgaSA9IDA7IGkgPCBwaG9uZXMubGVuZ3RoOyBpKyspCit7CisgICAgU3lzdGVtLm91dC5wcmludGxuKHBob25lc1tpXS5zdHJpbmdWYWx1ZSgpKTsKK30gIDwvcHJlPgorCisgIDxoMz5DYWxsaW5nIGZyb20gWG1sQ3Vyc29yPC9oMz4KKyAgPHA+V2hlbiBjYWxsZWQgZnJvbSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnN0YW5jZSwgdGhlCisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCByZXRyaWV2ZXMgYSBsaXN0IG9mIHNlbGVjdGlvbnMsCisgICAgb3IgbG9jYXRpb25zIGluIHRoZSBYTUwuIFRoZSBzZWxlY3Rpb25zIGFyZSByZW1lbWJlcmVkIGJ5IHRoZSBjdXJzb3IgaW5zdGFuY2UuCisgICAgWW91IGNhbiB1c2UgbWV0aG9kcyBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTZWxlY3Rpb248L3NwYW4+CisgICAgdG8gbmF2aWdhdGUgYW1vbmcgdGhlbS48L3A+CisgIDxkaXY+CisgICAgPHA+VGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5zZWxlY3RQYXRoPC9zcGFuPiBtZXRob2QgdGFrZXMgYW4gWFBhdGggZXhwcmVzc2lvbi4KKyAgICAgIElmIHRoZSBleHByZXNzaW9uIHJldHVybnMgYW55IHJlc3VsdHMsIGVhY2ggb2YgdGhvc2UgcmVzdWx0cyBpcyBhZGRlZCBhcworICAgICAgYSBzZWxlY3Rpb24gdG8gdGhlIGN1cnNvcidzIGxpc3Qgb2Ygc2VsZWN0aW9ucy4gWW91IGNhbiBtb3ZlIHRocm91Z2ggdGhlc2UKKyAgICAgIHNlbGVjdGlvbnMgaW4gdGhlIHdheSB5b3UgbWlnaHQgdXNlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5qYXZhLnV0aWwuSXRlcmF0b3I8L3NwYW4+CisgICAgICBtZXRob2RzIHRvIG1vdmUgdGhyb3VnaCBhIGNvbGxlY3Rpb24uPC9wPgorICAgIDxwPiBGb3IgZXhhbXBsZSwgZm9yIGEgcGF0aCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj4kdGhpcy9lbXBsb3llZXMvZW1wbG95ZWU8L3NwYW4+LAorICAgICAgdGhlIHJlc3VsdHMgd291bGQgaW5jbHVkZSBhIHNlbGVjdGlvbiBmb3IgZWFjaCBlbXBsb3llZSBlbGVtZW50IGZvdW5kIGJ5CisgICAgICB0aGUgZXhwcmVzc2lvbi4gTm90ZSB0aGF0IHRoZSB2YXJpYWJsZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+JHRoaXM8L3NwYW4+CisgICAgICBpcyBhbHdheXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgY29udGV4dCBub2RlLCB3aGljaCBpbiB0aGlzIGV4YW1wbGUgaXMgdGhlCisgICAgICBkb2N1bWVudC4gQWZ0ZXIgY2FsbGluZyB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+IG1ldGhvZCwKKyAgICAgIHlvdSB3b3VsZCB1c2UgdmFyaW91cyAmcXVvdDtzZWxlY3Rpb24mcXVvdDstcmVsYXRlZCBtZXRob2RzIHRvIHdvcmsgd2l0aAorICAgICAgdGhlIHJlc3VsdHMuIFRoZXNlIG1ldGhvZHMgaW5jbHVkZTo8L3A+CisgIDwvZGl2PgorICA8dWw+CisgICAgPGxpPgorICAgICAgPGRpdj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Z2V0U2VsZWN0aW9uQ291bnQoKSA8L3NwYW4+dG8gcmV0cmlldmUgdGhlCisgICAgICAgIG51bWJlciBvZiBzZWxlY3Rpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeS48L2Rpdj4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgIDxkaXY+IDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTZWxlY3Rpb24oKTwvc3Bhbj4gdG8gbW92ZSB0aGUgY3Vyc29yCisgICAgICAgIHRvIHRoZSBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgbGlzdCAoc3VjaCBhcyB0byB0aGUgb25lIHBvaW50aW5nIGF0IHRoZQorICAgICAgICBuZXh0IGVtcGxveWVlIGVsZW1lbnQgZm91bmQpLjwvZGl2PgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgPGRpdj4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvU2VsZWN0aW9uKGludCk8L3NwYW4+IHRvIG1vdmUgdGhlIGN1cnNvcgorICAgICAgICB0byB0aGUgc2VsZWN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKHN1Y2ggYXMgdG8gdGhlIHRoaXJkIGVtcGxveWVlCisgICAgICAgIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGlvbikuPC9kaXY+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8ZGl2PiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aGFzTmV4dFNlbGVjdGlvbigpPC9zcGFuPiB0byBmaW5kIG91dCBpZgorICAgICAgICB0aGVyZSBhcmUgbW9yZSBzZWxlY3Rpb25zIGFmdGVyIHRoZSBjdXJzb3IncyBjdXJyZW50IHBvc2l0aW9uLjwvZGl2PgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgPGRpdj48c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+IGNsZWFyU2VsZWN0aW9ucygpPC9zcGFuPiBjbGVhcnMgdGhlIHNlbGVjdGlvbnMKKyAgICAgICAgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IuIFRoaXMgZG9lc24ndCBtb2RpZnkgdGhlIGRvY3VtZW50IChpbiBvdGhlciB3b3JkcywKKyAgICAgICAgaXQgZG9lc24ndCBkZWxldGUgdGhlIHNlbGVjdGVkIFhNTCk7IGl0IG1lcmVseSBjbGVhcnMgdGhlIHNlbGVjdGlvbiBsaXN0CisgICAgICAgIHNvIHRoYXQgdGhlIGN1cnNvciBpcyBubyBsb25nZXIga2VlcGluZyB0cmFjayBvZiB0aG9zZSBwb3NpdGlvbnMuPC9kaXY+CisgICAgPC9saT4KKyAgPC91bD4KKyAgPGRpdj4KKyAgICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHlvdSBtaWdodCB1c2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+LAorICAgICAgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnB1c2g8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+cG9wPC9zcGFuPgorICAgICAgbWV0aG9kcywgdG8gbWFuZXV2ZXIgdGhyb3VnaCBYTUwsIHJldHJpZXZpbmcgc3BlY2lmaWMgdmFsdWVzLiA8L3A+CisgICAgPHByZT4KK3B1YmxpYyB2b2lkIHByaW50Wmlwc0FuZFdvcmtQaG9uZXMoWG1sT2JqZWN0IHhtbCkKK3sKKyAgICAvLyBEZWNsYXJlIHRoZSBuYW1lc3BhY2UgdGhhdCB3aWxsIGJlIHVzZWQuCisgICAgU3RyaW5nIHhxTmFtZXNwYWNlID0KKyAgICAgICAgJnF1b3Q7ZGVjbGFyZSBuYW1lc3BhY2UgeHE9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZWxlY3RQYXRoJyZxdW90OzsKKworICAgIC8vIEluc2VydCBhIGN1cnNvciBhbmQgbW92ZSBpdCB0byB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICBYbWxDdXJzb3IgY3Vyc29yID0geG1sLm5ld0N1cnNvcigpOworICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24gYnkgcHVzaGluZyBpdAorICAgICAqIG9udG8gYSBzdGFjayBvZiBzYXZlZCBsb2NhdGlvbnMuCisgICAgICovCisgICAgY3Vyc29yLnB1c2goKTsKKyAgICAvLyBRdWVyeSBmb3IgemlwIGVsZW1lbnRzLgorICAgIGN1cnNvci5zZWxlY3RQYXRoKHhxTmFtZXNwYWNlICsgJnF1b3Q7JHRoaXMvL3hxOnppcCZxdW90Oyk7CisgICAgLyoKKyAgICAgKiBMb29wIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc2VsZWN0aW9ucywgZ2V0dGluZyB0aGUgdmFsdWUgb2YKKyAgICAgKiBlYWNoIGVsZW1lbnQuCisgICAgICovCisgICAgd2hpbGUgKGN1cnNvci50b05leHRTZWxlY3Rpb24oKSkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuZ2V0VGV4dFZhbHVlKCkpOworICAgIH0KKyAgICAvLyBQb3AgdGhlIHNhdmVkIGxvY2F0aW9uIG9mZiB0aGUgc3RhY2suCisgICAgY3Vyc29yLnBvcCgpOworICAgIC8vIFF1ZXJ5IGFnYWluIGZyb20gdGhlIHRvcCwgdGhpcyB0aW1lIGZvciB3b3JrIHBob25lIG51bWJlcnMuCisgICAgY3Vyc29yLnNlbGVjdFBhdGgoeHFOYW1lc3BhY2UgKyAmcXVvdDskdGhpcy8veHE6cGhvbmVbQGxvY2F0aW9uPSd3b3JrJ10mcXVvdDspOworICAgIC8qCisgICAgICogTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBzZWxlY3Rpb24sIHRoZW0gcHJpbnQgdGhhdCBlbGVtZW50J3MKKyAgICAgKiB2YWx1ZS4KKyAgICAgKi8KKyAgICBjdXJzb3IudG9OZXh0U2VsZWN0aW9uKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKGN1cnNvci5nZXRUZXh0VmFsdWUoKSk7CisgICAgLy8gRGlzcG9zZSBvZiB0aGUgY3Vyc29yLgorICAgIGN1cnNvci5kaXNwb3NlKCk7Cit9Cis8L3ByZT4KKyAgICA8cD5Vc2luZyBzZWxlY3Rpb25zIGlzIHNvbWV3aGF0IGxpa2UgdHJhY2tpbmcgdGhlIGxvY2F0aW9ucyBvZiBtdWx0aXBsZSBjdXJzb3JzCisgICAgICB3aXRoIGEgc2luZ2xlIGN1cnNvci4gVGhpcyBiZWNvbWVzIGVzcGVjaWFsbHkgY2xlYXIgd2hlbiB5b3UgcmVtb3ZlIHRoZQorICAgICAgWE1MIGFzc29jaWF0ZWQgd2l0aCBhIHNlbGVjdGlvbi4gV2hlbiB5b3UgZG8gc28gdGhlIHNlbGVjdGlvbiBpdHNlbGYgcmVtYWlucworICAgICAgYXQgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSByZW1vdmVkIFhNTCB3YXMsIGJ1dCBub3cgdGhlIHNlbGVjdGlvbidzIGxvY2F0aW9uCisgICAgICBpcyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIFhNTCB0aGF0IHdhcyBhZnRlciB0aGUgWE1MIHlvdSByZW1vdmVkLiBJbiBvdGhlcgorICAgICAgd29yZHMsIHJlbW92aW5nIFhNTCBjcmVhdGVkIGEga2luZCBvZiB2YWN1dW0gdGhhdCB3YXMgZmlsbGVkIGJ5IHRoZSBYTUwKKyAgICAgIGFmdGVyIGl0LCB3aGljaCBzaGlmdGVkIHVwIGludG8gdGhlIHNwYWNlICYjODIxMjsgdXAgaW50byBwb3NpdGlvbiBpbW1lZGlhdGVseQorICAgICAgYWZ0ZXIgdGhlIHNlbGVjdGlvbiBsb2NhdGlvbi4gVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIHRoZSBzZWxlY3Rpb24KKyAgICAgIGhhZCBiZWVuIGFub3RoZXIgY3Vyc29yLjwvcD4KKyAgICA8cD5GaW5hbGx5LCB3aGVuIHVzaW5nIHNlbGVjdGlvbnMga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGxpc3Qgb2Ygc2VsZWN0aW9ucworICAgICAgaXMgaW4gYSBzZW5zZSAmcXVvdDtsaXZlJnF1b3Q7LiBUaGUgY3Vyc29yIHlvdSdyZSB3b3JraW5nIHdpdGggaXMga2VlcGluZworICAgICAgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIGxpc3QuIEluIG90aGVyIHdvcmRzLCBiZSBzdXJlIHRvIGNhbGwgdGhlCisgICAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Y2xlYXJTZWxlY3Rpb25zPC9zcGFuPiBtZXRob2Qgd2hlbiB5b3UncmUgZmluaXNoZWQKKyAgICAgIHdpdGggdGhlIHNlbGVjdGlvbnMsIGp1c3QgYXMgeW91IHNob3VsZCBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLmRpc3Bvc2UoKTwvc3Bhbj4KKyAgICAgIG1ldGhvZCB3aGVuIHlvdSdyZSBmaW5pc2hlZCB1c2luZyB0aGUgY3Vyc29yLjwvcD4KKyAgPC9kaXY+CisgIDxoMj5Vc2luZyB0aGUgZXhlY1F1ZXJ5IE1ldGhvZDwvaDI+CisgIDxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4gbWV0aG9kIHRvIGV4ZWN1dGUgWFF1ZXJ5CisgICAgZXhwcmVzc2lvbnMgdGhhdCBhcmUgbW9yZSBzb3BoaXN0aWNhdGVkIHRoYW4gcGF0aHMuIFRoZXNlIGV4cHJlc3Npb25zIGluY2x1ZGUKKyAgICBtb3JlIHNvcGhpc3RpY2F0ZWQgbG9vcHMgYW5kIEZMV1IgKEZvciwgTGV0LCBXaGVyZSwgYW5kIFJlc3VsdHMpIGV4cHJlc3Npb25zLgorICA8L3A+CisgIDxwIGNsYXNzPSJub3RlcGFyYSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCZSBzdXJlIHRvIHNlZSB0aGUgc2ltcGxlRXhwcmVzc2lvbnMKKyAgICBzYW1wbGUgaW4gdGhlIFNhbXBsZXNBcHAgYXBwbGljYXRpb24gZm9yIGEgc2FtcGxpbmcgb2YgWFF1ZXJ5IGV4cHJlc3Npb25zCisgICAgaW4gdXNlLjwvcD4KKyAgPGgzPkNhbGxpbmcgZnJvbSBYbWxPYmplY3Q8L2gzPgorICA8cD5Vbmxpa2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnNlbGVjdFBhdGg8L3NwYW4+LCBjYWxsaW5nIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5leGVjUXVlcnk8L3NwYW4+CisgICAgZnJvbSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiBpbnN0YW5jZSB3aWxsIHJldHVybiBhbgorICAgIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+IGFycmF5LiBJZiB0aGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4KKyAgICBpbnN0YW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIFhRdWVyeSBtYXRjaCBhIHJlY29nbml6ZWQgWE1MQmVhbnMgdHlwZSAodGhlCisgICAgbmFtZXNwYWNlIGFuZCB0b3AgbGV2ZWwgZWxlbWVudCBuYW1lIG1hdGNoIHVwIHdpdGggYW4gWE1MQmVhbnMgdHlwZSkgdGhlbgorICAgIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPiB3aWxsIGJlIHR5cGVkOyBvdGhlcndpc2UgdGhlCisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gd2lsbCBiZSB1bnR5cGVkLjwvcD4KKyAgPGgzPkNhbGxpbmcgZnJvbSBYbWxDdXJzb3I8L2gzPgorPC9kaXY+CisKKzxkaXY+CisgIDxwPkNhbGxpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmV4ZWNRdWVyeTwvc3Bhbj4gZnJvbSBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPgorICAgIGluc3RhbmNlIHJldHVybnMgYSBuZXcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW5zdGFuY2UuCisgICAgVGhlIGN1cnNvciByZXR1cm5lZCBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgeG1sIGRvY3VtZW50IHJlcHJlc2VudGluZworICAgIHRoZSBxdWVyeSByZXN1bHRzLCBhbmQgeW91IGNhbiB1c2UgaXQgdG8gbW92ZSB0aHJvdWdoIHRoZSByZXN1bHRzLCBjdXJzb3Itc3R5bGUKKyAgICAoZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJjb25OYXZpZ2F0aW5nWE1Md2l0aEN1cnNvcnMuaHRtbCI+TmF2aWdhdGluZworICAgIFhNTCB3aXRoIEN1cnNvcnM8L2E+KS4gSWYgdGhlIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBleGVjdXRpb24KKyAgICByZXByZXNlbnRzIGEgcmVjb2duaXplZCBYTUxCZWFucyB0eXBlICh0aGUgbmFtZXNwYWNlIGFuZCB0b3AgbGV2ZWwgZWxlbWVudAorICAgIG5hbWUgbWF0Y2ggdXAgd2l0aCBhbiBYTUxCZWFucyB0eXBlKSB0aGVuIHRoZSBkb2N1bWVudCByZXN1bHRpbmcgZnJvbSB0aGUKKyAgICB4cXVlcnkgd2lsbCBoYXZlIHRoYXQgSmF2YSB0eXBlOyBvdGhlcndpc2UgdGhlIHJlc3VsdGluZyBkb2N1bWVudCB3aWxsIGJlCisgICAgdW50eXBlZC48L3A+CisgIDxoMj5SZWxhdGVkIFRvcGljczwvaDI+Cis8L2Rpdj4KKzxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sIGIvdjEvZG9jcy9ndWlkZS9jb25VbmRlcnN0YW5kaW5nWE1MVG9rZW5zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3MmMwNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL2RvY3MvZ3VpZGUvY29uVW5kZXJzdGFuZGluZ1hNTFRva2Vucy5odG1sCkBAIC0wLDAgKzEsMTg5IEBACis8IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+CisKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KKzx0aXRsZT5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L3RpdGxlPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CisKKworPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgorCis8bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Cis8IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKzwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8Ym9keT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgorPGRpdiBpZD10b3BpY3RpdGxlPgorICA8cCBjbGFzcz1UaXRsZT5VbmRlcnN0YW5kaW5nIFhNTCBUb2tlbnM8L3A+Cis8L2Rpdj4KKzxkaXYgaWQ9dG9waWN0ZXh0PgorICA8cD5BbiBYTUwgY3Vyc29yIChhbiBpbnN0YW5jZSBvZiB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmh0bWwiPjxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3I8L3NwYW4+PC9hPgorICAgIGludGVyZmFjZSkgbW92ZXMgZnJvbSB0b2tlbiB0byB0b2tlbiBhcyB5b3VyIGNvZGUgbW92ZXMgdGhlIGN1cnNvci4gV2hlbiB5b3UKKyAgICBtb3ZlIGEgY3Vyc29yIHVzaW5nIGEgbWV0aG9kIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvUGFyZW50PC9zcGFuPiwKKyAgICA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+dG9GaXJzdEF0dHJpYnV0ZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b1ByZXZTaWJsaW5nPC9zcGFuPiwKKyAgICBhbmQgc28gb24sIHRoZSBjdXJzb3IgbW92ZXMgdG8gdGhlIHRva2VuIGZpdHRpbmcgdGhlIGRlc2NyaXB0aW9uLiBJZiB0aGVyZQorICAgIGlzIG5vIGFwcHJvcHJpYXRlIHRva2VuIHRvIG1vdmUgdG8sIHRoZSBjdXJzb3IgcmVtYWlucyB3aGVyZSBpdCBpcywgYW5kIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5mYWxzZTwvc3Bhbj4KKyAgICBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRpZG4ndCBtb3ZlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnNvciBpcworICAgIGF0IHRoZSBFTkRET0MgdG9rZW4gKHRoZSBsYXN0IHRhZyBpbiB0aGUgZG9jdW1lbnQpLCBhIGNhbGwgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj50b05leHRTaWJsaW5nPC9zcGFuPgorICAgIG1ldGhvZCB3aWxsIG5vdCBtb3ZlIHRoZSBjdXJzb3IgYW5kIHdpbGwgcmV0dXJuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5mYWxzZTwvc3Bhbj4KKyAgICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtb3ZlIHdhcyB1bnN1Y2Nlc3NmdWwuPC9wPgorICA8cD5Ob3RlIHRoYXQgd2hpbGUgeW91IGNhbiBjYWxsIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLmN1cnJlbnRUb2tlblR5cGU8L3NwYW4+CisgICAgbWV0aG9kIHRvIGZpbmQgb3V0IHdoaWNoIHRva2VuIHR5cGUgdGhlIGN1cnNvciBpcyBhdCwgeW91IG1pZ2h0IGZpbmQgaXQgbW9yZQorICAgIGNvbnZlbmllbnQgdG8gdXNlIGEgbWV0aG9kIHN1Y2ggYXMgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzRW5kZG9jPC9zcGFuPi4KKyAgICBUaGUgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4gaW50ZXJmYWNlIHByb3ZpZGVzIHNldmVyYWwgbWV0aG9kcworICAgIHRoYXQgbWFrZSBpdCBlYXN5IHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIGN1cnNvciB5b3UncmUgbW92aW5nIGlzIGF0IHRoZSB0b2tlbgorICAgIHlvdSdyZSBsb29raW5nIGZvci4gVGhlc2UgbWV0aG9kcywgc3VjaCBhcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+aXNTdGFydDwvc3Bhbj4sCisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmlzQXR0cjwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5pc1RleHQ8L3NwYW4+LAorICAgIGFuZCBzbyBvbiwgcmV0dXJuIGEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPmJvb2xlYW48L3NwYW4+IHZhbHVlIHRoYXQgaW5kaWNhdGVzCisgICAgd2hldGhlciB0aGUgY3Vyc29yIGlzIGF0IHRoZSB0b2tlbiB0eXBlIGluIHF1ZXN0aW9uLjwvcD4KKyAgPFA+VG9rZW5zIGFyZSByZXByZXNlbnRlZCBieSBjb25zdGFudHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuVG9rZW5UeXBlLmh0bWwiPlRva2VuVHlwZTwvYT48L3NwYW4+CisgICAgY2xhc3MsIGFuIGlubmVyIGNsYXNzIG9mIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPiBpbnRlcmZhY2UuCisgICAgRWFjaCBoYXMgYSBjb25zdGFudCB5b3UgY2FuIHVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50cyB0byBwZXJmb3JtIGJ5LXRva2VuIGFjdGlvbnMuCisgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgdG9rZW4gdHlwZXM6PC9QPgorICA8VEFCTEUgaWQ9IlRhYmxlMSI+CisgICAgPFRSPgorICAgICAgPFREPjxTVFJPTkc+VG9rZW4gVHlwZTwvU1RST05HPjwvVEQ+CisgICAgICA8VEQ+PFNUUk9ORz5Td2l0Y2ggQ29uc3RhbnQ8L1NUUk9ORz48L1REPgorICAgICAgPFREPjxTVFJPTkc+RGVzY3JpcHRpb248L1NUUk9ORz48L1REPgorICAgIDwvVFI+CisgICAgPFRSPgorICAgICAgPFREPlNUQVJURE9DPC9URD4KKyAgICAgIDxURD5JTlRfU1RBUlRET0M8L1REPgorICAgICAgPFREPlJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgZmlyc3QgdG9rZW4uIFRoZSBkb2N1bWVudAorICAgICAgICBlbGVtZW50IGl0c2VsZiBpcyByZXByZXNlbnRlZCBieSBhIFNUQVJUIHRva2VuLCBub3QgdGhlIFNUQVJURE9DIHRva2VuLjwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFI+CisgICAgICA8VEQ+RU5ERE9DIDwvVEQ+CisgICAgICA8VEQ+SU5UX0VORERPQzwvVEQ+CisgICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgZW5kIG9mIHRoZSBYTUwuIEFsd2F5cyB0aGUgbGFzdCB0b2tlbi48L1REPgorICAgIDwvVFI+CisgICAgPFRSPgorICAgICAgPFREPlNUQVJUIDwvVEQ+CisgICAgICA8VEQ+SU5UX1NUQVJUPC9URD4KKyAgICAgIDxURD5SZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50LjwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFI+CisgICAgICA8VEQ+RU5EIDwvVEQ+CisgICAgICA8VEQ+SU5UX0VORDwvVEQ+CisgICAgICA8VEQ+UmVwcmVzZW50cyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuIFRoZSBFTkQgdG9rZW4gaGFzIG5vIHZhbHVlLCBidXQgbWFya3MKKyAgICAgICAgdGhlIGVsZW1lbnQncyBlbmQuPC9URD4KKyAgICA8L1RSPgorICAgIDxUUj4KKyAgICAgIDxURD5URVhUPC9URD4KKyAgICAgIDxURD5JTlRfVEVYVDwvVEQ+CisgICAgICA8VEQ+UmVwcmVzZW50cyB0ZXh0LjwvVEQ+CisgICAgPC9UUj4KKyAgICA8VFI+CisgICAgICA8VEQ+QVRUUiA8L1REPgorICAgICAgPFREPklOVF9BVFRSPC9URD4KKyAgICAgIDxURD5SZXByZXNlbnRzIGFuIGF0dHJpYnV0ZS4gQVRUUiB0b2tlbnMgYXJlIGFsbG93ZWQgdG8gYXBwZWFyIGFmdGVyIGEgU1RBUlRET0MKKyAgICAgICAgb3IgU1RBUlQgdG9rZW4uPC9URD4KKyAgICA8L1RSPgorICAgIDxUUj4KKyAgICAgIDxURD5OQU1FU1BBQ0U8L1REPgorICAgICAgPFREPklOVF9OQU1FU1BBQ0U8L1REPgorICAgICAgPFREPlJlcHJlc2VudHMgYSBuYW1lc3BhY2UgKHhtbG5zKSBhdHRyaWJ1dGUuIEFsc28gb25seSBhbGxvd2VkIGFmdGVyIFNUQVJUCisgICAgICAgIG9yIFNUQVJURE9DIHRva2Vucy48L1REPgorICAgIDwvVFI+CisgICAgPFRSPgorICAgICAgPFREPkNPTU1FTlQgPC9URD4KKyAgICAgIDxURD5JTlRfQ09NTUVOVDwvVEQ+CisgICAgICA8VEQ+UmVwcmVzZW50cyBhIGNvbW1lbnQuPC9URD4KKyAgICA8L1RSPgorICAgIDxUUj4KKyAgICAgIDxURD5QUk9DSU5TVCA8L1REPgorICAgICAgPFREPklOVF9QUk9DSU5TVDwvVEQ+CisgICAgICA8VEQ+UmVwcmVzZW50cyBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPC9URD4KKyAgICA8L1RSPgorICA8L1RBQkxFPgorICA8UD5BcyB5b3UgdXNlIGEgY3Vyc29yIHRvIG5hdmlnYXRlIHRocm91Z2ggWE1MLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGNvbnZlbmllbmNlCisgICAgbWV0aG9kcyBkZXNjcmliZWQgYWJvdmUgdG8gZGlzY292ZXIgd2hldGhlciB5b3UncmUgYXQgdGhlIHRva2VuIHlvdSdyZSBsb29raW5nCisgICAgZm9yLCBvciB1c2UgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxDdXJzb3IuY3VycmVudFRva2VuVHlwZTwvc3Bhbj4mbmJzcDttZXRob2QKKyAgICB0byBkaXNjb3ZlciB0aGUgY3VycmVudCB0b2tlbidzIHR5cGUuIFRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIGV4YW1wbGUKKyAgICBsb2NhdGlvbnMgZm9yIHRva2VuIHR5cGVzOjwvUD4KKyAgPFA+PElNRyBzcmM9Ii4uL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYiIHdpZHRoPSI3MjciIGhlaWdodD0iNTMyIj4KKyAgPGgyPlN3aXRjaGluZyB0byBUZXN0IGZvciBUb2tlbiBUeXBlczwvaDI+CisgIDxwPkhlcmUncyBhIGJpdCBvZiBjb2RlIGlsbHVzdHJhdGluZyBob3cgeW91IG1pZ2h0IHVzZSBhIEphdmEgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnN3aXRjaDwvc3Bhbj4KKyAgICBzdGF0ZW1lbnQgdG8gdGVzdCBmb3IgdGhlIFNUQVJUIHRva2VuIHR5cGUuPC9wPgorICA8cHJlPgorLy8gVGFrZSBhbiBpbmNvbWluZyBYbWxPYmplY3QgYW5kIGluc2VydCBhIGN1cnNvci4KK1htbEN1cnNvciBkb2N1bWVudEN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKKworLyoKKyAqIExvb3AgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIHBhc3NpbmcgdGhlIGN1cnNvciB3aGVuIGl0IHN0b3BzIGF0IGVhY2ggdG9rZW4KKyAqIHRvIGEgZnVuY3Rpb24gZGVzaWduZWQgdG8gZGlzY292ZXIgdGhlIHRva2VuIHR5cGUuIENvbnRpbnVlIHRoZSBsb29wCisgKiBhcyBsb25nIGF0IHRoZSBjdXJzb3IgaXMgYXQgYSB0b2tlbiAodW50aWwgaXQgcmVhY2hlcyB0aGUgZW5kKS4KKyAqLword2hpbGUgKCFkb2N1bWVudEN1cnNvci50b05leHRUb2tlbigpLmlzTm9uZSgpKQoreworICAgIC8qCisgICAgICogVXNlIHRoZSBpbnRWYWx1ZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBpbnQgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBjdXJyZW50IHRva2VuIHR5cGUuIElmIGl0IGlzIHRoZSB2YWx1ZSBmb3IgSU5UX1NUQVJULAorCSAqIHRoZW4geW91IGhhdmUgYSBtYXRjaC4KKwkgKi8KKyAgICBzd2l0Y2ggKGN1cnNvci5jdXJyZW50VG9rZW5UeXBlKCkuaW50VmFsdWUoKSkKKyAgICB7CisgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9TVEFSVDoKKyAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSB0b2tlbiB0eXBlIGFuZCBhIG1lc3NhZ2UuCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjdXJzb3IuY3VycmVudFRva2VuVHlwZSgpICsKKyAgICAgICAgICAgICI7IGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudC4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorLy8gQmUgc3VyZSB0byBkaXNwb3NlIG9mIGEgY3Vyc29yIHdoZW4geW91J3JlIGZpbmlzaGVkLgorZG9jdW1lbnRDdXJzb3IuZGlzcG9zZSgpOworPC9wcmU+CisgIDxwPlRoZSBzY29wZSBvZiBhbiBYTUwgY3Vyc29yIGlzIHRoZSBYTUwgZG9jdW1lbnQgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZC4gRm9yCisgICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSBjdXJzb3IgYXQgdGhlIG9yZGVySXRlbSBlbGVtZW50IGluIHRoZSBleGFtcGxlIGVhcmxpZXIKKyAgICBpbiB0aGlzIHRvcGljLiBJZiB5b3UgdGhlbiB1c2UgdGhhdCA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yPC9zcGFuPgorICAgIGluc3RhbmNlJ3MgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnRvTmV4dFRva2VuPC9zcGFuPiBtZXRob2QgdG8gbW92ZSB0aGUKKyAgICBjdXJzb3IgdW50aWwgaXQgd29uJ3QgbW92ZSBhbnkgZnVydGhlciwgeW91J2xsIGhhdmUgcmVhY2hlZCB0aGUgRU5ERE9DIHRva2VuLgorICAgIEluIHRoaXMgZXhhbXBsZSwgdGhhdCdzIGF0IHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+Jmx0Oy9iYXRjaFdpZGdldE9yZGVyJmd0Ozwvc3Bhbj4KKyAgICB0YWcuIEluIG90aGVyIHdvcmRzLCB0aGUgY3Vyc29yJ3Mgc2NvcGUgaXMgbm90IGxpbWl0ZWQgdG8gdGhlIGVsZW1lbnQgYXQgd2hpY2gKKyAgICBpdCB3YXMgY3JlYXRlZC48L3A+CisgIDxwIGNsYXNzPXJlbGF0ZWR0b3BpY3M+UmVsYXRlZCBUb3BpY3M8L3A+CisgIDxwPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5Ub2tlblR5cGUuaHRtbCI+WG1sQ3Vyc29yLlRva2VuVHlwZQorICAgIENsYXNzPC9hPjwvcD4KKyAgPHA+PGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvYT48L3A+Cis8L2Rpdj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uVXNpbmdCb29rbWFya3NUb0Fubm90YXRlWE1MLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWYzZDMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2d1aWRlL2NvblVzaW5nQm9va21hcmtzVG9Bbm5vdGF0ZVhNTC5odG1sCkBAIC0wLDAgKzEsOTcgQEAKKzwhZG9jdHlwZSBIVE1MIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgRnJhbWVzZXQvL0VOIj4KKworPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8aHRtbD4KKzxoZWFkPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iZG9jdGl0bGUiIC0tPgorPHRpdGxlPlVzaW5nIEJvb2ttYXJrcyB0byBBbm5vdGF0ZSBYTUw8L3RpdGxlPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPCEtLShNZXRhKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSRDSEFSU0VUOyI+CisKKworPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0ibWV0YXRhZ3MiIC0tPgorCis8bWV0YSBuYW1lPSJjb21wb25lbnQiIGNvbnRlbnQ9IiI+Cis8IS0tIEluIHRoZSBkZXNjcmlwdGlvbiBtZXRhdGFnLCBwbGVhc2UgcHJvdmlkZSBhIEJSSUVGIGRlc2NyaXB0aW9uIG9mIHRoZSB0b3BpYyBjb250ZW50cy4gLS0+Cis8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIj4KKzwhLS0gSW4gdGhlIGNvbXBvbmVudCBtZXRhdGFnLCBwbGVhc2UgbGlzdCBrZXl3b3JkcyB0aGF0IHdpbGwgaGVscCBhIHVzZXIgc2VhcmNoIGZvciB0aGlzIHRvcGljLiAtLT4KKzxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSIiPgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorCis8IS0tKExpbmtzKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iaGVhZCIgLS0+Cis8IS0tIEluc3RhbmNlRW5kRWRpdGFibGUgLS0+Cis8bGluayBocmVmPSIuLi94bWxiZWFucy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPGEgaHJlZj0iLi4vLi4vLi4vY29yZS9pbmRleC5odG1sIiBpZD0iaW5kZXgiPjwvYT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS90b3BpY0luZm8uanMiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL0Nvb2tpZUNsYXNzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iLi4vLi4vLi4vY29yZS9kaXNwbGF5Q29udGVudC5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzwhLS0oQm9keSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Cis8Ym9keT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImJvZHkiIC0tPgorPGRpdiBpZD10b3BpY3RpdGxlPgorICA8cCBjbGFzcz1UaXRsZT5Vc2luZyBCb29rbWFya3MgdG8gQW5ub3RhdGUgWE1MPC9wPgorPC9kaXY+Cis8ZGl2IGlkPXRvcGljdGV4dD4KKyAgPHA+WW91IGNhbiB1c2UgYSBjdXJzb3IgdG8gaW5zZXJ0IGJvb2ttYXJrcyB0aGF0IGFubm90YXRlIFhNTCB3aXRoIG1hcmtlcnMgY29udGFpbmluZworICAgIGluZm9ybWF0aW9uIHlvdSBkZXNpZ24uIFRoZXNlIGJvb2ttYXJrcyBhcmVuJ3Qgd3JpdHRlbiBpbnRvIHRoZSBYTUwgaXRzZWxmLAorICAgIGJ1dCBpbiBhIHNlbnNlICJoYW5nIiBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSBpdCB3YXMgaW5zZXJ0ZWQuIEluIHRoaXMgd2F5CisgICAgeW91IGNhbiBhc3NvY2lhdGUgYXJiaXRyYXJ5IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB3aXRoIHNwZWNpZmljIHBhcnRzIG9mIHRoZQorICAgIFhNTC48L3A+CisgIDxQPllvdSBkZXNpZ24geW91ciBvd24gYm9va21hcmsgY2xhc3NlcyBieSBleHRlbmRpbmcgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5YbWxCb29rbWFyay5odG1sIj5YbWxCb29rbWFyazwvYT48L3NwYW4+LAorICAgIGEgbmVzdGVkIGNsYXNzIG9mIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDdXJzb3IuaHRtbCI+WG1sQ3Vyc29yPC9hPjwvc3Bhbj4uCisgICAgWW91IGNhbiBkZXNpZ24geW91ciBib29rbWFyayBjbGFzcyB0byBjb250YWluIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHlvdXIKKyAgICBuZWVkcy4gPC9QPgorICA8UD5JbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5PcmRlckJvb2ttYXJrPC9zcGFuPiBpcworICAgIGFuIGlubmVyIGNsYXNzIHRoYXQgZXh0ZW5kcyA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sQ3Vyc29yLlhtbEJvb2ttYXJrPC9zcGFuPi4KKyAgICBJdCBtZXJlbHkgc3RvcmVzIGEgcGllY2Ugb2YgdGV4dC48L1A+CisgIDxQUkU+CisvKgorICogVGhlIE9yZGVyQm9va21hcmsgY2xhc3MgaW5jbHVkZXMgYSBjb25zdHJ1Y3RvciB0aHJvdWdoIHdoaWNoIHlvdSB3aWxsCisgKiBpbnNlcnQgeW91ciBib29rbWFyaydzIGNvbnRlbnQuIEl0IGFsc28gaW5jbHVkZXMgZ2V0IGFuZCBzZXQgbWV0aG9kcworICogeW91IGNhbiB1c2UgdG8gcmV0cmlldmUgYW5kIGNoYW5nZSB0aGUgY29udGVudC4KKyAqLworc3RhdGljIGNsYXNzIE9yZGVyQm9va21hcmsgZXh0ZW5kcyBYbWxDdXJzb3IuWG1sQm9va21hcmsgeworICAgIHB1YmxpYyBPcmRlckJvb2ttYXJrIChTdHJpbmcgdGV4dCkgeyBURVhUID0gdGV4dDsgfQorICAgIHB1YmxpYyBTdHJpbmcgVEVYVDsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7IHJldHVybiBURVhUOyB9CisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgeyBURVhUID0gbmV3VGV4dDsgfQorfQorPC9QUkU+CisgIDxwPllvdSBjYW4gdXNlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRvIHN0b3JlIGJvb2ttYXJrcyBhdCBwbGFjZXMgaW4geW91cgorICAgIFhNTC4gVGhlIGZvbGxvd2luZyBleGNlcnB0IG9mIGNvZGUgY3JlYXRlcyBhIGN1cnNvciBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlCisgICAgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPk9yZGVyQm9va21hcms8L3NwYW4+IGNsYXNzLiBUaGVuIGl0IHVzZXMgdGhlIGN1cnNvcgorICAgIHRvIGluc2VydCB0aGUgYm9va21hcmsgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnQgbG9jYXRpb24uPC9wPgorICA8cHJlPgorICAgIFhtbEN1cnNvciBvcmRlckN1cnNvciA9IHhtbERvYy5uZXdDdXJzb3IoKTsKKyAgICBPcmRlckJvb2ttYXJrIHRoaXNCb29rbWFyayA9IG5ldyBPcmRlckJvb2ttYXJrKCJmb28iKTsKKyAgICBvcmRlckN1cnNvci5zZXRCb29rbWFyayh0aGlzQW5ub3RhdGlvbik7Cis8L3ByZT4KKyAgPHAgY2xhc3M9cmVsYXRlZHRvcGljcz5SZWxhdGVkIFRvcGljczwvcD4KKyAgPHA+PGEgaHJlZj0iY29uTmF2aWdhdGluZ1hNTHdpdGhDdXJzb3JzLmh0bWwiPk5hdmlnYXRpbmcgWE1MIHdpdGggQ3Vyc29yczwvYT48L3A+Cis8L2Rpdj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL2RvY3MvZ3VpZGUvY29uWE1MQmVhbnNTdXBwb3J0QnVpbHRJblNjaGVtYVR5cGVzLmh0bWwgYi92MS9kb2NzL2d1aWRlL2NvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmRiMTYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2d1aWRlL2NvblhNTEJlYW5zU3VwcG9ydEJ1aWx0SW5TY2hlbWFUeXBlcy5odG1sCkBAIC0wLDAgKzEsMzQzIEBACis8IWRvY3R5cGUgSFRNTCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiI+CisKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImRvY3RpdGxlIiAtLT4KKzx0aXRsZT5KYXZhIFR5cGVzIGZvciBYTUwgU2NoZW1hPC90aXRsZT4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzwhLS0oTWV0YSk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0kQ0hBUlNFVDsiPgorCisKKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9Im1ldGF0YWdzIiAtLT4KKworPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJ5b3VyIG5hbWUiPgorPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGVzY3JpcHRpb24gb2YgdGhlIHRvcGljIGNvbnRlbnRzLiI+Cis8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0ia2V5d29yZHMgdG8gaGVscCBpbiBzZWFyY2hlcyI+Cis8bWV0YSBuYW1lPSJkYXRlIGxhc3QgbW9kaWZpZWQiIGNvbnRlbnQ9IjEwLzI1LzAyIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKworPCEtLShMaW5rcyk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzwhLS0gSW5zdGFuY2VCZWdpbkVkaXRhYmxlIG5hbWU9ImhlYWQiIC0tPgorPGxpbmsgaHJlZj0iLi4veG1sYmVhbnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKzwhLS0gSW5zdGFuY2VFbmRFZGl0YWJsZSAtLT4KKzxsaW5rIGhyZWY9Ii4uL3htbGJlYW5zLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8YSBocmVmPSIuLi8uLi8uLi9jb3JlL2luZGV4Lmh0bWwiIGlkPSJpbmRleCI+PC9hPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL3RvcGljSW5mby5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9Ii4uLy4uLy4uL2NvcmUvQ29va2llQ2xhc3MuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSIuLi8uLi8uLi9jb3JlL2Rpc3BsYXlDb250ZW50LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPCEtLShCb2R5KT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzxib2R5PgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPCEtLSBJbnN0YW5jZUJlZ2luRWRpdGFibGUgbmFtZT0iYm9keSIgLS0+Cis8aDE+IFhNTEJlYW5zIFN1cHBvcnQgZm9yIEJ1aWx0LUluIFNjaGVtYSBUeXBlczwvaDE+Cis8cD5KdXN0IGFzIHdpdGggdHlwZXMgaW4gWE1MIHNjaGVtYSwgdGhlIFhNTEJlYW5zIHR5cGVzIGJhc2VkIG9uIHNjaGVtYSBhcmUgYXJyYW5nZWQKKyAgaW4gYSBoaWVyYXJjaHkuIEluIGdlbmVyYWwsIHRoZSBoaWVyYXJjaHkgb2YgWE1MQmVhbiB0eXBlcyBtaXJyb3JzIHRoZSBoaWVyYXJjaHkKKyAgb2YgdGhlIHNjaGVtYSB0eXBlcyB0aGVtc2VsdmVzLiBYTUwgc2NoZW1hIHR5cGVzIGFsbCBpbmhlcml0IGZyb20gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPnhzOmFueVR5cGU8L3NwYW4+CisgICh3aGljaCBpcyBhdCB0aGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5KTsgWE1MQmVhbnMgdHlwZXMgaW5oZXJpdCBmcm9tIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+LjwvcD4KKzxwPkluIFhNTCBzY2hlbWEsIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czphbnlUeXBlPC9zcGFuPiBpcyB0aGUgcm9vdCB0eXBlCisgIGZvciB0d28gdHlwZSBjYXRlZ29yaWVzOiBidWlsdC1pbiBhbmQgdXNlci1kZXJpdmVkLiBCdWlsdC1pbiBzY2hlbWEgdHlwZXMgYXJlCisgIGNvbW1vbiB0eXBlcyBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hIHNwZWNpZmljYXRpb24uIFVzZXItZGVyaXZlZCB0eXBlcyBhcmUKKyAgdGhvc2UgeW91IGRlZmluZSBpbiB5b3VyIHNjaGVtYS4gVGhpcyB0b3BpYyBsaXN0cyB0aGUgYnVpbHQtaW4gdHlwZXMgcHJvdmlkZWQKKyAgd2l0aCBYTUxCZWFucy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHVzZXItZGVyaXZlZCB0eXBlcyBhbmQgdGhlIEphdmEgdHlwZXMgZ2VuZXJhdGVkCisgIGZyb20gdGhlbSwgc2VlIDxhIGhyZWY9ImNvbkphdmFUeXBlc0dlbmVyYXRlZEZyb21Vc2VyRGVyaXZlZC5odG1sIj5KYXZhIFR5cGVzIEdlbmVyYXRlZAorICBmcm9tIFVzZXItRGVyaXZlZCBTY2hlbWEgVHlwZXM8L2E+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgZmlndXJlIGlsbHVzdHJhdGVzIHRoZSBoaWVyYXJjaHkgb2YgdHlwZXMsIHNob3dpbmcgYm90aCBidWlsdC1pbgorICBzY2hlbWEgdHlwZXMgYW5kIHRoZWlyIFhNTEJlYW5zIHBhcmFsbGVscy4gTm90aWNlLCB0b28sIHRoYXQgbmVhcmx5IGFsbCBvZiB0aGUKKyAgYnVpbHQtaW4gdHlwZXMgYXJlIGFsc28gYXZhaWxhYmxlIGFzIG5hdHVyYWwgSmF2YSB0eXBlcy48L3A+Cis8cD48aW1nIHNyYz0iLi4vaW1hZ2VzL2NvblhNTFR5cGVIaWVyYXJjaHkuZ2lmIiB3aWR0aD0iODY1IiBoZWlnaHQ9Ijg4NyI+IDwvcD4KKzxoMT5KYXZhIFR5cGVzIFJlcHJlc2VudGluZyBCdWlsdC1JbiBTY2hlbWEgVHlwZXM8L2gxPgorPHA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgZmlndXJlIGFib3ZlLCBhbGwgNDYgYnVpbHQtaW4gc2NoZW1hIHR5cGVzIGFyZSByZXByZXNlbnRlZAorICBieSBhbiBYTUxCZWFuIHR5cGUgcHJvdmlkZWQgd2l0aCBYTUxCZWFucy4gV2hlbiB1c2luZyBidWlsdC1pbiBYTUxCZWFuIHR5cGVzLAorICBrZWVwIGluIG1pbmQgdGhhdDo8L3A+Cis8dWw+CisgIDxsaT4gU2luY2UgPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbE9iamVjdDwvc3Bhbj4gY29ycmVzcG9uZHMgdG8gdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj54czphbnlUeXBlPC9zcGFuPiwKKyAgICBhbGwgSmF2YSBYTUxCZWFuIHR5cGVzIGluaGVyaXQgZnJvbSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sT2JqZWN0PC9zcGFuPi4KKyAgICBUaGVyZWZvcmUgYWxsIFhNTEJlYW4gdHlwZXMgc2hhcmUgdGhlIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxPYmplY3Q8L3NwYW4+CisgICAgaW50ZXJmYWNlknMgYWJpbGl0eSB0byBjcmVhdGUgYW4gPHNwYW4gY2xhc3M9ImxhbmdpbmxpbmUiPlhtbEN1cnNvcjwvc3Bhbj4KKyAgICBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIG9iamVjdC4gVGhleSBjYW4gYWxzbyByZW5kZXIgdGhlIFhNTCBhcyBzdHJpbmdzIG9yCisgICAgc3RyZWFtcy4KKyAgPGxpPgorICAgIDxkaXY+V2hlcmUgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG5hdHVyYWwgSmF2YSB0eXBlLCB0aGUgWE1MQmVhbnMgdHlwZSBwcm92aWRlcworICAgICAgYSB3YXkgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIFhNTCdzIHZhbHVlIGFzIHRoZSBuYXR1cmFsIHR5cGUuIFNlZSB0aGUgdGFibGUKKyAgICAgIGluIHRoaXMgdG9waWMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBuYXR1cmFsIEphdmEgdHlwZXMgbWFwIHRvIFhNTEJlYW5zCisgICAgICB0eXBlcy4gPC9kaXY+CisKKyAgPGxpPiBWYWx1ZXMgYXNzaWduZWQgdG8gYnVpbHQtaW4gWE1MQmVhbnMgdHlwZXMgYXJlIHZhbGlkYXRlZCBpbiBrZWVwaW5nIHdpdGgKKyAgICB0aGUgcnVsZXMgb2YgdGhlIHNjaGVtYSB0eXBlIHRoZXkgcmVwcmVzZW50LiBTbywgZm9yIGV4YW1wbGUsIGFuIGF0dGVtcHQgdG8KKyAgICBhc3NpZ24gYSBuZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIHRvIGFuIDxzcGFuIGNsYXNzPSJsYW5naW5saW5lIj5YbWxQb3NpdGl2ZUludGVnZXI8L3NwYW4+CisgICAgd2lsbCB0aHJvdyBhbiA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+WG1sVmFsdWVPdXRPZlJhbmdlPC9zcGFuPiBleGNlcHRpb24uPC9saT4KKzwvdWw+Cis8ZGl2PgorICA8cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBidWlsdC1pbiBzY2hlbWEgdHlwZXMsIGFsb25nIHdpdGggdGhlaXIgWE1MQmVhbnMKKyAgICBhbmQgbmF0dXJhbCBKYXZhIHBhcmFsbGVscy4gVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgbmF0dXJhbCBKYXZhIHR5cGVzIGFyZQorICAgIGluIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+amF2YS5sYW5nPC9zcGFuPiBwYWNrYWdlOyBYTUxCZWFuIHR5cGVzIGFyZQorICAgIGluIHRoZSA8c3BhbiBjbGFzcz0ibGFuZ2lubGluZSI+b3JnLmFwYWNoZS54bWxiZWFuczwvc3Bhbj4gcGFja2FnZS48L3A+Cis8L2Rpdj4KKzxkaXYgaWQ9InRvcGljdGV4dCI+CisgIDx0YWJsZT4KKyAgICA8dHI+CisgICAgICA8dGQgd2lkdGg9IjMwJSI+PHN0cm9uZz5CdWlsdC1JbiBTY2hlbWEgVHlwZTwvc3Ryb25nPjwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjMxJSI+PHN0cm9uZz5YTUxCZWFuIFR5cGU8L3N0cm9uZz48L3RkPgorICAgICAgPHRkIHdpZHRoPSIzOSUiPjxzdHJvbmc+TmF0dXJhbCBKYXZhIFR5cGU8L3N0cm9uZz48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnhzOmFueVR5cGU8L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5odG1sIj5YbWxPYmplY3Q8L2E+PC90ZD4KKyAgICAgIDx0ZD4gPGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0Lmh0bWwiPm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0PC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R0LWFueVNpbXBsZVR5cGUiIHRhcmdldD0iX2JsYW5rIj54czphbnlTaW1wbGVUeXBlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55U2ltcGxlVHlwZS5odG1sIj5YbWxBbnlTaW1wbGVUeXBlPC9hPjwvdGQ+CisgICAgICA8dGQ+IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYW55VVJJIiB0YXJnZXQ9Il9ibGFuayI+eHM6YW55VVJJPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmh0bWwiPlhtbEFueVVSSTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYmFzZTY0QmluYXJ5IiB0YXJnZXQ9Il9ibGFuayI+eHM6YmFzZTY0QmluYXJ5PC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5Lmh0bWwiPlhtbEJhc2U2NEJpbmFyeTwvYT48L3RkPgorICAgICAgPHRkPmJ5dGVbXTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Jvb2xlYW4iIHRhcmdldD0iX2JsYW5rIj54czpib29sZWFuPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQm9vbGVhbi5odG1sIj5YbWxCb29sZWFuPC9hPjwvdGQ+CisgICAgICA8dGQ+Ym9vbGVhbjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2J5dGUiIHRhcmdldD0iX2JsYW5rIj54czpieXRlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQnl0ZS5odG1sIj5YbWxCeXRlPC9hPjwvdGQ+CisgICAgICA8dGQ+Ynl0ZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgaGVpZ2h0PSIxNyI+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGUiIHRhcmdldD0iX2JsYW5rIj54czpkYXRlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5odG1sIj5YbWxEYXRlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZGF0ZVRpbWU8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlVGltZS5odG1sIj5YbWxEYXRlVGltZTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZGVjaW1hbDwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuaHRtbCI+WG1sRGVjaW1hbDwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL21hdGgvQmlnRGVjaW1hbC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS5tYXRoLkJpZ0RlY2ltYWw8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZG91YmxlIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZG91YmxlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG91YmxlLmh0bWwiPlhtbERvdWJsZTwvYT48L3RkPgorICAgICAgPHRkPmRvdWJsZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIiB0YXJnZXQ9Il9ibGFuayI+eHM6ZHVyYXRpb248L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5odG1sIj5YbWxEdXJhdGlvbjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5odG1sIj5vcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVElFUyIgdGFyZ2V0PSJfYmxhbmsiPnhzOkVOVElUSUVTPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRU5USVRJRVMuaHRtbCI+WG1sRU5USVRJRVM8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSIgdGFyZ2V0PSJfYmxhbmsiPnhzOkVOVElUWTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUWS5odG1sIj5YbWxFTlRJVFk8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2Zsb2F0IiB0YXJnZXQ9Il9ibGFuayI+eHM6ZmxvYXQ8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5odG1sIj5YbWxGbG9hdDwvYT48L3RkPgorICAgICAgPHRkPmZsb2F0PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ0RheSIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdEYXk8L2E+PC90ZD4KKyAgICAgIDx0ZD48cD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5Lmh0bWwiPlhtbEdEYXk8L2E+PC9wPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdNb250aDwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdNb250aC5odG1sIj5YbWxHTW9udGg8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ01vbnRoRGF5IiB0YXJnZXQ9Il9ibGFuayI+eHM6Z01vbnRoRGF5PC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5Lmh0bWwiPlhtbEdNb250aERheTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvQ2FsZW5kYXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEudXRpbC5DYWxlbmRhcjwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhciIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdZZWFyPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuaHRtbCI+WG1sR1llYXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXJNb250aCIgdGFyZ2V0PSJfYmxhbmsiPnhzOmdZZWFyTW9udGg8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhck1vbnRoLmh0bWwiPlhtbEdZZWFyTW9udGg8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS91dGlsL0NhbGVuZGFyLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5qYXZhLnV0aWwuQ2FsZW5kYXI8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaGV4QmluYXJ5IiB0YXJnZXQ9Il9ibGFuayI+eHM6aGV4QmluYXJ5PC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSGV4QmluYXJ5Lmh0bWwiPlhtbEhleEJpbmFyeTwvYT48L3RkPgorICAgICAgPHRkPmJ5dGVbXTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEIiB0YXJnZXQ9Il9ibGFuayI+eHM6SUQ8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRC5odG1sIj5YbWxJRDwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiIHRhcmdldD0iX2JsYW5rIj54czpJRFJFRjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmh0bWwiPlhtbElEUkVGPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiIHRhcmdldD0iX2JsYW5rIj54czpJRFJFRlM8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuaHRtbCI+WG1sSURSRUZTPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnQiIHRhcmdldD0iX2JsYW5rIj54czppbnQ8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnQuaHRtbCI+WG1sSW50PC9hPjwvdGQ+CisgICAgICA8dGQ+aW50PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOmludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmh0bWwiPlhtbEludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIiB0YXJnZXQ9Il9ibGFuayI+eHM6bGFuZ3VhZ2U8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5odG1sIj5YbWxMYW5ndWFnZTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbG9uZyIgdGFyZ2V0PSJfYmxhbmsiPnhzOmxvbmc8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMb25nLmh0bWwiPlhtbExvbmc8L2E+PC90ZD4KKyAgICAgIDx0ZD5sb25nPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5hbWU8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOYW1lLmh0bWwiPlhtbE5hbWU8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5DTmFtZTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5DTmFtZS5odG1sIj5YbWxOQ05BTUU8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOm5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5lZ2F0aXZlSW50ZWdlci5odG1sIj5YbWxOZWdhdGl2ZUludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU4iIHRhcmdldD0iX2JsYW5rIj54czpOTVRPS0VOPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTi5odG1sIj5YbWxOTVRPS0VOPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOUyIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5NVE9LRU5TPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuaHRtbCI+WG1sTk1UT0tFTlM8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vbk5lZ2F0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOm5vbk5lZ2F0aXZlSW50ZWdlcjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5odG1sIj5YbWxOb25OZWdhdGl2ZUludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vblBvc2l0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOm5vblBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vblBvc2l0aXZlSW50ZWdlci5odG1sIj5YbWxOb25Qb3NpdGl2ZUludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciIHRhcmdldD0iX2JsYW5rIj54czpub3JtYWxpemVkU3RyaW5nPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9ybWFsaXplZFN0cmluZy5odG1sIj5YbWxOb3JtYWxpemVkU3RyaW5nPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvYXBpL2phdmEvbGFuZy9TdHJpbmcuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlN0cmluZzwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOT1RBVElPTiIgdGFyZ2V0PSJfYmxhbmsiPnhzOk5PVEFUSU9OPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uaHRtbCI+WG1sTk9UQVRJT048L2E+PC90ZD4KKyAgICAgIDx0ZD4gTm90IHN1cHBvcnRlZDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciIgdGFyZ2V0PSJfYmxhbmsiPnhzOnBvc2l0aXZlSW50ZWdlcjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5odG1sIj5YbWxQb3NpdGl2ZUludGVnZXI8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI1FOYW1lIiB0YXJnZXQ9Il9ibGFuayI+eHM6UU5hbWU8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxRTmFtZS5odG1sIj5YbWxRTmFtZTwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS8xLjQvZG9jcy9hcGkvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTwvYT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCIgdGFyZ2V0PSJfYmxhbmsiPnhzOnNob3J0PC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2hvcnQuaHRtbCI+WG1sU2hvcnQ8L2E+PC90ZD4KKyAgICAgIDx0ZD5zaG9ydDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyIgdGFyZ2V0PSJfYmxhbmsiPnhzOnN0cmluZzwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFN0cmluZy5odG1sIj5YbWxTdHJpbmc8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9hcGkvamF2YS9sYW5nL1N0cmluZy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+U3RyaW5nPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiIHRhcmdldD0iX2JsYW5rIj54czp0aW1lPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5odG1sIj5YbWxUaW1lPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC9DYWxlbmRhci5odG1sIiB0YXJnZXQ9Il9ibGFuayI+amF2YS51dGlsLkNhbGVuZGFyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIiB0YXJnZXQ9Il9ibGFuayI+eHM6dG9rZW48L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSIuLi9yZWZlcmVuY2Uvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlbi5odG1sIj5YbWxUb2tlbjwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2FwaS9qYXZhL2xhbmcvU3RyaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5TdHJpbmc8L2E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIiB0YXJnZXQ9Il9ibGFuayI+eHM6dW5zaWduZWRCeXRlPC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmh0bWwiPlhtbFVuc2lnbmVkQnl0ZTwvYT48L3RkPgorICAgICAgPHRkPnNob3J0PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRJbnQiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZEludDwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkSW50Lmh0bWwiPlhtbFVuc2lnbmVkSW50PC9hPjwvdGQ+CisgICAgICA8dGQ+bG9uZzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkTG9uZyIgdGFyZ2V0PSJfYmxhbmsiPnhzOnVuc2lnbmVkTG9uZzwvYT48L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5odG1sIj5YbWxVbnNpZ25lZExvbmc8L2E+PC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvamF2YS9tYXRoL0JpZ0ludGVnZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmphdmEubWF0aC5CaWdJbnRlZ2VyPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkU2hvcnQiIHRhcmdldD0iX2JsYW5rIj54czp1bnNpZ25lZFNob3J0PC9hPjwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iLi4vcmVmZXJlbmNlL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5odG1sIj5YbWxVbnNpZ25lZFNob3J0PC9hPjwvdGQ+CisgICAgICA8dGQ+aW50PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorPC9kaXY+Cis8ZGl2PgorICA8cCBjbGFzcz0icmVsYXRlZHRvcGljcyI+UmVsYXRlZCBUb3BpY3M8L3A+CisgIDxwPjxhIGhyZWY9ImNvbkdldHRpbmdTdGFydGVkd2l0aFhNTEJlYW5zLmh0bWwiPkdldHRpbmcgU3RhcnRlZCB3aXRoIFhNTEJlYW5zPC9hPjwvcD4KKzwvZGl2PgorPCEtLSBJbnN0YW5jZUVuZEVkaXRhYmxlIC0tPgorPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisKKzwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9pbWFnZXMvY29uQ3Vyc29yVG9rZW5Mb2NhdGlvbnMuZ2lmIGIvdjEvZG9jcy9pbWFnZXMvY29uQ3Vyc29yVG9rZW5Mb2NhdGlvbnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNjZkMzgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL2ltYWdlcy9jb25DdXJzb3JUb2tlbkxvY2F0aW9ucy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYgYi92MS9kb2NzL2ltYWdlcy9jb25YTUxUeXBlSGllcmFyY2h5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzBjMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvZG9jcy9pbWFnZXMvY29uWE1MVHlwZUhpZXJhcmNoeS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdjEvZG9jcy9zdHlsZXNoZWV0LmNzcyBiL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZDgwMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL2RvY3Mvc3R5bGVzaGVldC5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyogSmF2YWRvYyBzdHlsZSBzaGVldCAqLworCisvKiBEZWZpbmUgY29sb3JzLCBmb250cyBhbmQgb3RoZXIgc3R5bGUgYXR0cmlidXRlcyBoZXJlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyAqLworCisvKiBQYWdlIGJhY2tncm91bmQgY29sb3IgKi8KK2JvZHkgeyAJCisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRiAKK30KKworYm9keSB7CisvKglwYWRkaW5nOiAwcHggMHB4IDBweCAxNXB4OyAqLworCWJhY2tncm91bmQ6ICNmZmZmZmY7CisJY29sb3I6ICMwMDAwMDsKKwlmb250LXNpemU6IDgwJTsKK30KKworLyogVGFibGUgY29sb3JzICovCisuVGFibGVIZWFkaW5nQ29sb3IgICAgIHsgYmFja2dyb3VuZDogI0NDQ0NGRiB9IC8qIERhcmsgbWF1dmUgKi8KKy5UYWJsZVN1YkhlYWRpbmdDb2xvciAgeyBiYWNrZ3JvdW5kOiAjRUVFRUZGIH0gLyogTGlnaHQgbWF1dmUgKi8KKy5UYWJsZVJvd0NvbG9yICAgICAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGIH0gLyogV2hpdGUgKi8KKworLyogRm9udCB1c2VkIGluIGxlZnQtaGFuZCBmcmFtZSBsaXN0cyAqLworLkZyYW1lVGl0bGVGb250ICAgeyBmb250LXNpemU6IDEwcHRzOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2FuLXNlcmlmIH0KKy5GcmFtZUhlYWRpbmdGb250IHsgZm9udC1zaXplOiAxMHB0czsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbi1zZXJpZiB9CisuRnJhbWVJdGVtRm9udCAgICB7IGZvbnQtc2l6ZTogMTBwdHM7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW4tc2VyaWYgfQorCisvKiBFeGFtcGxlIG9mIHNtYWxsZXIsIHNhbnMtc2VyaWYgZm9udCBpbiBmcmFtZXMgKi8KKy8qIC5GcmFtZUl0ZW1Gb250ICB7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfSAqLworCisvKiBOYXZpZ2F0aW9uIGJhciBmb250cyBhbmQgY29sb3JzICovCisuTmF2QmFyQ2VsbDEgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiNFRUVFRkY7fS8qIExpZ2h0IG1hdXZlICovCisuTmF2QmFyQ2VsbDFSZXYgeyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwOEI7fS8qIERhcmsgQmx1ZSAqLworLk5hdkJhckZvbnQxICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiMwMDAwMDA7fQorLk5hdkJhckZvbnQxUmV2IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiNGRkZGRkY7fQorCisuTmF2QmFyQ2VsbDIgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30KKy5OYXZCYXJDZWxsMyAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGRkY7fQorCmRpZmYgLS1naXQgYS92MS9kb2NzL3htbGJlYW5zLmNzcyBiL3YxL2RvY3MveG1sYmVhbnMuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjIwNjEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9kb2NzL3htbGJlYW5zLmNzcwpAQCAtMCwwICsxLDQ4MiBAQAorLyogIFRoZSBzdHlsZXMgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZCBhcmU6CisJLSBUaXRsZTogVGhlIHRpdGxlIG9mIHRoZSB0b3BpYworCS0gaDEsIGgyLCBoMzogRmlyc3QsIHNlY29uZCwgYW5kIHRoaXJkLWxldmVsIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljCisJLSByZWxhdGVkVG9waWNzOiBSZWxhdGVkIFRvcGljcworCS0gcHJvY1RpdGxlOiBXaXRoaW4gSG93IERvIEk6Li4uIHRvcGljcywgZm9yIGhlYWRpbmdzIHdpdGhpbiB0aGUgYm9keSBvZiBhIHRvcGljIHRoYXQgYXJlIGZvbGxvd2VkIGJ5CisJICBidWxsZXRlZCBwcm9jZWR1cmVzICgiVG8gZG8gdGhpcyIpLgorCS0gcHJlOiBGb3IgY29kZSBibG9ja3MKKwktIGxhbmdpbmxpbmU6IEZvciBjb2RlIGZyYWdtZW50cyB3aXRoaW4gYSAobm9uLWNvZGUpIHJlZ3VsYXIgc2VjdGlvbi4KKwktIG5vdGVwYXJhOiBOb3RlcwkgCisqLworaDEsCitoMiwKK2gzLAoraDQsCitoNSwKK3AsCitwcm9jdGl0bGUsCityZWxhdGVkdG9waWNzIHsKKwlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKwljb2xvcjogIzAwMDAwMDsKK30KKworLyogVXNlIGgxIGZvciBhbGwgZmlyc3QtbGV2ZWwgaGVhZGluZ3Mgd2l0aGluIHRoZSBib2R5IG9mIGEgdG9waWMuIAorICAgRm9yIHRoZSB0b3BpYyB0aXRsZSwgdXNlIHRoZSBUaXRsZSBzdHlsZS4gKi8KK2gxIHsKKwlmb250LXNpemU6IDEzNSU7CisJbWFyZ2luLXRvcDogLjVlbTsKKwltYXJnaW4tYm90dG9tOiAuNWVtOworfQorCisvKiBVc2UgaDIgZm9yIGFsbCBzZWNvbmQtbGV2ZWwgaGVhZGluZ3MuICovCitoMiB7CisJZm9udC1zaXplOiAxMjUlOworCW1hcmdpbi10b3A6IDFlbTsKKwltYXJnaW4tYm90dG9tOiAuNmVtOworfQorCisvKiBVc2UgaDMgZm9yIGFsbCB0aGlyZC1sZXZlbCBoZWFkaW5ncy4gKi8KK2gzIHsKKwlmb250LXNpemU6IDExMCU7CisJbWFyZ2luLXRvcDogMWVtOworCW1hcmdpbi1ib3R0b206IC42ZW07Cit9CisKKy8qIFVzZSBoNCBmb3IgYWxsIGZvdXJ0aC1sZXZlbCBoZWFkaW5ncy4gCisgICBOb3RlOiB0aGlzIHN0eWxlIGxvb2tzIGlkZW50aWNhbCB0byB0aGUgcmVsYXRlZHRvcGljcyBhbmQgcHJvY3RpdGxlIHN0eWxlcy4gKi8KK2g0IHsKKwlmb250LXNpemU6IDEwNSU7CisJbWFyZ2luLXRvcDogMWVtOworCW1hcmdpbi1ib3R0b206IC42ZW07Cit9CisKKy8qIFVzZSBoNSBmb3IgYWxsIGZpZnRoLWxldmVsIGhlYWRpbmcuICAKKyAgIEN1cnJlbnRseSwgdGhlcmUgYXJlIG5vIGg1cyBpbiB1c2UgaW4gdGhlIGRvY3VtZW50LiovCitoNSB7CisJZm9udC1zaXplOiAxMDAlOworCW1hcmdpbi10b3A6IDFlbTsKKwltYXJnaW4tYm90dG9tOiAuNmVtOworfQorCisvKiBVc2UgdGhlIFRpdGxlIHN0eWxlIGZvciB0aGUgdGl0bGUgb2YgYSB0b3BpYy4gKi8KK3AuVGl0bGUgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWZvbnQtc3R5bGU6IG5vcm1hbDsKKwlmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsKKwlmb250LXNpemU6IDE0MiU7Cit9CisKKy8qIFRoaXMgZGVwcmF0ZWQgdGFnIGNyZWF0ZXMgYSBkaXYgdGhhdCBkZXNpZ25hdGVzIHRoZSB0aXRsZS4gKi8KKyN0b3BpY3RpdGxlIHsKK30KKworLyogVGhpcyBkZXByZWNhdGVkIHRhZyBjcmVhdGVzIGEgZGl2ZSB0aGF0IGRlc2lnbmF0ZXMgYWxsIGJvZHkgdGV4dC4gKi8KKyN0b3BpY3RleHQgeworfQorCisvKiBVc2VkIGZvciBmaWd1cmUgY2FwdGlvbnMuKi8KK3AuYXJ0dGl0bGUgeworCWZvbnQtd2VpZ2h0OiBCb2xkOworfQorICAKKy8qIFRoZSBhdHRyaWJ1dGUgc3R5bGUgcmVzZW1ibGVzIHRoZSBuYXZ0aXRsZSBhbmQgcGFydGRlc2Mgc3R5bGVzIGluIHRoYXQgaXQga2VlcHMgdGhlIG5leHQgcGFyYWdyYXBoIAorICAgZmx1c2ggd2l0aCBpdC4gVXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIGF0dHJpYnV0ZXMgb2Ygc3ludGF4IGluIGEgcmVmZXJlbmNlIHRvcGljLgorICAgVGhlIGFyZ3VtZW50IHN0eWxlIHNob3VsZCBhbHdheXMgYmUgZm9sbG93ZWQgYnkgdGhlIHBhcnRkZXNjIHN0eWxlLiAqLworcC5hdHRyaWJ1dGUgeworCW1hcmdpbi10b3A6IC42ZW07CisJbWFyZ2luLWJvdHRvbTogMHB4OworCWZvbnQtd2VpZ2h0OiBCb2xkOworCQorfQorCisvKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KK2JvZHkgeworCXBhZGRpbmc6IDBweCAwcHggMHB4IDE1cHg7CisJYmFja2dyb3VuZDogI2ZmZmZmZjsKKwljb2xvcjogIzAwMDAwOworCWZvbnQtc2l6ZTogODAlOworCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOworfQorCisvKiBTdGFuZGFyZCBIVE1MIHRhZy4gKi8KK3NwYW4uYm9sZCB7CisJZm9udC13ZWlnaHQ6IEJvbGQ7Cit9CisKKy8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLworYmxvY2txdW90ZSB7CisJbWFyZ2luOiAwZW0gMGVtIDBlbSAyZW07CisJcGFkZGluZzogMHB4OworfQorCisvKiBVc2UgdGhlIGZpbGVwYXRoIHN0eWxlIHRvIGRlc2lnbmF0ZSBmaWxlIHBhdGhzLiBJdCBpcyBjdXJyZW50bHkgYSBtb25vc3BhY2UgZmlsZS4gKi8KK3NwYW4uZmlsZXBhdGggeworCWZvbnQ6IDEwMCUgQ291cmllciBOZXcgQ291cmllciBtb25vOworCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBtb25vc3BhY2U7Cit9CisKKy8qIFRoZSBsYW5naW5saW5lIHN0eWxlLCBsaWtlIHVzZXJpbnB1dCBhbmQgZmlsZXBhdGgsIGFsc28gcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS4gVXNlIHRoaXMKKyAgIHRvIGRlbm90ZSBhbnkgaW5kaXZpZHVhbCBpbnN0YW5jZSBvZiBjb2RlIGluIHRoZSBjb250ZXh0IG9mIG5vbi1jb2RlZCB0ZXh0LiBGb3IgZXhhbXBsZSwgCisgICB5b3Ugd291bGQgdXNlIHRoaXMgdG8gZGVub3RlIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2hlbiB5b3UncmUgZGVzY3JpYmluZyBpdCBpbiB0aGUgcGFyYWdyYXBoIHRoYXQKKyAgIHByZWNlZGVzIGEgY29kZSBzYW1wbGUuIFRvIGRlbm90ZSBhIGNvZGUgc2FtcGxlLCBob3dldmVyLCB1c2UgdGhlIDxwcmU+IHRhZy4gKi8KK3NwYW4ubGFuZ2lubGluZSB7CisJZm9udDogMTAwJSBDb3VyaWVyIE5ldyBDb3VyaWVyIG1vbm87CisJZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIG1vbm9zcGFjZTsKK30KKworLyogVGhlIGxpc3RwbGFpbiBzdHlsZSBuYXJyb3dzIHRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgZm9ybWF0dGVkIGxpbmUgYW5kIHRoZSBvbmUgYmVmb3JlIGl0LgorICAgSXQgaXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgc2Vjb25kIHBhcmFncmFwaCBpbiBhIGxpc3QgaXRlbSwgYWxvbmcgd2l0aCB0aGUgaW5kZW50IGFuZAorICAgdW5pbmRlbnQgYnV0dG9ucyBpbiBEcmVhbXdlYXZlci4gKi8KK3AubGlzdHBsYWluIHsKKwltYXJnaW4tdG9wOiAwLjdlbTsKKwltYXJnaW4tYm90dG9tOiAwOworCXBhZGRpbmc6IDBlbTsKK30KKworLyogQWxsIHRleHQgaW4gdGhlIG5hdnRpdGxlIHN0eWxlIHNob3VsZCBpbmNsdWRlIGEgbGluayB0byBhbm90aGVyIHRvcGljLgorICAgVGhlIG5hdnRpdGxlIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKKyAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgCisgICBJbmNsdWRlZCBpbiB0aGlzIFNlY3Rpb24iIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIAorICAgdGhlIHRvcGljcyBpbiB0aGF0IGNoYXB0ZXIsIGFsb25nIHdpdGggYSBicmllZiBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSdsbCBmaW5kIGluIGVhY2guIFVzZSB0aGUKKyAgIG5hdnRpdGxlIHN0eWxlIGZvciB0aGUgbGlua2VkIHRleHQuIEl0IGRpZmZlcnMgZnJvbSBhIG5vcm1hbCBwYXJhZ3JhcGggc3R5bGUgaW4gdGhhdCBpdCBkb2VzIG5vdCAKKyAgIGluY2x1ZGUgYW4gZXh0cmEgcGFyYWdyYXBoIGJyZWFrIGJldHdlZW4gdGhlIGxpbmsgYW5kIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAqLworcC5uYXZ0aXRsZSB7CisJbWFyZ2luLXRvcDogLjZlbTsKKwltYXJnaW4tYm90dG9tOiAwZW07Cit9CisKKy8qIFRoZSBuYXZkZXNjIHN0eWxlIGlzIHVzZWQgaW4gbmF2aWdhdGlvbmFsIG5vZGUgdG9waWNzLCBpbiBDbGFzcyByZWZlcmVuY2UKKyAgIHRvcGljcywgYW5kIGluIE1ldGhvZCByZWZlcmVuY2UgdG9waWNzLiBGb3IgZXhhbXBsZSwgaW4gdGhlICJUb3BpY3MgSW5jbHVkZWQgaW4gdGhpcyBTZWN0aW9uIiAKKyAgIHNlY3Rpb24gb2YgYSBuYXZpZ2F0aW9uIHRvcGljLCB5b3UgaW5jbHVkZSB0aGUgbGlua3MgdG8gYWxsIG9mIHRoZSB0b3BpY3MgaW4gdGhhdCBjaGFwdGVyLAorICAgYWxvbmcgd2l0aCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91J2xsIGZpbmQgaW4gZWFjaC4gVXNlIHRoaXMgc3R5bGUgZm9yIHRoZSBkZXNjcmlwdGl2ZSB0ZXh0LiAKKyAgIEl0IGluZGVudHMgdGhlIHRleHQgb25lIHRhYiBzdG9wIGFuZCBrZWVwcyB0aGUgbWFyZ2luIGJldHdlZW4gdGhpcyBzdHlsZSBhbmQgdGhlIG5hdnRpdGxlIHN0eWxlIHNtYWxsLiAgKi8KK3AubmF2ZGVzYyB7CisJbWFyZ2luLWJvdHRvbTogMWVtOworCW1hcmdpbi1sZWZ0OiAxLjllbTsKKwltYXJnaW4tdG9wOiAwZW07Cit9CisKKy8qIFRoZSBub3RlcGFyYSBzdHlsZSBpbmRlbnRzIHlvdXIgdGV4dCB0byB0aGUgdGFiIHN0b3AgZm9yIG5vdGUKKyAgIHRleHQuIFlvdSBzaG91bGQgYWx3YXlzIGJlZ2luIE5vdGUgdGV4dCB3aXRoIHRoZSB3b3JkICJOb3RlOiIgaW4KKyAgIGJvbGRmYWNlLiAqLworcC5ub3RlcGFyYSB7CisJbWFyZ2luLWxlZnQ6IDJlbTsKKwltYXJnaW4tcmlnaHQ6IDJlbTsKKwltYXJnaW4tYm90dG9tOiAxLjVlbTsKK30KKworLyogVGhlIHBhcnRuYW1lIHN0eWxlIHJlc2VtYmxlcyB0aGUgbmF2dGl0bGUgc3R5bGUgaW4gdGhhdCBpdCBrZWVwcyB0aGUgbmV4dCBwYXJhZ3JhcGggZmx1c2ggd2l0aCBpdC4gCisgICBZb3UgdXNlIGl0IHdoZW4geW91IGxpc3QgdGhlIHBhcmFtZXRlcnMgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIAorICAgZ2xvc3NhcnkgdG8gZGVzaWduYXRlIGdsb3NzYXJ5IGVudHJpZXMuIEl0IHJlbmRlcnMgdGV4dCBpdGFsaWMuCisgICBUaGUgcGFydG5hbWUgc3R5bGUgc2hvdWxkIGFsd2F5cyBiZSBmb2xsb3dlZCBieSB0aGUgcGFydGRlc2Mgc3R5bGUuKi8KK3AucGFydG5hbWUgeworCW1hcmdpbi10b3A6IC42ZW07CisJbWFyZ2luLWJvdHRvbTogMHB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLyogVXNlIHRoZSBwYXJ0ZGVzYyBzdHlsZSB3aGVuIHlvdSBkZXNjcmliZSB0aGUgZnVuY3Rpb24gb2YgdGhlIHByb3BlcnRpZXMsIHBhcmFtZXRlcnMsIG9yIGV4Y2VwdGlvbnMgCisgICBsaXN0ZWQgaW4gYSByZWZlcmVuY2UgdG9waWMuIEl0IGlzIGFsc28gdXNlZCBjdXJyZW50bHkgaW4gdGhlIGdsb3NzYXJ5IHRvIGRlc2lnbmF0ZSBnbG9zc2FyeSAKKyAgIGRlZmluaXRpb25zLiBUaGUgc3R5bGUgaW5kZW50cyB0aGUgZGVzY3JpcHRpb24gc2xpZ2h0bHkuCisgICBUaGUgcGFydGRlc2Mgc3R5bGUgc2hvdWxkIGFsd2F5cyBmb2xsb3cgdGhlIHBhcnRuYW1lIG9yIGF0dHJpYnV0ZSBzdHlsZS4qLworcC5wYXJ0ZGVzYyB7CisJbWFyZ2luLWJvdHRvbTogMWVtOworCW1hcmdpbi1sZWZ0OiAxLjllbTsKKwltYXJnaW4tdG9wOiAwZW07CisKK30KKworLyogVGhlIHBvaW50IG9mIHRoZSBwcm9jdGl0bGUgc3R5bGUgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50IG9mIHRoZSByZWxhdGVkdG9waWNzIHN0eWxlLiAgCisgICBJdCBhcHBsaWVzIHRvIGFsbCBoZWFkaW5ncyB0aGF0IGJlZ2luIHdpdGggIlRvIFtkbyBzb21ldGhpbmddIi4gSXQgbG9va3MgaWRlbnRpY2FsIHRvIHRoZSBoNCBzdHlsZS4gICovCitwLnByb2N0aXRsZSB7CisJZm9udC1zaXplOiAxMTAlOworCW1hcmdpbi10b3A6IDFlbTsKKwltYXJnaW4tYm90dG9tOiAuNmVtOworCWZvbnQtd2VpZ2h0OiBCb2xkOworCit9CisKKy8qIFVzZSB0aGUgcmVsYXRlZHRvcGljcyBzdHlsZSwgZm9yIHRoZSB3b3JkcyAiUmVsYXRlZCBUb3BpY3MiIGF0IHRoZSBlbmQgb2YgYSB0b3BpYy4gCisgICBJdCBsb29rcyBpZGVudGljYWwgdG8gdGhlIGg0IHN0eWxlLiAqLworcC5yZWxhdGVkdG9waWNzIHsKKwlmb250LXNpemU6IDEyMCU7CisJbWFyZ2luLXRvcDogMWVtOworCW1hcmdpbi1ib3R0b206IC42ZW07CisJZm9udC13ZWlnaHQ6IEJvbGQ7Cit9CisKKy8qIFRoZSBzeW50YXggc3R5bGUgcmVuZGVycyB0ZXh0IGJvbGQuIFVzZSBpdCB0byBzdHlsZSBhbGwgc3ludGF4IGxpbmVzIHVuZGVyIHRoZQorICAgU3ludGF4IGhlYWRpbmcgb2YgcmVmZXJlbmNlIHRvcGljcy4gKi8KK3Auc3ludGF4IHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworCWxpbmUtaGVpZ2h0OiBub3JtYWw7CisJZm9udC13ZWlnaHQ6IEJvbGQ7Cit9CisKKy8qIFVzZSB0aGUgc3ludGF4aW5kZW50IHN0eWxlIHRvIGluZGVudCBzdWItcHJvcGVydGllcyBvZiBzeW50YXggZGVjbGFyYXRpb25zLiAqLworcC5zeW50YXhpbmRlbnQgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisJbGluZS1oZWlnaHQ6IG5vcm1hbDsKKwlmb250LXdlaWdodDogQm9sZDsKKwltYXJnaW4tbGVmdDogMS41ZW07CisJbWFyZ2luLXRvcDogMGVtOworCW1hcmdpbi1ib3R0b206IDBweDsKK30KKworCitwLmZpbGV1cmwgeworCWZvbnQtc2l6ZTogOHB0OworfQorCitwLm1vZGlmaWVkZGF0ZSB7CisJZm9udC1zaXplOiA4cHQ7Cit9CisKKy8qIFRoZSBzeW50YXhwYXJ0bmFtZSBjaGFyYWN0ZXIgc3R5bGUgcmVuZGVycyB0ZXh0IGl0YWxpYy4gVXNlIGl0IHRvIGRlc2lnbmF0ZSAKKyAgIHN5bnRheCBlbGVtZW50cyBpbiByZWZlcmVuY2UgdG9waWNzLiovCitzcGFuLnN5bnRheHBhcnRuYW1lIHsKKwlmb250LXN0eWxlOiBpdGFsaWM7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworLyogVGhlc2Ugc3BlY2lmaWNhdGlvbnMgZGljdGF0ZSB0aGUgbWFyZ2lucyBhbmQgd2lkdGggb2YgdGFibGVzLiAqLwordGFibGUgeworCXdpZHRoOiA5MCU7CisJbWFyZ2luLXRvcDogLjZlbTsKKwltYXJnaW4tYm90dG9tOiAuM2VtOworfQorCisvKiBUaGUgYmFja2dyb3VuZCBvZiBoZWFkZXIgY2VsbHMgaXMgZ3JleSwgYW5kIHRoZSB0ZXh0IGlzIGJvdHRvbS1hbGlnbmVkLiAqLwordGggeworCXBhZGRpbmctbGVmdDogOHB4OworCXBhZGRpbmctcmlnaHQ6IDhweDsKKwliYWNrZ3JvdW5kOiAjY2NjY2NjOworCXRleHQtYWxpZ246IGxlZnQ7CisJZm9udC1zaXplOiA4MCU7CisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CisJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKK30KKworLyogVGhlIHRleHQgaW4gbm9ybWFsIHRhYmxlIGNlbGxzIGlzIHRvcC1hbGlnbmVkLiAqLwordGQgeworCXBhZGRpbmctbGVmdDogOHB4OworCXBhZGRpbmctcmlnaHQ6IDhweDsKKwliYWNrZ3JvdW5kOiAjZmZmZmZmOworCXZlcnRpY2FsLWFsaWduOiB0b3A7CisJZm9udC1zaXplOiA4MCU7CisJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cit9CisKKy8qIFRoaXMgc3R5bGUgY3JlYXRlcyBzcGFjZSBhYm92ZSBhbmQgYmVsb3cgdGFibGUgdGV4dCBiZXR3ZWVuIHBhcmFncmFwaCBhbmQgdGhlIHRhYmxlIGJvcmRlcnMuICovCitwLnRhYmxldGV4dCB7CisJbWFyZ2luLXRvcDogLjZlbTsKKwltYXJnaW4tYm90dG9tOiAuNmVtOworfQorCisvKiBUaGUgZWRpdG9yIHVzZXMgdGhpcyBzdHlsZSB3aGVuIGNyZWF0aW5nIHRlbXBsYXRlIGd1aWRlcyB0byBkZXNpZ25hdGUgYSBzdHlsZSBhbm5vdGF0aW9uLiAKKyAgIFlvdSBwcm9iYWJseSB3b24ndCB3YW50IHRvIHVzZSBpdCBhbnl3aGVyZSBlbHNlIGluIHRoZSBndWlkZS4gKi8KK3NwYW4udGVtcGxhdGUgeworCWNvbG9yOiAjRkYwMEZGOwkKK30KKworYS50b2Mtbm9kZSB7CisJZm9udC1zaXplOjExcHg7CisJY29sb3I6MDAwMDAwOworCW1hcmdpbi1sZWZ0OiAwcHg7CisJbWFyZ2luLXRvcDogMHB4OworCW1hcmdpbi1ib3R0b206IDBweDsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIGZvbnQtZmFtaWx5OiBUYWhvbWE7CisgICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAgICAgICAgCit9CisKKy8qIFRoZSB1c2VyaW5wdXQgc3R5bGUgcmVuZGVycyB0ZXh0IG1vbm9zcGFjZS5Vc2UgdGhpcyBzdHlsZSB0byBoaWdobGlnaHQgdGV4dCB0aGF0IGEgdXNlciAKKyAgIHR5cGVzIGludG8gYSB0ZXh0IGZpZWxkLiAgKi8KK3NwYW4udXNlcmlucHV0IHsKKwlmb250OiAxMDAlIENvdXJpZXIgTmV3IENvdXJpZXIgbW9ubzsKKwlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOworfQorCisvKiBTdGFuZGFyZCBIVE1MIHRhZ3MuICovCit1bCwKK29sIHsKKwlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKKwlsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOworCWxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7CisJbWFyZ2luLXRvcDogMGVtOworCW1hcmdpbi1ib3R0b206IDBlbTsKK30KKworLyogU3RhbmRhcmQgSFRNTCB0YWcuICovCitvbCB7CisJbGlzdC1zdHlsZS10eXBlOiAxOworCW1hcmdpbi1sZWZ0OiAyZW07Cit9CisKKy8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLwordWwgeworCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKKwltYXJnaW4tbGVmdDogMS41ZW07Cit9CisKKy8qIFN0YW5kYXJkIEhUTUwgdGFnLiAqLworbGkgeworCW1hcmdpbi10b3A6IDEuM2VtOyAKKwltYXJnaW4tYm90dG9tOiAwZW07Cit9CisKK2E6bGluayB7CisJY29sb3I6ICMzMzY2Q0M7Cit9CithOmhvdmVyIHsKKwl4LXRleHQtdW5kZXJsaW5lOiBub3JtYWw7CisJLypiZWdpbiFrYWRvdnt7Ki8gdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IC8qfX1lbmQha2Fkb3YqLyAKK30KKworYTphY3RpdmUgeworCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKKwkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAorfQorCithOnZpc2l0ZWQgeworCWNvbG9yOiAjODAzMzgwOworfQorCithIHsKKwl4LXRleHQtdW5kZXJsaW5lOiBvZmY7CisJeC10ZXh0LW92ZXJsaW5lOiBvZmY7CisJeC10ZXh0LWxpbmUtdGhyb3VnaDogb2ZmOworCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZSBub25lIG5vbmU7IC8qfX1lbmQha2Fkb3YqLyAKK30KK2E6bGluayB7CisJY29sb3I6ICMzMzY2Q0M7Cit9CisKK2E6aG92ZXIgeworCXgtdGV4dC11bmRlcmxpbmU6IG5vcm1hbDsKKwkvKmJlZ2luIWthZG92e3sqLyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyp9fWVuZCFrYWRvdiovIAorfQorCithOmFjdGl2ZSB7CisJeC10ZXh0LXVuZGVybGluZTogbm9ybWFsOworCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKn19ZW5kIWthZG92Ki8gCit9CisKK2E6dmlzaXRlZCB7CisJY29sb3I6ICMwMDAwNjY7Cit9CisKK2Rpdi5mb290ZXIgeworfQorCisuYnV0dG9uY2xhc3MKK3sKKwlmb250LXNpemU6MTBweDsKKwloZWlnaHQ6MjBweDsKK30KKworLmZvcm1jbGFzcworeworCWZvbnQtc2l6ZToxMHB4OworCWhlaWdodDoxN3B4OworfQorCisKKworCisvKkRFUFJFQ0FURUQqLworcC5jb2RlYmxvY2sgeworCWZvbnQtc2l6ZTogMTAwJTsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworCWxpbmUtaGVpZ2h0OiAxZW07CisJeC10ZXh0LXRhYi1zdG9wczogcmVwZWF0IDFpbjsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworCWNvbG9yOiAjMDAwMDAwOworCWN1cnNvcjogdGV4dDsKKwlwYWRkaW5nLXJpZ2h0OiAxZW07CisJcGFkZGluZy1sZWZ0OiAxZW07CisJcGFkZGluZy10b3A6IDBlbTsKKwlwYWRkaW5nLWJvdHRvbTogMGVtOworCW1hcmdpbi1ib3R0b206IDBlbTsKKwltYXJnaW4tdG9wOiAwZW07CisJeC10ZXh0LXVuZGVybGluZTogT2ZmOworCS8qYmVnaW4ha2Fkb3Z7eyovIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLyp9fWVuZCFrYWRvdiovIAorfQorCisvKiBERVBSRUNBVEVEICovCitwLmJ1bGxldGluZGVudDEgeworCW1hcmdpbi1sZWZ0OiAxLjVlbTsKKwltYXJnaW4tdG9wOiAwOworCW1hcmdpbi1ib3R0b206IDA7Cit9CisKKy8qIERFUFJFQ0FURUQgKi8KK3AuYnVsbGV0aW5kZW50MiB7CisJbWFyZ2luLWxlZnQ6IDUuMWVtOworCW1hcmdpbi10b3A6IDA7CisJbWFyZ2luLWJvdHRvbTogMDsKK30KKworLyogREVQUkVDQVRFRCAqLworcC5idWxsZXRpbmRlbnQzIHsKKwltYXJnaW4tbGVmdDogNC4zZW07Cit9CisKKy8qIERFUFJFQ0FURUQgKi8KK3AuaW5kZW50MSB7CisJbWFyZ2luLWxlZnQ6IDEuNWVtOworCW1hcmdpbi1yaWdodDogMS45ZW07Cit9CisKKy8qIERFUFJFQ0FURUQgKi8KK3AuaW5kZW50MiB7CisJbWFyZ2luLWxlZnQ6IDIuOWVtOworCW1hcmdpbi1yaWdodDogMS45ZW07Cit9CisKKy8qIERFUFJFQ0FURUQgKi8KK3AuaW5kZW50MyB7CisJbWFyZ2luLWxlZnQ6IDQuM2VtOworCW1hcmdpbi1yaWdodDogMS45ZW07Cit9CisKKy8qIERFUFJFQ0FURUQgKi8KK3AubnVtYmVyZWRpbmRlbnQxIHsKKwltYXJnaW4tbGVmdDogMi4yZW07CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAwOworfQorCisvKiBERVBSRUNBVEVEICovCitwLm51bWJlcmVkaW5kZW50MiB7CisJbWFyZ2luLWxlZnQ6IDYuM2VtOworCW1hcmdpbi10b3A6IDA7CisJbWFyZ2luLWJvdHRvbTogMDsKK30KKworLyogREVQUkVDQVRFRCAqLworcC5udW1iZXJlZGluZGVudDMgeworCW1hcmdpbi1sZWZ0OiAxMC41ZW07CisJbWFyZ2luLXRvcDogMDsKKwltYXJnaW4tYm90dG9tOiAwOworfQkKKworLyogREVQUkVDQVRFRCAqLworcC50YWJsZXRpdGxlIHsKKwltYXJnaW4tbGVmdDogMDsKKwlmb250LXdlaWdodDogQm9sZDsKK30KKworCisvKiBUaGVzZSBzdHlsZXMgYXJlIHVzZWQgYnkgdGhlIHNlYXJjaCByZXN1bHRzIHBhZ2UgKi8KKworLnNlYXJjaC1ub2RlIHsKKwlmb250LXNpemU6MTBweDsKKwljb2xvcjowMDAwMDA7Cit9CisKK2Euc2VhcmNoLW5vZGUgeworCWZvbnQtc2l6ZToxMHB4OworCWNvbG9yOjAwMDAwMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwgYi92MS9kb2NzL3htbGJlYW50YXNrLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5YjFjYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL2RvY3MveG1sYmVhbnRhc2suaHRtbApAQCAtMCwwICsxLDMyMiBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAKKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8dGl0bGU+WE1MQmVhbiBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKyAgPGJvZHk+CisgICAgICAgICAgICAKKzxoMj48YSBuYW1lPSJ4bWxiZWFuIj5YTUxCZWFuPC9hPjwvaDI+CisgICAgICAgICAgIAorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKyAgICAgICAgICAgICAgCis8cD5Db21waWxlIGEgc2V0IG9mIFhTRHMgYW5kL29yIFdTRExzIGludG8geGJlYW5zLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcKKyBhbiBYTUxCZWFuIGphciBmcm9tIC5YU0QgYW5kIC5XU0RMIGZpbGVzLiAmbmJzcDtUaGUgdGFzayBjYW4gYWxzbyBnZW5lcmF0ZQorIHRoZSBzb3VyY2UgY29kZSB0aGF0IG1ha2VzIHVwIHRoZSB4YmVhbiB0eXBlIHN5c3RlbSBzcGVjaWZpZWQgYnkgdGhlIHNjaGVtYQorIGZpbGVzIGlmIGRlc2lyZWQuPC9wPgorICAgICAgICAgICAgICAKKzxwPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBhbiBleHRlcm5hbCBsaWJyYXJ5IG5vdCBpbmNsdWRlZCBpbgordGhlICBBbnQgZGlzdHJpYnV0aW9uIGNhbGxlZCB4YmVhbi5qYXIuICZuYnNwO0l0IGNhbiBiZSBmb3VuZCBpbiB0aGUgWE1MQmVhbnMKKyBkZXZlbG9wZXIga2l0IGF0IDxhCisgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLyI+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzwvYT4uIAorVGhlIGJ1aWxkIHNjcmlwdCB3aWxsIG5lZWQgdG8gaW5jbHVkZSBhIHRhc2tkZWYgZm9yIHhtbGJlYW4sIHdoaWNoIGNvdWxkIGxvb2sKK2xpa2UgdGhpczo8YnI+CisgPC9wPgorIAorPHByZT4mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3Rhc2tkZWYgbmFtZT0ieG1sYmVhbiIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5YTUxCZWFuIiBjbGFzc3BhdGg9InBhdGgvdG8veGJlYW4uamFyIi8mZ3Q7PC9wcmU+CisgCis8cD4gICA8L3A+CisgICAgICAgICAgIAorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIAorICBjYW4gYmUgZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgCisgIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IAorICBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSAKK2luY2x1ZGVkICBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIAoraXMgIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgCit3aXRoICBwYXR0ZXJucy4gQW5kIGZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSAKK2NhbiBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiAKKyBvbiA8YQorIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkKKyBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdwordG8gIHdyaXRlIHBhdHRlcm5zLjwvcD4KKyAgICAgICAgICAgCis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEKKyBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IAorYW5kIHN1cHBvcnRzIGFsbCAgIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPGNvZGU+ZGlyPC9jb2RlPiAKKyAgYmVjb21lcyA8Y29kZT5iYXNlZGlyPC9jb2RlPikgICBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgCisgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gICBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisgICAgICAgICAgICAgIAorPGgzPlBhcmFtZXRlcnM8L2gzPgorICAgICAgICAgICAKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNjaGVtYTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgdGhhdCBwb2ludHMgdG8gZWl0aGVyIGFuIGluZGl2aWR1YWwgc2NoZW1hCisgZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4gJm5ic3A7Tm90IGEgcGF0aCByZWZlcmVuY2UuICZuYnNwO0lmIG11bHRpcGxlCisgc2NoZW1hIGZpbGVzIG5lZWQgdG8gYmUgYnVpbHQgdG9nZXRoZXIsIHVzZSBhIG5leHRlZCBmaWxlc2V0IGluc3RlYWQgb2YKK3NldHRpbmcgIHNjaGVtYS48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3MgYSBmaWxlc2V0IGVsZW1lbnQgaXMKKyBuZXN0ZWQuPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiZuYnNwOyAKK0ZvciBpbnN0YW5jZSwgIm15WE1MQmVhbi5qYXIiIHdpbGwgb3V0cHV0IHRoZSByZXN1bHRzIG9mIHRoaXMgdGFzayBpbnRvIGEgCitqYXIgd2l0aCB0aGUgc2FtZSBuYW1lLjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAieG1sdHlwZXMuamFyIi48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kb3dubG9hZDwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIAorVVJMcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMuJm5ic3A7IERlZmF1bHRzIHRvIGZhbHNlLCBtZWFuaW5nIGFsbCBpbXBvcnRzIAorYW5kIGluY2x1ZGVzIG11c3QgYmUgY29waWVkIGxvY2FsbHkuPGJyPgorICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2UuPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBhbnQgdGFyZ2V0Cit3aWxsICBjb250aW51ZSBpZiB0aGUgWE1MQmVhbiBjcmVhdGlvbiBlbmNvdW50ZXJzIGEgYnVpbGQgZXJyb3IuPGJyPgorICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgdGhlIGFtb3VudCBvZiBidWlsZCBtZXNzYWdlIG91dHB1dC48YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48YnI+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGVzeXN0ZW1uYW1lPGJyPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdGhlIFR5cGVTeXN0ZW1Ib2xkZXIKK2NsYXNzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW4uJm5ic3A7IE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgdW5zcGVjaWZpZWQuCitOb25lIG9mIHRoZSB4bWwgYmVhbnMgYXJlIGdlbmVyYXRlZCBpbiB0aGlzIHBhY2thZ2UuIFVzZSAueHNkY29uZmlnIGZpbGVzCit0byBtb2RpZnkgeG1sIGJlYW4gcGFja2FnZSBvciBjbGFzcyBuYW1lcy48YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzZ2VuZGlyPGJyPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIGxvY2F0aW9uIHRvIGdlbmVyYXRlIC5jbGFzcyBmaWxlcyBpbnRvLjxicj4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzxicj4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c3Jjb25seTxicj4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHZhbHVlIG9mIHRydWUgbWVhbnMgdGhhdCBvbmx5IHNvdXJjZSB3aWxsIGJlIGdlbmVyYXRlZC48YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgZmFsc2UuPGJyPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmNnZW5kaXI8YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmphdmEgZmlsZXMgaW50by48YnI+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88YnI+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGlmIHNjaGVtYXMgaW4gdGhlIGZpbGVzZXQKK2ltcG9ydCBkZWZpbml0aW9ucyB0aGF0IGFyZSBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLAorb3IgaWYgLmphdmEgZmlsZXMgYXJlIGluIHRoZSBzY2hlbWEgZmlsZXNldC4gIEFsc28gc3VwcG9ydHMgYSBuZXN0ZWQgY2xhc3NwYXRoLjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BZGRzIGEgY2xhc3NwYXRoLCBnaXZlbiBhcyA8YQorIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+Cit0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mCitmaWxlcyAgIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC4gICAgICAgQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwordGFrZW4gICB0byBiZSAgICAgICBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YKK2ZpbGVzICAgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLiAgICAgICBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZQorZXhjbHVkZWQgICB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwordGFrZW4gICB0byBiZSAgICAgICBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZAorICBvciBub3QgICAgICAgKCJ5ZXMiLyJubyIpLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgICBkZWJ1ZyBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi4gIElmIHNldCB0bworICAgICAgICAgIDxjb2RlPm9mZjwvY29kZT4sIDxjb2RlPi1nOm5vbmU8L2NvZGU+IHdpbGwgYmUgcGFzc2VkIG9uIHRoZQorICAgICAgICAgIGNvbW1hbmQgbGluZSBmb3IgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCBpdCAoZm9yIG90aGVyIGNvbXBpbGVycywgbm8KKyAgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2lsbCBiZSB1c2VkKS4gIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwKKyAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmRlYnVnbGV2ZWw8L2NvZGU+IGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHRoZQorICAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudC48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1Z2xldmVsPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPktleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGNvZGU+LWc8L2NvZGU+CisgICAgICAgICAgICBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQKKyAgICAgICAgICAgIDxjb2RlPm1vZGVybjwvY29kZT4gYW5kIDxjb2RlPmNsYXNzaWModmVyICZndDs9IDEuMik8L2NvZGU+LgorICAgICAgICAgICAgTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQorICAgICAgICAgICAgZm9sbG93aW5nIGtleXdvcmRzOgorICAgICAgICAgICAgPGNvZGU+bGluZXM8L2NvZGU+LCA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uCisgICAgICAgICAgICBJZiA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LAorICAgICAgICAgICAgbm90aGluZyB3aWxsIGJlCisgICAgICAgICAgICBhcHBlbmRlZCB0byA8Y29kZT4tZzwvY29kZT4uICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwKKyAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpbWl6ZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgICAgIG9wdGltaXphdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlQW50UnVudGltZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIEFudCBydW4tdGltZSBsaWJyYXJpZXMgaW4gdGhlCisgICAgICAgICAgICBjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUphdmFSdW50aW1lPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZGVmYXVsdCBydW4tdGltZQorICAgICAgICAgICAgbGlicmFyaWVzIGZyb20gdGhlIGV4ZWN1dGluZyBWTSBpbiB0aGUgY2xhc3NwYXRoOworICAgICAgICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+bm88L2NvZGU+LjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBleGVjdXRlIDxjb2RlPmphdmFjPC9jb2RlPiB1c2luZyB0aGUKKyAgICAgICAgICAgIEpESyBjb21waWxlciBleHRlcm5hbGx5OyBkZWZhdWx0cyB0byA8Y29kZT55ZXM8L2NvZGU+LjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4KKyAgICAgICAgICAgIGV4ZWN1dGFibGUgdG8gdXNlIGluIGNhc2Ugb2YgPGNvZGU+Zm9yaz0mcXVvdDt5ZXMmcXVvdDs8L2NvZGU+LgorICAgICAgICAgICAgRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgIHJ1bm5pbmcgQW50LiAgSWdub3JlZCBpZiA8Y29kZT5mb3JrPSZxdW90O25vJnF1b3Q7PC9jb2RlPjwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeUluaXRpYWxTaXplPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCisgICAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cworICAgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgorICAgICAgICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCisgICAgICAgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeU1heGltdW1TaXplPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCisgICAgICAgICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cworICAgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgorICAgICAgICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCisgICAgICAgICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuCisgICAgICAgICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHksIGlmIHNldCwgd2lsbCBiZSB1c2VkLgorICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0gd2lsbCBiZSB1c2VkLgorICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVEdXBsaWNhdGVzSW5OYW1lc3BhY2VzPC90ZD4KKyAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIG5hbWVzcGFjZXMKKyAgICAgICAgICBpbiB3aGljaCBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgYXJlIHRvIGJlIGlnbm9yZWQuCisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgCisgIDwvdGJvZHk+ICAgICAKKzwvdGFibGU+CisgICAgICAgICAgICAgICAgIAorPGgzPkV4YW1wbGU8L2gzPgorICAgICAgICAgICAKKzxibG9ja3F1b3RlPiAgICAgICAgICAgICAgIEJlIHN1cmUgdG8gZGVmaW5lIHRoZSB0YXNrIGluIHlvdXIgc2NyaXB0LCBsaWtlIAordGhpczo8YnI+CisgICAKKyAgPHByZT4mbHQ7dGFza2RlZiBuYW1lPSJ4bWxiZWFuIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlhNTEJlYW4iIGNsYXNzcGF0aD0icGF0aC90by94YmVhbi5qYXIiLyZndDs8L3ByZT4KKyAgIAorICA8cHJlPjxicj4mbHQ7eG1sYmVhbiBzY2hlbWE9InNjaGVtYXMiIGRlc3RmaWxlPSJTY2hlbWFzLmphciIvJmd0Ozxicj48L3ByZT4KKyAgQnVpbGRzIGFsbCB0aGUgc2NoZW1hcyBpbiB0aGUgc2NoZW1hcyBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYSBqYXIgY2FsbGVkCisgJ1NjaGVtYXMuamFyJy48YnI+CisgICAgICAgICAgICAgICAgICAgIAorICA8cHJlPiZsdDt4bWxiZWFuIHNjaGVtYT0ic2NoZW1hcy9vdXJTY2hlbWEueHNkIiBkb3dubG9hZD0idHJ1ZSIvJmd0Ozxicj48L3ByZT4KKyAgQ29tcGlsZXMgdGhlIHNjaGVtYSAnb3VyU2hlbWEueHNkJyBpbnRvIHRoZSBkZWZhdWx0IGphciAneG1sdHlwZXMuamFyJy4gCismbmJzcDtJZiAmbmJzcDthbnkgaW1wb3J0cyBhbmQgaW5jbHVkZXMgYXJlIGRlZmluZWQgYnkgcmVtb3RlIFVSTHMsIHRoZXkgYXJlCitkb3dubG9hZGVkIGR1cmluZyB0aGUgYnVpbGQuPGJyPgorICAgICAgICAgICAgICAgICAgICAgICAKKyAgPGg0PlVzaW5nIGEgZmlsZXNldDwvaDQ+CisgICAgICAgICAgICAgICAgICAgICAgIAorICA8cHJlPiZsdDt4bWxiZWFuIGNsYXNzZ2VuZGlyPSIke2J1aWxkLmRpcn0iIGNsYXNzcGF0aD0iJHtjbGFzcy5wYXRofSI8YnI+ICAgICAgZmFpbG9uZXJyb3I9InRydWUiJmd0Ozxicj4gICZsdDtmaWxlc2V0IGJhc2VkaXI9InNyYyIgZXhjbHVkZXM9IioqLyoueHNkIi8mZ3Q7PGJyPiAgJmx0O2ZpbGVzZXQgYmFzZWRpcj0ic2NoZW1hcyIgaW5jbHVkZXM9IioqLyouKiIvJmd0Ozxicj4mbHQ7L3htbGJlYW4mZ3Q7PGJyPjwvcHJlPgorICBHYXRoZXJzIGFsbCB0aGUgZmlsZXMgaW4gdGhlICdzcmMnIGRpcmVjdG9yeSBleGNlcHQgLnhzZCBmaWxlcywgYWxvbmcgd2l0aAorIGV2ZXJ5IGZpbGUgaW4gdGhlICdzY2hlbWFzJyBkaXJlY3RvcnkgYW5kIGNvbXBpbGVzIHRoZW0uIFRoZSBmaWxlc2V0IGNhbgoraW5jbHVkZSBzY2hlbWEgZmlsZXMgdGhhdCByZWZlciB0byBwcmV2aW91c2x5IGNvbXBpbGVkIHNjaGVtYSBjb21wb25lbnRzLiZuYnNwOworVGhlIGZpbGVzZXQgY2FuIGFsc28gY29udGFpbiAuamF2YSBmaWxlcy4mbmJzcDsgVGhlIGNsYXNzcGF0aCBwYXJhbWV0ZXIgZGVmaW5lcwordGhlIGNsYXNzcGF0aCBuZWNlc3NhcnkgdG8gcmVzb2x2ZSBjb21waWxlZCBzY2hlbWEgYW5kIGphdmEgcmVmZXJlbmNlcy48YnI+CisgIDxicj4KK1RoZSBidWlsdCBjbGFzc2VzIHdpbGwgZ28gaW50byAke2J1aWxkLmRpcn0uPGJyPgorICAgICAgICAgICAgICAgICAgICAgICAKKyAgPHByZT48L3ByZT4KKyAgICAgICAgICAgPC9ibG9ja3F1b3RlPgorICAgICAgICAgICAKKzxocj4gICAgICAKKyAgICAgICA8YnI+CisgICAgICAgIDxicj4KKyA8YnI+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi1zcmMuemlwIGIvdjEvZXh0ZXJuYWwvbGliL2pheGVuLTEuMS1iZXRhLTItc3JjLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThlM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvZXh0ZXJuYWwvbGliL2pheGVuLTEuMS1iZXRhLTItc3JjLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIgYi92MS9leHRlcm5hbC9saWIvamF4ZW4tMS4xLWJldGEtMi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhZmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL2V4dGVybmFsL2xpYi9qYXhlbi0xLjEtYmV0YS0yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvanVuaXQuamFyIGIvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU0M2JiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvZXh0ZXJuYWwvbGliL2p1bml0LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9leHRlcm5hbC9saWIvb2xkeGJlYW4uamFyIGIvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTgxYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvZXh0ZXJuYWwvbGliL29sZHhiZWFuLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS92MS9wbHVnaW4uamVsbHkgYi92MS9wbHVnaW4uamVsbHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyM2VlYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3BsdWdpbi5qZWxseQpAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPHByb2plY3QgICAgIAorICAgIHhtbG5zOmo9ImplbGx5OmNvcmUiCisgICAgeG1sbnM6amVsYW50PSJqZWxseTphbnQiCisgICAgeG1sbnM6dXRpbD0iamVsbHk6dXRpbCI+CisgIAorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gWE1MQmVhbiBQbHVnSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAKKwk8IS0tIFRoaXMgZ29hbCBnZW5lcmF0ZXMgdGhlIFhNTEJlYW5zIGZyb20gdGhlIC54c2QgZmlsZXMgLS0+CisJPGdvYWwgbmFtZT0ieG1sYmVhbnM6eG1sYmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR2VuZXJhdGVzIFhNTEJlYW5zIGZyb20gWE1MIFNjaGVtYSBmaWxlcy4iPgorCisJCTx0YXNrZGVmIG5hbWU9InhtbGJlYW4iIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2wuWE1MQmVhbiI+CisJCQk8Y2xhc3NwYXRoPgorCQkJCTxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgorCQkJPC9jbGFzc3BhdGg+CisJCTwvdGFza2RlZj4KKworCQk8eG1sYmVhbj4KKwkJCTwhLS0gbGlzdCBvZiBhZGRpdGlvbmFsIG9wdGlvbnMgLS0+CisJCQk8ajpzZXQgdmFyPSJvcHNEZWxpbSIgdmFsdWU9IiwiLz4KKwkJCTxqOnNldCB2YXI9ImFkZE9wcyIgdmFsdWU9InNjaGVtYSxpbmNsdWRlcyxleGNsdWRlcyxkZXN0ZmlsZSxjbGFzc2dlbmRpcixzcmNvbmx5LHNyY2dlbmRpcixkZWJ1ZyIvPgorCisJCQk8IS0tIFNldHVwIHRoZSBYTUxCZWFuJ3MgYW50IHByb3BlcnRpZXM6IC0tPgorCQkJPHV0aWw6dG9rZW5pemUgdmFyPSJvcHMiIGRlbGltPSIke29wc0RlbGltfSI+JHthZGRPcHN9PC91dGlsOnRva2VuaXplPgorCQkJPGo6Zm9yRWFjaCBpdGVtcz0iJHtvcHN9IiB2YXI9Im9wIj4KKwkJCQk8ajpzZXQgdmFyPSJvcF92YXJfbmFtZSIgdmFsdWU9Im1hdmVuLnhtbGJlYW5zLnhtbGJlYW4uJHtvcH0iLz4KKwkJCQk8ajpzZXQgdmFyPSJvcFgiIHZhbHVlPSIke29wX3Zhcl9uYW1lfVgiLz4KKwkJCQk8ajppZiB0ZXN0PSIke29wWCAhPSAnWCd9Ij4KKwkJCQkJPGplbGFudDpzZXRQcm9wZXJ0eSBuYW1lPSIke29wfSIgdmFsdWU9IiR7Y29udGV4dC5nZXRWYXJpYWJsZShvcF92YXJfbmFtZSl9Ii8+CisJCQkJPC9qOmlmPgorCQkJPC9qOmZvckVhY2g+CisJCQk8Y2xhc3NwYXRoPgorCQkJCTxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgorCQkJPC9jbGFzc3BhdGg+CisJCTwveG1sYmVhbj4KKyAgICAgICAgCisJPC9nb2FsPgorCQorICAKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3YxL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdjEvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4ZGFmZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgRGVmYXVsdCBwcm9qZWN0IHByb3BlcnRpZXMgZm9yIHhtbGJlYW4gVjEKKyMKKworIyBJbmRpY2F0ZXMgdGhlIGRpcmVjdG9yeSB0aGF0IHNjaGVtYSBmaWxlcyBjYW4gYmUgZm91bmQgKCoueHNkKToKK21hdmVuLnhtbGJlYW5zLnhtbGJlYW4uc2NoZW1hPXNyYy94bWxiZWFucworCisjIEZpbGVzIHRvIGluY2x1ZGUgaW4gc2NoZW1hIGJ1aWxkOgorbWF2ZW4ueG1sYmVhbnMueG1sYmVhbi5pbmNsdWRlcz0qKi8qLnhzZAorCisjIEZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSBzY2hlbWEgYnVpbGQ6CittYXZlbi54bWxiZWFucy54bWxiZWFuLmV4Y2x1ZGVzPQorCisjIERpcmVjdG9yeSB0byBwdXQgY29tcGlsZWQgZmlsZXMgaW50bzoKK21hdmVuLnhtbGJlYW5zLnhtbGJlYW4uY2xhc3NnZW5kaXI9JHttYXZlbi5idWlsZC5kaXJ9L2NsYXNzZXMKKworIyBXaGV0aGVyIHRvIG9ubHkgZ2VuZXJhdGUgc291cmNlICguamF2YSkgZmlsZXMgZnJvbSB0aGUgc2NoZW1hKHMpIG9yIG5vdDoKK21hdmVuLnhtbGJlYW5zLnhtbGJlYW4uc3Jjb25seT1mYWxzZQorCisjIERpcmVjdG9yeSB0byBwdXQgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXM6CittYXZlbi54bWxiZWFucy54bWxiZWFuLnNyY2dlbmRpcj0ke21hdmVuLmJ1aWxkLmRpcn0veG1sYmVhbnMvc3JjCisKKyMgSmFyIGZpbGUgY29udGFpbmluZyB0aGUgY29tcGlsZWQgWE1MQmVhbnMgYW5kIHJlc291cmNlczoKK21hdmVuLnhtbGJlYW5zLnhtbGJlYW4uZGVzdGZpbGU9JHttYXZlbi5idWlsZC5kaXJ9L3htbGJlYW5zLyR7bWF2ZW4uZmluYWwubmFtZX0uamFyCisKKyMgSW5kaWNhdGVzIGlmIHRoZSBnZW5lcmF0ZWQgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIGRlYnVnIGluZm9ybWF0aW9uOgorbWF2ZW4ueG1sYmVhbnMueG1sYmVhbi5kZWJ1Zz1mYWxzZQpkaWZmIC0tZ2l0IGEvdjEvcHJvamVjdC5wcm9wZXJ0aWVzIGIvdjEvcHJvamVjdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNTFhMmQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9wcm9qZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSw4IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisjIFAgUiBPIEogRSBDIFQgUCBSIE8gUCBFIFIgVCBJIEUgUyAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKK21hdmVuLmRvY3Muc3JjPSR7YmFzZWRpcn0veGRvY3MKK21hdmVuLnhkb2MuZGF0ZT1sZWZ0IAorbWF2ZW4ueGRvYy52ZXJzaW9uPSR7cG9tLmN1cnJlbnRWZXJzaW9ufSAKK21hdmVuLnhkb2MucG93ZXJlZGJ5LmltYWdlPW1hdmVuLWZlYXRoZXIucG5nIAorCmRpZmYgLS1naXQgYS92MS9wcm9qZWN0LnhtbCBiL3YxL3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTZlYjgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9wcm9qZWN0LnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+IAorIAorPHByb2plY3Q+IAorICAgIDxwb21WZXJzaW9uPjM8L3BvbVZlcnNpb24+CisgICAgPGdyb3VwSWQ+eG1sYmVhbnM8L2dyb3VwSWQ+IAorICAgIDxpZD5tYXZlbi14bWxiZWFucy1wbHVnaW48L2lkPiAKKyAgICA8bmFtZT5NYXZlbiBYTUxCZWFucyBQbHVnaW48L25hbWU+IAorICAgIDxjdXJyZW50VmVyc2lvbj4xLjAtREVWPC9jdXJyZW50VmVyc2lvbj4gCisgICAgPG9yZ2FuaXphdGlvbj4gCisgICAgICAgIDxuYW1lPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KKyAgICAgICAgPGxvZ28+IDwvbG9nbz4KKyAgICA8L29yZ2FuaXphdGlvbj4gCisgICAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4gCisgICAgPHNob3J0RGVzY3JpcHRpb24+R2VuZXJhdGVzIFhNTEJlYW5zIGZyb20gWE1MIFNjaGVtYSBmaWxlcy48L3Nob3J0RGVzY3JpcHRpb24+CisKKyAgICA8ZGV2ZWxvcGVycz4gCisgICAgICAgIDxkZXZlbG9wZXI+IAorICAgICAgICAgICAgPG5hbWU+RHV0dGEgU2F0YWRpcDwvbmFtZT4gCisgICAgICAgICAgICA8aWQ+ZHV0dGE8L2lkPiAKKyAgICAgICAgICAgIDxlbWFpbD5zLWR1dHRhQHNiY2dsb2JhbC5uZXQ8L2VtYWlsPiAKKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L29yZ2FuaXphdGlvbj4gCisgICAgICAgICAgICA8cm9sZXM+IAorICAgICAgICAgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPiAKKyAgICAgICAgICAgIDwvcm9sZXM+IAorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4gCisgICAgICAgICAgICA8bmFtZT5Kb3NlcGggSGluZHNsZXk8L25hbWU+IAorICAgICAgICAgICAgPGVtYWlsPmpoaW5kc2xleUBwcm92aWRlcmxpbmsuY29tPC9lbWFpbD4gCisgICAgICAgICAgICA8cm9sZXM+IAorICAgICAgICAgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPiAKKyAgICAgICAgICAgIDwvcm9sZXM+IAorICAgICAgICA8L2RldmVsb3Blcj4gIAorICAgIDwvZGV2ZWxvcGVycz4gCisKKworICAgIDxkZXBlbmRlbmNpZXM+IAorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPnhtbGJlYW5zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGJlYW4tYXBhY2hlPC9hcnRpZmFjdElkPiAKKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1ERVY8L3ZlcnNpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5pYmlibGlvLm9yZy9tYXZlbi94bWxiZWFucy9qYXJzLzwvdXJsPgorCQk8cHJvcGVydGllcz4gCisJCQk8Y2xhc3Nsb2FkZXI+cm9vdDwvY2xhc3Nsb2FkZXI+IAorCQk8L3Byb3BlcnRpZXM+IAorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+IAorCisgICAgPGJ1aWxkPiAKKyAgICAgICAgPCEtLSBVc2VmdWwgaWYgeW91ciBwbHVnaW4gdXNlcyBzb21lIGJlYW5zIC0tPiAKKyAgICAgICAgPCEtLQorICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9qYXZhL21haW48L3NvdXJjZURpcmVjdG9yeT4gCisgICAgICAgIDx1bml0VGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvamF2YS90ZXN0PC91bml0VGVzdFNvdXJjZURpcmVjdG9yeT4gCisgICAgICAgIC0tPgorICAgIAorICAgICAgICA8IS0tCisgICAgICAgIDx1bml0VGVzdD4gCisgICAgICAgICAgICA8aW5jbHVkZXM+IAorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+IAorICAgICAgICAgICAgPC9pbmNsdWRlcz4gCisgICAgICAgIDwvdW5pdFRlc3Q+IAorICAgICAgICAtLT4KKyAgICAKKyAgICAgICAgPHJlc291cmNlcz4gCisgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICA8cmVzb3VyY2U+IAorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvcGx1Z2luLXJlc291cmNlczwvZGlyZWN0b3J5PiAKKyAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD5wbHVnaW4tcmVzb3VyY2VzPC90YXJnZXRQYXRoPiAKKyAgICAgICAgICAgIDwvcmVzb3VyY2U+IAorICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8cmVzb3VyY2U+IAorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PiAKKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+IAorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5wbHVnaW4uamVsbHk8L2luY2x1ZGU+IAorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5wbHVnaW4ucHJvcGVydGllczwvaW5jbHVkZT4gCisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnByb2plY3QucHJvcGVydGllczwvaW5jbHVkZT4gCisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnByb2plY3QueG1sPC9pbmNsdWRlPiAKKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPiAKKyAgICAgICAgICAgIDwvcmVzb3VyY2U+IAorICAgICAgICA8L3Jlc291cmNlcz4gCisgICAgPC9idWlsZD4gCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vQ2hhcnMuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9DaGFycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWMyNjEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vQ2hhcnMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnMKK3sKKyAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzdHJpbmcgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gYnVmZmVyID09IG51bGwgPyAiIiA6IG5ldyBTdHJpbmcoIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGggKQorICAgICAgICAgICAgICAgIDogc3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOworCisgICAgcHVibGljIGNoYXJbXSBidWZmZXI7CisgICAgcHVibGljIGludCAgICBvZmZzZXQ7CisgICAgcHVibGljIGludCAgICBsZW5ndGg7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9FbmNvZGluZ01hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmY4YWYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vRW5jb2RpbmdNYXAuamF2YQpAQCAtMCwwICsxLDQwMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworcHVibGljIGNsYXNzIEVuY29kaW5nTWFwCit7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YTJJQU5BTWFwcGluZyAoIFN0cmluZyBqYXZhICkKKyAgICB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBfamF2YV90b19pYW5hLmdldCggamF2YS50b1VwcGVyQ2FzZSgpICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElBTkEySmF2YU1hcHBpbmcgKCBTdHJpbmcgaWFuYSApCisgICAgeworICAgICAgICByZXR1cm4gKFN0cmluZykgX2lhbmFfdG9famF2YS5nZXQoIGlhbmEudG9VcHBlckNhc2UoKSApOworICAgIH0KKworICAgIHByaXZhdGUgRW5jb2RpbmdNYXAgKCApIHsgfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEhhc2hNYXAgX2lhbmFfdG9famF2YSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaE1hcCBfamF2YV90b19pYW5hID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgYWRkTWFwcGluZyAoCisgICAgICAgIFN0cmluZyBqYXZhLCBTdHJpbmcgaWFuYSwgYm9vbGVhbiBpc0RlZmF1bHQgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0ICFfaWFuYV90b19qYXZhLmNvbnRhaW5zS2V5KCBpYW5hICk7CisgICAgICAgIGFzc2VydCBqYXZhLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBqYXZhICk7CisgICAgICAgIGFzc2VydCBpYW5hLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCBpYW5hICk7CisgICAgICAgIAorICAgICAgICBfaWFuYV90b19qYXZhLnB1dCggaWFuYSwgamF2YSApOworCisgICAgICAgIGlmIChpc0RlZmF1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhX2phdmFfdG9faWFuYS5jb250YWluc0tleSggamF2YSApOworICAgICAgICAgICAgX2phdmFfdG9faWFuYS5wdXQoIGphdmEsIGlhbmEgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gY29tcGxldGVNYXBwaW5ncyAoICkKKyAgICB7CisgICAgICAgIEhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9pYW5hX3RvX2phdmEua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQorICAgICAgICAgICAgbS5wdXQoIF9pYW5hX3RvX2phdmEuZ2V0KCBpLm5leHQoKSApLCBudWxsICk7CisKKyAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IG0ua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3QgayA9IGkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0IF9qYXZhX3RvX2lhbmEuY29udGFpbnNLZXkoIGsgKTogazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQU5TSV9YMy40LTE5ODYiLCAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIkFTQ0lJIiwgICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJDUDM2NyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiQ1NBU0NJSSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklCTS0zNjciLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJQk0zNjciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiSVNPLUlSLTYiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIklTTzY0Ni1VUyIsICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQVNDSUkiLCAgICAgICAgICJJU09fNjQ2LklSVjoxOTkxIiwgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkFTQ0lJIiwgICAgICAgICAiVVMiLCAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJBU0NJSSIsICAgICAgICAgIlVTLUFTQ0lJIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQklHNSIsICAgICAgICAgICJCSUc1IiwgICAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkJJRzUiLCAgICAgICAgICAiQ1NCSUc1IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkNQMDM3IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJDU0lCTTAzNyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLUNBIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIkVCQ0RJQy1DUC1OTCIsICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJFQkNESUMtQ1AtVVMiLCAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMDM3IiwgICAgICAgICAiRUJDRElDLUNQLVdUIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDAzNyIsICAgICAgICAgIklCTS0zNyIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AwMzciLCAgICAgICAgICJJQk0wMzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiQ1AxMDI2IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDEwMjYiLCAgICAgICAgIkNTSUJNMTAyNiIsICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDI2IiwgICAgICAgICJJQk0tMTAyNiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTAyNiIsICAgICAgICAiSUJNMTAyNiIsICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDEwNDciLCAgICAgICAgIkNQMTA0NyIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMDQ3IiwgICAgICAgICJJQk0tMTA0NyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTA0NyIsICAgICAgICAiSUJNMTA0NyIsICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIkNDU0lEMDExNDAiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQwIiwgICAgICAgICJDUDAxMTQwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MCIsICAgICAgICAiSUJNLTExNDAiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDAiLCAgICAgICAgIklCTTAxMTQwIiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJDQ1NJRDAxMTQxIiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MSIsICAgICAgICAiQ1AwMTE0MSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDEiLCAgICAgICAgIklCTS0xMTQxIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQxIiwgICAgICAgICJJQk0wMTE0MSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiQ0NTSUQwMTE0MiIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDIiLCAgICAgICAgIkNQMDExNDIiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQyIiwgICAgICAgICJJQk0tMTE0MiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MiIsICAgICAgICAiSUJNMDExNDIiLCAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIkNDU0lEMDExNDMiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQzIiwgICAgICAgICJDUDAxMTQzIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0MyIsICAgICAgICAiSUJNLTExNDMiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDMiLCAgICAgICAgIklCTTAxMTQzIiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJDQ1NJRDAxMTQ0IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NCIsICAgICAgICAiQ1AwMTE0NCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDQiLCAgICAgICAgIklCTS0xMTQ0IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ0IiwgICAgICAgICJJQk0wMTE0NCIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiQ0NTSUQwMTE0NSIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDUiLCAgICAgICAgIkNQMDExNDUiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ1IiwgICAgICAgICJJQk0tMTE0NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NSIsICAgICAgICAiSUJNMDExNDUiLCAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIkNDU0lEMDExNDYiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ2IiwgICAgICAgICJDUDAxMTQ2IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NiIsICAgICAgICAiSUJNLTExNDYiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDYiLCAgICAgICAgIklCTTAxMTQ2IiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJDQ1NJRDAxMTQ3IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0NyIsICAgICAgICAiQ1AwMTE0NyIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDciLCAgICAgICAgIklCTS0xMTQ3IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ3IiwgICAgICAgICJJQk0wMTE0NyIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiQ0NTSUQwMTE0OCIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDgiLCAgICAgICAgIkNQMDExNDgiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ4IiwgICAgICAgICJJQk0tMTE0OCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OCIsICAgICAgICAiSUJNMDExNDgiLCAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIkNDU0lEMDExNDkiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMTQ5IiwgICAgICAgICJDUDAxMTQ5IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMTE0OSIsICAgICAgICAiSUJNLTExNDkiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDExNDkiLCAgICAgICAgIklCTTAxMTQ5IiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUwIiwgICAgICAgICJXSU5ET1dTLTEyNTAiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUxIiwgICAgICAgICJXSU5ET1dTLTEyNTEiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUyIiwgICAgICAgICJXSU5ET1dTLTEyNTIiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjUzIiwgICAgICAgICJXSU5ET1dTLTEyNTMiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU0IiwgICAgICAgICJXSU5ET1dTLTEyNTQiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU1IiwgICAgICAgICJXSU5ET1dTLTEyNTUiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU2IiwgICAgICAgICJXSU5ET1dTLTEyNTYiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU3IiwgICAgICAgICJXSU5ET1dTLTEyNTciLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AxMjU4IiwgICAgICAgICJXSU5ET1dTLTEyNTgiLCAgICAgICAgICAgdHJ1ZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJDUDI3MyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjczIiwgICAgICAgICAiQ1NJQk0yNzMiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI3MyIsICAgICAgICAgIklCTS0yNzMiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzMiLCAgICAgICAgICJJQk0yNzMiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiQ1AyNzciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIkNTSUJNMjc3IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJFQkNESUMtQ1AtREsiLCAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjc3IiwgICAgICAgICAiRUJDRElDLUNQLU5PIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI3NyIsICAgICAgICAgIklCTS0yNzciLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzciLCAgICAgICAgICJJQk0yNzciLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiQ1AyNzgiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIkNTSUJNMjc4IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJFQkNESUMtQ1AtRkkiLCAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjc4IiwgICAgICAgICAiRUJDRElDLUNQLVNFIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI3OCIsICAgICAgICAgIklCTS0yNzgiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyNzgiLCAgICAgICAgICJJQk0yNzgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiQ1AyODAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIkNTSUJNMjgwIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODAiLCAgICAgICAgICJFQkNESUMtQ1AtSVQiLCAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjgwIiwgICAgICAgICAiSUJNLTI4MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI4MCIsICAgICAgICAgIklCTTI4MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJDUDI4NCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiQ1NJQk0yODQiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NCIsICAgICAgICAgIkVCQ0RJQy1DUC1FUyIsICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODQiLCAgICAgICAgICJJQk0tMjg0IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjg0IiwgICAgICAgICAiSUJNMjg0IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIkNQMjg1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJDU0lCTTI4NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjg1IiwgICAgICAgICAiRUJDRElDLUNQLUdCIiwgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI4NSIsICAgICAgICAgIklCTS0yODUiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyODUiLCAgICAgICAgICJJQk0yODUiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiQ1AyOTAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIkNTSUJNMjkwIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTAiLCAgICAgICAgICJFQkNESUMtSlAtS0FOQSIsICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjkwIiwgICAgICAgICAiSUJNLTI5MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI5MCIsICAgICAgICAgIklCTTI5MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJDUDI5NyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiQ1NJQk0yOTciLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDI5NyIsICAgICAgICAgIkVCQ0RJQy1DUC1GUiIsICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1AyOTciLCAgICAgICAgICJJQk0tMjk3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQMjk3IiwgICAgICAgICAiSUJNMjk3IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIkNQNDIwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJDU0lCTTQyMCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNDIwIiwgICAgICAgICAiRUJDRElDLUNQLUFSMSIsICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDQyMCIsICAgICAgICAgIklCTS00MjAiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjAiLCAgICAgICAgICJJQk00MjAiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiQ1A0MjQiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIkNTSUJNNDI0IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MjQiLCAgICAgICAgICJFQkNESUMtQ1AtSEUiLCAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNDI0IiwgICAgICAgICAiSUJNLTQyNCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDQyNCIsICAgICAgICAgIklCTTQyNCIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICI0MzciLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiQ1A0MzciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDQzNyIsICAgICAgICAgIkNTUEM4Q09ERVBBR0U0MzciLCAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A0MzciLCAgICAgICAgICJJQk0tNDM3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNDM3IiwgICAgICAgICAiSUJNNDM3IiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkNQNTAwIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJDU0lCTTUwMCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiRUJDRElDLUNQLUJFIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDUwMCIsICAgICAgICAgIkVCQ0RJQy1DUC1DSCIsICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A1MDAiLCAgICAgICAgICJJQk0tNTAwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNTAwIiwgICAgICAgICAiSUJNNTAwIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIkNQNzc1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A3NzUiLCAgICAgICAgICJDU1BDNzc1QkFMVElDIiwgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQNzc1IiwgICAgICAgICAiSUJNLTc3NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDc3NSIsICAgICAgICAgIklCTTc3NSIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICI4NTAiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiQ1A4NTAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MCIsICAgICAgICAgIkNTUEM4NTBNVUxUSUxJTkdVQUwiLCAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTAiLCAgICAgICAgICJJQk0tODUwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODUwIiwgICAgICAgICAiSUJNODUwIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIjg1MiIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJDUDg1MiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODUyIiwgICAgICAgICAiQ1NQQ1A4NTIiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1MiIsICAgICAgICAgIklCTS04NTIiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTIiLCAgICAgICAgICJJQk04NTIiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiODU1IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIkNQODU1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTUiLCAgICAgICAgICJDU0lCTTg1NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODU1IiwgICAgICAgICAiSUJNLTg1NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NSIsICAgICAgICAgIklCTTg1NSIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICI4NTciLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiQ1A4NTciLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1NyIsICAgICAgICAgIkNTSUJNODU3IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTciLCAgICAgICAgICJJQk0tODU3IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODU3IiwgICAgICAgICAiSUJNODU3IiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIkNDU0lEMDA4NTgiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NTgiLCAgICAgICAgICJDUDAwODU4IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODU4IiwgICAgICAgICAiSUJNLTg1OCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg1OCIsICAgICAgICAgIklCTTAwODU4IiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICI4NjAiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiQ1A4NjAiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MCIsICAgICAgICAgIkNTSUJNODYwIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjAiLCAgICAgICAgICJJQk0tODYwIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYwIiwgICAgICAgICAiSUJNODYwIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIjg2MSIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJDUC1JUyIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiQ1A4NjEiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MSIsICAgICAgICAgIkNTSUJNODYxIiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjEiLCAgICAgICAgICJJQk0tODYxIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYxIiwgICAgICAgICAiSUJNODYxIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIjg2MiIsICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJDUDg2MiIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYyIiwgICAgICAgICAiQ1NQQzg2MkxBVElOSEVCUkVXIiwgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MiIsICAgICAgICAgIklCTS04NjIiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjIiLCAgICAgICAgICJJQk04NjIiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiODYzIiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIkNQODYzIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjMiLCAgICAgICAgICJDU0lCTTg2MyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODYzIiwgICAgICAgICAiSUJNLTg2MyIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2MyIsICAgICAgICAgIklCTTg2MyIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJDUDg2NCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY0IiwgICAgICAgICAiQ1NJQk04NjQiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NCIsICAgICAgICAgIklCTS04NjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjQiLCAgICAgICAgICJJQk04NjQiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiODY1IiwgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIkNQODY1IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjUiLCAgICAgICAgICJDU0lCTTg2NSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY1IiwgICAgICAgICAiSUJNLTg2NSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NSIsICAgICAgICAgIklCTTg2NSIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICI4NjYiLCAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiQ1A4NjYiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2NiIsICAgICAgICAgIkNTSUJNODY2IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjYiLCAgICAgICAgICJJQk0tODY2IiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY2IiwgICAgICAgICAiSUJNODY2IiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIkNQLUFSIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJDUDg2OCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY4IiwgICAgICAgICAiQ1NJQk04NjgiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OCIsICAgICAgICAgIklCTS04NjgiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjgiLCAgICAgICAgICJJQk04NjgiLCAgICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiQ1AtR1IiLCAgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIkNQODY5IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NjkiLCAgICAgICAgICJDU0lCTTg2OSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODY5IiwgICAgICAgICAiSUJNLTg2OSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg2OSIsICAgICAgICAgIklCTTg2OSIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJDUDg3MCIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiQ1NJQk04NzAiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIkVCQ0RJQy1DUC1ST0VDRSIsICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzAiLCAgICAgICAgICJFQkNESUMtQ1AtWVUiLCAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODcwIiwgICAgICAgICAiSUJNLTg3MCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MCIsICAgICAgICAgIklCTTg3MCIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJDUDg3MSIsICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiQ1NJQk04NzEiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDg3MSIsICAgICAgICAgIkVCQ0RJQy1DUC1JUyIsICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A4NzEiLCAgICAgICAgICJJQk0tODcxIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQODcxIiwgICAgICAgICAiSUJNODcxIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIkNQOTE4IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJDU0lCTTkxOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQOTE4IiwgICAgICAgICAiRUJDRElDLUNQLUFSMiIsICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDkxOCIsICAgICAgICAgIklCTS05MTgiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MTgiLCAgICAgICAgICJJQk05MTgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiQ0NTSUQwMDkyNCIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIkNQMDA5MjQiLCAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiQ1A5MjQiLCAgICAgICAgICJFQkNESUMtTEFUSU45LS1FVVJPIiwgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkNQOTI0IiwgICAgICAgICAiSUJNLTkyNCIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJDUDkyNCIsICAgICAgICAgIklCTTAwOTI0IiwgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiRVVDSklTIiwgICAgICAgICJDU0VVQ1BLREZNVEpBUEFORVNFIiwgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkVVQ0pJUyIsICAgICAgICAiRVVDLUpQIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJFVUNKSVMiLCAgICAgICAgIkVYVEVOREVEX1VOSVhfQ09ERV9QQUNLRURfRk9STUFUX0ZPUl9KQVBBTkVTRSIsIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJHQjE4MDMwIiwgICAgICAgIkdCMTgwMzAiLCAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiR0IyMzEyIiwgICAgICAgICJDU0dCMjMxMiIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkdCMjMxMiIsICAgICAgICAiR0IyMzEyIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU08yMDIyQ04iLCAgICAgIklTTy0yMDIyLUNOIiwgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPMjAyMktSIiwgICAgICJDU0lTTzIwMjJLUiIsICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzIwMjJLUiIsICAgICAiSVNPLTIwMjItS1IiLCAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIkNQODE5IiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJDU0lTT0xBVElOMSIsICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSUJNLTgxOSIsICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklCTTgxOSIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJJU08tODg1OS0xIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiSVNPLUlSLTEwMCIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzEiLCAgICAgIklTT184ODU5LTEiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8xIiwgICAgICJMMSIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMSIsICAgICAiTEFUSU4xIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIkNTSVNPTEFUSU4yIiwgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJJU08tODg1OS0yIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiSVNPLUlSLTEwMSIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzIiLCAgICAgIklTT184ODU5LTIiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8yIiwgICAgICJMMiIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMiIsICAgICAiTEFUSU4yIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIkNTSVNPTEFUSU4zIiwgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJJU08tODg1OS0zIiwgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiSVNPLUlSLTEwOSIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzMiLCAgICAgIklTT184ODU5LTMiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV8zIiwgICAgICJMMyIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfMyIsICAgICAiTEFUSU4zIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIkNTSVNPTEFUSU40IiwgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJJU08tODg1OS00IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiSVNPLUlSLTExMCIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzQiLCAgICAgIklTT184ODU5LTQiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV80IiwgICAgICJMNCIsICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNCIsICAgICAiTEFUSU40IiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIkNTSVNPTEFUSU5DWVJJTExJQyIsICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJDWVJJTExJQyIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNSIsICAgICAiSVNPLTg4NTktNSIsICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzUiLCAgICAgIklTTy1JUi0xNDQiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV81IiwgICAgICJJU09fODg1OS01IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiQVJBQklDIiwgICAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIkFTTU8tNzA4IiwgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJDU0lTT0xBVElOQVJBQklDIiwgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiRUNNQS0xMTQiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzYiLCAgICAgIklTTy04ODU5LTYiLCAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV82IiwgICAgICJJU08tSVItMTI3IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNiIsICAgICAiSVNPXzg4NTktNiIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkNTSVNPTEFUSU5HUkVFSyIsICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJFQ01BLTExOCIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiRUxPVF85MjgiLCAgICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIkdSRUVLIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJHUkVFSzgiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfNyIsICAgICAiSVNPLTg4NTktNyIsICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzciLCAgICAgIklTTy1JUi0xMjYiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV83IiwgICAgICJJU09fODg1OS03IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiQ1NJU09MQVRJTkhFQlJFVyIsICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIkhFQlJFVyIsICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU08tODg1OS04IiwgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOCIsICAgICAiSVNPLTg4NTktOC1JIiwgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzgiLCAgICAgIklTTy1JUi0xMzgiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV84IiwgICAgICJJU09fODg1OS04IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiQ1NJU09MQVRJTjUiLCAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIklTTy04ODU5LTkiLCAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJJU08tSVItMTQ4IiwgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIklTTzg4NTlfOSIsICAgICAiSVNPXzg4NTktOSIsICAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJJU084ODU5XzkiLCAgICAgIkw1IiwgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSVNPODg1OV85IiwgICAgICJMQVRJTjUiLCAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkpJUyIsICAgICAgICAgICAiQ1NJU08yMDIySlAiLCAgICAgICAgICAgIGZhbHNlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJKSVMiLCAgICAgICAgICAgIklTTy0yMDIyLUpQIiwgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwMSIsICAgICAgICJDU0lTTzEzSklTQzYyMjBKUCIsICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDEiLCAgICAgICAiWDAyMDEiLCAgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIkNTSVNPODdKSVNYMDIwOCIsICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIwOCIsICAgICAgICJJU08tSVItODciLCAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMDgiLCAgICAgICAiWDAyMDgiLCAgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjA4IiwgICAgICAgIlgwMjA4REJJSklTX1gwMjA4LTE5ODMiLCBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiSklTMDIxMiIsICAgICAgICJDU0lTTzE1OUpJU1gwMjEyMTk5MCIsICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIkpJUzAyMTIiLCAgICAgICAiSVNPLUlSLTE1OSIsICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJKSVMwMjEyIiwgICAgICAgIlgwMjEyIiwgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiS09JOF9SIiwgICAgICAgICJDU0tPSThSIiwgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIktPSThfUiIsICAgICAgICAiS09JOC1SIiwgICAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJLU0M1NjAxIiwgICAgICAgIkVVQy1LUiIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiTVM5MzIiLCAgICAgICAgICJDU1dJTkRPV1MzMUoiLCAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIk1TOTMyIiwgICAgICAgICAiV0lORE9XUy0zMUoiLCAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJTSklTIiwgICAgICAgICAgIkNTU0hJRlRKSVMiLCAgICAgICAgICAgICBmYWxzZSApOworICAgICAgICBhZGRNYXBwaW5nKCAiU0pJUyIsICAgICAgICAgICJNU19LQU5KSSIsICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIlNKSVMiLCAgICAgICAgICAiU0hJRlRfSklTIiwgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJUSVM2MjAiLCAgICAgICAgIlRJUy02MjAiLCAgICAgICAgICAgICAgICB0cnVlICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJVTklDT0RFIiwgICAgICAgIlVURi0xNiIsICAgICAgICAgICAgICAgICB0cnVlICApOworICAgICAgICBhZGRNYXBwaW5nKCAiVU5JQ09ERUJJRyIsICAgICJVVEYtMTZCRSIsICAgICAgICAgICAgICAgdHJ1ZSAgKTsKKyAgICAgICAgYWRkTWFwcGluZyggIlVOSUNPREVMSVRUTEUiLCAiVVRGLTE2TEUiLCAgICAgICAgICAgICAgIHRydWUgICk7CisgICAgICAgIGFkZE1hcHBpbmcoICJVVEY4IiwgICAgICAgICAgIlVURi04IiwgICAgICAgICAgICAgICAgICB0cnVlICApOworCisgICAgICAgIGFzc2VydCBjb21wbGV0ZU1hcHBpbmdzKCk7CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HZW5lcmljWG1sSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9HZW5lcmljWG1sSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA0YjdlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dlbmVyaWNYbWxJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjQwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlJlZmVyZW5jZVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFhNTElucHV0U3RyZWFtCit7CisgICAgcHVibGljIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSAoICkKKyAgICB7CisgICAgICAgIF9tYXN0ZXIgPSB0aGlzOworICAgICAgICBfZWxlbWVudENvdW50ID0gMTsgLy8gR28gYWxsIHRoZSB3YXkKKyAgICB9CisKKyAgICBwcml2YXRlIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSAoIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBtYXN0ZXIgKQorICAgIHsKKyAgICAgICAgKF9tYXN0ZXIgPSBtYXN0ZXIpLmVuc3VyZUluaXQoKTsKKyAgICAgICAgX25leHRFdmVudCA9IG1hc3Rlci5fbmV4dEV2ZW50OworICAgIH0KKyAgICAKKyAgICAvLworICAgIC8vIFRoZSBzb3VyY2UgZm9yIGFsbCBldmVudHMKKyAgICAvLworCisgICAgcHJvdGVjdGVkIFhNTEV2ZW50IG5leHRFdmVudCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJuZXh0RXZlbnQgbm90IG92ZXJyaWRkZW4iICk7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vCisKKyAgICBwcml2YXRlIGNsYXNzIEV2ZW50SXRlbQorICAgIHsKKyAgICAgICAgRXZlbnRJdGVtICggWE1MRXZlbnQgZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ldmVudCA9IGU7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaW50ICAgICBnZXRUeXBlICggKSB7IHJldHVybiBfZXZlbnQuZ2V0VHlwZSgpOyB9CisgICAgICAgIGJvb2xlYW4gaGFzTmFtZSAoICkgeyByZXR1cm4gX2V2ZW50Lmhhc05hbWUoKTsgfQorICAgICAgICBYTUxOYW1lIGdldE5hbWUgKCApIHsgcmV0dXJuIF9ldmVudC5nZXROYW1lKCk7IH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIFhNTEV2ZW50IF9ldmVudDsKKyAgICAgICAgCisgICAgICAgIEV2ZW50SXRlbSBfbmV4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5pdCAoICkKKyAgICB7CisgICAgICAgIGlmICghX21hc3Rlci5faW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tYXN0ZXIuX25leHRFdmVudCA9IGdldE5leHRFdmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBYTUxTdHJlYW1FeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgX21hc3Rlci5faW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBFdmVudEl0ZW0gZ2V0TmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBYTUxFdmVudCBlID0gbmV4dEV2ZW50KCk7CisKKyAgICAgICAgcmV0dXJuIGUgPT0gbnVsbCA/IG51bGwgOiBuZXcgRXZlbnRJdGVtKCBlICk7CisgICAgfQorCisgICAgcHVibGljIFhNTEV2ZW50IG5leHQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVuc3VyZUluaXQoKTsKKyAgICAgICAgCisgICAgICAgIEV2ZW50SXRlbSBjdXJyZW50RXZlbnQgPSBfbmV4dEV2ZW50OworCisgICAgICAgIGlmIChfbmV4dEV2ZW50ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50Ll9uZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgX25leHRFdmVudC5fbmV4dCA9IF9tYXN0ZXIuZ2V0TmV4dEV2ZW50KCk7CisKKyAgICAgICAgICAgIF9uZXh0RXZlbnQgPSBfbmV4dEV2ZW50Ll9uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnRFdmVudCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKGN1cnJlbnRFdmVudC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLV9lbGVtZW50Q291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICBfbmV4dEV2ZW50ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJyZW50RXZlbnQuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICBfZWxlbWVudENvdW50Kys7CisKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRFdmVudC5fZXZlbnQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZW5zdXJlSW5pdCgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIF9uZXh0RXZlbnQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBuZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2tpcEVsZW1lbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVuc3VyZUluaXQoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHR5cGUgPSBuZXh0KCkuZ2V0VHlwZSgpOworCisgICAgICAgICAgICBpZiAodHlwZSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UKQorICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFhNTEV2ZW50LkVORF9FTEVNRU5UICYmIC0tY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYTUxFdmVudCBwZWVrICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBlbnN1cmVJbml0KCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gX25leHRFdmVudC5fZXZlbnQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIGludCBldmVudFR5cGUgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBlbnN1cmVJbml0KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKCA7IF9uZXh0RXZlbnQgIT0gbnVsbCA7IG5leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50LmdldFR5cGUoKSA9PSBldmVudFR5cGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2tpcCAoIFhNTE5hbWUgbmFtZSApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVuc3VyZUluaXQoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIDsgX25leHRFdmVudCAhPSBudWxsIDsgbmV4dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9uZXh0RXZlbnQuaGFzTmFtZSgpICYmIF9uZXh0RXZlbnQuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNraXAgKCBYTUxOYW1lIG5hbWUsIGludCBldmVudFR5cGUgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBlbnN1cmVJbml0KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKCA7IF9uZXh0RXZlbnQgIT0gbnVsbCA7IG5leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dEV2ZW50LmdldFR5cGUoKSA9PSBldmVudFR5cGUgJiYKKyAgICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQuaGFzTmFtZSgpICYmCisgICAgICAgICAgICAgICAgICAgIF9uZXh0RXZlbnQuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBnZXRTdWJTdHJlYW0gKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVuc3VyZUluaXQoKTsKKyAgICAgICAgCisgICAgICAgIEdlbmVyaWNYbWxJbnB1dFN0cmVhbSBzdWJTdHJlYW0gPSBuZXcgR2VuZXJpY1htbElucHV0U3RyZWFtKCB0aGlzICk7CisKKyAgICAgICAgc3ViU3RyZWFtLnNraXAoIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKKworICAgICAgICByZXR1cm4gc3ViU3RyZWFtOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBCVUdCVUcgLSBjYW4gSSBkbyBhbnl0aGluZyBoZXJlLCByZWFsbHk/CisgICAgICAgIC8vIFNIb3VsZCBJIGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlbiBzdWIgc3RyZWFtcz8KKyAgICAgICAgLy8gSSBoYXZlIG5vIGRlc3RydWN0b3IsIGhvdyBjYW4gSSBjbG9zZSBwcm9wZXJseT8KKyAgICB9CisKKyAgICBwdWJsaWMgUmVmZXJlbmNlUmVzb2x2ZXIgZ2V0UmVmZXJlbmNlUmVzb2x2ZXIgKCApCisgICAgeworICAgICAgICBlbnN1cmVJbml0KCk7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5vdCBpbXBsIiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZVJlc29sdmVyICggUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIgKQorICAgIHsKKyAgICAgICAgZW5zdXJlSW5pdCgpOworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOb3QgaW1wbCIgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICBfaW5pdGlhbGl6ZWQ7CisgICAgcHJpdmF0ZSBFdmVudEl0ZW0gICAgICAgICAgICAgX25leHRFdmVudDsKKyAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICBfZWxlbWVudENvdW50OworICAgIHByaXZhdGUgR2VuZXJpY1htbElucHV0U3RyZWFtIF9tYXN0ZXI7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vR2xvYmFsTG9jay5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dsb2JhbExvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ4ODliCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0dsb2JhbExvY2suamF2YQpAQCAtMCwwICsxLDMwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCisvKioKKyAqIFdoZW5ldmVyIG11bHRpcGxlIGxvY2tzIG11c3QgYmUgYWNxdWlyZWQgd2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorICogWE1MIEJlYW5zLCB0aGlzIEdsb2JhbExvY2sgaXMgYWNxdWlyZWQgZmlyc3QsIGFuZCB0aGVuIHJlbGVhc2VkIHdoZW4gYWxsCisgKiB0aGUgYWN1dGFsbHktbmVlZGVkIGxvY2tzIGhhdmUgYmVlbiBhY3F1aXJlZC4gIFRoaXMgcHJldmVudHMgZGVhZGxvY2tzLgorICovIAorcHVibGljIGNsYXNzIEdsb2JhbExvY2sKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdXRleCBHTE9CQUxfTVVURVggPSBuZXcgTXV0ZXgoKTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWNxdWlyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7IEdMT0JBTF9NVVRFWC5hY3F1aXJlKCk7IH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJ5VG9BY3F1aXJlKCkgeyBHTE9CQUxfTVVURVgudHJ5VG9BY3F1aXJlKCk7IH0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZSgpIHsgR0xPQkFMX01VVEVYLnJlbGVhc2UoKTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lPVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzljYTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSU9VdGlsLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKKworcHVibGljIGNsYXNzIElPVXRpbAoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5Q29tcGxldGVseShJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvL2lmIGJvdGggYXJlIGZpbGUgc3RyZWFtcywgdXNlIGNoYW5uZWwgSU8KKyAgICAgICAgaWYgKChvdXRwdXQgaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKSAmJiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlSW5wdXRTdHJlYW0pKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlQ2hhbm5lbCB0YXJnZXQgPSAoKEZpbGVPdXRwdXRTdHJlYW0pIG91dHB1dCkuZ2V0Q2hhbm5lbCgpOworICAgICAgICAgICAgICAgIEZpbGVDaGFubmVsIHNvdXJjZSA9ICgoRmlsZUlucHV0U3RyZWFtKSBpbnB1dCkuZ2V0Q2hhbm5lbCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlclRvKDAsIEludGVnZXIuTUFYX1ZBTFVFLCB0YXJnZXQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIHRhcmdldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsgLyogZmFpbG92ZXIgdG8gYnl0ZSBzdHJlYW0gdmVyc2lvbiAqLyB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBpbnB1dC5yZWFkKGJ1Zik7CisgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShidWYsIDAsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7IGlucHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICAgICAgdHJ5IHsgb3V0cHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkge30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUNvbXBsZXRlbHkoVVJJIGlucHV0LCBVUkkgb3V0cHV0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShpbnB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gbm90QUZpbGUpCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgCisgICAgICAgICAgICBGaWxlIG91dCA9IG5ldyBGaWxlKG91dHB1dCk7CisgICAgICAgICAgICBGaWxlIGRpciA9IG91dC5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGluID0gaW5wdXQudG9VUkwoKS5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoaW4sIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY29weSB0byAiICsgb3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lkZW50aXR5Q29uc3RyYWludC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0lkZW50aXR5Q29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWY4MDMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vSWRlbnRpdHlDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw1NjIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyLkV2ZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIElkZW50aXR5IGNvbnN0cmFpbnQgZW5naW5lLiBQZXJmb3JtcyBzdHJlYW1pbmcgdmFsaWRhdGlvbiBvZiBpZGVudGl0eSBjb25zdHJhaW50cy4KKyAqIFRoaXMgaW5jbHVkZXMga2V5LCBrZXlyZWYsICYgdW5pcXVlLCBhcyB3ZWxsIGFzIElEICYgSURSZWYuCisgKi8KK3B1YmxpYyBjbGFzcyBJZGVudGl0eUNvbnN0cmFpbnQgeworCisgICAgcHJpdmF0ZSBDb25zdHJhaW50U3RhdGUgX2NvbnN0cmFpbnRTdGFjazsKKyAgICBwcml2YXRlIEVsZW1lbnRTdGF0ZSBfZWxlbWVudFN0YWNrOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZXJyb3JMaXN0ZW5lcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ludmFsaWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF90cmFja0lkcmVmczsgLy8gV2Ugb25seSB0cmFjayBpZHJlZnMgaWYgdmFsaWRhdGluZyBmcm9tIHRoZSByb290IGVsZW1lbnQKKworICAgIHB1YmxpYyBJZGVudGl0eUNvbnN0cmFpbnQoQ29sbGVjdGlvbiAgZXJyb3JMaXN0ZW5lciwgYm9vbGVhbiB0cmFja0lkcmVmcykgeworICAgICAgICBfZXJyb3JMaXN0ZW5lciA9IGVycm9yTGlzdGVuZXI7CisgICAgICAgIF90cmFja0lkcmVmcyA9IHRyYWNrSWRyZWZzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWNzKSB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IHN0YXRlIGZvciB0aGUgZWxlbWVudAorICAgICAgICBuZXdTdGF0ZSgpOworCisgICAgICAgIC8vIEZpcnN0IGRpc3BhdGNoIHRoaXMgZWxlbWVudCBldmVudAorICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKKyAgICAgICAgICAgIGNzLmVsZW1lbnQoZSwgc3QpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTZWxlY3RvclN0YXRlIGZvciBlYWNoIG5ldyBJZGVudGl0eSBDb25zdHJhaW50CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpY3MgIT0gbnVsbCAmJiBpIDwgaWNzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgIG5ld0NvbnN0cmFpbnRTdGF0ZShpY3NbaV0sIGUsIHN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIHsKKyAgICAgICAgLy8gUG9wIHRoZSBlbGVtZW50IHN0YXRlIHN0YWNrIGFuZCBhbnkgY29uc3RyYWludHMgYXQgdGhpcyBkZXB0aAorICAgICAgICBpZiAoX2VsZW1lbnRTdGFjay5faGFzQ29uc3RyYWludHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoQ29uc3RyYWludFN0YXRlIGNzID0gX2NvbnN0cmFpbnRTdGFjayA7IGNzICE9IG51bGwgJiYgY3MgIT0gX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50IDsgY3MgPSBjcy5fbmV4dCkKKyAgICAgICAgICAgICAgICBjcy5yZW1vdmUoIGUgKTsKKworICAgICAgICAgICAgX2NvbnN0cmFpbnRTdGFjayA9IF9lbGVtZW50U3RhY2suX3NhdmVQb2ludDsKKyAgICAgICAgfQorCisgICAgICAgIF9lbGVtZW50U3RhY2sgPSBfZWxlbWVudFN0YWNrLl9uZXh0OworCisgICAgICAgIC8vIERpc3BhdGNoIHRoZSBldmVudAorICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKKyAgICAgICAgICAgIGNzLmVuZEVsZW1lbnQoZSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9jb25zdHJhaW50U3RhY2sgOyBjcyAhPSBudWxsIDsgY3MgPSBjcy5fbmV4dCkKKyAgICAgICAgICAgIGNzLmF0dHIoZSwgbmFtZSwgc3QsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIHsKKyAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfY29uc3RyYWludFN0YWNrIDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQpCisgICAgICAgICAgICBjcy50ZXh0KGUsIHN0LCB2YWx1ZSwgZW1wdHlDb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gIV9pbnZhbGlkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdDb25zdHJhaW50U3RhdGUoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGljLCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KQorICAgIHsKKyAgICAgICAgaWYgKGljLmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCisgICAgICAgICAgICBuZXcgS2V5cmVmU3RhdGUoaWMsIGUsIHN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmV3IFNlbGVjdG9yU3RhdGUoaWMsIGUsIHN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJZFN0YXRlcygpCisgICAgeworICAgICAgICAvLyBDb25zdHJ1Y3Qgc3RhdGVzIHRvIGhvbGQgdGhlIHZhbHVlcyBmb3IgSURzIGFuZCBJRFJlZnMKKyAgICAgICAgSWRTdGF0ZSBpZHMgPSBuZXcgSWRTdGF0ZSgpOworICAgICAgICBpZiAoX3RyYWNrSWRyZWZzKQorICAgICAgICAgICAgbmV3IElkUmVmU3RhdGUoaWRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV3U3RhdGUoKSB7CisgICAgICAgIGJvb2xlYW4gZmlyc3RUaW1lID0gX2VsZW1lbnRTdGFjayA9PSBudWxsOworCisgICAgICAgIEVsZW1lbnRTdGF0ZSBzdCA9IG5ldyBFbGVtZW50U3RhdGUoKTsKKyAgICAgICAgc3QuX25leHQgPSBfZWxlbWVudFN0YWNrOworICAgICAgICBfZWxlbWVudFN0YWNrID0gc3Q7CisKKyAgICAgICAgaWYgKGZpcnN0VGltZSkKKyAgICAgICAgICAgIGJ1aWxkSWRTdGF0ZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW1pdEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2cgKQorICAgIHsKKyAgICAgICAgX2ludmFsaWQgPSB0cnVlOworCisgICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZXZlbnQgIT0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuYWRkKAorICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckN1cnNvciggbXNnLCBldmVudC5nZXRMb2NhdGlvbkFzQ3Vyc29yKCkgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFNhdmVQb2ludCggQ29uc3RyYWludFN0YXRlIGNzICkKKyAgICB7CisgICAgICAgIGlmICghIF9lbGVtZW50U3RhY2suX2hhc0NvbnN0cmFpbnRzKQorICAgICAgICAgICAgX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50ID0gY3M7CisKKyAgICAgICAgX2VsZW1lbnRTdGFjay5faGFzQ29uc3RyYWludHMgPSB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdCBuZXdWYWx1ZShTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN0Lm5ld1ZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBiaXQgaGFja3kuIG5ld1ZhbHVlIHRocm93cyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gd2hpY2ggaXMgCisgICAgICAgICAgICAvLyB1bmNoZWNrZWQgYW5kIGRlY2xhcmVkIGluIHR5cGVpbXBsLiBJIGNhbiBvbmx5IGNhdGNoIGl0cyBwYXJlbnQgY2xhc3MsIAorICAgICAgICAgICAgLy8gdHlwZWltcGwgaXMgYnVpbHQgYWZ0ZXIgY29tbW9uLgorCisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlc2UgZXhjZXB0aW9ucy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiB3aWxsIGNhdGNoIHRoZW0uCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2ltcGxlIHR5cGUgZm9yIHNjaGVtYSB0eXBlLiBJZiB0aGUgc2NoZW1hIHR5cGUgaXMgYWxyZWFkeQorICAgICAqIHNpbXBsZSwganVzdCByZXR1cm4gaXQuIElmIGl0IGlzIGEgY29tcGxleCB0eXBlIHdpdGggc2ltcGxlIGNvbnRlbnQsCisgICAgICogcmV0dXJuIHRoZSBzaW1wbGUgdHlwZSBpdCBleHRlbmRzLgorICAgICAqLworICAgIHN0YXRpYyBTY2hlbWFUeXBlIGdldFNpbXBsZVR5cGUoU2NoZW1hVHlwZSBzdCkgCisgICAgeworICAgICAgICBhc3NlcnQgc3QuaXNTaW1wbGVUeXBlKCkgfHwgc3QuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UIDogCisgICAgICAgICAgICBzdCArICIgZG9lcyBub3QgaGF2ZSBzaW1wbGUgY29udGVudC4iOworCisgICAgICAgIHdoaWxlICghIHN0LmlzU2ltcGxlVHlwZSgpICkKKyAgICAgICAgICAgIHN0ID0gc3QuZ2V0QmFzZVR5cGUoKTsKKworICAgICAgICByZXR1cm4gc3Q7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gaGFzU2ltcGxlQ29udGVudChTY2hlbWFUeXBlIHN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0LmlzU2ltcGxlVHlwZSgpIHx8IHN0LmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludFN0YXRlIHsKKyAgICAgICAgQ29uc3RyYWludFN0YXRlIF9uZXh0OworCisgICAgICAgIENvbnN0cmFpbnRTdGF0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldFNhdmVQb2ludChfY29uc3RyYWludFN0YWNrKTsKKyAgICAgICAgICAgIF9uZXh0ID0gX2NvbnN0cmFpbnRTdGFjazsKKyAgICAgICAgICAgIF9jb25zdHJhaW50U3RhY2sgPSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3Qgdm9pZCBlbGVtZW50KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QpOworICAgICAgICBhYnN0cmFjdCB2b2lkIGVuZEVsZW1lbnQoRXZlbnQgZSk7CisgICAgICAgIGFic3RyYWN0IHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpOworICAgICAgICBhYnN0cmFjdCB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCk7CisgICAgICAgIGFic3RyYWN0IHZvaWQgcmVtb3ZlKEV2ZW50IGUpOworCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFNlbGVjdG9yU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUgeworICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgX2NvbnN0cmFpbnQ7CisgICAgICAgIFNldCBfdmFsdWVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgWFBhdGguRXhlY3V0aW9uQ29udGV4dCBfY29udGV4dDsKKworICAgICAgICBTZWxlY3RvclN0YXRlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBjb25zdHJhaW50LCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7CisgICAgICAgICAgICBfY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7CisgICAgICAgICAgICBfY29udGV4dCA9IG5ldyBYUGF0aC5FeGVjdXRpb25Db250ZXh0KCk7CisgICAgICAgICAgICBfY29udGV4dC5pbml0KChYUGF0aClfY29uc3RyYWludC5nZXRTZWxlY3RvclBhdGgoKSk7CisKKyAgICAgICAgICAgIGlmICggKCBfY29udGV4dC5zdGFydCgpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQgKSAhPSAwICkKKyAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFN0YXRlKGUsIHN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkRmllbGRzKFhtbE9iamVjdExpc3QgZmllbGRzLCBFdmVudCBlKSAKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jb25zdHJhaW50LmdldENvbnN0cmFpbnRDYXRlZ29yeSgpID09IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpCisgICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoZmllbGRzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF92YWx1ZXMuY29udGFpbnMoZmllbGRzKSkgCisgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJEdXBsaWNhdGUga2V5ICciICsgZmllbGRzICsgIicgZm9yIGtleSBvciB1bmlxdWUgY29uc3RyYWludCAiICsgUU5hbWVIZWxwZXIucHJldHR5KF9jb25zdHJhaW50LmdldE5hbWUoKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF92YWx1ZXMuYWRkKGZpZWxkcyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKCBfY29udGV4dC5lbGVtZW50KGUuZ2V0TmFtZSgpKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUKSAhPSAwICkKKyAgICAgICAgICAgICAgICBjcmVhdGVGaWVsZFN0YXRlKGUsIHN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSAKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbnRleHQuZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNyZWF0ZUZpZWxkU3RhdGUoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkgeworICAgICAgICAgICAgbmV3IEZpZWxkU3RhdGUodGhpcywgZSwgc3QpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgeworICAgICAgICAgICAgLy8gQnViYmxlIHVwIGtleSwgdW5pcXVlIHZhbHVlcyB0byBrZXlyZWZzCisgICAgICAgICAgICBmb3IgKENvbnN0cmFpbnRTdGF0ZSBjcyA9IF9uZXh0IDsgY3MgIT0gbnVsbCA7IGNzID0gY3MuX25leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjcyBpbnN0YW5jZW9mIEtleXJlZlN0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5cmVmU3RhdGUga3IgPSAoS2V5cmVmU3RhdGUpY3M7CisgICAgICAgICAgICAgICAgICAgIGlmIChrci5fY29uc3RyYWludC5nZXRSZWZlcmVuY2VkS2V5KCkgPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyLmFkZEtleVZhbHVlcyhfdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSB7fQorICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkge30KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgS2V5cmVmU3RhdGUgZXh0ZW5kcyBTZWxlY3RvclN0YXRlIHsKKyAgICAgICAgU2V0IF9rZXlWYWx1ZXMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIEtleXJlZlN0YXRlKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBjb25zdHJhaW50LCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7CisgICAgICAgICAgICBzdXBlcihjb25zdHJhaW50LCBlLCBzdCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEtleVZhbHVlcyhmaW5hbCBTZXQgdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCVUc6IHJlbW92ZSBkdXBsaWNhdGVzCisgICAgICAgICAgICBfa2V5VmFsdWVzLmFkZEFsbCh2YWx1ZXMpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgeworICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBrZXlzIGF0IHRoZSBzYW1lIHN0YWNrIGxldmVsIGFzIHRoaXMKKyAgICAgICAgICAgIC8vIHRoYXQgbWF5IGNvbnRyaWJ1dGUga2V5IHZhbHVlcyB0byBtZQorICAgICAgICAgICAgZm9yIChDb25zdHJhaW50U3RhdGUgY3MgPSBfbmV4dCA7IGNzICE9IG51bGwgJiYgY3MgIT0gX2VsZW1lbnRTdGFjay5fc2F2ZVBvaW50IDsgY3MgPSBjcy5fbmV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3MgaW5zdGFuY2VvZiBTZWxlY3RvclN0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JTdGF0ZSBzZWwgPSAoU2VsZWN0b3JTdGF0ZSljczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbC5fY29uc3RyYWludCA9PSBfY29uc3RyYWludC5nZXRSZWZlcmVuY2VkS2V5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXlWYWx1ZXMoc2VsLl92YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBhbGwgdmFsdWVzIGhhdmUgYmVlbiBzZWVuCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gX3ZhbHVlcy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpIDsgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBmaWVsZHMgPSAoWG1sT2JqZWN0TGlzdClpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkcy51bmZpbGxlZCgpIDwgMCAmJiAhIF9rZXlWYWx1ZXMuY29udGFpbnMoZmllbGRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiS2V5ICciICsgZmllbGRzICsgIicgbm90IGZvdW5kIChrZXlSZWYgIiArIFFOYW1lSGVscGVyLnByZXR0eShfY29uc3RyYWludC5nZXROYW1lKCkpICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBGaWVsZFN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlIHsKKyAgICAgICAgU2VsZWN0b3JTdGF0ZSBfc2VsZWN0b3I7CisgICAgICAgIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHRbXSBfY29udGV4dHM7CisgICAgICAgIGJvb2xlYW5bXSBfbmVlZHNWYWx1ZTsKKyAgICAgICAgWG1sT2JqZWN0TGlzdCBfdmFsdWU7CisKKyAgICAgICAgRmllbGRTdGF0ZShTZWxlY3RvclN0YXRlIHNlbGVjdG9yLCBFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7CisKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgbmV3IEZpZWxkIFN0YXRlIGZvcjogIiArIGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgX3NlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWMgPSBzZWxlY3Rvci5fY29uc3RyYWludDsKKworICAgICAgICAgICAgaW50IGZpZWxkQ291bnQgPSBpYy5nZXRGaWVsZHMoKS5sZW5ndGg7CisgICAgICAgICAgICBfY29udGV4dHMgPSBuZXcgWFBhdGguRXhlY3V0aW9uQ29udGV4dFtmaWVsZENvdW50XTsKKyAgICAgICAgICAgIF9uZWVkc1ZhbHVlID0gbmV3IGJvb2xlYW5bZmllbGRDb3VudF07CisgICAgICAgICAgICBfdmFsdWUgPSBuZXcgWG1sT2JqZWN0TGlzdChmaWVsZENvdW50KTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZmllbGRDb3VudCA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29udGV4dHNbaV0gPSBuZXcgWFBhdGguRXhlY3V0aW9uQ29udGV4dCgpOworICAgICAgICAgICAgICAgIF9jb250ZXh0c1tpXS5pbml0KChYUGF0aClpYy5nZXRGaWVsZFBhdGgoaSkpOworICAgICAgICAgICAgICAgIGlmICggKCBfY29udGV4dHNbaV0uc3RhcnQoKSAmIFhQYXRoLkV4ZWN1dGlvbkNvbnRleHQuSElUICkgIT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhpdCBmb3IgZWxlbWVudDogIiArIGUuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1NpbXBsZUNvbnRlbnQoc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNWYWx1ZVtpXSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2NvbnRleHRzLmxlbmd0aCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChfbmVlZHNWYWx1ZVtpXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiSWRlbnRpdHkgY29uc3RyYWludCBmaWVsZCBtdXN0IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9jb250ZXh0cy5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoICggX2NvbnRleHRzW2ldLmVsZW1lbnQoZS5nZXROYW1lKCkpICYgWFBhdGguRXhlY3V0aW9uQ29udGV4dC5ISVQpICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgaGFzU2ltcGxlQ29udGVudChzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZSwgIklkZW50aXR5IGNvbnN0cmFpbnQgZmllbGQgbXVzdCBoYXZlIHNpbXBsZSBjb250ZW50Iik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9uZWVkc1ZhbHVlW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGF0dHIoRXZlbnQgZSwgUU5hbWUgbmFtZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfY29udGV4dHNbaV0uYXR0cihuYW1lKSApIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IG8gPSBuZXdWYWx1ZShzdCwgdmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCisgICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldCA9IF92YWx1ZS5zZXQobywgaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJNdWx0aXBsZSBpbnN0YW5jZXMgb2YgZmllbGQgd2l0aCB4cGF0aDogJyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbaV0gKyAiJyBmb3IgYSBzZWxlY3RvciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkgeworCisgICAgICAgICAgICAvLyBOdWxsIHZhbHVlIGluZGljYXRlcyBwcmV2aW91c2x5IHJlcG9ydGVkIHZhbGlkYXRpb24gcHJvYmxlbQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgIWVtcHR5Q29udGVudCkgcmV0dXJuOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfY29udGV4dHMubGVuZ3RoIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfbmVlZHNWYWx1ZVtpXSApIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlDb250ZW50IHx8ICFoYXNTaW1wbGVDb250ZW50KHN0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJZGVudGl0eSBjb25zdHJhaW50IGZpZWxkIG11c3QgaGF2ZSBzaW1wbGUgY29udGVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBzaW1wbGVUeXBlID0gZ2V0U2ltcGxlVHlwZShzdCk7CisgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCBvID0gbmV3VmFsdWUoc2ltcGxlVHlwZSwgdmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCisgICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldCA9IF92YWx1ZS5zZXQobywgaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJNdWx0aXBsZSBpbnN0YW5jZXMgb2YgZmllbGQgd2l0aCB4cGF0aDogJyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbaV0gKyAiJyBmb3IgYSBzZWxlY3RvciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5kRWxlbWVudChFdmVudCBlKSB7CisgICAgICAgICAgICAvLyByZXNldCBhbnkgIF9uZWVkc1ZhbHVlIGZsYWdzIAorICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgd2UgZGlkbid0IHNlZSB0aGUgdGV4dCwgaXQgd2FzIGJlY2F1c2Ugb2YgYW5vdGhlciB2YWxpZGF0aW9uCisgICAgICAgICAgICAvLyBlcnJvciwgc28gZG9uJ3QgZW1pdCBhbm90aGVyIG9uZS4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9uZWVkc1ZhbHVlLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29udGV4dHNbaV0uZW5kKCk7CisgICAgICAgICAgICAgICAgX25lZWRzVmFsdWVbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSkgCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKF9zZWxlY3Rvci5fY29uc3RyYWludC5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZICYmCisgICAgICAgICAgICAgICAgX3ZhbHVlLnVuZmlsbGVkKCkgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8ga2V5cyBtdXN0IGhhdmUgYWxsIHZhbHVlcyBzdXBwbGllZAorICAgICAgICAgICAgICAgIGVtaXRFcnJvcihlLCAiS2V5ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoX3NlbGVjdG9yLl9jb25zdHJhaW50LmdldE5hbWUoKSkgKyAiIGlzIG1pc3NpbmcgZmllbGQgd2l0aCB4cGF0aDogJyIgKyBfc2VsZWN0b3IuX2NvbnN0cmFpbnQuZ2V0RmllbGRzKClbX3ZhbHVlLnVuZmlsbGVkKCldICsgIiciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBGaW5pc2hlZC4gQWRkIHRoZXNlIGZpZWxkcyB0byB0aGUgc2VsZWN0b3Igc3RhdGUKKyAgICAgICAgICAgICAgICBfc2VsZWN0b3IuYWRkRmllbGRzKF92YWx1ZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBJZFN0YXRlIGV4dGVuZHMgQ29uc3RyYWludFN0YXRlCisgICAgeworICAgICAgICBTZXQgX3ZhbHVlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisKKyAgICAgICAgSWRTdGF0ZSgpIHsgfQorCisgICAgICAgIHZvaWQgYXR0cihFdmVudCBlLCBRTmFtZSBuYW1lLCBTY2hlbWFUeXBlIHN0LCBTdHJpbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRleHQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGVtcHR5Q29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVtcHR5Q29udGVudCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVmFsdWUoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCwgU3RyaW5nIHZhbHVlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIE51bGwgdmFsdWUgaW5kaWNhdGVzIHByZXZpb3VzbHkgcmVwb3J0ZWQgdmFsaWRhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoc3QgPT0gbnVsbCB8fCBzdC5pc05vVHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoWG1sSUQudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxPYmplY3RMaXN0IHhtbFZhbHVlID0gbmV3IFhtbE9iamVjdExpc3QoMSk7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0IG8gPSBuZXdWYWx1ZShYbWxJRC50eXBlLCB2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCB2YWx1ZXMuIEFzc3VtZSB0aGF0IHZhbGlkYXRpb24gY2F0Y2hlcyB0aGVzZQorICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgIHhtbFZhbHVlLnNldChvLCAwKTsKKworICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLmNvbnRhaW5zKHhtbFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJEdXBsaWNhdGUgSUQgdmFsdWUgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLmFkZCh4bWxWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVsZW1lbnQoRXZlbnQgZSwgU2NoZW1hVHlwZSBzdCkge30KKyAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpe30KKyAgICAgICAgdm9pZCByZW1vdmUoRXZlbnQgZSl7fQorCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIElkUmVmU3RhdGUgZXh0ZW5kcyBDb25zdHJhaW50U3RhdGUKKyAgICB7CisgICAgICAgIElkU3RhdGUgX2lkczsKKyAgICAgICAgTGlzdCBfdmFsdWVzOworCisgICAgICAgIElkUmVmU3RhdGUoSWRTdGF0ZSBpZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9pZHMgPSBpZHM7CisgICAgICAgICAgICBfdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVZhbHVlKEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTnVsbCB2YWx1ZSBpbmRpY2F0ZXMgcHJldmlvdXNseSByZXBvcnRlZCB2YWxpZGF0aW9uIHByb2JsZW0KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChzdCA9PSBudWxsIHx8IHN0LmlzTm9UeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWG1sSURSRUZTLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sSURSRUZTIGx2ID0gKFhtbElEUkVGUyluZXdWYWx1ZShYbWxJRFJFRlMudHlwZSwgdmFsdWUpOworCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGludmFsaWQgdmFsdWVzLiBBc3N1bWUgdGhhdCB2YWxpZGF0aW9uIGNhdGNoZXMgdGhlc2UKKyAgICAgICAgICAgICAgICBpZiAobHYgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAgICAgTGlzdCBsID0gbHYueGdldExpc3RWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIG9uZSB2YWx1ZSBmb3IgZWFjaCBpZHJlZiBpbiB0aGUgbGlzdAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGwuc2l6ZSgpIDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCB4bWxWYWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KDEpOworICAgICAgICAgICAgICAgICAgICBYbWxJRFJFRiBpZHJlZiA9IChYbWxJRFJFRilsLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sVmFsdWUuc2V0KGlkcmVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoeG1sVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFhtbElEUkVGLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCB4bWxWYWx1ZSA9IG5ldyBYbWxPYmplY3RMaXN0KDEpOworICAgICAgICAgICAgICAgIFhtbElEUkVGIGlkcmVmID0gKFhtbElEUkVGKXN0Lm5ld1ZhbHVlKHZhbHVlKTsKKworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIHZhbHVlcy4gQXNzdW1lIHRoYXQgdmFsaWRhdGlvbiBjYXRjaGVzIHRoZXNlCisgICAgICAgICAgICAgICAgaWYgKGlkcmVmID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgICAgIHhtbFZhbHVlLnNldChpZHJlZiwgMCk7CisgICAgICAgICAgICAgICAgX3ZhbHVlcy5hZGQoeG1sVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhdHRyKEV2ZW50IGUsIFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZVZhbHVlKGUsIHN0LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB0ZXh0KEV2ZW50IGUsIFNjaGVtYVR5cGUgc3QsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBlbXB0eUNvbnRlbnQpIAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW1wdHlDb250ZW50KQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaGFuZGxlVmFsdWUoZSwgc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlbW92ZShFdmVudCBlKSAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGVhY2ggcmVmIGhhcyBhIGNvcnJlc3BvbmRpbmcgSUQKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBfdmFsdWVzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCEgX2lkcy5fdmFsdWVzLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKGUsICJJRCBub3QgZm91bmQgZm9yIElEUmVmIHZhbHVlICciICsgbyArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgZWxlbWVudChFdmVudCBlLCBTY2hlbWFUeXBlIHN0KSB7IH0KKyAgICAgICAgdm9pZCBlbmRFbGVtZW50KEV2ZW50IGUpIHsgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVsZW1lbnRTdGF0ZSB7CisgICAgICAgIEVsZW1lbnRTdGF0ZSBfbmV4dDsKKyAgICAgICAgYm9vbGVhbiBfaGFzQ29uc3RyYWludHM7CisgICAgICAgIENvbnN0cmFpbnRTdGF0ZSBfc2F2ZVBvaW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9MZXZlbnNodGVpbi5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL0xldmVuc2h0ZWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2MGIwZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9MZXZlbnNodGVpbi5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK3B1YmxpYyBjbGFzcyBMZXZlbnNodGVpbgoreworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIEdldCBtaW5pbXVtIG9mIHRocmVlIHZhbHVlcworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1pbmltdW0oaW50IGEsIGludCBiLCBpbnQgYykKKyAgICB7CisgICAgICAgIGludCBtaSA9IGE7CisgICAgICAgIGlmIChiIDwgbWkpCisgICAgICAgICAgICBtaSA9IGI7CisgICAgICAgIGlmIChjIDwgbWkpCisgICAgICAgICAgICBtaSA9IGM7CisgICAgICAgIHJldHVybiBtaTsKKyAgICB9CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gQ29tcHV0ZSBMZXZlbnNodGVpbiBkaXN0YW5jZQorICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBwdWJsaWMgc3RhdGljIGludCBkaXN0YW5jZShTdHJpbmcgcywgU3RyaW5nIHQpCisgICAgeworICAgICAgICBpbnQgZFtdW107IC8vIG1hdHJpeAorICAgICAgICBpbnQgbjsgLy8gbGVuZ3RoIG9mIHMKKyAgICAgICAgaW50IG07IC8vIGxlbmd0aCBvZiB0CisgICAgICAgIGludCBpOyAvLyBpdGVyYXRlcyB0aHJvdWdoIHMKKyAgICAgICAgaW50IGo7IC8vIGl0ZXJhdGVzIHRocm91Z2ggdAorICAgICAgICBjaGFyIHNfaTsgLy8gaXRoIGNoYXJhY3RlciBvZiBzCisgICAgICAgIGNoYXIgdF9qOyAvLyBqdGggY2hhcmFjdGVyIG9mIHQKKyAgICAgICAgaW50IGNvc3Q7IC8vIGNvc3QKKworICAgICAgICAvLyBTdGVwIDEKKyAgICAgICAgbiA9IHMubGVuZ3RoKCk7CisgICAgICAgIG0gPSB0Lmxlbmd0aCgpOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIGlmIChtID09IDApCisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgZCA9IG5ldyBpbnRbbisxXVttKzFdOworCisgICAgICAgIC8vIFN0ZXAgMgorICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG47IGkrKykKKyAgICAgICAgICAgIGRbaV1bMF0gPSBpOworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IG07IGorKykKKyAgICAgICAgICAgIGRbMF1bal0gPSBqOworCisgICAgICAgIC8vIFN0ZXAgMworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc19pID0gcy5jaGFyQXQgKGkgLSAxKTsKKworICAgICAgICAgICAgLy8gU3RlcCA0CisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG07IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0X2ogPSB0LmNoYXJBdChqIC0gMSk7CisKKyAgICAgICAgICAgICAgICAvLyBTdGVwIDUKKyAgICAgICAgICAgICAgICBpZiAoc19pID09IHRfaikKKyAgICAgICAgICAgICAgICAgICAgY29zdCA9IDA7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb3N0ID0gMTsKKworICAgICAgICAgICAgICAgIC8vIFN0ZXAgNgorICAgICAgICAgICAgICAgIGRbaV1bal0gPSBtaW5pbXVtKGRbaS0xXVtqXSsxLCBkW2ldW2otMV0rMSwgZFtpLTFdW2otMV0gKyBjb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0ZXAgNworICAgICAgICByZXR1cm4gZFtuXVttXTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9NdXRleC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL011dGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZTkwYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9NdXRleC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK3B1YmxpYyBjbGFzcyBNdXRleAoreworICAgIHByaXZhdGUgVGhyZWFkICBvd25lciAgICAgID0gbnVsbDsgIC8vIE93bmVyIG9mIG11dGV4LCBudWxsIGlmIG5vYm9keQorICAgIHByaXZhdGUgaW50ICAgICBsb2NrX2NvdW50ID0gMDsKKworICAgIC8qKgorICAgICAqIEFjcXVpcmUgdGhlIG11dGV4LiBUaGUgbXV0ZXggY2FuIGJlIGFjcXVpcmVkIG11bHRpcGxlIHRpbWVzCisgICAgICogYnkgdGhlIHNhbWUgdGhyZWFkLCBwcm92aWRlZCB0aGF0IGl0IGlzIHJlbGVhc2VkIGFzIG1hbnkKKyAgICAgKiB0aW1lcyBhcyBpdCBpcyBhY3F1aXJlZC4gVGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcyB1bnRpbAorICAgICAqIGl0IGhhcyBhY3F1aXJlZCB0aGUgbXV0ZXguIChUaGVyZSBpcyBubyB0aW1lb3V0KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNxdWlyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgd2hpbGUgKHRyeVRvQWNxdWlyZSgpID09IGZhbHNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLndhaXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIG11dGV4LiBSZXR1cm5zIGZhbHNlIChhbmQgZG9lcyBub3QKKyAgICAgKiBibG9jaykgaWYgaXQgY2FuJ3QgZ2V0IGl0LgorICAgICAqLworCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHRyeVRvQWNxdWlyZSgpCisgICAgeworICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBtdXRleC4gUmV0dXJuIHRydWUgaWYgeW91IGdvdCBpdC4KKworICAgICAgICBpZiggb3duZXIgPT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG93bmVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgIGxvY2tfY291bnQgPSAxOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiggb3duZXIgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICsrbG9ja19jb3VudDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIG11dGV4LiBUaGUgbXV0ZXggaGFzIHRvIGJlIHJlbGVhc2VkIGFzIG1hbnkgdGltZXMKKyAgICAgKiBhcyBpdCB3YXMgYWNxdWlyZWQgdG8gYWN0dWFsbHkgdW5sb2NrIHRoZSByZXNvdXJjZS4gVGhlIG11dGV4CisgICAgICogbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgdGhyZWFkIHRoYXQgYWNxdWlyZWQgaXQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIChhIFJ1bnRpbWVFeGNlcHRpb24pIGlmIGEgdGhyZWFkCisgICAgICogICAgICBvdGhlciB0aGFuIHRoZSBjdXJyZW50IG93bmVyIHRyaWVzIHRvIHJlbGVhc2UgdGhlIG11dGV4LgorICAgICAqLworCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgaWYgKG93bmVyICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaHJlYWQgY2FsbGluZyByZWxlYXNlKCkgZG9lc24ndCBvd24gbXV0ZXgiKTsKKworICAgICAgICBpZiAoLS1sb2NrX2NvdW50IDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG93bmVyID0gbnVsbDsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9OYW1lVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2ZmNGQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vTmFtZVV0aWwuamF2YQpAQCAtMCwwICsxLDc3MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIE5hbWVVdGlsCit7CisgICAgLy8gcHVuY3R1YXRpb24gY2hhcmFjdGVycworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBIWVBIRU4gPSAnXHUwMDJEJzsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgUEVSSU9EID0gJ1x1MDAyRSc7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIENPTE9OICA9ICdcdTAwM0EnOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBVU0NPUkUgPSAnXHUwMDVGJzsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgRE9UICAgID0gJ1x1MDBCNyc7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFRFTEVJQSA9ICdcdTAzODcnOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2hhciBBWUFIICAgPSAnXHUwNkREJzsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgRUxISVpCID0gJ1x1MDZERSc7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YVdvcmRzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgbmV3IFN0cmluZ1tdCisgICAgICAgIHsKKyAgICAgICAgICAgICAgImFic3RyYWN0IiwKKyAgICAgICAgICAgICAgImJvb2xlYW4iLAorICAgICAgICAgICAgICAiYnJlYWsiLAorICAgICAgICAgICAgICAiYnl0ZSIsCisgICAgICAgICAgICAgICJjYXNlIiwKKyAgICAgICAgICAgICAgImNhdGNoIiwKKyAgICAgICAgICAgICAgImNoYXIiLAorICAgICAgICAgICAgICAiY2xhc3MiLAorICAgICAgICAgICAgICAiY29uc3QiLAorICAgICAgICAgICAgICAiY29udGludWUiLAorICAgICAgICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICJkbyIsCisgICAgICAgICAgICAgICJkb3VibGUiLAorICAgICAgICAgICAgICAiZWxzZSIsCisgICAgICAgICAgICAgICJleHRlbmRzIiwKKyAgICAgICAgICAgICAgImZhbHNlIiwgLy8gbm90IGEga2V5d29yZAorICAgICAgICAgICAgICAiZmluYWwiLAorICAgICAgICAgICAgICAiZmluYWxseSIsCisgICAgICAgICAgICAgICJmbG9hdCIsCisgICAgICAgICAgICAgICJmb3IiLAorICAgICAgICAgICAgICAiZ290byIsCisgICAgICAgICAgICAgICJpZiIsCisgICAgICAgICAgICAgICJpbXBsZW1lbnRzIiwKKyAgICAgICAgICAgICAgImltcG9ydCIsCisgICAgICAgICAgICAgICJpbnN0YW5jZW9mIiwKKyAgICAgICAgICAgICAgImludCIsCisgICAgICAgICAgICAgICJpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAibG9uZyIsCisgICAgICAgICAgICAgICJuYXRpdmUiLAorICAgICAgICAgICAgICAibmV3IiwKKyAgICAgICAgICAgICAgIm51bGwiLCAvLyBub3QgYSBrZXl3b3JkCisgICAgICAgICAgICAgICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgInByaXZhdGUiLAorICAgICAgICAgICAgICAicHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgInB1YmxpYyIsCisgICAgICAgICAgICAgICJyZXR1cm4iLAorICAgICAgICAgICAgICAic2hvcnQiLAorICAgICAgICAgICAgICAic3RhdGljIiwKKyAgICAgICAgICAgICAgInN1cGVyIiwKKyAgICAgICAgICAgICAgInN3aXRjaCIsCisgICAgICAgICAgICAgICJzeW5jaHJvbml6ZWQiLAorICAgICAgICAgICAgICAidGhpcyIsCisgICAgICAgICAgICAgICJ0aHJlYWRzYWZlIiwKKyAgICAgICAgICAgICAgInRocm93IiwKKyAgICAgICAgICAgICAgInRocm93cyIsCisgICAgICAgICAgICAgICJ0cmFuc2llbnQiLAorICAgICAgICAgICAgICAidHJ1ZSIsIC8vIG5vdCBhIGtleXdvcmQKKyAgICAgICAgICAgICAgInRyeSIsCisgICAgICAgICAgICAgICJ2b2lkIiwKKyAgICAgICAgICAgICAgInZvbGF0aWxlIiwKKyAgICAgICAgICAgICAgIndoaWxlIiwKKyAgICAgICAgfQorICAgICkpOworCisgICAgLyoKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgbmV3IFN0cmluZ1tdCisgICAgICAgIHsKKyAgICAgICAgICAgICJDaGFyU2VxdWVuY2UiLAorICAgICAgICAgICAgIkNsb25lYWJsZSIsCisgICAgICAgICAgICAiQ29tcGFyYWJsZSIsCisgICAgICAgICAgICAiUnVubmFibGUiLAorCisgICAgICAgICAgICAiQm9vbGVhbiIsCisgICAgICAgICAgICAiQnl0ZSIsCisgICAgICAgICAgICAiQ2hhcmFjdGVyIiwKKyAgICAgICAgICAgICJDbGFzcyIsCisgICAgICAgICAgICAiQ2xhc3NMb2FkZXIiLAorICAgICAgICAgICAgIkNvbXBpbGVyIiwKKyAgICAgICAgICAgICJEb3VibGUiLAorICAgICAgICAgICAgIkZsb2F0IiwKKyAgICAgICAgICAgICJJbmhlcml0YWJsZVRocmVhZExvY2FsIiwKKyAgICAgICAgICAgICJJbnRlZ2VyIiwKKyAgICAgICAgICAgICJMb25nIiwKKyAgICAgICAgICAgICJNYXRoIiwKKyAgICAgICAgICAgICJOdW1iZXIiLAorICAgICAgICAgICAgIk9iamVjdCIsCisgICAgICAgICAgICAiUGFja2FnZSIsCisgICAgICAgICAgICAiUHJvY2VzcyIsCisgICAgICAgICAgICAiUnVudGltZSIsCisgICAgICAgICAgICAiUnVudGltZVBlcm1pc3Npb24iLAorICAgICAgICAgICAgIlNlY3VyaXR5TWFuYWdlciIsCisgICAgICAgICAgICAiU2hvcnQiLAorICAgICAgICAgICAgIlN0YWNrVHJhY2VFbGVtZW50IiwKKyAgICAgICAgICAgICJTdHJpY3RNYXRoIiwKKyAgICAgICAgICAgICJTdHJpbmciLAorICAgICAgICAgICAgIlN0cmluZ0J1ZmZlciIsCisgICAgICAgICAgICAiU3lzdGVtIiwKKyAgICAgICAgICAgICJUaHJlYWQiLAorICAgICAgICAgICAgIlRocmVhZEdyb3VwIiwKKyAgICAgICAgICAgICJUaHJlYWRMb2NhbCIsCisgICAgICAgICAgICAiVGhyb3dhYmxlIiwKKyAgICAgICAgICAgICJWb2lkIiwKKworICAgICAgICAgICAgIkFyaXRobWV0aWNFeGNlcHRpb24iLAorICAgICAgICAgICAgIkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAiQXJyYXlTdG9yZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiQ2xhc3NDYXN0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAorICAgICAgICAgICAgIklsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbnRlcnJ1cHRlZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiTmVnYXRpdmVBcnJheVNpemVFeGNlcHRpb24iLAorICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJOb1N1Y2hNZXRob2RFeGNlcHRpb24iLAorICAgICAgICAgICAgIk51bGxQb2ludGVyRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJOdW1iZXJGb3JtYXRFeGNlcHRpb24iLAorICAgICAgICAgICAgIlJ1bnRpbWVFeGNlcHRpb24iLAorICAgICAgICAgICAgIlNlY3VyaXR5RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIsCisKKyAgICAgICAgICAgICJBYnN0cmFjdE1ldGhvZEVycm9yIiwKKyAgICAgICAgICAgICJBc3NlcnRpb25FcnJvciIsCisgICAgICAgICAgICAiQ2xhc3NDaXJjdWxhcml0eUVycm9yIiwKKyAgICAgICAgICAgICJDbGFzc0Zvcm1hdEVycm9yIiwKKyAgICAgICAgICAgICJFcnJvciIsCisgICAgICAgICAgICAiRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIiwKKyAgICAgICAgICAgICJJbGxlZ2FsQWNjZXNzRXJyb3IiLAorICAgICAgICAgICAgIkluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IiLAorICAgICAgICAgICAgIkluc3RhbnRpYXRpb25FcnJvciIsCisgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciIsCisgICAgICAgICAgICAiTGlua2FnZUVycm9yIiwKKyAgICAgICAgICAgICJOb0NsYXNzRGVmRm91bmRFcnJvciIsCisgICAgICAgICAgICAiTm9TdWNoRmllbGRFcnJvciIsCisgICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXJyb3IiLAorICAgICAgICAgICAgIk91dE9mTWVtb3J5RXJyb3IiLAorICAgICAgICAgICAgIlN0YWNrT3ZlcmZsb3dFcnJvciIsCisgICAgICAgICAgICAiVGhyZWFkRGVhdGgiLAorICAgICAgICAgICAgIlVua25vd25FcnJvciIsCisgICAgICAgICAgICAiVW5zYXRpc2ZpZWRMaW5rRXJyb3IiLAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3IiLAorICAgICAgICAgICAgIlZlcmlmeUVycm9yIiwKKyAgICAgICAgICAgICJWaXJ0dWFsTWFjaGluZUVycm9yIiwKKyAgICAgICAgfQorICAgICkpOworICAgICovCisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQgamF2YU5hbWVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgbmV3IFN0cmluZ1tdCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDEuIGFsbCB0aGUgSmF2YS5sYW5nIGNsYXNzZXMgWzEuNC4xIEpES10uCisgICAgICAgICAgICAiQ2hhclNlcXVlbmNlIiwKKyAgICAgICAgICAgICJDbG9uZWFibGUiLAorICAgICAgICAgICAgIkNvbXBhcmFibGUiLAorICAgICAgICAgICAgIlJ1bm5hYmxlIiwKKworICAgICAgICAgICAgIkJvb2xlYW4iLAorICAgICAgICAgICAgIkJ5dGUiLAorICAgICAgICAgICAgIkNoYXJhY3RlciIsCisgICAgICAgICAgICAiQ2xhc3MiLAorICAgICAgICAgICAgIkNsYXNzTG9hZGVyIiwKKyAgICAgICAgICAgICJDb21waWxlciIsCisgICAgICAgICAgICAiRG91YmxlIiwKKyAgICAgICAgICAgICJGbG9hdCIsCisgICAgICAgICAgICAiSW5oZXJpdGFibGVUaHJlYWRMb2NhbCIsCisgICAgICAgICAgICAiSW50ZWdlciIsCisgICAgICAgICAgICAiTG9uZyIsCisgICAgICAgICAgICAiTWF0aCIsCisgICAgICAgICAgICAiTnVtYmVyIiwKKyAgICAgICAgICAgICJPYmplY3QiLAorICAgICAgICAgICAgIlBhY2thZ2UiLAorICAgICAgICAgICAgIlByb2Nlc3MiLAorICAgICAgICAgICAgIlJ1bnRpbWUiLAorICAgICAgICAgICAgIlJ1bnRpbWVQZXJtaXNzaW9uIiwKKyAgICAgICAgICAgICJTZWN1cml0eU1hbmFnZXIiLAorICAgICAgICAgICAgIlNob3J0IiwKKyAgICAgICAgICAgICJTdGFja1RyYWNlRWxlbWVudCIsCisgICAgICAgICAgICAiU3RyaWN0TWF0aCIsCisgICAgICAgICAgICAiU3RyaW5nIiwKKyAgICAgICAgICAgICJTdHJpbmdCdWZmZXIiLAorICAgICAgICAgICAgIlN5c3RlbSIsCisgICAgICAgICAgICAiVGhyZWFkIiwKKyAgICAgICAgICAgICJUaHJlYWRHcm91cCIsCisgICAgICAgICAgICAiVGhyZWFkTG9jYWwiLAorICAgICAgICAgICAgIlRocm93YWJsZSIsCisgICAgICAgICAgICAiVm9pZCIsCisKKyAgICAgICAgICAgICJBcml0aG1ldGljRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLAorICAgICAgICAgICAgIkFycmF5U3RvcmVFeGNlcHRpb24iLAorICAgICAgICAgICAgIkNsYXNzQ2FzdEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24iLAorICAgICAgICAgICAgIkV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgIklsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiSW50ZXJydXB0ZWRFeGNlcHRpb24iLAorICAgICAgICAgICAgIk5lZ2F0aXZlQXJyYXlTaXplRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJOdWxsUG9pbnRlckV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJSdW50aW1lRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICJTZWN1cml0eUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAiU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIsCisgICAgICAgICAgICAiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iLAorCisgICAgICAgICAgICAiQWJzdHJhY3RNZXRob2RFcnJvciIsCisgICAgICAgICAgICAiQXNzZXJ0aW9uRXJyb3IiLAorICAgICAgICAgICAgIkNsYXNzQ2lyY3VsYXJpdHlFcnJvciIsCisgICAgICAgICAgICAiQ2xhc3NGb3JtYXRFcnJvciIsCisgICAgICAgICAgICAiRXJyb3IiLAorICAgICAgICAgICAgIkV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciIsCisgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0Vycm9yIiwKKyAgICAgICAgICAgICJJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIiwKKyAgICAgICAgICAgICJJbnN0YW50aWF0aW9uRXJyb3IiLAorICAgICAgICAgICAgIkludGVybmFsRXJyb3IiLAorICAgICAgICAgICAgIkxpbmthZ2VFcnJvciIsCisgICAgICAgICAgICAiTm9DbGFzc0RlZkZvdW5kRXJyb3IiLAorICAgICAgICAgICAgIk5vU3VjaEZpZWxkRXJyb3IiLAorICAgICAgICAgICAgIk5vU3VjaE1ldGhvZEVycm9yIiwKKyAgICAgICAgICAgICJPdXRPZk1lbW9yeUVycm9yIiwKKyAgICAgICAgICAgICJTdGFja092ZXJmbG93RXJyb3IiLAorICAgICAgICAgICAgIlRocmVhZERlYXRoIiwKKyAgICAgICAgICAgICJVbmtub3duRXJyb3IiLAorICAgICAgICAgICAgIlVuc2F0aXNmaWVkTGlua0Vycm9yIiwKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIiwKKyAgICAgICAgICAgICJWZXJpZnlFcnJvciIsCisgICAgICAgICAgICAiVmlydHVhbE1hY2hpbmVFcnJvciIsCisKKyAgICAgICAgICAgIC8vIDIuIG90aGVyIGNsYXNzZXMgdXNlZCBhcyBwcmltaXRpdmUgdHlwZXMgYnkgeG1sIGJlYW5zCisgICAgICAgICAgICAiQmlnSW50ZWdlciIsCisgICAgICAgICAgICAiQmlnRGVjaW1hbCIsCisgICAgICAgICAgICAiRW51bSIsCisgICAgICAgICAgICAiRGF0ZSIsCisgICAgICAgICAgICAiR0RhdGUiLAorICAgICAgICAgICAgIkdEdXJhdGlvbiIsCisgICAgICAgICAgICAiUU5hbWUiLAorICAgICAgICAgICAgIkxpc3QiLAorCisgICAgICAgICAgICAvLyAzLiB0aGUgdG9wIGZldyBvcmcuYXBhY2hlLnhtbGJlYW5zIG5hbWVzCisgICAgICAgICAgICAiWG1sT2JqZWN0IiwKKyAgICAgICAgICAgICJYbWxDdXJzb3IiLAorICAgICAgICAgICAgIlhtbEJlYW5zIiwKKyAgICAgICAgICAgICJTY2hlbWFUeXBlIiwKKyAgICAgICAgfQorICAgICkpOworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhSWRlbnRpZmllcihTdHJpbmcgaWQpCisgICAgeworICAgICAgICBpZiAoaWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlkIGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgICAgaW50IGxlbiA9IGlkLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGphdmFXb3Jkcy5jb250YWlucyhpZCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGlkLmNoYXJBdCgwKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaWQuY2hhckF0KGkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpBWFJQQ0NsYXNzTmFtZSggU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLicsICdfJyk7CisgICAgICAgIG5hbWUgPSB1cHBlcmNhc2VGaXJzdExldHRlciggbmFtZSApOworCisgICAgICAgIGlmIChpc1ZhbGlkSmF2YUlkZW50aWZlcihuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIl8iICsgbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpBWFJQQ01ldGhvZE5hbWUoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuJywnXycpOworICAgICAgICBuYW1lID0gbG93ZXJjYXNlRmlyc3RMZXR0ZXIobmFtZSk7CisKKyAgICAgICAgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmVyKG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiXyIgKyBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGdldFhNTE5hbWVGcm9tQ2xhc3MoQ2xhc3MgY2xhenopCisgICAgeworICAgICAgICBTdHJpbmcgdXJpID0gTmFtZVV0aWwuZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2UoY2xhenopOworICAgICAgICBTdHJpbmcgbG5hbWUgPSBOYW1lVXRpbC5nZXRSb290Q2xhc3NOYW1lRnJvbUNsYXNzKGNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgIFhNTE5hbWUgeHNkX25hbWUgPSBuZXcgTmFtZSh1cmksIGxuYW1lKTsKKyAgICAgICAgcmV0dXJuIHhzZF9uYW1lOworICAgIH0KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRnJvbVFOYW1lKFFOYW1lIHFuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGphdmFfdHlwZSA9IHVwcGVyQ2FtZWxDYXNlKHFuYW1lLmdldExvY2FsUGFydCgpKTsKKworICAgICAgICBTdHJpbmcgdXJpID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIFN0cmluZyBqYXZhX3BrZyA9IG51bGw7CisKKyAgICAgICAgamF2YV9wa2cgPSBnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZSh1cmkpOworCisgICAgICAgIGlmIChqYXZhX3BrZyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGphdmFfcGtnICsgIi4iICsgamF2YV90eXBlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gamF2YV90eXBlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX05TX1BSRUZJWD0iamF2YToiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HX1BSRUZJWCA9ICJqYXZhLiI7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VGcm9tUGFja2FnZShmaW5hbCBDbGFzcyBjbGF6eikKKyAgICB7CisgICAgICAgIENsYXNzIGN1cnJfY2xhenogPSBjbGF6ejsKKworICAgICAgICB3aGlsZSAoY3Vycl9jbGF6ei5pc0FycmF5KCkpCisgICAgICAgICAgICBjdXJyX2NsYXp6ID0gY3Vycl9jbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIGZ1bGxuYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICBpbnQgbGFzdGRvdCA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIFN0cmluZyBwa2dfbmFtZSA9IGxhc3Rkb3QgPCAwID8gIiIgOiBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgbGFzdGRvdCk7CisKKyAgICAgICAgLy9zcGVjaWFsIGNhc2UgZm9yIGJ1aWx0aW4gdHlwZXMKKyAgICAgICAgLyoKKyAgICAgICAgaWYgKGN1cnJfY2xhenouaXNQcmltaXRpdmUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGtnX25hbWUgPSBjLmdldEphdmFMYW5ndWFnZU5hbWVzcGFjZVVyaSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBrZ19uYW1lLnN0YXJ0c1dpdGgoTEFOR19QUkVGSVgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVtX3N0ciA9IHBrZ19uYW1lLnN1YnN0cmluZyhMQU5HX1BSRUZJWC5sZW5ndGgoKSk7CisgICAgICAgICAgICBwa2dfbmFtZSA9IGMuZ2V0SmF2YUxhbmd1YWdlTmFtZXNwYWNlVXJpKCkgKyAiLiIgKyByZW1fc3RyOworICAgICAgICB9CisgICAgICAgICovCisgICAgICAgIHJldHVybiBKQVZBX05TX1BSRUZJWCArIHBrZ19uYW1lOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVcmlTY2hlbWVDaGFyKGNoYXIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSd6JyB8fAorICAgICAgICAgICAgY2ggPj0gJ0EnICYmIGNoIDw9J1onIHx8CisgICAgICAgICAgICBjaCA+PSAnMCcgJiYgY2ggPD0nOScgfHwKKyAgICAgICAgICAgIGNoID09ICctJyB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJysnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXJpQWxwaGFDaGFyKGNoYXIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSd6JyB8fCBjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZFNjaGVtZUNvbG9uKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICghaXNVcmlBbHBoYUNoYXIodXJpLmNoYXJBdCgwKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBpZiAoIWlzVXJpU2NoZW1lQ2hhcih1cmkuY2hhckF0KGkpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGkgPT0gbGVuKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAodXJpLmNoYXJBdChpKSAhPSAnOicpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBqbHM3N1N0cmluZyhTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYnVmLmNoYXJBdChpKSkpCisgICAgICAgICAgICAgICAgYnVmLnNldENoYXJBdChpLCAnXycpOworICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPT0gMCB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChidWYuY2hhckF0KDApKSkKKyAgICAgICAgICAgIGJ1Zi5pbnNlcnQoMCwgJ18nKTsKKyAgICAgICAgaWYgKGlzSmF2YVJlc2VydmVkV29yZChuYW1lKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ18nKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Qgc3BsaXRETlMoU3RyaW5nIGRucykKKyAgICB7CisgICAgICAgIC8vIEpBWEIgc2F5czogb25seSBzcGxpdCtyZXZlcnNlIEROUyBpZiBUTEQgbWF0Y2hlcyBrbm93biBUTERzIG9yIElTTyAzMTY2CisgICAgICAgIC8vIFdlIGFyZSBpZ25vcmluZyB0aGlzIG5vdyAoVEgpCisKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgaW50IGVuZCA9IGRucy5sZW5ndGgoKTsKKyAgICAgICAgaW50IGJlZ2luID0gZG5zLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGZvciAoIDsgYmVnaW4gIT0gLTEgOyBiZWdpbi0tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZG5zLmNoYXJBdChiZWdpbikgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChqbHM3N1N0cmluZyhkbnMuc3Vic3RyaW5nKGJlZ2luICsgMSwgZW5kKSkpOworICAgICAgICAgICAgICAgIGVuZCA9IGJlZ2luOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hZGQoamxzNzdTdHJpbmcoZG5zLnN1YnN0cmluZygwLCBlbmQpKSk7CisKKyAgICAgICAgLy8gSkFYQiBkcmFmdCBleGFtcGxlIGltcGxpZXMgcmVtb3ZhbCBvZiB3d3cKKyAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPj0gMyAmJgorICAgICAgICAgICAgICAgICgoU3RyaW5nKXJlc3VsdC5nZXQocmVzdWx0LnNpemUoKSAtIDEpKS50b0xvd2VyQ2FzZSgpLmVxdWFscygid3d3IikpCisgICAgICAgICAgICByZXN1bHQucmVtb3ZlKHJlc3VsdC5zaXplKCkgLSAxKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcm9jZXNzRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQorICAgIHsKKyAgICAgICAgLy8gSkFYQiBzYXlzOiBzdHJpcCAyIG9yIDMgbGV0dGVyIGV4dGVuc2lvbiBvciAiLmh0bWwiCisKKyAgICAgICAgaW50IGkgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoaSA+IDAgJiYgKAorICAgICAgICAgICAgICAgIGkgKyAxICsgMiA9PSBmaWxlbmFtZS5sZW5ndGgoKSB8fAorICAgICAgICAgICAgICAgIGkgKyAxICsgMyA9PSBmaWxlbmFtZS5sZW5ndGgoKSB8fAorICAgICAgICAgICAgICAgIGZpbGVuYW1lLnN1YnN0cmluZyhpICsgMSkudG9Mb3dlckNhc2UoKSA9PSAiaHRtbCIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IG5vIG5hbWVzcGFjZSAtPiBwYWNrYWdlICJub05hbWVzcGFjZSIKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICJub05hbWVzcGFjZSI7CisKKyAgICAgICAgLy8gYXBwbHkgZHJhZnQgSkFYQiBydWxlcworICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOworICAgICAgICBpbnQgaSA9IGZpbmRTY2hlbWVDb2xvbih1cmkpOworICAgICAgICBMaXN0IHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaWYgKCBpID49IDAgJiYgdXJpLnN1YnN0cmluZygwLCBpKS5lcXVhbHMoImphdmEiKSkKKyAgICAgICAgICAgIHJlc3VsdCA9ICBBcnJheXMuYXNMaXN0KHVyaS5zdWJzdHJpbmcoaSArIDEpLnNwbGl0KCJcXC4iKSk7CisKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBvdXRlcjogZm9yIChpID0gaSArIDE7IGkgPCBsZW47ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodXJpLmNoYXJBdChpKSA9PSAnLycpCisgICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gbGVuKSBicmVhayBvdXRlcjsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBpOworICAgICAgICAgICAgICAgIHdoaWxlICh1cmkuY2hhckF0KGkpICE9ICcvJykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIGJyZWFrOworICAgICAgICAgICAgICAgIGludCBlbmQgPSBpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodXJpLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgcmVzdWx0LnNldChyZXN1bHQuc2l6ZSgpIC0gMSwgcHJvY2Vzc0ZpbGVuYW1lKChTdHJpbmcpcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSkpKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3Qgc3BsaXRkbnMgPSBzcGxpdEROUygoU3RyaW5nKXJlc3VsdC5nZXQoMCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCgwLCBzcGxpdGRucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBidWYuYXBwZW5kKG5vbkphdmFLZXl3b3JkKGxvd2VyQ2FtZWxDYXNlKChTdHJpbmcpaXQubmV4dCgpKSkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnLicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYuc3Vic3RyaW5nKDAsIGJ1Zi5sZW5ndGgoKSAtIDEpOyAvLyBjaG9wIG9mZiBleHRyYSBkb3QKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVwcGVyQ2FzZVVuZGVyYmFyKGFyZ3NbaV0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdXBwZXItY2FzZS1hbmQtdW5kZXJiYXIgc3RyaW5nIHVzaW5nIHRoZSBKQVhCIHJ1bGVzLgorICAgICAqIEFsd2F5cyBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAorICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQorICAgICAqIG9uZSwgdGhlbiAiWF8iIGlzIHByZXBlbmRlZC4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBwZXJDYXNlVW5kZXJiYXIoU3RyaW5nIHhtbF9uYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTGlzdCB3b3JkcyA9IHNwbGl0V29yZHMoeG1sX25hbWUpOworCisgICAgICAgIGZpbmFsIGludCBzeiA9IHdvcmRzLnNpemUoKSAtIDE7CisgICAgICAgIGlmIChzeiA+PSAwICYmICFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KCgoU3RyaW5nKXdvcmRzLmdldCgwKSkuY2hhckF0KDApKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlhfIik7CisKKyAgICAgICAgZm9yKGludCBpID0gMCA7IGkgPCBzeiA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKXdvcmRzLmdldChpKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKFVTQ09SRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ogPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgoU3RyaW5nKXdvcmRzLmdldChzeikpOworICAgICAgICB9CisKKyAgICAgICAgLy91cGNhc2UgZW50aXJlIGJ1ZmZlcgorICAgICAgICBmaW5hbCBpbnQgbGVuID0gYnVmLmxlbmd0aCgpOworICAgICAgICBmb3IoaW50IGogPSAwIDsgaiA8IGxlbiA7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjID0gYnVmLmNoYXJBdChqKTsKKyAgICAgICAgICAgIGJ1Zi5zZXRDaGFyQXQoaiwgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY2FtZWwtY2FzZWQgc3RyaW5nIHVzaW5nIHRoZSBKQVhCIHJ1bGVzLgorICAgICAqIEFsd2F5cyBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyIHRoYXQgaXMgYSB2YWxpZAorICAgICAqIGphdmEgaWRlbnRpZmllciBzdGFydC4gKElmIEpBWEIgcnVsZXMgZG9uJ3QgcHJvZHVjZQorICAgICAqIG9uZSwgdGhlbiAiWCIgaXMgcHJlcGVuZGVkLikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1cHBlckNhbWVsQ2FzZShTdHJpbmcgeG1sX25hbWUpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBMaXN0IHdvcmRzID0gc3BsaXRXb3Jkcyh4bWxfbmFtZSk7CisKKyAgICAgICAgaWYgKHdvcmRzLnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydCgoKFN0cmluZyl3b3Jkcy5nZXQoMCkpLmNoYXJBdCgwKSkpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiWCIpOworCisgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB3b3Jkcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUoaXRyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKChTdHJpbmcpaXRyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjYW1lbC1jYXNlZCBzdHJpbmcgdXNpbmcgdGhlIEpBWEIgcnVsZXMsCisgICAgICogd2hlcmUgdGhlIGZpcnN0IGNvbXBvbmVudCBpcyBsb3dlcmNhc2VkLiBOb3RlIHRoYXQKKyAgICAgKiBpZiB0aGUgZmlyc3QgY29tcG9uZW50IGlzIGFuIGFjcm9ueW0sIHRoZSB3aG9sZQorICAgICAqIHRoaWducyBnZXRzIGxvd2VyY2FzZWQuCisgICAgICogQWx3YXlzIHN0YXJ0cyB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciB0aGF0IGlzIGEgdmFsaWQKKyAgICAgKiBqYXZhIGlkZW50aWZpZXIgc3RhcnQuIChJZiBKQVhCIHJ1bGVzIGRvbid0IHByb2R1Y2UKKyAgICAgKiBvbmUsIHRoZW4gIngiIGlzIHByZXBlbmRlZC4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG93ZXJDYW1lbENhc2UoU3RyaW5nIHhtbF9uYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgTGlzdCB3b3JkcyA9IHNwbGl0V29yZHMoeG1sX25hbWUpOworCisgICAgICAgIGlmICh3b3Jkcy5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZmlyc3QgPSAoKFN0cmluZyl3b3Jkcy5nZXQoMCkpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBjaGFyIGYgPSBmaXJzdC5jaGFyQXQoMCk7CisgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZikpCisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgieCIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChmaXJzdCk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHdvcmRzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBpdHIubmV4dCgpOyAvLyBza2lwIGFscmVhZHktbG93ZXJjYXNlZCB3b3JkCisgICAgICAgICAgICB3aGlsZShpdHIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpdHIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBwZXJDYXNlRmlyc3RMZXR0ZXIoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzLmNoYXJBdCgwKSkpCisgICAgICAgICAgICByZXR1cm4gczsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzKTsKKyAgICAgICAgYnVmLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYnVmLmNoYXJBdCgwKSkpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgICBzcGxpdCBhbiB4bWwgbmFtZSBpbnRvIHdvcmRzIHZpYSBKQVhCIGFwcHJvYWNoLCB1cGNhc2luZyBmaXJzdAorICAgICAgIGxldHRlciBvZiBlYWNoIHdvcmQgYXMgbmVlZGVkLCBpZiB1cGNhc2UgaXMgdHJ1ZQorCisgICAgICAgbmNuYW1lIGlzIHhtbCBuY25hbWUgKGkuZS4gbm8gY29sb25zKS4KKyAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQ2FwcGVkKExpc3QgbGlzdCwgU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIGlmIChzdHIubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgbGlzdC5hZGQodXBwZXJDYXNlRmlyc3RMZXR0ZXIoc3RyKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHNwbGl0V29yZHMoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBsZW4gPSBuYW1lLmxlbmd0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBpbnQgcHJlZml4ID0gU1RBUlQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjdXJyZW50ID0gZ2V0Q2hhckNsYXNzKG5hbWUuY2hhckF0KGkpKTsKKyAgICAgICAgICAgIGlmIChwcmVmaXggIT0gUFVOQ1QgJiYgY3VycmVudCA9PSBQVU5DVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRDYXBwZWQobGlzdCwgbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgPSBnZXRDaGFyQ2xhc3MobmFtZS5jaGFyQXQoaSkpKSA9PSBQVU5DVCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsraSA+PSBsZW4pIHJldHVybiBsaXN0OworICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwcmVmaXggPT0gRElHSVQpICE9IChjdXJyZW50ID09IERJR0lUKSB8fAorICAgICAgICAgICAgICAgICAgICAgKHByZWZpeCA9PSBMT1dFUiAmJiBjdXJyZW50ICE9IExPV0VSKSB8fAorICAgICAgICAgICAgICAgICAgICAgKGlzTGV0dGVyKHByZWZpeCkgIT0gaXNMZXR0ZXIoY3VycmVudCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHByZWZpeCA9PSBVUFBFUiAmJiBjdXJyZW50ID09IExPV0VSICYmIGkgPiBzdGFydCArIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkQ2FwcGVkKGxpc3QsIG5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpIC0gMSkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVmaXggPSBjdXJyZW50OworICAgICAgICB9CisgICAgICAgIGFkZENhcHBlZChsaXN0LCBuYW1lLnN1YnN0cmluZyhzdGFydCkpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvL2NoYXIgY2xhc3NlcworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFSVCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBVTkNUID0gMTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElHSVQgPSAyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVJLID0gMzsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVVBQRVIgPSA0OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBMT1dFUj0gNTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTk9DQVNFPSA2OworCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q2hhckNsYXNzKGNoYXIgYykKKyAgICB7CisgICAgICAgIC8vb3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUuCisgICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGMpKQorICAgICAgICAgICAgcmV0dXJuIFBVTkNUOworICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjKSkKKyAgICAgICAgICAgIHJldHVybiBESUdJVDsKKyAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKQorICAgICAgICAgICAgcmV0dXJuIFVQUEVSOworICAgICAgICBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpCisgICAgICAgICAgICByZXR1cm4gTE9XRVI7CisgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSkKKyAgICAgICAgICAgIHJldHVybiBOT0NBU0U7CisgICAgICAgIGVsc2UgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKKyAgICAgICAgICAgIHJldHVybiBNQVJLOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUFVOQ1Q7IC8vIG5vdCBjb3ZlcmVkIGJ5IEpBWEI6IHRyZWF0IGl0IGFzIHB1bmN0dWF0aW9uCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xldHRlcihpbnQgc3RhdGUpCisgICAgeworICAgICAgICByZXR1cm4gKHN0YXRlPT1VUFBFUgorICAgICAgICAgICAgICB8fCBzdGF0ZT09TE9XRVIKKyAgICAgICAgICAgICAgfHwgc3RhdGU9PU5PQ0FTRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVuY3R1YXRpb24oY2hhciBjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChjID09IEhZUEhFTgorICAgICAgICAgICAgICB8fCBjID09IFBFUklPRAorICAgICAgICAgICAgICB8fCBjID09IENPTE9OCisgICAgICAgICAgICAgIHx8IGMgPT0gVVNDT1JFCisgICAgICAgICAgICAgIHx8IGMgPT0gRE9UCisgICAgICAgICAgICAgIHx8IGMgPT0gVEVMRUlBCisgICAgICAgICAgICAgIHx8IGMgPT0gQVlBSAorICAgICAgICAgICAgICB8fCBjID09IEVMSElaQik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZW5kZWQgdG8gYmUgYXBwbGllZCB0byBhIGxvd2VyY2FzZS1zdGFydGluZyBpZGVudGlmaWVyIHRoYXQKKyAgICAgKiBtYXkgY29sbGlkZSB3aXRoIGEgSmF2YSBrZXl3b3JkLiAgSWYgaXQgZG9lcyBjb2xsaWRlLCB0aGlzCisgICAgICogcHJlcGVuZHMgdGhlIGxldHRlciAieCIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9uSmF2YUtleXdvcmQoU3RyaW5nIHdvcmQpCisgICAgeworICAgICAgICBpZiAoaXNKYXZhUmVzZXJ2ZWRXb3JkKHdvcmQpKQorICAgICAgICAgICAgcmV0dXJuICd4JyArIHdvcmQ7CisgICAgICAgIHJldHVybiB3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVuZGVkIHRvIGJlIGFwcGxpZWQgdG8gYW4gdXBwZXJjYXNlLXN0YXJ0aW5nIGlkZW50aWZpZXIgdGhhdAorICAgICAqIG1heSBjb2xsaWRlIHdpdGggYSBqYXZhLmxhbmcuKiBjbGFzc25hbWUuICBJZiBpdCBkb2VzIGNvbGxpZGUsIHRoaXMKKyAgICAgKiBwcmVwZW5kcyB0aGUgbGV0dGVyICJYIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub25KYXZhQ29tbW9uQ2xhc3NOYW1lKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKGlzSmF2YUNvbW1vbkNsYXNzTmFtZShuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiAiWCIgKyBuYW1lOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVJlc2VydmVkV29yZChTdHJpbmcgd29yZCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0phdmFSZXNlcnZlZFdvcmQod29yZCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0phdmFSZXNlcnZlZFdvcmQoU3RyaW5nIHdvcmQsIGJvb2xlYW4gaWdub3JlX2Nhc2UpCisgICAgeworICAgICAgICBpZiAoaWdub3JlX2Nhc2UpCisgICAgICAgICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpOworICAgICAgICByZXR1cm4gamF2YVdvcmRzLmNvbnRhaW5zKHdvcmQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFDb21tb25DbGFzc05hbWUoU3RyaW5nIHdvcmQpCisgICAgeworICAgICAgICByZXR1cm4gamF2YU5hbWVzLmNvbnRhaW5zKHdvcmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QYXJzZVV0aWwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QYXJzZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzkwZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1BhcnNlVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQorICogRGF0ZTogTm92IDI1LCAyMDAzCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZVV0aWwKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmltSW5pdGlhbFBsdXMoU3RyaW5nIHhtbCkKKyAgICB7CisgICAgICAgIGlmICh4bWwhPW51bGwgJiYgeG1sLmNoYXJBdCgwKSA9PSAnKycpIHsKKyAgICAgICAgICAgIHJldHVybiB4bWwuc3Vic3RyaW5nKDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHhtbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QcmVmaXhSZXNvbHZlci5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ByZWZpeFJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhZjUyNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QcmVmaXhSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK3B1YmxpYyBpbnRlcmZhY2UgUHJlZml4UmVzb2x2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBDYWxlZCB3aGVuIHRoZSB1c2VyIGhhcyBhIHByZWZpeCBhbmQgbmVlZHMgdG8gbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZworICAgICAqIG5hbWVzcGFjZSBVUkkuIElmIHRoZSBwcmVmaXggaXMgbm90IGRlZmluZWQgaW4gdGhpcyBjb250ZXh0LCB0aGVuIHRoaXMKKyAgICAgKiBtZXRob2QgbWF5IHJldHVybiBudWxsLiAgVGhlIG5vLW5hbWVzcGFjZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZW1wdHkKKyAgICAgKiBzdHJpbmcgcmV0dXJuIHJlc3VsdC4KKyAgICAgKiAKKyAgICAgKiBJZiB0aGUgcHJlZml4IGlzIG51bGwgb3IgIiIsIHRoZW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIGJlaW5nCisgICAgICogcmVxdWVzdGVkLiAgVG8gY29uZm9ybSB3aXRoIHRoZSBYTUwgc3BlYywgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHdpbGwKKyAgICAgKiByZXR1cm4gdGhlIG5vLW5hbWVzcGFjZSAoIiIpIGlmIGl0IGlzIG5vdCBtYXBwZWQuCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeChTdHJpbmcgcHJlZml4KTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1B1c2hlZElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwNjY3NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9QdXNoZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdXNoZWRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlZmF1bHRCdWZmZXJTaXplID0gMjA0ODsKKyAgICBwcm90ZWN0ZWQgYnl0ZSBidWZbXTsKKyAgICBwcm90ZWN0ZWQgaW50IHdyaXRlcG9zOworICAgIHByb3RlY3RlZCBpbnQgcmVhZHBvczsKKyAgICBwcm90ZWN0ZWQgaW50IG1hcmtwb3MgPSAtMTsKKyAgICBwcm90ZWN0ZWQgaW50IG1hcmtsaW1pdDsKKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBJbnRlcm5hbE91dHB1dFN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gbW9yZSBieXRlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gaW50byB0aGlzIHN0cmVhbQorICAgICAqIChhcyBhbiBPdXRwdXRTdHJlYW0pLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCB3cml0ZSBhdCBsZWFzdCBvbmUgYnl0ZSBpZiB0aGUgc3RyZWFtIGlzCisgICAgICogbm90IGVuZGVkLCBhbmQgaXQgbXVzdCBub3Qgd3JpdGUgYW55IGJ5dGVzIGlmIHRoZSBzdHJlYW0gaGFzCisgICAgICogYWxyZWFkeSBlbmRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsKGludCByZXF1ZXN0ZWRCeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlua2VkIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBvdXRwdXQgc3RyZWFtIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHdoZW5ldmVyCisgICAgICogdGhlIGZpbGwgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCisgICAgeworICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOworICAgIH0KKworICAgIHB1YmxpYyBQdXNoZWRJbnB1dFN0cmVhbSgpCisgICAgeworICAgICAgICB0aGlzKGRlZmF1bHRCdWZmZXJTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHVzaGVkSW5wdXRTdHJlYW0oaW50IHNpemUpCisgICAgeworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5lZ2F0aXZlIGluaXRpYWwgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyByb29tIGZvciBjYiBtb3JlIGJ5dGVzIG9mIGRhdGEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2hpZnQoaW50IGNiKQorICAgIHsKKyAgICAgICAgaW50IHNhdmVwb3MgPSByZWFkcG9zOworICAgICAgICBpZiAobWFya3BvcyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWFkcG9zIC0gbWFya3BvcyA+IG1hcmtsaW1pdCkKKyAgICAgICAgICAgICAgICBtYXJrcG9zID0gLTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2F2ZXBvcyA9IG1hcmtwb3M7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc2l6ZSA9IHdyaXRlcG9zIC0gc2F2ZXBvczsKKworICAgICAgICBpZiAoc2F2ZXBvcyA+IDAgJiYgYnVmLmxlbmd0aCAtIHNpemUgPj0gY2IgJiYgc2l6ZSA8PSBjYikKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHNhdmVwb3MsIGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbmV3Y291bnQgPSBzaXplICsgY2I7CisgICAgICAgICAgICBieXRlIG5ld2J1ZltdID0gbmV3IGJ5dGVbTWF0aC5tYXgoYnVmLmxlbmd0aCA8PCAxLCBuZXdjb3VudCldOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWYsIHNhdmVwb3MsIG5ld2J1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICBidWYgPSBuZXdidWY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2F2ZXBvcyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRwb3MgLT0gc2F2ZXBvczsKKyAgICAgICAgICAgIGlmIChtYXJrcG9zID4gMCkKKyAgICAgICAgICAgICAgICBtYXJrcG9zIC09IHNhdmVwb3M7CisgICAgICAgICAgICB3cml0ZXBvcyAtPSBzYXZlcG9zOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHJlYWRwb3MgPj0gd3JpdGVwb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGwoMSk7CisgICAgICAgICAgICBpZiAocmVhZHBvcyA+PSB3cml0ZXBvcykKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZltyZWFkcG9zKytdICYgMHhmZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGNoYXJhY3RlcnMgaW50byBhIHBvcnRpb24gb2YgYW4gYXJyYXksIHJlYWRpbmcgZnJvbSB0aGUgdW5kZXJseWluZworICAgICAqIHN0cmVhbSBhdCBtb3N0IG9uY2UgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOworICAgICAgICBpZiAoYXZhaWwgPCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGwobGVuIC0gYXZhaWwpOworICAgICAgICAgICAgYXZhaWwgPSB3cml0ZXBvcyAtIHJlYWRwb3M7CisgICAgICAgICAgICBpZiAoYXZhaWwgPD0gMCkgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGludCBjbnQgPSAoYXZhaWwgPCBsZW4pID8gYXZhaWwgOiBsZW47CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCByZWFkcG9zLCBiLCBvZmYsIGNudCk7CisgICAgICAgIHJlYWRwb3MgKz0gY250OworICAgICAgICByZXR1cm4gY250OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgbG9uZyBhdmFpbCA9IHdyaXRlcG9zIC0gcmVhZHBvczsKKworICAgICAgICBpZiAoYXZhaWwgPCBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaWxsIGluIGJ1ZmZlciB0byBzYXZlIGJ5dGVzIGZvciByZXNldAorICAgICAgICAgICAgbG9uZyByZXEgPSBuIC0gYXZhaWw7CisgICAgICAgICAgICBpZiAocmVxID4gSW50ZWdlci5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgcmVxID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBmaWxsKChpbnQpcmVxKTsKKyAgICAgICAgICAgIGF2YWlsID0gd3JpdGVwb3MgLSByZWFkcG9zOworICAgICAgICAgICAgaWYgKGF2YWlsIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHNraXBwZWQgPSAoYXZhaWwgPCBuKSA/IGF2YWlsIDogbjsKKyAgICAgICAgcmVhZHBvcyArPSBza2lwcGVkOworICAgICAgICByZXR1cm4gc2tpcHBlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhdmFpbGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlcG9zIC0gcmVhZHBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQorICAgIHsKKyAgICAgICAgbWFya2xpbWl0ID0gcmVhZGxpbWl0OworICAgICAgICBtYXJrcG9zID0gcmVhZHBvczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChtYXJrcG9zIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUmVzZXR0aW5nIHRvIGludmFsaWQgbWFyayIpOworICAgICAgICByZWFkcG9zID0gbWFya3BvczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0KKyAgICB7CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXBvcyArIDEgPiBidWYubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoaWZ0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmW3dyaXRlcG9zXSA9IChieXRlKWI7CisgICAgICAgICAgICB3cml0ZXBvcyArPSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8CisgICAgICAgICAgICAgICAgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmICh3cml0ZXBvcyArIGxlbiA+IGJ1Zi5sZW5ndGgpCisgICAgICAgICAgICAgICAgc2hpZnQobGVuKTsKKworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ1Ziwgd3JpdGVwb3MsIGxlbik7CisgICAgICAgICAgICB3cml0ZXBvcyArPSBsZW47CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9RTmFtZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Yjg1MmYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUU5hbWVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CisKK3B1YmxpYyBjbGFzcyBRTmFtZUhlbHBlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBXRUxMX0tOT1dOX1BSRUZJWEVTID0gYnVpbGRXS1AoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBnZXRYTUxOYW1lKFFOYW1lIHFuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gWE1MTmFtZUhlbHBlci5mb3JMTlMoIHFuYW1lLmdldExvY2FsUGFydCgpLCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZm9yTE5TKFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyB1cmkpCisgICAgeworICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICB1cmkgPSAiIjsKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBRTmFtZSBmb3JMTihTdHJpbmcgbG9jYWxuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiIiwgbG9jYWxuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGZvclByZXR0eShTdHJpbmcgcHJldHR5LCBpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgaW50IGF0ID0gcHJldHR5LmluZGV4T2YoJ0AnLCBvZmZzZXQpOworICAgICAgICBpZiAoYXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiIiwgcHJldHR5LnN1YnN0cmluZyhvZmZzZXQpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShwcmV0dHkuc3Vic3RyaW5nKGF0ICsgMSksIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0LCBhdCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKKworICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGRpZ2l0cyA9IG5ldyBjaGFyW10KKyAgICAgICAgeycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZShpbnQgYykKKyAgICB7CisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHByb2R1Y2VzIGEgc3RyaW5nIHdoaWNoIGlzIGEgc2FmZSBmaWxlbmFtZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgcy4KKyAgICAvLyBUbyBtYWtlIGl0IGEgc2FmZSBmaWxlbmFtZSwgdGhlIGZvbGxvd2luZyB0d28gdHJhbnNmb3JtYXRpb25zIGFyZSBhcHBsaWVkOgorICAgIC8vCisgICAgLy8gMS4gRmlyc3QgYWxsIG5vbi1hc2NpaS1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZworICAgIC8vICAgIHRoZWlyIFVURjggYnl0ZSBzZXF1ZW5jZSwgaW4gdGhlIGZvcm0gX3h4X3h4X3h4LCBmb3IgZXhhbXBsZSwKKyAgICAvLyAgICAiSGVsbG9fMjBUaGVyZSIgZm9yICJIZWxsbyBUaGVyZSIuICAoT2J2aW91c2x5LCBhIHNpbmdsZSB1bmljb2RlCisgICAgLy8gICAgY2hhcmFjdGVyIG1heSBleHBhbmQgaW50byBhcyBtYW55IGFzIHRocmVlIGVzY2FwZSBwYXR0ZXJucy4pCisgICAgLy8gICAgSWYgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgNjQgY2hhcmFjdGVycyBvciBmZXdlciwgdGhhdCdzIHRoZSByZXN1bHQuCisgICAgLy8KKyAgICAvLyAyLiBJZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLCB0aGVuIGl0IGlzCisgICAgLy8gICAgZGlzY2FyZGVkLiAgSW5zdGVhZCwgdGhlIFNIQTEgYWxnb3JpdGhtIGlzIHJ1biBvbiB0aGUgb3JpZ2luYWwKKyAgICAvLyAgICBzdHJpbmcncyBVVEY4IHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlbiB0aGUgcmVzdWx0aW5nIDIwLWJ5dGUgbWVzc2FnZQorICAgIC8vICAgIGRpZ2VzdCBpcyB0dXJuZWQgaW50byBhIDQwLWNoYXJhY3RlciBoZXggc3RyaW5nOyB0aGVuICJVUklfU0hBXzFfIiBpcworICAgIC8vICAgIHByZXBlbmRlZC4KKyAgICAvLworICAgIC8vIFRoZSByZWFzb24gZm9yIHRoZSAic2hvcnRlbmluZyIgaXMgdG8gYXZvaWQgZmlsZW5hbWVzIGxvbmdlciB0aGFuIGFib3V0CisgICAgLy8gMjU2IGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBwcm9oaWJpdGVkIG9uIFdpbmRvd3MgTlQuCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTkFNRV9MRU5HVEggPSA2NDsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmUoU3RyaW5nIHMpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGlzU2FmZShjaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHV0ZjggPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXRmOCA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1dGY4Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1sodXRmOFtqXSA+PiA0KSAmIDB4Rl0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbdXRmOFtqXSAmIDB4Rl0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGkgYWx3YXlzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfQkFEX1VURjhfQ0hBUiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNob3J0IGVub3VnaD8gRG9uZSEKKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA8PSBNQVhfTkFNRV9MRU5HVEgpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gdG9vIGxvbmc/IHVzZSBTSEExCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBNZXNzYWdlRGlnZXN0IG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBIik7CisgICAgICAgICAgICBieXRlW10gaW5wdXRCeXRlcyA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ5dGVzID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgaW5wdXRCeXRlcyA9IG5ldyBieXRlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZVtdIGRpZ2VzdCA9IG1kLmRpZ2VzdChpbnB1dEJ5dGVzKTsKKyAgICAgICAgICAgIGFzc2VydChkaWdlc3QubGVuZ3RoID09IDIwKTsgLy8gU0hBMSAxNjAgYml0cyA9PSAyMCBieXRlcworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiVVJJX1NIQV8xXyIpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaWdlc3QubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbKGRpZ2VzdFtqXSA+PiA0KSAmIDB4Rl0pOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaGV4ZGlnaXRzW2RpZ2VzdFtqXSAmIDB4Rl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNpbmcgaW4gYSBKREsgd2l0aG91dCBhbiBTSEEgaW1wbGVtZW50YXRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmVkaXIoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICJfbm9ucy8iICsgaGV4c2FmZShuYW1lLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgcmV0dXJuIGhleHNhZmUobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkgKyAiLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZFdLUCgpCisgICAgeworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgInhtbCIpOworICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4cyIpOworICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKKyAgICAgICAgcmVzdWx0LnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAid3NkbCIpOworICAgICAgICByZXN1bHQucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsICJzb2FwZW5jIik7CisgICAgICAgIHJlc3VsdC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiwgInNvYXBlbnYiKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICByZXR1cm4gcmVhZGFibGUoc1R5cGUsIFdFTExfS05PV05fUFJFRklYRVMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFNjaGVtYVR5cGUgc1R5cGUsIE1hcCBuc1ByZWZpeCkKKyAgICB7CisgICAgICAgIGlmIChzVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRhYmxlKHNUeXBlLmdldE5hbWUoKSwgbnNQcmVmaXgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gImF0dHJpYnV0ZSB0eXBlICIgKyByZWFkYWJsZShzVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpLCBuc1ByZWZpeCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJkb2N1bWVudCB0eXBlICIgKyByZWFkYWJsZShzVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCksIG5zUHJlZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzVHlwZS5pc05vVHlwZSgpIHx8IHNUeXBlLmdldE91dGVyVHlwZSgpID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCB0eXBlIjsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVR5cGUgb3V0ZXJUeXBlID0gc1R5cGUuZ2V0T3V0ZXJUeXBlKCk7CisgICAgICAgIFNjaGVtYUZpZWxkIGNvbnRhaW5lciA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCk7CisKKyAgICAgICAgaWYgKG91dGVyVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mIGF0dHJpYnV0ZSAiICsgcmVhZGFibGUoY29udGFpbmVyLmdldE5hbWUoKSwgbnNQcmVmaXgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG91dGVyVHlwZS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gInR5cGUgb2YgZWxlbWVudCAiICsgcmVhZGFibGUoY29udGFpbmVyLmdldE5hbWUoKSwgbnNQcmVmaXgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmlzQXR0cmlidXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0eXBlIG9mICIgKyBjb250YWluZXIuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIiBhdHRyaWJ1dGUgaW4gIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAidHlwZSBvZiAiICsgY29udGFpbmVyLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIgZWxlbWVudCBpbiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0ZXJUeXBlLmdldEJhc2VUeXBlKCkgPT0gc1R5cGUpCisgICAgICAgICAgICByZXR1cm4gImJhc2UgdHlwZSBvZiAiICsgcmVhZGFibGUob3V0ZXJUeXBlLCBuc1ByZWZpeCk7CisgICAgICAgIGVsc2UgaWYgKG91dGVyVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICAgICAgcmV0dXJuICJpdGVtIHR5cGUgb2YgIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOworICAgICAgICBlbHNlIGlmIChvdXRlclR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCisgICAgICAgICAgICByZXR1cm4gIm1lbWJlciB0eXBlICIgKyBzVHlwZS5nZXRBbm9ueW1vdXNVbmlvbk1lbWJlck9yZGluYWwoKSArICIgb2YgIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gImlubmVyIHR5cGUgaW4gIiArIHJlYWRhYmxlKG91dGVyVHlwZSwgbnNQcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRhYmxlKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gcmVhZGFibGUobmFtZSwgV0VMTF9LTk9XTl9QUkVGSVhFUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZGFibGUoUU5hbWUgbmFtZSwgTWFwIHByZWZpeGVzKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZylwcmVmaXhlcy5nZXQobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICIgaW4gbmFtZXNwYWNlICIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1Z2dlc3RQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZSkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKVdFTExfS05PV05fUFJFRklYRVMuZ2V0KG5hbWVzcGFjZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgaW50IGxlbiA9IG5hbWVzcGFjZS5sZW5ndGgoKTsKKyAgICAgICAgaW50IGkgPSBuYW1lc3BhY2UubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGkgPiAwICYmIGkgPT0gbmFtZXNwYWNlLmxlbmd0aCgpIC0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gaTsKKyAgICAgICAgICAgIGkgPSBuYW1lc3BhY2UubGFzdEluZGV4T2YoJy8nLCBpIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpICs9IDE7IC8vIHNraXAgJy8nLCBhbHNvIGNvdmVycyAtMSBjYXNlLgorCisgICAgICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aCgid3d3LiIsIGkpKQorICAgICAgICB7CisgICAgICAgICAgICBpICs9IDQ7IC8vICJ3d3cuIi5sZW5ndGgoKQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGkgPCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTkNOYW1lU3RhcnQobmFtZXNwYWNlLmNoYXJBdChpKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpICs9IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBlbmQgPSBpICsgMTsgZW5kIDwgbGVuOyBlbmQgKz0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzTkNOYW1lKG5hbWVzcGFjZS5jaGFyQXQoZW5kKSkgfHwgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQobmFtZXNwYWNlLmNoYXJBdChlbmQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVmaXhlcyBzdGFydGluZyB3aXRoICJ4bWwiIGFyZSBmb3JiaWRkZW4sIHNvIGNoYW5nZSAieG1scyIgLT4gInhzIgorICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID49IGkgKyAzICYmIHN0YXJ0c1dpdGhYbWwobmFtZXNwYWNlLCBpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+PSBpICsgNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIngiICsgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG5hbWVzcGFjZS5jaGFyQXQoaSArIDMpKTsKKyAgICAgICAgICAgIHJldHVybiAibnMiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbiAtIGkgPiA0KSAvLyBmb3VyIG9yIGxlc3M/IGxlYXZlIGl0LgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNWb3dlbChuYW1lc3BhY2UuY2hhckF0KGkgKyAyKSkgJiYgIWlzVm93ZWwobmFtZXNwYWNlLmNoYXJBdChpICsgMykpKQorICAgICAgICAgICAgICAgIGxlbiA9IGkgKyA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbiA9IGkgKyAzOyAvLyBtb3JlIHRoYW4gZm91cj8gdHJ1bmNhdGUgdG8gMy4KKyAgICAgICAgfQorCisgICAgICAgIGludCBuOworCisgICAgICAgIGlmIChsZW4gLSBpID09IDApCisgICAgICAgICAgICByZXR1cm4gIm5zIjsKKworICAgICAgICByZXR1cm4gbmFtZXNwYWNlLnN1YnN0cmluZyhpLCBsZW4pLnRvTG93ZXJDYXNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoWG1sKFN0cmluZyBzLCBpbnQgaSkKKyAgICB7CisgICAgICAgIGlmIChzLmxlbmd0aCgpIDwgaSArIDMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHMuY2hhckF0KGkpICE9ICdYJyAmJiBzLmNoYXJBdChpKSAhPSAneCcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChzLmNoYXJBdChpICsgMSkgIT0gJ00nICYmIHMuY2hhckF0KGkgKyAxKSAhPSAnbScpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChzLmNoYXJBdChpICsgMikgIT0gJ0wnICYmIHMuY2hhckF0KGkgKyAyKSAhPSAnbCcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Zvd2VsKGNoYXIgY2gpCisgICAgeworICAgICAgICBzd2l0Y2ggKGNoKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICBjYXNlICdVJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICB3aGlsZSAoc1R5cGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNUeXBlLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzVHlwZS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBpZiAoc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSAhPSBudWxsICYmIHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldE91dGVyVHlwZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUmVhZGVySW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWQ4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vUmVhZGVySW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBSZWFkZXJJbnB1dFN0cmVhbSBleHRlbmRzIFB1c2hlZElucHV0U3RyZWFtCit7CisgICAgcHJpdmF0ZSBSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgV3JpdGVyIHdyaXRlcjsKKyAgICBwcml2YXRlIGNoYXJbXSBidWY7CisgICAgcHVibGljIHN0YXRpYyBpbnQgZGVmYXVsdEJ1ZmZlclNpemUgPSAyMDQ4OworCisgICAgcHVibGljIFJlYWRlcklucHV0U3RyZWFtKFJlYWRlciByZWFkZXIsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRoaXMocmVhZGVyLCBlbmNvZGluZywgZGVmYXVsdEJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXJJbnB1dFN0cmVhbShSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmcsIGludCBidWZmZXJTaXplKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPD0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1ZmZlciBzaXplIDw9IDAiKTsKKworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICAgICAgdGhpcy53cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGdldE91dHB1dFN0cmVhbSgpLCBlbmNvZGluZyk7CisgICAgICAgIGJ1ZiA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbGwoaW50IHJlcXVlc3RlZEJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaGFycyA9IHJlYWRlci5yZWFkKGJ1Zik7CisgICAgICAgICAgICBpZiAoY2hhcnMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZiwgMCwgY2hhcnMpOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGF2YWlsYWJsZSgpIDw9IDApOyAvLyBsb29wIGZvciBzYWZldHksIGluIGNhc2UgZW5jb2RpbmcgZGlkbid0IHByb2R1Y2UgYW55IGJ5dGVzIHlldAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTFhZjkyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1NuaWZmZWRYbWxJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitwdWJsaWMgY2xhc3MgU25pZmZlZFhtbElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbQoreworICAgIC8vIFdlIGRvbid0IHNuaWZmIG1vcmUgdGhhbiAxOTIgYnl0ZXMuCisgICAgcHVibGljIHN0YXRpYyBpbnQgTUFYX1NOSUZGRURfQllURVMgPSAxOTI7CisKKyAgICBwdWJsaWMgU25pZmZlZFhtbElucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlcihzdHJlYW0pOworCisgICAgICAgIC8vIHJlYWQgYnl0ZSBvcmRlciBtYXJrcyBhbmQgZGV0ZWN0IEVCQ0RJQyBldGMKKyAgICAgICAgX2VuY29kaW5nID0gc25pZmZGb3VyQnl0ZXMoKTsKKworICAgICAgICBpZiAoX2VuY29kaW5nICE9IG51bGwgJiYgX2VuY29kaW5nLmVxdWFscygiSUJNMDM3IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGZvdXIgYnl0ZXMgc3VnZ2VzdCBFQkNESUMgd2l0aCA8P3htIGF0IHN0YXJ0CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzbmlmZkZvclhtbERlY2woX2VuY29kaW5nKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9lbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9lbmNvZGluZyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBIYXZlbid0IHlldCBkZXRlcm1pbmVkIGVuY29kaW5nOiBzbmlmZiBmb3IgPD94bWwgZW5jb2Rpbmc9Ii4uLiI/PgorICAgICAgICAgICAgLy8gYXNzdW1pbmcgd2UgY2FuIHJlYWQgaXQgYXMgVVRGLTguCisgICAgICAgICAgICBfZW5jb2RpbmcgPSBzbmlmZkZvclhtbERlY2woIlVURi04Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2VuY29kaW5nID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBYTUwgc3BlYyBzYXlzIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICAgICAgICAgIC8vICgxKSAiSW4gdGhlIGFic2VuY2Ugb2YgZXh0ZXJuYWwgY2hhcmFjdGVyIGVuY29kaW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICAvLyAoc3VjaCBhcyBNSU1FIGhlYWRlcnMpLCBwYXJzZWQgZW50aXRpZXMgd2hpY2ggYXJlIHN0b3JlZCBpbiBhbgorICAgICAgICAgICAgLy8gZW5jb2Rpbmcgb3RoZXIgdGhhbiBVVEYtOCBvciBVVEYtMTYgbXVzdCBiZWdpbiB3aXRoIGEgdGV4dAorICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gKHNlZSA0LjMuMSBUaGUgVGV4dCBEZWNsYXJhdGlvbikgY29udGFpbmluZyBhbgorICAgICAgICAgICAgLy8gZW5jb2RpbmcgZGVjbGFyYXRpb246IgorCisgICAgICAgICAgICAvLyAoMikgIkluIHRoZSBhYnNlbmNlIG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGFuIGV4dGVybmFsCisgICAgICAgICAgICAvLyB0cmFuc3BvcnQgcHJvdG9jb2wgKGUuZy4gSFRUUCBvciBNSU1FKSwgaXQgaXMgYW4gZXJyb3IKKyAgICAgICAgICAgIC8vIGZvciBhbiBlbnRpdHkgaW5jbHVkaW5nIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uIHRvIGJlCisgICAgICAgICAgICAvLyBwcmVzZW50ZWQgdG8gdGhlIFhNTCBwcm9jZXNzb3IgaW4gYW4gZW5jb2Rpbmcgb3RoZXIgdGhhbgorICAgICAgICAgICAgLy8gdGhhdCBuYW1lZCBpbiB0aGUgZGVjbGFyYXRpb24sIG9yIGZvciBhbiBlbnRpdHkgd2hpY2ggYmVnaW5zCisgICAgICAgICAgICAvLyB3aXRoIG5laXRoZXIgYSBCeXRlIE9yZGVyIE1hcmsgbm9yIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uCisgICAgICAgICAgICAvLyB0byB1c2UgYW4gZW5jb2Rpbmcgb3RoZXIgdGhhbiBVVEYtOC4iCisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIHVzaW5nIGEgc25pZmZlZCBzdHJlYW0sIHdlIGRvIG5vdCBoYXZlIGV4dGVybmFsCisgICAgICAgICAgICAvLyBjaGFyYWN0ZXIgZW5jb2RpbmcgaW5mb3JtYXRpb24uCisKKyAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIGhlcmUsIHdlIGFsc28gZG9uJ3QgaGF2ZSBhIHJlY29nbml6ZWQgYnl0ZSBvcmRlcgorICAgICAgICAgICAgLy8gbWFyayBvciBhbiBleHBsaWNpdCBlbmNvZGluZyBkZWNsYXJhdGlvbiB0aGF0IGNhbiBiZSByZWFkIGluCisgICAgICAgICAgICAvLyBlaXRoZXIgQVNDSUkgb3IgRUJESUMgc3R5bGUuCisKKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbXVzdCB1c2UgVVRGLTguCisKKyAgICAgICAgICAgIF9lbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWFkQXNNdWNoQXNQb3NzaWJsZShieXRlW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgdG90YWwgPSAwOworICAgICAgICB3aGlsZSAodG90YWwgPCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWQoYnVmLCBzdGFydEF0ICsgdG90YWwsIGxlbiAtIHRvdGFsKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0b3RhbCArPSBjb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWw7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc25pZmZGb3VyQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG1hcmsoNCk7CisgICAgICAgIGludCBza2lwID0gMDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGlmIChyZWFkQXNNdWNoQXNQb3NzaWJsZShidWYsIDAsIDQpIDwgNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgcmVzdWx0ID0gMHhGRjAwMDAwMCAmIChidWZbMF0gPDwgMjQpIHwgMHgwMEZGMDAwMCAmIChidWZbMV0gPDwgMTYpIHwgMHgwMDAwRkYwMCAmIChidWZbMl0gPDwgOCkgfCAweDAwMDAwMEZGICYgYnVmWzNdOworCisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDB4MDAwMEZFRkYpCisgICAgICAgICAgICAgICAgcmV0dXJuICJVQ1MtNCI7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHhGRkZFMDAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00IjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDAwMDAwMDNDKQorICAgICAgICAgICAgICAgIHJldHVybiAiVUNTLTRCRSI7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgzQzAwMDAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVDUy00TEUiOworICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ID09IDB4MDAzQzAwM0YpCisgICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTZCRSI7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHgzQzAwM0YwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVURi0xNkxFIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAweDNDM0Y3ODZEKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBsb29rcyBsaWtlIFVTLUFTQ0lJIHdpdGggPD94bWw6IHNuaWZmCisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMHg0QzZGQTc5NCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIklCTTAzNyI7IC8vIFNuaWZmIGZvciBlYmRpYyBjb2RlcGFnZQorICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRjAwMDApID09IDB4RkVGRjAwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTYiOworICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRjAwMDApID09IDB4RkZGRTAwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtMTYiOworICAgICAgICAgICAgZWxzZSBpZiAoKHJlc3VsdCAmIDB4RkZGRkZGMDApID09IDB4RUZCQkJGMDApCisgICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7CisgICAgICAgICAgICBlbHNlIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZSwgc28gd2UnbGwgcHJpbWUgaXQKKyAgICAvLyB3aXRoIHRoZSBjb21tb24gY2hhcnNldHMuCisKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MSA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MiA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTMgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkJFIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTUgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NiA9IENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NyA9IENoYXJzZXQuZm9yTmFtZSgiQ3AxMjUyIik7CisKKworICAgIHByaXZhdGUgU3RyaW5nIHNuaWZmRm9yWG1sRGVjbChTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbWFyayhNQVhfU05JRkZFRF9CWVRFUyk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnl0ZWJ1ZiA9IG5ldyBieXRlW01BWF9TTklGRkVEX0JZVEVTXTsKKyAgICAgICAgICAgIGludCBieXRlbGltaXQgPSByZWFkQXNNdWNoQXNQb3NzaWJsZShieXRlYnVmLCAwLCBNQVhfU05JRkZFRF9CWVRFUyk7CisKKyAgICAgICAgICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZS4KKyAgICAgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7CisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlYnVmLCAwLCBieXRlbGltaXQpLCBjaGFyc2V0KTsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltieXRlbGltaXRdOworICAgICAgICAgICAgaW50IGxpbWl0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChsaW1pdCA8IGJ5dGVsaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkZXIucmVhZChidWYsIGxpbWl0LCBieXRlbGltaXQgLSBsaW1pdCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbGltaXQgKz0gY291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0WG1sRGVjbEVuY29kaW5nKGJ1ZiwgMCwgbGltaXQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIF9lbmNvZGluZzsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9lbmNvZGluZzsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFhtbERlY2xFbmNvZGluZyhjaGFyW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKKyAgICB7CisgICAgICAgIGludCBsaW1pdCA9IG9mZnNldCArIHNpemU7CisgICAgICAgIGludCB4bWxwaSA9IGZpcnN0SW5kZXhPZigiPD94bWwiLCBidWYsIG9mZnNldCwgbGltaXQpOworICAgICAgICBpZiAoeG1scGkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSB4bWxwaSArIDU7CisgICAgICAgICAgICBTY2FubmVkQXR0cmlidXRlIGF0dHIgPSBuZXcgU2Nhbm5lZEF0dHJpYnV0ZSgpOworICAgICAgICAgICAgd2hpbGUgKGkgPCBsaW1pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpID0gc2NhbkF0dHJpYnV0ZShidWYsIGksIGxpbWl0LCBhdHRyKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChhdHRyLm5hbWUuZXF1YWxzKCJlbmNvZGluZyIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmlyc3RJbmRleE9mKFN0cmluZyBzLCBjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0KQorICAgIHsKKyAgICAgICAgYXNzZXJ0KHMubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgY2hhcltdIGxvb2tGb3IgPSBzLnRvQ2hhckFycmF5KCk7CisKKyAgICAgICAgY2hhciBmaXJzdGNoYXIgPSBsb29rRm9yWzBdOworICAgICAgICBzZWFyY2hpbmc6IGZvciAobGltaXQgLT0gbG9va0Zvci5sZW5ndGg7IHN0YXJ0QXQgPCBsaW1pdDsgc3RhcnRBdCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmW3N0YXJ0QXRdID09IGZpcnN0Y2hhcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxvb2tGb3IubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmW3N0YXJ0QXQgKyBpXSAhPSBsb29rRm9yW2ldKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2hpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHROb25tYXRjaGluZ0J5dGUoY2hhcltdIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCisgICAgeworICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRoaXNjaGFyID0gYnVmW3N0YXJ0QXRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29rRm9yLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0aGlzY2hhciA9PSBsb29rRm9yW2ldKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzZWFyY2hpbmc7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRNYXRjaGluZ0J5dGUoY2hhcltdIGxvb2tGb3IsIGNoYXJbXSBidWYsIGludCBzdGFydEF0LCBpbnQgbGltaXQpCisgICAgeworICAgICAgICBzZWFyY2hpbmc6IGZvciAoOyBzdGFydEF0IDwgbGltaXQ7IHN0YXJ0QXQrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRoaXNjaGFyID0gYnVmW3N0YXJ0QXRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29rRm9yLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmICh0aGlzY2hhciA9PSBsb29rRm9yW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRNYXRjaGluZ0J5dGUoY2hhciBsb29rRm9yLCBjaGFyW10gYnVmLCBpbnQgc3RhcnRBdCwgaW50IGxpbWl0KQorICAgIHsKKyAgICAgICAgc2VhcmNoaW5nOiBmb3IgKDsgc3RhcnRBdCA8IGxpbWl0OyBzdGFydEF0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZbc3RhcnRBdF0gPT0gbG9va0ZvcikKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRBdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBXSElURVNQQUNFID0gbmV3IGNoYXJbXSB7ICcgJywgJ1xyJywgJ1x0JywgJ1xuJyB9OworICAgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBOT1ROQU1FID0gbmV3IGNoYXJbXSB7ICc9JywgJyAnLCAnXHInLCAnXHQnLCAnXG4nLCAnPycsICc+JywgJzwnLCAnXCcnLCAnXCInIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTY2FubmVkQXR0cmlidXRlCisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNjYW5BdHRyaWJ1dGUoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsaW1pdCwgU2Nhbm5lZEF0dHJpYnV0ZSBhdHRyKQorICAgIHsKKyAgICAgICAgaW50IG5hbWVTdGFydCA9IG5leHROb25tYXRjaGluZ0J5dGUoV0hJVEVTUEFDRSwgYnVmLCBzdGFydEF0LCBsaW1pdCk7CisgICAgICAgIGlmIChuYW1lU3RhcnQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpbnQgbmFtZUVuZCA9IG5leHRNYXRjaGluZ0J5dGUoTk9UTkFNRSwgYnVmLCBuYW1lU3RhcnQsIGxpbWl0KTsKKyAgICAgICAgaWYgKG5hbWVFbmQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpbnQgZXF1YWxzID0gbmV4dE5vbm1hdGNoaW5nQnl0ZShXSElURVNQQUNFLCBidWYsIG5hbWVFbmQsIGxpbWl0KTsKKyAgICAgICAgaWYgKGVxdWFscyA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChidWZbZXF1YWxzXSAhPSAnPScpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGludCB2YWxRdW90ZSA9IG5leHROb25tYXRjaGluZ0J5dGUoV0hJVEVTUEFDRSwgYnVmLCBlcXVhbHMgKyAxLCBsaW1pdCk7CisgICAgICAgIGlmIChidWZbdmFsUXVvdGVdICE9ICdcJycgJiYgYnVmW3ZhbFF1b3RlXSAhPSAnXCInKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpbnQgdmFsRW5kcXVvdGUgPSBuZXh0TWF0Y2hpbmdCeXRlKGJ1Zlt2YWxRdW90ZV0sIGJ1ZiwgdmFsUXVvdGUgKyAxLCBsaW1pdCk7CisgICAgICAgIGlmICh2YWxFbmRxdW90ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGF0dHIubmFtZSA9IG5ldyBTdHJpbmcoYnVmLCBuYW1lU3RhcnQsIG5hbWVFbmQgLSBuYW1lU3RhcnQpOworICAgICAgICBhdHRyLnZhbHVlID0gbmV3IFN0cmluZyhidWYsIHZhbFF1b3RlICsgMSwgdmFsRW5kcXVvdGUgLSB2YWxRdW90ZSAtIDEpOworICAgICAgICByZXR1cm4gdmFsRW5kcXVvdGUgKyAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9TbmlmZmVkWG1sUmVhZGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTc4MTQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vU25pZmZlZFhtbFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitwdWJsaWMgY2xhc3MgU25pZmZlZFhtbFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyCit7CisgICAgLy8gV2UgZG9uJ3Qgc25pZmYgbW9yZSB0aGFuIDE5MiBieXRlcy4KKyAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfU05JRkZFRF9DSEFSUyA9IDE5MjsKKworICAgIHB1YmxpYyBTbmlmZmVkWG1sUmVhZGVyKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIocmVhZGVyKTsKKyAgICAgICAgX2VuY29kaW5nID0gc25pZmZGb3JYbWxEZWNsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVhZEFzTXVjaEFzUG9zc2libGUoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0QXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgd2hpbGUgKHRvdGFsIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkKGJ1Ziwgc3RhcnRBdCArIHRvdGFsLCBsZW4gLSB0b3RhbCk7CisgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdG90YWwgKz0gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIC8vIEJVR0JVRyBpbiBKREs6IENoYXJzZXQuZm9yTmFtZSBpcyBub3QgdGhyZWFkc2FmZSwgc28gd2UnbGwgcHJpbWUgaXQKKyAgICAvLyB3aXRoIHRoZSBjb21tb24gY2hhcnNldHMuCisKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MSA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15MiA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTE2Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTMgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkJFIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkdW1teTUgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NiA9IENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGR1bW15NyA9IENoYXJzZXQuZm9yTmFtZSgiQ3AxMjUyIik7CisKKworICAgIHByaXZhdGUgU3RyaW5nIHNuaWZmRm9yWG1sRGVjbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbWFyayhNQVhfU05JRkZFRF9DSEFSUyk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbTUFYX1NOSUZGRURfQ0hBUlNdOworICAgICAgICAgICAgaW50IGxpbWl0ID0gcmVhZEFzTXVjaEFzUG9zc2libGUoYnVmLCAwLCBNQVhfU05JRkZFRF9DSEFSUyk7CisgICAgICAgICAgICByZXR1cm4gU25pZmZlZFhtbElucHV0U3RyZWFtLmV4dHJhY3RYbWxEZWNsRW5jb2RpbmcoYnVmLCAwLCBsaW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgX2VuY29kaW5nOworCisgICAgcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpCisgICAgeworICAgICAgICByZXR1cm4gX2VuY29kaW5nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1ZhbGlkYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzZDA2NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvbkNvbnRleHQKK3sKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkICggU3RyaW5nIG1lc3NhZ2UgKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9WYWxpZGF0b3JMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vVmFsaWRhdG9yTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBGaXJzdCBldmVudCBtdXN0IGJlIGEgQkVHSU4gd2l0aCBubyBuYW1lICh0byBjb21tdW5pY2F0ZSBhbnkgeHNpCisgKiBpbmZvcm1hdGlvbikuICBCRUdJTiBhbmQgRU5EIG5lZWQgdG8gbWF0Y2guCisgKi8KKworcHVibGljIGludGVyZmFjZSBWYWxpZGF0b3JMaXN0ZW5lcgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFR0lOICAgID0gMTsgLy8gQmVnaW4gZWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORCAgICAgID0gMjsgLy8gRW5kIGVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUICAgICA9IDM7IC8vIFRleHQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSICAgICA9IDQ7IC8vIEF0dHIgKG5vbi1uYW1lc3BhY2VzLCBub24geHNpIG9ubHkpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EQVRUUlMgPSA1OyAvLyBhZnRlciBCRUdJTiwgYWZ0ZXIgYXR0cnMKKworICAgIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQsIEV2ZW50IGV2ZW50ICk7CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFdmVudCBleHRlbmRzIFByZWZpeFJlc29sdmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVTRVJWRSA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0UgID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MTEFQU0UgPSAzOworCisgICAgICAgIFhtbEN1cnNvciBnZXRMb2NhdGlvbkFzQ3Vyc29yICggKTsKKworICAgICAgICBib29sZWFuIGdldFhzaVR5cGUgICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOnR5cGUKKyAgICAgICAgYm9vbGVhbiBnZXRYc2lOaWwgICAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTpuaWwKKyAgICAgICAgYm9vbGVhbiBnZXRYc2lMb2MgICAoIENoYXJzIGNoYXJzICk7IC8vIEJFR0lOIHhzaTpzY2hlbWFMb2NhdGlvbgorICAgICAgICBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKTsgLy8gQkVHSU4geHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gT24gU1RBUlQgYW5kIEFUVFIKKyAgICAgICAgUU5hbWUgZ2V0TmFtZSAoICk7CisgICAgICAgIAorICAgICAgICAvLyBPbiBURVhUIGFuZCBBVFRSCisgICAgICAgIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzICk7CisgICAgICAgIHZvaWQgZ2V0VGV4dCAoIENoYXJzIGNoYXJzLCBpbnQgd3NyICk7CisgICAgICAgIAorICAgICAgICBib29sZWFuIHRleHRJc1doaXRlc3BhY2UgKCApOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWEJlYW5EZWJ1Zy5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hCZWFuRGVidWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ2N2EwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hCZWFuRGVidWcuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgWEJlYW5EZWJ1ZworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQUNFX1NDSEVNQV9MT0FESU5HID0gMHgwMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRyYWNlUHJvcCA9ICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuZGVidWciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRQcm9wID0gIiI7IC8vICJUUkFDRV9TQ0hFTUFfTE9BRElORyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgX2VuYWJsZWQgPSBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpOworICAgIHByaXZhdGUgc3RhdGljIGludCBfaW5kZW50ID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2luZGVudHNwYWNlID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBpbml0aWFsaXplQml0c0Zyb21Qcm9wZXJ0eSgpCisgICAgeworICAgICAgICBpbnQgYml0cyA9IDA7CisgICAgICAgIFN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KHRyYWNlUHJvcCwgZGVmYXVsdFByb3ApOworICAgICAgICBpZiAocHJvcC5pbmRleE9mKCJUUkFDRV9TQ0hFTUFfTE9BRElORyIpID49IDApCisgICAgICAgICAgICBiaXRzIHw9IFRSQUNFX1NDSEVNQV9MT0FESU5HOworICAgICAgICByZXR1cm4gYml0czsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZShpbnQgYml0cykKKyAgICB7CisgICAgICAgIF9lbmFibGVkID0gX2VuYWJsZWQgfCBiaXRzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKGludCBiaXRzKQorICAgIHsKKyAgICAgICAgX2VuYWJsZWQgPSBfZW5hYmxlZCAmIH5iaXRzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShpbnQgYml0cywgU3RyaW5nIG1lc3NhZ2UsIGludCBpbmRlbnQpCisgICAgeworICAgICAgICBpZiAodGVzdChiaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChYQmVhbkRlYnVnLmNsYXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbmRlbnQgPCAwKQorICAgICAgICAgICAgICAgICAgICBfaW5kZW50ICs9IGluZGVudDsKKworICAgICAgICAgICAgICAgIFN0cmluZyBzcGFjZXMgPSBfaW5kZW50IDwgMCA/ICIiIDogX2luZGVudCA+IF9pbmRlbnRzcGFjZS5sZW5ndGgoKSA/IF9pbmRlbnRzcGFjZSA6IF9pbmRlbnRzcGFjZS5zdWJzdHJpbmcoMCwgX2luZGVudCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ21lc3NhZ2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICI6ICIgKyBzcGFjZXMgKyBtZXNzYWdlICsgIlxuIjsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KGxvZ21lc3NhZ2UpOworCisgICAgICAgICAgICAgICAgaWYgKGluZGVudCA+IDApCisgICAgICAgICAgICAgICAgICAgIF9pbmRlbnQgKz0gaW5kZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoaW50IGJpdHMpCisgICAgeworICAgICAgICByZXR1cm4gKF9lbmFibGVkICYgYml0cykgIT0gMDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIFByaW50U3RyZWFtIF9lcnI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nKFN0cmluZyBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgbG9nKG1lc3NhZ2UsIG51bGwpOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIGxvZyhtZXNzYWdlLCBuZXcgVGhyb3dhYmxlKCkpOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZyBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBzdGFja1RyYWNlKQorICAgIHsKKyAgICAgICAgaWYgKF9lcnIgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBkaWFnbm9zdGljRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInhtbGJlYW5kZWJ1ZyIsICIubG9nIik7CisgICAgICAgICAgICAgICAgX2VyciA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkaWFnbm9zdGljRmlsZSkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGlhZ25vc3RpYyBYTUwgQmVhbiBkZWJ1ZyBsb2cgZmlsZSBjcmVhdGVkOiAiICsgZGlhZ25vc3RpY0ZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2VyciA9IFN5c3RlbS5lcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2Vyci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBpZiAoc3RhY2tUcmFjZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFja1RyYWNlLnByaW50U3RhY2tUcmFjZShfZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgbG9nRXhjZXB0aW9uKFRocm93YWJsZSB0KQorICAgIHsKKyAgICAgICAgbG9nKHQuZ2V0TWVzc2FnZSgpLCB0KTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hNTENoYXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YWNiMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxDaGFyLmphdmEKQEAgLTAsMCArMSw2NTAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYyBYTUwgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBkYXRhCisgKiBpbiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQKKyAqIFhNTCBjaGFyYWN0ZXIgb3IgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlLCBuYW1lIHN0YXJ0LCBvciBuYW1lCisgKiBjaGFyYWN0ZXIuCisgKiA8cD4KKyAqIEEgc2VyaWVzIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIHN1cHBsaWVkIHRvIGVhc2UgdGhlIGJ1cmRlbgorICogb2YgdGhlIGRldmVsb3Blci4gQmVjYXVzZSBpbmxpbmluZyB0aGUgY2hlY2tzIGNhbiBpbXByb3ZlIHBlcgorICogY2hhcmFjdGVyIHBlcmZvcm1hbmNlLCB0aGUgdGFibGVzIG9mIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGFyZQorICogcHVibGljLiBVc2luZyB0aGUgY2hhcmFjdGVyIGFzIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkNIQVJTPC9jb2RlPgorICogYXJyYXkgYW5kIGFwcGx5aW5nIHRoZSBhcHByb3ByaWF0ZSBtYXNrIGZsYWcgKGUuZy4KKyAqIDxjb2RlPk1BU0tfVkFMSUQ8L2NvZGU+KSwgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXMgY2FsbGluZyB0aGUKKyAqIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IGNoZWNrIHRoZSBjb21tZW50cworICogZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBtZXRob2QgZm9yIGRldGFpbHMuCisgKgorICogQGF1dGhvciBHbGVubiBNYXJjeSwgSUJNCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqIEBhdXRob3IgQXJuYXVkICBMZSBIb3JzLCBJQk0KKyAqIEBhdXRob3IgUmFodWwgU3JpdmFzdGF2YSwgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgWE1MQ2hhciB7CisKKyAgICAvLworICAgIC8vIENvbnN0YW50cworICAgIC8vCisKKyAgICAvKiogQ2hhcmFjdGVyIGZsYWdzLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDSEFSUyA9IG5ldyBieXRlWzEgPDwgMTZdOworCisgICAgLyoqIFZhbGlkIGNoYXJhY3RlciBtYXNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfVkFMSUQgPSAweDAxOworCisgICAgLyoqIFNwYWNlIGNoYXJhY3RlciBtYXNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfU1BBQ0UgPSAweDAyOworCisgICAgLyoqIE5hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FX1NUQVJUID0gMHgwNDsKKworICAgIC8qKiBOYW1lIGNoYXJhY3RlciBtYXNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkFNRSA9IDB4MDg7CisKKyAgICAvKiogUHViaWQgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19QVUJJRCA9IDB4MTA7CisgICAgCisgICAgLyoqIAorICAgICAqIENvbnRlbnQgY2hhcmFjdGVyIG1hc2suIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgdGhvc2UgdGhhdCBjYW4KKyAgICAgKiBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvZiBtYXJrdXAsIHN1Y2ggYXMgJyZsdDsnIGFuZCAnJmFtcDsnLiAKKyAgICAgKiBUaGUgdmFyaW91cyBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgc3BlY2lhbCBhcyB3ZWxsLgorICAgICAqIEFsbCBvdGhlciB2YWxpZCBYTUwgY2hhcmFjdGVycyBjYW4gYmUgY29uc2lkZXJlZCBjb250ZW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGZvciB0aGUgaW5uZXIgbG9vcCBvZiBjaGFyYWN0ZXIgc2Nhbm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19DT05URU5UID0gMHgyMDsKKworICAgIC8qKiBOQ05hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQ05BTUVfU1RBUlQgPSAweDQwOworCisgICAgLyoqIE5DTmFtZSBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRSA9IDB4ODA7CisKKyAgICAvLworICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgorICAgIC8vCisKKyAgICBzdGF0aWMgeworICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfAorICAgICAgICAvLyAgICAgICAgICAgICAgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdCisgICAgICAgIC8vCisKKyAgICAgICAgaW50IGNoYXJSYW5nZVtdID0geyAKKyAgICAgICAgICAgIDB4MDAwOSwgMHgwMDBBLCAweDAwMEQsIDB4MDAwRCwgMHgwMDIwLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELAorICAgICAgICB9OworCisgICAgICAgIC8vCisgICAgICAgIC8vIFszXSBTIDo6PSAoI3gyMCB8ICN4OSB8ICN4RCB8ICN4QSkrCisgICAgICAgIC8vCisKKyAgICAgICAgaW50IHNwYWNlQ2hhcltdID0geyAKKyAgICAgICAgICAgIDB4MDAyMCwgMHgwMDA5LCAweDAwMEQsIDB4MDAwQSwKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIKKyAgICAgICAgLy8KKworICAgICAgICBpbnQgbmFtZUNoYXJbXSA9IHsgCisgICAgICAgICAgICAweDAwMkQsIDB4MDAyRSwgLy8gJy0nIGFuZCAnLicKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKKyAgICAgICAgLy8KKworICAgICAgICBpbnQgbmFtZVN0YXJ0Q2hhcltdID0geyAKKyAgICAgICAgICAgIDB4MDAzQSwgMHgwMDVGLCAvLyAnOicgYW5kICdfJworICAgICAgICB9OworCisgICAgICAgIC8vCisgICAgICAgIC8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgMHhEIHwgMHhBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0KKyAgICAgICAgLy8KKworICAgICAgICBpbnQgcHViaWRDaGFyW10gPSB7CisgICAgICAgICAgICAweDAwMEEsIDB4MDAwRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAzRCwKKyAgICAgICAgICAgIDB4MDA1RgorICAgICAgICB9OworCisgICAgICAgIGludCBwdWJpZFJhbmdlW10gPSB7CisgICAgICAgICAgICAweDAwMjcsIDB4MDAzQiwgMHgwMDNGLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBCisgICAgICAgIH07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gWzg0XSBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMKKyAgICAgICAgLy8KKworICAgICAgICBpbnQgbGV0dGVyUmFuZ2VbXSA9IHsKKyAgICAgICAgICAgIC8vIEJhc2VDaGFyCisgICAgICAgICAgICAweDAwNDEsIDB4MDA1QSwgMHgwMDYxLCAweDAwN0EsIDB4MDBDMCwgMHgwMEQ2LCAweDAwRDgsIDB4MDBGNiwKKyAgICAgICAgICAgIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLAorICAgICAgICAgICAgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsCisgICAgICAgICAgICAweDAyNTAsIDB4MDJBOCwgMHgwMkJCLCAweDAyQzEsIDB4MDM4OCwgMHgwMzhBLCAweDAzOEUsIDB4MDNBMSwKKyAgICAgICAgICAgIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLAorICAgICAgICAgICAgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsCisgICAgICAgICAgICAweDA0QzcsIDB4MDRDOCwgMHgwNENCLCAweDA0Q0MsIDB4MDREMCwgMHgwNEVCLCAweDA0RUUsIDB4MDRGNSwKKyAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLAorICAgICAgICAgICAgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsCisgICAgICAgICAgICAweDA2QkEsIDB4MDZCRSwgMHgwNkMwLCAweDA2Q0UsIDB4MDZEMCwgMHgwNkQzLCAweDA2RTUsIDB4MDZFNiwKKyAgICAgICAgICAgIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLAorICAgICAgICAgICAgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsCisgICAgICAgICAgICAweDA5REYsIDB4MDlFMSwgMHgwOUYwLCAweDA5RjEsIDB4MEEwNSwgMHgwQTBBLCAweDBBMEYsIDB4MEExMCwKKyAgICAgICAgICAgIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LAorICAgICAgICAgICAgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsCisgICAgICAgICAgICAweDBBOEYsIDB4MEE5MSwgMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywKKyAgICAgICAgICAgIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LAorICAgICAgICAgICAgMHgwQjJBLCAweDBCMzAsIDB4MEIzMiwgMHgwQjMzLCAweDBCMzYsIDB4MEIzOSwgMHgwQjVDLCAweDBCNUQsCisgICAgICAgICAgICAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwKKyAgICAgICAgICAgIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLAorICAgICAgICAgICAgMHgwQkFFLCAweDBCQjUsIDB4MEJCNywgMHgwQkI5LCAweDBDMDUsIDB4MEMwQywgMHgwQzBFLCAweDBDMTAsCisgICAgICAgICAgICAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwKKyAgICAgICAgICAgIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLAorICAgICAgICAgICAgMHgwQ0I1LCAweDBDQjksIDB4MENFMCwgMHgwQ0UxLCAweDBEMDUsIDB4MEQwQywgMHgwRDBFLCAweDBEMTAsCisgICAgICAgICAgICAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwKKyAgICAgICAgICAgIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LAorICAgICAgICAgICAgMHgwRTk0LCAweDBFOTcsIDB4MEU5OSwgMHgwRTlGLCAweDBFQTEsIDB4MEVBMywgMHgwRUFBLCAweDBFQUIsCisgICAgICAgICAgICAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywKKyAgICAgICAgICAgIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLAorICAgICAgICAgICAgMHgxMTA1LCAweDExMDcsIDB4MTEwQiwgMHgxMTBDLCAweDExMEUsIDB4MTExMiwgMHgxMTU0LCAweDExNTUsCisgICAgICAgICAgICAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsIDB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwKKyAgICAgICAgICAgIDB4MTFCNywgMHgxMUI4LCAweDExQkMsIDB4MTFDMiwgMHgxRTAwLCAweDFFOUIsIDB4MUVBMCwgMHgxRUY5LAorICAgICAgICAgICAgMHgxRjAwLCAweDFGMTUsIDB4MUYxOCwgMHgxRjFELCAweDFGMjAsIDB4MUY0NSwgMHgxRjQ4LCAweDFGNEQsCisgICAgICAgICAgICAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywKKyAgICAgICAgICAgIDB4MUZDMiwgMHgxRkM0LCAweDFGQzYsIDB4MUZDQywgMHgxRkQwLCAweDFGRDMsIDB4MUZENiwgMHgxRkRCLAorICAgICAgICAgICAgMHgxRkUwLCAweDFGRUMsIDB4MUZGMiwgMHgxRkY0LCAweDFGRjYsIDB4MUZGQywgMHgyMTJBLCAweDIxMkIsCisgICAgICAgICAgICAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywKKyAgICAgICAgICAgIDB4QUMwMCwgMHhEN0EzLAorICAgICAgICAgICAgLy8gSWRlb2dyYXBoaWMKKyAgICAgICAgICAgIDB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKKyAgICAgICAgfTsKKyAgICAgICAgaW50IGxldHRlckNoYXJbXSA9IHsKKyAgICAgICAgICAgIC8vIEJhc2VDaGFyCisgICAgICAgICAgICAweDAzODYsIDB4MDM4QywgMHgwM0RBLCAweDAzREMsIDB4MDNERSwgMHgwM0UwLCAweDA1NTksIDB4MDZENSwKKyAgICAgICAgICAgIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLAorICAgICAgICAgICAgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsCisgICAgICAgICAgICAweDBFQkQsIDB4MTEwMCwgMHgxMTA5LCAweDExM0MsIDB4MTEzRSwgMHgxMTQwLCAweDExNEMsIDB4MTE0RSwKKyAgICAgICAgICAgIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLAorICAgICAgICAgICAgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsCisgICAgICAgICAgICAweDFGNUQsIDB4MUZCRSwgMHgyMTI2LCAweDIxMkUsCisgICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYworICAgICAgICAgICAgMHgzMDA3LAorICAgICAgICB9OworCisgICAgICAgIC8vCisgICAgICAgIC8vIFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gLi4uCisgICAgICAgIC8vCisKKyAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJSYW5nZVtdID0geworICAgICAgICAgICAgMHgwMzAwLCAweDAzNDUsIDB4MDM2MCwgMHgwMzYxLCAweDA0ODMsIDB4MDQ4NiwgMHgwNTkxLCAweDA1QTEsCisgICAgICAgICAgICAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwKKyAgICAgICAgICAgIDB4MDZENiwgMHgwNkRDLCAweDA2REQsIDB4MDZERiwgMHgwNkUwLCAweDA2RTQsIDB4MDZFNywgMHgwNkU4LAorICAgICAgICAgICAgMHgwNkVBLCAweDA2RUQsIDB4MDkwMSwgMHgwOTAzLCAweDA5M0UsIDB4MDk0QywgMHgwOTUxLCAweDA5NTQsCisgICAgICAgICAgICAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwKKyAgICAgICAgICAgIDB4MDlDQiwgMHgwOUNELCAweDA5RTIsIDB4MDlFMywgMHgwQTQwLCAweDBBNDIsIDB4MEE0NywgMHgwQTQ4LAorICAgICAgICAgICAgMHgwQTRCLCAweDBBNEQsIDB4MEE3MCwgMHgwQTcxLCAweDBBODEsIDB4MEE4MywgMHgwQUJFLCAweDBBQzUsCisgICAgICAgICAgICAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywKKyAgICAgICAgICAgIDB4MEI0NywgMHgwQjQ4LCAweDBCNEIsIDB4MEI0RCwgMHgwQjU2LCAweDBCNTcsIDB4MEI4MiwgMHgwQjgzLAorICAgICAgICAgICAgMHgwQkJFLCAweDBCQzIsIDB4MEJDNiwgMHgwQkM4LCAweDBCQ0EsIDB4MEJDRCwgMHgwQzAxLCAweDBDMDMsCisgICAgICAgICAgICAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwKKyAgICAgICAgICAgIDB4MEM4MiwgMHgwQzgzLCAweDBDQkUsIDB4MENDNCwgMHgwQ0M2LCAweDBDQzgsIDB4MENDQSwgMHgwQ0NELAorICAgICAgICAgICAgMHgwQ0Q1LCAweDBDRDYsIDB4MEQwMiwgMHgwRDAzLCAweDBEM0UsIDB4MEQ0MywgMHgwRDQ2LCAweDBENDgsCisgICAgICAgICAgICAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwKKyAgICAgICAgICAgIDB4MEVCQiwgMHgwRUJDLCAweDBFQzgsIDB4MEVDRCwgMHgwRjE4LCAweDBGMTksIDB4MEY3MSwgMHgwRjg0LAorICAgICAgICAgICAgMHgwRjg2LCAweDBGOEIsIDB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsCisgICAgICAgICAgICAweDIwRDAsIDB4MjBEQywgMHgzMDJBLCAweDMwMkYsCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJDaGFyW10gPSB7CisgICAgICAgICAgICAweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwKKyAgICAgICAgICAgIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LAorICAgICAgICAgICAgMHgwRDU3LCAweDBFMzEsIDB4MEVCMSwgMHgwRjM1LCAweDBGMzcsIDB4MEYzOSwgMHgwRjNFLCAweDBGM0YsCisgICAgICAgICAgICAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBbODhdIERpZ2l0IDo6PSAuLi4KKyAgICAgICAgLy8KKworICAgICAgICBpbnQgZGlnaXRSYW5nZVtdID0geworICAgICAgICAgICAgMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsCisgICAgICAgICAgICAweDA5RTYsIDB4MDlFRiwgMHgwQTY2LCAweDBBNkYsIDB4MEFFNiwgMHgwQUVGLCAweDBCNjYsIDB4MEI2RiwKKyAgICAgICAgICAgIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLAorICAgICAgICAgICAgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBbODldIEV4dGVuZGVyIDo6PSAuLi4KKyAgICAgICAgLy8KKworICAgICAgICBpbnQgZXh0ZW5kZXJSYW5nZVtdID0geworICAgICAgICAgICAgMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgZXh0ZW5kZXJDaGFyW10gPSB7CisgICAgICAgICAgICAweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBTcGVjaWFsQ2hhciA6Oj0gJzwnLCAnJicsICdcbicsICdccicsICddJworICAgICAgICAvLworCisgICAgICAgIGludCBzcGVjaWFsQ2hhcltdID0geworICAgICAgICAgICAgJzwnLCAnJicsICdcbicsICdccicsICddJywKKyAgICAgICAgfTsKKworICAgICAgICAvLworICAgICAgICAvLyBJbml0aWFsaXplCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gc2V0IHZhbGlkIGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBjaGFyUmFuZ2VbaV07IGogPD0gY2hhclJhbmdlW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19WQUxJRCB8IE1BU0tfQ09OVEVOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFsQ2hhci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ0hBUlNbc3BlY2lhbENoYXJbaV1dID0gKGJ5dGUpKENIQVJTW3NwZWNpYWxDaGFyW2ldXSAmIH5NQVNLX0NPTlRFTlQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IHNwYWNlIGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZUNoYXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENIQVJTW3NwYWNlQ2hhcltpXV0gfD0gTUFTS19TUEFDRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBuYW1lIHN0YXJ0IGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lU3RhcnRDaGFyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDSEFSU1tuYW1lU3RhcnRDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXR0ZXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IGxldHRlclJhbmdlW2ldOyBqIDw9IGxldHRlclJhbmdlW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVyQ2hhci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ0hBUlNbbGV0dGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BU0tfTkNOQU1FX1NUQVJUIHwgTUFTS19OQ05BTUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgbmFtZSBjaGFyYWN0ZXJzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZUNoYXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENIQVJTW25hbWVDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0UmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBkaWdpdFJhbmdlW2ldOyBqIDw9IGRpZ2l0UmFuZ2VbaSArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IGNvbWJpbmluZ0NoYXJSYW5nZVtpXTsgaiA8PSBjb21iaW5pbmdDaGFyUmFuZ2VbaSArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbWJpbmluZ0NoYXJDaGFyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDSEFSU1tjb21iaW5pbmdDaGFyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gZXh0ZW5kZXJSYW5nZVtpXTsgaiA8PSBleHRlbmRlclJhbmdlW2kgKyAxXTsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hBUlNbal0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlckNoYXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENIQVJTW2V4dGVuZGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FIHwgTUFTS19OQ05BTUU7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgJzonIGZyb20gYWxsb3dhYmxlIE1BU0tfTkNOQU1FX1NUQVJUIGFuZCBNQVNLX05DTkFNRSBjaGFycworICAgICAgICBDSEFSU1snOiddICY9IH4oTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRSk7CisKKyAgICAgICAgLy8gc2V0IFB1YmlkIGNoYXJhY3RlcnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJpZENoYXIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENIQVJTW3B1YmlkQ2hhcltpXV0gfD0gTUFTS19QVUJJRDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmlkUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBwdWJpZFJhbmdlW2ldOyBqIDw9IHB1YmlkUmFuZ2VbaSArIDFdOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX1BVQklEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IC8vIDxjbGluaXQ+KCkKKworICAgIC8vCisgICAgLy8gUHVibGljIHN0YXRpYyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHBsZW1lbnRhbChpbnQgYykgeworICAgICAgICByZXR1cm4gKGMgPj0gMHgxMDAwMCAmJiBjIDw9IDB4MTBGRkZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgKiBzdXJyb2dhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGggVGhlIGhpZ2ggc3Vycm9nYXRlLgorICAgICAqIEBwYXJhbSBsIFRoZSBsb3cgc3Vycm9nYXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHN1cHBsZW1lbnRhbChjaGFyIGgsIGNoYXIgbCkgeworICAgICAgICByZXR1cm4gKGggLSAweEQ4MDApICogMHg0MDAgKyAobCAtIDB4REMwMCkgKyAweDEwMDAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgaGlnaFN1cnJvZ2F0ZShpbnQgYykgeworICAgICAgICByZXR1cm4gKGNoYXIpICgoKGMgLSAweDAwMDEwMDAwKSA+PiAxMCkgKyAweEQ4MDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvdyBzdXJyb2dhdGUgb2YgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciB0byAic3BsaXQiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2hhciBsb3dTdXJyb2dhdGUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgJiAweDNGRikgKyAweERDMDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgaGlnaCBzdXJyb2dhdGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlnaFN1cnJvZ2F0ZShpbnQgYykgeworICAgICAgICByZXR1cm4gKDB4RDgwMCA8PSBjICYmIGMgPD0gMHhEQkZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGxvdyBzdXJyb2dhdGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGludCBjKSB7CisgICAgICAgIHJldHVybiAoMHhEQzAwIDw9IGMgJiYgYyA8PSAweERGRkYpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIHZhbGlkLiBUaGlzIG1ldGhvZAorICAgICAqIGFsc28gY2hlY2tzIHRoZSBzdXJyb2dhdGUgY2hhcmFjdGVyIHJhbmdlIGZyb20gMHgxMDAwMCB0byAweDEwRkZGRi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcHJvZ3JhbSBjaG9vc2VzIHRvIGFwcGx5IHRoZSBtYXNrIGRpcmVjdGx5IHRvIHRoZQorICAgICAqIDxjb2RlPkNIQVJTPC9jb2RlPiBhcnJheSwgdGhlbiB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcKKyAgICAgKiB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1ZBTElEKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKKyAgICB9IC8vIGlzVmFsaWQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgaW52YWxpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChpbnQgYykgeworICAgICAgICByZXR1cm4gIWlzVmFsaWQoYyk7CisgICAgfSAvLyBpc0ludmFsaWQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGVudChpbnQgYykgeworICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfQ09OVEVOVCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7CisgICAgfSAvLyBpc0NvbnRlbnQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY2FuIGJlIGNvbnNpZGVyZWQgbWFya3VwLgorICAgICAqIE1hcmt1cCBjaGFyYWN0ZXJzIGluY2x1ZGUgJyZsdDsnLCAnJmFtcDsnLCBhbmQgJyUnLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXJrdXAoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPT0gJzwnIHx8IGMgPT0gJyYnIHx8IGMgPT0gJyUnOworICAgIH0gLy8gaXNNYXJrdXAoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIKKyAgICAgKiBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzNdIGluIHRoZSBYTUwgMS4wIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwOworICAgIH0gLy8gaXNTcGFjZShpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3RlcgorICAgICAqIGFzIGFtZGVuZGVkIGluIHRoZSBYTUwgMS4xIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTDExU3BhY2UoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1NQQUNFKSAhPSAwKSB8fAorICAgICAgICAgICAgYyA9PSAweDg1IHx8IGMgPT0gMHgyMDI4OworICAgIH0gLy8gaXNYTUwxMVNwYWNlKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7CisgICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKKyAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCisgICAgICogcmVjb21tZW5kYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKKyAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAorICAgICAqIHJlY29tbWVuZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOworICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOworICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KKworICAgIC8qCisgICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCisgICAgICovCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCisgICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKCBpc05hbWVTdGFydChjaCkgPT0gZmFsc2UpCisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCBpc05hbWUoIGNoICkgPT0gZmFsc2UgKXsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KKyAgICAKKworICAgIC8qCisgICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYworICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQorICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5DTmFtZShTdHJpbmcgbmNOYW1lKSB7CisgICAgICAgIGlmIChuY05hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2hhciBjaCA9IG5jTmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKCBpc05DTmFtZVN0YXJ0KGNoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5jTmFtZS5sZW5ndGgoKTsgaSsrICkgeworICAgICAgICAgICBjaCA9IG5jTmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCBpc05DTmFtZSggY2ggKSA9PSBmYWxzZSApeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IC8vIGlzVmFsaWROQ05hbWUoU3RyaW5nKTpib29sZWFuCisKKyAgICAvKgorICAgICAqIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKworICAgICAqLworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5tdG9rZW4gYWNjb3JkaW5nIHRvIFs3XQorICAgICAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm10b2tlbiBzdHJpbmcgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7CisgICAgICAgIGlmIChubXRva2VuLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm10b2tlbi5sZW5ndGgoKTsgaSsrICkgeworICAgICAgICAgICBjaGFyIGNoID0gbm10b2tlbi5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCAgISBpc05hbWUoIGNoICkgKXsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KKworCisKKworCisgICAgLy8gZW5jb2RpbmdzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBJQU5BIGVuY29kaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKKyAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KKyAgICAgKiBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nIGlhbmFFbmNvZGluZykgeworICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBpYW5hRW5jb2RpbmcubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGlhbmFFbmNvZGluZy5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gaWFuYUVuY29kaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBKYXZhIGVuY29kaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKKyAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KKyAgICAgKiBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoU3RyaW5nIGphdmFFbmNvZGluZykgeworICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBqYXZhRW5jb2RpbmcubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gamF2YUVuY29kaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgorCit9IC8vIGNsYXNzIFhNTENoYXIKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YTUxOYW1lSGVscGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWE1MTmFtZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjY4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWE1MTmFtZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBYTUxOYW1lSGVscGVyCit7CisgICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRRTmFtZShYTUxOYW1lIHhtbE5hbWUpCisgICAgeworICAgICAgICBpZiAoeG1sTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLmZvckxOUyggeG1sTmFtZS5nZXRMb2NhbE5hbWUoKSwgeG1sTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWE1MTmFtZSBmb3JMTlMoU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIHVyaSkKKyAgICB7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHVyaSA9ICIiOworICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKHVyaSwgbG9jYWxuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFhNTE5hbWUgZm9yTE4oU3RyaW5nIGxvY2FsbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgWG1sTmFtZUltcGwoIiIsIGxvY2FsbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYTUxOYW1lIGZvclByZXR0eShTdHJpbmcgcHJldHR5LCBpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgaW50IGF0ID0gcHJldHR5LmluZGV4T2YoJ0AnLCBvZmZzZXQpOworICAgICAgICBpZiAoYXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbCgiIiwgcHJldHR5LnN1YnN0cmluZyhvZmZzZXQpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChwcmV0dHkuc3Vic3RyaW5nKGF0ICsgMSksIHByZXR0eS5zdWJzdHJpbmcob2Zmc2V0LCBhdCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eShYTUxOYW1lIG5hbWUpCisgICAgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKworICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVcmkoKSA9PSBudWxsIHx8IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsTmFtZSgpOworCisgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsTmFtZSgpICsgIkAiICsgbmFtZS5nZXROYW1lc3BhY2VVcmkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4ZGlnaXRzID0gbmV3IGNoYXJbXQorICAgICAgICB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYWZlKGludCBjKQorICAgIHsKKyAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmUoU3RyaW5nIHMpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGlzU2FmZShjaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHV0ZjggPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXRmOCA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB1dGY4Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGhleGRpZ2l0c1sodXRmOFtqXSA+PiA0KSAmIDB4Rl0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChoZXhkaWdpdHNbdXRmOFtqXSAmIDB4Rl0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiX0JBRF9VVEY4X0NIQVIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhleHNhZmVkaXIoWE1MTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkgPT0gbnVsbCB8fCBuYW1lLmdldE5hbWVzcGFjZVVyaSgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gIl9ub25zLyIgKyBoZXhzYWZlKG5hbWUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICByZXR1cm4gaGV4c2FmZShuYW1lLmdldE5hbWVzcGFjZVVyaSgpKSArICIvIiArIGhleHNhZmUobmFtZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWFBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdhNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1hQYXRoLmphdmEKQEAgLTAsMCArMSwxMDAwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKKworcHVibGljIGNsYXNzIFhQYXRoCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYUGF0aENvbXBpbGVFeGNlcHRpb24gZXh0ZW5kcyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiAoIFhtbEVycm9yIGVyciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhlY3V0aW9uQ29udGV4dAorICAgIHsKKyAgICAgICAgcHVibGljIEV4ZWN1dGlvbkNvbnRleHQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJVCAgICAgPSAweDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NFTkQgPSAweDI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJTICAgPSAweDQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0ICggWFBhdGggeHBhdGggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3hwYXRoICE9IHhwYXRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF94cGF0aCA9IHhwYXRoOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9wYXRocyA9IG5ldyBQYXRoQ29udGV4dCBbIHhwYXRoLl9zZWxlY3Rvci5fcGF0aHMubGVuZ3RoIF07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBfcGF0aHNbIGkgXSA9IG5ldyBQYXRoQ29udGV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc3RhY2suY2xlYXIoKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9wYXRocy5sZW5ndGggOyBpKysgKQorICAgICAgICAgICAgICAgIF9wYXRoc1sgaSBdLmluaXQoIHhwYXRoLl9zZWxlY3Rvci5fcGF0aHNbIGkgXSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBzdGFydCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gX3BhdGhzWyBpIF0uc3RhcnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBlbGVtZW50ICggUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9zdGFjay5hZGQoIG5hbWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gX3BhdGhzWyBpIF0uZWxlbWVudCggbmFtZSApOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhdHRyICggUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaGl0ID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgICAgICBoaXQgPSBoaXQgfCBfcGF0aHNbIGkgXS5hdHRyKCBuYW1lICk7CisKKyAgICAgICAgICAgIHJldHVybiBoaXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBlbmQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdGFjay5yZW1vdmUoIF9zdGFjay5zaXplKCkgLSAxICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfcGF0aHMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgICAgICBfcGF0aHNbIGkgXS5lbmQoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQYXRoQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBQYXRoQ29udGV4dCAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJldiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdm9pZCBpbml0ICggU3RlcCBzdGVwcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnIgPSBzdGVwczsKKyAgICAgICAgICAgICAgICBfcHJldi5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFFOYW1lIHRvcCAoIGludCBpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFFOYW1lKSBFeGVjdXRpb25Db250ZXh0LnRoaXMuX3N0YWNrLmdldCggX3N0YWNrLnNpemUoKSAtIDEgLSBpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBiYWNrdHJhY2sgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyICE9IG51bGw7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKF9jdXJyLl9oYXNCYWNrdHJhY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLl9iYWNrdHJhY2s7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgIV9jdXJyLl9kZWVwOworCisgICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5fcHJldjsKKworICAgICAgICAgICAgICAgIHNlYXJjaDogZm9yICggOyAhX2N1cnIuX2RlZXAgOyBfY3VyciA9IF9jdXJyLl9wcmV2ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciAoIFN0ZXAgcyA9IF9jdXJyIDsgIXMuX2RlZXAgOyBzID0gcy5fcHJldiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5tYXRjaCggdG9wKCB0KysgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc2VhcmNoOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgc3RhcnQgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyICE9IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9jdXJyLl9wcmV2ID09IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzdGVwcyBjb25zaXN0IG9uIG9ubHkgYSB0ZXJtaW5hdG9yLCB0aGVuIHRoZSBwYXRoIGNhbgorICAgICAgICAgICAgICAgIC8vIG9ubHkgYmUgJy4nLiAgSW4gdGhpcyBjYXNlLCB3ZSBnZXQgYSBoaXQsIGJ1dCB0aGVyZSBpcworICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgZWxzZSB0byBtYXRjaC4gIE5vIG5lZWQgdG8gYmFja3RyYWNrLgorCisgICAgICAgICAgICAgICAgX2N1cnIgPSBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGVsZW1lbnQgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJldi5hZGQoIF9jdXJyICk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgX2N1cnIuX25hbWUgIT0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmICghX2N1cnIuX2F0dHIgJiYgX2N1cnIubWF0Y2goIG5hbWUgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX2N1cnIgPSBfY3Vyci5fbmV4dCkuX25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY3Vyci5fZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY3VyciA9PSBudWxsID8gSElUIDogSElUIHwgX2N1cnIuX2ZsYWdzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2soKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5tYXRjaCggbmFtZSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLl9uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuX2RlZXApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyLl9mbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgYm9vbGVhbiBhdHRyICggUU5hbWUgbmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyICE9IG51bGwgJiYgX2N1cnIuX2F0dHIgJiYgX2N1cnIubWF0Y2goIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBlbmQgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2N1cnIgPSAoU3RlcCkgX3ByZXYucmVtb3ZlKCBfcHJldi5zaXplKCkgLSAxICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaXZhdGUgU3RlcCBfY3VycjsKKyAgICAgICAgICAgIHByaXZhdGUgTGlzdCBfcHJldjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWFBhdGggICAgICAgICBfeHBhdGg7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgICBfc3RhY2s7CisgICAgICAgIHByaXZhdGUgUGF0aENvbnRleHRbXSBfcGF0aHM7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vCisKKyAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoIFN0cmluZyB4cGF0aCApCisgICAgICAgIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBjb21waWxlWFBhdGgoIHhwYXRoLCAiJHRoaXMiLCBudWxsICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgWFBhdGggY29tcGlsZVhQYXRoICggU3RyaW5nIHhwYXRoLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQorICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY29tcGlsZVhQYXRoKCB4cGF0aCwgY3VycmVudE5vZGVWYXIsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFhQYXRoIGNvbXBpbGVYUGF0aCAoIFN0cmluZyB4cGF0aCwgTWFwIG5hbWVzcGFjZXMgKQorICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVYUGF0aCggeHBhdGgsICIkdGhpcyIsIG5hbWVzcGFjZXMgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBYUGF0aCBjb21waWxlWFBhdGggKAorICAgICAgICBTdHJpbmcgeHBhdGgsIFN0cmluZyBjdXJyZW50Tm9kZVZhciwgTWFwIG5hbWVzcGFjZXMgKQorICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBuZXcgQ29tcGlsYXRpb25Db250ZXh0KCBuYW1lc3BhY2VzLCBjdXJyZW50Tm9kZVZhciApLgorICAgICAgICAgICAgICAgIGNvbXBpbGUoIHhwYXRoICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcGlsYXRpb25Db250ZXh0CisgICAgeworICAgICAgICBDb21waWxhdGlvbkNvbnRleHQgKCBNYXAgbmFtZXNwYWNlcywgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyLnN0YXJ0c1dpdGgoICIkIiApOworCisgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVWYXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY3VycmVudE5vZGVWYXIgPSAiJHRoaXMiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZVZhciA9IGN1cnJlbnROb2RlVmFyOworCisgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9leHRlcm5hbE5hbWVzcGFjZXMgPQorICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPT0gbnVsbCA/IG5ldyBIYXNoTWFwKCkgOiBuYW1lc3BhY2VzOworICAgICAgICB9CisKKyAgICAgICAgWFBhdGggY29tcGlsZSAoIFN0cmluZyBleHByICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIF9saW5lID0gMTsKKyAgICAgICAgICAgIF9jb2x1bW4gPSAxOworICAgICAgICAgICAgX2V4cHIgPSBleHByOworCisgICAgICAgICAgICByZXR1cm4gdG9rZW5pemVYUGF0aCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgY3VyckNoYXIgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyQ2hhciggMCApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgY3VyckNoYXIgKCBpbnQgb2Zmc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgX29mZnNldCArIG9mZnNldCA+PSBfZXhwci5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICA/IC0xCisgICAgICAgICAgICAgICAgICAgIDogX2V4cHIuY2hhckF0KCBfb2Zmc2V0ICsgb2Zmc2V0ICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgYWR2YW5jZSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9vZmZzZXQgPCBfZXhwci5sZW5ndGgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2V4cHIuY2hhckF0KCBfb2Zmc2V0ICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX29mZnNldCsrOworICAgICAgICAgICAgICAgIF9jb2x1bW4rKzsKKworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGluZSsrOworICAgICAgICAgICAgICAgICAgICBfY29sdW1uID0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX29mZnNldCArIDEgPCBfZXhwci5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSBfZXhwci5jaGFyQXQoIF9vZmZzZXQgKyAxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dENoID09ICdccicgfHwgbmV4dENoID09ICdcbicpICYmIGNoICE9IG5leHRDaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2Zmc2V0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkdmFuY2UgKCBpbnQgY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgY291bnQgPj0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKCBjb3VudC0tID4gMCApCisgICAgICAgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIGJvb2xlYW4gaXNXaGl0ZXNwYWNlICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXNXaGl0ZXNwYWNlKCAwICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gaXNXaGl0ZXNwYWNlICggaW50IG9mZnNldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaCA9IGN1cnJDaGFyKCBvZmZzZXQgKTsKKyAgICAgICAgICAgIHJldHVybiBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccic7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzTkNOYW1lU3RhcnQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGN1cnJDaGFyKCkgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgPyBmYWxzZSA6CisgICAgICAgICAgICAgICAgICAgIFhNTENoYXIuaXNOQ05hbWVTdGFydCggY3VyckNoYXIoKSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIGlzTkNOYW1lICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBjdXJyQ2hhcigpID09IC0xCisgICAgICAgICAgICAgICAgICAgID8gZmFsc2UgOgorICAgICAgICAgICAgICAgICAgICBYTUxDaGFyLmlzTkNOYW1lKCBjdXJyQ2hhcigpICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gc3RhcnRzV2l0aCAoIFN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIHMsIDAgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBzdGFydHNXaXRoICggU3RyaW5nIHMsIGludCBvZmZzZXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX29mZnNldCArIG9mZnNldCA+PSBfZXhwci5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBfZXhwci5zdGFydHNXaXRoKCBzLCBfb2Zmc2V0ICsgb2Zmc2V0ICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbiBuZXdFcnJvciAoIFN0cmluZyBtc2cgKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQorICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBtc2csIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBfbGluZSwgX2NvbHVtbiwgX29mZnNldCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyBYUGF0aENvbXBpbGVFeGNlcHRpb24oIGVyciApOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGxvb2t1cFByZWZpeCAoIFN0cmluZyBwcmVmaXggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcy5jb250YWluc0tleSggcHJlZml4ICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VzLmdldCggcHJlZml4ICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChfZXh0ZXJuYWxOYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX2V4dGVybmFsTmFtZXNwYWNlcy5nZXQoIHByZWZpeCApOworCisgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggInhtbCIgKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoICJ4cyIgKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggInhzaSIgKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocHJlZml4LmVxdWFscyggImZuIiApKQorICAgICAgICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnczLm9yZy8yMDAyLzExL3hxdWVyeS1mdW5jdGlvbnMiOworCisgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIlVuZGVmaW5lZCBwcmVmaXg6ICIgKyBwcmVmaXggKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZVdoaXRlc3BhY2UgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiBzYXdTcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgc2F3U3BhY2UgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2F3U3BhY2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIFRva2VuaXppbmcgd2lsbCBjb25zdW1lIHdoaXRlc3BhY2UgZm9sbG93ZWQgYnkgdGhlIHRva2Vucywgc2VwYXJhdGVkCisgICAgICAgIC8vIGJ5IHdoaXRlc3BhY2UuICBUaGUgd2hpdGVzcGFjZSBmb2xsb3dpbmcgdGhlIGxhc3QgdG9rZW4gaXMgbm90CisgICAgICAgIC8vIGNvbnN1bWVkLgorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRva2VuaXplICggU3RyaW5nIHMgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQorICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMsIG9mZnNldCApKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb2Zmc2V0ICs9IHMubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGFkdmFuY2UoIG9mZnNldCApOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB0b2tlbml6ZSAoIFN0cmluZyBzMSwgU3RyaW5nIHMyICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHMxLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGFzc2VydCBzMi5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoIGlzV2hpdGVzcGFjZSggb2Zmc2V0ICkgKQorICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXN0YXJ0c1dpdGgoIHMxLCBvZmZzZXQgKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9mZnNldCArPSBzMS5sZW5ndGgoKTsKKworICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMiwgb2Zmc2V0ICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgb2Zmc2V0ICs9IHMyLmxlbmd0aCgpOworCisgICAgICAgICAgICBhZHZhbmNlKCBvZmZzZXQgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9rZW5pemUgKCBTdHJpbmcgczEsIFN0cmluZyBzMiwgU3RyaW5nIHMzICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHMxLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGFzc2VydCBzMi5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICBhc3NlcnQgczMubGVuZ3RoKCkgPiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMSwgb2Zmc2V0ICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBvZmZzZXQgKz0gczEubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICggaXNXaGl0ZXNwYWNlKCBvZmZzZXQgKSApCisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aCggczIsIG9mZnNldCApKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG9mZnNldCArPSBzMi5sZW5ndGgoKTsKKworICAgICAgICAgICAgd2hpbGUgKCBpc1doaXRlc3BhY2UoIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzdGFydHNXaXRoKCBzMywgb2Zmc2V0ICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBvZmZzZXQgKz0gczMubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBhZHZhbmNlKCBvZmZzZXQgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0b2tlbml6ZU5DTmFtZSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZVdoaXRlc3BhY2UoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFpc05DTmFtZVN0YXJ0KCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCBub24tY29sb25pemVkIG5hbWUiICk7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCAoY2hhcikgY3VyckNoYXIoKSApOworCisgICAgICAgICAgICBmb3IgKCBhZHZhbmNlKCkgOyBpc05DTmFtZSgpIDsgYWR2YW5jZSgpICkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIChjaGFyKSBjdXJyQ2hhcigpICk7CisKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSBnZXRBbnlRTmFtZSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggIiIsICIiICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgUU5hbWUgdG9rZW5pemVRTmFtZSAoICkgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodG9rZW5pemUoICIqIiApKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbnlRTmFtZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgbmNOYW1lID0gdG9rZW5pemVOQ05hbWUoKTsKKworICAgICAgICAgICAgaWYgKCF0b2tlbml6ZSggIjoiICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSggbG9va3VwUHJlZml4KCAiIiApLCBuY05hbWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgbmV3IFFOYW1lKAorICAgICAgICAgICAgICAgICAgICBsb29rdXBQcmVmaXgoIG5jTmFtZSApLAorICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZSggIioiICkgPyAiIiA6IHRva2VuaXplTkNOYW1lKCkgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW5pemVRdW90ZWRVcmkgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBxdW90ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiXCIiICkpCisgICAgICAgICAgICAgICAgcXVvdGUgPSAnIic7CisgICAgICAgICAgICBlbHNlICBpZiAodG9rZW5pemUoICInIiApKQorICAgICAgICAgICAgICAgIHF1b3RlID0gJ1wnJzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkV4cGVjdGVkIHF1b3RlIChcIiBvciAnKSIgKTsKKworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpID09IC0xKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIlBhdGggdGVybWluYXRlZCBpbiBVUkkgbGl0ZXJhbCIgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoY3VyckNoYXIoKSA9PSBxdW90ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpICE9IHF1b3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggKGNoYXIpIGN1cnJDaGFyKCkgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdGVwIGFkZFN0ZXAgKCBib29sZWFuIGRlZXAsIGJvb2xlYW4gYXR0ciwgUU5hbWUgbmFtZSwgU3RlcCBzdGVwcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0ZXAgc3RlcCA9IG5ldyBTdGVwKCBkZWVwLCBhdHRyLCBuYW1lICk7CisKKyAgICAgICAgICAgIGlmIChzdGVwcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGVwOworCisgICAgICAgICAgICBTdGVwIHMgPSBzdGVwczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKCBzdGVwcy5fbmV4dCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICBzdGVwcyA9IHN0ZXBzLl9uZXh0OworCisgICAgICAgICAgICBzdGVwcy5fbmV4dCA9IHN0ZXA7CisgICAgICAgICAgICBzdGVwLl9wcmV2ID0gc3RlcHM7CisKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdGVwIHRva2VuaXplU3RlcHMgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLyIgKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXdFcnJvciggIkFic29sdXRlIHBhdGhzIHVuc3VwcG9ydGVkIiApOworCisgICAgICAgICAgICBib29sZWFuIGRlZXA7CisKKyAgICAgICAgICAgIGlmICh0b2tlbml6ZSggIiQiLCBfY3VycmVudE5vZGVWYXIsICIvLyIgKSB8fCB0b2tlbml6ZSggIi4iLCAiLy8iICkpCisgICAgICAgICAgICAgICAgZGVlcCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggIiQiLCBfY3VycmVudE5vZGVWYXIsICIvIiApIHx8IHRva2VuaXplKCAiLiIsICIvIiApKQorICAgICAgICAgICAgICAgIGRlZXAgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuaXplKCAiJCIsIF9jdXJyZW50Tm9kZVZhciApIHx8IHRva2VuaXplKCAiLiIgKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkU3RlcCggZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVlcCA9IGZhbHNlOworCisgICAgICAgICAgICBTdGVwIHN0ZXBzID0gbnVsbDsKKworICAgICAgICAgICAgLy8gQ29tcGlsZSB0aGUgc3RlcHMgcmVtb3ZpbmcgLy4gYW5kIG1lcmdpbmQgLy8uIHdpdGggdGhlIG5leHQgc3RlcAorCisgICAgICAgICAgICBib29sZWFuIGRlZXBEb3QgPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5pemUoICJhdHRyaWJ1dGUiLCAiOjoiICkgfHwgdG9rZW5pemUoICJAIiApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCBkZWVwLCB0cnVlLCB0b2tlbml6ZVFOYW1lKCksIHN0ZXBzICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFFOYW1lIG5hbWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLiIgKSkKKyAgICAgICAgICAgICAgICAgICAgZGVlcERvdCA9IGRlZXBEb3QgfHwgZGVlcDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggImNoaWxkIiwgIjo6IiApICYmIChuYW1lID0gdG9rZW5pemVRTmFtZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIGRlZXAsIGZhbHNlLCBuYW1lLCBzdGVwcyApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKChuYW1lID0gdG9rZW5pemVRTmFtZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IGFkZFN0ZXAoIGRlZXAsIGZhbHNlLCBuYW1lLCBzdGVwcyApOworCisgICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiLy8iICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVlcERvdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbml6ZSggIi8iICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcERvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZXAgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSAvLy4gYXQgdGhlIGVuZCBvZiB0aCBwYXRoLCB0aGVuIHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgLy8gdHdvIHBhdGhzLCBvbmUgd2l0aCAqIGF0IHRoZSBlbmQgYW5kIGFub3RoZXIgd2l0aCBAKiBhdCB0aGUgZW5kLgorCisgICAgICAgICAgICBpZiAoKF9sYXN0RGVlcERvdCA9IGRlZXBEb3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9sYXN0RGVlcERvdCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RlcHMgPSBhZGRTdGVwKCB0cnVlLCBmYWxzZSwgZ2V0QW55UU5hbWUoKSwgc3RlcHMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIHNlbnRpbmFsIHN0ZXAgKF9uYW1lID09IG51bGwpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBhZGRTdGVwKCBmYWxzZSwgZmFsc2UsIG51bGwsIHN0ZXBzICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUJhY2t0cmFjayAoIFN0ZXAgc3RlcHMgKQorICAgICAgICAgICAgdGhyb3dzIFhQYXRoQ29tcGlsZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQ29tcHV0ZSBzdGF0aWMgYmFja3RyYWNrIGluZm9ybWF0aW9uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IEkgdXNlIHRoZSBmYWN0IHRoYXQgX2hhc0JhY2t0cmFjayBpcyBpbml0aWFsaXplZCB0bworICAgICAgICAgICAgLy8gZmFsc2UgYW5kIF9iYWNrdHJhY2sgdG8gbnVsbCBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBTdGVwIHMsIHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIHMgPSBzdGVwcyA7IHMgIT0gbnVsbCA7IHMgPSB0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzZWdtZW50IGZyb20gWyBzLCB0ICkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKCB0ID0gcy5fbmV4dCA7IHQgIT0gbnVsbCAmJiAhdC5fZGVlcCA7ICkKKyAgICAgICAgICAgICAgICAgICAgdCA9IHQuX25leHQ7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VnbWVudCBpcyBOT1Qgcm9vdGVkIGF0IC8vLCB0aGVuIHRoZSBiYWNrdHJhY2sgaXMKKyAgICAgICAgICAgICAgICAvLyBudWxsIGZvciB0aGUgZW50aXJlIHNlZ21lbnQsIGluY2x1ZGluZyBwb3NzaWJsZSBhdHRyIGFuZC9vcgorICAgICAgICAgICAgICAgIC8vIHNlbnRpbmFsCisKKyAgICAgICAgICAgICAgICBpZiAoIXMuX2RlZXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBTdGVwIHUgPSBzIDsgdSAhPSB0IDsgdSA9IHUuX25leHQgKQorICAgICAgICAgICAgICAgICAgICAgICAgdS5faGFzQmFja3RyYWNrID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzZXF1ZW5jZSBbIHMsIHUgKSBvZiBsZW5ndGggbiB3aGljaCBjb250YWluIG5vCisgICAgICAgICAgICAgICAgLy8gd2lsZCBzdGVwcy4KKworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICBTdGVwIHUgPSBzOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCB1ICE9IHQgJiYgdS5fbmFtZSAhPSBudWxsICYmICF1LmlzV2lsZCgpICYmICF1Ll9hdHRyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUuX25leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTm93LCBhcHBseSBLTVAgdG8gWyBzLCB1ICkgZm9yIGZhc3QgYmFja3RyYWNraW5nCisKKyAgICAgICAgICAgICAgICBRTmFtZSBbXSBwYXR0ZXJuID0gbmV3IFFOYW1lIFsgbiArIDEgXTsKKyAgICAgICAgICAgICAgICBpbnQgW10ga21wID0gbmV3IGludCBbIG4gKyAxIF07CisKKyAgICAgICAgICAgICAgICBTdGVwIHYgPSBzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5bIGkgXSA9IHYuX25hbWU7CisgICAgICAgICAgICAgICAgICAgIHYgPSB2Ll9uZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhdHRlcm5bIG4gXSA9IGdldEFueVFOYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGogPSBrbXBbIDAgXSA9IC0xOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCBpIDwgbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGogPiAtMSAmJiAhcGF0dGVyblsgaSBdLmVxdWFscyggcGF0dGVyblsgaiBdICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGttcFsgaiBdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuWyArK2kgXS5lcXVhbHMoIHBhdHRlcm5bICsraiBdICkpCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBbIGkgXSA9IGttcFsgaiBdOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBbIGkgXSA9IGo7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICggdiA9IHMgOyB2ICE9IHUgOyB2ID0gdi5fbmV4dCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB2Ll9iYWNrdHJhY2sgPSBzOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IGttcFsgaSBdIDsgaiA+IDAgOyBqLS0gKQorICAgICAgICAgICAgICAgICAgICAgICAgdi5fYmFja3RyYWNrID0gdi5fYmFja3RyYWNrLl9uZXh0OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHN1Y2Nlc3MgYmFja3RyYWNrIGFuZCBzdHVmZiBpdCBpbnRvIGFuIGF0dHIgYW5kCisgICAgICAgICAgICAgICAgLy8gc2VudGluYWwgaWYgdGhleSBleGlzdCBmb3IgdGhpcyBzZWdtZW50CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdiA9IHM7CisKKyAgICAgICAgICAgICAgICBpZiAobiA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0ga21wWyBuIC0gMSBdIDsgaiA+IDAgOyBqLS0gKQorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYuX25leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHUgIT0gdCAmJiB1Ll9hdHRyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdS5faGFzQmFja3RyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdS5fYmFja3RyYWNrID0gdjsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUuX25leHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHUgIT0gdCAmJiB1Ll9uYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Ll9oYXNCYWNrdHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB1Ll9iYWNrdHJhY2sgPSB2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IG9mIGEgZGVlcCBzZWdtZW50IGFsd2F5cyBiYWNrdHJhY2tzIHRvIGl0c2VsZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFzc2VydCBzLl9kZWVwOworCisgICAgICAgICAgICAgICAgcy5faGFzQmFja3RyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzLl9iYWNrdHJhY2sgPSBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHRva2VuaXplUGF0aCAoIEFycmF5TGlzdCBwYXRocyApCisgICAgICAgICAgICB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9sYXN0RGVlcERvdCA9IGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdGVwIHN0ZXBzID0gdG9rZW5pemVTdGVwcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb21wdXRlQmFja3RyYWNrKCBzdGVwcyApOworCisgICAgICAgICAgICBwYXRocy5hZGQoIHN0ZXBzICk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHBhdGggZW5kZWQgaW4gLy8uLCB0aGF0IHBhdGggd2lsbCBtYXRjaCBhbGwKKyAgICAgICAgICAgIC8vIGVsZW1lbnRzLCBoZXJlIEkgbWFrZSBhIHBhdGggd2hpY2ggbWF0Y2hlcyBhbGwgYXR0cmlidXRlcy4KKworICAgICAgICAgICAgaWYgKF9sYXN0RGVlcERvdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2F3RGVlcERvdCA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RlcCBzID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGZvciAoIFN0ZXAgdCA9IHN0ZXBzIDsgdCAhPSBudWxsIDsgdCA9IHQuX25leHQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuX25leHQgIT0gbnVsbCAmJiB0Ll9uZXh0Ll9uZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYWRkU3RlcCggdC5fZGVlcCwgdHJ1ZSwgdC5fbmFtZSwgcyApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gYWRkU3RlcCggdC5fZGVlcCwgdC5fYXR0ciwgdC5fbmFtZSwgcyApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbXB1dGVCYWNrdHJhY2soIHMgKTsKKworICAgICAgICAgICAgICAgIHBhdGhzLmFkZCggcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFNlbGVjdG9yIHRva2VuaXplU2VsZWN0b3IgKCApIHRocm93cyBYUGF0aENvbXBpbGVFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgQXJyYXlMaXN0IHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgICAgICB0b2tlbml6ZVBhdGgoIHBhdGhzICk7CisKKyAgICAgICAgICAgIHdoaWxlICggdG9rZW5pemUoICJ8IiApICkKKyAgICAgICAgICAgICAgICB0b2tlbml6ZVBhdGgoIHBhdGhzICk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3IoIChTdGVwW10pIHBhdGhzLnRvQXJyYXkoIG5ldyBTdGVwIFsgcGF0aHMuc2l6ZSgpIF0gKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBYUGF0aCB0b2tlbml6ZVhQYXRoICggKSB0aHJvd3MgWFBhdGhDb21waWxlRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuaXplKCAiZGVjbGFyZSIsICJuYW1lc3BhY2UiICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlV2hpdGVzcGFjZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoICJFeHBlY3RlZCBwcmVmaXggYWZ0ZXIgJ2RlY2xhcmUgbmFtZXNwYWNlJyIgKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdG9rZW5pemVOQ05hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplKCAiPSIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgJz0nIiApOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSB0b2tlbml6ZVF1b3RlZFVyaSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VzLmNvbnRhaW5zS2V5KCBwcmVmaXggKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZGVmaW5pdGlvbiBvZiBuYW1lc3BhY2UgcHJlZml4OiAiICsgcHJlZml4ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcy5wdXQoIHByZWZpeCwgdXJpICk7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZSggImRlZmF1bHQiLCAiZWxlbWVudCIsICJuYW1lc3BhY2UiICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplKCAiPSIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKCAiRXhwZWN0ZWQgJz0nIiApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHRva2VuaXplUXVvdGVkVXJpKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZXMuY29udGFpbnNLZXkoICIiICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWRlZmluaXRpb24gb2YgZGVmYXVsdCBlbGVtZW50IG5hbWVzcGFjZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VzLnB1dCggIiIsIHVyaSApOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIHRoZSBkZWZhdWx0IHByZWZpeCBtYXBwaW5nIGlmIGl0IGhhcyBub3QgYmVlbiByZWRlZmluZWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFfbmFtZXNwYWNlcy5jb250YWluc0tleSggIiIgKSkKKyAgICAgICAgICAgICAgICBfbmFtZXNwYWNlcy5wdXQoICIiLCAiIiApOworCisgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IHRva2VuaXplU2VsZWN0b3IoKTsKKworICAgICAgICAgICAgcGFyc2VXaGl0ZXNwYWNlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjdXJyQ2hhcigpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ld0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyICciICsgKGNoYXIpIGN1cnJDaGFyKCkgKyAiJyIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYUGF0aCggc2VsZWN0b3IsIF9zYXdEZWVwRG90ICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBfZXhwcjsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3Nhd0RlZXBEb3Q7ICAvLyBTYXcgb25lIG92ZXJhbGwKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9sYXN0RGVlcERvdDsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBfY3VycmVudE5vZGVWYXI7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIE1hcCBfbmFtZXNwYWNlczsKKyAgICAgICAgcHJpdmF0ZSBNYXAgX2V4dGVybmFsTmFtZXNwYWNlczsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgaW50IF9vZmZzZXQ7CisgICAgICAgIHByaXZhdGUgaW50IF9saW5lOworICAgICAgICBwcml2YXRlIGludCBfY29sdW1uOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFN0ZXAKKyAgICB7CisgICAgICAgIFN0ZXAgKCBib29sZWFuIGRlZXAsIGJvb2xlYW4gYXR0ciwgUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKKworICAgICAgICAgICAgX2RlZXAgPSBkZWVwOworICAgICAgICAgICAgX2F0dHIgPSBhdHRyOworCisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgICAgICAgICBpZiAoX2RlZXAgfHwgIV9hdHRyKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEV4ZWN1dGlvbkNvbnRleHQuREVTQ0VORDsKKworICAgICAgICAgICAgaWYgKF9hdHRyKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEV4ZWN1dGlvbkNvbnRleHQuQVRUUlM7CisKKyAgICAgICAgICAgIF9mbGFncyA9IGZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1dpbGQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbmFtZS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA9PSAwOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBtYXRjaCAoIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBfbmFtZS5nZXRMb2NhbFBhcnQoKTsKKworICAgICAgICAgICAgaWYgKGxvY2FsLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IF9uYW1lLmdldE5hbWVzcGFjZVVSSSgpOworCisgICAgICAgICAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB1cmkuZXF1YWxzKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBfbmFtZS5lcXVhbHMoIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gX2F0dHI7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gX2RlZXA7CisKKyAgICAgICAgaW50IF9mbGFnczsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIFFOYW1lIF9uYW1lOworCisgICAgICAgIFN0ZXAgX25leHQsIF9wcmV2OworCisgICAgICAgIGJvb2xlYW4gX2hhc0JhY2t0cmFjazsKKyAgICAgICAgU3RlcCAgICBfYmFja3RyYWNrOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdG9yCisgICAgeworICAgICAgICBTZWxlY3RvciAoIFN0ZXBbXSBwYXRocyApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wYXRocyA9IHBhdGhzOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RlcFtdIF9wYXRoczsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKyAgICAKKyAgICBwcml2YXRlIFhQYXRoICggU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gc2F3RGVlcERvdCApCisgICAgeworICAgICAgICBfc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgX3Nhd0RlZXBEb3QgPSBzYXdEZWVwRG90OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNhd0RlZXBEb3QgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3Nhd0RlZXBEb3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBfc2VsZWN0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuICBfc2F3RGVlcERvdDsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFbmNvZGluZ1NuaWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRiYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVuY29kaW5nU25pZmZlci5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgWG1sRW5jb2RpbmdTbmlmZmVyCit7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICBfeG1sZW5jb2Rpbmc7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICBfamF2YWVuY29kaW5nOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gX3N0cmVhbTsKKyAgICBwcml2YXRlIFJlYWRlciAgICAgIF9yZWFkZXI7CisKKyAgICAvKioKKyAgICAgKiBTbmlmZnMgdGhlIGdpdmVuIFhNTCBzdHJlYW0gZm9yIGVuY29kaW5nIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQWZ0ZXIgYSBzbmlmZmVyIGlzIGNvbnN0cnVjdGVkLCBpdCBjYW4gcmV0dXJuIGVpdGhlciBhIHN0cmVhbQorICAgICAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIHN0cmVhbSB3cmFwcGVyIG9mIHRoZSBvcmlnaW5hbCkgb3IgYSByZWFkZXIKKyAgICAgKiAod2hpY2ggYXBwbGllcyB0aGUgcHJvcGVyIGVuY29kaW5nKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gICAgICAgICAgIFRoZSBzdHJlYW0gdG8gc25pZmYKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmdPdmVycmlkZSBUaGUgWE1MIChJQU5BKSBuYW1lIGZvciB0aGUgb3ZlcnJpZGluZyBlbmNvZGluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sRW5jb2RpbmdTbmlmZmVyKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nT3ZlcnJpZGUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgCisgICAgICAgIGlmIChlbmNvZGluZ092ZXJyaWRlICE9IG51bGwpCisgICAgICAgICAgICBfeG1sZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRKYXZhMklBTkFNYXBwaW5nKGVuY29kaW5nT3ZlcnJpZGUpOworCisgICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IGVuY29kaW5nT3ZlcnJpZGU7CisKKyAgICAgICAgaWYgKF94bWxlbmNvZGluZyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTbmlmZmVkWG1sSW5wdXRTdHJlYW0gc25pZmZlZCA9IG5ldyBTbmlmZmVkWG1sSW5wdXRTdHJlYW0oX3N0cmVhbSk7CisgICAgICAgICAgICBfeG1sZW5jb2RpbmcgPSBzbmlmZmVkLmdldFhtbEVuY29kaW5nKCk7CisgICAgICAgICAgICBhc3NlcnQoX3htbGVuY29kaW5nICE9IG51bGwpOworICAgICAgICAgICAgX3N0cmVhbSA9IHNuaWZmZWQ7CisgICAgICAgIH0KKworICAgICAgICBfamF2YWVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyhfeG1sZW5jb2RpbmcpOworICAgICAgICAKKyAgICAgICAgLy8gd2UgYWxsb3cgeW91IHRvIHVzZSBKYXZhJ3MgZW5jb2RpbmcgbmFtZXMgaW4gWE1MIGV2ZW4gdGhvdWdoIHlvdSdyZQorICAgICAgICAvLyBub3Qgc3VwcG9zZWQgdG8uCisgICAgICAgIAorICAgICAgICBpZiAoX2phdmFlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgX2phdmFlbmNvZGluZyA9IF94bWxlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbmlmZnMgdGhlIGdpdmVuIFhNTCBzdHJlYW0gZm9yIGVuY29kaW5nIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQWZ0ZXIgYSBzbmlmZmVyIGlzIGNvbnN0cnVjdGVkLCBpdCBjYW4gcmV0dXJuIGVpdGhlciBhIHJlYWRlcgorICAgICAqICh3aGljaCBpcyBhIGJ1ZmZlcmVkIHN0cmVhbSB3cmFwcGVyIG9mIHRoZSBvcmlnaW5hbCkgb3IgYSBzdHJlYW0KKyAgICAgKiAod2hpY2ggYXBwbGllcyB0aGUgcHJvcGVyIGVuY29kaW5nKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgICAgICAgICAgIFRoZSByZWFkZXIgdG8gc25pZmYKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmdEZWZhdWx0ICBUaGUgSmF2YSBuYW1lIGZvciB0aGUgZGVmYXVsdCBlbmNvZGluZyB0byBhcHBseSwgVVRGLTggaWYgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFhtbEVuY29kaW5nU25pZmZlcihSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZW5jb2RpbmdEZWZhdWx0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZW5jb2RpbmdEZWZhdWx0ID09IG51bGwpCisgICAgICAgICAgICBlbmNvZGluZ0RlZmF1bHQgPSAiVVRGLTgiOworICAgICAgICAKKyAgICAgICAgU25pZmZlZFhtbFJlYWRlciBzbmlmZmVkUmVhZGVyID0gbmV3IFNuaWZmZWRYbWxSZWFkZXIocmVhZGVyKTsKKyAgICAgICAgX3JlYWRlciA9IHNuaWZmZWRSZWFkZXI7CisgICAgICAgIF94bWxlbmNvZGluZyA9IHNuaWZmZWRSZWFkZXIuZ2V0WG1sRW5jb2RpbmcoKTsKKworICAgICAgICBpZiAoX3htbGVuY29kaW5nID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoZW5jb2RpbmdEZWZhdWx0KTsKKyAgICAgICAgICAgIGlmIChfeG1sZW5jb2RpbmcgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfamF2YWVuY29kaW5nID0gZW5jb2RpbmdEZWZhdWx0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF94bWxlbmNvZGluZyA9IGVuY29kaW5nRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfeG1sZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIF94bWxlbmNvZGluZyA9ICJVVEYtOCI7CisgICAgICAgIAorICAgICAgICAvLyB3ZSBhbGxvdyB5b3UgdG8gdXNlIEphdmEncyBlbmNvZGluZyBuYW1lcyBpbiBYTUwgZXZlbiB0aG91Z2ggeW91J3JlCisgICAgICAgIC8vIG5vdCBzdXBwb3NlZCB0by4KKyAgICAgICAgCisgICAgICAgIF9qYXZhZW5jb2RpbmcgPSBFbmNvZGluZ01hcC5nZXRJQU5BMkphdmFNYXBwaW5nKF94bWxlbmNvZGluZyk7CisgICAgICAgIAorICAgICAgICBpZiAoX2phdmFlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgX2phdmFlbmNvZGluZyA9IF94bWxlbmNvZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfeG1sZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9qYXZhZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBfc3RyZWFtOworICAgICAgICAgICAgX3N0cmVhbSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gaXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3JlYWRlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBSZWFkZXJJbnB1dFN0cmVhbSggX3JlYWRlciwgX2phdmFlbmNvZGluZyApOworICAgICAgICAgICAgX3JlYWRlciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gaXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyICggKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKF9yZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IF9yZWFkZXI7CisgICAgICAgICAgICBfcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3N0cmVhbSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBfc3RyZWFtLCBfamF2YWVuY29kaW5nICk7CisgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MzcwMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sRXJyb3JDb250ZXh0Cit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0xPQURfWFNEX0ZJTEUgICAgICAgICAgICAgID0gICAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTk5PVF9MT0FEX1hTRF9DT05GSUdfRklMRSAgICAgICA9ICAgMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TQ0hFTUFfRUxFTUVOVCAgICAgICAgICAgICAgICAgPSAgIDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFICAgICAgID0gICA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSAgICAgICAgICA9ICAgNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgPSAgIDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVEVU5EQU5UX05FU1RFRF9UWVBFICAgICAgICAgICAgID0gICA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfTUlTU0lOR19OQU1FICAgICAgICAgICAgICA9ICAgODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfREVGQVVMVF9GSVhFRCAgICAgICAgICAgPSAgIDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgICAgID0gIDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9NSVNTSU5HX05BTUUgICAgICAgICAgICA9ICAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVBfTUlTU0lOR19OQU1FICAgICAgPSAgMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1lDTElDX0RFUEVOREVOQ1kgICAgICAgICAgICAgICAgID0gIDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOSU9OX01FTUJFUl9OT1RfU0lNUExFICAgICAgICAgICA9ICAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUUklDVElPTl9SRURVTkRBTlRfQkFTRSAgICAgICAgPSAgMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVFJJQ1RJT05fTUlTU0lOR19CQVNFICAgICAgICAgID0gIDE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9SRVNUUklDVElPTl9OT1RfU0lNUExFICAgICA9ICAxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9ET0VTX05PVF9BUFBMWSAgICAgICAgICAgICAgPSAgMTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRFVQTElDQVRFRCAgICAgICAgICAgICAgICAgID0gIDE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1ZBTFVFX01BTEZPUk1FRCAgICAgICAgICAgICA9ICAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgPSAgMjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEX05VTUJFUiAgICAgICAgICAgICAgICAgID0gIDIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfTUlTU0lOR19JVEVNICAgICAgICAgICAgICAgICA9ICAyMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fTk9UX1NJTVBMRSAgICAgICAgICAgICAgPSAgMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9PRl9MSVNUICAgICAgICAgICAgICAgICAgICAgID0gIDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RfV0hJVEVTUEFDRSAgICAgICAgICAgICAgICAgICA9ICAyNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRURVTkRBTlRfQ09OVEVOVF9NT0RFTCAgICAgICAgICAgPSAgMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNUUklDVElPTl9PUl9FWFRFTlNJT04gID0gIDI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfQkFTRSAgICAgICAgICAgICAgICAgICAgICA9ICAyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1JFRl9OT1RfRk9VTkQgICAgICAgICAgICAgPSAgMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9FWFRSQV9SRUYgICAgICAgICAgICAgICAgID0gIDMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMTF9DT05URU5UUyAgICAgICAgICAgICAgICAgICAgICA9ICAzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVF9HUk9VUF9ORUVERUQgICAgICAgICAgICAgPSAgMzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1JPVVBfTUlTU0lOR19SRUYgICAgICAgICAgICAgICAgID0gIDMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQX05PVF9GT1VORCAgICAgICAgICAgICA9ICAzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTUFYX09DQ1VSUyAgICAgICAgICAgICAgICAgICAgPSAgMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1JFRl9OT1RfRk9VTkQgICAgICAgICAgID0gIDM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9BVFRSSUJVVEVfTkFNRSAgICAgICAgICA9ICAzNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfQU5ZX0FUVFJJQlVURSAgICAgICAgICAgPSAgMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0dST1VQX01JU1NJTkdfUkVGICAgICAgID0gIDM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9HUk9VUF9OT1RfRk9VTkQgICAgICAgICA9ICA0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX0JBU0VfTk9UX0NPTVBMRVggICAgICAgICAgPSAgNDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0VYVEVORF9BTEwgICAgICAgICAgICAgICAgID0gIDQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRV9CQVNFX05PVF9TSU1QTEUgICAgICAgICAgICA9ICA0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNFUlZFRF9UWVBFX05BTUUgICAgICAgICAgICAgICAgPSAgNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9SRVNUUklDVElPTiAgICAgICAgICAgICAgID0gIDQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0NIRU1BICAgICAgICAgICAgICAgICAgICA9ICA0NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVVBMSUNBVEVfR0xPQkFMX0VMRU1FTlQgICAgICAgICAgPSAgNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0dMT0JBTF9BVFRSSUJVVEUgICAgICAgID0gIDQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9HTE9CQUxfVFlQRSAgICAgICAgICAgICA9ICA0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNPTlNJU1RFTlRfVFlQRSAgICAgICAgICAgICAgICAgPSAgNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURURfRkVBVFVSRSAgICAgICAgICAgICAgID0gIDUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRF9TSU1QTEVfVFlQRV9ERUZOICAgICAgICA9ICA1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSAgNTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOTk9UX0RFUklWRV9GSU5BTCAgICAgICAgICAgICAgID0gIDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEQ19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICA9ICA1NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5OT1RfRklORF9SRVNPVVJDRSAgICAgICAgICAgICAgPSAgNTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OREVURVJNSU5JU1RJQ19NT0RFTCAgICAgICAgICAgID0gIDU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUgICAgICAgICA9ICA1ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUklDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgPSAgNjA7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXJyb3JQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlODhhYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvclByaW50ZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK3B1YmxpYyBjbGFzcyBYbWxFcnJvclByaW50ZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KK3sKKyAgICBwcml2YXRlIGJvb2xlYW4gX25vaXN5OworICAgIHByaXZhdGUgVVJJIF9iYXNlVVJJOworCisgICAgcHVibGljIFhtbEVycm9yUHJpbnRlcihib29sZWFuIG5vaXN5LCBVUkkgYmFzZVVSSSkKKyAgICB7CisgICAgICAgIF9ub2lzeSA9IG5vaXN5OworICAgICAgICBfYmFzZVVSSSA9IGJhc2VVUkk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxFcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gKFhtbEVycm9yKW87CisgICAgICAgICAgICBpZiAoZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IgfHwKKyAgICAgICAgICAgICAgICBlcnIuZ2V0U2V2ZXJpdHkoKSA9PSBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HKQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnIudG9TdHJpbmcoX2Jhc2VVUkkpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9ub2lzeSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyLnRvU3RyaW5nKF9iYXNlVVJJKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCisgICAgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvcldhdGNoZXIuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFcnJvcldhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODAyNTkwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbEVycm9yV2F0Y2hlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgWG1sRXJyb3JXYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCit7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF91bmRlcmx5aW5nOworICAgIHByaXZhdGUgWG1sRXJyb3IgX2ZpcnN0RXJyb3I7CisKKyAgICBwdWJsaWMgWG1sRXJyb3JXYXRjaGVyKENvbGxlY3Rpb24gdW5kZXJseWluZykKKyAgICB7CisgICAgICAgIF91bmRlcmx5aW5nID0gdW5kZXJseWluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pCisgICAgeworICAgICAgICBpZiAoX2ZpcnN0RXJyb3IgPT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgWG1sRXJyb3IgJiYgKChYbWxFcnJvcilvKS5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQorICAgICAgICAgICAgX2ZpcnN0RXJyb3IgPSAoWG1sRXJyb3IpbzsKKyAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBfdW5kZXJseWluZy5hZGQobyk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIGlmIChfdW5kZXJseWluZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKKworICAgICAgICByZXR1cm4gX3VuZGVybHlpbmcuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKQorICAgIHsKKyAgICAgICAgaWYgKF91bmRlcmx5aW5nID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByZXR1cm4gX3VuZGVybHlpbmcuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZmlyc3RFcnJvciAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBYbWxFcnJvciBmaXJzdEVycm9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZmlyc3RFcnJvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sRXZlbnRCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3NzFkMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxFdmVudEJhc2UuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uZXZlbnRzLkVsZW1lbnRUeXBlTmFtZXM7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSB0eXBlIHBhcnQgWE1MRXZlbnQuCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEV2ZW50QmFzZSBpbXBsZW1lbnRzIFhNTEV2ZW50Cit7CisgICAgcHVibGljIFhtbEV2ZW50QmFzZSAoICkKKyAgICB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYbWxFdmVudEJhc2UgKCBpbnQgdHlwZSApCisgICAgeworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZSAoIGludCB0eXBlICkKKyAgICB7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRUeXBlICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFzU3RyaW5nICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVsZW1lbnRUeXBlTmFtZXMuZ2V0TmFtZSggX3R5cGUgKTsKKyAgICB9CisgICAgICAgICAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRW50aXR5UmVmZXJlbmNlICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRQcmVmaXhNYXBwaW5nICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlID09IFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZFByZWZpeE1hcHBpbmcgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZVByZWZpeE1hcHBpbmcgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NpbmdJbnN0cnVjdGlvbiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlckRhdGEgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuQ0hBUkFDVEVSX0RBVEE7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzU3BhY2UgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3R5cGUgPT0gWE1MRXZlbnQuU1BBQ0U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnREb2N1bWVudCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmREb2N1bWVudCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZSA9PSBYTUxFdmVudC5FTkRfRE9DVU1FTlQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgX3R5cGU7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sTmFtZUltcGwuamF2YSBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9YbWxOYW1lSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTcwY2MKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sTmFtZUltcGwuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lOworCitwdWJsaWMgY2xhc3MgWG1sTmFtZUltcGwgaW1wbGVtZW50cyBYTUxOYW1lIHsKKworICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVcmk9bnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lPW51bGw7CisgIHByaXZhdGUgU3RyaW5nIHByZWZpeD1udWxsOworICBwcml2YXRlIGludCBoYXNoID0gMDsKKworICBwdWJsaWMgWG1sTmFtZUltcGwgKCkge30KKyAgcHVibGljIFhtbE5hbWVJbXBsIChTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisgIH0KKyAgcHVibGljIFhtbE5hbWVJbXBsIChTdHJpbmcgbmFtZXNwYWNlVXJpLFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICBzZXROYW1lc3BhY2VVcmkobmFtZXNwYWNlVXJpKTsKKyAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKyAgfQorICBwdWJsaWMgWG1sTmFtZUltcGwgKFN0cmluZyBuYW1lc3BhY2VVcmksCisgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCkgeworICAgIHNldE5hbWVzcGFjZVVyaShuYW1lc3BhY2VVcmkpOworICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVcmkoKSB7IHJldHVybiBuYW1lc3BhY2VVcmk7IH0KKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7IHJldHVybiBsb2NhbE5hbWU7IH0KKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7IHJldHVybiBwcmVmaXg7IH0KKworICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVcmkoU3RyaW5nIG5hbWVzcGFjZVVyaSkgeworICAgIGhhc2ggPSAwOworICAgIGlmIChuYW1lc3BhY2VVcmkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVcmkuZXF1YWxzKCIiKSkgcmV0dXJuOworICAgIHRoaXMubmFtZXNwYWNlVXJpID0gbmFtZXNwYWNlVXJpOyAKKyAgfQorICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgeyAKKyAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsgCisgICAgaGFzaCA9IDA7CisgIH0KKyAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsgdGhpcy5wcmVmaXggPSBwcmVmaXg7IH0KKworICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCisgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb2NhbE5hbWU7CisgIH0KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBpZiAoZ2V0TmFtZXNwYWNlVXJpKCkgIT0gbnVsbCkKKyAgICAgIHJldHVybiAiWyciK2dldE5hbWVzcGFjZVVyaSgpKyInXToiK2dldFF1YWxpZmllZE5hbWUoKTsKKyAgICBlbHNlIAorICAgICAgcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CisgICAgaW50IHRtcF9oYXNoID0gaGFzaDsKKyAgICBpZiAodG1wX2hhc2ggPT0gMCkgeworICAgICAgdG1wX2hhc2ggPSAxNzsKKyAgICAgIGlmIChuYW1lc3BhY2VVcmkgIT0gbnVsbCkgeworCXRtcF9oYXNoID0gMzcqdG1wX2hhc2ggKyBuYW1lc3BhY2VVcmkuaGFzaENvZGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCkgeworCXRtcF9oYXNoID0gMzcqdG1wX2hhc2ggKyBsb2NhbE5hbWUuaGFzaENvZGUoKTsKKyAgICAgIH0KKyAgICAgIGhhc2ggPSB0bXBfaGFzaDsKKyAgICB9CisgICAgcmV0dXJuIHRtcF9oYXNoOworICB9CisKKyAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOworCisgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhNTE5hbWUpIHsKKyAgICAgIGZpbmFsIFhNTE5hbWUgbmFtZT0gKFhNTE5hbWUpIG9iajsKKworICAgICAgZmluYWwgU3RyaW5nIGxuYW1lID0gbG9jYWxOYW1lOworICAgICAgaWYgKCEobG5hbWU9PW51bGwgPyBuYW1lLmdldExvY2FsTmFtZSgpPT1udWxsIDogCisJICAgIGxuYW1lLmVxdWFscyhuYW1lLmdldExvY2FsTmFtZSgpKSkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gbmFtZXNwYWNlVXJpOworICAgICAgcmV0dXJuICh1cmk9PW51bGwgPyBuYW1lLmdldE5hbWVzcGFjZVVyaSgpPT1udWxsIDoKKwkgICAgICB1cmkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCkpKTsKKwkKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKworCit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sT2JqZWN0TGlzdC5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE9iamVjdExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE2ZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbE9iamVjdExpc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CisKKy8qKgorICogQSBjbGFzcyB0byBob2xkIGFuZCBjb21wYXJlIGEgbGlzdCBvZiBYbWxPYmplY3RzIGZvciB1c2UgYnkga2V5cworICoga2V5cmVmcyBkdXJpbmcgdmFsaWRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFhtbE9iamVjdExpc3QKK3sKKyAgICBwcml2YXRlIGZpbmFsIFhtbE9iamVjdFtdIF9vYmplY3RzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGVtcHR5IG9iamVjdCBsaXN0IG9mIHRoZSBnaXZlbiBmaXhlZCBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBYbWxPYmplY3RMaXN0KGludCBvYmplY3RDb3VudCkgeworICAgICAgICBfb2JqZWN0cyA9IG5ldyBYbWxPYmplY3Rbb2JqZWN0Q291bnRdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBvYmplY3QgYnkgaW5kZXggdW5sZXNzIGEgdmFsdWUgaGFzIGJlZW4gcHJldmlvdXNseQorICAgICAqIHNldCBhdCB0aGF0IGxvY2F0aW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIHNldCwgZmFsc2UgaWYgdGhlIHZhbHVlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXQoWG1sT2JqZWN0IG8sIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGlmIChfb2JqZWN0c1tpbmRleF0gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBfb2JqZWN0c1tpbmRleF0gPSBvOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGFsbCB2YWx1ZXMgaGF2ZSBiZWVuIHNldC4gTmVlZGVkIGZvciBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbGxlZCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBhbGwgdmFsdWVzIGhhdmUgYmVlbiBzZXQuIE5lZWRlZCBmb3Iga2V5cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVuZmlsbGVkKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IF9vYmplY3RzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgIGlmIChfb2JqZWN0c1tpXSA9PSBudWxsKSByZXR1cm4gaTsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKCBvIGluc3RhbmNlb2YgWG1sT2JqZWN0TGlzdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgWG1sT2JqZWN0TGlzdCBvdGhlciA9IChYbWxPYmplY3RMaXN0KW87CisKKyAgICAgICAgaWYgKG90aGVyLl9vYmplY3RzLmxlbmd0aCAhPSB0aGlzLl9vYmplY3RzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBtaXNzaW5nIHZhbHVlcworICAgICAgICAgICAgaWYgKF9vYmplY3RzW2ldID09IG51bGwgfHwgb3RoZXIuX29iamVjdHNbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmICghIF9vYmplY3RzW2ldLnZhbHVlRXF1YWxzKG90aGVyLl9vYmplY3RzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIGludCBoID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBfb2JqZWN0cy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICBpZiAoX29iamVjdHNbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBoID0gMzEgKiBoICsgX29iamVjdHNbaV0udmFsdWVIYXNoQ29kZSgpOworCisgICAgICAgIHJldHVybiBoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldHR5dHJpbShTdHJpbmcgcykKKyAgICB7CisgICAgICAgIGludCBlbmQ7CisgICAgICAgIGZvciAoZW5kID0gcy5sZW5ndGgoKTsgZW5kID4gMDsgZW5kIC09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGVuZCAtIDEpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3RhcnQ7CisgICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoc3RhcnQpKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX29iamVjdHMubGVuZ3RoIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSBiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgYi5hcHBlbmQocHJldHR5dHJpbSgoKFNpbXBsZVZhbHVlKV9vYmplY3RzW2ldKS5zdHJpbmdWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vWG1sV2hpdGVzcGFjZS5qYXZhIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbFdoaXRlc3BhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JkNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbW1vbi9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29tbW9uL1htbFdoaXRlc3BhY2UuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworcHVibGljIGNsYXNzIFhtbFdoaXRlc3BhY2UKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19VTlNQRUNJRklFRCA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfUFJFU0VSVkUgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1JFUExBQ0UgPSBTY2hlbWFUeXBlLldTX1JFUExBQ0U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfQ09MTEFQU0UgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOworCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShjaGFyIGNoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjaCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FsbFNwYWNlKFN0cmluZyB2KQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTcGFjZSh2LmNoYXJBdChpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlKFN0cmluZyB2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbGxhcHNlKHYsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbGdvcml0aG0gdXNlZCBieSBhcHBseV93c2Nhbm9uOiBzb21ldGltZXMgdXNlZCBpbiBpbXBscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xsYXBzZShTdHJpbmcgdiwgaW50IHdzcikKKyAgICB7CisgICAgICAgIGlmICh3c3IgPT0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRSB8fCB3c3IgPT0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgIHJldHVybiB2OworCisgICAgICAgIGlmICh2LmluZGV4T2YoJ1xuJykgPj0gMCkKKyAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xuJywgJyAnKTsKKyAgICAgICAgaWYgKHYuaW5kZXhPZignXHQnKSA+PSAwKQorICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXHQnLCAnICcpOworICAgICAgICBpZiAodi5pbmRleE9mKCdccicpID49IDApCisgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdccicsICcgJyk7CisKKyAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1JFUExBQ0UpCisgICAgICAgICAgICByZXR1cm4gdjsKKworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGludCBsZW4gPSB2Lmxlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICByZXR1cm4gdjsKKworICAgICAgICBpbnQgaTsKKworICAgICAgICAvKiBhIHRyaWNrOiBleGFtaW5lIGV2ZXJ5IG90aGVyIGNoYXJhY3RlciBsb29raW5nIGZvciBwYWlycyBvZiBzcGFjZXMgKi8KKyAgICAgICAgaWYgKHYuY2hhckF0KDApICE9ICcgJykKKyAgICAgICAgeworICAgICAgICAgICAgZXhhbWluZTogeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDI7IGogPCBsZW47IGogKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSA9PSAnICcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5jaGFyQXQoaikgPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBqIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCB3cyB0byBiZSByZW1vdmVkLCBvciBwYXN0IGVuZCAqLworICAgICAgICAgICAgaSA9IGo7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGogaXMgcG9pbnRpbmcgYXQgdGhlIGxhc3Qgd2hpdGVzcGFjZSBpbiB0aGUgaW5pdGlhbCBydW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2hpbGUgKGogKyAxIDwgdi5sZW5ndGgoKSAmJiB2LmNoYXJBdChqICsgMSkgPT0gJyAnKQorICAgICAgICAgICAgICAgIGogKz0gMTsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOworCisgICAgICAgIHNoaWZ0ZXI6IGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaiB3YXMgd3Mgb3IgcGFzdCBlbmQgKi8KKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgaWYgKGogPj0gbGVuKQorICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOworICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqKSAhPSAnICcpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBqIHdhcyBub253cyAqLworICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOworICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2hpZnRlcjsKKyAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hbaSsrXSA9IGNoW2orK107CisgICAgICAgICAgICAgICAgICAgIGlmIChqID49IGxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaFtqXSA9PSAnICcpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaCwgMCwgKGkgPT0gMCB8fCBjaFtpIC0gMV0gIT0gJyAnKSA/IGkgOiBpIC0gMSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vcmVhZG1lLnR4dCBiL3YxL3NyYy9jb21tb24vb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbW1vbi9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjUxNDMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvY29tbW9uL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb21tb24vcmVhZG1lLnR4dApAQCAtMCwwICsxLDUgQEAKK1RoZXJlIGFyZSBpc29sYXRlZCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0YWtlbiBmcm9tIHRoZSBBcGFjaGUKK1hlcmNlcy1KIDIuMCBwcm9qZWN0CisKK0l0IGNvbnRhaW5zIHZlcnkgbWlub3IgbW9kaWZpY2F0aW9ucyBpbmNsdWRpbmcgYSBjaGFuZ2UgaW4gbmFtZXNwYWNlLgorCmRpZmYgLS1naXQgYS92MS9zcmMvY29uZmlnc2NoZW1hL3NjaGVtYS94bWxjb25maWcueHNkIGIvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTk5MTMxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2NvbmZpZ3NjaGVtYS9zY2hlbWEveG1sY29uZmlnLnhzZApAQCAtMCwwICsxLDI1OCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICB4bWxuczp4Yj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIgorICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94YmVhbi9jb25maWciCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi8+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iY29uZmlnIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGNvbmZpZyBlbGVtZW50IGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBmb3IgYW4gLnhzZGNvbmZpZyBmaWxlLgorICAgICAgICAgSXQgY29udGFpbnMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGd1aWRlcyB0aGUgeHNkIGNvbXBpbGVyCisgICAgICAgICB3aGVuIGl0IGdlbmVyYXRlcyBKYXZhIGNsYXNzZXMuIFlvdSBjYW4gc3BlY2lmeSBwYWNrYWdlIG5hbWVzIHRvCisgICAgICAgICBiZSB1c2VkIGZvciB3aG9sZSB4bWwgbmFtZXNwYWNlczsgeW91IGNhbiBzcGVjaWZ5IGNsYXNzIG5hbWVzCisgICAgICAgICB0byB1c2UgZm9yIGluZGl2aWR1YWwgc2NoZW1hIHR5cGVzOyBhbmQgeW91IGNhbiBzdXBwbHkgZXh0ZW5zaW9uCisgICAgICAgICBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbnMgdG8gYmUgZXh0ZW5kZWQgYnkgdGhlIGdlbmVyYXRlZAorICAgICAgICAgSmF2YSBjbGFzc2VzLgorICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCisgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieGI6bnNjb25maWciPgorICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgIFNwZWNpZmllcyBjb25maWd1cmF0aW9uIGZvciBhIG5hbWVzcGFjZS4KKyAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgIDwveHM6ZWxlbWVudD4KKworICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieGI6cW5hbWVjb25maWciPgorICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgIFNwZWNpZmllcyBqYXZhIG1hcHBpbmcgZm9yIGEgcW5hbWUuCisgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICA8L3hzOmVsZW1lbnQ+CisKKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4YjpleHRlbnNpb25jb25maWciPgorICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBleHRlbnNpb25zIGZvciB0aGUgZ2VuZXJhdGVkIHR5cGVzIGluIHRoZSAnZm9yJyBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICA8L3hzOmVsZW1lbnQ+CisKKyAgICAgIDwveHM6Y2hvaWNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibnNjb25maWciPgorCisgICAgPHhzOnNlcXVlbmNlPgorCisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCI+CisgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgVGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIGZvciB0eXBlcyBnZW5lcmF0ZWQgaW4gdGhpcworICAgICAgICAgICAgbmFtZXNwYWNlLgorICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPC94czplbGVtZW50PgorCisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICBBIHByZWZpeCB0byBiZSB1c2VkIHRvIHByZXBlbmQgdG8gdG9wLWxldmVsIEphdmEgdHlwZSBuYW1lcworICAgICAgICAgICAgZ2VuZXJhdGVkIGluIHRoaXMgbmFtZXNwYWNlLiAgKFRoZSBwcmVmaXggaXMgbm90IHVzZWQgZm9yCisgICAgICAgICAgICBpbm5lciBKYXZhIHR5cGUgZGVmaW5pdGlvbnMuKQorICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPC94czplbGVtZW50PgorCisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdWZmaXgiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICBBIHN1ZmZpeCB0byBiZSB1c2VkIHRvIGFwcGVuZCB0byB0b3AtbGV2ZWwgSmF2YSB0eXBlIG5hbWVzCisgICAgICAgICAgICBnZW5lcmF0ZWQgaW4gdGhpcyBuYW1lc3BhY2UuIChUaGUgc3VmZml4IGlzIG5vdCB1c2VkIGZvcgorICAgICAgICAgICAgaW5uZXIgSmF2YSB0eXBlIGRlZmluaXRpb25zLikKKyAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgIDwveHM6ZWxlbWVudD4KKworICAgIDwveHM6c2VxdWVuY2U+CisKKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ieGI6bmFtZXNwYWNlTGlzdCI+CisgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgQSBsaXN0IG9mIGFueSBudW1iZXIgb2YgbmFtZXNwYWNlIFVSSXMgb3IgIyNsb2NhbCBmb3IgdGhlIG5vLW5hbWVzcGFjZSwKKyAgICAgICAgICBvciAjI2FueSBmb3IgYWxsIG5hbWVzcGFjZXMuCisgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKworICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXJpcHJlZml4IiB0eXBlPSJ4YjpuYW1lc3BhY2VQcmVmaXhMaXN0Ij4KKyAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICBBIGxpc3Qgb2YgYW55IG51bWJlciBvZiBuYW1lc3BhY2UgVVJJcy4KKyAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgPC94czphbm5vdGF0aW9uPgorICAgIDwveHM6YXR0cmlidXRlPgorCisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lY29uZmlnIj4KKyAgICA8eHM6c2VxdWVuY2UvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6UU5hbWUiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmFuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VQcmVmaXhMaXN0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICBBIGxpc3Qgb2YgbmFtZXNwYWNlIFVSSXMuCisgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czphbnlVUkkiIC8+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgIEEgbGlzdCBvZiBuYW1lc3BhY2UgVVJJcywgd2l0aCAjI2xvY2FsIGZvciBuby11cmk7IG9yICMjYW55IGZvciBhbGwgVVJJcy4KKyAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6dW5pb24+CisgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjYW55Ii8+CisgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOmxpc3Q+CisgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgIDx4czp1bmlvbiBtZW1iZXJUeXBlcz0ieHM6YW55VVJJIj4KKyAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iIyNsb2NhbCIvPgorICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHM6dW5pb24+CisgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgPC94czpsaXN0PgorICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czp1bmlvbj4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKworICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvbmNvbmZpZyI+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KKyAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSAoaXQgaGFzIHRvIGJlIG9uIHRoZSBjbGFzc3BhdGgpLgorICAgICAgICAgICAgICAgICAgICAgQWxsIHRoZSBnZW5lcmF0ZWQgdHlwZXMgaW4gdGhpcyBkb21haW4gd2lsbCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbHMgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZSBoYW5kbGVyLgorICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlPgorICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0YXRpY0hhbmRsZXIiIHR5cGU9InhzOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgY2xhc3MgZm9yIHRoaXMgZXh0ZW5zaW9uIGludGVyZmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaGFuZGxlciBtdXN0IGNvbnRhaW4gcHVibGljIHN0YXRpYyBtZXRob2RzIGZvciBlYWNoIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBpbnRlcmZhY2UsIGFuZCB0aGV5IGhhdmUgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWV0aG9kIGluIHRoZSBleHRlbnNpb24gaW50ZXJmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vKFN0cmluZyBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbWV0aG9kIGluIHRoZSBoYW5kbGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbyhYbWxPYmplY3QgeG8sIFN0cmluZyBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICA8IS0teHM6ZWxlbWVudCBuYW1lPSJpbXBsZW1lbnRhdGlvbkNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8tLT4KKyAgICAgICAgICAgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIG5hbWUgKGl0IGhhcyB0byBiZSBvbiB0aGUgY2xhc3NwYXRoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcmVQb3N0U2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgPgorICAgICAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgIHByZVNldCBhbmQgcG9zdFNldCBjYWxscyB3aWxsIGdldCBnZW5lcmF0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuIChPbmx5IGZvciBzZXR0ZXIgbWV0aG9kcykuCisgICAgICAgICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0YXRpY0hhbmRsZXIiIHR5cGU9InhzOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgY2xhc3MgZm9yIHByZVNldCBhbmQgcG9zdFNldCBtZXRob2RzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBoYW5kbGVyIG11c3QgY29udGFpbiB0aGUgZm9sbG93aW5nIHB1YmxpYyBzdGF0aWMgbWV0aG9kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlU2V0KGludCBvcFR5cGUsIFhtbE9iamVjdCB4bywgUU5hbWUgcHJvcCwgYm9vbGVhbiBpc0F0dHIsIGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSB0byBleGVjdXRlIHN0b3JlIGltcGxlbWVudGF0aW9uIGNvZGUsIGZhbHNlIHRvIHNraXAgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9zdFNldChpbnQgb3BUeXBlLCBYbWxPYmplY3QgeG8sIFFOYW1lIHByb3AsIGJvb2xlYW4gaXNBdHRyLCBpbnQgaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvciIgdHlwZT0ieGI6amF2YU5hbWVMaXN0Ij4KKyAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgJyonIG9yIGEgbGlzdCBvZiBnZW5lcmF0ZWQgamF2YSB0eXBlcyAoaW50ZXJmYWNlcykgdGhhdCByZXByZXplbnRzIHRoaXMgZXh0ZW5zaW9uIGRvbWFpbi4KKyAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJqYXZhTmFtZUxpc3QiPgorICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBnZW5lcmF0ZWQgamF2YSBpbnRlcmZhY2UgbmFtZXMgb3IgJyonIGZvciBhbGwgaW50ZXJmYWNlcy4KKyAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6dW5pb24+CisgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IioiIC8+CisgICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4YjpqYXZhTmFtZSIgLz4KKyAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPC94czp1bmlvbj4KKyAgICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJqYXZhTmFtZSI+CisgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiIgLz4KKyAgICA8L3hzOnNpbXBsZVR5cGU+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL2xpY2Vuc2UvTElDRU5TRS50eHQgYi92MS9zcmMvbGljZW5zZS9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZWNjY2MwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL2xpY2Vuc2UvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyMTMgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBRERJVElPTkFMIExJQ0VOU0VTIENPVkVSSU5HIFBBUlRTIE9GIFRISVMgRElTVFJJQlVUSU9OOgorCitUaGlzIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBXM0MgWE1MIFNjaGVtYSBkb2N1bWVudHMgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMKK1dvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0uICBUaGVzZSBzY2hlbWFzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgVzNDCitTb2Z0d2FyZSBMaWNlbnNlLCB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNjaGVtYXMuCitUaGUgbGljZW5zZSBjYW4gYWxzbyBiZSBmb3VuZCBhdDoKK2h0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEuCisKZGlmZiAtLWdpdCBhL3YxL3NyYy9saWNlbnNlL05PVElDRS50eHQgYi92MS9zcmMvbGljZW5zZS9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTc4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvbGljZW5zZS9OT1RJQ0UudHh0CkBAIC0wLDAgKzEsMjIgQEAKK1RoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CitpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKK29yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQkVBIFN5c3RlbXMgCitJbmMuLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKworQXNpZGUgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZSBBcGFjaGUgWE1MQmVhbnMgcHJvamVjdCwgdGhpcyAKK3NvZnR3YXJlIGFsc28gaW5jbHVkZXM6CisKKy0gb25lIG9yIG1vcmUgc291cmNlIGZpbGVzIGZyb20gdGhlIEFwYWNoZSBYZXJjZXMtSiBhbmQgQXBhY2hlIAorQXhpcyBwcm9kdWN0cywgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworLSBqYXhlbiwgQ29weXJpZ2h0IDIwMDMgKGMpIFRoZSBXZXJrZW4gQ29tcGFueS4KKworLSBXM0MgWE1MIFNjaGVtYSBkb2N1bWVudHMgQ29weXJpZ2h0IDIwMDEtMjAwMyAoYykgV29ybGQgV2lkZSAKK1dlYiBDb25zb3J0aXVtICAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgRXVyb3BlYW4gCitSZXNlYXJjaCBDb25zb3J0aXVtICBmb3IgSW5mb3JtYXRpY3MgYW5kIE1hdGhlbWF0aWNzLCBLZWlvIAorVW5pdmVyc2l0eSkKKworU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCithc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvRWRpdEJ1aWxkU2NyaXB0LmphdmEgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9FZGl0QnVpbGRTY3JpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYxNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvRWRpdEJ1aWxkU2NyaXB0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgcmVwYWNrYWdlOworCitpbXBvcnQgamF2YS5pby4qOworCitwdWJsaWMgY2xhc3MgRWRpdEJ1aWxkU2NyaXB0Cit7CisgICAgLy8KKyAgICAvLyB1c2dhZTogZWRpdCBidWlsZGZpbGUgdG9rZW4gbmV3LXZhbHVlCisgICAgLy8KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiICk7CisKKyAgICAgICAgYXJnc1sgMCBdID0gYXJnc1sgMCBdLnJlcGxhY2UoICcvJywgRmlsZS5zZXBhcmF0b3JDaGFyICk7CisKKyAgICAgICAgRmlsZSBidWlsZEZpbGUgPSBuZXcgRmlsZSggYXJnc1sgMCBdICk7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gcmVhZEZpbGUoIGJ1aWxkRmlsZSApOworCisgICAgICAgIFN0cmluZyB0b2tlblN0ciA9ICI8cHJvcGVydHkgbmFtZT1cIiIgKyBhcmdzWyAxIF0gKyAiXCIgdmFsdWU9XCIiOworICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpbnQgaSA9IHNiLmluZGV4T2YoIHRva2VuU3RyICk7CisKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbid0IGZpbmQgdG9rZW46ICIgKyB0b2tlblN0ciApOworCisgICAgICAgIGludCBqID0gaSArIHRva2VuU3RyLmxlbmd0aCgpOworCisgICAgICAgIHdoaWxlICggc2IuY2hhckF0KCBqICkgIT0gJyInICkKKyAgICAgICAgICAgIGorKzsKKworICAgICAgICBzYi5yZXBsYWNlKCBpICsgdG9rZW5TdHIubGVuZ3RoKCksIGosIGFyZ3NbIDIgXSApOworCisgICAgICAgIHdyaXRlRmlsZSggYnVpbGRGaWxlLCBzYiApOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgU3RyaW5nQnVmZmVyIHJlYWRGaWxlICggRmlsZSBmICkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGYgKTsKKyAgICAgICAgUmVhZGVyIHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluICk7CisgICAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCisgICAgICAgIGNvcHkoIHIsIHcgKTsKKworICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gdy5nZXRCdWZmZXIoKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHZvaWQgd3JpdGVGaWxlICggRmlsZSBmLCBTdHJpbmdCdWZmZXIgY2hhcnMgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZiApOworICAgICAgICBXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG91dCApOworICAgICAgICBSZWFkZXIgciA9IG5ldyBTdHJpbmdSZWFkZXIoIGNoYXJzLnRvU3RyaW5nKCkgKTsKKworICAgICAgICBjb3B5KCByLCB3ICk7CisKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB3LmNsb3NlKCk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgdm9pZCBjb3B5ICggUmVhZGVyIHIsIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXIgWyAxMDI0ICogMTYgXTsKKworICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IHIucmVhZCggYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoICk7CisKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgdy53cml0ZSggYnVmZmVyLCAwLCBuICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YSBiL3YxL3NyYy9yZXBhY2thZ2UvcmVwYWNrYWdlL1JlcGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTVlNWQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2UuamF2YQpAQCAtMCwwICsxLDM4MyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgcmVwYWNrYWdlOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOworCitwdWJsaWMgY2xhc3MgUmVwYWNrYWdlCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbmV3IFJlcGFja2FnZSgpLnJlcGFja2FnZSggYXJncyApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2UgKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIgfHwgIWFyZ3NbMF0uZXF1YWxzKCAiLXJlcGFja2FnZSIgKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVXNhZ2U6IHJlcGFja2FnZSAtcmVwYWNrYWdlIFtzcGVjXSIgKTsKKyAgICAgICAgCisgICAgICAgIF9yZXBhY2thZ2VyID0gbmV3IFJlcGFja2FnZXIoIGFyZ3NbIDEgXSApOworCisgICAgICAgIF9mcm9tUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRGcm9tUGFja2FnZXMoKTsKKyAgICAgICAgX3RvUGFja2FnZXMgPSBfcmVwYWNrYWdlci5nZXRUb1BhY2thZ2VzKCk7CisgICAgICAgIAorICAgICAgICBfcGFja2FnZVBhdHRlcm4gPQorICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCAiXlxccypwYWNrYWdlXFxzKygoPzpcXHd8XFwuKSopXFxzKjsiLCBQYXR0ZXJuLk1VTFRJTElORSApOworICAgICAgICAKKyAgICAgICAgX21vdmVBbG9uZ0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBfbW92ZWREaXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgCisgICAgICAgIEZpbGUgY3VycmVudERpciAgID0gbmV3IEZpbGUoICIuIiApOworICAgICAgICBGaWxlIGJ1aWxkRGlyICAgICA9IG5ldyBGaWxlKCBjdXJyZW50RGlyLCAiYnVpbGQiICk7CisgICAgICAgIEZpbGUgcmVwYWNrYWdlRGlyID0gbmV3IEZpbGUoIGJ1aWxkRGlyLCAicmVwYWNrYWdlIiApOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkRlbGV0aW5nIHJlcGFja2FnZSBkaXIgLi4uIiApOworICAgICAgICAKKyAgICAgICAgcmVjdXJzaXZlRGVsZXRlKCByZXBhY2thZ2VEaXIgKTsKKworICAgICAgICByZXBhY2thZ2VEaXIubWtkaXJzKCk7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgZmlsbEZpbGVzKCBmaWxlcywgY3VycmVudERpciApOworICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUmVwYWNrYWdpbmcgIiArIGZpbGVzLnNpemUoKSArICIgZmlsZXMgLi4uIiApOworCisgICAgICAgIGludCBwcmVmaXhMZW5ndGggPSBjdXJyZW50RGlyLmdldENhbm9uaWNhbFBhdGgoKS5sZW5ndGgoKTsKKworICAgICAgICBfc291cmNlQmFzZSA9IGN1cnJlbnREaXI7CisgICAgICAgIF90YXJnZXRCYXNlID0gcmVwYWNrYWdlRGlyOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBmaWxlcy5zaXplKCkgOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZyb20gPSAoRmlsZSkgZmlsZXMuZ2V0KCBpICk7CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZnJvbS5nZXRDYW5vbmljYWxQYXRoKCkuc3Vic3RyaW5nKCBwcmVmaXhMZW5ndGggKyAxICk7CisKKyAgICAgICAgICAgIHJlcGFja2FnZUZpbGUoIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluaXNoTW92aW5nRmlsZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBhY2thZ2VGaWxlICggU3RyaW5nIG5hbWUgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCAiLmphdmEiICkpCisgICAgICAgICAgICByZXBhY2thZ2VKYXZhRmlsZSggbmFtZSApOworICAgICAgICBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCAiLnhzZGNvbmZpZyIgKSkKKyAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lICk7CisgICAgICAgIGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCggImJpbiIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKSkKKyAgICAgICAgICAgIHJlcGFja2FnZU5vbkphdmFGaWxlKCBuYW1lICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1vdmVBbG9uZ1dpdGhKYXZhRmlsZXMoIG5hbWUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3ZlQWxvbmdXaXRoSmF2YUZpbGVzKCBTdHJpbmcgbmFtZSApCisgICAgeworICAgICAgICBfbW92ZUFsb25nRmlsZXMuYWRkKG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hNb3ZpbmdGaWxlcyAoICkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gX21vdmVBbG9uZ0ZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG9OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHNyY0RpciA9IFJlcGFja2FnZXIuZGlyRm9yUGF0aCggbmFtZSApOworICAgICAgICAgICAgU3RyaW5nIHRvRGlyID0gKFN0cmluZykgX21vdmVkRGlycy5nZXQoIHNyY0RpciApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodG9EaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0b05hbWUgPSBuZXcgRmlsZSggdG9EaXIsIG5ldyBGaWxlKCBuYW1lICkuZ2V0TmFtZSgpICkudG9TdHJpbmcoKTsgCisKKyAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCAiLmh0bWwiICkpCisgICAgICAgICAgICAgICAgcmVwYWNrYWdlTm9uSmF2YUZpbGUoIG5hbWUsIHRvTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvcHlGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSwgbmV3IEZpbGUoIF90YXJnZXRCYXNlLCB0b05hbWUgKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlTm9uSmF2YUZpbGUgKCBTdHJpbmcgbmFtZSApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gcmVhZEZpbGUoIG5ldyBGaWxlKCBfc291cmNlQmFzZSwgbmFtZSApICk7CisKKyAgICAgICAgX3JlcGFja2FnZXIucmVwYWNrYWdlKCBzYiApOworICAgICAgICAKKyAgICAgICAgd3JpdGVGaWxlKCBuZXcgRmlsZSggX3RhcmdldEJhc2UsIG5hbWUgKSwgc2IgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlTm9uSmF2YUZpbGUgKCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIHNvdXJjZU5hbWUgKSApOworCisgICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKKyAgICAgICAgCisgICAgICAgIHdyaXRlRmlsZSggbmV3IEZpbGUoIF90YXJnZXRCYXNlLCB0YXJnZXROYW1lICksIHNiICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlcGFja2FnZUphdmFGaWxlICggU3RyaW5nIG5hbWUgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IHJlYWRGaWxlKCBuZXcgRmlsZSggX3NvdXJjZUJhc2UsIG5hbWUgKSApOworCisgICAgICAgIE1hdGNoZXIgcGFja2FnZU1hdGNoZXIgPSBfcGFja2FnZVBhdHRlcm4ubWF0Y2hlciggc2IgKTsKKworICAgICAgICBpZiAocGFja2FnZU1hdGNoZXIuZmluZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGtnID0gcGFja2FnZU1hdGNoZXIuZ3JvdXAoIDEgKTsKKyAgICAgICAgICAgIGludCBwa2dTdGFydCA9IHBhY2thZ2VNYXRjaGVyLnN0YXJ0KCAxICk7CisgICAgICAgICAgICBpbnQgcGtnRW5kID0gcGFja2FnZU1hdGNoZXIuZW5kKCAxICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTWF0Y2hlci5maW5kKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJUd28gcGFja2FnZSBzcGVjaWZpY2F0aW9ucyBmb3VuZDogIiArIG5hbWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTGlzdCBmaWxlUGF0aCA9IFJlcGFja2FnZXIuc3BsaXRQYXRoKCBuYW1lLCBGaWxlLnNlcGFyYXRvckNoYXIgKTsKKyAgICAgICAgICAgIFN0cmluZyBzcmNEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gU29ydCB0aGUgcmVwYWNrYWdlIHNwZWMgc28gdGhhdCBsb25nZXIgZnJvbSdzIGFyZSBmaXJzdCB0byBtYXRjaAorICAgICAgICAgICAgLy8gbG9uZ2VzdCBwYWNrYWdlIGZpcnN0CisKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzd2FwcGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgZmlsZVBhdGguc2l6ZSgpIDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMSA9IChTdHJpbmcpIGZpbGVQYXRoLmdldCggaSAtIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwZWMyID0gKFN0cmluZykgZmlsZVBhdGguZ2V0KCBpICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWMxLmluZGV4T2YoICc6JyApIDwgc3BlYzIuaW5kZXhPZiggJzonICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLnNldCggaSAtIDEsIHNwZWMyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5zZXQoIGksIHNwZWMxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFzd2FwcGVkKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdCBwa2dQYXRoID0gUmVwYWNrYWdlci5zcGxpdFBhdGgoIHBrZywgJy4nICk7CisKKyAgICAgICAgICAgIGludCBmID0gZmlsZVBhdGguc2l6ZSgpIC0gMjsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSBwa2dQYXRoLnNpemUoKSAtIDEgOyBpID49IDAgOyBpLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghcGtnUGF0aC5nZXQoIGkgKS5lcXVhbHMoIGZpbGVQYXRoLmdldCggZi0tICkgKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJQYWNrYWdlIHNwZWMgZGlmZmVycyBmcm9tIGZpbGUgcGF0aDogIiArIG5hbWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdCBjaGFuZ2VUbyA9IG51bGw7CisgICAgICAgICAgICBMaXN0IGNoYW5nZUZyb20gPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICBmcm9tOgorICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9mcm9tUGFja2FnZXMuc2l6ZSgpIDsgaSArKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdCBmcm9tID0gKExpc3QpIF9mcm9tUGFja2FnZXMuZ2V0KCBpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJvbS5zaXplKCkgPD0gcGtnUGF0aC5zaXplKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZnJvbS5zaXplKCkgOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmcm9tLmdldCggaiApLmVxdWFscyggcGtnUGF0aC5nZXQoIGogKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgZnJvbTsKKworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VGcm9tID0gZnJvbTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSAoTGlzdCkgX3RvUGFja2FnZXMuZ2V0KCBpICk7CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hhbmdlVG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV3UGtnID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAiIjsKKworICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBjaGFuZ2VUby5zaXplKCkgOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQa2cgKz0gIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBGaWxlLnNlcGFyYXRvckNoYXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5ld1BrZyArPSBjaGFuZ2VUby5nZXQoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSArPSBjaGFuZ2VUby5nZXQoIGkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBmaWxlUGF0aC5zaXplKCkgLSBwa2dQYXRoLnNpemUoKSAtIDIgOyBpID49IDAgOyBpLS0gKQorICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gKFN0cmluZykgZmlsZVBhdGguZ2V0KCBpICkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBuZXdOYW1lOworCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSBjaGFuZ2VGcm9tLnNpemUoKSA7IGkgPCBwa2dQYXRoLnNpemUoKSA7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdOYW1lICs9IEZpbGUuc2VwYXJhdG9yQ2hhciArIChTdHJpbmcpIHBrZ1BhdGguZ2V0KCBpICk7CisgICAgICAgICAgICAgICAgICAgIG5ld1BrZyArPSAnLicgKyAoU3RyaW5nKSBwa2dQYXRoLmdldCggaSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5ld05hbWUgKz0gRmlsZS5zZXBhcmF0b3JDaGFyICsgKFN0cmluZykgZmlsZVBhdGguZ2V0KCBmaWxlUGF0aC5zaXplKCkgLSAxICk7CisKKyAgICAgICAgICAgICAgICBzYi5yZXBsYWNlKCBwa2dTdGFydCwgcGtnRW5kLCBuZXdQa2cgKTsKKworICAgICAgICAgICAgICAgIG5hbWUgPSBuZXdOYW1lOworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdEaXIgPSBSZXBhY2thZ2VyLmRpckZvclBhdGgoIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIXNyY0Rpci5lcXVhbHMobmV3RGlyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9tb3ZlZERpcnMucHV0KHNyY0RpciwgbmV3RGlyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfcmVwYWNrYWdlci5yZXBhY2thZ2UoIHNiICk7CisgICAgICAgIAorICAgICAgICB3cml0ZUZpbGUoIG5ldyBGaWxlKCBfdGFyZ2V0QmFzZSwgbmFtZSApLCBzYiApOworICAgIH0KKworICAgIHZvaWQgd3JpdGVGaWxlICggRmlsZSBmLCBTdHJpbmdCdWZmZXIgY2hhcnMgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAKKyAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmICk7CisgICAgICAgIFdyaXRlciB3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggb3V0ICk7CisgICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlciggY2hhcnMudG9TdHJpbmcoKSApOworCisgICAgICAgIGNvcHkoIHIsIHcgKTsKKworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIHcuY2xvc2UoKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIFN0cmluZ0J1ZmZlciByZWFkRmlsZSAoIEZpbGUgZiApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmICk7CisgICAgICAgIFJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpbiApOworICAgICAgICBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICBjb3B5KCByLCB3ICk7CisKKyAgICAgICAgdy5jbG9zZSgpOworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIHcuZ2V0QnVmZmVyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlICggRmlsZSBmcm9tLCBGaWxlIHRvICkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0by5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgIAorICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBmcm9tICk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIHRvICk7CisKKyAgICAgICAgY29weSggaW4sIG91dCApOworICAgICAgICAKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNvcHkgKCBJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlIFsgMTAyNCAqIDE2IF07CisKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBpbi5yZWFkKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKTsKKworICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBvdXQud3JpdGUoIGJ1ZmZlciwgMCwgbiApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNvcHkgKCBSZWFkZXIgciwgV3JpdGVyIHcgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhciBbIDEwMjQgKiAxNiBdOworCisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuID0gci5yZWFkKCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggKTsKKworICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB3LndyaXRlKCBidWZmZXIsIDAsIG4gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBmaWxsRmlsZXMgKCBBcnJheUxpc3QgZmlsZXMsIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVzLmFkZCggZmlsZSApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXhjbHVkZSB0aGUgYnVpbGQgZGlyZWN0b3J5CisKKyAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyggImJ1aWxkIiApKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gRXhjbHVkZSBDVlMgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyggIkNWUyIgKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmdbXSBlbnRyaWVzID0gZmlsZS5saXN0KCk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGVudHJpZXMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgIGZpbGxGaWxlcyggZmlsZXMsIG5ldyBGaWxlKCBmaWxlLCBlbnRyaWVzWyBpIF0gKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY3Vyc2l2ZURlbGV0ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSBmaWxlLmxpc3QoKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGVudHJpZXMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgICAgICByZWN1cnNpdmVEZWxldGUoIG5ldyBGaWxlKCBmaWxlLCBlbnRyaWVzWyBpIF0gKSApOworICAgICAgICB9CisKKyAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgX3NvdXJjZUJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIF90YXJnZXRCYXNlOworCisgICAgcHJpdmF0ZSBMaXN0IF9mcm9tUGFja2FnZXM7CisgICAgcHJpdmF0ZSBMaXN0IF90b1BhY2thZ2VzOworICAgIAorICAgIHByaXZhdGUgUGF0dGVybiBfcGFja2FnZVBhdHRlcm47CisKKyAgICBwcml2YXRlIFJlcGFja2FnZXIgX3JlcGFja2FnZXI7CisgICAgCisgICAgcHJpdmF0ZSBNYXAgX21vdmVkRGlyczsKKyAgICBwcml2YXRlIExpc3QgX21vdmVBbG9uZ0ZpbGVzOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhIGIvdjEvc3JjL3JlcGFja2FnZS9yZXBhY2thZ2UvUmVwYWNrYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjNmMWMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvcmVwYWNrYWdlL3JlcGFja2FnZS9SZXBhY2thZ2VyLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHJlcGFja2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgUmVwYWNrYWdlcgoreworICAgIHB1YmxpYyBSZXBhY2thZ2VyICggU3RyaW5nIHJlcGFja2FnZVNwZWNzICkKKyAgICB7CisgICAgICAgIF9mcm9tUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIF90b1BhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAKKyAgICAgICAgTGlzdCByZXBhY2thZ2VzID0gc3BsaXRQYXRoKCByZXBhY2thZ2VTcGVjcywgJzsnICk7CisKKyAgICAgICAgLy8gU29ydCB0aGUgcmVwYWNrYWdlIHNwZWMgc28gdGhhdCBsb25nZXIgZnJvbSdzIGFyZSBmaXJzdCB0byBtYXRjaAorICAgICAgICAvLyBsb25nZXN0IHBhY2thZ2UgZmlyc3QKKyAgICAgICAgCisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc3dhcHBlZCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgcmVwYWNrYWdlcy5zaXplKCkgOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMSA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpIC0gMSApOworICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjMiA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHNwZWMxLmluZGV4T2YoICc6JyApIDwgc3BlYzIuaW5kZXhPZiggJzonICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VzLnNldCggaSAtIDEsIHNwZWMyICk7CisgICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXMuc2V0KCBpLCBzcGVjMSApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3dhcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN3YXBwZWQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgcmVwYWNrYWdlcy5zaXplKCkgOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc3BlYyA9IChTdHJpbmcpIHJlcGFja2FnZXMuZ2V0KCBpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBqID0gc3BlYy5pbmRleE9mKCAnOicgKTsKKworICAgICAgICAgICAgaWYgKGogPCAwIHx8IHNwZWMuaW5kZXhPZiggJzonLCBqICsgMSApID49IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJJbGxlZ2FsIHJlcGFja2FnZSBzcGVjaWZpY2F0aW9uOiAiICsgc3BlYyApOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbSA9IHNwZWMuc3Vic3RyaW5nKCAwLCBqICk7CisgICAgICAgICAgICBTdHJpbmcgdG8gPSBzcGVjLnN1YnN0cmluZyggaiArIDEgKTsKKworICAgICAgICAgICAgX2Zyb21QYWNrYWdlcy5hZGQoIFJlcGFja2FnZXIuc3BsaXRQYXRoKCBmcm9tLCAnLicgKSApOworICAgICAgICAgICAgX3RvUGFja2FnZXMuYWRkKCBSZXBhY2thZ2VyLnNwbGl0UGF0aCggdG8sICcuJyApICk7CisgICAgICAgIH0KKworICAgICAgICBfZnJvbU1hdGNoZXJzID0gbmV3IE1hdGNoZXIgWyBfZnJvbVBhY2thZ2VzLnNpemUoKSAqIDIgXTsKKyAgICAgICAgX3RvUGFja2FnZU5hbWVzID0gbmV3IFN0cmluZyBbIF9mcm9tUGFja2FnZXMuc2l6ZSgpICogMiBdOworCisgICAgICAgIGFkZFBhdHRlcm5zKCAnLicsIDAgKTsKKyAgICAgICAgYWRkUGF0dGVybnMoICcvJywgX2Zyb21QYWNrYWdlcy5zaXplKCkgKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFBhdHRlcm5zICggY2hhciBzZXAsIGludCBvZmYgKQorICAgIHsKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF9mcm9tUGFja2FnZXMuc2l6ZSgpIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdCBmcm9tID0gKExpc3QpIF9mcm9tUGFja2FnZXMuZ2V0KCBpICk7CisgICAgICAgICAgICBMaXN0IHRvID0gKExpc3QpIF90b1BhY2thZ2VzLmdldCggaSApOworCisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICIiOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZnJvbS5zaXplKCkgOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArPSAiXFwiICsgc2VwOworCisgICAgICAgICAgICAgICAgcGF0dGVybiArPSBmcm9tLmdldCggaiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgdG9QYWNrYWdlID0gIiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCB0by5zaXplKCkgOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChqID4gMCkKKyAgICAgICAgICAgICAgICAgICAgdG9QYWNrYWdlICs9IHNlcDsKKworICAgICAgICAgICAgICAgIHRvUGFja2FnZSArPSB0by5nZXQoIGogKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2Zyb21NYXRjaGVyc1sgb2ZmICsgaSBdID0gUGF0dGVybi5jb21waWxlKCBwYXR0ZXJuICkubWF0Y2hlciggIiIgKTsKKyAgICAgICAgICAgIF90b1BhY2thZ2VOYW1lc1sgb2ZmICsgaSBdID0gdG9QYWNrYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVwYWNrYWdlICggU3RyaW5nQnVmZmVyIHNiICkKKyAgICB7CisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfZnJvbU1hdGNoZXJzLmxlbmd0aCA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IChNYXRjaGVyKSBfZnJvbU1hdGNoZXJzWyBpIF07CisKKyAgICAgICAgICAgIG1hdGNoZXIucmVzZXQoIHNiICk7CisKKyAgICAgICAgICAgIHdoaWxlICggbWF0Y2hlci5maW5kKCkgKQorICAgICAgICAgICAgICAgIHNiLnJlcGxhY2UoIG1hdGNoZXIuc3RhcnQoKSwgbWF0Y2hlci5lbmQoKSwgX3RvUGFja2FnZU5hbWVzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldEZyb21QYWNrYWdlcyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfZnJvbVBhY2thZ2VzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFRvUGFja2FnZXMgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3RvUGFja2FnZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IHNwbGl0UGF0aCAoIFN0cmluZyBwYXRoLCBjaGFyIHNlcGFyYXRvciApCisgICAgeworICAgICAgICBBcnJheUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpID0gcGF0aC5pbmRleE9mKCBzZXBhcmF0b3IgKTsKKworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aC5zdWJzdHJpbmcoIDAsIGkgKSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoIGkgKyAxICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCggcGF0aCApOworCisgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJGb3JQYXRoICggU3RyaW5nIHBhdGggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudCgpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdCBfZnJvbVBhY2thZ2VzOworICAgIHByaXZhdGUgTGlzdCBfdG9QYWNrYWdlczsKKyAgICAKKyAgICBwcml2YXRlIE1hdGNoZXJbXSBfZnJvbU1hdGNoZXJzOworICAgIHByaXZhdGUgU3RyaW5nW10gIF90b1BhY2thZ2VOYW1lczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdG9vbHNjaGVtYS9sdGdmbXQueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEvbHRnZm10LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU1MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3Rvb2xzY2hlbWEvbHRnZm10LnhzZApAQCAtMCwwICsxLDYwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOnRucz0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveG1sYmVhbi9sdGdmbXQiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3htbGJlYW4vbHRnZm10IgorICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDx4czplbGVtZW50IG5hbWU9InRlc3RzIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9InRlc3QiIHR5cGU9InRuczp0ZXN0LWNhc2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGVzdC1jYXNlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbGVzIj4KKyAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbGUiIHR5cGU9InRuczpmaWxlLWRlc2MiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSI0Ii8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICAgIDwveHM6ZWxlbWVudD4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmlnaW4iIHR5cGU9InhzOnRva2VuIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtb2RpZmllZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorICA8L3hzOmNvbXBsZXhUeXBlPgorICAKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImZpbGUtZGVzYyI+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0c0RpciIgdHlwZT0ieHM6dG9rZW4iLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvbGRlciIgdHlwZT0ieHM6dG9rZW4iLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbGVOYW1lIiB0eXBlPSJ4czp0b2tlbiIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icm9sZSI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNjaGVtYSIvPgorICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5zdGFuY2UiLz4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc291cmNlIi8+CisgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGl0eSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorICA8L3hzOmNvbXBsZXhUeXBlPgorCis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy90b29sc2NoZW1hL3N1YnN0d3NkbC54c2QgYi92MS9zcmMvdG9vbHNjaGVtYS9zdWJzdHdzZGwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWIwMTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdG9vbHNjaGVtYS9zdWJzdHdzZGwueHNkCkBAIC0wLDAgKzEsNTUgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPCEtLQorICAgVGhpcyBzY2hlbWEgc3RhbmRzIGluIGZvciBhIHNjaGVtYSBmb3IgV1NETC4KKworICAgSXQgaGFzIG5vbmUgb2YgdGhlIHJlYWwgc3RydWN0dXJlIG9mIGEgV1NETCBleGNlcHQgImltcG9ydHMiIGFuZAorICAgdGhlIDJuZC1sZXZlbCB0YWcgbmFtZXMuCisKKyAgIFdoZW4gY29tcGlsaW5nIHNjaGVtYXMgd2l0aGluIC53c2RsIGZpbGVzLCB3ZSB1c2UgdGhpcyBzY2hlbWEgdG8gbG9hZAorICAgdGhlIFdTREwgZmlsZXMuICBPZiBjb3Vyc2UsIFdTREwgZmlsZXMgYXJlIGFjdHVhbGx5IGluIHRoZQorICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8gbmFtZXNwYWNlLCBidXQgd2UgdXNlIHRoZQorICAgTG9hZFN1YnN0aXR1dGVOYW1lc3BhY2VzIG9wdGlvbiBpbiBvcmRlciB0byBpbnRlcm5hbGx5IHN1YnN0aXR1dGUKKyAgIHRoZSBuYW1lc3BhY2UgYmVsb3cuCistLT4KKworCis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbnRlcm5hbC94bWxiZWFucy93c2Rsc3Vic3QiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0idG5zOlRJbXBvcnQiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiLz4gICAgICAgICAgICAgICAJCQkKKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIvPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIi8+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBvcnRUeXBlIi8+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KKyAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgPHhzOmFueUF0dHJpYnV0ZS8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUSW1wb3J0Ij4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiLz4JCQorICA8L3hzOmNvbXBsZXhUeXBlPgorCis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkIGIvdjEvc3JjL3Rvb2xzY2hlbWEveHNkb3dubG9hZC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3NDI2OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90b29sc2NoZW1hL3hzZG93bmxvYWQueHNkCkBAIC0wLDAgKzEsMzkgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYQorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6aT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveG1sYmVhbi94c2Rvd25sb2FkIgorICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL3hzZG93bmxvYWQiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZG93bmxvYWRlZC1zY2hlbWFzIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJlbnRyeSIgdHlwZT0iaTpkb3dubG9hZGVkLXNjaGVtYS1lbnRyeSIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0RGlyZWN0b3J5IiB0eXBlPSJ4czp0b2tlbiIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZG93bmxvYWRlZC1zY2hlbWEtZW50cnkiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJ4czp0b2tlbiIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hhMSIgdHlwZT0ieHM6dG9rZW4iLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICA8L3hzOmNvbXBsZXhUeXBlPgorCis8L3hzOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9CTVBhdHRlcm4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvQk1QYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMmQxNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvQk1QYXR0ZXJuLmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKKworaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKKworLyoqCisgKiBCb3llci1Nb29yZSBzZWFyY2hlci4KKyAqLworcHVibGljIGNsYXNzIEJNUGF0dGVybiB7CisgICAgY2hhcltdIHBhdHRlcm47CisgICAgaW50W10gc2hpZnRUYWJsZTsKKyAgICBib29sZWFuIGlnbm9yZUNhc2U7CisKKyAgICBwdWJsaWMgQk1QYXR0ZXJuKFN0cmluZyBwYXQsIGJvb2xlYW4gaWdub3JlQ2FzZSkgeworICAgICAgICB0aGlzKHBhdCwgMjU2LCBpZ25vcmVDYXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQk1QYXR0ZXJuKFN0cmluZyBwYXQsIGludCB0YWJsZVNpemUsIGJvb2xlYW4gaWdub3JlQ2FzZSkgeworICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgdGhpcy5zaGlmdFRhYmxlID0gbmV3IGludFt0YWJsZVNpemVdOworICAgICAgICB0aGlzLmlnbm9yZUNhc2UgPSBpZ25vcmVDYXNlOworCisgICAgICAgIGludCBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsgIGkgKyspCisgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaV0gPSBsZW5ndGg7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgbGVuZ3RoOyAgaSArKykgeworICAgICAgICAgICAgY2hhciBjaCA9IHRoaXMucGF0dGVybltpXTsKKyAgICAgICAgICAgIGludCBkaWZmID0gbGVuZ3RoLWktMTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGNoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChkaWZmIDwgdGhpcy5zaGlmdFRhYmxlW2luZGV4XSkKKyAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKKyAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpIHsKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgICAgICAgICAgaW5kZXggPSBjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCk7CisgICAgICAgICAgICAgICAgaW5kZXggPSBjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0VGFibGVbaW5kZXhdID0gZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiAtMSBpZiA8dmFyPml0ZXJhdG9yPC92YXI+IGRvZXMgbm90IGNvbnRhaW4gdGhpcyBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciBpdGVyYXRvciwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKGl0ZXJhdG9yLCBzdGFydCwgbGltaXQpOworICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7CisgICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7CisgICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7CisgICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgeworICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7CisgICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKKyAgICAgICAgICAgIGNoYXIgY2g7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKChjaCA9IGl0ZXJhdG9yLnNldEluZGV4KC0taW5kZXgpKSAhPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAocGluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0gd2hpbGUgKHBpbmRleCA+IDApOworICAgICAgICAgICAgaW5kZXggKz0gdGhpcy5zaGlmdFRhYmxlW2NoICUgdGhpcy5zaGlmdFRhYmxlLmxlbmd0aF0rMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IG5pbmRleCkgIGluZGV4ID0gbmluZGV4OworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gLTEgaWYgPHZhcj5zdHI8L3Zhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIGludCBtYXRjaGVzKFN0cmluZyBzdHIsIGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpICByZXR1cm4gdGhpcy5tYXRjaGVzSWdub3JlQ2FzZShzdHIsIHN0YXJ0LCBsaW1pdCk7CisgICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKKyAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7CisgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiU3RhcnRzIGF0ICIraW5kZXgpOworICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7CisgICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKKyAgICAgICAgICAgIGNoYXIgY2g7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoLS1pbmRleCkpICE9IHRoaXMucGF0dGVyblstLXBpbmRleF0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7CisgICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOworICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gLTEgaWYgPHZhcj5jaGFyczwvY2hhcj4gZG9lcyBub3QgY29udGFpbiB0aGlzIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIGludCBtYXRjaGVzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkgIHJldHVybiB0aGlzLm1hdGNoZXNJZ25vcmVDYXNlKGNoYXJzLCBzdGFydCwgbGltaXQpOworICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7CisgICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7CisgICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7CisgICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgeworICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIlN0YXJ0cyBhdCAiK2luZGV4KTsKKyAgICAgICAgICAgIGludCBwaW5kZXggPSBwbGVuZ3RoOworICAgICAgICAgICAgaW50IG5pbmRleCA9IGluZGV4KzE7CisgICAgICAgICAgICBjaGFyIGNoOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICgoY2ggPSBjaGFyc1stLWluZGV4XSkgIT0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKKyAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IG1hdGNoZXNJZ25vcmVDYXNlKENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgeworICAgICAgICBpbnQgcGxlbmd0aCA9IHRoaXMucGF0dGVybi5sZW5ndGg7CisgICAgICAgIGlmIChwbGVuZ3RoID09IDApICByZXR1cm4gc3RhcnQ7CisgICAgICAgIGludCBpbmRleCA9IHN0YXJ0K3BsZW5ndGg7CisgICAgICAgIHdoaWxlIChpbmRleCA8PSBsaW1pdCkgeworICAgICAgICAgICAgaW50IHBpbmRleCA9IHBsZW5ndGg7CisgICAgICAgICAgICBpbnQgbmluZGV4ID0gaW5kZXgrMTsKKyAgICAgICAgICAgIGNoYXIgY2g7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBjaCA9IGl0ZXJhdG9yLnNldEluZGV4KC0taW5kZXgpOworICAgICAgICAgICAgICAgIGNoYXIgY2gyID0gdGhpcy5wYXR0ZXJuWy0tcGluZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAoY2gxICE9IGNoMikgeworICAgICAgICAgICAgICAgICAgICBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKKyAgICAgICAgICAgICAgICAgICAgY2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyICYmIENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICAgICAgfSB3aGlsZSAocGluZGV4ID4gMCk7CisgICAgICAgICAgICBpbmRleCArPSB0aGlzLnNoaWZ0VGFibGVbY2ggJSB0aGlzLnNoaWZ0VGFibGUubGVuZ3RoXSsxOworICAgICAgICAgICAgaWYgKGluZGV4IDwgbmluZGV4KSAgaW5kZXggPSBuaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBpbnQgbWF0Y2hlc0lnbm9yZUNhc2UoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKKyAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7CisgICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKKyAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOworICAgICAgICAgICAgY2hhciBjaDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gdGV4dC5jaGFyQXQoLS1pbmRleCk7CisgICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7CisgICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOworICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKKyAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBtYXRjaGVzSWdub3JlQ2FzZShjaGFyW10gY2hhcnMsIGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGludCBwbGVuZ3RoID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDsKKyAgICAgICAgaWYgKHBsZW5ndGggPT0gMCkgIHJldHVybiBzdGFydDsKKyAgICAgICAgaW50IGluZGV4ID0gc3RhcnQrcGxlbmd0aDsKKyAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxpbWl0KSB7CisgICAgICAgICAgICBpbnQgcGluZGV4ID0gcGxlbmd0aDsKKyAgICAgICAgICAgIGludCBuaW5kZXggPSBpbmRleCsxOworICAgICAgICAgICAgY2hhciBjaDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IGNoID0gY2hhcnNbLS1pbmRleF07CisgICAgICAgICAgICAgICAgY2hhciBjaDIgPSB0aGlzLnBhdHRlcm5bLS1waW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7CisgICAgICAgICAgICAgICAgICAgIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOworICAgICAgICAgICAgICAgICAgICBjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoMikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9IHdoaWxlIChwaW5kZXggPiAwKTsKKyAgICAgICAgICAgIGluZGV4ICs9IHRoaXMuc2hpZnRUYWJsZVtjaCAlIHRoaXMuc2hpZnRUYWJsZS5sZW5ndGhdKzE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCBuaW5kZXgpICBpbmRleCA9IG5pbmRleDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnRbXSBzaGlmdFRhYmxlID0gbmV3IGludFsyNTZdOworICAgICAgICAgICAgaW5pdGlhbGl6ZUJveWVyTW9vcmUoYXJndlswXSwgc2hpZnRUYWJsZSwgdHJ1ZSk7CisgICAgICAgICAgICBpbnQgbyA9IC0xOworICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlID0gbmV3IGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihhcmd2WzFdKTsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7ICBpIDwgMTAwMDA7ICBpICsrKQorICAgICAgICAgICAgICAgIG8gPSBzZWFyY2hJZ25vcmVDYXNlc1dpdGhCb3llck1vb3JlKGl0ZSwgMCwgYXJndlswXSwgc2hpZnRUYWJsZSk7CisgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQ6ICIrbysiLCBFbGFwc2VkOiAiK3N0YXJ0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0qLworfQorCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L01hdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlOWM5NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvTWF0Y2guamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCitpbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOworCisvKioKKyAqIAorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYXMgcmFuZ2VzIGNhcHR1cmVkIGluIG1hdGNoaW5nLgorICoKKyAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIGludCwgaW50LCBNYXRjaCkKKyAqIEBzZWUgUmVndWxhckV4cHJlc3Npb24jbWF0Y2hlcyhjaGFyW10sIE1hdGNoKQorICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvciwgTWF0Y2gpCisgKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBpbnQsIE1hdGNoKQorICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcsIE1hdGNoKQorICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OworICovCitwdWJsaWMgY2xhc3MgTWF0Y2ggaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIGludFtdIGJlZ2lucG9zID0gbnVsbDsKKyAgICBpbnRbXSBlbmRwb3MgPSBudWxsOworICAgIGludCBub2Zncm91cHMgPSAwOworCisgICAgQ2hhcmFjdGVySXRlcmF0b3IgY2lTb3VyY2UgPSBudWxsOworICAgIFN0cmluZyBzdHJTb3VyY2UgPSBudWxsOworICAgIGNoYXJbXSBjaGFyU291cmNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1hdGNoKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIE1hdGNoIG1hID0gbmV3IE1hdGNoKCk7CisgICAgICAgIGlmICh0aGlzLm5vZmdyb3VwcyA+IDApIHsKKyAgICAgICAgICAgIG1hLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mZ3JvdXBzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmNpU291cmNlICE9IG51bGwpICBtYS5zZXRTb3VyY2UodGhpcy5jaVNvdXJjZSk7CisgICAgICAgICAgICBpZiAodGhpcy5zdHJTb3VyY2UgIT0gbnVsbCkgIG1hLnNldFNvdXJjZSh0aGlzLnN0clNvdXJjZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLm5vZmdyb3VwczsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICBtYS5zZXRCZWdpbm5pbmcoaSwgdGhpcy5nZXRCZWdpbm5pbmcoaSkpOworICAgICAgICAgICAgICAgIG1hLnNldEVuZChpLCB0aGlzLmdldEVuZChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0TnVtYmVyT2ZHcm91cHMoaW50IG4pIHsKKyAgICAgICAgaW50IG9sZG4gPSB0aGlzLm5vZmdyb3VwczsKKyAgICAgICAgdGhpcy5ub2Zncm91cHMgPSBuOworICAgICAgICBpZiAob2xkbiA8PSAwCisgICAgICAgICAgICB8fCBvbGRuIDwgbiB8fCBuKjIgPCBvbGRuKSB7CisgICAgICAgICAgICB0aGlzLmJlZ2lucG9zID0gbmV3IGludFtuXTsKKyAgICAgICAgICAgIHRoaXMuZW5kcG9zID0gbmV3IGludFtuXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBuOyAgaSArKykgeworICAgICAgICAgICAgdGhpcy5iZWdpbnBvc1tpXSA9IC0xOworICAgICAgICAgICAgdGhpcy5lbmRwb3NbaV0gPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlKENoYXJhY3Rlckl0ZXJhdG9yIGNpKSB7CisgICAgICAgIHRoaXMuY2lTb3VyY2UgPSBjaTsKKyAgICAgICAgdGhpcy5zdHJTb3VyY2UgPSBudWxsOworICAgICAgICB0aGlzLmNoYXJTb3VyY2UgPSBudWxsOworICAgIH0KKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFNvdXJjZShTdHJpbmcgc3RyKSB7CisgICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOworICAgICAgICB0aGlzLnN0clNvdXJjZSA9IHN0cjsKKyAgICAgICAgdGhpcy5jaGFyU291cmNlID0gbnVsbDsKKyAgICB9CisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2UoY2hhcltdIGNoYXJzKSB7CisgICAgICAgIHRoaXMuY2lTb3VyY2UgPSBudWxsOworICAgICAgICB0aGlzLnN0clNvdXJjZSA9IG51bGw7CisgICAgICAgIHRoaXMuY2hhclNvdXJjZSA9IGNoYXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QmVnaW5uaW5nKGludCBpbmRleCwgaW50IHYpIHsKKyAgICAgICAgdGhpcy5iZWdpbnBvc1tpbmRleF0gPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RW5kKGludCBpbmRleCwgaW50IHYpIHsKKyAgICAgICAgdGhpcy5lbmRwb3NbaW5kZXhdID0gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXBzLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgMSB3aGVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIG5vIGNhcHR1cmluZy1wYXJlbnRoZXNpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mR3JvdXBzKCkgeworICAgICAgICBpZiAodGhpcy5ub2Zncm91cHMgPD0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7CisgICAgICAgIHJldHVybiB0aGlzLm5vZmdyb3VwczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJlZ2lubmluZyhpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKHRoaXMuYmVnaW5wb3MgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgcmVzdWx0IGlzIG5vdCBzZXQuIik7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOworICAgICAgICByZXR1cm4gdGhpcy5iZWdpbnBvc1tpbmRleF07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVuZCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0IHRleHQgbWF0Y2hlZCB0byBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IExlc3MgdGhhbiA8Y29kZT5nZXROdW1iZXJPZkdyb3VwcygpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEVuZChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKHRoaXMuZW5kcG9zID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIHJlc3VsdCBpcyBub3Qgc2V0LiIpOworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IHRoaXMubm9mZ3JvdXBzIDw9IGluZGV4KQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLm5vZmdyb3VwcysiOiAiK2luZGV4KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW5kcG9zW2luZGV4XTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gc3Vic3RyaW5nIG9mIHRoZSB0YXJnZXQgdGV4dCBtYXRjaGVkIHRvIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggTGVzcyB0aGFuIDxjb2RlPmdldE51bWJlck9mR3JvdXBzKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FwdHVyZWRUZXh0KGludCBpbmRleCkgeworICAgICAgICBpZiAodGhpcy5iZWdpbnBvcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWF0Y2goKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQuIik7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5ub2Zncm91cHMgPD0gaW5kZXgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMubm9mZ3JvdXBzKyI6ICIraW5kZXgpOworICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICBpbnQgYmVnaW4gPSB0aGlzLmJlZ2lucG9zW2luZGV4XSwgZW5kID0gdGhpcy5lbmRwb3NbaW5kZXhdOworICAgICAgICBpZiAoYmVnaW4gPCAwIHx8IGVuZCA8IDApICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKHRoaXMuY2lTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0ID0gUkVVdGlsLnN1YnN0cmluZyh0aGlzLmNpU291cmNlLCBiZWdpbiwgZW5kKTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0clNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXQgPSB0aGlzLnN0clNvdXJjZS5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBuZXcgU3RyaW5nKHRoaXMuY2hhclNvdXJjZSwgYmVnaW4sIGVuZC1iZWdpbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L09wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4ZmZjOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvT3AuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKi8KK2NsYXNzIE9wIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IERPVCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBDSEFSID0gMTsgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUgY2hhcmFjdGVyCisgICAgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDM7ICAgICAgICAgICAgICAgICAvLyBbYS16QS1aXQorICAgIHN0YXRpYyBmaW5hbCBpbnQgTlJBTkdFID0gNDsgICAgICAgICAgICAgICAgLy8gW15hLXpBLVpdCisgICAgc3RhdGljIGZpbmFsIGludCBBTkNIT1IgPSA1OyAgICAgICAgICAgICAgICAvLyBeICQgLi4uCisgICAgc3RhdGljIGZpbmFsIGludCBTVFJJTkcgPSA2OyAgICAgICAgICAgICAgICAvLyBsaXRlcmFsIFN0cmluZyAKKyAgICBzdGF0aWMgZmluYWwgaW50IENMT1NVUkUgPSA3OyAgICAgICAgICAgICAgIC8vIFgqCisgICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlDTE9TVVJFID0gODsgICAgICAvLyBYKj8KKyAgICBzdGF0aWMgZmluYWwgaW50IFFVRVNUSU9OID0gOTsgICAgICAgICAgICAgIC8vIFg/CisgICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlRVUVTVElPTiA9IDEwOyAgICAvLyBYPz8KKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSU9OID0gMTE7ICAgICAgICAgICAgICAgIC8vIFh8WQorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FQVFVSRSA9IDE1OyAgICAgICAgICAgICAgLy8gKCBhbmQgKQorICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1JFRkVSRU5DRSA9IDE2OyAgICAgICAgLy8gXDEgXDIgLi4uCisgICAgc3RhdGljIGZpbmFsIGludCBMT09LQUhFQUQgPSAyMDsgICAgICAgICAgICAvLyAoPz0uLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBORUdBVElWRUxPT0tBSEVBRCA9IDIxOyAgICAvLyAoPyEuLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBMT09LQkVISU5EID0gMjI7ICAgICAgICAgICAvLyAoPzw9Li4uKQorICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQkVISU5EID0gMjM7ICAgLy8gKD88IS4uLikKKyAgICBzdGF0aWMgZmluYWwgaW50IElOREVQRU5ERU5UID0gMjQ7ICAgICAgICAgIC8vICg/Pi4uLikKKyAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVSID0gMjU7ICAgICAgICAgICAgIC8vICg/aW1zLWltczouLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT04gPSAyNjsgICAgICAgICAgICAvLyAoPyguLil5ZXN8bm8pCisKKyAgICBzdGF0aWMgaW50IG5vZmluc3RhbmNlcyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlQgPSBmYWxzZTsKKworICAgIHN0YXRpYyBPcCBjcmVhdGVEb3QoKSB7CisgICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBPcChPcC5ET1QpOworICAgIH0KKyAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUNoYXIoaW50IGRhdGEpIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5DSEFSLCBkYXRhKTsKKyAgICB9CisgICAgc3RhdGljIENoYXJPcCBjcmVhdGVBbmNob3IoaW50IGRhdGEpIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5BTkNIT1IsIGRhdGEpOworICAgIH0KKyAgICBzdGF0aWMgQ2hhck9wIGNyZWF0ZUNhcHR1cmUoaW50IG51bWJlciwgT3AgbmV4dCkgeworICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7CisgICAgICAgIENoYXJPcCBvcCA9IG5ldyBDaGFyT3AoT3AuQ0FQVFVSRSwgbnVtYmVyKTsKKyAgICAgICAgb3AubmV4dCA9IG5leHQ7CisgICAgICAgIHJldHVybiBvcDsKKyAgICB9CisgICAgc3RhdGljIFVuaW9uT3AgY3JlYXRlVW5pb24oaW50IHNpemUpIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiQ3JlYXRlcyBVbmlvbk9wIik7CisgICAgICAgIHJldHVybiBuZXcgVW5pb25PcChPcC5VTklPTiwgc2l6ZSk7CisgICAgfQorICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZUNsb3N1cmUoaW50IGlkKSB7CisgICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBNb2RpZmllck9wKE9wLkNMT1NVUkUsIGlkLCAtMSk7CisgICAgfQorICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZU5vbkdyZWVkeUNsb3N1cmUoKSB7CisgICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGlsZE9wKE9wLk5PTkdSRUVEWUNMT1NVUkUpOworICAgIH0KKyAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVRdWVzdGlvbihib29sZWFuIG5vbmdyZWVkeSkgeworICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7CisgICAgICAgIHJldHVybiBuZXcgQ2hpbGRPcChub25ncmVlZHkgPyBPcC5OT05HUkVFRFlRVUVTVElPTiA6IE9wLlFVRVNUSU9OKTsKKyAgICB9CisgICAgc3RhdGljIFJhbmdlT3AgY3JlYXRlUmFuZ2UoVG9rZW4gdG9rKSB7CisgICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBSYW5nZU9wKE9wLlJBTkdFLCB0b2spOworICAgIH0KKyAgICBzdGF0aWMgQ2hpbGRPcCBjcmVhdGVMb29rKGludCB0eXBlLCBPcCBuZXh0LCBPcCBicmFuY2gpIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICBDaGlsZE9wIG9wID0gbmV3IENoaWxkT3AodHlwZSk7CisgICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7CisgICAgICAgIG9wLm5leHQgPSBuZXh0OworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorICAgIHN0YXRpYyBDaGFyT3AgY3JlYXRlQmFja1JlZmVyZW5jZShpbnQgcmVmbm8pIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICByZXR1cm4gbmV3IENoYXJPcChPcC5CQUNLUkVGRVJFTkNFLCByZWZubyk7CisgICAgfQorICAgIHN0YXRpYyBTdHJpbmdPcCBjcmVhdGVTdHJpbmcoU3RyaW5nIGxpdGVyYWwpIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ09wKE9wLlNUUklORywgbGl0ZXJhbCk7CisgICAgfQorICAgIHN0YXRpYyBDaGlsZE9wIGNyZWF0ZUluZGVwZW5kZW50KE9wIG5leHQsIE9wIGJyYW5jaCkgeworICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgKys7CisgICAgICAgIENoaWxkT3Agb3AgPSBuZXcgQ2hpbGRPcChPcC5JTkRFUEVOREVOVCk7CisgICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7CisgICAgICAgIG9wLm5leHQgPSBuZXh0OworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorICAgIHN0YXRpYyBNb2RpZmllck9wIGNyZWF0ZU1vZGlmaWVyKE9wIG5leHQsIE9wIGJyYW5jaCwgaW50IGFkZCwgaW50IG1hc2spIHsKKyAgICAgICAgaWYgKE9wLkNPVU5UKSAgT3Aubm9maW5zdGFuY2VzICsrOworICAgICAgICBNb2RpZmllck9wIG9wID0gbmV3IE1vZGlmaWVyT3AoT3AuTU9ESUZJRVIsIGFkZCwgbWFzayk7CisgICAgICAgIG9wLnNldENoaWxkKGJyYW5jaCk7CisgICAgICAgIG9wLm5leHQgPSBuZXh0OworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorICAgIHN0YXRpYyBDb25kaXRpb25PcCBjcmVhdGVDb25kaXRpb24oT3AgbmV4dCwgaW50IHJlZiwgT3AgY29uZGl0aW9uZmxvdywgT3AgeWVzZmxvdywgT3Agbm9mbG93KSB7CisgICAgICAgIGlmIChPcC5DT1VOVCkgIE9wLm5vZmluc3RhbmNlcyArKzsKKyAgICAgICAgQ29uZGl0aW9uT3Agb3AgPSBuZXcgQ29uZGl0aW9uT3AoT3AuQ09ORElUSU9OLCByZWYsIGNvbmRpdGlvbmZsb3csIHllc2Zsb3csIG5vZmxvdyk7CisgICAgICAgIG9wLm5leHQgPSBuZXh0OworICAgICAgICByZXR1cm4gb3A7CisgICAgfQorCisgICAgaW50IHR5cGU7CisgICAgT3AgbmV4dCA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgT3AoaW50IHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBpbnQgc2l6ZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBVTklPTgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgT3AgZWxlbWVudEF0KGludCBpbmRleCkgeyAgICAgICAgICAgICAgICAgICAvLyBmb3IgVU5Jb04KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKKyAgICB9CisgICAgT3AgZ2V0Q2hpbGQoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ0xPU1VSRSwgUVVFU1RJT04KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllck9wCisgICAgaW50IGdldERhdGEoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFyT3AgIGZvciBDSEFSLCBCQUNLUkVGRVJFTkNFLCBDQVBUVVJFLCBBTkNIT1IsIAorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IHR5cGU9Iit0aGlzLnR5cGUpOworICAgIH0KKyAgICBpbnQgZ2V0RGF0YTIoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZGlmaWVyT3AKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiB0eXBlPSIrdGhpcy50eXBlKTsKKyAgICB9CisgICAgUmFuZ2VUb2tlbiBnZXRUb2tlbigpIHsgICAgICAgICAgICAgICAgICAgICAvLyBSQU5HRSwgTlJBTkdFCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7CisgICAgfQorICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RSSU5HCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogdHlwZT0iK3RoaXMudHlwZSk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHN0YXRpYyBjbGFzcyBDaGFyT3AgZXh0ZW5kcyBPcCB7CisgICAgICAgIGludCBjaGFyRGF0YTsKKyAgICAgICAgQ2hhck9wKGludCB0eXBlLCBpbnQgZGF0YSkgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgICAgICB0aGlzLmNoYXJEYXRhID0gZGF0YTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZ2V0RGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJEYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHN0YXRpYyBjbGFzcyBVbmlvbk9wIGV4dGVuZHMgT3AgeworICAgICAgICBWZWN0b3IgYnJhbmNoZXM7CisgICAgICAgIFVuaW9uT3AoaW50IHR5cGUsIGludCBzaXplKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgICAgIHRoaXMuYnJhbmNoZXMgPSBuZXcgVmVjdG9yKHNpemUpOworICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkRWxlbWVudChPcCBvcCkgeworICAgICAgICAgICAgdGhpcy5icmFuY2hlcy5hZGRFbGVtZW50KG9wKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmJyYW5jaGVzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBPcCBlbGVtZW50QXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gKE9wKXRoaXMuYnJhbmNoZXMuZWxlbWVudEF0KGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBzdGF0aWMgY2xhc3MgQ2hpbGRPcCBleHRlbmRzIE9wIHsKKyAgICAgICAgT3AgY2hpbGQ7CisgICAgICAgIENoaWxkT3AoaW50IHR5cGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0Q2hpbGQoT3AgY2hpbGQpIHsKKyAgICAgICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKKyAgICAgICAgfQorICAgICAgICBPcCBnZXRDaGlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkOworICAgICAgICB9CisgICAgfQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBzdGF0aWMgY2xhc3MgTW9kaWZpZXJPcCBleHRlbmRzIENoaWxkT3AgeworICAgICAgICBpbnQgdjE7CisgICAgICAgIGludCB2MjsKKyAgICAgICAgTW9kaWZpZXJPcChpbnQgdHlwZSwgaW50IHYxLCBpbnQgdjIpIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICAgICAgdGhpcy52MSA9IHYxOworICAgICAgICAgICAgdGhpcy52MiA9IHYyOworICAgICAgICB9CisgICAgICAgIGludCBnZXREYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudjE7CisgICAgICAgIH0KKyAgICAgICAgaW50IGdldERhdGEyKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudjI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIHN0YXRpYyBjbGFzcyBSYW5nZU9wIGV4dGVuZHMgT3AgeworICAgICAgICBUb2tlbiB0b2s7CisgICAgICAgIFJhbmdlT3AoaW50IHR5cGUsIFRva2VuIHRvaykgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgICAgICB0aGlzLnRvayA9IHRvazsKKyAgICAgICAgfQorICAgICAgICBSYW5nZVRva2VuIGdldFRva2VuKCkgeworICAgICAgICAgICAgcmV0dXJuIChSYW5nZVRva2VuKXRoaXMudG9rOworICAgICAgICB9CisgICAgfQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBzdGF0aWMgY2xhc3MgU3RyaW5nT3AgZXh0ZW5kcyBPcCB7CisgICAgICAgIFN0cmluZyBzdHJpbmc7CisgICAgICAgIFN0cmluZ09wKGludCB0eXBlLCBTdHJpbmcgbGl0ZXJhbCkgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IGxpdGVyYWw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgc3RhdGljIGNsYXNzIENvbmRpdGlvbk9wIGV4dGVuZHMgT3AgeworICAgICAgICBpbnQgcmVmTnVtYmVyOworICAgICAgICBPcCBjb25kaXRpb247CisgICAgICAgIE9wIHllczsKKyAgICAgICAgT3Agbm87CisgICAgICAgIENvbmRpdGlvbk9wKGludCB0eXBlLCBpbnQgcmVmbm8sIE9wIGNvbmRpdGlvbmZsb3csIE9wIHllc2Zsb3csIE9wIG5vZmxvdykgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgICAgICB0aGlzLnJlZk51bWJlciA9IHJlZm5vOworICAgICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb25mbG93OworICAgICAgICAgICAgdGhpcy55ZXMgPSB5ZXNmbG93OworICAgICAgICAgICAgdGhpcy5ubyA9IG5vZmxvdzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE2ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKKworLyoqCisgKgorICogQGF1dGhvciBUQU1VUkEgS2VudCAmbHQ7a2VudEB0cmwuaWJtLmNvLmpwJmd0OworICovCitwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBpbnQgbG9jYXRpb247CisKKyAgICAvKgorICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzKSB7CisgICAgICAgIHRoaXMobWVzLCAtMSk7CisgICAgfQorICAgICovCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lcywgaW50IGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKG1lcyk7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gLTEgaWYgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1BhcnNlckZvclhNTFNjaGVtYS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZXJGb3JYTUxTY2hlbWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI5NmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9QYXJzZXJGb3JYTUxTY2hlbWEuamF2YQpAQCAtMCwwICsxLDQ2MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCisvKioKKyAqIEEgcmVndWxhciBleHByZXNzaW9uIHBhcnNlciBmb3IgdGhlIFhNTCBTaGVtYS4KKyAqCisgKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7CisgKi8KK2NsYXNzIFBhcnNlckZvclhNTFNjaGVtYSBleHRlbmRzIFJlZ2V4UGFyc2VyIHsKKworICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoKSB7CisgICAgICAgIC8vdGhpcy5zZXRMb2NhbGUoTG9jYWxlLmdldERlZmF1bHQoKSk7CisgICAgfQorICAgIHB1YmxpYyBQYXJzZXJGb3JYTUxTY2hlbWEoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAvL3RoaXMuc2V0TG9jYWxlKGxvY2FsZSk7CisgICAgfQorCisgICAgVG9rZW4gcHJvY2Vzc0NhcmV0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDaGFyKCdeJyk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NEb2xsYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoJyQnKTsKKyAgICAgfQorICAgIFRva2VuIHByb2Nlc3NMb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc05lZ2F0aXZlbG9va2FoZWFkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NMb29rYmVoaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0EoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19ndCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzU3RhcihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzUGx1cyhUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFgrIC0+IFhYKgorICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNvbmNhdCh0b2ssIFRva2VuLmNyZWF0ZUNsb3N1cmUodG9rKSk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NRdWVzdGlvbihUb2tlbiB0b2spIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFg/IC0+IFh8CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBUb2tlbiBwYXIgPSBUb2tlbi5jcmVhdGVVbmlvbigpOworICAgICAgICBwYXIuYWRkQ2hpbGQodG9rKTsKKyAgICAgICAgcGFyLmFkZENoaWxkKFRva2VuLmNyZWF0ZUVtcHR5KCkpOworICAgICAgICByZXR1cm4gcGFyOworICAgIH0KKyAgICBib29sZWFuIGNoZWNrUXVlc3Rpb24oaW50IG9mZikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NQYXJlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgMCk7CisgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBzdXBlci5UX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzUGFyZW4yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NDb25kaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc01vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzSW5kZXBlbmRlbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2MnKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0MnKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ2knKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX0koKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQoJ0knKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2coKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19YKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldC0yKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tyZWZlcmVuY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBleCgicGFyc2VyLnByb2Nlc3MuMSIsIHRoaXMub2Zmc2V0LTQpOworICAgIH0KKworICAgIGludCBwcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKFJhbmdlVG9rZW4gdG9rLCBpbnQgYykgeworICAgICAgICB0b2subWVyZ2VSYW5nZXModGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZChjKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIGNoYXJhY3Rlci1jbGFzcy1leHByZXNzaW9uLCBub3QgYSBjaGFyYWN0ZXItY2xhc3MtZXNjYXBlLgorICAgICAqCisgICAgICogYy1jLWV4cHJlc3Npb24gICA6Oj0gJ1snIGMtZ3JvdXAgJ10nCisgICAgICogYy1ncm91cCAgICAgICAgICA6Oj0gcG9zaXRpdmUtYy1ncm91cCB8IG5lZ2F0aXZlLWMtZ3JvdXAgfCBjLWMtc3VidHJhY3Rpb24KKyAgICAgKiBwb3NpdGl2ZS1jLWdyb3VwIDo6PSAoYy1yYW5nZSB8IGMtYy1lc2NhcGUpKworICAgICAqIG5lZ2F0aXZlLWMtZ3JvdXAgOjo9ICdeJyBwb3NpdGl2ZS1jLWdyb3VwCisgICAgICogYy1jLXN1YnRyYWN0aW9uICA6Oj0gKHBvc2l0aXZlLWMtZ3JvdXAgfCBuZWdhdGl2ZS1jLWdyb3VwKSBzdWJ0cmFjdGlvbgorICAgICAqIHN1YnRyYWN0aW9uICAgICAgOjo9ICctJyBjLWMtZXhwcmVzc2lvbgorICAgICAqIGMtcmFuZ2UgICAgICAgICAgOjo9IHNpbmdsZS1yYW5nZSB8IGZyb20tdG8tcmFuZ2UKKyAgICAgKiBzaW5nbGUtcmFuZ2UgICAgIDo6PSBtdWx0aS1jLWVzY2FwZSB8IGNhdGVnb3J5LWMtZXNjYXBlIHwgYmxvY2stYy1lc2NhcGUgfCA8YW55IFhNTCBjaGFyPgorICAgICAqIGNjLW5vcm1hbC1jICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyIGV4Y2VwdCBbLCBdLCBcPgorICAgICAqIGZyb20tdG8tcmFuZ2UgICAgOjo9IGNjLW5vcm1hbC1jICctJyBjYy1ub3JtYWwtYworICAgICAqCisgICAgICogQHBhcmFtIHVzZU5yYWdlIElnbm9yZWQuCisgICAgICogQHJldHVybiBUaGlzIHJldHVybnMgbm8gTnJhZ2VUb2tlbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZUNoYXJhY3RlckNsYXNzKGJvb2xlYW4gdXNlTnJhbmdlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLnNldENvbnRleHQoU19JTkJSQUNLRVRTKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdbJworICAgICAgICBib29sZWFuIG5yYW5nZSA9IGZhbHNlOworICAgICAgICBSYW5nZVRva2VuIGJhc2UgPSBudWxsOworICAgICAgICBSYW5nZVRva2VuIHRvazsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICdeJykgeworICAgICAgICAgICAgbnJhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdeJworICAgICAgICAgICAgYmFzZSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgICAgICBiYXNlLmFkZFJhbmdlKDAsIFRva2VuLlVURjE2X01BWCk7CisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdGxvb3AgPSB0cnVlOworICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9FT0YpIHsgLy8gRG9uJ3QgdXNlICdjb3RpbnVlJyBmb3IgdGhpcyBsb29wLgorICAgICAgICAgICAgLy8gc2luZ2xlLXJhbmdlIHwgZnJvbS10by1yYW5nZSB8IHN1YnRyYWN0aW9uCisgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScgJiYgIWZpcnN0bG9vcCkgeworICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOworICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgICBjYXNlICdkJzogIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgY2FzZSAndyc6ICBjYXNlICdXJzoKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0aGlzLmdldFRva2VuRm9yU2hvcnRoYW5kKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOiAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICBjYXNlICdjJzogIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5wcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkgIGVuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgIGludCBwc3RhcnQgPSB0aGlzLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2syID0gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfcFAoYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2syID09IG51bGwpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuYXRvbS41IiwgcHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHRvazIpOworICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOworICAgICAgICAgICAgICAgIH0gLy8gXCArIGMKKyAgICAgICAgICAgIH0gLy8gYmFja3NvbGlkdXMKKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04gJiYgIWZpcnN0bG9vcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VicmFjdGlvbgorICAgICAgICAgICAgICAgIGlmIChucmFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5zdWJ0cmFjdFJhbmdlcyh0b2spOworICAgICAgICAgICAgICAgICAgICB0b2sgPSBiYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlMiA9IHRoaXMucGFyc2VDaGFyYWN0ZXJDbGFzcyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdG9rLnN1YnRyYWN0UmFuZ2VzKHJhbmdlMik7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCB0aGlzLmNoYXJkYXRhICE9ICddJykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjUiLCB0aGlzLm9mZnNldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGl0IHRoaXMgbG9vcAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIWVuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc2hvcnRoYW5kcy4uLgorICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTIpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8IHRoaXMuY2hhcmRhdGEgIT0gJy0nKSB7IC8vIEhlcmUgaXMgbm8gJy0nLgorICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCAnLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoaXMgJy0nIGlzIGEgZnJvbS10byB0b2tlbj8/CisgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBTa2lwcyAnLScKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdGhpcy5yZWFkKCkpID09IFRfRU9GKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjICctJyAnXScgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgdGhpcy5jaGFyZGF0YSA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnLScsICctJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGMgJy0nICctWycgLT4gJy0nIGlzIGEgc2luZ2xlLXJhbmdlLgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IFRfWE1MU0NIRU1BX0NDX1NVQlRSQUNUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoJy0nLCAnLScpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhbmdlZW5kID0gdGhpcy5jaGFyZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnWycpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNiIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZWVuZCA9PSAnXScpICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuNyIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZWVuZCA9IHRoaXMuZGVjb2RlRXNjYXBlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2suYWRkUmFuZ2UoYywgcmFuZ2VlbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3Rsb29wID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfRU9GKQorICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7CisgICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7CisgICAgICAgIC8vdG9rLmR1bXBSYW5nZXMoKTsKKyAgICAgICAgdGhpcy5zZXRDb250ZXh0KFNfTk9STUFMKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnXScKKworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKworICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlU2V0T3BlcmF0aW9ucygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorIAorICAgIFRva2VuIGdldFRva2VuRm9yU2hvcnRoYW5kKGludCBjaCkgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNEaWdpdCIsIHRydWUpOworICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzRGlnaXQiLCBmYWxzZSk7CisgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgdHJ1ZSk7CisgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNXb3JkIiwgZmFsc2UpOworICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzU3BhY2UiLCB0cnVlKTsKKyAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc1NwYWNlIiwgZmFsc2UpOworICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzTmFtZUNoYXIiLCB0cnVlKTsKKyAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIHJldHVybiBQYXJzZXJGb3JYTUxTY2hlbWEuZ2V0UmFuZ2UoInhtbDppc05hbWVDaGFyIiwgZmFsc2UpOworICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgcmV0dXJuIFBhcnNlckZvclhNTFNjaGVtYS5nZXRSYW5nZSgieG1sOmlzSW5pdGlhbE5hbWVDaGFyIiwgdHJ1ZSk7CisgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICByZXR1cm4gUGFyc2VyRm9yWE1MU2NoZW1hLmdldFJhbmdlKCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCBmYWxzZSk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogc2hvcnRoYW5kczogXFx1IitJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNikpOworICAgICAgICB9CisgICAgfQorICAgIGludCBkZWNvZGVFc2NhcGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQkFDS1NPTElEVVMpICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgIGNhc2UgJ24nOiAgYyA9ICdcbic7ICBicmVhazsgLy8gTElORSBGRUVEIFUrMDAwQQorICAgICAgICAgIGNhc2UgJ3InOiAgYyA9ICdccic7ICBicmVhazsgLy8gQ1JSSUFHRSBSRVRVUk4gVSswMDBECisgICAgICAgICAgY2FzZSAndCc6ICBjID0gJ1x0JzsgIGJyZWFrOyAvLyBIT1JJWk9OVEFMIFRBQlVMQVRJT04gVSswMDA5CisKKyAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQtMik7CisgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNSIsIHRoaXMub2Zmc2V0LTIpOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlcyA9IG51bGw7CisgICAgc3RhdGljIHByaXZhdGUgSGFzaHRhYmxlIHJhbmdlczIgPSBudWxsOworICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIFJhbmdlVG9rZW4gZ2V0UmFuZ2UoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcG9zaXRpdmUpIHsKKyAgICAgICAgaWYgKHJhbmdlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByYW5nZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICByYW5nZXMyID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIFNQQUNFUyk7CisgICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNTcGFjZSIsIHRvayk7CisgICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzU3BhY2UiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOworCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7CisgICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7CisgICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOworCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIERJR0lUUyk7CisgICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNEaWdpdCIsIHRvayk7CisgICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzRGlnaXQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOworCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOworICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKChUb2tlbilyYW5nZXMuZ2V0KCJ4bWw6aXNEaWdpdCIpKTsKKyAgICAgICAgICAgIHJhbmdlcy5wdXQoInhtbDppc1dvcmQiLCB0b2spOworICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc1dvcmQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOworCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIE5BTUVDSEFSUyk7CisgICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNOYW1lQ2hhciIsIHRvayk7CisgICAgICAgICAgICByYW5nZXMyLnB1dCgieG1sOmlzTmFtZUNoYXIiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvaykpOworCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgc2V0dXBSYW5nZSh0b2ssIExFVFRFUlMpOworICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCdfJywgJ18nKTsKKyAgICAgICAgICAgIHRvay5hZGRSYW5nZSgnOicsICc6Jyk7CisgICAgICAgICAgICByYW5nZXMucHV0KCJ4bWw6aXNJbml0aWFsTmFtZUNoYXIiLCB0b2spOworICAgICAgICAgICAgcmFuZ2VzMi5wdXQoInhtbDppc0luaXRpYWxOYW1lQ2hhciIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXModG9rKSk7CisgICAgICAgIH0KKyAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBwb3NpdGl2ZSA/IChSYW5nZVRva2VuKXJhbmdlcy5nZXQobmFtZSkKKyAgICAgICAgICAgIDogKFJhbmdlVG9rZW4pcmFuZ2VzMi5nZXQobmFtZSk7CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc2V0dXBSYW5nZShUb2tlbiByYW5nZSwgU3RyaW5nIHNyYykgeworICAgICAgICBpbnQgbGVuID0gc3JjLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW47ICBpICs9IDIpCisgICAgICAgICAgICByYW5nZS5hZGRSYW5nZShzcmMuY2hhckF0KGkpLCBzcmMuY2hhckF0KGkrMSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRVMgPSAiXHRcblxyXHIgICI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVDSEFSUyA9CisgICAgICAgICJcdTAwMmRcdTAwMmVcdTAwMzBcdTAwM2FcdTAwNDFcdTAwNWFcdTAwNWZcdTAwNWZcdTAwNjFcdTAwN2FcdTAwYjdcdTAwYjdcdTAwYzBcdTAwZDYiCisgICAgICAgICsiXHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4XHUwMTRhXHUwMTdlXHUwMTgwXHUwMWMzXHUwMWNkXHUwMWYwIgorICAgICAgICArIlx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMVx1MDJkMFx1MDJkMVx1MDMwMFx1MDM0NVx1MDM2MFx1MDM2MSIKKyAgICAgICAgKyJcdTAzODZcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGFcdTAzZGNcdTAzZGMiCisgICAgICAgICsiXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjXHUwNDVlXHUwNDgxIgorICAgICAgICArIlx1MDQ4M1x1MDQ4Nlx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKKyAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1OTFcdTA1YTFcdTA1YTNcdTA1YjlcdTA1YmJcdTA1YmRcdTA1YmZcdTA1YmYiCisgICAgICAgICsiXHUwNWMxXHUwNWMyXHUwNWM0XHUwNWM0XHUwNWQwXHUwNWVhXHUwNWYwXHUwNWYyXHUwNjIxXHUwNjNhXHUwNjQwXHUwNjUyXHUwNjYwXHUwNjY5IgorICAgICAgICArIlx1MDY3MFx1MDZiN1x1MDZiYVx1MDZiZVx1MDZjMFx1MDZjZVx1MDZkMFx1MDZkM1x1MDZkNVx1MDZlOFx1MDZlYVx1MDZlZFx1MDZmMFx1MDZmOSIKKyAgICAgICAgKyJcdTA5MDFcdTA5MDNcdTA5MDVcdTA5MzlcdTA5M2NcdTA5NGRcdTA5NTFcdTA5NTRcdTA5NThcdTA5NjNcdTA5NjZcdTA5NmZcdTA5ODFcdTA5ODMiCisgICAgICAgICsiXHUwOTg1XHUwOThjXHUwOThmXHUwOTkwXHUwOTkzXHUwOWE4XHUwOWFhXHUwOWIwXHUwOWIyXHUwOWIyXHUwOWI2XHUwOWI5XHUwOWJjXHUwOWJjIgorICAgICAgICArIlx1MDliZVx1MDljNFx1MDljN1x1MDljOFx1MDljYlx1MDljZFx1MDlkN1x1MDlkN1x1MDlkY1x1MDlkZFx1MDlkZlx1MDllM1x1MDllNlx1MDlmMSIKKyAgICAgICAgKyJcdTBhMDJcdTBhMDJcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjhcdTBhMmFcdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzYiCisgICAgICAgICsiXHUwYTM4XHUwYTM5XHUwYTNjXHUwYTNjXHUwYTNlXHUwYTQyXHUwYTQ3XHUwYTQ4XHUwYTRiXHUwYTRkXHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlIgorICAgICAgICArIlx1MGE2Nlx1MGE3NFx1MGE4MVx1MGE4M1x1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMCIKKyAgICAgICAgKyJcdTBhYjJcdTBhYjNcdTBhYjVcdTBhYjlcdTBhYmNcdTBhYzVcdTBhYzdcdTBhYzlcdTBhY2JcdTBhY2RcdTBhZTBcdTBhZTBcdTBhZTZcdTBhZWYiCisgICAgICAgICsiXHUwYjAxXHUwYjAzXHUwYjA1XHUwYjBjXHUwYjBmXHUwYjEwXHUwYjEzXHUwYjI4XHUwYjJhXHUwYjMwXHUwYjMyXHUwYjMzXHUwYjM2XHUwYjM5IgorICAgICAgICArIlx1MGIzY1x1MGI0M1x1MGI0N1x1MGI0OFx1MGI0Ylx1MGI0ZFx1MGI1Nlx1MGI1N1x1MGI1Y1x1MGI1ZFx1MGI1Zlx1MGI2MVx1MGI2Nlx1MGI2ZiIKKyAgICAgICAgKyJcdTBiODJcdTBiODNcdTBiODVcdTBiOGFcdTBiOGVcdTBiOTBcdTBiOTJcdTBiOTVcdTBiOTlcdTBiOWFcdTBiOWNcdTBiOWNcdTBiOWVcdTBiOWYiCisgICAgICAgICsiXHUwYmEzXHUwYmE0XHUwYmE4XHUwYmFhXHUwYmFlXHUwYmI1XHUwYmI3XHUwYmI5XHUwYmJlXHUwYmMyXHUwYmM2XHUwYmM4XHUwYmNhXHUwYmNkIgorICAgICAgICArIlx1MGJkN1x1MGJkN1x1MGJlN1x1MGJlZlx1MGMwMVx1MGMwM1x1MGMwNVx1MGMwY1x1MGMwZVx1MGMxMFx1MGMxMlx1MGMyOFx1MGMyYVx1MGMzMyIKKyAgICAgICAgKyJcdTBjMzVcdTBjMzlcdTBjM2VcdTBjNDRcdTBjNDZcdTBjNDhcdTBjNGFcdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjBcdTBjNjFcdTBjNjZcdTBjNmYiCisgICAgICAgICsiXHUwYzgyXHUwYzgzXHUwYzg1XHUwYzhjXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2JlXHUwY2M0IgorICAgICAgICArIlx1MGNjNlx1MGNjOFx1MGNjYVx1MGNjZFx1MGNkNVx1MGNkNlx1MGNkZVx1MGNkZVx1MGNlMFx1MGNlMVx1MGNlNlx1MGNlZlx1MGQwMlx1MGQwMyIKKyAgICAgICAgKyJcdTBkMDVcdTBkMGNcdTBkMGVcdTBkMTBcdTBkMTJcdTBkMjhcdTBkMmFcdTBkMzlcdTBkM2VcdTBkNDNcdTBkNDZcdTBkNDhcdTBkNGFcdTBkNGQiCisgICAgICAgICsiXHUwZDU3XHUwZDU3XHUwZDYwXHUwZDYxXHUwZDY2XHUwZDZmXHUwZTAxXHUwZTJlXHUwZTMwXHUwZTNhXHUwZTQwXHUwZTRlXHUwZTUwXHUwZTU5IgorICAgICAgICArIlx1MGU4MVx1MGU4Mlx1MGU4NFx1MGU4NFx1MGU4N1x1MGU4OFx1MGU4YVx1MGU4YVx1MGU4ZFx1MGU4ZFx1MGU5NFx1MGU5N1x1MGU5OVx1MGU5ZiIKKyAgICAgICAgKyJcdTBlYTFcdTBlYTNcdTBlYTVcdTBlYTVcdTBlYTdcdTBlYTdcdTBlYWFcdTBlYWJcdTBlYWRcdTBlYWVcdTBlYjBcdTBlYjlcdTBlYmJcdTBlYmQiCisgICAgICAgICsiXHUwZWMwXHUwZWM0XHUwZWM2XHUwZWM2XHUwZWM4XHUwZWNkXHUwZWQwXHUwZWQ5XHUwZjE4XHUwZjE5XHUwZjIwXHUwZjI5XHUwZjM1XHUwZjM1IgorICAgICAgICArIlx1MGYzN1x1MGYzN1x1MGYzOVx1MGYzOVx1MGYzZVx1MGY0N1x1MGY0OVx1MGY2OVx1MGY3MVx1MGY4NFx1MGY4Nlx1MGY4Ylx1MGY5MFx1MGY5NSIKKyAgICAgICAgKyJcdTBmOTdcdTBmOTdcdTBmOTlcdTBmYWRcdTBmYjFcdTBmYjdcdTBmYjlcdTBmYjlcdTEwYTBcdTEwYzVcdTEwZDBcdTEwZjZcdTExMDBcdTExMDAiCisgICAgICAgICsiXHUxMTAyXHUxMTAzXHUxMTA1XHUxMTA3XHUxMTA5XHUxMTA5XHUxMTBiXHUxMTBjXHUxMTBlXHUxMTEyXHUxMTNjXHUxMTNjXHUxMTNlXHUxMTNlIgorICAgICAgICArIlx1MTE0MFx1MTE0MFx1MTE0Y1x1MTE0Y1x1MTE0ZVx1MTE0ZVx1MTE1MFx1MTE1MFx1MTE1NFx1MTE1NVx1MTE1OVx1MTE1OVx1MTE1Zlx1MTE2MSIKKyAgICAgICAgKyJcdTExNjNcdTExNjNcdTExNjVcdTExNjVcdTExNjdcdTExNjdcdTExNjlcdTExNjlcdTExNmRcdTExNmVcdTExNzJcdTExNzNcdTExNzVcdTExNzUiCisgICAgICAgICsiXHUxMTllXHUxMTllXHUxMWE4XHUxMWE4XHUxMWFiXHUxMWFiXHUxMWFlXHUxMWFmXHUxMWI3XHUxMWI4XHUxMWJhXHUxMWJhXHUxMWJjXHUxMWMyIgorICAgICAgICArIlx1MTFlYlx1MTFlYlx1MTFmMFx1MTFmMFx1MTFmOVx1MTFmOVx1MWUwMFx1MWU5Ylx1MWVhMFx1MWVmOVx1MWYwMFx1MWYxNVx1MWYxOFx1MWYxZCIKKyAgICAgICAgKyJcdTFmMjBcdTFmNDVcdTFmNDhcdTFmNGRcdTFmNTBcdTFmNTdcdTFmNTlcdTFmNTlcdTFmNWJcdTFmNWJcdTFmNWRcdTFmNWRcdTFmNWZcdTFmN2QiCisgICAgICAgICsiXHUxZjgwXHUxZmI0XHUxZmI2XHUxZmJjXHUxZmJlXHUxZmJlXHUxZmMyXHUxZmM0XHUxZmM2XHUxZmNjXHUxZmQwXHUxZmQzXHUxZmQ2XHUxZmRiIgorICAgICAgICArIlx1MWZlMFx1MWZlY1x1MWZmMlx1MWZmNFx1MWZmNlx1MWZmY1x1MjBkMFx1MjBkY1x1MjBlMVx1MjBlMVx1MjEyNlx1MjEyNlx1MjEyYVx1MjEyYiIKKyAgICAgICAgKyJcdTIxMmVcdTIxMmVcdTIxODBcdTIxODJcdTMwMDVcdTMwMDVcdTMwMDdcdTMwMDdcdTMwMjFcdTMwMmZcdTMwMzFcdTMwMzVcdTMwNDFcdTMwOTQiCisgICAgICAgICsiXHUzMDk5XHUzMDlhXHUzMDlkXHUzMDllXHUzMGExXHUzMGZhXHUzMGZjXHUzMGZlXHUzMTA1XHUzMTJjXHU0ZTAwXHU5ZmE1XHVhYzAwXHVkN2EzIgorICAgICAgICArIiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVFRFUlMgPQorICAgICAgICAiXHUwMDQxXHUwMDVhXHUwMDYxXHUwMDdhXHUwMGMwXHUwMGQ2XHUwMGQ4XHUwMGY2XHUwMGY4XHUwMTMxXHUwMTM0XHUwMTNlXHUwMTQxXHUwMTQ4IgorICAgICAgICArIlx1MDE0YVx1MDE3ZVx1MDE4MFx1MDFjM1x1MDFjZFx1MDFmMFx1MDFmNFx1MDFmNVx1MDFmYVx1MDIxN1x1MDI1MFx1MDJhOFx1MDJiYlx1MDJjMSIKKyAgICAgICAgKyJcdTAzODZcdTAzODZcdTAzODhcdTAzOGFcdTAzOGNcdTAzOGNcdTAzOGVcdTAzYTFcdTAzYTNcdTAzY2VcdTAzZDBcdTAzZDZcdTAzZGFcdTAzZGEiCisgICAgICAgICsiXHUwM2RjXHUwM2RjXHUwM2RlXHUwM2RlXHUwM2UwXHUwM2UwXHUwM2UyXHUwM2YzXHUwNDAxXHUwNDBjXHUwNDBlXHUwNDRmXHUwNDUxXHUwNDVjIgorICAgICAgICArIlx1MDQ1ZVx1MDQ4MVx1MDQ5MFx1MDRjNFx1MDRjN1x1MDRjOFx1MDRjYlx1MDRjY1x1MDRkMFx1MDRlYlx1MDRlZVx1MDRmNVx1MDRmOFx1MDRmOSIKKyAgICAgICAgKyJcdTA1MzFcdTA1NTZcdTA1NTlcdTA1NTlcdTA1NjFcdTA1ODZcdTA1ZDBcdTA1ZWFcdTA1ZjBcdTA1ZjJcdTA2MjFcdTA2M2FcdTA2NDFcdTA2NGEiCisgICAgICAgICsiXHUwNjcxXHUwNmI3XHUwNmJhXHUwNmJlXHUwNmMwXHUwNmNlXHUwNmQwXHUwNmQzXHUwNmQ1XHUwNmQ1XHUwNmU1XHUwNmU2XHUwOTA1XHUwOTM5IgorICAgICAgICArIlx1MDkzZFx1MDkzZFx1MDk1OFx1MDk2MVx1MDk4NVx1MDk4Y1x1MDk4Zlx1MDk5MFx1MDk5M1x1MDlhOFx1MDlhYVx1MDliMFx1MDliMlx1MDliMiIKKyAgICAgICAgKyJcdTA5YjZcdTA5YjlcdTA5ZGNcdTA5ZGRcdTA5ZGZcdTA5ZTFcdTA5ZjBcdTA5ZjFcdTBhMDVcdTBhMGFcdTBhMGZcdTBhMTBcdTBhMTNcdTBhMjgiCisgICAgICAgICsiXHUwYTJhXHUwYTMwXHUwYTMyXHUwYTMzXHUwYTM1XHUwYTM2XHUwYTM4XHUwYTM5XHUwYTU5XHUwYTVjXHUwYTVlXHUwYTVlXHUwYTcyXHUwYTc0IgorICAgICAgICArIlx1MGE4NVx1MGE4Ylx1MGE4ZFx1MGE4ZFx1MGE4Zlx1MGE5MVx1MGE5M1x1MGFhOFx1MGFhYVx1MGFiMFx1MGFiMlx1MGFiM1x1MGFiNVx1MGFiOSIKKyAgICAgICAgKyJcdTBhYmRcdTBhYmRcdTBhZTBcdTBhZTBcdTBiMDVcdTBiMGNcdTBiMGZcdTBiMTBcdTBiMTNcdTBiMjhcdTBiMmFcdTBiMzBcdTBiMzJcdTBiMzMiCisgICAgICAgICsiXHUwYjM2XHUwYjM5XHUwYjNkXHUwYjNkXHUwYjVjXHUwYjVkXHUwYjVmXHUwYjYxXHUwYjg1XHUwYjhhXHUwYjhlXHUwYjkwXHUwYjkyXHUwYjk1IgorICAgICAgICArIlx1MGI5OVx1MGI5YVx1MGI5Y1x1MGI5Y1x1MGI5ZVx1MGI5Zlx1MGJhM1x1MGJhNFx1MGJhOFx1MGJhYVx1MGJhZVx1MGJiNVx1MGJiN1x1MGJiOSIKKyAgICAgICAgKyJcdTBjMDVcdTBjMGNcdTBjMGVcdTBjMTBcdTBjMTJcdTBjMjhcdTBjMmFcdTBjMzNcdTBjMzVcdTBjMzlcdTBjNjBcdTBjNjFcdTBjODVcdTBjOGMiCisgICAgICAgICsiXHUwYzhlXHUwYzkwXHUwYzkyXHUwY2E4XHUwY2FhXHUwY2IzXHUwY2I1XHUwY2I5XHUwY2RlXHUwY2RlXHUwY2UwXHUwY2UxXHUwZDA1XHUwZDBjIgorICAgICAgICArIlx1MGQwZVx1MGQxMFx1MGQxMlx1MGQyOFx1MGQyYVx1MGQzOVx1MGQ2MFx1MGQ2MVx1MGUwMVx1MGUyZVx1MGUzMFx1MGUzMFx1MGUzMlx1MGUzMyIKKyAgICAgICAgKyJcdTBlNDBcdTBlNDVcdTBlODFcdTBlODJcdTBlODRcdTBlODRcdTBlODdcdTBlODhcdTBlOGFcdTBlOGFcdTBlOGRcdTBlOGRcdTBlOTRcdTBlOTciCisgICAgICAgICsiXHUwZTk5XHUwZTlmXHUwZWExXHUwZWEzXHUwZWE1XHUwZWE1XHUwZWE3XHUwZWE3XHUwZWFhXHUwZWFiXHUwZWFkXHUwZWFlXHUwZWIwXHUwZWIwIgorICAgICAgICArIlx1MGViMlx1MGViM1x1MGViZFx1MGViZFx1MGVjMFx1MGVjNFx1MGY0MFx1MGY0N1x1MGY0OVx1MGY2OVx1MTBhMFx1MTBjNVx1MTBkMFx1MTBmNiIKKyAgICAgICAgKyJcdTExMDBcdTExMDBcdTExMDJcdTExMDNcdTExMDVcdTExMDdcdTExMDlcdTExMDlcdTExMGJcdTExMGNcdTExMGVcdTExMTJcdTExM2NcdTExM2MiCisgICAgICAgICsiXHUxMTNlXHUxMTNlXHUxMTQwXHUxMTQwXHUxMTRjXHUxMTRjXHUxMTRlXHUxMTRlXHUxMTUwXHUxMTUwXHUxMTU0XHUxMTU1XHUxMTU5XHUxMTU5IgorICAgICAgICArIlx1MTE1Zlx1MTE2MVx1MTE2M1x1MTE2M1x1MTE2NVx1MTE2NVx1MTE2N1x1MTE2N1x1MTE2OVx1MTE2OVx1MTE2ZFx1MTE2ZVx1MTE3Mlx1MTE3MyIKKyAgICAgICAgKyJcdTExNzVcdTExNzVcdTExOWVcdTExOWVcdTExYThcdTExYThcdTExYWJcdTExYWJcdTExYWVcdTExYWZcdTExYjdcdTExYjhcdTExYmFcdTExYmEiCisgICAgICAgICsiXHUxMWJjXHUxMWMyXHUxMWViXHUxMWViXHUxMWYwXHUxMWYwXHUxMWY5XHUxMWY5XHUxZTAwXHUxZTliXHUxZWEwXHUxZWY5XHUxZjAwXHUxZjE1IgorICAgICAgICArIlx1MWYxOFx1MWYxZFx1MWYyMFx1MWY0NVx1MWY0OFx1MWY0ZFx1MWY1MFx1MWY1N1x1MWY1OVx1MWY1OVx1MWY1Ylx1MWY1Ylx1MWY1ZFx1MWY1ZCIKKyAgICAgICAgKyJcdTFmNWZcdTFmN2RcdTFmODBcdTFmYjRcdTFmYjZcdTFmYmNcdTFmYmVcdTFmYmVcdTFmYzJcdTFmYzRcdTFmYzZcdTFmY2NcdTFmZDBcdTFmZDMiCisgICAgICAgICsiXHUxZmQ2XHUxZmRiXHUxZmUwXHUxZmVjXHUxZmYyXHUxZmY0XHUxZmY2XHUxZmZjXHUyMTI2XHUyMTI2XHUyMTJhXHUyMTJiXHUyMTJlXHUyMTJlIgorICAgICAgICArIlx1MjE4MFx1MjE4Mlx1MzAwN1x1MzAwN1x1MzAyMVx1MzAyOVx1MzA0MVx1MzA5NFx1MzBhMVx1MzBmYVx1MzEwNVx1MzEyY1x1NGUwMFx1OWZhNSIKKyAgICAgICAgKyJcdWFjMDBcdWQ3YTMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdJVFMgPQorICAgICAgICAiXHUwMDMwXHUwMDM5XHUwNjYwXHUwNjY5XHUwNkYwXHUwNkY5XHUwOTY2XHUwOTZGXHUwOUU2XHUwOUVGXHUwQTY2XHUwQTZGXHUwQUU2XHUwQUVGIgorICAgICAgICArIlx1MEI2Nlx1MEI2Rlx1MEJFN1x1MEJFRlx1MEM2Nlx1MEM2Rlx1MENFNlx1MENFRlx1MEQ2Nlx1MEQ2Rlx1MEU1MFx1MEU1OVx1MEVEMFx1MEVEOSIKKyAgICAgICAgKyJcdTBGMjBcdTBGMjkiOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0IGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjExNjcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFQURNRS50eHQKQEAgLTAsMCArMSwxMSBAQAorVGhpcyBpcyBhbiBpc29sYXRlZCBkaXJlY3RvcnkgdGhhdCB3YXMgdGFrZW4gZnJvbSB0aGUKK0FwYWNoZSBYZXJjZXMtSiAyLjAgcHJvamVjdC4KKworSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtb2RpZmljYXRpb25zOgorCisoMSkgYSBjaGFuZ2UgaW4gbmFtZXNwYWNlLgorKDIpIHRoZSBhZGRpdGlvbiBvZiBhIFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uIGNsYXNzIGZvciBmYXN0CisgICAgZGV0ZWN0aW9uIG9mIE5DTkFNRSwgZXRjLgorCitObyB4YmVhbiBjb2RlIG91dHNpZGUgdGhpcyBkaXJlY3Rvcnkgb3Igb3RoZXIgZGlyZWN0b3JpZXMgd2l0aAorc2ltaWxhciBSRUFETUUgbm90aWNlcyB3YXMgdGFrZW4gZnJvbSBBcGFjaGUuCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JFVXRpbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBkZDJlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SRVV0aWwuamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCitpbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOworCitwdWJsaWMgZmluYWwgY2xhc3MgUkVVdGlsIHsKKyAgICBwcml2YXRlIFJFVXRpbCgpIHsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgaW50IGNvbXBvc2VGcm9tU3Vycm9nYXRlcyhpbnQgaGlnaCwgaW50IGxvdykgeworICAgICAgICByZXR1cm4gMHgxMDAwMCArICgoaGlnaC0weGQ4MDApPDwxMCkgKyBsb3ctMHhkYzAwOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG93U3Vycm9nYXRlKGludCBjaCkgeworICAgICAgICByZXR1cm4gKGNoICYgMHhmYzAwKSA9PSAweGRjMDA7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGludCBjaCkgeworICAgICAgICByZXR1cm4gKGNoICYgMHhmYzAwKSA9PSAweGQ4MDA7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZWNvbXBvc2VUb1N1cnJvZ2F0ZXMoaW50IGNoKSB7CisgICAgICAgIGNoYXJbXSBjaHMgPSBuZXcgY2hhclsyXTsKKyAgICAgICAgY2ggLT0gMHgxMDAwMDsKKyAgICAgICAgY2hzWzBdID0gKGNoYXIpKChjaD4+MTApKzB4ZDgwMCk7CisgICAgICAgIGNoc1sxXSA9IChjaGFyKSgoY2gmMHgzZmYpKzB4ZGMwMCk7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNocyk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzdWJzdHJpbmcoQ2hhcmFjdGVySXRlcmF0b3IgaXRlcmF0b3IsIGludCBiZWdpbiwgaW50IGVuZCkgeworICAgICAgICBjaGFyW10gc3JjID0gbmV3IGNoYXJbZW5kLWJlZ2luXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgc3JjLmxlbmd0aDsgIGkgKyspCisgICAgICAgICAgICBzcmNbaV0gPSBpdGVyYXRvci5zZXRJbmRleChpK2JlZ2luKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc3JjKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBzdGF0aWMgZmluYWwgaW50IGdldE9wdGlvblZhbHVlKGludCBjaCkgeworICAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLk1VTFRJUExFX0xJTkVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5TSU5HTEVfTElORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uRVhURU5ERURfQ09NTUVOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIHJldCA9IFJlZ3VsYXJFeHByZXNzaW9uLlVOSUNPREVfV09SRF9CT1VOREFSWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICByZXQgPSBSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgcmV0ID0gUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgaW50IHBhcnNlT3B0aW9ucyhTdHJpbmcgb3B0cykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG9wdHMgPT0gbnVsbCkgIHJldHVybiAwOworICAgICAgICBpbnQgb3B0aW9ucyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG9wdHMubGVuZ3RoKCk7ICBpICsrKSB7CisgICAgICAgICAgICBpbnQgdiA9IGdldE9wdGlvblZhbHVlKG9wdHMuY2hhckF0KGkpKTsKKyAgICAgICAgICAgIGlmICh2ID09IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmtub3duIE9wdGlvbjogIitvcHRzLnN1YnN0cmluZyhpKSwgLTEpOworICAgICAgICAgICAgb3B0aW9ucyB8PSB2OworICAgICAgICB9CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3JlYXRlT3B0aW9uU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoOSk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlBST0hJQklUX0ZJWEVEX1NUUklOR19PUFRJTUlaQVRJT04pICE9IDApCisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ0YnKTsKKyAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uUFJPSElCSVRfSEVBRF9DSEFSQUNURVJfT1BUSU1JWkFUSU9OKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdIJyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdYJyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdpJyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLk1VTFRJUExFX0xJTkVTKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdtJyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlNJTkdMRV9MSU5FKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSdzJyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd1Jyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlVOSUNPREVfV09SRF9CT1VOREFSWSkgIT0gMCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikndycpOworICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5FWFRFTkRFRF9DT01NRU5UKSAhPSAwKQorICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSd4Jyk7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJlZ3VsYXJFeHByZXNzaW9uLlNQRUNJQUxfQ09NTUEpICE9IDApCisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJywnKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkuaW50ZXJuKCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgc3RhdGljIFN0cmluZyBzdHJpcEV4dGVuZGVkQ29tbWVudChTdHJpbmcgcmVnZXgpIHsKKyAgICAgICAgaW50IGxlbiA9IHJlZ2V4Lmxlbmd0aCgpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbikgeworICAgICAgICAgICAgaW50IGNoID0gcmVnZXguY2hhckF0KG9mZnNldCsrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIGEgd2hpdGUgc3BhY2UuCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdcZicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnICcpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnIycpIHsgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzIGNocmFjdGVycyBiZXR3ZWVuICcjJyBhbmQgYSBsaW5lIGVuZC4KKyAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gcmVnZXguY2hhckF0KG9mZnNldCsrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXBzIGFuIGVzY2FwZWQgd2hpdGUgc3BhY2UuCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiBvZmZzZXQgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoKG5leHQgPSByZWdleC5jaGFyQXQob2Zmc2V0KSkgPT0gJyMnCisgICAgICAgICAgICAgICAgICAgIHx8IG5leHQgPT0gJ1x0JyB8fCBuZXh0ID09ICdcbicgfHwgbmV4dCA9PSAnXGYnCisgICAgICAgICAgICAgICAgICAgIHx8IG5leHQgPT0gJ1xyJyB8fCBuZXh0ID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKW5leHQpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciknXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciluZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIGlzLgorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBTYW1wbGUgZW50cnkuCisgICAgICogPGRpdj5Vc2FnZTogPEtCRD5vcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5SRVV0aWwgJmx0O3JlZ2V4Jmd0OyAmbHQ7c3RyaW5nJmd0OzwvS0JEPjwvZGl2PgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIG9wdGlvbnMgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBudWxsOworICAgICAgICAgICAgaWYoIGFyZ3YubGVuZ3RoID09IDAgKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6VXNhZ2U6IGphdmEgUkVVdGlsIC1pfC1tfC1zfC11fC13fC1YIHJlZ3VsYXJFeHByZXNzaW9uIFN0cmluZyIgKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCggMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgYXJndi5sZW5ndGg7ICBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3ZbaV0ubGVuZ3RoKCkgPT0gMCB8fCBhcmd2W2ldLmNoYXJBdCgwKSAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBhcmd2W2ldOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGFyZ3ZbaV07CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5uZWNlc3Nhcnk6ICIrYXJndltpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLWkiKSkgeworICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJpIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItbSIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gIm0iOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAicyI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd2W2ldLmVxdWFscygiLXUiKSkgeworICAgICAgICAgICAgICAgICAgICBvcHRpb25zICs9ICJ1IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItdyIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgKz0gInciOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1YIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyArPSAiWCI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIG9wdGlvbjogIithcmd2W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByZWcgPSBuZXcgUmVndWxhckV4cHJlc3Npb24ocGF0dGVybiwgb3B0aW9ucyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZ3VsYXJFeHByZXNzaW9uOiAiK3JlZyk7CisgICAgICAgICAgICBNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaCgpOworICAgICAgICAgICAgcmVnLm1hdGNoZXModGFyZ2V0LCBtYXRjaCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBtYXRjaC5nZXROdW1iZXJPZkdyb3VwcygpOyAgaSArKykgeworICAgICAgICAgICAgICAgIGlmIChpID09IDAgKSAgU3lzdGVtLm91dC5wcmludCgiTWF0Y2hlZCByYW5nZSBmb3IgdGhlIHdob2xlIHBhdHRlcm46ICIpOworICAgICAgICAgICAgICAgIGVsc2UgU3lzdGVtLm91dC5wcmludCgiWyIraSsiXTogIik7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmdldEJlZ2lubmluZyhpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLTEiKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChtYXRjaC5nZXRCZWdpbm5pbmcoaSkrIiwgIittYXRjaC5nZXRFbmQoaSkrIiwgIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCIiK21hdGNoLmdldENhcHR1cmVkVGV4dChpKSsiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigib3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUGFyc2VFeGNlcHRpb246ICIrcGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW5kZW50ID0gIiAgICAgICAgIjsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oaW5kZW50K3BhdHRlcm4pOworICAgICAgICAgICAgICAgIGludCBsb2MgPSBwZS5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChsb2MgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KGluZGVudCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGxvYzsgIGkgKyspICBTeXN0ZW0uZXJyLnByaW50KCItIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFU0laRSA9IDIwOworICAgIHN0YXRpYyBmaW5hbCBSZWd1bGFyRXhwcmVzc2lvbltdIHJlZ2V4Q2FjaGUgPSBuZXcgUmVndWxhckV4cHJlc3Npb25bQ0FDSEVTSVpFXTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2UuCisgICAgICogVGhpcyBtZXRob2QgY2FjaGVzIGNyZWF0ZWQgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHNlZXEgUmVndWxhckV4cHJlc3Npb24jUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlZ3VsYXJFeHByZXNzaW9uIGNyZWF0ZVJlZ2V4KFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgb3B0aW9ucykKKyAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgUmVndWxhckV4cHJlc3Npb24gcmUgPSBudWxsOworICAgICAgICBpbnQgaW50T3B0aW9ucyA9IFJFVXRpbC5wYXJzZU9wdGlvbnMob3B0aW9ucyk7CisgICAgICAgIHN5bmNocm9uaXplZCAoUkVVdGlsLnJlZ2V4Q2FjaGUpIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBSRVV0aWwuQ0FDSEVTSVpFOyAgaSArKykgeworICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIGNhY2hlZCA9IFJFVXRpbC5yZWdleENhY2hlW2ldOworICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkLmVxdWFscyhwYXR0ZXJuLCBpbnRPcHRpb25zKSkgeworICAgICAgICAgICAgICAgICAgICByZSA9IGNhY2hlZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoUkVVdGlsLnJlZ2V4Q2FjaGUsIDAsIFJFVXRpbC5yZWdleENhY2hlLCAxLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgUkVVdGlsLnJlZ2V4Q2FjaGVbMF0gPSByZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHBhdHRlcm4sIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoUkVVdGlsLnJlZ2V4Q2FjaGUsIDAsIFJFVXRpbC5yZWdleENhY2hlLCAxLCBSRVV0aWwuQ0FDSEVTSVpFLTEpOworICAgICAgICAgICAgICAgIFJFVXRpbC5yZWdleENhY2hlWzBdID0gcmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHNlZSBSZWd1bGFyRXhwcmVzc2lvbiNtYXRjaGVzKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHJlZ2V4LCBTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gUkVVdGlsLmNyZWF0ZVJlZ2V4KHJlZ2V4LCBudWxsKS5tYXRjaGVzKHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAc2VlIFJlZ3VsYXJFeHByZXNzaW9uI21hdGNoZXMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcmVnZXgsIFN0cmluZyBvcHRpb25zLCBTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gUkVVdGlsLmNyZWF0ZVJlZ2V4KHJlZ2V4LCBvcHRpb25zKS5tYXRjaGVzKHRhcmdldCk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZU1ldGEoU3RyaW5nIGxpdGVyYWwpIHsKKyAgICAgICAgaW50IGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBsZW47ICBpICsrKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBsaXRlcmFsLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgiLiorP3tbKCl8XFxeJCIuaW5kZXhPZihjaCkgPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGkrKGxlbi1pKSoyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSAgYnVmZmVyLmFwcGVuZChsaXRlcmFsLnN1YnN0cmluZygwLCBpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpJ1xcJyk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhciljaCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIgIT0gbnVsbCA/IGJ1ZmZlci50b1N0cmluZygpIDogbGl0ZXJhbDsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBzdGF0aWMgdm9pZCBkdW1wU3RyaW5nKFN0cmluZyB2KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHYubGVuZ3RoKCk7ICBpICsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcodi5jaGFyQXQoaSkpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JhbmdlVG9rZW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmFuZ2VUb2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjdiOTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JhbmdlVG9rZW4uamF2YQpAQCAtMCwwICsxLDYwNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNoYXJhY3RlciBjbGFzcyBzdWNoIGFzIFthLXpdIG9yIGEgcGVyaW9kLgorICovCitmaW5hbCBjbGFzcyBSYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICBpbnRbXSByYW5nZXM7CisgICAgYm9vbGVhbiBzb3J0ZWQ7CisgICAgYm9vbGVhbiBjb21wYWN0ZWQ7CisgICAgUmFuZ2VUb2tlbiBpY2FzZUNhY2hlID0gbnVsbDsKKyAgICBpbnRbXSBtYXAgPSBudWxsOworICAgIGludCBub25NYXBJbmRleDsKKworICAgIFJhbmdlVG9rZW4oaW50IHR5cGUpIHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKKyAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBSQU5HRSBvciBOUkFOR0UKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKKyAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIlRva2VuI2FkZFJhbmdlKCk6ICIrc3RhcnQrIiAiK2VuZCk7CisgICAgICAgIGludCByMSwgcjI7CisgICAgICAgIGlmIChzdGFydCA8PSBlbmQpIHsKKyAgICAgICAgICAgIHIxID0gc3RhcnQ7CisgICAgICAgICAgICByMiA9IGVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIxID0gZW5kOworICAgICAgICAgICAgcjIgPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgdGhpcy5yYW5nZXNbMF0gPSByMTsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzWzFdID0gcjI7CisgICAgICAgICAgICB0aGlzLnNldFNvcnRlZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcyA9IHRoaXMucmFuZ2VzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1twb3MtMV0rMSA9PSByMSkgeworICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3Bvcy0xXSA9IHIyOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludFtdIHRlbXAgPSBuZXcgaW50W3BvcysyXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5yYW5nZXMsIDAsIHRlbXAsIDAsIHBvcyk7CisgICAgICAgICAgICB0aGlzLnJhbmdlcyA9IHRlbXA7CisgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbcG9zLTFdID49IHIxKQorICAgICAgICAgICAgICAgIHRoaXMuc2V0U29ydGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzW3BvcysrXSA9IHIxOworICAgICAgICAgICAgdGhpcy5yYW5nZXNbcG9zXSA9IHIyOworICAgICAgICAgICAgaWYgKCF0aGlzLnNvcnRlZCkKKyAgICAgICAgICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1NvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkOworICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0U29ydGVkKGJvb2xlYW4gc29ydCkgeworICAgICAgICB0aGlzLnNvcnRlZCA9IHNvcnQ7CisgICAgICAgIGlmICghc29ydCkgIHRoaXMuY29tcGFjdGVkID0gZmFsc2U7CisgICAgfQorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0NvbXBhY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFjdGVkOworICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0Q29tcGFjdGVkKCkgeworICAgICAgICB0aGlzLmNvbXBhY3RlZCA9IHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc29ydFJhbmdlcygpIHsKKyAgICAgICAgaWYgKHRoaXMuaXNTb3J0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRoaXMucmFuZ2VzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJEbyBzb3J0aW5nOiAiK3RoaXMucmFuZ2VzLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1YmJsZSBzb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaHk/IC0tIEluIG1hbnkgY2FzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMucmFuZ2VzIGhhcyBmZXcgZWxlbWVudHMuCisgICAgICAgIGZvciAoaW50IGkgPSB0aGlzLnJhbmdlcy5sZW5ndGgtNDsgIGkgPj0gMDsgIGkgLT0gMikgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7ICBqIDw9IGk7ICBqICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbal0gPiB0aGlzLnJhbmdlc1tqKzJdCisgICAgICAgICAgICAgICAgICAgIHx8IHRoaXMucmFuZ2VzW2pdID09IHRoaXMucmFuZ2VzW2orMl0gJiYgdGhpcy5yYW5nZXNbaisxXSA+IHRoaXMucmFuZ2VzW2orM10pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaisyXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaisyXSA9IHRoaXMucmFuZ2VzW2pdOworICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tqXSA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGhpcy5yYW5nZXNbaiszXTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbaiszXSA9IHRoaXMucmFuZ2VzW2orMV07CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2orMV0gPSB0bXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoaXMucmFuZ2VzIGlzIHNvcnRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYWN0UmFuZ2VzKCkgeworICAgICAgICBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsIHx8IHRoaXMucmFuZ2VzLmxlbmd0aCA8PSAyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAodGhpcy5pc0NvbXBhY3RlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2Ygd3JpdGluZyBwb2ludAorICAgICAgICBpbnQgdGFyZ2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgcHJvY2Vzc2luZyBwb2ludAorCisgICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChiYXNlICE9IHRhcmdldCkgeworICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2VdID0gdGhpcy5yYW5nZXNbdGFyZ2V0KytdOworICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW2Jhc2UrMV0gPSB0aGlzLnJhbmdlc1t0YXJnZXQrK107CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0YXJnZXQgKz0gMjsKKyAgICAgICAgICAgIGludCBiYXNlZW5kID0gdGhpcy5yYW5nZXNbYmFzZSsxXTsKKyAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZWVuZCsxIDwgdGhpcy5yYW5nZXNbdGFyZ2V0XSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VlbmQrMSA9PSB0aGlzLnJhbmdlc1t0YXJnZXRdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZWVuZCA+PSB0aGlzLnJhbmdlc1t0YXJnZXQrMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IENvbXBhY3Rpb246IFsiK3RoaXMucmFuZ2VzW2Jhc2VdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsICIrdGhpcy5yYW5nZXNbYmFzZSsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSwgWyIrdGhpcy5yYW5nZXNbdGFyZ2V0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW3RhcmdldCsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAtPiBbIit0aGlzLnJhbmdlc1tiYXNlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYXNlZW5kIDwgdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVG9rZW4jY29tcGFjdFJhbmdlcygpOiBDb21wYWN0aW9uOiBbIit0aGlzLnJhbmdlc1tiYXNlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCAiK3RoaXMucmFuZ2VzW2Jhc2UrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0sIFsiK3RoaXMucmFuZ2VzW3RhcmdldF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gLT4gWyIrdGhpcy5yYW5nZXNbYmFzZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwgIit0aGlzLnJhbmdlc1t0YXJnZXQrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5nZXNbYmFzZSsxXSA9IHRoaXMucmFuZ2VzW3RhcmdldCsxXTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZWVuZCA9IHRoaXMucmFuZ2VzW2Jhc2UrMV07CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNjb21wYWN0UmFuZ2VzKCk6IEludGVybmVsIEVycm9yOiBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbYmFzZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0aGlzLnJhbmdlc1tiYXNlKzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSBbIit0aGlzLnJhbmdlc1t0YXJnZXRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbdGFyZ2V0KzFdKyJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgYmFzZSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2UgIT0gdGhpcy5yYW5nZXMubGVuZ3RoKSB7CisgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2Jhc2VdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLnJhbmdlcywgMCwgcmVzdWx0LCAwLCBiYXNlKTsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHRoaXMuc2V0Q29tcGFjdGVkKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VSYW5nZXMoVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKKyAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7CisgICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMuaWNhc2VDYWNoZSA9IG51bGw7CisgICAgICAgIHRoaXMuc2V0U29ydGVkKHRydWUpOworICAgICAgICBpZiAodGhpcy5yYW5nZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3Rvay5yYW5nZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG9rLnJhbmdlcywgMCwgdGhpcy5yYW5nZXMsIDAsIHRvay5yYW5nZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RoaXMucmFuZ2VzLmxlbmd0aCt0b2sucmFuZ2VzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMCwgayA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoIHx8IGogPCB0b2sucmFuZ2VzLmxlbmd0aDspIHsKKyAgICAgICAgICAgIGlmIChpID49IHRoaXMucmFuZ2VzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOworICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOworICAgICAgICAgICAgfSBlbHNlIGlmIChqID49IHRvay5yYW5nZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOworICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdGhpcy5yYW5nZXNbaSsrXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLnJhbmdlc1tqXSA8IHRoaXMucmFuZ2VzW2ldCisgICAgICAgICAgICAgICAgICAgICAgIHx8IHRvay5yYW5nZXNbal0gPT0gdGhpcy5yYW5nZXNbaV0gJiYgdG9rLnJhbmdlc1tqKzFdIDwgdGhpcy5yYW5nZXNbaSsxXSkgeworICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOworICAgICAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdG9rLnJhbmdlc1tqKytdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaysrXSA9IHRoaXMucmFuZ2VzW2krK107CisgICAgICAgICAgICAgICAgcmVzdWx0W2srK10gPSB0aGlzLnJhbmdlc1tpKytdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMucmFuZ2VzID0gcmVzdWx0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN1YnRyYWN0UmFuZ2VzKFRva2VuIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbi50eXBlID09IE5SQU5HRSkgeworICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3RSYW5nZXModG9rZW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47CisgICAgICAgIGlmICh0b2sucmFuZ2VzID09IG51bGwgfHwgdGhpcy5yYW5nZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGhpcy5pY2FzZUNhY2hlID0gbnVsbDsKKyAgICAgICAgdGhpcy5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRoaXMuY29tcGFjdFJhbmdlcygpOworICAgICAgICB0b2suc29ydFJhbmdlcygpOworICAgICAgICB0b2suY29tcGFjdFJhbmdlcygpOworCisgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJUb2tlbiNzdWJzdHJhY3RSYW5nZXMoKTogRW50cnk6ICIrdGhpcy5yYW5nZXMubGVuZ3RoKyIsICIrdG9rLnJhbmdlcy5sZW5ndGgpOworCisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbdGhpcy5yYW5nZXMubGVuZ3RoK3Rvay5yYW5nZXMubGVuZ3RoXTsKKyAgICAgICAgaW50IHdwID0gMCwgc3JjID0gMCwgc3ViID0gMDsKKyAgICAgICAgd2hpbGUgKHNyYyA8IHRoaXMucmFuZ2VzLmxlbmd0aCAmJiBzdWIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IHNyY2JlZ2luID0gdGhpcy5yYW5nZXNbc3JjXTsKKyAgICAgICAgICAgIGludCBzcmNlbmQgPSB0aGlzLnJhbmdlc1tzcmMrMV07CisgICAgICAgICAgICBpbnQgc3ViYmVnaW4gPSB0b2sucmFuZ2VzW3N1Yl07CisgICAgICAgICAgICBpbnQgc3ViZW5kID0gdG9rLnJhbmdlc1tzdWIrMV07CisgICAgICAgICAgICBpZiAoc3JjZW5kIDwgc3ViYmVnaW4pIHsgICAgICAgICAgICAvLyBOb3Qgb3ZlcmxhcHBlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiBvLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgby0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBvLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKKyAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSB0aGlzLnJhbmdlc1tzcmMrK107CisgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjKytdOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNlbmQgPj0gc3ViYmVnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgJiYgc3JjYmVnaW4gPD0gc3ViZW5kKSB7IC8vIE92ZXJsYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS0tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4gJiYgc3JjZW5kIDw9IHN1YmVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICBvLS0tLS0tLS0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3ViCisgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViYmVnaW4gPD0gc3JjYmVnaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzogICAgby0tLS0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ViOiAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYyg9cmVzKQorICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7CisgICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjZW5kIDw9IHN1YmVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjOiAgICBvLS0tLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWI6ICAgICAgICAgIG8tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICBvLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzdWIKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjYmVnaW47CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHN1YmJlZ2luLTE7CisgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgIG8tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YjogICAgICBvLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgby1vICAgIG8tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjKD1yaWdodCByZXMpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyY2JlZ2luOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzdWJiZWdpbi0xOworICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmNdID0gc3ViZW5kKzE7CisgICAgICAgICAgICAgICAgICAgIHN1YiArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViZW5kIDwgc3JjYmVnaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmM6ICAgICAgICAgIG8tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Yjogby0tLS1vCisgICAgICAgICAgICAgICAgc3ViICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNzdWJ0cmFjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIrdGhpcy5yYW5nZXNbc3JjXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLCIrdGhpcy5yYW5nZXNbc3JjKzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJdIC0gWyIrdG9rLnJhbmdlc1tzdWJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3N1YisxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChzcmMgPCB0aGlzLnJhbmdlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKKyAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYysrXTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJhbmdlcyA9IG5ldyBpbnRbd3BdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdCwgMCwgdGhpcy5yYW5nZXMsIDAsIHdwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMucmFuZ2VzIGlzIHNvcnRlZCBhbmQgY29tcGFjdGVkLgorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0b2sgSWdub3JlIHdoZXRoZXIgaXQgaXMgTlJBTkdFIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnRlcnNlY3RSYW5nZXMoVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSAoUmFuZ2VUb2tlbil0b2tlbjsKKyAgICAgICAgaWYgKHRvay5yYW5nZXMgPT0gbnVsbCB8fCB0aGlzLnJhbmdlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBudWxsOworICAgICAgICB0aGlzLnNvcnRSYW5nZXMoKTsKKyAgICAgICAgdGhpcy5jb21wYWN0UmFuZ2VzKCk7CisgICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7CisKKyAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFt0aGlzLnJhbmdlcy5sZW5ndGgrdG9rLnJhbmdlcy5sZW5ndGhdOworICAgICAgICBpbnQgd3AgPSAwLCBzcmMxID0gMCwgc3JjMiA9IDA7CisgICAgICAgIHdoaWxlIChzcmMxIDwgdGhpcy5yYW5nZXMubGVuZ3RoICYmIHNyYzIgPCB0b2sucmFuZ2VzLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IHNyYzFiZWdpbiA9IHRoaXMucmFuZ2VzW3NyYzFdOworICAgICAgICAgICAgaW50IHNyYzFlbmQgPSB0aGlzLnJhbmdlc1tzcmMxKzFdOworICAgICAgICAgICAgaW50IHNyYzJiZWdpbiA9IHRvay5yYW5nZXNbc3JjMl07CisgICAgICAgICAgICBpbnQgc3JjMmVuZCA9IHRvay5yYW5nZXNbc3JjMisxXTsKKyAgICAgICAgICAgIGlmIChzcmMxZW5kIDwgc3JjMmJlZ2luKSB7ICAgICAgICAgIC8vIE5vdCBvdmVybGFwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiBvLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgIG8tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSBzcmMyCisgICAgICAgICAgICAgICAgc3JjMSArPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMxZW5kID49IHNyYzJiZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAmJiBzcmMxYmVnaW4gPD0gc3JjMmVuZCkgeyAvLyBPdmVybGFwcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgIG8tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjMjogICAgICAgICAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgby0tLS0tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICBpZiAoc3JjMmJlZ2luIDw9IHNyYzJiZWdpbiAmJiBzcmMxZW5kIDw9IHNyYzJlbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLS0tLS0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzOiAgICAgby0tLS0tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2Ugc3JjMgorICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxYmVnaW47CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzFlbmQ7CisgICAgICAgICAgICAgICAgICAgIHNyYzEgKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYzJiZWdpbiA8PSBzcmMxYmVnaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICBvLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgIG8tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHRoZSByZXN0IG9mIHNyYzEKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMWJlZ2luOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyZW5kOworICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlc1tzcmMxXSA9IHNyYzJlbmQrMTsKKyAgICAgICAgICAgICAgICAgICAgc3JjMiArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMWVuZCA8PSBzcmMyZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMxOiAgICBvLS0tLS0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmMyOiAgICAgICAgICBvLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlczogICAgICAgICAgIG8tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHNyYzIKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gc3JjMmJlZ2luOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMxZW5kOworICAgICAgICAgICAgICAgICAgICBzcmMxICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgIG8tLS0tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6ICAgICAgby0tLS1vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXM6ICAgICAgIG8tLS0tbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIHJlc3Qgb2Ygc3JjMQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbd3ArK10gPSBzcmMyYmVnaW47CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHNyYzJlbmQ7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VzW3NyYzFdID0gc3JjMmVuZCsxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjMmVuZCA8IHNyYzFiZWdpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IG92ZXJsYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzE6ICAgICAgICAgIG8tLS0tLW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyYzI6IG8tLS0tbworICAgICAgICAgICAgICAgIHNyYzIgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2ludGVyc2VjdFJhbmdlcygpOiBJbnRlcm5hbCBFcnJvcjogWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArdGhpcy5yYW5nZXNbc3JjMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiwiK3RoaXMucmFuZ2VzW3NyYzErMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gJiBbIit0b2sucmFuZ2VzW3NyYzJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIsIit0b2sucmFuZ2VzW3NyYzIrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoc3JjMSA8IHRoaXMucmFuZ2VzLmxlbmd0aCkgeworICAgICAgICAgICAgcmVzdWx0W3dwKytdID0gdGhpcy5yYW5nZXNbc3JjMSsrXTsKKyAgICAgICAgICAgIHJlc3VsdFt3cCsrXSA9IHRoaXMucmFuZ2VzW3NyYzErK107CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgaW50W3dwXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRoaXMucmFuZ2VzLCAwLCB3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJhbmdlcyBpcyBzb3J0ZWQgYW5kIGNvbXBhY3RlZC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmb3IgUkFOR0U6IENyZWF0ZXMgY29tcGxlbWVudC4KKyAgICAgKiBmb3IgTlJBTkdFOiBDcmVhdGVzIHRoZSBzYW1lIG1lYW5pbmcgUkFOR0UuCisgICAgICovCisgICAgc3RhdGljIFRva2VuIGNvbXBsZW1lbnRSYW5nZXMoVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgaWYgKHRva2VuLnR5cGUgIT0gUkFOR0UgJiYgdG9rZW4udHlwZSAhPSBOUkFOR0UpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb2tlbiNjb21wbGVtZW50UmFuZ2VzKCk6IG11c3QgYmUgUkFOR0U6ICIrdG9rZW4udHlwZSk7CisgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gKFJhbmdlVG9rZW4pdG9rZW47CisgICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7CisgICAgICAgIGludCBsZW4gPSB0b2sucmFuZ2VzLmxlbmd0aCsyOworICAgICAgICBpZiAodG9rLnJhbmdlc1swXSA9PSAwKQorICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgIGludCBsYXN0ID0gdG9rLnJhbmdlc1t0b2sucmFuZ2VzLmxlbmd0aC0xXTsKKyAgICAgICAgaWYgKGxhc3QgPT0gVVRGMTZfTUFYKQorICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgIFJhbmdlVG9rZW4gcmV0ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgcmV0LnJhbmdlcyA9IG5ldyBpbnRbbGVuXTsKKyAgICAgICAgaW50IHdwID0gMDsKKyAgICAgICAgaWYgKHRvay5yYW5nZXNbMF0gPiAwKSB7CisgICAgICAgICAgICByZXQucmFuZ2VzW3dwKytdID0gMDsKKyAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzWzBdLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7ICBpIDwgdG9rLnJhbmdlcy5sZW5ndGgtMjsgIGkgKz0gMikgeworICAgICAgICAgICAgcmV0LnJhbmdlc1t3cCsrXSA9IHRvay5yYW5nZXNbaV0rMTsKKyAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSB0b2sucmFuZ2VzW2krMV0tMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdCAhPSBVVEYxNl9NQVgpIHsKKyAgICAgICAgICAgIHJldC5yYW5nZXNbd3ArK10gPSBsYXN0KzE7CisgICAgICAgICAgICByZXQucmFuZ2VzW3dwXSA9IFVURjE2X01BWDsKKyAgICAgICAgfQorICAgICAgICByZXQuc2V0Q29tcGFjdGVkKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIFJhbmdlVG9rZW4gZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKSB7CisgICAgICAgIGlmICh0aGlzLmljYXNlQ2FjaGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmljYXNlQ2FjaGU7CisgICAgICAgICAgICAKKyAgICAgICAgUmFuZ2VUb2tlbiB1cHBlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgeworICAgICAgICAgICAgZm9yIChpbnQgY2ggPSB0aGlzLnJhbmdlc1tpXTsgIGNoIDw9IHRoaXMucmFuZ2VzW2krMV07ICBjaCArKykgeworICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKGNoLCBjaCk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKKyAgICAgICAgICAgICAgICAgICAgdXBwZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUmFuZ2VUb2tlbiBsb3dlcnMgPSB0aGlzLnR5cGUgPT0gVG9rZW4uUkFOR0UgPyBUb2tlbi5jcmVhdGVSYW5nZSgpIDogVG9rZW4uY3JlYXRlTlJhbmdlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHVwcGVycy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7CisgICAgICAgICAgICBmb3IgKGludCBjaCA9IHVwcGVycy5yYW5nZXNbaV07ICBjaCA8PSB1cHBlcnMucmFuZ2VzW2krMV07ICBjaCArKykgeworICAgICAgICAgICAgICAgIGlmIChjaCA+IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKGNoLCBjaCk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKKyAgICAgICAgICAgICAgICAgICAgbG93ZXJzLmFkZFJhbmdlKHVjaCwgdWNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG93ZXJzLm1lcmdlUmFuZ2VzKHVwcGVycyk7CisgICAgICAgIGxvd2Vycy5tZXJnZVJhbmdlcyh0aGlzKTsKKyAgICAgICAgbG93ZXJzLmNvbXBhY3RSYW5nZXMoKTsKKworICAgICAgICB0aGlzLmljYXNlQ2FjaGUgPSBsb3dlcnM7CisgICAgICAgIHJldHVybiBsb3dlcnM7CisgICAgfQorCisgICAgdm9pZCBkdW1wUmFuZ2VzKCkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCJSQU5HRTogIik7CisgICAgICAgIGlmICh0aGlzLnJhbmdlcyA9PSBudWxsKQorICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgTlVMTCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIlsiK3RoaXMucmFuZ2VzW2ldKyIsIit0aGlzLnJhbmdlc1tpKzFdKyJdICIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7CisgICAgfQorCisgICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKKyAgICAgICAgaWYgKHRoaXMubWFwID09IG51bGwpICB0aGlzLmNyZWF0ZU1hcCgpOworICAgICAgICBib29sZWFuIHJldDsKKyAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBSQU5HRSkgeworICAgICAgICAgICAgaWYgKGNoIDwgTUFQU0laRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMubWFwW2NoLzMyXSAmICgxPDwoY2gmMHgxZikpKSAhPSAwOworICAgICAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gdGhpcy5ub25NYXBJbmRleDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPD0gY2ggJiYgY2ggPD0gdGhpcy5yYW5nZXNbaSsxXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2ggPCBNQVBTSVpFKQorICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5tYXBbY2gvMzJdICYgKDE8PChjaCYweDFmKSkpID09IDA7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRoaXMubm9uTWFwSW5kZXg7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucmFuZ2VzW2ldIDw9IGNoICYmIGNoIDw9IHRoaXMucmFuZ2VzW2krMV0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVBTSVpFID0gMjU2OworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNYXAoKSB7CisgICAgICAgIGludCBhc2l6ZSA9IE1BUFNJWkUvMzI7ICAgICAgICAgICAgICAgICAvLyAzMiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYGludCcuCisgICAgICAgIHRoaXMubWFwID0gbmV3IGludFthc2l6ZV07CisgICAgICAgIHRoaXMubm9uTWFwSW5kZXggPSB0aGlzLnJhbmdlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIHRoaXMubWFwW2ldID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyAgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcyA9IHRoaXMucmFuZ2VzW2ldOworICAgICAgICAgICAgaW50IGUgPSB0aGlzLnJhbmdlc1tpKzFdOworICAgICAgICAgICAgaWYgKHMgPCBNQVBTSVpFKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHM7ICBqIDw9IGUgJiYgaiA8IE1BUFNJWkU7ICBqICsrKQorICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFtqLzMyXSB8PSAxPDwoaiYweDFmKTsgLy8gcyYweDFmIDogMC0zMQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlID49IE1BUFNJWkUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5vbk1hcEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyAgaSA8IGFzaXplOyAgaSArKykgIFN5c3RlbS5lcnIucHJpbnRsbigiTWFwOiAiK0ludGVnZXIudG9TdHJpbmcodGhpcy5tYXBbaV0sIDE2KSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgeworICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICBpZiAodGhpcy50eXBlID09IFJBTkdFKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl9kb3QpCisgICAgICAgICAgICAgICAgcmV0ID0gIi4iOworICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl8wdG85KQorICAgICAgICAgICAgICAgIHJldCA9ICJcXGQiOworICAgICAgICAgICAgZWxzZSBpZiAodGhpcyA9PSBUb2tlbi50b2tlbl93b3JkY2hhcnMpCisgICAgICAgICAgICAgICAgcmV0ID0gIlxcdyI7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX3NwYWNlcykKKyAgICAgICAgICAgICAgICByZXQgPSAiXFxzIjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlsiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7ICBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUmVndWxhckV4cHJlc3Npb24uU1BFQ0lBTF9DT01NQSkgIT0gMCAmJiBpID4gMCkgIHNiLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5nZXNbaV0gPT0gdGhpcy5yYW5nZXNbaSsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZUNoYXJJbkNoYXJDbGFzcyh0aGlzLnJhbmdlc1tpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSctJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2krMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fbm90XzB0bzkpCisgICAgICAgICAgICAgICAgcmV0ID0gIlxcRCI7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF93b3JkY2hhcnMpCisgICAgICAgICAgICAgICAgcmV0ID0gIlxcVyI7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzID09IFRva2VuLnRva2VuX25vdF9zcGFjZXMpCisgICAgICAgICAgICAgICAgcmV0ID0gIlxcUyI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJbXiIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgIGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKSAhPSAwICYmIGkgPiAwKSAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlc1tpXSA9PSB0aGlzLnJhbmdlc1tpKzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlQ2hhckluQ2hhckNsYXNzKHRoaXMucmFuZ2VzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGVDaGFySW5DaGFyQ2xhc3ModGhpcy5yYW5nZXNbaSsxXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgICAgIHJldCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlQ2hhckluQ2hhckNsYXNzKGludCBjaCkgeworICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAnWyc6ICBjYXNlICddJzogIGNhc2UgJy0nOiAgY2FzZSAnXic6CisgICAgICAgICAgY2FzZSAnLCc6ICBjYXNlICdcXCc6CisgICAgICAgICAgICByZXQgPSAiXFwiKyhjaGFyKWNoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnXGYnOiAgcmV0ID0gIlxcZiI7ICBicmVhazsKKyAgICAgICAgICBjYXNlICdcbic6ICByZXQgPSAiXFxuIjsgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1xyJzogIHJldCA9ICJcXHIiOyAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnXHQnOiAgcmV0ID0gIlxcdCI7ICBicmVhazsKKyAgICAgICAgICBjYXNlIDB4MWI6ICByZXQgPSAiXFxlIjsgIGJyZWFrOworICAgICAgICAgIC8vY2FzZSAweDBiOiAgcmV0ID0gIlxcdiI7ICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGNoIDwgMHgyMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7CisgICAgICAgICAgICAgICAgcmV0ID0gIlxceCIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktMiwgcHJlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyhjaCk7CisgICAgICAgICAgICAgICAgcmV0ID0gIlxcdiIrcHJlLnN1YnN0cmluZyhwcmUubGVuZ3RoKCktNiwgcHJlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKWNoOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ2V4UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MTZkZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvUmVnZXhQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwOTIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBBIFJlZ3VsYXIgRXhwcmVzc2lvbiBQYXJzZXIuCisgKi8KK2NsYXNzIFJlZ2V4UGFyc2VyIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfQ0hBUiA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBUX0VPRiA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBUX09SID0gMjsgICAgICAgICAgICAgICAgICAvLyAnfCcKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfU1RBUiA9IDM7ICAgICAgICAgICAgICAgIC8vICcqJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9QTFVTID0gNDsgICAgICAgICAgICAgICAgLy8gJysnCisgICAgc3RhdGljIGZpbmFsIGludCBUX1FVRVNUSU9OID0gNTsgICAgICAgICAgICAvLyAnPycKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfTFBBUkVOID0gNjsgICAgICAgICAgICAgIC8vICcoJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9SUEFSRU4gPSA3OyAgICAgICAgICAgICAgLy8gJyknCisgICAgc3RhdGljIGZpbmFsIGludCBUX0RPVCA9IDg7ICAgICAgICAgICAgICAgICAvLyAnLicKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfTEJSQUNLRVQgPSA5OyAgICAgICAgICAgIC8vICdbJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9CQUNLU09MSURVUyA9IDEwOyAgICAgICAgLy8gJ1wnCisgICAgc3RhdGljIGZpbmFsIGludCBUX0NBUkVUID0gMTE7ICAgICAgICAgICAgICAvLyAnXicKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfRE9MTEFSID0gMTI7ICAgICAgICAgICAgIC8vICckJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9MUEFSRU4yID0gMTM7ICAgICAgICAgICAgLy8gJyg/OicKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfTE9PS0FIRUFEID0gMTQ7ICAgICAgICAgIC8vICcoPz0nCisgICAgc3RhdGljIGZpbmFsIGludCBUX05FR0FUSVZFTE9PS0FIRUFEID0gMTU7ICAvLyAnKD8hJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9MT09LQkVISU5EID0gMTY7ICAgICAgICAgLy8gJyg/PD0nCisgICAgc3RhdGljIGZpbmFsIGludCBUX05FR0FUSVZFTE9PS0JFSElORCA9IDE3OyAvLyAnKD88IScKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfSU5ERVBFTkRFTlQgPSAxODsgICAgICAgIC8vICcoPz4nCisgICAgc3RhdGljIGZpbmFsIGludCBUX1NFVF9PUEVSQVRJT05TID0gMTk7ICAgICAvLyAnKD9bJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQgPSAyMDsgLy8gJ1s6JyBpbiBhIGNoYXJhY3RlciBjbGFzcworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9DT01NRU5UID0gMjE7ICAgICAgICAgICAgLy8gJyg/IycKKyAgICBzdGF0aWMgZmluYWwgaW50IFRfTU9ESUZJRVJTID0gMjI7ICAgICAgICAgIC8vICcoPycgW1wtLGEteixBLVpdCisgICAgc3RhdGljIGZpbmFsIGludCBUX0NPTkRJVElPTiA9IDIzOyAgICAgICAgICAvLyAnKD8oJworICAgIHN0YXRpYyBmaW5hbCBpbnQgVF9YTUxTQ0hFTUFfQ0NfU1VCVFJBQ1RJT04gPSAyNDsgLy8gJy1bJyBpbiBhIGNoYXJhY3RlciBjbGFzcworCisgICAgc3RhdGljIGNsYXNzIFJlZmVyZW5jZVBvc2l0aW9uIHsKKyAgICAgICAgaW50IHJlZk51bWJlcjsKKyAgICAgICAgaW50IHBvc2l0aW9uOworICAgICAgICBSZWZlcmVuY2VQb3NpdGlvbihpbnQgbiwgaW50IHBvcykgeworICAgICAgICAgICAgdGhpcy5yZWZOdW1iZXIgPSBuOworICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBvZmZzZXQ7CisgICAgU3RyaW5nIHJlZ2V4OworICAgIGludCByZWdleGxlbjsKKyAgICBpbnQgb3B0aW9uczsKKyAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZXM7CisgICAgaW50IGNoYXJkYXRhOworICAgIGludCBuZXh0dG9rZW47CisgICAgc3RhdGljIHByb3RlY3RlZCBmaW5hbCBpbnQgU19OT1JNQUwgPSAwOworICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IFNfSU5CUkFDS0VUUyA9IDE7CisgICAgc3RhdGljIHByb3RlY3RlZCBmaW5hbCBpbnQgU19JTlhCUkFDS0VUUyA9IDI7CisgICAgaW50IGNvbnRleHQgPSBTX05PUk1BTDsKKyAgICBpbnQgcGFyZW5udW1iZXIgPSAxOworICAgIGJvb2xlYW4gaGFzQmFja1JlZmVyZW5jZXM7CisgICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBudWxsOworCisgICAgcHVibGljIFJlZ2V4UGFyc2VyKCkgeworICAgICAgICB0aGlzLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKyAgICB9CisgICAgcHVibGljIFJlZ2V4UGFyc2VyKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgdGhpcy5zZXRMb2NhbGUobG9jYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5tZXNzYWdlIiwgbG9jYWxlKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluc3RhbGxhdGlvbiBQcm9ibGVtPz8/ICBDb3VsZG4ndCBsb2FkIG1lc3NhZ2VzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbXJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleChTdHJpbmcga2V5LCBpbnQgbG9jKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odGhpcy5yZXNvdXJjZXMuZ2V0U3RyaW5nKGtleSksIGxvYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2V0KGludCBmbGFnKSB7CisgICAgICAgIHJldHVybiAodGhpcy5vcHRpb25zICYgZmxhZykgPT0gZmxhZzsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgVG9rZW4gcGFyc2UoU3RyaW5nIHJlZ2V4LCBpbnQgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSAwOworICAgICAgICB0aGlzLnNldENvbnRleHQoU19OT1JNQUwpOworICAgICAgICB0aGlzLnBhcmVubnVtYmVyID0gMTsKKyAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IGZhbHNlOworICAgICAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7CisgICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLkVYVEVOREVEX0NPTU1FTlQpKQorICAgICAgICAgICAgdGhpcy5yZWdleCA9IFJFVXRpbC5zdHJpcEV4dGVuZGVkQ29tbWVudCh0aGlzLnJlZ2V4KTsKKyAgICAgICAgdGhpcy5yZWdleGxlbiA9IHRoaXMucmVnZXgubGVuZ3RoKCk7CisKKworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgVG9rZW4gcmV0ID0gdGhpcy5wYXJzZVJlZ2V4KCk7CisgICAgICAgIGlmICh0aGlzLm9mZnNldCAhPSB0aGlzLnJlZ2V4bGVuKQorICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wYXJzZS4xIiwgdGhpcy5vZmZzZXQpOworICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMucmVmZXJlbmNlcy5zaXplKCk7ICBpICsrKSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUG9zaXRpb24gcG9zaXRpb24gPSAoUmVmZXJlbmNlUG9zaXRpb24pdGhpcy5yZWZlcmVuY2VzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbm51bWJlciA8PSBwb3NpdGlvbi5yZWZOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIucGFyc2UuMiIsIHBvc2l0aW9uLnBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoKKyAgICBwdWJsaWMgUmVndWxhckV4cHJlc3Npb24gY3JlYXRlUmVnZXgoU3RyaW5nIHJlZ2V4LCBpbnQgb3B0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgVG9rZW4gdG9rID0gdGhpcy5wYXJzZShyZWdleCwgb3B0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgUmVndWxhckV4cHJlc3Npb24ocmVnZXgsIHRvaywgdGhpcy5wYXJlbm51bWJlciwgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcywgb3B0aW9ucyk7CisgICAgfQorICAgICovCisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRDb250ZXh0KGludCBjb24pIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29uOworICAgIH0KKworICAgIGZpbmFsIGludCByZWFkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uZXh0dG9rZW47CisgICAgfQorCisgICAgZmluYWwgdm9pZCBuZXh0KCkgeworICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikgeworICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IC0xOworICAgICAgICAgICAgdGhpcy5uZXh0dG9rZW4gPSBUX0VPRjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZXQ7CisgICAgICAgIGludCBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOworICAgICAgICB0aGlzLmNoYXJkYXRhID0gY2g7CisKKyAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBTX0lOQlJBQ0tFVFMpIHsKKyAgICAgICAgICAgIC8vIEluIGEgY2hhcmFjdGVyIGNsYXNzLCB0aGlzLmNoYXJkYXRhIGhhcyBvbmUgY2hhcmFjdGVyLCB0aGF0IGlzIHRvIHNheSwKKyAgICAgICAgICAgIC8vIGEgcGFpciBvZiBzdXJyb2dhdGVzIGlzIGNvbXBvc2VkIGFuZCBzdG9yZWQgdG8gdGhpcy5jaGFyZGF0YS4KKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIHJldCA9IFRfQkFDS1NPTElEVVM7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pCisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlhNTFNDSEVNQV9NT0RFKQorICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4gJiYgdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCsrOworICAgICAgICAgICAgICAgICAgICByZXQgPSBUX1hNTFNDSEVNQV9DQ19TVUJUUkFDVElPTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9DSEFSOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkKKyAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLnJlZ2V4bGVuICYmIHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KSA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gVGhyb3VnaCBkb3duCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5yZWdleGxlbikgeworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGxvdykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCBsb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gVF9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5uZXh0dG9rZW4gPSByZXQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAnfCc6IHJldCA9IFRfT1I7ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJyonOiByZXQgPSBUX1NUQVI7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICcrJzogcmV0ID0gVF9QTFVTOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnPyc6IHJldCA9IFRfUVVFU1RJT047ICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJyknOiByZXQgPSBUX1JQQVJFTjsgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICcuJzogcmV0ID0gVF9ET1Q7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnWyc6IHJldCA9IFRfTEJSQUNLRVQ7ICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ14nOiByZXQgPSBUX0NBUkVUOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICckJzogcmV0ID0gVF9ET0xMQVI7ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICByZXQgPSBUX0xQQVJFTjsKKyAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KSAhPSAnPycpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoKyt0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQorICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4yIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgICBjYXNlICc6JzogIHJldCA9IFRfTFBBUkVOMjsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnPSc6ICByZXQgPSBUX0xPT0tBSEVBRDsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJyEnOiAgcmV0ID0gVF9ORUdBVElWRUxPT0tBSEVBRDsgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlICdbJzogIHJldCA9IFRfU0VUX09QRVJBVElPTlM7ICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSAnPic6ICByZXQgPSBUX0lOREVQRU5ERU5UOyAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA+PSB0aGlzLnJlZ2V4bGVuKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMiIsIHRoaXMub2Zmc2V0LTMpOworICAgICAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQrKyk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBUX0xPT0tCRUhJTkQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVF9ORUdBVElWRUxPT0tCRUhJTkQ7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4zIiwgdGhpcy5vZmZzZXQtMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCsrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcpJykgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyknKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuNCIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgICAgIHJldCA9IFRfQ09NTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy0nIHx8ICdhJyA8PSBjaCAmJiBjaCA8PSAneicgfHwgJ0EnIDw9IGNoICYmIGNoIDw9ICdaJykgey8vIE9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgLS07CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFRfTU9ESUZJRVJTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgeyAgICAgICAgIC8vIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgIHJldCA9IFRfQ09ORElUSU9OOyAgICAgICAgICAvLyB0aGlzLm9mZnNldHMgcG9pbnRzIHRoZSBuZXh0IG9mICcoJy4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIubmV4dC4yIiwgdGhpcy5vZmZzZXQtMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIHJldCA9IFRfQkFDS1NPTElEVVM7CisgICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLm5leHQuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgdGhpcy5jaGFyZGF0YSA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KyspOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gVF9DSEFSOworICAgICAgICB9CisgICAgICAgIHRoaXMubmV4dHRva2VuID0gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlZ2V4IDo6PSB0ZXJtIChgfGAgdGVybSkqCisgICAgICogdGVybSA6Oj0gZmFjdG9yKworICAgICAqIGZhY3RvciA6Oj0gKCdeJyB8ICckJyB8ICdcQScgfCAnXFonIHwgJ1x6JyB8ICdcYicgfCAnXEInIHwgJ1w8JyB8ICdcPicKKyAgICAgKiAgICAgICAgICAgIHwgYXRvbSAoKCcqJyB8ICcrJyB8ICc/JyB8IG1pbm1heCApICc/Jz8gKT8pCisgICAgICogICAgICAgICAgICB8ICcoPz0nIHJlZ2V4ICcpJyAgfCAnKD8hJyByZWdleCAnKScgIHwgJyg/Jmx0Oz0nIHJlZ2V4ICcpJyAgfCAnKD8mbHQ7IScgcmVnZXggJyknCisgICAgICogYXRvbSA6Oj0gY2hhciB8ICcuJyB8IHJhbmdlIHwgJygnIHJlZ2V4ICcpJyB8ICcoPzonIHJlZ2V4ICcpJyB8ICdcJyBbMC05XQorICAgICAqICAgICAgICAgIHwgJ1x3JyB8ICdcVycgfCAnXGQnIHwgJ1xEJyB8ICdccycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sgCisgICAgICovCisgICAgVG9rZW4gcGFyc2VSZWdleCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFRva2VuIHRvayA9IHRoaXMucGFyc2VUZXJtKCk7CisgICAgICAgIFRva2VuIHBhcmVudCA9IG51bGw7CisgICAgICAgIHdoaWxlICh0aGlzLnJlYWQoKSA9PSBUX09SKSB7CisgICAgICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vICd8JworICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKKyAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQodG9rKTsKKyAgICAgICAgICAgICAgICB0b2sgPSBwYXJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2suYWRkQ2hpbGQodGhpcy5wYXJzZVRlcm0oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXJtIDo6PSBmYWN0b3IrCisgICAgICovCisgICAgVG9rZW4gcGFyc2VUZXJtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGNoID0gdGhpcy5yZWFkKCk7CisgICAgICAgIGlmIChjaCA9PSBUX09SIHx8IGNoID09IFRfUlBBUkVOIHx8IGNoID09IFRfRU9GKSB7CisgICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlRW1wdHkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRva2VuIHRvayA9IHRoaXMucGFyc2VGYWN0b3IoKTsKKyAgICAgICAgICAgIFRva2VuIGNvbmNhdCA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5yZWFkKCkpICE9IFRfT1IgJiYgY2ggIT0gVF9SUEFSRU4gJiYgY2ggIT0gVF9FT0YpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uY2F0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uY2F0ID0gVG9rZW4uY3JlYXRlQ29uY2F0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmNhdC5hZGRDaGlsZCh0b2spOworICAgICAgICAgICAgICAgICAgICB0b2sgPSBjb25jYXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbmNhdC5hZGRDaGlsZCh0aGlzLnBhcnNlRmFjdG9yKCkpOworICAgICAgICAgICAgICAgIC8vdG9rID0gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgdGhpcy5wYXJzZUZhY3RvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0b2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUb2tlbiBwcm9jZXNzQ2FyZXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2xpbmViZWdpbm5pbmc7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NEb2xsYXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2xpbmVlbmQ7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NMb29rYWhlYWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5MT09LQUhFQUQsIHRoaXMucGFyc2VSZWdleCgpKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJyknCisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2thaGVhZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLk5FR0FUSVZFTE9PS0FIRUFELCB0aGlzLnBhcnNlUmVnZXgoKSk7CisgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcpJworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzTG9va2JlaGluZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLkxPT0tCRUhJTkQsIHRoaXMucGFyc2VSZWdleCgpKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJyknCisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NOZWdhdGl2ZWxvb2tiZWhpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgVG9rZW4gdG9rID0gVG9rZW4uY3JlYXRlTG9vayhUb2tlbi5ORUdBVElWRUxPT0tCRUhJTkQsIHRoaXMucGFyc2VSZWdleCgpKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vICcpJworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fc3RyaW5nYmVnaW5uaW5nOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfWigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fc3RyaW5nZW5kMjsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3ooKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3N0cmluZ2VuZDsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX2IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3dvcmRlZGdlOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fbm90X3dvcmRlZGdlOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfbHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX3dvcmRiZWdpbm5pbmc7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19ndCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fd29yZGVuZDsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc1N0YXIoVG9rZW4gdG9rKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfUVVFU1RJT04pIHsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZU5HQ2xvc3VyZSh0b2spOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDbG9zdXJlKHRvayk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NQbHVzKFRva2VuIHRvaykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gWCsgLT4gWFgqCisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9RVUVTVElPTikgeworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gVG9rZW4uY3JlYXRlQ29uY2F0KHRvaywgVG9rZW4uY3JlYXRlTkdDbG9zdXJlKHRvaykpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDb25jYXQodG9rLCBUb2tlbi5jcmVhdGVDbG9zdXJlKHRvaykpOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzUXVlc3Rpb24oVG9rZW4gdG9rKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAvLyBYPyAtPiBYfAorICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgVG9rZW4gcGFyID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpID09IFRfUVVFU1RJT04pIHsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgcGFyLmFkZENoaWxkKFRva2VuLmNyZWF0ZUVtcHR5KCkpOworICAgICAgICAgICAgcGFyLmFkZENoaWxkKHRvayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXIuYWRkQ2hpbGQodG9rKTsKKyAgICAgICAgICAgIHBhci5hZGRDaGlsZChUb2tlbi5jcmVhdGVFbXB0eSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyOworICAgIH0KKyAgICBib29sZWFuIGNoZWNrUXVlc3Rpb24oaW50IG9mZikgeworICAgICAgICByZXR1cm4gb2ZmIDwgdGhpcy5yZWdleGxlbiAmJiB0aGlzLnJlZ2V4LmNoYXJBdChvZmYpID09ICc/JzsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc1BhcmVuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIGludCBwID0gdGhpcy5wYXJlbm51bWJlcisrOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVQYXJlbih0aGlzLnBhcnNlUmVnZXgoKSwgcCk7CisgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzUGFyZW4yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZVBhcmVuKHRoaXMucGFyc2VSZWdleCgpLCAwKTsKKyAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcHMgJyknCisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NDb25kaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5vZmZzZXQgcG9pbnRzIHRoZSBuZXh0IG9mICcoJworICAgICAgICBpZiAodGhpcy5vZmZzZXQrMSA+PSB0aGlzLnJlZ2V4bGVuKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuNCIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlcyBhIGNvbmRpdGlvbi4KKyAgICAgICAgaW50IHJlZm5vID0gLTE7CisgICAgICAgIFRva2VuIGNvbmRpdGlvbiA9IG51bGw7CisgICAgICAgIGludCBjaCA9IHRoaXMucmVnZXguY2hhckF0KHRoaXMub2Zmc2V0KTsKKyAgICAgICAgaWYgKCcxJyA8PSBjaCAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgIHJlZm5vID0gY2gtJzAnOworICAgICAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IHRydWU7CisgICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzID09IG51bGwpICB0aGlzLnJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXMuYWRkRWxlbWVudChuZXcgUmVmZXJlbmNlUG9zaXRpb24ocmVmbm8sIHRoaXMub2Zmc2V0KSk7CisgICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKKyAgICAgICAgICAgIGlmICh0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgIT0gJyknKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNoID09ICc/JykgIHRoaXMub2Zmc2V0IC0tOyAvLyBQb2ludHMgJygnLgorICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBjb25kaXRpb24gPSB0aGlzLnBhcnNlRmFjdG9yKCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi50eXBlKSB7CisgICAgICAgICAgICAgIGNhc2UgVG9rZW4uTE9PS0FIRUFEOgorICAgICAgICAgICAgICBjYXNlIFRva2VuLk5FR0FUSVZFTE9PS0FIRUFEOgorICAgICAgICAgICAgICBjYXNlIFRva2VuLkxPT0tCRUhJTkQ6CisgICAgICAgICAgICAgIGNhc2UgVG9rZW4uTkVHQVRJVkVMT09LQkVISU5EOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRva2VuLkFOQ0hPUjoKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9SUEFSRU4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuNSIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2VzIHllcy9uby1wYXR0ZXJucy4KKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIFRva2VuIHllc1BhdHRlcm4gPSB0aGlzLnBhcnNlUmVnZXgoKTsKKyAgICAgICAgVG9rZW4gbm9QYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgaWYgKHllc1BhdHRlcm4udHlwZSA9PSBUb2tlbi5VTklPTikgeworICAgICAgICAgICAgaWYgKHllc1BhdHRlcm4uc2l6ZSgpICE9IDIpICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci42IiwgdGhpcy5vZmZzZXQpOworICAgICAgICAgICAgbm9QYXR0ZXJuID0geWVzUGF0dGVybi5nZXRDaGlsZCgxKTsKKyAgICAgICAgICAgIHllc1BhdHRlcm4gPSB5ZXNQYXR0ZXJuLmdldENoaWxkKDApOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIHJldHVybiBUb2tlbi5jcmVhdGVDb25kaXRpb24ocmVmbm8sIGNvbmRpdGlvbiwgeWVzUGF0dGVybiwgbm9QYXR0ZXJuKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc01vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm9mZnNldCBwb2ludHMgdGhlIG5leHQgb2YgJz8nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kaWZpZXJzIDo6PSBbaW1zd10qICgnLScgW2ltc3ddKik/ICc6JworICAgICAgICBpbnQgYWRkID0gMCwgbWFzayA9IDAsIGNoID0gLTE7CisgICAgICAgIHdoaWxlICh0aGlzLm9mZnNldCA8IHRoaXMucmVnZXhsZW4pIHsKKyAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOworICAgICAgICAgICAgaW50IHYgPSBSRVV0aWwuZ2V0T3B0aW9uVmFsdWUoY2gpOworICAgICAgICAgICAgaWYgKHYgPT0gMCkgIGJyZWFrOyAgICAgICAgICAgICAgICAgLy8gJy0nIG9yICc6Jz8KKyAgICAgICAgICAgIGFkZCB8PSB2OworICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4pICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4yIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOworICAgICAgICAgICAgd2hpbGUgKHRoaXMub2Zmc2V0IDwgdGhpcy5yZWdleGxlbikgeworICAgICAgICAgICAgICAgIGNoID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQpOworICAgICAgICAgICAgICAgIGludCB2ID0gUkVVdGlsLmdldE9wdGlvblZhbHVlKGNoKTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSAwKSAgYnJlYWs7ICAgICAgICAgICAgIC8vICc6Jz8KKyAgICAgICAgICAgICAgICBtYXNrIHw9IHY7CisgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5yZWdleGxlbikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjIiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgfQorICAgICAgICBUb2tlbiB0b2s7CisgICAgICAgIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVNb2RpZmllckdyb3VwKHRoaXMucGFyc2VSZWdleCgpLCBhZGQsIG1hc2spOworICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfUlBBUkVOKSAgdGhyb3cgZXgoInBhcnNlci5mYWN0b3IuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyknKSB7ICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzICg/LWkpCisgICAgICAgICAgICB0aGlzLm9mZnNldCArKzsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTW9kaWZpZXJHcm91cCh0aGlzLnBhcnNlUmVnZXgoKSwgYWRkLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmZhY3Rvci4zIiwgdGhpcy5vZmZzZXQpOworCisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NJbmRlcGVuZGVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVMb29rKFRva2VuLklOREVQRU5ERU5ULCB0aGlzLnBhcnNlUmVnZXgoKSk7CisgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX1JQQVJFTikgIHRocm93IGV4KCJwYXJzZXIuZmFjdG9yLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICcpJworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfYygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGludCBjaDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGluIDB4MDA0MC0weDAwNWYKKyAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMucmVnZXhsZW4KKyAgICAgICAgICAgIHx8ICgoY2gyID0gdGhpcy5yZWdleC5jaGFyQXQodGhpcy5vZmZzZXQrKykpICYgMHhmZmUwKSAhPSAweDAwNDApCisgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmF0b20uMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUNoYXIoY2gyLTB4NDApOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfQygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGV4KCJwYXJzZXIucHJvY2Vzcy4xIiwgdGhpcy5vZmZzZXQpOworICAgIH0KKyAgICBUb2tlbiBwcm9jZXNzQmFja3NvbGlkdXNfaSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFRva2VuIHRvayA9IFRva2VuLmNyZWF0ZUNoYXIoJ2knKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19JKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZXgoInBhcnNlci5wcm9jZXNzLjEiLCB0aGlzLm9mZnNldCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrc29saWR1c19nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIHJldHVybiBUb2tlbi5nZXRHcmFwaGVtZVBhdHRlcm4oKTsKKyAgICB9CisgICAgVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX1goKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLmdldENvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlKCk7CisgICAgfQorICAgIFRva2VuIHByb2Nlc3NCYWNrcmVmZXJlbmNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJlZm51bSA9IHRoaXMuY2hhcmRhdGEtJzAnOworICAgICAgICBUb2tlbiB0b2sgPSBUb2tlbi5jcmVhdGVCYWNrUmVmZXJlbmNlKHJlZm51bSk7CisgICAgICAgIHRoaXMuaGFzQmFja1JlZmVyZW5jZXMgPSB0cnVlOworICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VzID09IG51bGwpICB0aGlzLnJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMucmVmZXJlbmNlcy5hZGRFbGVtZW50KG5ldyBSZWZlcmVuY2VQb3NpdGlvbihyZWZudW0sIHRoaXMub2Zmc2V0LTIpKTsKKyAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogZmFjdG9yIDo6PSAoJ14nIHwgJyQnIHwgJ1xBJyB8ICdcWicgfCAnXHonIHwgJ1xiJyB8ICdcQicgfCAnXDwnIHwgJ1w+JworICAgICAqICAgICAgICAgICAgfCBhdG9tICgoJyonIHwgJysnIHwgJz8nIHwgbWlubWF4ICkgJz8nPyApPykKKyAgICAgKiAgICAgICAgICAgIHwgJyg/PScgcmVnZXggJyknICB8ICcoPyEnIHJlZ2V4ICcpJyAgfCAnKD8mbHQ7PScgcmVnZXggJyknICB8ICcoPyZsdDshJyByZWdleCAnKScKKyAgICAgKiAgICAgICAgICAgIHwgJyg/IycgW14pXSogJyknCisgICAgICogbWlubWF4IDo6PSAneycgbWluICgnLCcgbWF4Pyk/ICd9JworICAgICAqIG1pbiA6Oj0gWzAtOV0rCisgICAgICogbWF4IDo6PSBbMC05XSsKKyAgICAgKi8KKyAgICBUb2tlbiBwYXJzZUZhY3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7ICAgICAgICAKKyAgICAgICAgaW50IGNoID0gdGhpcy5yZWFkKCk7CisgICAgICAgIFRva2VuIHRvazsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgIGNhc2UgVF9DQVJFVDogICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ2FyZXQoKTsKKyAgICAgICAgICBjYXNlIFRfRE9MTEFSOiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0RvbGxhcigpOworICAgICAgICAgIGNhc2UgVF9MT09LQUhFQUQ6ICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9va2FoZWFkKCk7CisgICAgICAgICAgY2FzZSBUX05FR0FUSVZFTE9PS0FIRUFEOiByZXR1cm4gdGhpcy5wcm9jZXNzTmVnYXRpdmVsb29rYWhlYWQoKTsKKyAgICAgICAgICBjYXNlIFRfTE9PS0JFSElORDogICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvb2tiZWhpbmQoKTsKKyAgICAgICAgICBjYXNlIFRfTkVHQVRJVkVMT09LQkVISU5EOiByZXR1cm4gdGhpcy5wcm9jZXNzTmVnYXRpdmVsb29rYmVoaW5kKCk7CisKKyAgICAgICAgICBjYXNlIFRfQ09NTUVOVDoKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIFRva2VuLmNyZWF0ZUVtcHR5KCk7CisKKyAgICAgICAgICBjYXNlIFRfQkFDS1NPTElEVVM6CisgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhcmRhdGEpIHsKKyAgICAgICAgICAgICAgY2FzZSAnQSc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19BKCk7CisgICAgICAgICAgICAgIGNhc2UgJ1onOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfWigpOworICAgICAgICAgICAgICBjYXNlICd6JzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX3ooKTsKKyAgICAgICAgICAgICAgY2FzZSAnYic6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19iKCk7CisgICAgICAgICAgICAgIGNhc2UgJ0InOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfQigpOworICAgICAgICAgICAgICBjYXNlICc8JzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2x0KCk7CisgICAgICAgICAgICAgIGNhc2UgJz4nOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfZ3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggZG93bgorICAgICAgICB9CisgICAgICAgIHRvayA9IHRoaXMucGFyc2VBdG9tKCk7CisgICAgICAgIGNoID0gdGhpcy5yZWFkKCk7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlIFRfU1RBUjogIHJldHVybiB0aGlzLnByb2Nlc3NTdGFyKHRvayk7CisgICAgICAgICAgY2FzZSBUX1BMVVM6ICByZXR1cm4gdGhpcy5wcm9jZXNzUGx1cyh0b2spOworICAgICAgICAgIGNhc2UgVF9RVUVTVElPTjogcmV0dXJuIHRoaXMucHJvY2Vzc1F1ZXN0aW9uKHRvayk7CisgICAgICAgICAgY2FzZSBUX0NIQVI6CisgICAgICAgICAgICBpZiAodGhpcy5jaGFyZGF0YSA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMub2Zmc2V0IC0+IG5leHQgb2YgJ3snCisgICAgICAgICAgICAgICAgaW50IG9mZiA9IHRoaXMub2Zmc2V0OworICAgICAgICAgICAgICAgIGludCBtaW4gPSAwLCBtYXggPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAob2ZmID49IHRoaXMucmVnZXhsZW4pICBicmVhazsKKyAgICAgICAgICAgICAgICBjaCA9IHRoaXMucmVnZXguY2hhckF0KG9mZisrKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJywnICYmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykpICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJywnKSB7ICAgICAgICAgICAgICAgIC8vIDAtOQorICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC0nMCc7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmYgPCB0aGlzLnJlZ2V4bGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2ggPSB0aGlzLnJlZ2V4LmNoYXJBdChvZmYrKykpID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbioxMCArY2gtJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vaWYgKG9mZiA+PSB0aGlzLnJlZ2V4bGVuKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgbWF4ID0gbWluOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZiA+PSB0aGlzLnJlZ2V4bGVuCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGNoID0gdGhpcy5yZWdleC5jaGFyQXQob2ZmKyspKSA8ICcwJyB8fCBjaCA+ICc5JykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoICE9ICd9JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAtMTsgICAgICAgICAgIC8vIHttaW4sfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gtJzAnOyAgICAgICAvLyB7bWluLG1heH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmYgPCB0aGlzLnJlZ2V4bGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNoID0gdGhpcy5yZWdleC5jaGFyQXQob2ZmKyspKSA+PSAnMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgqMTAgK2NoLScwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobWluID4gbWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJwYXJzZUZhY3RvcigpOiBtaW4gPiBtYXg6ICIrbWluKyIsICIrbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ30nKSAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmYgLT4gbmV4dCBvZiAnfScKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1F1ZXN0aW9uKG9mZikpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTkdDbG9zdXJlKHRvayk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2ZmKzE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlQ2xvc3VyZSh0b2spOworICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rLnNldE1pbihtaW4pOworICAgICAgICAgICAgICAgIHRvay5zZXRNYXgobWF4KTsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiQ0xPU1VSRTogIittaW4rIiwgIittYXgpOworICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXRvbSA6Oj0gY2hhciB8ICcuJyB8IGNoYXItY2xhc3MgfCAnKCcgcmVnZXggJyknIHwgJyg/OicgcmVnZXggJyknIHwgJ1wnIFswLTldCisgICAgICogICAgICAgICAgfCAnXHcnIHwgJ1xXJyB8ICdcZCcgfCAnXEQnIHwgJ1xzJyB8ICdcUycgfCBjYXRlZ29yeS1ibG9jaworICAgICAqICAgICAgICAgIHwgJyg/PicgcmVnZXggJyknCisgICAgICogY2hhciA6Oj0gJ1xcJyB8ICdcJyBbZWZucnRdIHwgYm1wLWNvZGUgfCBjaGFyYWN0ZXItMQorICAgICAqLworICAgIFRva2VuIHBhcnNlQXRvbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGludCBjaCA9IHRoaXMucmVhZCgpOworICAgICAgICBUb2tlbiB0b2sgPSBudWxsOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSBUX0xQQVJFTjogICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NQYXJlbigpOworICAgICAgICAgIGNhc2UgVF9MUEFSRU4yOiAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUGFyZW4yKCk7IC8vICcoPzonCisgICAgICAgICAgY2FzZSBUX0NPTkRJVElPTjogICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb25kaXRpb24oKTsgLy8gJyg/KCcKKyAgICAgICAgICBjYXNlIFRfTU9ESUZJRVJTOiAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01vZGlmaWVycygpOyAvLyAoP21vZGlmaWVycyAuLi4gKQorICAgICAgICAgIGNhc2UgVF9JTkRFUEVOREVOVDogICByZXR1cm4gdGhpcy5wcm9jZXNzSW5kZXBlbmRlbnQoKTsKKyAgICAgICAgICBjYXNlIFRfRE9UOgorICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAvLyBTa2lwcyAnLicKKyAgICAgICAgICAgIHRvayA9IFRva2VuLnRva2VuX2RvdDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIGNoYXItY2xhc3MgOjo9ICdbJyAoICdeJz8gcmFuZ2UgJywnPykrICddJworICAgICAgICAgICAgICogcmFuZ2UgOjo9ICdcZCcgfCAnXHcnIHwgJ1xzJyB8IGNhdGVnb3J5LWJsb2NrIHwgcmFuZ2UtY2hhcgorICAgICAgICAgICAgICogICAgICAgICAgIHwgcmFuZ2UtY2hhciAnLScgcmFuZ2UtY2hhcgorICAgICAgICAgICAgICogcmFuZ2UtY2hhciA6Oj0gJ1xbJyB8ICdcXScgfCAnXFwnIHwgJ1wnIFssLWVmbnJ0dl0gfCBibXAtY29kZSB8IGNoYXJhY3Rlci0yCisgICAgICAgICAgICAgKiBibXAtY2hhciA6Oj0gJ1wnICd1JyBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXQorICAgICAgICAgICAgICovCisgICAgICAgICAgY2FzZSBUX0xCUkFDS0VUOiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2hhcmFjdGVyQ2xhc3ModHJ1ZSk7CisgICAgICAgICAgY2FzZSBUX1NFVF9PUEVSQVRJT05TOiByZXR1cm4gdGhpcy5wYXJzZVNldE9wZXJhdGlvbnMoKTsKKworICAgICAgICAgIGNhc2UgVF9CQUNLU09MSURVUzoKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyZGF0YSkgeworICAgICAgICAgICAgICBjYXNlICdkJzogIGNhc2UgJ0QnOgorICAgICAgICAgICAgICBjYXNlICd3JzogIGNhc2UgJ1cnOgorICAgICAgICAgICAgICBjYXNlICdzJzogIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgIHRvayA9IHRoaXMuZ2V0VG9rZW5Gb3JTaG9ydGhhbmQodGhpcy5jaGFyZGF0YSk7CisgICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvazsKKworICAgICAgICAgICAgICBjYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnbic6ICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgY2FzZSAndCc6ICBjYXNlICd1JzogIGNhc2UgJ3YnOiAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2gyID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaDIgPCAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVDaGFyKGNoMik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVTdHJpbmcoUkVVdGlsLmRlY29tcG9zZVRvU3Vycm9nYXRlcyhjaDIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlICdjJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX2MoKTsKKyAgICAgICAgICAgICAgY2FzZSAnQyc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19DKCk7CisgICAgICAgICAgICAgIGNhc2UgJ2knOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfaSgpOworICAgICAgICAgICAgICBjYXNlICdJJzogcmV0dXJuIHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX0koKTsKKyAgICAgICAgICAgICAgY2FzZSAnZyc6IHJldHVybiB0aGlzLnByb2Nlc3NCYWNrc29saWR1c19nKCk7CisgICAgICAgICAgICAgIGNhc2UgJ1gnOiByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3NvbGlkdXNfWCgpOworICAgICAgICAgICAgICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6ICBjYXNlICc0JzoKKyAgICAgICAgICAgICAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOiAgY2FzZSAnOCc6ICBjYXNlICc5JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQmFja3JlZmVyZW5jZSgpOworCisgICAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBpbnQgcHN0YXJ0ID0gdGhpcy5vZmZzZXQ7CisgICAgICAgICAgICAgICAgdG9rID0gcHJvY2Vzc0JhY2tzb2xpZHVzX3BQKHRoaXMuY2hhcmRhdGEpOworICAgICAgICAgICAgICAgIGlmICh0b2sgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjUiLCBwc3RhcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlQ2hhcih0aGlzLmNoYXJkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFRfQ0hBUjoKKyAgICAgICAgICAgIHRvayA9IFRva2VuLmNyZWF0ZUNoYXIodGhpcy5jaGFyZGF0YSk7CisgICAgICAgICAgICBpbnQgaGlnaCA9IHRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGhpZ2gpCisgICAgICAgICAgICAgICAgJiYgdGhpcy5yZWFkKCkgPT0gVF9DSEFSICYmIFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZSh0aGlzLmNoYXJkYXRhKSkgeworICAgICAgICAgICAgICAgIGNoYXJbXSBzdXIgPSBuZXcgY2hhclsyXTsKKyAgICAgICAgICAgICAgICBzdXJbMF0gPSAoY2hhciloaWdoOworICAgICAgICAgICAgICAgIHN1clsxXSA9IChjaGFyKXRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUGFyZW4oVG9rZW4uY3JlYXRlU3RyaW5nKG5ldyBTdHJpbmcoc3VyKSksIDApOworICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uNCIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJhbmdlVG9rZW4gcHJvY2Vzc0JhY2tzb2xpZHVzX3BQKGludCBjKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBib29sZWFuIHBvc2l0aXZlID0gYyA9PSAncCc7CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uMiIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICBSYW5nZVRva2VuIHRvazsKKyAgICAgICAgc3dpdGNoICh0aGlzLmNoYXJkYXRhKSB7CisgICAgICAgICAgY2FzZSAnTCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXR0ZXIKKyAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJMIiwgcG9zaXRpdmUpOyAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnTSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiTSIsIHBvc2l0aXZlKTsgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ04nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiTiIsIHBvc2l0aXZlKTsgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1onOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VwYXJhdG9yCisgICAgICAgICAgICB0b2sgPSBUb2tlbi5nZXRSYW5nZSgiWiIsIHBvc2l0aXZlKTsgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ0MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIKKyAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKCJDIiwgcG9zaXRpdmUpOyAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnUCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdW5jdHVhdGlvbgorICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIlAiLCBwb3NpdGl2ZSk7ICBicmVhazsKKyAgICAgICAgICBjYXNlICdTJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbAorICAgICAgICAgICAgdG9rID0gVG9rZW4uZ2V0UmFuZ2UoIlMiLCBwb3NpdGl2ZSk7ICBicmVhazsKKyAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIC8vIHRoaXMub2Zmc2V0IHBvaW50cyB0aGUgbmV4dCBvZiAneycuCisgICAgICAgICAgICAvL3BzdGFydCA9IHRoaXMub2Zmc2V0OworICAgICAgICAgICAgaW50IG5hbWVzdGFydCA9IHRoaXMub2Zmc2V0OworICAgICAgICAgICAgaW50IG5hbWVlbmQgPSB0aGlzLnJlZ2V4LmluZGV4T2YoJ30nLCBuYW1lc3RhcnQpOworICAgICAgICAgICAgaWYgKG5hbWVlbmQgPCAwKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uMyIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgICAgIFN0cmluZyBwbmFtZSA9IHRoaXMucmVnZXguc3Vic3RyaW5nKG5hbWVzdGFydCwgbmFtZWVuZCk7CisgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG5hbWVlbmQrMTsKKyAgICAgICAgICAgIHRvayA9IFRva2VuLmdldFJhbmdlKHBuYW1lLCBwb3NpdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkKKyAgICAgICAgICAgICAgdG9rID0gUmFuZ2VUb2tlbi5jcmVhdGVDYXNlSW5zZW5zaXRpdmVUb2tlbih0b2spOworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5hdG9tLjIiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKworICAgIGludCBwcm9jZXNzQ0lpbkNoYXJhY3RlckNsYXNzKFJhbmdlVG9rZW4gdG9rLCBpbnQgYykgeworICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVFc2NhcGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hhci1jbGFzcyA6Oj0gJ1snICggJ14nPyByYW5nZSAnLCc/KSsgJ10nCisgICAgICogcmFuZ2UgOjo9ICdcZCcgfCAnXHcnIHwgJ1xzJyB8IGNhdGVnb3J5LWJsb2NrIHwgcmFuZ2UtY2hhcgorICAgICAqICAgICAgICAgICB8IHJhbmdlLWNoYXIgJy0nIHJhbmdlLWNoYXIKKyAgICAgKiByYW5nZS1jaGFyIDo6PSAnXFsnIHwgJ1xdJyB8ICdcXCcgfCAnXCcgWywtZWZucnR2XSB8IGJtcC1jb2RlIHwgY2hhcmFjdGVyLTIKKyAgICAgKiBibXAtY29kZSA6Oj0gJ1wnICd1JyBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXSBbMC05YS1mQS1GXQorICAgICAqLworICAgIHByb3RlY3RlZCBSYW5nZVRva2VuIHBhcnNlQ2hhcmFjdGVyQ2xhc3MoYm9vbGVhbiB1c2VOcmFuZ2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuc2V0Q29udGV4dChTX0lOQlJBQ0tFVFMpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ1snCisgICAgICAgIGJvb2xlYW4gbnJhbmdlID0gZmFsc2U7CisgICAgICAgIFJhbmdlVG9rZW4gYmFzZSA9IG51bGw7CisgICAgICAgIFJhbmdlVG9rZW4gdG9rOworICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9DSEFSICYmIHRoaXMuY2hhcmRhdGEgPT0gJ14nKSB7CisgICAgICAgICAgICBucmFuZ2UgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ14nCisgICAgICAgICAgICBpZiAodXNlTnJhbmdlKSB7CisgICAgICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlTlJhbmdlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2UgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgICAgIGJhc2UuYWRkUmFuZ2UoMCwgVG9rZW4uVVRGMTZfTUFYKTsKKyAgICAgICAgICAgICAgICB0b2sgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9rID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdGxvb3AgPSB0cnVlOworICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9FT0YpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJyAmJiAhZmlyc3Rsb29wKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmlyc3Rsb29wID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgYyA9IHRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICBib29sZWFuIGVuZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVF9CQUNLU09MSURVUykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6ICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOiAgY2FzZSAnVyc6CisgICAgICAgICAgICAgICAgICBjYXNlICdzJzogIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgICAgICB0b2subWVyZ2VSYW5nZXModGhpcy5nZXRUb2tlbkZvclNob3J0aGFuZChjKSk7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICBjYXNlICdpJzogIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6ICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRoaXMucHJvY2Vzc0NJaW5DaGFyYWN0ZXJDbGFzcyh0b2ssIGMpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDApICBlbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgICAgICBpbnQgcHN0YXJ0ID0gdGhpcy5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rMiA9IHRoaXMucHJvY2Vzc0JhY2tzb2xpZHVzX3BQKGMpOworICAgICAgICAgICAgICAgICAgICBpZiAodG9rMiA9PSBudWxsKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmF0b20uNSIsIHBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyh0b2syKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLmRlY29kZUVzY2FwZWQoKTsKKyAgICAgICAgICAgICAgICB9IC8vIFwgKyBjCisgICAgICAgICAgICB9IC8vIGJhY2tzb2xpZHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQT1NJWCBDaGFyYWN0ZXIgY2xhc3Mgc3VjaCBhcyBbOmFsbnVtOl0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gVF9QT1NJWF9DSEFSQ0xBU1NfU1RBUlQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFtZWVuZCA9IHRoaXMucmVnZXguaW5kZXhPZignOicsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZWVuZCA8IDApIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4xIiwgdGhpcy5vZmZzZXQpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcG9zaXRpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlZ2V4LmNoYXJBdCh0aGlzLm9mZnNldCkgPT0gJ14nKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ICsrOworICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRoaXMucmVnZXguc3Vic3RyaW5nKHRoaXMub2Zmc2V0LCBuYW1lZW5kKTsKKyAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gVG9rZW4uZ2V0UmFuZ2UobmFtZSwgcG9zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uWE1MU0NIRU1BX01PREUpKTsKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4zIiwgdGhpcy5vZmZzZXQpOworICAgICAgICAgICAgICAgIHRvay5tZXJnZVJhbmdlcyhyYW5nZSk7CisgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZWVuZCsxID49IHRoaXMucmVnZXhsZW4gfHwgdGhpcy5yZWdleC5jaGFyQXQobmFtZWVuZCsxKSAhPSAnXScpCisgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuZXgoInBhcnNlci5jYy4xIiwgbmFtZWVuZCk7CisgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBuYW1lZW5kKzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzaG9ydGhhbmRzLi4uCisgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCB0aGlzLmNoYXJkYXRhICE9ICctJykgeyAvLyBIZXJlIGlzIG5vICctJy4KKyAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKGMsIGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpOyAvLyBTa2lwcyAnLScKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0gdGhpcy5yZWFkKCkpID09IFRfRU9GKSAgdGhyb3cgdGhpcy5leCgicGFyc2VyLmNjLjIiLCB0aGlzLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKGMsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmFkZFJhbmdlKCctJywgJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByYW5nZWVuZCA9IHRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0JBQ0tTT0xJRFVTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlZW5kID0gdGhpcy5kZWNvZGVFc2NhcGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvay5hZGRSYW5nZShjLCByYW5nZWVuZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5TUEVDSUFMX0NPTU1BKQorICAgICAgICAgICAgICAgICYmIHRoaXMucmVhZCgpID09IFRfQ0hBUiAmJiB0aGlzLmNoYXJkYXRhID09ICcsJykKKyAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5yZWFkKCkgPT0gVF9FT0YpCisgICAgICAgICAgICB0aHJvdyB0aGlzLmV4KCJwYXJzZXIuY2MuMiIsIHRoaXMub2Zmc2V0KTsKKyAgICAgICAgaWYgKCF1c2VOcmFuZ2UgJiYgbnJhbmdlKSB7CisgICAgICAgICAgICBiYXNlLnN1YnRyYWN0UmFuZ2VzKHRvayk7CisgICAgICAgICAgICB0b2sgPSBiYXNlOworICAgICAgICB9CisgICAgICAgIHRvay5zb3J0UmFuZ2VzKCk7CisgICAgICAgIHRvay5jb21wYWN0UmFuZ2VzKCk7CisgICAgICAgIC8vdG9rLmR1bXBSYW5nZXMoKTsKKyAgICAgICAgLyoKKyAgICAgICAgaWYgKHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKQorICAgICAgICAgICAgdG9rID0gUmFuZ2VUb2tlbi5jcmVhdGVDYXNlSW5zZW5zaXRpdmVUb2tlbih0b2spOworICAgICAgICAqLworICAgICAgICB0aGlzLnNldENvbnRleHQoU19OT1JNQUwpOworICAgICAgICB0aGlzLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIC8vIFNraXBzICddJworCisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogJyg/WycgLi4uICddJyAoKCctJyB8ICcrJyB8ICcmJykgJ1snIC4uLiAnXScpPyAnKScKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZ2VUb2tlbiBwYXJzZVNldE9wZXJhdGlvbnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBSYW5nZVRva2VuIHRvayA9IHRoaXMucGFyc2VDaGFyYWN0ZXJDbGFzcyhmYWxzZSk7CisgICAgICAgIGludCB0eXBlOworICAgICAgICB3aGlsZSAoKHR5cGUgPSB0aGlzLnJlYWQoKSkgIT0gVF9SUEFSRU4pIHsKKyAgICAgICAgICAgIGludCBjaCA9IHRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBUX0NIQVIgJiYgKGNoID09ICctJyB8fCBjaCA9PSAnJicpCisgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBUX1BMVVMpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9MQlJBQ0tFVCkgdGhyb3cgZXgoInBhcnNlci5vcGUuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdDIgPSB0aGlzLnBhcnNlQ2hhcmFjdGVyQ2xhc3MoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFRfUExVUykKKyAgICAgICAgICAgICAgICAgICAgdG9rLm1lcmdlUmFuZ2VzKHQyKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnLScpCisgICAgICAgICAgICAgICAgICAgIHRvay5zdWJ0cmFjdFJhbmdlcyh0Mik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJyYnKQorICAgICAgICAgICAgICAgICAgICB0b2suaW50ZXJzZWN0UmFuZ2VzKHQyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBU1NFUlQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5vcGUuMiIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICByZXR1cm4gdG9rOworICAgIH0KKworICAgIFRva2VuIGdldFRva2VuRm9yU2hvcnRoYW5kKGludCBjaCkgeworICAgICAgICBUb2tlbiB0b2s7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCisgICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiTmQiLCB0cnVlKSA6IFRva2VuLnRva2VuXzB0bzk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgIHRvayA9IHRoaXMuaXNTZXQoUmVndWxhckV4cHJlc3Npb24uVVNFX1VOSUNPREVfQ0FURUdPUlkpCisgICAgICAgICAgICAgICAgPyBUb2tlbi5nZXRSYW5nZSgiTmQiLCBmYWxzZSkgOiBUb2tlbi50b2tlbl9ub3RfMHRvOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKKyAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1dvcmQiLCB0cnVlKSA6IFRva2VuLnRva2VuX3dvcmRjaGFyczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKKyAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1dvcmQiLCBmYWxzZSkgOiBUb2tlbi50b2tlbl9ub3Rfd29yZGNoYXJzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICB0b2sgPSB0aGlzLmlzU2V0KFJlZ3VsYXJFeHByZXNzaW9uLlVTRV9VTklDT0RFX0NBVEVHT1JZKQorICAgICAgICAgICAgICAgID8gVG9rZW4uZ2V0UmFuZ2UoIklzU3BhY2UiLCB0cnVlKSA6IFRva2VuLnRva2VuX3NwYWNlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgdG9rID0gdGhpcy5pc1NldChSZWd1bGFyRXhwcmVzc2lvbi5VU0VfVU5JQ09ERV9DQVRFR09SWSkKKyAgICAgICAgICAgICAgICA/IFRva2VuLmdldFJhbmdlKCJJc1NwYWNlIiwgZmFsc2UpIDogVG9rZW4udG9rZW5fbm90X3NwYWNlczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogc2hvcnRoYW5kczogXFx1IitJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b2s7CisgICAgfQorCisgICAgLyoqCisgICAgICovCisgICAgaW50IGRlY29kZUVzY2FwZWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9CQUNLU09MSURVUykgIHRocm93IGV4KCJwYXJzZXIubmV4dC4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgIGludCBjID0gdGhpcy5jaGFyZGF0YTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgY2FzZSAnZSc6ICBjID0gMHgxYjsgIGJyZWFrOyAvLyBFU0NBUEUgVSswMDFCCisgICAgICAgICAgY2FzZSAnZic6ICBjID0gJ1xmJzsgIGJyZWFrOyAvLyBGT1JNIEZFRUQgVSswMDBDCisgICAgICAgICAgY2FzZSAnbic6ICBjID0gJ1xuJzsgIGJyZWFrOyAvLyBMSU5FIEZFRUQgVSswMDBBCisgICAgICAgICAgY2FzZSAncic6ICBjID0gJ1xyJzsgIGJyZWFrOyAvLyBDUlJJQUdFIFJFVFVSTiBVKzAwMEQKKyAgICAgICAgICBjYXNlICd0JzogIGMgPSAnXHQnOyAgYnJlYWs7IC8vIEhPUklaT05UQUwgVEFCVUxBVElPTiBVKzAwMDkKKyAgICAgICAgICAvL2Nhc2UgJ3YnOiAgYyA9IDB4MGI7ICBicmVhazsgLy8gVkVSVElDQUwgVEFCVUxBVElPTiBVKzAwMEIKKyAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUikgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICBpZiAodGhpcy5jaGFyZGF0YSA9PSAneycpIHsKKyAgICAgICAgICAgICAgICBpbnQgdjEgPSAwOworICAgICAgICAgICAgICAgIGludCB1diA9IDA7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUikgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHV2ID4gdXYqMTYpIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4yIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhcmRhdGEgIT0gJ30nKSAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjMiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgICAgICBpZiAodXYgPiBUb2tlbi5VVEYxNl9NQVgpICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuNCIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgICAgIGMgPSB1djsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHYxID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgICAgICBpbnQgdXYgPSB2MTsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgICAgICB1diA9IHV2KjE2K3YxOworICAgICAgICAgICAgICAgIGMgPSB1djsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICBpbnQgdjEgPSAwOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgaW50IHV2ID0gdjE7CisgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICB1diA9IHV2KjE2K3YxOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7CisgICAgICAgICAgICBjID0gdXY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgdXYgPSB2MTsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7CisgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICB1diA9IHV2KjE2K3YxOworICAgICAgICAgICAgdGhpcy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGhpcy5yZWFkKCkgIT0gVF9DSEFSIHx8ICh2MSA9IGhleENoYXIodGhpcy5jaGFyZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBleCgicGFyc2VyLmRlc2NhcGUuMSIsIHRoaXMub2Zmc2V0LTEpOworICAgICAgICAgICAgdXYgPSB1dioxNit2MTsKKyAgICAgICAgICAgIHRoaXMubmV4dCgpOworICAgICAgICAgICAgaWYgKHRoaXMucmVhZCgpICE9IFRfQ0hBUiB8fCAodjEgPSBoZXhDaGFyKHRoaXMuY2hhcmRhdGEpKSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBlLjEiLCB0aGlzLm9mZnNldC0xKTsKKyAgICAgICAgICAgIHV2ID0gdXYqMTYrdjE7CisgICAgICAgICAgICB0aGlzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJlYWQoKSAhPSBUX0NIQVIgfHwgKHYxID0gaGV4Q2hhcih0aGlzLmNoYXJkYXRhKSkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS4xIiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICB1diA9IHV2KjE2K3YxOworICAgICAgICAgICAgaWYgKHV2ID4gVG9rZW4uVVRGMTZfTUFYKSAgdGhyb3cgZXgoInBhcnNlci5kZXNjYXBwZS40IiwgdGhpcy5vZmZzZXQtMSk7CisgICAgICAgICAgICBjID0gdXY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgIHRocm93IGV4KCJwYXJzZXIuZGVzY2FwZS41IiwgdGhpcy5vZmZzZXQtMik7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgaGV4Q2hhcihpbnQgY2gpIHsKKyAgICAgICAgaWYgKGNoIDwgJzAnKSAgcmV0dXJuIC0xOworICAgICAgICBpZiAoY2ggPiAnZicpICByZXR1cm4gLTE7CisgICAgICAgIGlmIChjaCA8PSAnOScpICByZXR1cm4gY2gtJzAnOworICAgICAgICBpZiAoY2ggPCAnQScpICByZXR1cm4gLTE7CisgICAgICAgIGlmIChjaCA8PSAnRicpICByZXR1cm4gY2gtJ0EnKzEwOworICAgICAgICBpZiAoY2ggPCAnYScpICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBjaC0nYScrMTA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjUzMDMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L1JlZ3VsYXJFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzMTQ3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXg7CisKK2ltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CisKKy8qKgorICogQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgZW5naW5lIHVzaW5nIE5vbi1kZXRlcm1pbmlzdGljIEZpbml0ZSBBdXRvbWF0b24gKE5GQSkuCisgKiBUaGlzIGVuZ2luZSBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24uCisgKgorICogPGhyIHdpZHRoPSI1MCUiPgorICogPGgzPkhvdyB0byB1c2U8L2gzPgorICoKKyAqIDxkbD4KKyAqICAgPGR0PkEuIFN0YW5kYXJkIHdheQorICogICA8ZGQ+CisgKiA8cHJlPgorICogUmVndWxhckV4cHJlc3Npb24gcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oPHZhcj5yZWdleDwvdmFyPik7CisgKiBpZiAocmUubWF0Y2hlcyh0ZXh0KSkgeyAuLi4gfQorICogPC9wcmU+CisgKgorICogICA8ZHQ+Qi4gQ2FwdHVyaW5nIGdyb3VwcworICogICA8ZGQ+CisgKiA8cHJlPgorICogUmVndWxhckV4cHJlc3Npb24gcmUgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oPHZhcj5yZWdleDwvdmFyPik7CisgKiBNYXRjaCBtYXRjaCA9IG5ldyBNYXRjaCgpOworICogaWYgKHJlLm1hdGNoZXModGV4dCwgbWF0Y2gpKSB7CisgKiAgICAgLi4uIC8vIFlvdSBjYW4gcmVmZXIgY2FwdHVyZWQgdGV4dHMgd2l0aCBtZXRob2RzIG9mIHRoZSA8Y29kZT5NYXRjaDwvY29kZT4gY2xhc3MuCisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8L2RsPgorICoKKyAqIDxoND5DYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nPC9oND4KKyAqIDxwcmU+CisgKiBSZWd1bGFyRXhwcmVzc2lvbiByZSA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbig8dmFyPnJlZ2V4PC92YXI+LCAiaSIpOworICogaWYgKHJlLm1hdGNoZXModGV4dCkgPj0gMCkgeyAuLi59CisgKiA8L3ByZT4KKyAqCisgKiA8aDQ+T3B0aW9uczwvaDQ+CisgKiA8cD5Zb3UgY2FuIHNwZWNpZnkgb3B0aW9ucyB0byA8YSBocmVmPSIjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykiPjxjb2RlPlJlZ3VsYXJFeHByZXNzaW9uKDwvY29kZT48dmFyPnJlZ2V4PC92YXI+PGNvZGU+LCA8L2NvZGU+PHZhcj5vcHRpb25zPC92YXI+PGNvZGU+KTwvY29kZT48L2E+CisgKiAgICBvciA8YSBocmVmPSIjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKSI+PGNvZGU+c2V0UGF0dGVybig8L2NvZGU+PHZhcj5yZWdleDwvdmFyPjxjb2RlPiwgPC9jb2RlPjx2YXI+b3B0aW9uczwvdmFyPjxjb2RlPik8L2NvZGU+PC9hPi4KKyAqICAgIFRoaXMgPHZhcj5vcHRpb25zPC92YXI+IHBhcmFtZXRlciBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMuCisgKiA8L3A+CisgKiA8ZGw+CisgKiAgIDxkdD48YSBuYW1lPSJJX09QVElPTiI+PGNvZGU+ImkiPC9jb2RlPjwvYT4KKyAqICAgPGRkPlRoaXMgb3B0aW9uIGluZGljYXRlcyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLgorICogICA8ZHQ+PGEgbmFtZT0iTV9PUFRJT04iPjxjb2RlPiJtIjwvY29kZT48L2E+CisgKiAgIDxkZCBjbGFzcz0iUkVHRVgiPjxrYmQ+Xjwva2JkPiBhbmQgPGtiZD4kPC9rYmQ+IGNvbnNpZGVyIHRoZSBFT0wgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHRleHQuCisgKiAgIDxkdD48YSBuYW1lPSJTX09QVElPTiI+PGNvZGU+InMiPC9jb2RlPjwvYT4KKyAqICAgPGRkIGNsYXNzPSJSRUdFWCI+PGtiZD4uPC9rYmQ+IG1hdGNoZXMgYW55IG9uZSBjaGFyYWN0ZXIuCisgKiAgIDxkdD48YSBuYW1lPSJVX09QVElPTiI+PGNvZGU+InUiPC9jb2RlPjwvYT4KKyAqICAgPGRkIGNsYXNzPSJSRUdFWCI+UmVkZWZpbmVzIDxLYmQ+XGQgXEQgXHcgXFcgXHMgXFMgXGIgXEIgXCZsdDsgXD48L2tiZD4gYXMgYmVjb21pbmcgdG8gVW5pY29kZS4KKyAqICAgPGR0PjxhIG5hbWU9IldfT1BUSU9OIj48Y29kZT4idyI8L2NvZGU+PC9hPgorICogICA8ZGQgY2xhc3M9IlJFR0VYIj5CeSB0aGlzIG9wdGlvbiwgPGtiZD5cYiBcQiBcJmx0OyBcPjwva2JkPiBhcmUgcHJvY2Vzc2VkIHdpdGggdGhlIG1ldGhvZCBvZgorICogICAgICAnVW5pY29kZSBSZWd1bGFyIEV4cHJlc3Npb24gR3VpZGVsaW5lcycgUmV2aXNpb24gNC4KKyAqICAgICAgV2hlbiAidyIgYW5kICJ1IiBhcmUgc3BlY2lmaWVkIGF0IHRoZSBzYW1lIHRpbWUsCisgKiAgICAgIDxrYmQ+XGIgXEIgXCZsdDsgXD48L2tiZD4gYXJlIHByb2Nlc3NlZCBmb3IgdGhlICJ3IiBvcHRpb24uCisgKiAgIDxkdD48YSBuYW1lPSJDT01NQV9PUFRJT04iPjxjb2RlPiIsIjwvY29kZT48L2E+CisgKiAgIDxkZD5UaGUgcGFyc2VyIHRyZWF0cyBhIGNvbW1hIGluIGEgY2hhcmFjdGVyIGNsYXNzIGFzIGEgcmFuZ2Ugc2VwYXJhdG9yLgorICogICAgICA8a2JkIGNsYXNzPSJSRUdFWCI+W2EsYl08L2tiZD4gbWF0Y2hlcyA8a2JkPmE8L2tiZD4gb3IgPGtiZD4sPC9rYmQ+IG9yIDxrYmQ+Yjwva2JkPiB3aXRob3V0IHRoaXMgb3B0aW9uLgorICogICAgICA8a2JkIGNsYXNzPSJSRUdFWCI+W2EsYl08L2tiZD4gbWF0Y2hlcyA8a2JkPmE8L2tiZD4gb3IgPGtiZD5iPC9rYmQ+IHdpdGggdGhpcyBvcHRpb24uCisgKgorICogICA8ZHQ+PGEgbmFtZT0iWF9PUFRJT04iPjxjb2RlPiJYIjwvY29kZT48L2E+CisgKiAgIDxkZCBjbGFzcz0iUkVHRVgiPgorICogICAgICAgQnkgdGhpcyBvcHRpb24sIHRoZSBlbmdpbmUgY29uZm9tcyB0byA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1dELXhtbHNjaGVtYS0yLTIwMDAwNDA3LyNyZWdleHMiPlhNTCBTY2hlbWE6IFJlZ3VsYXIgRXhwcmVzc2lvbjwvYT4uCisgKiAgICAgICBUaGUgPGNvZGU+bWF0Y2goKTwvY29kZT4gbWV0aG9kIGRvZXMgbm90IGRvIHN1YnNyaW5nIG1hdGNoaW5nCisgKiAgICAgICBidXQgZW50aXJlIHN0cmluZyBtYXRjaGluZy4KKyAqCisgKiA8L2RsPgorICogCisgKiA8aHIgd2lkdGg9IjUwJSI+CisgKiA8aDM+U3ludGF4PC9oMz4KKyAqIDx0YWJsZSBib3JkZXI9IjEiIGJnY29sb3I9IiNkZGVlZmYiPgorICogICA8dHI+CisgKiAgICA8dGQ+CisgKiAgICAgPGg0PkRpZmZlcmVuY2VzIGZyb20gdGhlIFBlcmwgNSByZWd1bGFyIGV4cHJlc3Npb248L2g0PgorICogICAgIDx1bD4KKyAqICAgICAgPGxpPlRoZXJlIGlzIDYtZGlnaXQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uICAoPGtiZD5cdTAwNWN2PC9rYmQ+PHZhcj5ISEhISEg8L3Zhcj4uKQorICogICAgICA8bGk+U3VwcG9ydHMgc3VidHJhY3Rpb24sIHVuaW9uLCBhbmQgaW50ZXJzZWN0aW9uIG9wZXJhdGlvbnMgZm9yIGNoYXJhY3RlciBjbGFzc2VzLgorICogICAgICA8bGk+Tm90IHN1cHBvcnRlZDogPGtiZD5cPC9rYmQ+PHZhcj5vb288L3Zhcj4gKE9jdGFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbnMpLAorICogICAgICAgICAgPEtiZD5cRzwva2JkPiwgPGtiZD5cQzwva2JkPiwgPGtiZD5cbDwva2JkPjx2YXI+YzwvdmFyPiwKKyAqICAgICAgICAgIDxrYmQ+XHUwMDVjIHU8L2tiZD48dmFyPmM8L3Zhcj4sIDxrYmQ+XEw8L2tiZD4sIDxrYmQ+XFU8L2tiZD4sCisgKiAgICAgICAgICA8a2JkPlxFPC9rYmQ+LCA8a2JkPlxRPC9rYmQ+LCA8a2JkPlxOezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPiwKKyAqICAgICAgICAgIDxLYmQ+KD97PGtiZD48dmFyPmNvZGU8L3Zhcj48a2JkPn0pPC9rYmQ+LCA8S2JkPig/P3s8a2JkPjx2YXI+Y29kZTwvdmFyPjxrYmQ+fSk8L2tiZD4KKyAqICAgICA8L3VsPgorICogICAgPC90ZD4KKyAqICAgPC90cj4KKyAqIDwvdGFibGU+CisgKgorICogPFA+TWV0YSBjaGFyYWN0ZXJzIGFyZSBgPEtCRD4uICogKyA/IHsgWyAoICkgfCBcIF4gJDwvS0JEPicuPC9QPgorICogPHVsPgorICogICA8bGk+Q2hhcmFjdGVyCisgKiAgICAgPGRsPgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4uPC9rYmQ+IChBIHBlcmlvZCkKKyAqICAgICAgIDxkZD5NYXRjaGVzIGFueSBvbmUgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMuCisgKiAgICAgICA8ZGQ+TElORSBGRUVEIChVKzAwMEEpLCBDQVJSSUFHRSBSRVRVUk4gKFUrMDAwRCksCisgKiAgICAgICAgICAgUEFSQUdSQVBIIFNFUEFSQVRPUiAoVSsyMDI5KSwgTElORSBTRVBBUkFUT1IgKFUrMjAyOCkKKyAqICAgICAgIDxkZD5UaGlzIGV4cHJlc3Npb24gbWF0Y2hlcyBvbmUgY29kZSBwb2ludCBpbiBVbmljb2RlLiBJdCBjYW4gbWF0Y2ggYSBwYWlyIG9mIHN1cnJvZ2F0ZXMuCisgKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjU19PUFRJT04iPnRoZSAicyIgb3B0aW9uPC9hPiBpcyBzcGVjaWZpZWQsCisgKiAgICAgICAgICAgaXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluY2x1ZGluZyB0aGUgYWJvdmUgZm91ciBjaGFyYWN0ZXJzLgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLYmQ+XGUgXGYgXG4gXHIgXHQ8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIEVTQ0FQRSAoVSswMDFCKSwgRk9STSBGRUVEIChVKzAwMEMpLCBMSU5FIEZFRUQgKFUrMDAwQSksCisgKiAgICAgICAgICAgQ0FSUklBR0UgUkVUVVJOIChVKzAwMEQpLCBIT1JJWk9OVEFMIFRBQlVMQVRJT04gKFUrMDAwOSkKKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxjPC9rYmQ+PHZhcj5DPC92YXI+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNvbnRyb2wgY2hhcmFjdGVyLgorICogICAgICAgICAgIFRoZSA8dmFyPkM8L3Zhcj4gbXVzdCBiZSBvbmUgb2YgJzxrYmQ+QDwva2JkPicsICc8a2JkPkE8L2tiZD4nLSc8a2JkPlo8L2tiZD4nLAorICogICAgICAgICAgICc8a2JkPls8L2tiZD4nLCAnPGtiZD5cdTAwNWM8L2tiZD4nLCAnPGtiZD5dPC9rYmQ+JywgJzxrYmQ+Xjwva2JkPicsICc8a2JkPl88L2tiZD4nLgorICogICAgICAgICAgIEl0IG1hdGNoZXMgYSBjb250cm9sIGNoYXJhY3RlciBvZiB3aGljaCB0aGUgY2hhcmFjdGVyIGNvZGUgaXMgbGVzcyB0aGFuCisgKiAgICAgICAgICAgdGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSA8dmFyPkM8L3Zhcj4gYnkgMHgwMDQwLgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+Rm9yIGV4YW1wbGUsIGEgPGtiZD5cY0o8L2tiZD4gbWF0Y2hlcyBhIExJTkUgRkVFRCAoVSswMDBBKSwKKyAqICAgICAgICAgICBhbmQgYSA8a2JkPlxjWzwva2JkPiBtYXRjaGVzIGFuIEVTQ0FQRSAoVSswMDFCKS4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj5hIG5vbi1tZXRhIGNoYXJhY3RlcgorICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGNoYXJhY3Rlci4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S0JEPlw8L0tCRD4gKyBhIG1ldGEgY2hhcmFjdGVyCisgKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgbWV0YSBjaGFyYWN0ZXIuCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdTAwNWN4PC9rYmQ+PHZhcj5ISDwvdmFyPiA8a2JkPlx1MDA1Y3h7PC9rYmQ+PHZhcj5ISEhIPC92YXI+PGtiZD59PC9rYmQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNoYXJhY3RlciBvZiB3aGljaCBjb2RlIHBvaW50IGlzIDx2YXI+SEg8L3Zhcj4gKEhleGFkZWNpbWFsKSBpbiBVbmljb2RlLgorICogICAgICAgICAgIFlvdSBjYW4gd3JpdGUganVzdCAyIGRpZ2l0cyBmb3IgPGtiZD5cdTAwNWN4PC9rYmQ+PHZhcj5ISDwvdmFyPiwgYW5kCisgKiAgICAgICAgICAgdmFyaWFibGUgbGVuZ3RoIGRpZ2l0cyBmb3IgPGtiZD5cdTAwNWN4ezwva2JkPjx2YXI+SEhISDwvdmFyPjxrYmQ+fTwva2JkPi4KKyAqCisgKiAgICAgICA8IS0tCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx1MDA1YyB1PC9rYmQ+PHZhcj5ISEhIPC92YXI+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyBhIGNoYXJhY3RlciBvZiB3aGljaCBjb2RlIHBvaW50IGlzIDx2YXI+SEhISDwvdmFyPiAoSGV4YWRlY2ltYWwpIGluIFVuaWNvZGUuCisgKiAgICAgICAtLT4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlx1MDA1Y3Y8L2tiZD48dmFyPkhISEhISDwvdmFyPgorICogICAgICAgPGRkPk1hdGNoZXMgYSBjaGFyYWN0ZXIgb2Ygd2hpY2ggY29kZSBwb2ludCBpcyA8dmFyPkhISEhISDwvdmFyPiAoSGV4YWRlY2ltYWwpIGluIFVuaWNvZGUuCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cZzwva2JkPgorICogICAgICAgPGRkPk1hdGNoZXMgYSBncmFwaGVtZS4KKyAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkl0IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD4oP1tccHtBU1NJR05FRH1dLVtccHtNfVxwe0N9XSk/KD86XHB7TX18W1x4ezA5NER9XHh7MDlDRH1ceHswQTREfVx4ezBBQ0R9XHh7MEIzRH1ceHswQkNEfVx4ezBDNER9XHh7MENDRH1ceHswRDREfVx4ezBFM0F9XHh7MEY4NH1dXHB7TH18W1x4ezExNjB9LVx4ezExQTd9XXxbXHh7MTFBOH0tXHh7MTFGRn1dfFtceHtGRjlFfVx4e0ZGOUZ9XSkqPC9rYmQ+CisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cWDwva2JkPgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+TWF0Y2hlcyBhIGNvbWJpbmluZyBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgKiAgICAgICBJdCBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+KD86XFBNXHBNKik8L2tiZD4KKyAqICAgICA8L2RsPgorICogICA8L2xpPgorICoKKyAqICAgPGxpPkNoYXJhY3RlciBjbGFzcworICogICAgIDxkbD4KKysgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48dmFyPi4uLjwvdmFyPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aG91dCA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKKysgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPi4uLjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aCA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKKyAqICAgICAgIDxkZD5Qb3NpdGl2ZSBjaGFyYWN0ZXIgY2xhc3MuICBJdCBtYXRjaGVzIGEgY2hhcmFjdGVyIGluIHJhbmdlcy4KKyAqICAgICAgIDxkZD48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj46CisgKiAgICAgICA8dWw+CisgKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPkEgY2hhcmFjdGVyIChpbmNsdWRpbmcgPEtiZD5cZSBcZiBcbiBcciBcdDwva2JkPiA8a2JkPlx1MDA1Y3g8L2tiZD48dmFyPkhIPC92YXI+IDxrYmQ+XHUwMDVjeHs8L2tiZD48dmFyPkhISEg8L3Zhcj48a2JkPn08L2tiZD4gPCEtLWtiZD5cdTAwNWMgdTwva2JkPjx2YXI+SEhISDwvdmFyLS0+IDxrYmQ+XHUwMDVjdjwva2JkPjx2YXI+SEhISEhIPC92YXI+KQorICogICAgICAgICAgICAgPHA+VGhpcyByYW5nZSBtYXRjaGVzIHRoZSBjaGFyYWN0ZXIuCisgKiAgICAgICAgIDxsaSBjbGFzcz0iUkVHRVgiPjx2YXI+QzxzdWI+MTwvc3ViPjwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+QzxzdWI+Mjwvc3ViPjwvdmFyPgorICogICAgICAgICAgICAgPHA+VGhpcyByYW5nZSBtYXRjaGVzIGEgY2hhcmFjdGVyIHdoaWNoIGhhcyBhIGNvZGUgcG9pbnQgdGhhdCBpcyA+PSA8dmFyPkM8c3ViPjE8L3N1Yj48L3Zhcj4ncyBjb2RlIHBvaW50IGFuZCAmbHQ7PSA8dmFyPkM8c3ViPjI8L3N1Yj48L3Zhcj4ncyBjb2RlIHBvaW50LgorKyAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+QSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3M6IDxLYmQ+WzphbHBoYTpdIFs6YWxudW06XSBbOmFzY2lpOl0gWzpjbnRybDpdIFs6ZGlnaXQ6XSBbOmdyYXBoOl0gWzpsb3dlcjpdIFs6cHJpbnQ6XSBbOnB1bmN0Ol0gWzpzcGFjZTpdIFs6dXBwZXI6XSBbOnhkaWdpdDpdPC9rYmQ+LAorKyAqICAgICAgICAgICAgIGFuZCBuZWdhdGl2ZSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3NlcyBpbiBQZXJsIGxpa2UgPGtiZD5bOl5hbHBoYTpdPC9rYmQ+CisgKiAgICAgICAgICAgICA8cD4uLi4KKyAqICAgICAgICAgPGxpIGNsYXNzPSJSRUdFWCI+PGtiZD5cZCBcRCBccyBcUyBcdyBcVyBccHs8L2tiZD48dmFyPm5hbWU8L3Zhcj48a2JkPn0gXFB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+CisgKiAgICAgICAgICAgICA8cD5UaGVzZSBleHByZXNzaW9ucyBzcGVjaWZpZXMgdGhlIHNhbWUgcmFuZ2VzIGFzIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMuCisgKiAgICAgICA8L3VsPgorICogICAgICAgPHAgY2xhc3M9IlJFR0VYIj5FbnVtZXJhdGVkIHJhbmdlcyBhcmUgbWVyZ2VkICh1bmlvbiBvcGVyYXRpb24pLgorICogICAgICAgICAgPGtiZD5bYS1lYy16XTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W2Etel08L2tiZD4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPltePC9rYmQ+PHZhcj5SPHN1Yj4xPC9zdWI+PC92YXI+PHZhcj5SPHN1Yj4yPC9zdWI+PC92YXI+PHZhcj4uLi48L3Zhcj48dmFyPlI8c3ViPm48L3N1Yj48L3Zhcj48a2JkPl08L2tiZD4gKHdpdGhvdXQgYSA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4iLCIgb3B0aW9uPC9hPikKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+W148L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPlI8c3ViPjI8L3N1Yj48L3Zhcj48a2JkPiw8L2tiZD48dmFyPi4uLjwvdmFyPjxrYmQ+LDwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPjwvdmFyPjxrYmQ+XTwva2JkPiAod2l0aCBhIDxhIGhyZWY9IiNDT01NQV9PUFRJT04iPiIsIiBvcHRpb248L2E+KQorICogICAgICAgPGRkPk5lZ2F0aXZlIGNoYXJhY3RlciBjbGFzcy4gIEl0IG1hdGNoZXMgYSBjaGFyYWN0ZXIgbm90IGluIHJhbmdlcy4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+PHZhcj5vcDwvdmFyPjxrYmQ+Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+PHZhcj5vcDwvdmFyPjxrYmQ+Wzwva2JkPjx2YXI+cmFuZ2VzPC92YXI+PGtiZD5dPC9rYmQ+IC4uLiA8S2JkPik8L2tiZD4KKyAqICAgICAgICg8dmFyPm9wPC92YXI+IGlzIDxrYmQ+LTwva2JkPiBvciA8a2JkPis8L2tiZD4gb3IgPGtiZD4mPC9rYmQ+LikKKyAqICAgICAgIDxkZD5TdWJ0cmFjdGlvbiBvciB1bmlvbiBvciBpbnRlcnNlY3Rpb24gZm9yIGNoYXJhY3RlciBjbGFzc2VzLgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+Rm9yIGV4bWFwbGUsIDxrYmQ+KD9bQS1aXS1bQ0ZdKTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W0EtQkQtRUctWl08L2tiZD4sIGFuZCA8a2JkPig/WzB4MDAtMHg3Zl0tW0tdJltccHtMdX1dKTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W0EtSkwtWl08L2tiZD4uCisgKiAgICAgICA8ZGQ+VGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbnMgaXMgYSA8dT5wb3NpdGl2ZSBjaGFyYWN0ZXIgY2xhc3M8L3U+CisgKiAgICAgICAgICAgZXZlbiBpZiBhbiBleHByZXNzaW9uIGluY2x1ZGVzIGFueSBuZWdhdGl2ZSBjaGFyYWN0ZXIgY2xhc3Nlcy4KKyAqICAgICAgICAgICBZb3UgaGF2ZSB0byB0YWtlIGNhcmUgb24gdGhpcyBpbiBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLgorICogICAgICAgICAgIEZvciBpbnN0YW5jZSwgPGtiZD4oP1teYl0pPC9rYmQ+IGlzIGVxdWl2YWxlbnQgdG8gPGtiZD5bXHgwMC1hYy1ceHsxMGZmZmZ9XTwva2JkPiwKKyAqICAgICAgICAgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+W15iXTwva2JkPiBpbiBjYXNlLXNlbnNpdGl2ZSBtYXRjaGluZy4KKyAqICAgICAgICAgICBCdXQsIGluIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIDxrYmQ+KD9bXmJdKTwva2JkPiBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgYmVjYXVzZQorICogICAgICAgICAgIGl0IGluY2x1ZGVzICc8a2JkPkI8L2tiZD4nIGFuZCAnPGtiZD5CPC9rYmQ+JyBtYXRjaGVzICc8a2JkPmI8L2tiZD4nCisgKiAgICAgICAgICAgdGhvdWdoIDxrYmQ+W15iXTwva2JkPiBpcyBwcm9jZXNzZWQgYXMgPGtiZD5bXkJiXTwva2JkPi4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPls8L2tiZD48dmFyPlI8c3ViPjE8L3N1Yj5SPHN1Yj4yPC9zdWI+Li4uPC92YXI+PGtiZD4tWzwva2JkPjx2YXI+UjxzdWI+bjwvc3ViPlI8c3ViPm4rMTwvc3ViPi4uLjwvdmFyPjxrYmQ+XV08L2tiZD4gKHdpdGggYW4gPGEgaHJlZj0iI1hfT1BUSU9OIj4iWCIgb3B0aW9uPC9hPik8L2R0PgorICogICAgICAgPGRkPkNoYXJhY3RlciBjbGFzcyBzdWJ0cmFjdGlvbiBmb3IgdGhlIFhNTCBTY2hlbWEuCisgKiAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBzeW50YXggd2hlbiB5b3Ugc3BlY2lmeSBhbiA8YSBocmVmPSIjWF9PUFRJT04iPiJYIiBvcHRpb248L2E+LgorICogICAgICAgICAgIAorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cZDwva2JkPgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlswLTldPC9rYmQ+LgorICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bworICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5ccHtOZH08L2tiZD48L3NwYW4+LgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEQ8L2tiZD4KKyAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bXjAtOV08L2tiZD4KKyAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XFB7TmR9PC9rYmQ+PC9zcGFuPi4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxzPC9rYmQ+CisgKiAgICAgICA8ZGQgY2xhc3M9IlJFR0VYIj5FcXVpdmFsZW50IHRvIDxrYmQ+WyBcZlxuXHJcdF08L2tiZD4KKyAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNVX09QVElPTiI+YSAidSIgb3B0aW9uPC9hPiBpcyBzZXQsIGl0IGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgICA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+WyBcZlxuXHJcdFxwe1p9XTwva2JkPjwvc3Bhbj4uCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cUzwva2JkPgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlteIFxmXG5cclx0XTwva2JkPgorICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bworICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bXiBcZlxuXHJcdFxwe1p9XTwva2JkPjwvc3Bhbj4uCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5cdzwva2JkPgorICogICAgICAgPGRkIGNsYXNzPSJSRUdFWCI+RXF1aXZhbGVudCB0byA8a2JkPlthLXpBLVowLTlfXTwva2JkPgorICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI1VfT1BUSU9OIj5hICJ1IiBvcHRpb248L2E+IGlzIHNldCwgaXQgaXMgZXF1aXZhbGVudCB0bworICogICAgICAgICAgIDxzcGFuIGNsYXNzPSJSRUdFWCI+PGtiZD5bXHB7THV9XHB7TGx9XHB7TG99XHB7TmR9X108L2tiZD48L3NwYW4+LgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XFc8L2tiZD4KKyAqICAgICAgIDxkZCBjbGFzcz0iUkVHRVgiPkVxdWl2YWxlbnQgdG8gPGtiZD5bXmEtekEtWjAtOV9dPC9rYmQ+CisgKiAgICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjVV9PUFRJT04iPmEgInUiIG9wdGlvbjwvYT4gaXMgc2V0LCBpdCBpcyBlcXVpdmFsZW50IHRvCisgKiAgICAgICAgICAgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlteXHB7THV9XHB7TGx9XHB7TG99XHB7TmR9X108L2tiZD48L3NwYW4+LgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHB7PC9rYmQ+PHZhcj5uYW1lPC92YXI+PGtiZD59PC9rYmQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyBvbmUgY2hhcmFjdGVyIGluIHRoZSBzcGVjaWZpZWQgR2VuZXJhbCBDYXRlZ29yeSAodGhlIHNlY29uZCBmaWVsZCBpbiA8YSBocmVmPSJmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvVW5pY29kZURhdGEudHh0Ij48a2JkPlVuaWNvZGVEYXRhLnR4dDwva2JkPjwvYT4pIG9yIHRoZSBzcGVjaWZpZWQgPGEgaHJlZj0iZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL0Jsb2Nrcy50eHQiPkJsb2NrPC9hPi4KKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGF2YWlsYWJsZToKKyAqICAgICAgIDxkbD4KKyAqICAgICAgICAgPGR0PlVuaWNvZGUgR2VuZXJhbCBDYXRlZ29yaWVzOgorICogICAgICAgICA8ZGQ+PGtiZD4KKyAqICAgICAgIEwsIE0sIE4sIFosIEMsIFAsIFMsIEx1LCBMbCwgTHQsIExtLCBMbywgTW4sIE1lLCBNYywgTmQsIE5sLCBObywgWnMsIFpsLCBacCwKKyAqICAgICAgIENjLCBDZiwgQ24sIENvLCBDcywgUGQsIFBzLCBQZSwgUGMsIFBvLCBTbSwgU2MsIFNrLCBTbywKKyAqICAgICAgICAgPC9rYmQ+CisgKiAgICAgICAgIDxkZD4oQ3VycmVudGx5IHRoZSBDbiBjYXRlZ29yeSBpbmNsdWRlcyBVKzEwMDAwLVUrMTBGRkZGIGNoYXJhY3RlcnMpCisgKiAgICAgICAgIDxkdD5Vbmljb2RlIEJsb2NrczoKKyAqICAgICAgICAgPGRkPjxrYmQ+CisgKiAgICAgICBCYXNpYyBMYXRpbiwgTGF0aW4tMSBTdXBwbGVtZW50LCBMYXRpbiBFeHRlbmRlZC1BLCBMYXRpbiBFeHRlbmRlZC1CLAorICogICAgICAgSVBBIEV4dGVuc2lvbnMsIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzLCBHcmVlaywKKyAqICAgICAgIEN5cmlsbGljLCBBcm1lbmlhbiwgSGVicmV3LCBBcmFiaWMsIERldmFuYWdhcmksIEJlbmdhbGksIEd1cm11a2hpLCBHdWphcmF0aSwKKyAqICAgICAgIE9yaXlhLCBUYW1pbCwgVGVsdWd1LCBLYW5uYWRhLCBNYWxheWFsYW0sIFRoYWksIExhbywgVGliZXRhbiwgR2VvcmdpYW4sCisgKiAgICAgICBIYW5ndWwgSmFtbywgTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgR3JlZWsgRXh0ZW5kZWQsIEdlbmVyYWwgUHVuY3R1YXRpb24sCisgKiAgICAgICBTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMsIEN1cnJlbmN5IFN5bWJvbHMsIENvbWJpbmluZyBNYXJrcyBmb3IgU3ltYm9scywKKyAqICAgICAgIExldHRlcmxpa2UgU3ltYm9scywgTnVtYmVyIEZvcm1zLCBBcnJvd3MsIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMsCisgKiAgICAgICBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCwgQ29udHJvbCBQaWN0dXJlcywgT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24sCisgKiAgICAgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzLCBCb3ggRHJhd2luZywgQmxvY2sgRWxlbWVudHMsIEdlb21ldHJpYyBTaGFwZXMsCisgKiAgICAgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMsIERpbmdiYXRzLCBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24sIEhpcmFnYW5hLAorICogICAgICAgS2F0YWthbmEsIEJvcG9tb2ZvLCBIYW5ndWwgQ29tcGF0aWJpbGl0eSBKYW1vLCBLYW5idW4sCisgKiAgICAgICBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzLCBDSksgQ29tcGF0aWJpbGl0eSwgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocywKKyAqICAgICAgIEhhbmd1bCBTeWxsYWJsZXMsIEhpZ2ggU3Vycm9nYXRlcywgSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzLCBMb3cgU3Vycm9nYXRlcywKKyAqICAgICAgIFByaXZhdGUgVXNlLCBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzLCBBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3JtcywKKyAqICAgICAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSwgQ29tYmluaW5nIEhhbGYgTWFya3MsIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zLAorICogICAgICAgU21hbGwgRm9ybSBWYXJpYW50cywgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CLCBTcGVjaWFscywKKyAqICAgICAgIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zCisgKiAgICAgICAgIDwva2JkPgorICogICAgICAgICA8ZHQ+T3RoZXJzOgorICogICAgICAgICA8ZGQ+PGtiZD5BTEw8L2tiZD4gKEVxdWl2YWxlbnQgdG8gPGtiZD5bXHUwMDVjdTAwMDAtXHUwMDVjdjEwRkZGRl08L2tiZD4pCisgKiAgICAgICAgIDxkZD48a2JkPkFTU0dJTkVEPC9rYmQ+ICg8a2JkPlxwe0FTU0lHTkVEfTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+XFB7Q259PC9rYmQ+KQorICogICAgICAgICA8ZGQ+PGtiZD5VTkFTU0dJTkVEPC9rYmQ+CisgKiAgICAgICAgICAgICAoPGtiZD5ccHtVTkFTU0lHTkVEfTwva2JkPiBpcyBlcXVpdmFsZW50IHRvIDxrYmQ+XHB7Q259PC9rYmQ+KQorICogICAgICAgPC9kbD4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxQezwva2JkPjx2YXI+bmFtZTwvdmFyPjxrYmQ+fTwva2JkPgorICogICAgICAgPGRkPk1hdGNoZXMgb25lIGNoYXJhY3RlciBub3QgaW4gdGhlIHNwZWNpZmllZCBHZW5lcmFsIENhdGVnb3J5IG9yIHRoZSBzcGVjaWZpZWQgQmxvY2suCisgKiAgICAgPC9kbD4KKyAqICAgPC9saT4KKyAqCisgKiAgIDxsaT5TZWxlY3Rpb24gYW5kIFF1YW50aWZpZXIKKyAqICAgICA8ZGw+CisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPnw8L2tiZD48VkFSPlk8L1ZBUj4KKyAqICAgICAgIDxkZD4uLi4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48VkFSPlg8L1ZBUj48a2JkPio8L0tCRD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIDAgb3IgbW9yZSA8dmFyPlg8L3Zhcj4uCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PFZBUj5YPC9WQVI+PGtiZD4rPC9LQkQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyAxIG9yIG1vcmUgPHZhcj5YPC92YXI+LgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+PzwvS0JEPgorICogICAgICAgPGRkPk1hdGNoZXMgMCBvciAxIDx2YXI+WDwvdmFyPi4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48dmFyPlg8L3Zhcj48a2JkPns8L2tiZD48dmFyPm51bWJlcjwvdmFyPjxrYmQ+fTwva2JkPgorICogICAgICAgPGRkPk1hdGNoZXMgPHZhcj5udW1iZXI8L3Zhcj4gdGltZXMuCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPix9PC9rYmQ+CisgKiAgICAgICA8ZGQ+Li4uCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PHZhcj5YPC92YXI+PGtiZD57PC9rYmQ+PHZhcj5taW48L3Zhcj48a2JkPiw8L2tiZD48dmFyPm1heDwvdmFyPjxrYmQ+fTwva2JkPgorICogICAgICAgPGRkPi4uLgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Kj88L2tiZD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Kz88L2tiZD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxWQVI+WDwvVkFSPjxrYmQ+Pz88L2tiZD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sfT88L2tiZD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjx2YXI+WDwvdmFyPjxrYmQ+ezwva2JkPjx2YXI+bWluPC92YXI+PGtiZD4sPC9rYmQ+PHZhcj5tYXg8L3Zhcj48a2JkPn0/PC9rYmQ+CisgKiAgICAgICA8ZGQ+Tm9uLWdyZWVkeSBtYXRjaGluZy4KKyAqICAgICA8L2RsPgorICogICA8L2xpPgorICoKKyAqICAgPGxpPkdyb3VwaW5nLCBDYXB0dXJpbmcsIGFuZCBCYWNrLXJlZmVyZW5jZQorICogICAgIDxkbD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxLQkQ+KD86PC9rYmQ+PFZBUj5YPC9WQVI+PGtiZD4pPC9LQkQ+CisgKiAgICAgICA8ZGQ+R3JvdXBpbmcuICI8S0JEPmZvbys8L0tCRD4iIG1hdGNoZXMgIjxLQkQ+Zm9vPC9LQkQ+IiBvciAiPEtCRD5mb29vbzwvS0JEPiIuCisgKiAgICAgICBJZiB5b3Ugd2FudCBpdCBtYXRjaGVzICI8S0JEPmZvb2ZvbzwvS0JEPiIgb3IgIjxLQkQ+Zm9vZm9vZm9vPC9LQkQ+IiwKKyAqICAgICAgIHlvdSBoYXZlIHRvIHdyaXRlICI8S0JEPig/OmZvbykrPC9LQkQ+Ii4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48S0JEPig8L2tiZD48VkFSPlg8L1ZBUj48a2JkPik8L0tCRD4KKyAqICAgICAgIDxkZD5Hcm91cGluZyB3aXRoIGNhcHR1cmluZy4KKyAqIEl0IG1ha2UgYSBncm91cCBhbmQgYXBwbGljYXRpb25zIGNhbiBrbm93CisgKiB3aGVyZSBpbiB0YXJnZXQgdGV4dCBhIGdyb3VwIG1hdGNoZWQgd2l0aCBtZXRob2RzIG9mIGEgPGNvZGU+TWF0Y2g8L2NvZGU+IGluc3RhbmNlCisgKiBhZnRlciA8Y29kZT48YSBocmVmPSIjbWF0Y2hlcyhqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5NYXRjaCkiPm1hdGNoZXMoU3RyaW5nLE1hdGNoKTwvYT48L2NvZGU+LgorICogVGhlIDB0aCBncm91cCBtZWFucyB3aG9sZSBvZiB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAqIFRoZSA8VkFSPk48L1ZBUj50aCBnb3J1cCBpcyB0aGUgaW5zaWRlIG9mIHRoZSA8VkFSPk48L1ZBUj50aCBsZWZ0IHBhcmVudGhlc2lzLgorICogCisgKiAgIDxwPkZvciBpbnN0YW5jZSwgYSByZWd1bGFyIGV4cHJlc3Npb24gaXMKKyAqICAgIjxGT05UIGNvbG9yPWJsdWU+PEtCRD4gKihbXiZsdDs6XSopICsmbHQ7KFteJmd0O10qKSZndDsgKjwvS0JEPjwvRk9OVD4iCisgKiAgIGFuZCB0YXJnZXQgdGV4dCBpcworICogICAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+RnJvbTogVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDs8L0tCRD48L0ZPTlQ+IjoKKyAqICAgPHVsPgorICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMCk8L2NvZGU+OgorICogICAgICI8Rk9OVCBjb2xvcj1yZWQ+PEtCRD4gVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDs8L0tCRD48L0ZPTlQ+IgorICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMSk8L2NvZGU+OiAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+VEFNVVJBIEtlbnQ8L0tCRD48L0ZPTlQ+IgorICogICAgIDxsaT48Y29kZT5NYXRjaC5nZXRDYXB0dXJlZFRleHQoMik8L2NvZGU+OiAiPEZPTlQgY29sb3I9cmVkPjxLQkQ+a2VudEB0cmwuaWJtLmNvLmpwPC9LQkQ+PC9GT05UPiIKKyAqICAgPC91bD4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlwxIFwyIFwzIFw0IFw1IFw2IFw3IFw4IFw5PC9rYmQ+CisgKiAgICAgICA8ZGQ+CisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPz48L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KKyAqICAgICAgIDxkZD5JbmRlcGVuZGVudCBleHByZXNzaW9uIGdyb3VwLiAuLi4uLi4uLi4uLi4uLi4uCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+Ojwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+b3B0aW9uczI8L3Zhcj48a2JkPjo8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KKyAqICAgICAgIDxkZD4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiAgICAgICA8ZGQ+VGhlIDx2YXI+b3B0aW9uczwvdmFyPiBvciB0aGUgPHZhcj5vcHRpb25zMjwvdmFyPiBjb25zaXN0cyBvZiAnaScgJ20nICdzJyAndycuCisgKiAgICAgICAgICAgTm90ZSB0aGF0IGl0IGNhbiBub3QgY29udGFpbiAndScuCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+KTwva2JkPgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD4oPzwva2JkPjx2YXI+b3B0aW9uczwvdmFyPjxrYmQ+LTwva2JkPjx2YXI+b3B0aW9uczI8L3Zhcj48a2JkPik8L2tiZD4KKyAqICAgICAgIDxkZD4uLi4uLi4KKyAqICAgICAgIDxkZD5UaGVzZSBleHByZXNzaW9ucyBtdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cC4KKyAqICAgICA8L2RsPgorICogICA8L2xpPgorICoKKyAqICAgPGxpPkFuY2hvcgorICogICAgIDxkbD4KKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEE8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBiZWdpbm5pZyBvZiB0aGUgdGV4dC4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxaPC9rYmQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBvciBiZWZvcmUgYW4gRU9MIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LAorICogICAgICAgICAgIG9yIENBUlJJQUdFIFJFVFVSTiArIExJTkUgRkVFRCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XHo8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHRleHQuCisgKgorICogICAgICAgPGR0IGNsYXNzPSJSRUdFWCI+PGtiZD5ePC9rYmQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LiAgSXQgaXMgZXF1aXZhbGVudCB0byA8c3BhbiBjbGFzcz0iUkVHRVgiPjxLYmQ+XEE8L2tiZD48L3NwYW4+LgorICogICAgICAgPGRkPldoZW4gPGEgaHJlZj0iI01fT1BUSU9OIj5hICJtIiBvcHRpb248L2E+IGlzIHNldCwKKyAqICAgICAgICAgICBpdCBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQsIG9yIGFmdGVyIG9uZSBvZiBFT0wgY2hhcmFjdGVycyAoCisgKiAgICAgICAgICAgTElORSBGRUVEIChVKzAwMEEpLCBDQVJSSUFHRSBSRVRVUk4gKFUrMDAwRCksIExJTkUgU0VQQVJBVE9SIChVKzIwMjgpLAorICogICAgICAgICAgIFBBUkFHUkFQSCBTRVBBUkFUT1IgKFUrMjAyOSkuKQorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+JDwva2JkPgorICogICAgICAgPGRkPk1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgdGV4dCwgb3IgYmVmb3JlIGFuIEVPTCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCwKKyAqICAgICAgICAgICBvciBDQVJSSUFHRSBSRVRVUk4gKyBMSU5FIEZFRUQgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAqICAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNNX09QVElPTiI+YSAibSIgb3B0aW9uPC9hPiBpcyBzZXQsCisgKiAgICAgICAgICAgaXQgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBvciBiZWZvcmUgYW4gRU9MIGNoYXJhY3Rlci4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPlxiPC9rYmQ+CisgKiAgICAgICA8ZGQ+TWF0Y2hlcyB3b3JkIGJvdW5kYXJ5LgorICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XEI8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIG5vbiB3b3JkIGJvdW5kYXJ5LgorICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XCZsdDs8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgYSB3b3JkLgorICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQorICoKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+XCZndDs8L2tiZD4KKyAqICAgICAgIDxkZD5NYXRjaGVzIHRoZSBlbmQgb2YgYSB3b3JkLgorICogICAgICAgICAgIChTZWUgPGEgaHJlZj0iI1dfT1BUSU9OIj5hICJ3IiBvcHRpb248L2E+KQorICogICAgIDwvZGw+CisgKiAgIDwvbGk+CisgKiAgIDxsaT5Mb29rYWhlYWQgYW5kIGxvb2tiZWhpbmQKKyAqICAgICA8ZGw+CisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/PTwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgorICogICAgICAgPGRkPkxvb2thaGVhZC4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/ITwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPgorICogICAgICAgPGRkPk5lZ2F0aXZlIGxvb2thaGVhZC4KKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Jmx0Oz08L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KKyAqICAgICAgIDxkZD5Mb29rYmVoaW5kLgorICogICAgICAgPGRkPihOb3RlIGZvciB0ZXh0IGNhcHR1cmluZy4uLi4uLikKKyAqCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Jmx0OyE8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD4KKyAqICAgICAgIDxkZD5OZWdhdGl2ZSBsb29rYmVoaW5kLgorICogICAgIDwvZGw+CisgKiAgIDwvbGk+CisgKgorICogICA8bGk+TWlzYy4KKyAqICAgICA8ZGw+CisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/KDwvS2JkPjx2YXI+Y29uZGl0aW9uPC92YXI+PEtiZD4pPC9rYmQ+PHZhcj55ZXMtcGF0dGVybjwvdmFyPjxrYmQ+fDwva2JkPjx2YXI+bm8tcGF0dGVybjwvdmFyPjxrYmQ+KTwva2JkPiwKKyAqICAgICAgIDxkdCBjbGFzcz0iUkVHRVgiPjxrYmQ+KD8oPC9rYmQ+PHZhcj5jb25kaXRpb248L3Zhcj48a2JkPik8L2tiZD48dmFyPnllcy1wYXR0ZXJuPC92YXI+PGtiZD4pPC9rYmQ+CisgKiAgICAgICA8ZGQ+Li4uLi4uCisgKiAgICAgICA8ZHQgY2xhc3M9IlJFR0VYIj48a2JkPig/Izwva2JkPjx2YXI+Y29tbWVudDwvdmFyPjxrYmQ+KTwva2JkPgorICogICAgICAgPGRkPkNvbW1lbnQuICBBIGNvbW1lbnQgc3RyaW5nIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgZXhjZXB0ICc8a2JkPik8L2tiZD4nLgorICogICAgICAgICAgIFlvdSBjYW4gbm90IHdyaXRlIGNvbW1lbnRzIGluIGNoYXJhY3RlciBjbGFzc2VzIGFuZCBiZWZvcmUgcXVhbnRpZmllcnMuCisgKiAgICAgPC9kbD4KKyAqICAgPC9saT4KKyAqIDwvdWw+CisgKgorICoKKyAqIDxociB3aWR0aD0iNTAlIj4KKyAqIDxoMz5CTkYgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb248L2gzPgorICogPHByZT4KKyAqIHJlZ2V4IDo6PSAoJyg/JyBvcHRpb25zICcpJyk/IHRlcm0gKCd8JyB0ZXJtKSoKKyAqIHRlcm0gOjo9IGZhY3RvcisKKyAqIGZhY3RvciA6Oj0gYW5jaG9ycyB8IGF0b20gKCgnKicgfCAnKycgfCAnPycgfCBtaW5tYXggKSAnPyc/ICk/CisgKiAgICAgICAgICAgIHwgJyg/IycgW14pXSogJyknCisgKiBtaW5tYXggOjo9ICd7JyAoWzAtOV0rIHwgWzAtOV0rICcsJyB8ICcsJyBbMC05XSsgfCBbMC05XSsgJywnIFswLTldKykgJ30nCisgKiBhdG9tIDo6PSBjaGFyIHwgJy4nIHwgY2hhci1jbGFzcyB8ICcoJyByZWdleCAnKScgfCAnKD86JyByZWdleCAnKScgfCAnXCcgWzAtOV0KKyAqICAgICAgICAgIHwgJ1x3JyB8ICdcVycgfCAnXGQnIHwgJ1xEJyB8ICdccycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sgfCAnXFgnCisgKiAgICAgICAgICB8ICcoPz4nIHJlZ2V4ICcpJyB8ICcoPycgb3B0aW9ucyAnOicgcmVnZXggJyknCisgKiAgICAgICAgICB8ICcoPycgKCcoJyBbMC05XSAnKScgfCAnKCcgYW5jaG9ycyAnKScgfCBsb29rcykgdGVybSAoJ3wnIHRlcm0pPyAnKScKKyAqIG9wdGlvbnMgOjo9IFtpbXN3XSogKCctJyBbaW1zd10rKT8KKyAqIGFuY2hvcnMgOjo9ICdeJyB8ICckJyB8ICdcQScgfCAnXFonIHwgJ1x6JyB8ICdcYicgfCAnXEInIHwgJ1wmbHQ7JyB8ICdcPicKKyAqIGxvb2tzIDo6PSAnKD89JyByZWdleCAnKScgIHwgJyg/IScgcmVnZXggJyknCisgKiAgICAgICAgICAgfCAnKD8mbHQ7PScgcmVnZXggJyknIHwgJyg/Jmx0OyEnIHJlZ2V4ICcpJworICogY2hhciA6Oj0gJ1xcJyB8ICdcJyBbZWZucnR2XSB8ICdcYycgW0AtX10gfCBjb2RlLXBvaW50IHwgY2hhcmFjdGVyLTEKKyAqIGNhdGVnb3J5LWJsb2NrIDo6PSAnXCcgW3BQXSBjYXRlZ29yeS1zeW1ib2wtMQorICogICAgICAgICAgICAgICAgICAgIHwgKCdccHsnIHwgJ1xQeycpIChjYXRlZ29yeS1zeW1ib2wgfCBibG9jay1uYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXItcHJvcGVydGllcykgJ30nCisgKiBjYXRlZ29yeS1zeW1ib2wtMSA6Oj0gJ0wnIHwgJ00nIHwgJ04nIHwgJ1onIHwgJ0MnIHwgJ1AnIHwgJ1MnCisgKiBjYXRlZ29yeS1zeW1ib2wgOjo9IGNhdGVnb3J5LXN5bWJvbC0xIHwgJ0x1JyB8ICdMbCcgfCAnTHQnIHwgJ0xtJyB8IExvJworICogICAgICAgICAgICAgICAgICAgICB8ICdNbicgfCAnTWUnIHwgJ01jJyB8ICdOZCcgfCAnTmwnIHwgJ05vJworICogICAgICAgICAgICAgICAgICAgICB8ICdacycgfCAnWmwnIHwgJ1pwJyB8ICdDYycgfCAnQ2YnIHwgJ0NuJyB8ICdDbycgfCAnQ3MnCisgKiAgICAgICAgICAgICAgICAgICAgIHwgJ1BkJyB8ICdQcycgfCAnUGUnIHwgJ1BjJyB8ICdQbycKKyAqICAgICAgICAgICAgICAgICAgICAgfCAnU20nIHwgJ1NjJyB8ICdTaycgfCAnU28nCisgKiBibG9jay1uYW1lIDo6PSAoU2VlIGFib3ZlKQorICogb3RoZXItcHJvcGVydGllcyA6Oj0gJ0FMTCcgfCAnQVNTSUdORUQnIHwgJ1VOQVNTSUdORUQnCisgKiBjaGFyYWN0ZXItMSA6Oj0gKGFueSBjaGFyYWN0ZXIgZXhjZXB0IG1ldGEtY2hhcmFjdGVycykKKyAqCisgKiBjaGFyLWNsYXNzIDo6PSAnWycgcmFuZ2VzICddJworICogICAgICAgICAgICAgICAgfCAnKD9bJyByYW5nZXMgJ10nIChbLSsmXSAnWycgcmFuZ2VzICddJyk/ICcpJworICogcmFuZ2VzIDo6PSAnXic/IChyYW5nZSA8YSBocmVmPSIjQ09NTUFfT1BUSU9OIj4nLCc/PC9hPikrCisgKiByYW5nZSA6Oj0gJ1xkJyB8ICdcdycgfCAnXHMnIHwgJ1xEJyB8ICdcVycgfCAnXFMnIHwgY2F0ZWdvcnktYmxvY2sKKyAqICAgICAgICAgICB8IHJhbmdlLWNoYXIgfCByYW5nZS1jaGFyICctJyByYW5nZS1jaGFyCisgKiByYW5nZS1jaGFyIDo6PSAnXFsnIHwgJ1xdJyB8ICdcXCcgfCAnXCcgWywtZWZucnR2XSB8IGNvZGUtcG9pbnQgfCBjaGFyYWN0ZXItMgorICogY29kZS1wb2ludCA6Oj0gJ1x4JyBoZXgtY2hhciBoZXgtY2hhcgorICogICAgICAgICAgICAgICAgfCAnXHh7JyBoZXgtY2hhcisgJ30nCisgKiA8IS0tICAgICAgICAgICAgICAgfCAnXHUwMDVjIHUnIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyIGhleC1jaGFyCisgKiAtLT4gICAgICAgICAgICAgICB8ICdcdicgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIgaGV4LWNoYXIKKyAqIGhleC1jaGFyIDo6PSBbMC05YS1mQS1GXQorICogY2hhcmFjdGVyLTIgOjo9IChhbnkgY2hhcmFjdGVyIGV4Y2VwdCBcW10tLCkKKyAqIDwvcHJlPgorICoKKyAqIDxociB3aWR0aD0iNTAlIj4KKyAqIDxoMz5UT0RPPC9oMz4KKyAqIDx1bD4KKyAqICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTgvIj5Vbmljb2RlIFJlZ3VsYXIgRXhwcmVzc2lvbiBHdWlkZWxpbmVzPC9hPgorICogICAgIDx1bD4KKyAqICAgICAgIDxsaT4yLjQgQ2Fub25pY2FsIEVxdWl2YWxlbnRzCisgKiAgICAgICA8bGk+TGV2ZWwgMworICogICAgIDwvdWw+CisgKiAgIDxsaT5QYXJzaW5nIHBlcmZvcm1hbmNlCisgKiA8L3VsPgorICoKKyAqIDxociB3aWR0aD0iNTAlIj4KKyAqCisgKiBAYXV0aG9yIFRBTVVSQSBLZW50ICZsdDtrZW50QHRybC5pYm0uY28uanAmZ3Q7CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBSZWd1bGFyRXhwcmVzc2lvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ29tcGlsZXMgYSB0b2tlbiB0cmVlIGludG8gYW4gb3BlcmF0aW9uIGZsb3cuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjb21waWxlKFRva2VuIHRvaykgeworICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyA9IDA7CisgICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMuY29tcGlsZSh0b2ssIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIHRva2VuIHRvIGFuIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9wIGNvbXBpbGUoVG9rZW4gdG9rLCBPcCBuZXh0LCBib29sZWFuIHJldmVyc2UpIHsKKyAgICAgICAgT3AgcmV0OworICAgICAgICBzd2l0Y2ggKHRvay50eXBlKSB7CisgICAgICAgIGNhc2UgVG9rZW4uRE9UOgorICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlRG90KCk7CisgICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkNIQVI6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDaGFyKHRvay5nZXRDaGFyKCkpOworICAgICAgICAgICAgcmV0Lm5leHQgPSBuZXh0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUb2tlbi5BTkNIT1I6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVBbmNob3IodG9rLmdldENoYXIoKSk7CisgICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLlJBTkdFOgorICAgICAgICBjYXNlIFRva2VuLk5SQU5HRToKKyAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZVJhbmdlKHRvayk7CisgICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkNPTkNBVDoKKyAgICAgICAgICAgIHJldCA9IG5leHQ7CisgICAgICAgICAgICBpZiAoIXJldmVyc2UpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdG9rLnNpemUoKS0xOyAgaSA+PSAwOyAgaSAtLSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZChpKSwgcmV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0b2suc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZChpKSwgcmV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLlVOSU9OOgorICAgICAgICAgICAgT3AuVW5pb25PcCB1bmkgPSBPcC5jcmVhdGVVbmlvbih0b2suc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRvay5zaXplKCk7ICBpICsrKSB7CisgICAgICAgICAgICAgICAgdW5pLmFkZEVsZW1lbnQoY29tcGlsZSh0b2suZ2V0Q2hpbGQoaSksIG5leHQsIHJldmVyc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHVuaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldC5uZXh0IGlzIG51bGwuCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkNMT1NVUkU6CisgICAgICAgIGNhc2UgVG9rZW4uTk9OR1JFRURZQ0xPU1VSRToKKyAgICAgICAgICAgIFRva2VuIGNoaWxkID0gdG9rLmdldENoaWxkKDApOworICAgICAgICAgICAgaW50IG1pbiA9IHRvay5nZXRNaW4oKTsKKyAgICAgICAgICAgIGludCBtYXggPSB0b2suZ2V0TWF4KCk7CisgICAgICAgICAgICBpZiAobWluID49IDAgJiYgbWluID09IG1heCkgeyAvLyB7bn0KKyAgICAgICAgICAgICAgICByZXQgPSBuZXh0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluOyAgaSArKykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKGNoaWxkLCByZXQsIHJldmVyc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtaW4gPiAwICYmIG1heCA+IDApCisgICAgICAgICAgICAgICAgbWF4IC09IG1pbjsKKyAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gWHsyLDZ9IC0+IFhYKFgoWChYWD8pPyk/KT8KKyAgICAgICAgICAgICAgICByZXQgPSBuZXh0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG1heDsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT3AuQ2hpbGRPcCBxID0gT3AuY3JlYXRlUXVlc3Rpb24odG9rLnR5cGUgPT0gVG9rZW4uTk9OR1JFRURZQ0xPU1VSRSk7CisgICAgICAgICAgICAgICAgICAgIHEubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIHEuc2V0Q2hpbGQoY29tcGlsZShjaGlsZCwgcmV0LCByZXZlcnNlKSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBPcC5DaGlsZE9wIG9wOworICAgICAgICAgICAgICAgIGlmICh0b2sudHlwZSA9PSBUb2tlbi5OT05HUkVFRFlDTE9TVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlTm9uR3JlZWR5Q2xvc3VyZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9rZW4uQ0xPU1VSRQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0TWluTGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlQ2xvc3VyZSh0aGlzLm51bWJlck9mQ2xvc3VyZXMrKyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gT3AuY3JlYXRlQ2xvc3VyZSgtMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wLm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgIG9wLnNldENoaWxkKGNvbXBpbGUoY2hpbGQsIG9wLCByZXZlcnNlKSk7CisgICAgICAgICAgICAgICAgcmV0ID0gb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWluID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG1pbjsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZShjaGlsZCwgcmV0LCByZXZlcnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkVNUFRZOgorICAgICAgICAgICAgcmV0ID0gbmV4dDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlU3RyaW5nKHRvay5nZXRTdHJpbmcoKSk7CisgICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkJBQ0tSRUZFUkVOQ0U6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVCYWNrUmVmZXJlbmNlKHRvay5nZXRSZWZlcmVuY2VOdW1iZXIoKSk7CisgICAgICAgICAgICByZXQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLlBBUkVOOgorICAgICAgICAgICAgaWYgKHRvay5nZXRQYXJlbk51bWJlcigpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbmV4dCwgcmV2ZXJzZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gT3AuY3JlYXRlQ2FwdHVyZSh0b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7CisgICAgICAgICAgICAgICAgbmV4dCA9IGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBuZXh0LCByZXZlcnNlKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDYXB0dXJlKC10b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5leHQgPSBPcC5jcmVhdGVDYXB0dXJlKC10b2suZ2V0UGFyZW5OdW1iZXIoKSwgbmV4dCk7CisgICAgICAgICAgICAgICAgbmV4dCA9IGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBuZXh0LCByZXZlcnNlKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVDYXB0dXJlKHRvay5nZXRQYXJlbk51bWJlcigpLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVG9rZW4uTE9PS0FIRUFEOgorICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTG9vayhPcC5MT09LQUhFQUQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCBmYWxzZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVG9rZW4uTkVHQVRJVkVMT09LQUhFQUQ6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLk5FR0FUSVZFTE9PS0FIRUFELCBuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgZmFsc2UpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRva2VuLkxPT0tCRUhJTkQ6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLkxPT0tCRUhJTkQsIG5leHQsIGNvbXBpbGUodG9rLmdldENoaWxkKDApLCBudWxsLCB0cnVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUb2tlbi5ORUdBVElWRUxPT0tCRUhJTkQ6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVMb29rKE9wLk5FR0FUSVZFTE9PS0JFSElORCwgbmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHRydWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVG9rZW4uSU5ERVBFTkRFTlQ6CisgICAgICAgICAgICByZXQgPSBPcC5jcmVhdGVJbmRlcGVuZGVudChuZXh0LCBjb21waWxlKHRvay5nZXRDaGlsZCgwKSwgbnVsbCwgcmV2ZXJzZSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUb2tlbi5NT0RJRklFUkdST1VQOgorICAgICAgICAgICAgcmV0ID0gT3AuY3JlYXRlTW9kaWZpZXIobmV4dCwgY29tcGlsZSh0b2suZ2V0Q2hpbGQoMCksIG51bGwsIHJldmVyc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUb2tlbi5Nb2RpZmllclRva2VuKXRvaykuZ2V0T3B0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUb2tlbi5Nb2RpZmllclRva2VuKXRvaykuZ2V0T3B0aW9uc01hc2soKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRva2VuLkNPTkRJVElPTjoKKyAgICAgICAgICAgIFRva2VuLkNvbmRpdGlvblRva2VuIGN0b2sgPSAoVG9rZW4uQ29uZGl0aW9uVG9rZW4pdG9rOworICAgICAgICAgICAgaW50IHJlZiA9IGN0b2sucmVmTnVtYmVyOworICAgICAgICAgICAgT3AgY29uZGl0aW9uID0gY3Rvay5jb25kaXRpb24gPT0gbnVsbCA/IG51bGwgOiBjb21waWxlKGN0b2suY29uZGl0aW9uLCBudWxsLCByZXZlcnNlKTsKKyAgICAgICAgICAgIE9wIHllcyA9IGNvbXBpbGUoY3Rvay55ZXMsIG5leHQsIHJldmVyc2UpOworICAgICAgICAgICAgT3Agbm8gPSBjdG9rLm5vID09IG51bGwgPyBudWxsIDogY29tcGlsZShjdG9rLm5vLCBuZXh0LCByZXZlcnNlKTsKKyAgICAgICAgICAgIHJldCA9IE9wLmNyZWF0ZUNvbmRpdGlvbihuZXh0LCByZWYsIGNvbmRpdGlvbiwgeWVzLCBubyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdG9rZW4gdHlwZTogIit0b2sudHlwZSk7CisgICAgICAgIH0gLy8gc3dpdGNoICh0b2sudHlwZSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKworLy9QdWJsaWMKKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgMCwgIHRhcmdldCAubGVuZ3RoICwgKE1hdGNoKW51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCisgICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgorICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCBzdGFydCwgZW5kLCAoTWF0Y2gpbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgorICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoY2hhcltdICB0YXJnZXQsIE1hdGNoIG1hdGNoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGggLCBtYXRjaCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgorICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCisgICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBNYXRjaCBtYXRjaCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZSgpOworICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dCBjb24gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuY29udGV4dCkgeworICAgICAgICAgICAgY29uID0gdGhpcy5jb250ZXh0LmludXNlID8gbmV3IENvbnRleHQoKSA6IHRoaXMuY29udGV4dDsKKyAgICAgICAgICAgIGNvbi5yZXNldCh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOworICAgICAgICAgICAgbWF0Y2guc2V0U291cmNlKHRhcmdldCk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNCYWNrUmVmZXJlbmNlcykgeworICAgICAgICAgICAgbWF0Y2ggPSBuZXcgTWF0Y2goKTsKKyAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOworICAgICAgICAgICAgLy8gTmVlZCBub3QgdG8gY2FsbCBzZXRTb3VyY2UoKSBiZWNhdXNlCisgICAgICAgICAgICAvLyBhIGNhbGxlciBjYW4gbm90IGFjY2VzcyB0aGlzIG1hdGNoIGluc3RhbmNlLgorICAgICAgICB9CisgICAgICAgIGNvbi5tYXRjaCA9IG1hdGNoOworCisgICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7CisgICAgICAgICAgICBpbnQgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogbWF0Y2hFbmQ9IittYXRjaEVuZCk7CisgICAgICAgICAgICBpZiAobWF0Y2hFbmQgPT0gY29uLmxpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgY29uLnN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHBhdHRlcm4gaGFzIG9ubHkgZml4ZWQgc3RyaW5nLgorICAgICAgICAgKiBUaGUgZW5naW5lIHVzZXMgQm95ZXItTW9vcmUuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZ09ubHkpIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogZml4ZWQtb25seTogIit0aGlzLmZpeGVkU3RyaW5nKTsKKyAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7CisgICAgICAgICAgICBpZiAobyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbyk7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbyt0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIGEgZml4ZWQgc3RyaW5nLgorICAgICAgICAgKiBUaGUgZW5naW5lIGNoZWNrcyB3aXRoIEJveWVyLU1vb3JlIHdoZXRoZXIgdGhlIHRleHQgY29udGFpbnMgdGhlIGZpeGVkIHN0cmluZyBvciBub3QuCisgICAgICAgICAqIElmIG5vdCwgaXQgcmV0dXJuIHdpdGggZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOworICAgICAgICAgICAgaWYgKG8gPCAwKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vbi1tYXRjaCBpbiBmaXhlZC1zdHJpbmcgc2VhcmNoLiIpOworICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBsaW1pdCA9IGNvbi5saW1pdC10aGlzLm1pbmxlbmd0aDsKKyAgICAgICAgaW50IG1hdGNoU3RhcnQ7CisgICAgICAgIGludCBtYXRjaEVuZCA9IC0xOworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICIuKiIuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKKyAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsKKyAgICAgICAgICAgIGlmIChpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSkgeworICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7CisgICAgICAgICAgICAgICAgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQgXSA7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0lzRU9MKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7CisgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7CisgICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQgXSA7CisgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICBtYXRjaFN0YXJ0KzEgXSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBtYXRjaFN0YXJ0IF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IFsgIG1hdGNoU3RhcnQrMSBdICk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RyYWlnaHRmb3J3YXJkIG1hdGNoaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIHRoaXMub3BlcmF0aW9ucywgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoRW5kID49IDApIHsKKyAgICAgICAgICAgIGlmIChjb24ubWF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbWF0Y2hTdGFydCk7CisgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKy8qKgorICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KKyAqLworICAgIHByaXZhdGUgaW50IG1hdGNoQ2hhckFycmF5IChDb250ZXh0IGNvbiwgT3Agb3AsIGludCBvZmZzZXQsIGludCBkeCwgaW50IG9wdHMpIHsKKworICAgICAgICBjaGFyW10gdGFyZ2V0ID0gY29uLmNoYXJUYXJnZXQ7CisKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKG9wID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2V0KG9wdHMsIFhNTFNDSEVNQV9NT0RFKSAmJiBvZmZzZXQgIT0gY29uLmxpbWl0ID8gLTEgOiBvZmZzZXQ7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gY29uLmxpbWl0IHx8IG9mZnNldCA8IGNvbi5zdGFydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3AuQ0hBUjoKKyAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCBbICBvZmZzZXQgXSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgIW1hdGNoSWdub3JlQ2FzZShjaCwgIHRhcmdldCBbICBvMSBdICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8IGNoICE9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDAgfHwgY2ggIT0gIHRhcmdldCBbICBvMSBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuRE9UOgorICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCBbICArK29mZnNldCBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFT0xDaGFyKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOworICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCBbICBvMSBdIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xIC0tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyggdGFyZ2V0IFsgIC0tbzEgXSAsIGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFT0xDaGFyKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5SQU5HRToKKyAgICAgICAgICAgIGNhc2UgT3AuTlJBTkdFOgorICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgWyAgb2Zmc2V0IF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgWyAgKytvZmZzZXQgXSApOworICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IFsgIG8xIF0gOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCBbICAtLW8xIF0gLCBjaCk7CisgICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuQU5DSE9SOgorICAgICAgICAgICAgICAgIGJvb2xlYW4gZ28gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wLmdldERhdGEoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ14nOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgTVVMVElQTEVfTElORVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0LTEgXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdAJzogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgdXNlIG9ubHkuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBAIGFsd2F5cyBtYXRjaGVzIGxpbmUgYmVnaW5uaW5ncy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQgPiBjb24uc3RhcnQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgWyAgb2Zmc2V0LTEgXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0IDwgY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IFsgIG9mZnNldCBdICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQgXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCBbICBvZmZzZXQgXSAgPT0gQ0FSUklBR0VfUkVUVVJOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IFsgIG9mZnNldCsxIF0gID09IExJTkVfRkVFRCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsxID09IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCBbICBvZmZzZXQgXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IFsgIG9mZnNldCBdICA9PSBDQVJSSUFHRV9SRVRVUk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCBbICBvZmZzZXQrMSBdICA9PSBMSU5FX0ZFRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5saW1pdCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBXVF9JR05PUkUpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlID0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICBpZiAoY29uLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnbyA9IGFmdGVyID09IFdUX0lHTk9SRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBhZnRlciA9PSBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnbykgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLmxpbWl0KSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCB8fCBvZmZzZXQgPT0gY29uLnN0YXJ0KSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0V29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9PVEhFUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpICE9IFdUX0xFVFRFUikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2ggYW5jaG9yIHR5cGUKKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuQkFDS1JFRkVSRU5DRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZm5vIDw9IDAgfHwgcmVmbm8gPj0gdGhpcy5ub2ZwYXJlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK3JlZm5vKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29uLm1hdGNoLmdldEVuZChyZWZubykgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAvLyAqKioqKioqKgorICAgICAgICAgICAgICAgICAgICBpbnQgbzIgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBjb24ubWF0Y2guZ2V0RW5kKHJlZm5vKS1vMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbzIsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcC5TVFJJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG9wLmdldFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGl0ZXJhbGxlbiA9IGxpdGVyYWwubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwsIGxpdGVyYWxsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IGxpdGVyYWxsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkNMT1NVUkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTYXZlcyBjdXJyZW50IHBvc2l0aW9uIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgICAqIHplcm8td2lkdGggcmVwZWF0cy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGludCBpZCA9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c09mZnNldCA9IGNvbi5vZmZzZXRzW2lkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c09mZnNldCA8IDAgfHwgcHJldmlvdXNPZmZzZXQgIT0gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSAgY29uLm9mZnNldHNbaWRdID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuUVVFU1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZQ0xPU1VSRToKKyAgICAgICAgICAgIGNhc2UgT3AuTk9OR1JFRURZUVVFU1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AuZ2V0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuVU5JT046CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3Auc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZWxlbWVudEF0KGkpLCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVOSU9OOiAiK2krIiwgcmV0PSIrcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGNhc2UgT3AuQ0FQVFVSRToKKyAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRCZWdpbm5pbmcocmVmbm8pOworICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEJlZ2lubmluZyhyZWZubywgc2F2ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb24ubWF0Y2ggIT0gbnVsbCAmJiByZWZubyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLXJlZm5vOworICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZSA9IGNvbi5tYXRjaC5nZXRFbmQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgc2F2ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5MT09LQUhFQUQ6CisgICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQUhFQUQ6CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCAxLCBvcHRzKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wLkxPT0tCRUhJTkQ6CisgICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0JFSElORDoKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJBcnJheSAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuSU5ERVBFTkRFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyQXJyYXkgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OworICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLk1PRElGSUVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvY2Fsb3B0cyA9IG9wdHM7CisgICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyB8PSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2Fsb3B0cyAmPSB+b3AuZ2V0RGF0YTIoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1PRElGSUVSOiAiK0ludGVnZXIudG9TdHJpbmcob3B0cywgMTYpKyIgLT4gIitJbnRlZ2VyLnRvU3RyaW5nKGxvY2Fsb3B0cywgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIGxvY2Fsb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OworICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkNPTkRJVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wLkNvbmRpdGlvbk9wIGNvcCA9IChPcC5Db25kaXRpb25PcClvcDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaHAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+PSB0aGlzLm5vZnBhcmVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK2NvcC5yZWZOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhjb3AucmVmTnVtYmVyKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb24ubWF0Y2guZ2V0RW5kKGNvcC5yZWZOdW1iZXIpID49IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSAwIDw9IHRoaXMuIG1hdGNoQ2hhckFycmF5IChjb24sIGNvcC5jb25kaXRpb24sIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNocCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AueWVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcC5ubyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC5ubzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIrb3AudHlwZSk7CisgICAgICAgICAgICB9IC8vIHN3aXRjaCAob3AudHlwZSkKKyAgICAgICAgfSAvLyB3aGlsZQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRQcmV2aW91c1dvcmRUeXBlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IG9wdHMpIHsKKyAgICAgICAgaW50IHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOworICAgICAgICB3aGlsZSAocmV0ID09IFdUX0lHTk9SRSkKKyAgICAgICAgICAgIHJldCA9IGdldFdvcmRUeXBlKHRhcmdldCwgYmVnaW4sIGVuZCwgLS1vZmZzZXQsIG9wdHMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBnZXRXb3JkVHlwZShjaGFyW10gIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgeworICAgICAgICBpZiAob2Zmc2V0IDwgYmVnaW4gfHwgb2Zmc2V0ID49IGVuZCkgIHJldHVybiBXVF9PVEhFUjsKKyAgICAgICAgcmV0dXJuIGdldFdvcmRUeXBlMCggdGFyZ2V0IFsgIG9mZnNldCBdICwgb3B0cyk7CisgICAgfQorCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCwgaW50IHBhcnRsZW4pIHsKKyAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7CisgICAgICAgICAgICBpZiAoIHRhcmdldCBbICBvZmZzZXQrKyBdICAhPSBwYXJ0LmNoYXJBdChpKyspKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoY2hhcltdICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7CisgICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGkgPSBvZmZzZXQyOworICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgeworICAgICAgICAgICAgaWYgKCB0YXJnZXQgWyAgb2Zmc2V0KysgXSAgIT0gIHRhcmdldCBbICBpKysgXSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworLyoqCisgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcworICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShjaGFyW10gIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7CisgICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgeworICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IFsgIG9mZnNldCsrIF0gOworICAgICAgICAgICAgY2hhciBjaDIgPSBwYXJ0LmNoYXJBdChpKyspOworICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKKyAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOworICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGNoYXJbXSAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MiwgaW50IHBhcnRsZW4pIHsKKyAgICAgICAgaWYgKG9mZnNldCA8IDApICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnQgaSA9IG9mZnNldDI7CisgICAgICAgIHdoaWxlIChwYXJ0bGVuLS0gPiAwKSB7CisgICAgICAgICAgICBjaGFyIGNoMSA9ICB0YXJnZXQgWyAgb2Zmc2V0KysgXSA7CisgICAgICAgICAgICBjaGFyIGNoMiA9ICB0YXJnZXQgWyAgaSsrIF0gOworICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKKyAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOworICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybiBvciBub3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBtYXRjaGVkIHRvIHRoaXMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyh0YXJnZXQsIDAsICB0YXJnZXQgLmxlbmd0aCgpICwgKE1hdGNoKW51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSA8dmFyPnRhcmdldDwvdmFyPiB0ZXh0IDxzdHJvbmc+Y29udGFpbnM8L3N0cm9uZz4gdGhpcyBwYXR0ZXJuCisgICAgICogaW4gc3BlY2lmaWVkIHJhbmdlIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZmZzZXQgb2YgdGhlIHJhbmdlLgorICAgICAqIEBwYXJhbSBlbmQgIEVuZCBvZmZzZXQgKzEgb2YgdGhlIHJhbmdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzIG1hdGNoZWQgdG8gdGhpcyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCBzdGFydCwgZW5kLCAoTWF0Y2gpbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgorICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nICB0YXJnZXQsIE1hdGNoIG1hdGNoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXModGFyZ2V0LCAwLCAgdGFyZ2V0IC5sZW5ndGgoKSAsIG1hdGNoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gdGV4dCA8c3Ryb25nPmNvbnRhaW5zPC9zdHJvbmc+IHRoaXMgcGF0dGVybgorICAgICAqIGluIHNwZWNpZmllZCByYW5nZSBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2Zmc2V0IG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gZW5kICBFbmQgb2Zmc2V0ICsxIG9mIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gbWF0Y2ggQSBNYXRjaCBpbnN0YW5jZSBmb3Igc3RvcmluZyBtYXRjaGluZyByZXN1bHQuCisgICAgICogQHJldHVybiBPZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIDxWQVI+dGFyZ2V0PC9WQVI+OyBvciAtMSBpZiBub3QgbWF0Y2guCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBNYXRjaCBtYXRjaCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZSgpOworICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dCBjb24gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuY29udGV4dCkgeworICAgICAgICAgICAgY29uID0gdGhpcy5jb250ZXh0LmludXNlID8gbmV3IENvbnRleHQoKSA6IHRoaXMuY29udGV4dDsKKyAgICAgICAgICAgIGNvbi5yZXNldCh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXMubnVtYmVyT2ZDbG9zdXJlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOworICAgICAgICAgICAgbWF0Y2guc2V0U291cmNlKHRhcmdldCk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNCYWNrUmVmZXJlbmNlcykgeworICAgICAgICAgICAgbWF0Y2ggPSBuZXcgTWF0Y2goKTsKKyAgICAgICAgICAgIG1hdGNoLnNldE51bWJlck9mR3JvdXBzKHRoaXMubm9mcGFyZW4pOworICAgICAgICAgICAgLy8gTmVlZCBub3QgdG8gY2FsbCBzZXRTb3VyY2UoKSBiZWNhdXNlCisgICAgICAgICAgICAvLyBhIGNhbGxlciBjYW4gbm90IGFjY2VzcyB0aGlzIG1hdGNoIGluc3RhbmNlLgorICAgICAgICB9CisgICAgICAgIGNvbi5tYXRjaCA9IG1hdGNoOworCisgICAgICAgIGlmICh0aGlzLmlzU2V0KHRoaXMub3B0aW9ucywgWE1MU0NIRU1BX01PREUpKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInRhcmdldCBzdHJpbmc9Iit0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLCBjb24uc3RhcnQsIDEsIHRoaXMub3B0aW9ucyk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIm1hdGNoRW5kPSIrbWF0Y2hFbmQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiY29uLmxpbWl0PSIrY29uLmxpbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaEVuZCA9PSBjb24ubGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBjb24uc3RhcnQpOworICAgICAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0RW5kKDAsIG1hdGNoRW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgcGF0dGVybiBoYXMgb25seSBmaXhlZCBzdHJpbmcuCisgICAgICAgICAqIFRoZSBlbmdpbmUgdXNlcyBCb3llci1Nb29yZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nT25seSkgeworICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBmaXhlZC1vbmx5OiAiK3RoaXMuZml4ZWRTdHJpbmcpOworICAgICAgICAgICAgaW50IG8gPSB0aGlzLmZpeGVkU3RyaW5nVGFibGUubWF0Y2hlcyh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0KTsKKyAgICAgICAgICAgIGlmIChvID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEJlZ2lubmluZygwLCBvKTsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBvK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHBhdHRlcm4gY29udGFpbnMgYSBmaXhlZCBzdHJpbmcuCisgICAgICAgICAqIFRoZSBlbmdpbmUgY2hlY2tzIHdpdGggQm95ZXItTW9vcmUgd2hldGhlciB0aGUgdGV4dCBjb250YWlucyB0aGUgZml4ZWQgc3RyaW5nIG9yIG5vdC4KKyAgICAgICAgICogSWYgbm90LCBpdCByZXR1cm4gd2l0aCBmYWxzZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0aGlzLmZpeGVkU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7CisgICAgICAgICAgICBpZiAobyA8IDApIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTm9uLW1hdGNoIGluIGZpeGVkLXN0cmluZyBzZWFyY2guIik7CisgICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGxpbWl0ID0gY29uLmxpbWl0LXRoaXMubWlubGVuZ3RoOworICAgICAgICBpbnQgbWF0Y2hTdGFydDsKKyAgICAgICAgaW50IG1hdGNoRW5kID0gLTE7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gc3RhcnRzIHdpdGggIi4qIi4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgIT0gbnVsbAorICAgICAgICAgICAgJiYgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0xPU1VSRSAmJiB0aGlzLm9wZXJhdGlvbnMuZ2V0Q2hpbGQoKS50eXBlID09IE9wLkRPVCkgeworICAgICAgICAgICAgaWYgKGlzU2V0KHRoaXMub3B0aW9ucywgU0lOR0xFX0xJTkUpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCA9IGNvbi5zdGFydDsKKyAgICAgICAgICAgICAgICBtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHByZXZpb3VzSXNFT0wgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQgKSA7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0VPTENoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0lzRU9MKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgdGhpcy5vcGVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7CisgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7CisgICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0ICkgOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLmNoYXJBdCggIG1hdGNoU3RhcnQrMSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IChtYXRjaEVuZCA9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIHRoaXMub3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0ICkgOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgbWF0Y2hTdGFydCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBtYXRjaFN0YXJ0KzEgKSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN0cmFpZ2h0Zm9yd2FyZCBtYXRjaGluZy4KKyAgICAgICAgICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChtYXRjaFN0YXJ0ID0gY29uLnN0YXJ0OyAgbWF0Y2hTdGFydCA8PSBsaW1pdDsgIG1hdGNoU3RhcnQgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXRjaEVuZCA+PSAwKSB7CisgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG1hdGNoU3RhcnQpOworICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXRjaFN0cmluZyAoQ29udGV4dCBjb24sIE9wIG9wLCBpbnQgb2Zmc2V0LCBpbnQgZHgsIGludCBvcHRzKSB7CisKKworCisKKyAgICAgICAgU3RyaW5nIHRhcmdldCA9IGNvbi5zdHJUYXJnZXQ7CisKKworCisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBpc1NldChvcHRzLCBYTUxTQ0hFTUFfTU9ERSkgJiYgb2Zmc2V0ICE9IGNvbi5saW1pdCA/IC0xIDogb2Zmc2V0OworICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNvbi5saW1pdCB8fCBvZmZzZXQgPCBjb24uc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9wLkNIQVI6CisgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8xID0gb2Zmc2V0LTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCB8fCAhbWF0Y2hJZ25vcmVDYXNlKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICBvMSApICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8IGNoICE9ICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8IGNoICE9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5ET1Q6CisgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0ICkgOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzSGlnaFN1cnJvZ2F0ZShjaCkgJiYgb2Zmc2V0KzEgPCBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuY2hhckF0KCAgKytvZmZzZXQgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgU0lOR0xFX0xJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzEgLS07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLmNoYXJBdCggIC0tbzEgKSAsIGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFT0xDaGFyKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5SQU5HRToKKyAgICAgICAgICAgIGNhc2UgT3AuTlJBTkdFOgorICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb24ubGltaXQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5jaGFyQXQoICArK29mZnNldCApICk7CisgICAgICAgICAgICAgICAgICAgIFJhbmdlVG9rZW4gdG9rID0gb3AuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHVjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaCh1Y2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rLm1hdGNoKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLmNoYXJBdCggIG8xICkgOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVVdGlsLmlzTG93U3Vycm9nYXRlKGNoKSAmJiBvMS0xID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuY2hhckF0KCAgLS1vMSApICwgY2gpOworICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkFOQ0hPUjoKKyAgICAgICAgICAgICAgICBib29sZWFuIGdvID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcC5nZXREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQtMSApICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gY29uLnN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0AnOiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5hbCB1c2Ugb25seS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEAgYWx3YXlzIG1hdGNoZXMgbGluZSBiZWdpbm5pbmdzLgorICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA+IGNvbi5zdGFydCAmJiBpc0VPTENoYXIoIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0LTEgKSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICckJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0IDwgY29uLmxpbWl0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCsyID09IGNvbi5saW1pdCAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgdGFyZ2V0IC5jaGFyQXQoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICA9PSBDQVJSSUFHRV9SRVRVUk4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuY2hhckF0KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24ubGltaXQpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gV1RfSUdOT1JFKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSBhZnRlciA9PSBXVF9JR05PUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWZ0ZXIgPT0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZ28pICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5saW1pdCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5zdGFydCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoIGFuY2hvciB0eXBlCisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkJBQ0tSRUZFUkVOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZubyA8PSAwIHx8IHJlZm5vID49IHRoaXMubm9mcGFyZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIityZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLy8gKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgaW50IG8yID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gY29uLm1hdGNoLmdldEVuZChyZWZubyktbzI7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3AuU1RSSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSBvcC5nZXRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5DTE9TVVJFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2F2ZXMgY3VycmVudCBwb3NpdGlvbiB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgKiB6ZXJvLXdpZHRoIHJlcGVhdHMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBjb24ub2Zmc2V0c1tpZF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNPZmZzZXQgPCAwIHx8IHByZXZpb3VzT2Zmc2V0ICE9IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5RVUVTVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlDTE9TVVJFOgorICAgICAgICAgICAgY2FzZSBPcC5OT05HUkVFRFlRVUVTVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5nZXRDaGlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5VTklPTjoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBvcC5zaXplKCk7ICBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5lbGVtZW50QXQoaSksIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVU5JT046ICIraSsiLCByZXQ9IityZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgY2FzZSBPcC5DQVBUVVJFOgorICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKHJlZm5vLCBzYXZlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbi5tYXRjaCAhPSBudWxsICYmIHJlZm5vIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAtcmVmbm87CisgICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEVuZChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoaW5kZXgsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5uZXh0LCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICBjb24ubWF0Y2guc2V0RW5kKGluZGV4LCBzYXZlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkxPT0tBSEVBRDoKKyAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tBSEVBRDoKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIDEsIG9wdHMpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3AuTE9PS0JFSElORDoKKyAgICAgICAgICAgICAgICBpZiAoMCA+IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3AuTkVHQVRJVkVMT09LQkVISU5EOgorICAgICAgICAgICAgICAgIGlmICgwIDw9IHRoaXMuIG1hdGNoU3RyaW5nIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5JTkRFUEVOREVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaFN0cmluZyAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuTU9ESUZJRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxvcHRzID0gb3B0czsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzIHw9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxvcHRzICY9IH5vcC5nZXREYXRhMigpOworICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiTU9ESUZJRVI6ICIrSW50ZWdlci50b1N0cmluZyhvcHRzLCAxNikrIiAtPiAiK0ludGVnZXIudG9TdHJpbmcobG9jYWxvcHRzLCAxNikpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgb3AuZ2V0Q2hpbGQoKSwgb2Zmc2V0LCBkeCwgbG9jYWxvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuQ09ORElUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT3AuQ29uZGl0aW9uT3AgY29wID0gKE9wLkNvbmRpdGlvbk9wKW9wOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNocCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3AucmVmTnVtYmVyID49IHRoaXMubm9mcGFyZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBSZWZlcmVuY2UgbnVtYmVyIG11c3QgYmUgbW9yZSB0aGFuIHplcm86ICIrY29wLnJlZk51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSBjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKGNvcC5yZWZOdW1iZXIpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbi5tYXRjaC5nZXRFbmQoY29wLnJlZk51bWJlcikgPj0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNocCA9IDAgPD0gdGhpcy4gbWF0Y2hTdHJpbmcgKGNvbiwgY29wLmNvbmRpdGlvbiwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC55ZXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29wLm5vICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5vOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24gdHlwZTogIitvcC50eXBlKTsKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoIChvcC50eXBlKQorICAgICAgICB9IC8vIHdoaWxlCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFByZXZpb3VzV29yZFR5cGUoU3RyaW5nICB0YXJnZXQsIGludCBiZWdpbiwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgeworICAgICAgICBpbnQgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7CisgICAgICAgIHdoaWxlIChyZXQgPT0gV1RfSUdOT1JFKQorICAgICAgICAgICAgcmV0ID0gZ2V0V29yZFR5cGUodGFyZ2V0LCBiZWdpbiwgZW5kLCAtLW9mZnNldCwgb3B0cyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFdvcmRUeXBlKFN0cmluZyAgdGFyZ2V0LCBpbnQgYmVnaW4sIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7CisgICAgICAgIGlmIChvZmZzZXQgPCBiZWdpbiB8fCBvZmZzZXQgPj0gZW5kKSAgcmV0dXJuIFdUX09USEVSOworICAgICAgICByZXR1cm4gZ2V0V29yZFR5cGUwKCB0YXJnZXQgLmNoYXJBdCggIG9mZnNldCApICwgb3B0cyk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXMoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7CisgICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKSAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKG9mZnNldCwgcGFydCwgMCwgcGFydGxlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzKFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgeworICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRleHQucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHRleHQsIG9mZnNldDIsIHBhcnRsZW4pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgeworICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIG9mZnNldCwgcGFydCwgMCwgcGFydGxlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShTdHJpbmcgdGV4dCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDIsIGludCBwYXJ0bGVuKSB7CisgICAgICAgIGlmIChsaW1pdC1vZmZzZXQgPCBwYXJ0bGVuKSAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIG9mZnNldCwgdGV4dCwgb2Zmc2V0MiwgcGFydGxlbik7CisgICAgfQorCisKKworCisKKworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB0byB0aGlzIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKENoYXJhY3Rlckl0ZXJhdG9yIHRhcmdldCkgeworICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHRhcmdldCwgKE1hdGNoKW51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IHRleHQgPHN0cm9uZz5jb250YWluczwvc3Ryb25nPiB0aGlzIHBhdHRlcm4gb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIEEgTWF0Y2ggaW5zdGFuY2UgZm9yIHN0b3JpbmcgbWF0Y2hpbmcgcmVzdWx0LgorICAgICAqIEByZXR1cm4gT2Zmc2V0IG9mIHRoZSBzdGFydCBwb3NpdGlvbiBpbiA8VkFSPnRhcmdldDwvVkFSPjsgb3IgLTEgaWYgbm90IG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgTWF0Y2ggbWF0Y2gpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gdGFyZ2V0LmdldEJlZ2luSW5kZXgoKTsKKyAgICAgICAgaW50IGVuZCA9IHRhcmdldC5nZXRFbmRJbmRleCgpOworCisKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmUoKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgQ29udGV4dCgpOworICAgICAgICB9CisgICAgICAgIENvbnRleHQgY29uID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbiA9IHRoaXMuY29udGV4dC5pbnVzZSA/IG5ldyBDb250ZXh0KCkgOiB0aGlzLmNvbnRleHQ7CisgICAgICAgICAgICBjb24ucmVzZXQodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzLm51bWJlck9mQ2xvc3VyZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKKyAgICAgICAgICAgIG1hdGNoLnNldFNvdXJjZSh0YXJnZXQpOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQmFja1JlZmVyZW5jZXMpIHsKKyAgICAgICAgICAgIG1hdGNoID0gbmV3IE1hdGNoKCk7CisgICAgICAgICAgICBtYXRjaC5zZXROdW1iZXJPZkdyb3Vwcyh0aGlzLm5vZnBhcmVuKTsKKyAgICAgICAgICAgIC8vIE5lZWQgbm90IHRvIGNhbGwgc2V0U291cmNlKCkgYmVjYXVzZQorICAgICAgICAgICAgLy8gYSBjYWxsZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBtYXRjaCBpbnN0YW5jZS4KKyAgICAgICAgfQorICAgICAgICBjb24ubWF0Y2ggPSBtYXRjaDsKKworICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgeworICAgICAgICAgICAgaW50IG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIGNvbi5zdGFydCwgMSwgdGhpcy5vcHRpb25zKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogbWF0Y2hFbmQ9IittYXRjaEVuZCk7CisgICAgICAgICAgICBpZiAobWF0Y2hFbmQgPT0gY29uLmxpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgY29uLnN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZCgwLCBtYXRjaEVuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHBhdHRlcm4gaGFzIG9ubHkgZml4ZWQgc3RyaW5nLgorICAgICAgICAgKiBUaGUgZW5naW5lIHVzZXMgQm95ZXItTW9vcmUuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZ09ubHkpIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogZml4ZWQtb25seTogIit0aGlzLmZpeGVkU3RyaW5nKTsKKyAgICAgICAgICAgIGludCBvID0gdGhpcy5maXhlZFN0cmluZ1RhYmxlLm1hdGNoZXModGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCk7CisgICAgICAgICAgICBpZiAobyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbi5tYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcoMCwgbyk7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbyt0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb24uaW51c2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBwYXR0ZXJuIGNvbnRhaW5zIGEgZml4ZWQgc3RyaW5nLgorICAgICAgICAgKiBUaGUgZW5naW5lIGNoZWNrcyB3aXRoIEJveWVyLU1vb3JlIHdoZXRoZXIgdGhlIHRleHQgY29udGFpbnMgdGhlIGZpeGVkIHN0cmluZyBvciBub3QuCisgICAgICAgICAqIElmIG5vdCwgaXQgcmV0dXJuIHdpdGggZmFsc2UuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbyA9IHRoaXMuZml4ZWRTdHJpbmdUYWJsZS5tYXRjaGVzKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQpOworICAgICAgICAgICAgaWYgKG8gPCAwKSB7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk5vbi1tYXRjaCBpbiBmaXhlZC1zdHJpbmcgc2VhcmNoLiIpOworICAgICAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBsaW1pdCA9IGNvbi5saW1pdC10aGlzLm1pbmxlbmd0aDsKKyAgICAgICAgaW50IG1hdGNoU3RhcnQ7CisgICAgICAgIGludCBtYXRjaEVuZCA9IC0xOworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoICIuKiIuCisgICAgICAgICAqLworICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKKyAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsKKyAgICAgICAgICAgIGlmIChpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSkgeworICAgICAgICAgICAgICAgIG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7CisgICAgICAgICAgICAgICAgbWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywgY29uLnN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHByZXZpb3VzSXNFT0wgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNFT0wgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSXNFT0wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFN0YXJ0LCAxLCB0aGlzLm9wdGlvbnMpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzRU9MID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBPcHRpbWl6YXRpb24gYWdhaW5zdCB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAodGhpcy5maXJzdENoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiB3aXRoIGZpcnN0Y2hhci1tYXRjaGluZzogIit0aGlzLmZpcnN0Q2hhcik7CisgICAgICAgICAgICBSYW5nZVRva2VuIHJhbmdlID0gdGhpcy5maXJzdENoYXI7CisgICAgICAgICAgICBpZiAodGhpcy5pc1NldCh0aGlzLm9wdGlvbnMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5maXJzdENoYXIuZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKG1hdGNoU3RhcnQgPSBjb24uc3RhcnQ7ICBtYXRjaFN0YXJ0IDw9IGxpbWl0OyAgbWF0Y2hTdGFydCArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG1hdGNoU3RhcnQgKSA7CisgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBtYXRjaFN0YXJ0KzEgPCBjb24ubGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0KzEgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChjaCkpICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UubWF0Y2goY2gxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZS5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbWF0Y2hTdGFydCApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG1hdGNoU3RhcnQrMSA8IGNvbi5saW1pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUkVVdGlsLmNvbXBvc2VGcm9tU3Vycm9nYXRlcyhjaCwgIHRhcmdldCAuc2V0SW5kZXgoICBtYXRjaFN0YXJ0KzEgKSApOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlLm1hdGNoKGNoKSkgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSAobWF0Y2hFbmQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIHRoaXMub3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hTdGFydCwgMSwgdGhpcy5vcHRpb25zKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTdHJhaWdodGZvcndhcmQgbWF0Y2hpbmcuCisgICAgICAgICAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAobWF0Y2hTdGFydCA9IGNvbi5zdGFydDsgIG1hdGNoU3RhcnQgPD0gbGltaXQ7ICBtYXRjaFN0YXJ0ICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gKG1hdGNoRW5kID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCB0aGlzLm9wZXJhdGlvbnMsIG1hdGNoU3RhcnQsIDEsIHRoaXMub3B0aW9ucykpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXRjaEVuZCA+PSAwKSB7CisgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb24ubWF0Y2guc2V0QmVnaW5uaW5nKDAsIG1hdGNoU3RhcnQpOworICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRFbmQoMCwgbWF0Y2hFbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uLmludXNlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbi5pbnVzZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiAtMSB3aGVuIG5vdCBtYXRjaDsgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgbWF0Y2hlZCBzdHJpbmcgd2hlbiBtYXRjaC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChDb250ZXh0IGNvbiwgT3Agb3AsIGludCBvZmZzZXQsIGludCBkeCwgaW50IG9wdHMpIHsKKworCisgICAgICAgIENoYXJhY3Rlckl0ZXJhdG9yIHRhcmdldCA9IGNvbi5jaVRhcmdldDsKKworCisKKworCisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBpc1NldChvcHRzLCBYTUxTQ0hFTUFfTU9ERSkgJiYgb2Zmc2V0ICE9IGNvbi5saW1pdCA/IC0xIDogb2Zmc2V0OworICAgICAgICAgICAgaWYgKG9mZnNldCA+IGNvbi5saW1pdCB8fCBvZmZzZXQgPCBjb24uc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3dpdGNoIChvcC50eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9wLkNIQVI6CisgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0IHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8ICFtYXRjaElnbm9yZUNhc2UoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gb3AuZ2V0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IGNvbi5saW1pdCB8fCBjaCAhPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvMSA+PSBjb24ubGltaXQgfHwgbzEgPCAwIHx8IGNoICE9ICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbzE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkRPVDoKKyAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFNJTkdMRV9MSU5FKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNIaWdoU3Vycm9nYXRlKGNoKSAmJiBvZmZzZXQrMSA8IGNvbi5saW1pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoY2gsICB0YXJnZXQgLnNldEluZGV4KCAgKytvZmZzZXQgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRU9MQ2hhcihjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgbzEgPSBvZmZzZXQtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8xID49IGNvbi5saW1pdCB8fCBvMSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGludCBjaCA9ICB0YXJnZXQgLnNldEluZGV4KCAgbzEgKSA7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBTSU5HTEVfTElORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMSAtLTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSRVV0aWwuaXNMb3dTdXJyb2dhdGUoY2gpICYmIG8xLTEgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFJFVXRpbC5jb21wb3NlRnJvbVN1cnJvZ2F0ZXMoIHRhcmdldCAuc2V0SW5kZXgoICAtLW8xICkgLCBjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRU9MQ2hhcihjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuUkFOR0U6CisgICAgICAgICAgICBjYXNlIE9wLk5SQU5HRToKKyAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2gpICYmIG9mZnNldCsxIDwgY29uLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoLCAgdGFyZ2V0IC5zZXRJbmRleCggICsrb2Zmc2V0ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBvcC5nZXRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0b2suZ2V0Q2FzZUluc2Vuc2l0aXZlVG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgdWNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKHVjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSgoY2hhciljaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0b2subWF0Y2goQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvay5tYXRjaChjaCkpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBvMSA9IG9mZnNldC0xOworICAgICAgICAgICAgICAgICAgICBpZiAobzEgPj0gY29uLmxpbWl0IHx8IG8xIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gIHRhcmdldCAuc2V0SW5kZXgoICBvMSApIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZShjaCkgJiYgbzEtMSA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKCB0YXJnZXQgLnNldEluZGV4KCAgLS1vMSApICwgY2gpOworICAgICAgICAgICAgICAgICAgICBSYW5nZVRva2VuIHRvayA9IG9wLmdldFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBJR05PUkVfQ0FTRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRvay5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2goY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciB1Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2subWF0Y2godWNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRvay5tYXRjaChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9rLm1hdGNoKGNoKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkFOQ0hPUjoKKyAgICAgICAgICAgICAgICBib29sZWFuIGdvID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcC5nZXREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdeJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIE1VTFRJUExFX0xJTkVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldC0xICkgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24uc3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnQCc6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmFsIHVzZSBvbmx5LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQCBhbHdheXMgbWF0Y2hlcyBsaW5lIGJlZ2lubmluZ3MuCisgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24uc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0ID4gY29uLnN0YXJ0ICYmIGlzRU9MQ2hhciggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldC0xICkgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NldChvcHRzLCBNVUxUSVBMRV9MSU5FUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9mZnNldCA9PSBjb24ubGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9mZnNldCA8IGNvbi5saW1pdCAmJiBpc0VPTENoYXIoIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvZmZzZXQgPT0gY29uLmxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2Zmc2V0KzIgPT0gY29uLmxpbWl0ICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgID09IENBUlJJQUdFX1JFVFVSTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrMSApICA9PSBMSU5FX0ZFRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IGNvbi5zdGFydCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEob2Zmc2V0ID09IGNvbi5saW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMSA9PSBjb24ubGltaXQgJiYgaXNFT0xDaGFyKCB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBvZmZzZXQrMiA9PSBjb24ubGltaXQgJiYgIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQgKSAgPT0gQ0FSUklBR0VfUkVUVVJOCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmICB0YXJnZXQgLnNldEluZGV4KCAgb2Zmc2V0KzEgKSAgPT0gTElORV9GRUVEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBjb24ubGltaXQpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDApICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlciA9IGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT0gV1RfSUdOT1JFKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ28gPSBhZnRlciA9PSBXVF9JR05PUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWZ0ZXIgPT0gZ2V0UHJldmlvdXNXb3JkVHlwZSh0YXJnZXQsIGNvbi5zdGFydCwgY29uLmxpbWl0LCBvZmZzZXQsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZ28pICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5saW1pdCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfTEVUVEVSCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRQcmV2aW91c1dvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubGVuZ3RoID09IDAgfHwgb2Zmc2V0ID09IGNvbi5zdGFydCkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFdvcmRUeXBlKHRhcmdldCwgY29uLnN0YXJ0LCBjb24ubGltaXQsIG9mZnNldCwgb3B0cykgIT0gV1RfT1RIRVIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFByZXZpb3VzV29yZFR5cGUodGFyZ2V0LCBjb24uc3RhcnQsIGNvbi5saW1pdCwgb2Zmc2V0LCBvcHRzKSAhPSBXVF9MRVRURVIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoIGFuY2hvciB0eXBlCisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkJBQ0tSRUZFUkVOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbm8gPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZubyA8PSAwIHx8IHJlZm5vID49IHRoaXMubm9mcGFyZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IFJlZmVyZW5jZSBudW1iZXIgbXVzdCBiZSBtb3JlIHRoYW4gemVybzogIityZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb24ubWF0Y2guZ2V0QmVnaW5uaW5nKHJlZm5vKSA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbi5tYXRjaC5nZXRFbmQocmVmbm8pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgLy8gKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgaW50IG8yID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGludCBsaXRlcmFsbGVuID0gY29uLm1hdGNoLmdldEVuZChyZWZubyktbzI7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTZXQob3B0cywgSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBvMiwgbGl0ZXJhbGxlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbGl0ZXJhbGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LCBjb24ubGltaXQsIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKHRhcmdldCwgb2Zmc2V0LWxpdGVyYWxsZW4sIGNvbi5saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8yLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3AuU1RSSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpdGVyYWwgPSBvcC5nZXRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpdGVyYWxsZW4gPSBsaXRlcmFsLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2V0KG9wdHMsIElHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlcyh0YXJnZXQsIG9mZnNldCwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lvbk1hdGNoZXModGFyZ2V0LCBvZmZzZXQtbGl0ZXJhbGxlbiwgY29uLmxpbWl0LCBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UodGFyZ2V0LCBvZmZzZXQsIGNvbi5saW1pdCwgbGl0ZXJhbCwgbGl0ZXJhbGxlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGl0ZXJhbGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpb25NYXRjaGVzSWdub3JlQ2FzZSh0YXJnZXQsIG9mZnNldC1saXRlcmFsbGVuLCBjb24ubGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsLCBsaXRlcmFsbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCAtPSBsaXRlcmFsbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5DTE9TVVJFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2F2ZXMgY3VycmVudCBwb3NpdGlvbiB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAgKiB6ZXJvLXdpZHRoIHJlcGVhdHMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBvcC5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNPZmZzZXQgPSBjb24ub2Zmc2V0c1tpZF07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNPZmZzZXQgPCAwIHx8IHByZXZpb3VzT2Zmc2V0ICE9IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbi5vZmZzZXRzW2lkXSA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLm9mZnNldHNbaWRdID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIGR4LCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDApICBjb24ub2Zmc2V0c1tpZF0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5RVUVTVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWUNMT1NVUkU6CisgICAgICAgICAgICBjYXNlIE9wLk5PTkdSRUVEWVFVRVNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9wID0gb3AuZ2V0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgT3AuVU5JT046CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgb3Auc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5lbGVtZW50QXQoaSksIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVU5JT046ICIraSsiLCByZXQ9IityZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgY2FzZSBPcC5DQVBUVVJFOgorICAgICAgICAgICAgICAgIGludCByZWZubyA9IG9wLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYXZlID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhyZWZubyk7CisgICAgICAgICAgICAgICAgICAgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLm5leHQsIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIGNvbi5tYXRjaC5zZXRCZWdpbm5pbmcocmVmbm8sIHNhdmUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uLm1hdGNoICE9IG51bGwgJiYgcmVmbm8gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC1yZWZubzsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhdmUgPSBjb24ubWF0Y2guZ2V0RW5kKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgb3AubmV4dCwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgY29uLm1hdGNoLnNldEVuZChpbmRleCwgc2F2ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5MT09LQUhFQUQ6CisgICAgICAgICAgICAgICAgaWYgKDAgPiB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcC5ORUdBVElWRUxPT0tBSEVBRDoKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgMSwgb3B0cykpICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcC5MT09LQkVISU5EOgorICAgICAgICAgICAgICAgIGlmICgwID4gdGhpcy4gbWF0Y2hDaGFyYWN0ZXJJdGVyYXRvciAoY29uLCBvcC5nZXRDaGlsZCgpLCBvZmZzZXQsIC0xLCBvcHRzKSkgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wLk5FR0FUSVZFTE9PS0JFSElORDoKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgLTEsIG9wdHMpKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5JTkRFUEVOREVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcC5NT0RJRklFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBsb2NhbG9wdHMgPSBvcHRzOworICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgfD0gb3AuZ2V0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICBsb2NhbG9wdHMgJj0gfm9wLmdldERhdGEyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCJNT0RJRklFUjogIitJbnRlZ2VyLnRvU3RyaW5nKG9wdHMsIDE2KSsiIC0+ICIrSW50ZWdlci50b1N0cmluZyhsb2NhbG9wdHMsIDE2KSk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSB0aGlzLiBtYXRjaENoYXJhY3Rlckl0ZXJhdG9yIChjb24sIG9wLmdldENoaWxkKCksIG9mZnNldCwgZHgsIGxvY2Fsb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcmV0OworICAgICAgICAgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wLkNPTkRJVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9wLkNvbmRpdGlvbk9wIGNvcCA9IChPcC5Db25kaXRpb25PcClvcDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaHAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvcC5yZWZOdW1iZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29wLnJlZk51bWJlciA+PSB0aGlzLm5vZnBhcmVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogUmVmZXJlbmNlIG51bWJlciBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvOiAiK2NvcC5yZWZOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hwID0gY29uLm1hdGNoLmdldEJlZ2lubmluZyhjb3AucmVmTnVtYmVyKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjb24ubWF0Y2guZ2V0RW5kKGNvcC5yZWZOdW1iZXIpID49IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaHAgPSAwIDw9IHRoaXMuIG1hdGNoQ2hhcmFjdGVySXRlcmF0b3IgKGNvbiwgY29wLmNvbmRpdGlvbiwgb2Zmc2V0LCBkeCwgb3B0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IGNvcC55ZXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29wLm5vICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gY29wLm5vOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBjb3AubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBvcGVyYXRpb24gdHlwZTogIitvcC50eXBlKTsKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoIChvcC50eXBlKQorICAgICAgICB9IC8vIHdoaWxlCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGdldFByZXZpb3VzV29yZFR5cGUoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBvcHRzKSB7CisgICAgICAgIGludCByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKKyAgICAgICAgd2hpbGUgKHJldCA9PSBXVF9JR05PUkUpCisgICAgICAgICAgICByZXQgPSBnZXRXb3JkVHlwZSh0YXJnZXQsIGJlZ2luLCBlbmQsIC0tb2Zmc2V0LCBvcHRzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IGJlZ2luLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgb3B0cykgeworICAgICAgICBpZiAob2Zmc2V0IDwgYmVnaW4gfHwgb2Zmc2V0ID49IGVuZCkgIHJldHVybiBXVF9PVEhFUjsKKyAgICAgICAgcmV0dXJuIGdldFdvcmRUeXBlMCggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCApICwgb3B0cyk7CisgICAgfQorCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0LCBpbnQgcGFydGxlbikgeworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKKyAgICAgICAgICAgIGlmICggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgICE9IHBhcnQuY2hhckF0KGkrKykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhDaGFyYWN0ZXJJdGVyYXRvciAgdGFyZ2V0LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgeworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBpID0gb2Zmc2V0MjsKKyAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKKyAgICAgICAgICAgIGlmICggdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgICE9ICB0YXJnZXQgLnNldEluZGV4KCAgaSsrICkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcjcmVnaW9uTWF0Y2hlcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoQ2hhcmFjdGVySXRlcmF0b3IgIHRhcmdldCwgaW50IG9mZnNldCwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQsIGludCBwYXJ0bGVuKSB7CisgICAgICAgIGlmIChvZmZzZXQgPCAwKSAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGltaXQtb2Zmc2V0IDwgcGFydGxlbikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAocGFydGxlbi0tID4gMCkgeworICAgICAgICAgICAgY2hhciBjaDEgPSAgdGFyZ2V0IC5zZXRJbmRleCggIG9mZnNldCsrICkgOworICAgICAgICAgICAgY2hhciBjaDIgPSBwYXJ0LmNoYXJBdChpKyspOworICAgICAgICAgICAgaWYgKGNoMSA9PSBjaDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gxKTsKKyAgICAgICAgICAgIGNoYXIgdWNoMiA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDIpOworICAgICAgICAgICAgaWYgKHVjaDEgPT0gdWNoMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKENoYXJhY3Rlckl0ZXJhdG9yICB0YXJnZXQsIGludCBvZmZzZXQsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQyLCBpbnQgcGFydGxlbikgeworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGxpbWl0LW9mZnNldCA8IHBhcnRsZW4pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBpID0gb2Zmc2V0MjsKKyAgICAgICAgd2hpbGUgKHBhcnRsZW4tLSA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgY2gxID0gIHRhcmdldCAuc2V0SW5kZXgoICBvZmZzZXQrKyApIDsKKyAgICAgICAgICAgIGNoYXIgY2gyID0gIHRhcmdldCAuc2V0SW5kZXgoICBpKysgKSA7CisgICAgICAgICAgICBpZiAoY2gxID09IGNoMikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNoYXIgdWNoMSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaDEpOworICAgICAgICAgICAgY2hhciB1Y2gyID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoMik7CisgICAgICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh1Y2gxKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisKKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIEEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqIEBzZXJpYWwKKyAgICAgKi8KKyAgICBTdHJpbmcgcmVnZXg7CisgICAgLyoqCisgICAgICogQHNlcmlhbAorICAgICAqLworICAgIGludCBvcHRpb25zOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBwYXJlbnRoZXNpcyBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqIEBzZXJpYWwKKyAgICAgKi8KKyAgICBpbnQgbm9mcGFyZW47CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgKiBAc2VyaWFsCisgICAgICovCisgICAgVG9rZW4gdG9rZW50cmVlOworCisgICAgYm9vbGVhbiBoYXNCYWNrUmVmZXJlbmNlcyA9IGZhbHNlOworCisgICAgdHJhbnNpZW50IGludCBtaW5sZW5ndGg7CisgICAgdHJhbnNpZW50IE9wIG9wZXJhdGlvbnMgPSBudWxsOworICAgIHRyYW5zaWVudCBpbnQgbnVtYmVyT2ZDbG9zdXJlczsKKyAgICB0cmFuc2llbnQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICB0cmFuc2llbnQgUmFuZ2VUb2tlbiBmaXJzdENoYXIgPSBudWxsOworCisgICAgdHJhbnNpZW50IFN0cmluZyBmaXhlZFN0cmluZyA9IG51bGw7CisgICAgdHJhbnNpZW50IGludCBmaXhlZFN0cmluZ09wdGlvbnM7CisgICAgdHJhbnNpZW50IEJNUGF0dGVybiBmaXhlZFN0cmluZ1RhYmxlID0gbnVsbDsKKyAgICB0cmFuc2llbnQgYm9vbGVhbiBmaXhlZFN0cmluZ09ubHkgPSBmYWxzZTsKKworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRleHQgeworICAgICAgICBDaGFyYWN0ZXJJdGVyYXRvciBjaVRhcmdldDsKKyAgICAgICAgU3RyaW5nIHN0clRhcmdldDsKKyAgICAgICAgY2hhcltdIGNoYXJUYXJnZXQ7CisgICAgICAgIGludCBzdGFydDsKKyAgICAgICAgaW50IGxpbWl0OworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICBNYXRjaCBtYXRjaDsKKyAgICAgICAgYm9vbGVhbiBpbnVzZSA9IGZhbHNlOworICAgICAgICBpbnRbXSBvZmZzZXRzOworCisgICAgICAgIENvbnRleHQoKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRDb21tb24oaW50IG5vZmNsb3N1cmVzKSB7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMubGltaXQtdGhpcy5zdGFydDsKKyAgICAgICAgICAgIHRoaXMuaW51c2UgPSB0cnVlOworICAgICAgICAgICAgdGhpcy5tYXRjaCA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5vZmZzZXRzID09IG51bGwgfHwgdGhpcy5vZmZzZXRzLmxlbmd0aCAhPSBub2ZjbG9zdXJlcykKKyAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMgPSBuZXcgaW50W25vZmNsb3N1cmVzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IG5vZmNsb3N1cmVzOyAgaSArKykgIHRoaXMub2Zmc2V0c1tpXSA9IC0xOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoQ2hhcmFjdGVySXRlcmF0b3IgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IG5vZmNsb3N1cmVzKSB7CisgICAgICAgICAgICB0aGlzLmNpVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICAgICAgdGhpcy5yZXNldENvbW1vbihub2ZjbG9zdXJlcyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldChTdHJpbmcgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgaW50IG5vZmNsb3N1cmVzKSB7CisgICAgICAgICAgICB0aGlzLnN0clRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgIHRoaXMucmVzZXRDb21tb24obm9mY2xvc3VyZXMpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVzZXQoY2hhcltdIHRhcmdldCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBub2ZjbG9zdXJlcykgeworICAgICAgICAgICAgdGhpcy5jaGFyVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgICAgICAgICAgdGhpcy5yZXNldENvbW1vbihub2ZjbG9zdXJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyBmb3IgbWF0Y2hpbmcuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBiZWZvcmUgc3RhcnRpbmcgbWF0Y2hpbmcuCisgICAgICovCisgICAgdm9pZCBwcmVwYXJlKCkgeworICAgICAgICBpZiAoT3AuQ09VTlQpICBPcC5ub2ZpbnN0YW5jZXMgPSAwOworICAgICAgICB0aGlzLmNvbXBpbGUodGhpcy50b2tlbnRyZWUpOworICAgICAgICAvKgorICAgICAgICBpZiAgKHRoaXMub3BlcmF0aW9ucy50eXBlID09IE9wLkNMT1NVUkUgJiYgdGhpcy5vcGVyYXRpb25zLmdldENoaWxkKCkudHlwZSA9PSBPcC5ET1QpIHsgLy8gLioKKyAgICAgICAgICAgIE9wIGFuY2hvciA9IE9wLmNyZWF0ZUFuY2hvcihpc1NldCh0aGlzLm9wdGlvbnMsIFNJTkdMRV9MSU5FKSA/ICdBJyA6ICdAJyk7CisgICAgICAgICAgICBhbmNob3IubmV4dCA9IHRoaXMub3BlcmF0aW9uczsKKyAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IGFuY2hvcjsKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICBpZiAoT3AuQ09VTlQpICBTeXN0ZW0uZXJyLnByaW50bG4oIkRFQlVHOiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnM6ICIrT3Aubm9maW5zdGFuY2VzKTsKKworICAgICAgICB0aGlzLm1pbmxlbmd0aCA9IHRoaXMudG9rZW50cmVlLmdldE1pbkxlbmd0aCgpOworCisgICAgICAgIHRoaXMuZmlyc3RDaGFyID0gbnVsbDsKKyAgICAgICAgaWYgKCFpc1NldCh0aGlzLm9wdGlvbnMsIFBST0hJQklUX0hFQURfQ0hBUkFDVEVSX09QVElNSVpBVElPTikKKyAgICAgICAgICAgICYmICFpc1NldCh0aGlzLm9wdGlvbnMsIFhNTFNDSEVNQV9NT0RFKSkgeworICAgICAgICAgICAgUmFuZ2VUb2tlbiBmaXJzdENoYXIgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgaW50IGZyZXN1bHQgPSB0aGlzLnRva2VudHJlZS5hbmFseXplRmlyc3RDaGFyYWN0ZXIoZmlyc3RDaGFyLCB0aGlzLm9wdGlvbnMpOworICAgICAgICAgICAgaWYgKGZyZXN1bHQgPT0gVG9rZW4uRkNfVEVSTUlOQUwpIHsKKyAgICAgICAgICAgICAgICBmaXJzdENoYXIuY29tcGFjdFJhbmdlcygpOworICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RDaGFyID0gZmlyc3RDaGFyOworICAgICAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogVXNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3B0aW1pemF0aW9uOiAiK2ZpcnN0Q2hhcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zICE9IG51bGwKKyAgICAgICAgICAgICYmICh0aGlzLm9wZXJhdGlvbnMudHlwZSA9PSBPcC5TVFJJTkcgfHwgdGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuQ0hBUikKKyAgICAgICAgICAgICYmIHRoaXMub3BlcmF0aW9ucy5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCIgKioqIE9ubHkgZml4ZWQgc3RyaW5nISAqKiogIik7CisgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nT25seSA9IHRydWU7CisgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zLnR5cGUgPT0gT3AuU1RSSU5HKQorICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSB0aGlzLm9wZXJhdGlvbnMuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wZXJhdGlvbnMuZ2V0RGF0YSgpID49IDB4MTAwMDApIHsgLy8gT3AuQ0hBUgorICAgICAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBSRVV0aWwuZGVjb21wb3NlVG9TdXJyb2dhdGVzKHRoaXMub3BlcmF0aW9ucy5nZXREYXRhKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gYWMgPSBuZXcgY2hhclsxXTsKKyAgICAgICAgICAgICAgICBhY1swXSA9IChjaGFyKXRoaXMub3BlcmF0aW9ucy5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZyA9IG5ldyBTdHJpbmcoYWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ09wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CisgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nVGFibGUgPSBuZXcgQk1QYXR0ZXJuKHRoaXMuZml4ZWRTdHJpbmcsIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXQodGhpcy5maXhlZFN0cmluZ09wdGlvbnMsIElHTk9SRV9DQVNFKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWlzU2V0KHRoaXMub3B0aW9ucywgUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTikKKyAgICAgICAgICAgICAgICAgICAmJiAhaXNTZXQodGhpcy5vcHRpb25zLCBYTUxTQ0hFTUFfTU9ERSkpIHsKKyAgICAgICAgICAgIFRva2VuLkZpeGVkU3RyaW5nQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBUb2tlbi5GaXhlZFN0cmluZ0NvbnRhaW5lcigpOworICAgICAgICAgICAgdGhpcy50b2tlbnRyZWUuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTsKKyAgICAgICAgICAgIHRoaXMuZml4ZWRTdHJpbmcgPSBjb250YWluZXIudG9rZW4gPT0gbnVsbCA/IG51bGwgOiBjb250YWluZXIudG9rZW4uZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucyA9IGNvbnRhaW5lci5vcHRpb25zOworICAgICAgICAgICAgaWYgKHRoaXMuZml4ZWRTdHJpbmcgIT0gbnVsbCAmJiB0aGlzLmZpeGVkU3RyaW5nLmxlbmd0aCgpIDwgMikKKyAgICAgICAgICAgICAgICB0aGlzLmZpeGVkU3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIC8vIFRoaXMgcGF0dGVybiBoYXMgYSBmaXhlZCBzdHJpbmcgb2Ygd2hpY2ggbGVuZ3RoIGlzIG1vcmUgdGhhbiBvbmUuCisgICAgICAgICAgICBpZiAodGhpcy5maXhlZFN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5maXhlZFN0cmluZ1RhYmxlID0gbmV3IEJNUGF0dGVybih0aGlzLmZpeGVkU3RyaW5nLCAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldCh0aGlzLmZpeGVkU3RyaW5nT3B0aW9ucywgSUdOT1JFX0NBU0UpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogVGhlIGxvbmdlc3QgZml4ZWQgc3RyaW5nOiAiK3RoaXMuZml4ZWRTdHJpbmcubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiLyIgLy8rdGhpcy5maXhlZFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIvIitSRVV0aWwuY3JlYXRlT3B0aW9uU3RyaW5nKHRoaXMuZml4ZWRTdHJpbmdPcHRpb25zKSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIlN0cmluZzogIik7CisgICAgICAgICAgICAgICAgICAgIFJFVXRpbC5kdW1wU3RyaW5nKHRoaXMuZml4ZWRTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIG9wdGlvbi4KKyAgICAgKiBJZiB5b3Ugc3BlY2lmeSB0aGlzIG9wdGlvbiwgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPig8L2tiZD48dmFyPlg8L3Zhcj48a2JkPik8L2tiZD48L3NwYW4+CisgICAgICogY2FwdHVyZXMgbWF0Y2hlZCB0ZXh0LCBhbmQgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPig6Pzwva2JkPjx2YXI+WDwvdmFyPjxrYmQ+KTwva2JkPjwvc3Bhbj4KKyAgICAgKiBkb2VzIG5vdCBjYXB0dXJlLgorICAgICAqCisgICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxpbnQpCisgICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGludCkKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BUktfUEFSRU5TID0gMTw8MDsKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqICJpIgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0NBU0UgPSAxPDwxOworCisgICAgLyoqCisgICAgICogInMiCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfTElORSA9IDE8PDI7CisKKyAgICAvKioKKyAgICAgKiAibSIKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE1VTFRJUExFX0xJTkVTID0gMTw8MzsKKworICAgIC8qKgorICAgICAqICJ4IgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5ERURfQ09NTUVOVCA9IDE8PDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiByZWRlZmluZXMgPHNwYW4gY2xhc3M9IlJFR0VYIj48a2JkPlxkIFxEIFx3IFxXIFxzIFxTPC9rYmQ+PC9zcGFuPi4KKyAgICAgKgorICAgICAqIEBzZWUgI1JlZ3VsYXJFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsaW50KQorICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxpbnQpCisgICAgICogQHNlZSAjVU5JQ09ERV9XT1JEX0JPVU5EQVJZCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBVU0VfVU5JQ09ERV9DQVRFR09SWSA9IDE8PDU7IC8vICJ1IgorCisgICAgLyoqCisgICAgICogQW4gb3B0aW9uLgorICAgICAqIFRoaXMgZW5hYmxlcyB0byBwcm9jZXNzIGxvY2FsZS1pbmRlcGVuZGVudCB3b3JkIGJvdW5kYXJ5IGZvciA8c3BhbiBjbGFzcz0iUkVHRVgiPjxrYmQ+XGIgXEIgXCZsdDsgXD48L2tiZD48L3NwYW4+LgorICAgICAqIDxwPkJ5IGRlZmF1bHQsIHRoZSBlbmdpbmUgY29uc2lkZXJzIGEgcG9zaXRpb24gYmV0d2VlbiBhIHdvcmQgY2hhcmFjdGVyCisgICAgICogKDxzcGFuIGNsYXNzPSJSRUdFWCI+PEtiZD5cdzwva2JkPjwvc3Bhbj4pIGFuZCBhIG5vbiB3b3JkIGNoYXJhY3RlcgorICAgICAqIGlzIGEgd29yZCBib3VuZGFyeS4KKyAgICAgKiA8cD5CeSB0aGlzIG9wdGlvbiwgdGhlIGVuZ2luZSBjaGVja3Mgd29yZCBib3VuZGFyaWVzIHdpdGggdGhlIG1ldGhvZCBvZgorICAgICAqICdVbmljb2RlIFJlZ3VsYXIgRXhwcmVzc2lvbiBHdWlkZWxpbmVzJyBSZXZpc2lvbiA0LgorICAgICAqCisgICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxpbnQpCisgICAgICogQHNlZSAjc2V0UGF0dGVybihqYXZhLmxhbmcuU3RyaW5nLGludCkKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSUNPREVfV09SRF9CT1VOREFSWSA9IDE8PDY7IC8vICJ3IgorCisgICAgLyoqCisgICAgICogIkgiCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQUk9ISUJJVF9IRUFEX0NIQVJBQ1RFUl9PUFRJTUlaQVRJT04gPSAxPDw3OworICAgIC8qKgorICAgICAqICJGIgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRfRklYRURfU1RSSU5HX09QVElNSVpBVElPTiA9IDE8PDg7CisgICAgLyoqCisgICAgICogIlgiLiBYTUwgU2NoZW1hIG1vZGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBYTUxTQ0hFTUFfTU9ERSA9IDE8PDk7CisgICAgLyoqCisgICAgICogIiwiLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lBTF9DT01NQSA9IDE8PDEwOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU2V0KGludCBvcHRpb25zLCBpbnQgZmxhZykgeworICAgICAgICByZXR1cm4gKG9wdGlvbnMgJiBmbGFnKSA9PSBmbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVnZXggQSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgKiBAZXhjZXB0aW9uIG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLnJlZ2V4LlBhcnNlRXhjZXB0aW9uIDxWQVI+cmVnZXg8L1ZBUj4gaXMgbm90IGNvbmZvcm1pbmcgdG8gdGhlIHN5bnRheC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVndWxhckV4cHJlc3Npb24oU3RyaW5nIHJlZ2V4KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLnNldFBhdHRlcm4ocmVnZXgsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgUmVndWxhckV4cHJlc3Npb24gaW5zdGFuY2Ugd2l0aCBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2V4IEEgcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBTdHJpbmcgY29uc2lzdGVkIG9mICJpIiAibSIgInMiICJ1IiAidyIgIiwiICJYIgorICAgICAqIEBleGNlcHRpb24gb3JnLmFwYWNoZS54ZXJjZXMudXRpbHMucmVnZXguUGFyc2VFeGNlcHRpb24gPFZBUj5yZWdleDwvVkFSPiBpcyBub3QgY29uZm9ybWluZyB0byB0aGUgc3ludGF4LgorICAgICAqLworICAgIHB1YmxpYyBSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcmVnZXgsIFN0cmluZyBvcHRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLnNldFBhdHRlcm4ocmVnZXgsIG9wdGlvbnMpOworICAgIH0KKworICAgIFJlZ3VsYXJFeHByZXNzaW9uKFN0cmluZyByZWdleCwgVG9rZW4gdG9rLCBpbnQgcGFyZW5zLCBib29sZWFuIGhhc0JhY2tSZWZlcmVuY2VzLCBpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7CisgICAgICAgIHRoaXMudG9rZW50cmVlID0gdG9rOworICAgICAgICB0aGlzLm5vZnBhcmVuID0gcGFyZW5zOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmhhc0JhY2tSZWZlcmVuY2VzID0gaGFzQmFja1JlZmVyZW5jZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBuZXdQYXR0ZXJuKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzLnNldFBhdHRlcm4obmV3UGF0dGVybiwgdGhpcy5vcHRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgbmV3UGF0dGVybiwgaW50IG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucmVnZXggPSBuZXdQYXR0ZXJuOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBSZWdleFBhcnNlciBycCA9IHRoaXMuaXNTZXQodGhpcy5vcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5YTUxTQ0hFTUFfTU9ERSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBQYXJzZXJGb3JYTUxTY2hlbWEoKSA6IG5ldyBSZWdleFBhcnNlcigpOworICAgICAgICB0aGlzLnRva2VudHJlZSA9IHJwLnBhcnNlKHRoaXMucmVnZXgsIHRoaXMub3B0aW9ucyk7CisgICAgICAgIHRoaXMubm9mcGFyZW4gPSBycC5wYXJlbm51bWJlcjsKKyAgICAgICAgdGhpcy5oYXNCYWNrUmVmZXJlbmNlcyA9IHJwLmhhc0JhY2tSZWZlcmVuY2VzOworCisgICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7CisgICAgICAgIHRoaXMuY29udGV4dCA9IG51bGw7CisgICAgfQorICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgbmV3UGF0dGVybiwgU3RyaW5nIG9wdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuc2V0UGF0dGVybihuZXdQYXR0ZXJuLCBSRVV0aWwucGFyc2VPcHRpb25zKG9wdGlvbnMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVnZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGlzIGluc3RlbmNlIGluIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b2tlbnRyZWUudG9TdHJpbmcodGhpcy5vcHRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgb3B0aW9uIHN0cmluZy4KKyAgICAgKiBUaGUgb3JkZXIgb2YgbGV0dGVycyBpbiBpdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gYSBzdHJpbmcgc3BlY2lmaWVkCisgICAgICogaW4gYSBjb25zdHJ1Y3RvciBvciA8Y29kZT5zZXRQYXR0ZXJuKCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHNlZSAjUmVndWxhckV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqIEBzZWUgI3NldFBhdHRlcm4oamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIFJFVXRpbC5jcmVhdGVPcHRpb25TdHJpbmcodGhpcy5vcHRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJuIHRydWUgaWYgcGF0dGVybnMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJlZ3VsYXJFeHByZXNzaW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgUmVndWxhckV4cHJlc3Npb24gciA9IChSZWd1bGFyRXhwcmVzc2lvbilvYmo7CisgICAgICAgIHJldHVybiB0aGlzLnJlZ2V4LmVxdWFscyhyLnJlZ2V4KSAmJiB0aGlzLm9wdGlvbnMgPT0gci5vcHRpb25zOworICAgIH0KKworICAgIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBwYXR0ZXJuLCBpbnQgb3B0aW9ucykgeworICAgICAgICByZXR1cm4gdGhpcy5yZWdleC5lcXVhbHMocGF0dGVybikgJiYgdGhpcy5vcHRpb25zID09IG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVnZXgrIi8iK3RoaXMuZ2V0T3B0aW9ucygpKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyAxIHdoZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgbm8gY2FwdHVyaW5nLXBhcmVudGhlc2lzLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1iZXJPZkdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubm9mcGFyZW47CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX0lHTk9SRSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX0xFVFRFUiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdUX09USEVSID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZ2V0V29yZFR5cGUwKGNoYXIgY2gsIGludCBvcHRzKSB7CisgICAgICAgIGlmICghaXNTZXQob3B0cywgVU5JQ09ERV9XT1JEX0JPVU5EQVJZKSkgeworICAgICAgICAgICAgaWYgKGlzU2V0KG9wdHMsIFVTRV9VTklDT0RFX0NBVEVHT1JZKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVG9rZW4uZ2V0UmFuZ2UoIklzV29yZCIsIHRydWUpLm1hdGNoKGNoKSkgPyBXVF9MRVRURVIgOiBXVF9PVEhFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpc1dvcmRDaGFyKGNoKSA/IFdUX0xFVFRFUiA6IFdUX09USEVSOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChDaGFyYWN0ZXIuZ2V0VHlwZShjaCkpIHsKKyAgICAgICAgY2FzZSBDaGFyYWN0ZXIuVVBQRVJDQVNFX0xFVFRFUjogICAgICAvLyBMCisgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkxPV0VSQ0FTRV9MRVRURVI6ICAgICAgLy8gTAorICAgICAgICBjYXNlIENoYXJhY3Rlci5USVRMRUNBU0VfTEVUVEVSOiAgICAgIC8vIEwKKyAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTU9ESUZJRVJfTEVUVEVSOiAgICAgICAvLyBMCisgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX0xFVFRFUjogICAgICAgICAgLy8gTAorICAgICAgICBjYXNlIENoYXJhY3Rlci5MRVRURVJfTlVNQkVSOiAgICAgICAgIC8vIE4KKyAgICAgICAgY2FzZSBDaGFyYWN0ZXIuREVDSU1BTF9ESUdJVF9OVU1CRVI6ICAvLyBOCisgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX05VTUJFUjogICAgICAgICAgLy8gTgorICAgICAgICBjYXNlIENoYXJhY3Rlci5DT01CSU5JTkdfU1BBQ0lOR19NQVJLOiAvLyBNYworICAgICAgICAgICAgcmV0dXJuIFdUX0xFVFRFUjsKKworICAgICAgICBjYXNlIENoYXJhY3Rlci5GT1JNQVQ6ICAgICAgICAgICAgICAgIC8vIENmCisgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUks6ICAgICAgLy8gTW4KKyAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRU5DTE9TSU5HX01BUks6ICAgICAgICAvLyBNYworICAgICAgICAgICAgcmV0dXJuIFdUX0lHTk9SRTsKKworICAgICAgICBjYXNlIENoYXJhY3Rlci5DT05UUk9MOiAgICAgICAgICAgICAgIC8vIENjCisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICBjYXNlICdcdTAwMEInOgorICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgIHJldHVybiBXVF9PVEhFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFdUX0lHTk9SRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFdUX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgc3RhdGljIGZpbmFsIGludCBMSU5FX0ZFRUQgPSAweDAwMEE7CisgICAgc3RhdGljIGZpbmFsIGludCBDQVJSSUFHRV9SRVRVUk4gPSAweDAwMEQ7CisgICAgc3RhdGljIGZpbmFsIGludCBMSU5FX1NFUEFSQVRPUiA9IDB4MjAyODsKKyAgICBzdGF0aWMgZmluYWwgaW50IFBBUkFHUkFQSF9TRVBBUkFUT1IgPSAweDIwMjk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRU9MQ2hhcihpbnQgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID09IExJTkVfRkVFRCB8fCBjaCA9PSBDQVJSSUFHRV9SRVRVUk4gfHwgY2ggPT0gTElORV9TRVBBUkFUT1IKKyAgICAgICAgfHwgY2ggPT0gUEFSQUdSQVBIX1NFUEFSQVRPUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV29yZENoYXIoaW50IGNoKSB7IC8vIExlZ2FjeSB3b3JkIGNoYXJhY3RlcnMKKyAgICAgICAgaWYgKGNoID09ICdfJykgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY2ggPCAnMCcpICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjaCA+ICd6JykgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNoIDw9ICc5JykgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY2ggPCAnQScpICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChjaCA8PSAnWicpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGNoIDwgJ2EnKSAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG1hdGNoSWdub3JlQ2FzZShpbnQgY2hhcmRhdGEsIGludCBjaCkgeworICAgICAgICBpZiAoY2hhcmRhdGEgPT0gY2gpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGNoYXJkYXRhID4gMHhmZmZmIHx8IGNoID4gMHhmZmZmKSAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyIHVjaDEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2hhcmRhdGEpOworICAgICAgICBjaGFyIHVjaDIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2gpOworICAgICAgICBpZiAodWNoMSA9PSB1Y2gyKSAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodWNoMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHVjaDIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvU2NoZW1hUmVndWxhckV4cHJlc3Npb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvU2NoZW1hUmVndWxhckV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWExNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9TY2hlbWFSZWd1bGFyRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbiBleHRlbmRzIFJlZ3VsYXJFeHByZXNzaW9uCit7CisgICAgcHJpdmF0ZSBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbihTdHJpbmcgcGF0dGVybikKKyAgICB7CisgICAgICAgIHN1cGVyKHBhdHRlcm4sICJYIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZWd1bGFyRXhwcmVzc2lvbiBmb3JQYXR0ZXJuKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgU2NoZW1hUmVndWxhckV4cHJlc3Npb24gdHJlID0gKFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKWtub3duUGF0dGVybnMuZ2V0KHMpOworICAgICAgICBpZiAodHJlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJlOworICAgICAgICByZXR1cm4gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKHMsICJYIik7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIE1hcCBrbm93blBhdHRlcm5zID0gYnVpbGRLbm93blBhdHRlcm5NYXAoKTsKKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEtub3duUGF0dGVybk1hcCgpCisgICAgeworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcmVzdWx0LnB1dCgiXFxjKyIsIG5ldyBTY2hlbWFSZWd1bGFyRXhwcmVzc2lvbigiXFxjKyIpCisgICAgICAgICAgICB7IHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHMpIHsgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5tdG9rZW4ocyk7IH0gfSApOworICAgICAgICByZXN1bHQucHV0KCJcXGlcXGMqIiwgbmV3IFNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uKCJcXGlcXGMqIikKKyAgICAgICAgICAgIHsgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcykgeyByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTmFtZShzKTsgfSB9ICk7CisgICAgICAgIHJlc3VsdC5wdXQoIltcXGktWzpdXVtcXGMtWzpdXSoiLCBuZXcgU2NoZW1hUmVndWxhckV4cHJlc3Npb24oIltcXGktWzpdXVtcXGMtWzpdXSoiKQorICAgICAgICAgICAgeyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzKSB7IHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocyk7IH0gfSApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTEzNTkwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsMTUyMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KKyAqLworY2xhc3MgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRUT0tFTlMgPSB0cnVlOworICAgIHN0YXRpYyBpbnQgdG9rZW5zID0gMDsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDA7ICAgICAgICAgICAgICAgICAgLy8gTGl0ZXJhbCBjaGFyCisgICAgc3RhdGljIGZpbmFsIGludCBET1QgPSAxMTsgICAgICAgICAgICAgICAgICAvLyAuCisgICAgc3RhdGljIGZpbmFsIGludCBDT05DQVQgPSAxOyAgICAgICAgICAgICAgICAvLyBYWQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5JT04gPSAyOyAgICAgICAgICAgICAgICAgLy8gWHxZfFoKKyAgICBzdGF0aWMgZmluYWwgaW50IENMT1NVUkUgPSAzOyAgICAgICAgICAgICAgIC8vIFgqCisgICAgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDQ7ICAgICAgICAgICAgICAgICAvLyBbYS16QS1aXSBldGMuCisgICAgc3RhdGljIGZpbmFsIGludCBOUkFOR0UgPSA1OyAgICAgICAgICAgICAgICAvLyBbXmEtekEtWl0gZXRjLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU4gPSA2OyAgICAgICAgICAgICAgICAgLy8gKFgpIG9yICg/OlgpCisgICAgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDc7ICAgICAgICAgICAgICAgICAvLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5DSE9SID0gODsgICAgICAgICAgICAgICAgLy8gXiAkIFxiIFxCIFw8IFw+IFxBIFxaIFx6CisgICAgc3RhdGljIGZpbmFsIGludCBOT05HUkVFRFlDTE9TVVJFID0gOTsgICAgICAvLyAqPyArPworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gMTA7ICAgICAgICAgICAgICAgLy8gc3RyaW5ncworICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1JFRkVSRU5DRSA9IDEyOyAgICAgICAgLy8gYmFjayByZWZlcmVuY2VzCisgICAgc3RhdGljIGZpbmFsIGludCBMT09LQUhFQUQgPSAyMDsgICAgICAgICAgICAvLyAoPz0uLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBORUdBVElWRUxPT0tBSEVBRCA9IDIxOyAgICAvLyAoPyEuLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBMT09LQkVISU5EID0gMjI7ICAgICAgICAgICAvLyAoPzw9Li4uKQorICAgIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVMT09LQkVISU5EID0gMjM7ICAgLy8gKD88IS4uLikKKyAgICBzdGF0aWMgZmluYWwgaW50IElOREVQRU5ERU5UID0gMjQ7ICAgICAgICAgIC8vICg/Pi4uLikKKyAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGSUVSR1JPVVAgPSAyNTsgICAgICAgIC8vICg/aW1zLWltczouLi4pCisgICAgc3RhdGljIGZpbmFsIGludCBDT05ESVRJT04gPSAyNjsgICAgICAgICAgICAvLyAoPyguLi4peWVzfG5vKQorCisgICAgc3RhdGljIGZpbmFsIGludCBVVEYxNl9NQVggPSAweDEwZmZmZjsKKworICAgIGludCB0eXBlOworCisgICAgc3RhdGljIFRva2VuIHRva2VuX2RvdDsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fMHRvOTsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fd29yZGNoYXJzOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9ub3RfMHRvOTsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90X3dvcmRjaGFyczsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fc3BhY2VzOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9ub3Rfc3BhY2VzOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9lbXB0eTsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbGluZWJlZ2lubmluZzsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbGluZWJlZ2lubmluZzI7CisgICAgc3RhdGljIFRva2VuIHRva2VuX2xpbmVlbmQ7CisgICAgc3RhdGljIFRva2VuIHRva2VuX3N0cmluZ2JlZ2lubmluZzsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fc3RyaW5nZW5kOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl9zdHJpbmdlbmQyOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkZWRnZTsKKyAgICBzdGF0aWMgVG9rZW4gdG9rZW5fbm90X3dvcmRlZGdlOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkYmVnaW5uaW5nOworICAgIHN0YXRpYyBUb2tlbiB0b2tlbl93b3JkZW5kOworICAgIHN0YXRpYyB7CisgICAgICAgIFRva2VuLnRva2VuX2VtcHR5ID0gbmV3IFRva2VuKFRva2VuLkVNUFRZKTsKKworICAgICAgICBUb2tlbi50b2tlbl9saW5lYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdeJyk7CisgICAgICAgIFRva2VuLnRva2VuX2xpbmViZWdpbm5pbmcyID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdAJyk7CisgICAgICAgIFRva2VuLnRva2VuX2xpbmVlbmQgPSBUb2tlbi5jcmVhdGVBbmNob3IoJyQnKTsKKyAgICAgICAgVG9rZW4udG9rZW5fc3RyaW5nYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdBJyk7CisgICAgICAgIFRva2VuLnRva2VuX3N0cmluZ2VuZCA9IFRva2VuLmNyZWF0ZUFuY2hvcigneicpOworICAgICAgICBUb2tlbi50b2tlbl9zdHJpbmdlbmQyID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdaJyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRlZGdlID0gVG9rZW4uY3JlYXRlQW5jaG9yKCdiJyk7CisgICAgICAgIFRva2VuLnRva2VuX25vdF93b3JkZWRnZSA9IFRva2VuLmNyZWF0ZUFuY2hvcignQicpOworICAgICAgICBUb2tlbi50b2tlbl93b3JkYmVnaW5uaW5nID0gVG9rZW4uY3JlYXRlQW5jaG9yKCc8Jyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRlbmQgPSBUb2tlbi5jcmVhdGVBbmNob3IoJz4nKTsKKworICAgICAgICBUb2tlbi50b2tlbl9kb3QgPSBuZXcgVG9rZW4oVG9rZW4uRE9UKTsKKworICAgICAgICBUb2tlbi50b2tlbl8wdG85ID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgVG9rZW4udG9rZW5fMHRvOS5hZGRSYW5nZSgnMCcsICc5Jyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycyA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnMCcsICc5Jyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnQScsICdaJyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnXycsICdfJyk7CisgICAgICAgIFRva2VuLnRva2VuX3dvcmRjaGFycy5hZGRSYW5nZSgnYScsICd6Jyk7CisgICAgICAgIFRva2VuLnRva2VuX3NwYWNlcyA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnXHQnLCAnXHQnKTsKKyAgICAgICAgVG9rZW4udG9rZW5fc3BhY2VzLmFkZFJhbmdlKCdcbicsICdcbicpOworICAgICAgICBUb2tlbi50b2tlbl9zcGFjZXMuYWRkUmFuZ2UoJ1xmJywgJ1xmJyk7CisgICAgICAgIFRva2VuLnRva2VuX3NwYWNlcy5hZGRSYW5nZSgnXHInLCAnXHInKTsKKyAgICAgICAgVG9rZW4udG9rZW5fc3BhY2VzLmFkZFJhbmdlKCcgJywgJyAnKTsKKworICAgICAgICBUb2tlbi50b2tlbl9ub3RfMHRvOSA9IFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoVG9rZW4udG9rZW5fMHRvOSk7CisgICAgICAgIFRva2VuLnRva2VuX25vdF93b3JkY2hhcnMgPSBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKFRva2VuLnRva2VuX3dvcmRjaGFycyk7CisgICAgICAgIFRva2VuLnRva2VuX25vdF9zcGFjZXMgPSBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKFRva2VuLnRva2VuX3NwYWNlcyk7CisgICAgfQorCisgICAgc3RhdGljIFRva2VuLlBhcmVuVG9rZW4gY3JlYXRlTG9vayhpbnQgdHlwZSwgVG9rZW4gY2hpbGQpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFRva2VuLlBhcmVuVG9rZW4odHlwZSwgY2hpbGQsIDApOworICAgIH0KKyAgICBzdGF0aWMgVG9rZW4uUGFyZW5Ub2tlbiBjcmVhdGVQYXJlbihUb2tlbiBjaGlsZCwgaW50IHBudW1iZXIpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFRva2VuLlBhcmVuVG9rZW4oVG9rZW4uUEFSRU4sIGNoaWxkLCBwbnVtYmVyKTsKKyAgICB9CisgICAgc3RhdGljIFRva2VuLkNsb3N1cmVUb2tlbiBjcmVhdGVDbG9zdXJlKFRva2VuIHRvaykgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2xvc3VyZVRva2VuKFRva2VuLkNMT1NVUkUsIHRvayk7CisgICAgfQorICAgIHN0YXRpYyBUb2tlbi5DbG9zdXJlVG9rZW4gY3JlYXRlTkdDbG9zdXJlKFRva2VuIHRvaykgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2xvc3VyZVRva2VuKFRva2VuLk5PTkdSRUVEWUNMT1NVUkUsIHRvayk7CisgICAgfQorICAgIHN0YXRpYyBUb2tlbi5Db25jYXRUb2tlbiBjcmVhdGVDb25jYXQoVG9rZW4gdG9rMSwgVG9rZW4gdG9rMikgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ29uY2F0VG9rZW4odG9rMSwgdG9rMik7CisgICAgfQorICAgIHN0YXRpYyBUb2tlbi5VbmlvblRva2VuIGNyZWF0ZUNvbmNhdCgpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFRva2VuLlVuaW9uVG9rZW4oVG9rZW4uQ09OQ0FUKTsgLy8gKioqIEl0IGlzIG5vdCBhIGJ1Zy4KKyAgICB9CisgICAgc3RhdGljIFRva2VuLlVuaW9uVG9rZW4gY3JlYXRlVW5pb24oKSB7CisgICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5VbmlvblRva2VuKFRva2VuLlVOSU9OKTsKKyAgICB9CisgICAgc3RhdGljIFRva2VuIGNyZWF0ZUVtcHR5KCkgeworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZW1wdHk7CisgICAgfQorICAgIHN0YXRpYyBSYW5nZVRva2VuIGNyZWF0ZVJhbmdlKCkgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2VUb2tlbihUb2tlbi5SQU5HRSk7CisgICAgfQorICAgIHN0YXRpYyBSYW5nZVRva2VuIGNyZWF0ZU5SYW5nZSgpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFJhbmdlVG9rZW4oVG9rZW4uTlJBTkdFKTsKKyAgICB9CisgICAgc3RhdGljIFRva2VuLkNoYXJUb2tlbiBjcmVhdGVDaGFyKGludCBjaCkgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uQ2hhclRva2VuKFRva2VuLkNIQVIsIGNoKTsKKyAgICB9CisgICAgc3RhdGljIHByaXZhdGUgVG9rZW4uQ2hhclRva2VuIGNyZWF0ZUFuY2hvcihpbnQgY2gpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNoYXJUb2tlbihUb2tlbi5BTkNIT1IsIGNoKTsKKyAgICB9CisgICAgc3RhdGljIFRva2VuLlN0cmluZ1Rva2VuIGNyZWF0ZUJhY2tSZWZlcmVuY2UoaW50IHJlZm5vKSB7CisgICAgICAgIGlmIChDT1VOVFRPS0VOUykgIFRva2VuLnRva2VucyArKzsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlbi5TdHJpbmdUb2tlbihUb2tlbi5CQUNLUkVGRVJFTkNFLCBudWxsLCByZWZubyk7CisgICAgfQorICAgIHN0YXRpYyBUb2tlbi5TdHJpbmdUb2tlbiBjcmVhdGVTdHJpbmcoU3RyaW5nIHN0cikgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uU3RyaW5nVG9rZW4oVG9rZW4uU1RSSU5HLCBzdHIsIDApOworICAgIH0KKyAgICBzdGF0aWMgVG9rZW4uTW9kaWZpZXJUb2tlbiBjcmVhdGVNb2RpZmllckdyb3VwKFRva2VuIGNoaWxkLCBpbnQgYWRkLCBpbnQgbWFzaykgeworICAgICAgICBpZiAoQ09VTlRUT0tFTlMpICBUb2tlbi50b2tlbnMgKys7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4uTW9kaWZpZXJUb2tlbihjaGlsZCwgYWRkLCBtYXNrKTsKKyAgICB9CisgICAgc3RhdGljIFRva2VuLkNvbmRpdGlvblRva2VuIGNyZWF0ZUNvbmRpdGlvbihpbnQgcmVmbm8sIFRva2VuIGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuIHllc3BhdCwgVG9rZW4gbm9wYXQpIHsKKyAgICAgICAgaWYgKENPVU5UVE9LRU5TKSAgVG9rZW4udG9rZW5zICsrOworICAgICAgICByZXR1cm4gbmV3IFRva2VuLkNvbmRpdGlvblRva2VuKHJlZm5vLCBjb25kaXRpb24sIHllc3BhdCwgbm9wYXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBUb2tlbihpbnQgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbnVtYmVyIG9mIGNoaWxkcmVuLgorICAgICAqLworICAgIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICB2b2lkIGFkZENoaWxkKFRva2VuIHRvaykgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKKyAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBSQU5HRSBvciBOUkFOR0UKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHNvcnRSYW5nZXMoKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYWN0UmFuZ2VzKCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VSYW5nZXMoVG9rZW4gdG9rKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdWJ0cmFjdFJhbmdlcyhUb2tlbiB0b2spIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIGludGVyc2VjdFJhbmdlcyhUb2tlbiB0b2spIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorICAgIHN0YXRpYyBUb2tlbiBjb21wbGVtZW50UmFuZ2VzKFRva2VuIHRvaykgeworICAgICAgICByZXR1cm4gUmFuZ2VUb2tlbi5jb21wbGVtZW50UmFuZ2VzKHRvayk7CisgICAgfQorCisKKyAgICB2b2lkIHNldE1pbihpbnQgbWluKSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBDTE9TVVJFCisgICAgfQorICAgIHZvaWQgc2V0TWF4KGludCBtYXgpIHsgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUKKyAgICB9CisgICAgaW50IGdldE1pbigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgQ0xPU1VSRQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBnZXRNYXgoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIENMT1NVUkUKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgZ2V0UmVmZXJlbmNlTnVtYmVyKCkgeyAgICAgICAgICAgICAgICAgIC8vIGZvciBTVFJJTkcKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIFNUUklORworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpbnQgZ2V0UGFyZW5OdW1iZXIoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZ2V0Q2hhcigpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDApOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW4uRE9UID8gIi4iIDogIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSG93IG1hbnkgY2hhcmFjdGVycyBhcmUgbmVlZGVkPworICAgICAqLworICAgIGZpbmFsIGludCBnZXRNaW5MZW5ndGgoKSB7CisgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CisgICAgICAgICAgY2FzZSBDT05DQVQ6CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gdGhpcy5nZXRDaGlsZChpKS5nZXRNaW5MZW5ndGgoKTsKKyAgICAgICAgICAgIHJldHVybiBzdW07CisKKyAgICAgICAgICBjYXNlIENPTkRJVElPTjoKKyAgICAgICAgICBjYXNlIFVOSU9OOgorICAgICAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBpbnQgcmV0ID0gdGhpcy5nZXRDaGlsZCgwKS5nZXRNaW5MZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgIGludCBtaW4gPSB0aGlzLmdldENoaWxkKGkpLmdldE1pbkxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChtaW4gPCByZXQpICByZXQgPSBtaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgY2FzZSBDTE9TVVJFOgorICAgICAgICAgIGNhc2UgTk9OR1JFRURZQ0xPU1VSRToKKyAgICAgICAgICAgIGlmICh0aGlzLmdldE1pbigpID49IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWluKCkgKiB0aGlzLmdldENoaWxkKDApLmdldE1pbkxlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICBjYXNlIEVNUFRZOgorICAgICAgICAgIGNhc2UgQU5DSE9SOgorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICBjYXNlIERPVDoKKyAgICAgICAgICBjYXNlIENIQVI6CisgICAgICAgICAgY2FzZSBSQU5HRToKKyAgICAgICAgICBjYXNlIE5SQU5HRToKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKKyAgICAgICAgICBjYXNlIFBBUkVOOgorICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmdldE1pbkxlbmd0aCgpOworCisgICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKioqKgorCisgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKKworICAgICAgICAgIGNhc2UgTE9PS0FIRUFEOgorICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQUhFQUQ6CisgICAgICAgICAgY2FzZSBMT09LQkVISU5EOgorICAgICAgICAgIGNhc2UgTkVHQVRJVkVMT09LQkVISU5EOgorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKiogUmVhbGx5PworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiNnZXRNaW5MZW5ndGgoKTogSW52YWxpZCBUeXBlOiAiK3RoaXMudHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBpbnQgZ2V0TWF4TGVuZ3RoKCkgeworICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgeworICAgICAgICAgIGNhc2UgQ09OQ0FUOgorICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLnNpemUoKTsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IHRoaXMuZ2V0Q2hpbGQoaSkuZ2V0TWF4TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGQgPCAwKSAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHN1bSArPSBkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1bTsKKworICAgICAgICAgIGNhc2UgQ09ORElUSU9OOgorICAgICAgICAgIGNhc2UgVU5JT046CisgICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGludCByZXQgPSB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7ICByZXQgPj0gMCAmJiBpIDwgdGhpcy5zaXplKCk7ICBpICsrKSB7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IHRoaXMuZ2V0Q2hpbGQoaSkuZ2V0TWF4TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKG1heCA8IDApIHsgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eQorICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYXggPiByZXQpICByZXQgPSBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgY2FzZSBDTE9TVVJFOgorICAgICAgICAgIGNhc2UgTk9OR1JFRURZQ0xPU1VSRToKKyAgICAgICAgICAgIGlmICh0aGlzLmdldE1heCgpID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMuY2hpbGQuZ2V0TWF4TGVuZ3RoKCkgPCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5zIG1pbnVzIHZhbHVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWF4KCkgKiB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgY2FzZSBFTVBUWToKKyAgICAgICAgICBjYXNlIEFOQ0hPUjoKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgY2FzZSBET1Q6CisgICAgICAgICAgY2FzZSBSQU5HRToKKyAgICAgICAgICBjYXNlIE5SQU5HRToKKyAgICAgICAgICAgIHJldHVybiAyOworCisgICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKKyAgICAgICAgICBjYXNlIFBBUkVOOgorICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmdldE1heExlbmd0aCgpOworCisgICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgorICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKioqKioqCisKKyAgICAgICAgICBjYXNlIFNUUklORzoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpOworCisgICAgICAgICAgY2FzZSBMT09LQUhFQUQ6CisgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKKyAgICAgICAgICBjYXNlIExPT0tCRUhJTkQ6CisgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6CisgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqKiBSZWFsbHk/CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRva2VuI2dldE1heExlbmd0aCgpOiBJbnZhbGlkIFR5cGU6ICIrdGhpcy50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfQ09OVElOVUUgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfVEVSTUlOQUwgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkNfQU5ZID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzU2V0KGludCBvcHRpb25zLCBpbnQgZmxhZykgeworICAgICAgICByZXR1cm4gKG9wdGlvbnMgJiBmbGFnKSA9PSBmbGFnOworICAgIH0KKyAgICBmaW5hbCBpbnQgYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKFJhbmdlVG9rZW4gcmVzdWx0LCBpbnQgb3B0aW9ucykgeworICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgeworICAgICAgICAgIGNhc2UgQ09OQ0FUOgorICAgICAgICAgICAgaW50IHJldCA9IEZDX0NPTlRJTlVFOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgdGhpcy5zaXplKCk7ICBpICsrKQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gdGhpcy5nZXRDaGlsZChpKS5hbmFseXplRmlyc3RDaGFyYWN0ZXIocmVzdWx0LCBvcHRpb25zKSkgIT0gRkNfQ09OVElOVUUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgIGNhc2UgVU5JT046CisgICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIGF8YnxjIC0+IEZDX1RFUk1JTkFMCisgICAgICAgICAgICAgKiAgYXwufGMgLT4gRkNfQU5ZCisgICAgICAgICAgICAgKiAgYXxifCAgLT4gRkNfQ09OVElOVUUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHJldDIgPSBGQ19DT05USU5VRTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzRW1wdHkgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgIHJldDIgPSB0aGlzLmdldENoaWxkKGkpLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChyZXQyID09IEZDX0FOWSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmV0MiA9PSBGQ19DT05USU5VRSkKKyAgICAgICAgICAgICAgICAgICAgaGFzRW1wdHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhhc0VtcHR5ID8gRkNfQ09OVElOVUUgOiByZXQyOworCisgICAgICAgICAgY2FzZSBDT05ESVRJT046CisgICAgICAgICAgICBpbnQgcmV0MyA9IHRoaXMuZ2V0Q2hpbGQoMCkuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKHJlc3VsdCwgb3B0aW9ucyk7CisgICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPT0gMSkgIHJldHVybiBGQ19DT05USU5VRTsKKyAgICAgICAgICAgIGlmIChyZXQzID09IEZDX0FOWSkgIHJldHVybiByZXQzOworICAgICAgICAgICAgaW50IHJldDQgPSB0aGlzLmdldENoaWxkKDEpLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOworICAgICAgICAgICAgaWYgKHJldDQgPT0gRkNfQU5ZKSAgcmV0dXJuIHJldDQ7CisgICAgICAgICAgICByZXR1cm4gcmV0MyA9PSBGQ19DT05USU5VRSB8fCByZXQ0ID09IEZDX0NPTlRJTlVFID8gRkNfQ09OVElOVUUgOiBGQ19URVJNSU5BTDsKKworICAgICAgICAgIGNhc2UgQ0xPU1VSRToKKyAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6CisgICAgICAgICAgICB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOworCisgICAgICAgICAgY2FzZSBFTVBUWToKKyAgICAgICAgICBjYXNlIEFOQ0hPUjoKKyAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKKworICAgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgICAgIGludCBjaCA9IHRoaXMuZ2V0Q2hhcigpOworICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoLCBjaCk7CisgICAgICAgICAgICBpZiAoY2ggPCAweDEwMDAwICYmIGlzU2V0KG9wdGlvbnMsIFJlZ3VsYXJFeHByZXNzaW9uLklHTk9SRV9DQVNFKSkgeworICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKWNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2gsIGNoKTsKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhciljaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKGNoLCBjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRkNfVEVSTUlOQUw7CisKKyAgICAgICAgICBjYXNlIERPVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqKioKKyAgICAgICAgICAgIGlmIChpc1NldChvcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5TSU5HTEVfTElORSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkNfQ09OVElOVUU7ICAgICAgICAgICAgIC8vICoqKiogV2UgY2FuIG5vdCBvcHRpbWl6ZS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZDX0NPTlRJTlVFOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKDAsIFJlZ3VsYXJFeHByZXNzaW9uLkxJTkVfRkVFRC0xKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoUmVndWxhckV4cHJlc3Npb24uTElORV9GRUVEKzEsIFJlZ3VsYXJFeHByZXNzaW9uLkNBUlJJQUdFX1JFVFVSTi0xKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoUmVndWxhckV4cHJlc3Npb24uQ0FSUklBR0VfUkVUVVJOKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uLkxJTkVfU0VQQVJBVE9SLTEpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShSZWd1bGFyRXhwcmVzc2lvbi5QQVJBR1JBUEhfU0VQQVJBVE9SKzEsIFVURjE2X01BWCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNhc2UgUkFOR0U6CisgICAgICAgICAgICBpZiAoaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKCgoUmFuZ2VUb2tlbil0aGlzKS5nZXRDYXNlSW5zZW5zaXRpdmVUb2tlbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOworCisgICAgICAgICAgY2FzZSBOUkFOR0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKioqCisgICAgICAgICAgICBpZiAoaXNTZXQob3B0aW9ucywgUmVndWxhckV4cHJlc3Npb24uSUdOT1JFX0NBU0UpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoKChSYW5nZVRva2VuKXRoaXMpLmdldENhc2VJbnNlbnNpdGl2ZVRva2VuKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1lcmdlUmFuZ2VzKFRva2VuLmNvbXBsZW1lbnRSYW5nZXModGhpcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZDX1RFUk1JTkFMOworCisgICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKKyAgICAgICAgICBjYXNlIFBBUkVOOgorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGQoMCkuYW5hbHl6ZUZpcnN0Q2hhcmFjdGVyKHJlc3VsdCwgb3B0aW9ucyk7CisKKyAgICAgICAgICBjYXNlIE1PRElGSUVSR1JPVVA6CisgICAgICAgICAgICBvcHRpb25zIHw9ICgoTW9kaWZpZXJUb2tlbil0aGlzKS5nZXRPcHRpb25zKCk7CisgICAgICAgICAgICBvcHRpb25zICY9IH4oKE1vZGlmaWVyVG9rZW4pdGhpcykuZ2V0T3B0aW9uc01hc2soKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENoaWxkKDApLmFuYWx5emVGaXJzdENoYXJhY3RlcihyZXN1bHQsIG9wdGlvbnMpOworCisgICAgICAgICAgY2FzZSBCQUNLUkVGRVJFTkNFOgorICAgICAgICAgICAgcmVzdWx0LmFkZFJhbmdlKDAsIFVURjE2X01BWCk7ICAvLyAqKioqIFdlIGNhbiBub3Qgb3B0aW1pemUuCisgICAgICAgICAgICByZXR1cm4gRkNfQU5ZOworCisgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICBpbnQgY2hhID0gdGhpcy5nZXRTdHJpbmcoKS5jaGFyQXQoMCk7CisgICAgICAgICAgICBpbnQgY2gyOworICAgICAgICAgICAgaWYgKFJFVXRpbC5pc0hpZ2hTdXJyb2dhdGUoY2hhKQorICAgICAgICAgICAgICAgICYmIHRoaXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCkgPj0gMgorICAgICAgICAgICAgICAgICYmIFJFVXRpbC5pc0xvd1N1cnJvZ2F0ZSgoY2gyID0gdGhpcy5nZXRTdHJpbmcoKS5jaGFyQXQoMSkpKSkKKyAgICAgICAgICAgICAgICBjaGEgPSBSRVV0aWwuY29tcG9zZUZyb21TdXJyb2dhdGVzKGNoYSwgY2gyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaGEsIGNoYSk7CisgICAgICAgICAgICBpZiAoY2hhIDwgMHgxMDAwMCAmJiBpc1NldChvcHRpb25zLCBSZWd1bGFyRXhwcmVzc2lvbi5JR05PUkVfQ0FTRSkpIHsKKyAgICAgICAgICAgICAgICBjaGEgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoKGNoYXIpY2hhKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkUmFuZ2UoY2hhLCBjaGEpOworICAgICAgICAgICAgICAgIGNoYSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhciljaGEpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRSYW5nZShjaGEsIGNoYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRkNfVEVSTUlOQUw7CisKKyAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKKyAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0FIRUFEOgorICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKKyAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0JFSElORDoKKyAgICAgICAgICAgIHJldHVybiBGQ19DT05USU5VRTsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jYW5hbHl6ZUhlYWRDaGFyYWN0ZXIoKTogSW52YWxpZCBUeXBlOiAiK3RoaXMudHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTaG9ydGVyVGhhbihUb2tlbiB0b2spIHsKKyAgICAgICAgaWYgKHRvayA9PSBudWxsKSAgcmV0dXJuIGZhbHNlOworICAgICAgICAvKgorICAgICAgICBpbnQgbXlsZW5ndGg7CisgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gU1RSSU5HKSAgbXlsZW5ndGggPSB0aGlzLmdldFN0cmluZygpLmxlbmd0aCgpOworICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT0gQ0hBUikgIG15bGVuZ3RoID0gdGhpcy5nZXRDaGFyKCkgPj0gMHgxMDAwMCA/IDIgOiAxOworICAgICAgICBlbHNlIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogSWxsZWdhbCB0eXBlOiAiK3RoaXMudHlwZSk7CisgICAgICAgIGludCBvdGhlcmxlbmd0aDsKKyAgICAgICAgaWYgKHRvay50eXBlID09IFNUUklORykgIG90aGVybGVuZ3RoID0gdG9rLmdldFN0cmluZygpLmxlbmd0aCgpOworICAgICAgICBlbHNlIGlmICh0b2sudHlwZSA9PSBDSEFSKSAgb3RoZXJsZW5ndGggPSB0b2suZ2V0Q2hhcigpID49IDB4MTAwMDAgPyAyIDogMTsKKyAgICAgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRXJyb3I6IElsbGVnYWwgdHlwZTogIit0b2sudHlwZSk7CisgICAgICAgICovCisgICAgICAgIGludCBteWxlbmd0aDsKKyAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBTVFJJTkcpICBteWxlbmd0aCA9IHRoaXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBJbGxlZ2FsIHR5cGU6ICIrdGhpcy50eXBlKTsKKyAgICAgICAgaW50IG90aGVybGVuZ3RoOworICAgICAgICBpZiAodG9rLnR5cGUgPT0gU1RSSU5HKSAgb3RoZXJsZW5ndGggPSB0b2suZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yOiBJbGxlZ2FsIHR5cGU6ICIrdG9rLnR5cGUpOworICAgICAgICByZXR1cm4gbXlsZW5ndGggPCBvdGhlcmxlbmd0aDsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRml4ZWRTdHJpbmdDb250YWluZXIgeworICAgICAgICBUb2tlbiB0b2tlbiA9IG51bGw7CisgICAgICAgIGludCBvcHRpb25zID0gMDsKKyAgICAgICAgRml4ZWRTdHJpbmdDb250YWluZXIoKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIGZpbmRGaXhlZFN0cmluZyhGaXhlZFN0cmluZ0NvbnRhaW5lciBjb250YWluZXIsIGludCBvcHRpb25zKSB7CisgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CisgICAgICAgICAgY2FzZSBDT05DQVQ6CisgICAgICAgICAgICBUb2tlbiBwcmV2VG9rZW4gPSBudWxsOworICAgICAgICAgICAgaW50IHByZXZPcHRpb25zID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRoaXMuc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGQoaSkuZmluZEZpeGVkU3RyaW5nKGNvbnRhaW5lciwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZUb2tlbiA9PSBudWxsIHx8IHByZXZUb2tlbi5pc1Nob3J0ZXJUaGFuKGNvbnRhaW5lci50b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldlRva2VuID0gY29udGFpbmVyLnRva2VuOworICAgICAgICAgICAgICAgICAgICBwcmV2T3B0aW9ucyA9IGNvbnRhaW5lci5vcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IHByZXZUb2tlbjsKKyAgICAgICAgICAgIGNvbnRhaW5lci5vcHRpb25zID0gcHJldk9wdGlvbnM7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIFVOSU9OOgorICAgICAgICAgIGNhc2UgQ0xPU1VSRToKKyAgICAgICAgICBjYXNlIE5PTkdSRUVEWUNMT1NVUkU6CisgICAgICAgICAgY2FzZSBFTVBUWToKKyAgICAgICAgICBjYXNlIEFOQ0hPUjoKKyAgICAgICAgICBjYXNlIFJBTkdFOgorICAgICAgICAgIGNhc2UgRE9UOgorICAgICAgICAgIGNhc2UgTlJBTkdFOgorICAgICAgICAgIGNhc2UgQkFDS1JFRkVSRU5DRToKKyAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKKyAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0FIRUFEOgorICAgICAgICAgIGNhc2UgTE9PS0JFSElORDoKKyAgICAgICAgICBjYXNlIE5FR0FUSVZFTE9PS0JFSElORDoKKyAgICAgICAgICBjYXNlIENPTkRJVElPTjoKKyAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIENIQVI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBDSEFSIHRva2Vucy4KKyAgICAgICAgICAgIGNvbnRhaW5lci50b2tlbiA9IG51bGw7ICAgICAgICAgICAgIC8vICoqCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqKgorCisgICAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICBjb250YWluZXIudG9rZW4gPSB0aGlzOworICAgICAgICAgICAgY29udGFpbmVyLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBJTkRFUEVOREVOVDoKKyAgICAgICAgICBjYXNlIFBBUkVOOgorICAgICAgICAgICAgdGhpcy5nZXRDaGlsZCgwKS5maW5kRml4ZWRTdHJpbmcoY29udGFpbmVyLCBvcHRpb25zKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGNhc2UgTU9ESUZJRVJHUk9VUDoKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gKChNb2RpZmllclRva2VuKXRoaXMpLmdldE9wdGlvbnMoKTsKKyAgICAgICAgICAgIG9wdGlvbnMgJj0gfigoTW9kaWZpZXJUb2tlbil0aGlzKS5nZXRPcHRpb25zTWFzaygpOworICAgICAgICAgICAgdGhpcy5nZXRDaGlsZCgwKS5maW5kRml4ZWRTdHJpbmcoY29udGFpbmVyLCBvcHRpb25zKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jZmluZEZpeGVkU3RyaW5nKCk6IEludmFsaWQgVHlwZTogIit0aGlzLnR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBtYXRjaChpbnQgY2gpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5GQUFycm93I21hdGNoKCk6IEludGVybmFsIGVycm9yOiAiK3RoaXMudHlwZSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGNhdGVnb3JpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlIGNhdGVnb3JpZXMyID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhdGVnb3J5TmFtZXMgPSB7CisgICAgICAgICJDbiIsICJMdSIsICJMbCIsICJMdCIsICJMbSIsICJMbyIsICJNbiIsICJNZSIsICJNYyIsICJOZCIsCisgICAgICAgICJObCIsICJObyIsICJacyIsICJabCIsICJacCIsICJDYyIsICJDZiIsIG51bGwsICJDbyIsICJDcyIsCisgICAgICAgICJQZCIsICJQcyIsICJQZSIsICJQYyIsICJQbyIsICJTbSIsICJTYyIsICJTayIsICJTbyIsIC8vIDI4CisgICAgICAgICJQaSIsICJQZiIsICAvLyAyOSwgMzAKKyAgICAgICAgIkwiLCAiTSIsICJOIiwgIloiLCAiQyIsICJQIiwgIlMiLCAgICAgIC8vIDMxLTM3CisgICAgfTsKKworICAgIC8vIFNjaGVtYSBSZWMuIHtEYXRhdHlwZXN9IC0gUHVuY3R1YXRpb24gCisgICAgc3RhdGljIGZpbmFsIGludCBDSEFSX0lOSVRfUVVPVEUgID0gMjk7ICAgICAvLyBQaSAtIGluaXRpYWwgcXVvdGUKKyAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfRklOQUxfUVVPVEUgPSAzMDsgICAgIC8vIFBmIC0gZmluYWwgcXVvdGUKKyAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfTEVUVEVSID0gMzE7CisgICAgc3RhdGljIGZpbmFsIGludCBDSEFSX01BUksgPSAzMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IENIQVJfTlVNQkVSID0gMzM7CisgICAgc3RhdGljIGZpbmFsIGludCBDSEFSX1NFUEFSQVRPUiA9IDM0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9PVEhFUiA9IDM1OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9QVU5DVFVBVElPTiA9IDM2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9TWU1CT0wgPSAzNzsKKyAgICAKKyAgICAvL2Jsb2NrTmFtZXMgaW4gVU5JQ09ERSAzLjEgdGhhdCBzdXBwb3J0ZWQgYnkgWE1MIFNjaGVtYSBSRUMgICAgICAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYmxvY2tOYW1lcyA9IHsKKyAgICAgICAgLyowMDAwLi4wMDdGOyovICJCYXNpYyBMYXRpbiIsCisgICAgICAgIC8qMDA4MC4uMDBGRjsqLyAiTGF0aW4tMSBTdXBwbGVtZW50IiwKKyAgICAgICAgLyowMTAwLi4wMTdGOyovICJMYXRpbiBFeHRlbmRlZC1BIiwKKyAgICAgICAgLyowMTgwLi4wMjRGOyovICJMYXRpbiBFeHRlbmRlZC1CIiwKKyAgICAgICAgLyowMjUwLi4wMkFGOyovICJJUEEgRXh0ZW5zaW9ucyIsCisgICAgICAgIC8qMDJCMC4uMDJGRjsqLyAiU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIiwKKyAgICAgICAgLyowMzAwLi4wMzZGOyovICJDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MiLAorICAgICAgICAvKjAzNzAuLjAzRkY7Ki8gIkdyZWVrIiwKKyAgICAgICAgLyowNDAwLi4wNEZGOyovICJDeXJpbGxpYyIsCisgICAgICAgIC8qMDUzMC4uMDU4RjsqLyAiQXJtZW5pYW4iLAorICAgICAgICAvKjA1OTAuLjA1RkY7Ki8gIkhlYnJldyIsCisgICAgICAgIC8qMDYwMC4uMDZGRjsqLyAiQXJhYmljIiwKKyAgICAgICAgLyowNzAwLi4wNzRGOyovICJTeXJpYWMiLCAgCisgICAgICAgIC8qMDc4MC4uMDdCRjsqLyAiVGhhYW5hIiwKKyAgICAgICAgLyowOTAwLi4wOTdGOyovICJEZXZhbmFnYXJpIiwKKyAgICAgICAgLyowOTgwLi4wOUZGOyovICJCZW5nYWxpIiwKKyAgICAgICAgLyowQTAwLi4wQTdGOyovICJHdXJtdWtoaSIsCisgICAgICAgIC8qMEE4MC4uMEFGRjsqLyAiR3VqYXJhdGkiLAorICAgICAgICAvKjBCMDAuLjBCN0Y7Ki8gIk9yaXlhIiwKKyAgICAgICAgLyowQjgwLi4wQkZGOyovICJUYW1pbCIsCisgICAgICAgIC8qMEMwMC4uMEM3RjsqLyAiVGVsdWd1IiwKKyAgICAgICAgLyowQzgwLi4wQ0ZGOyovICJLYW5uYWRhIiwKKyAgICAgICAgLyowRDAwLi4wRDdGOyovICJNYWxheWFsYW0iLAorICAgICAgICAvKjBEODAuLjBERkY7Ki8gIlNpbmhhbGEiLAorICAgICAgICAvKjBFMDAuLjBFN0Y7Ki8gIlRoYWkiLAorICAgICAgICAvKjBFODAuLjBFRkY7Ki8gIkxhbyIsCisgICAgICAgIC8qMEYwMC4uMEZGRjsqLyAiVGliZXRhbiIsCisgICAgICAgIC8qMTAwMC4uMTA5RjsqLyAiTXlhbm1hciIsIAorICAgICAgICAvKjEwQTAuLjEwRkY7Ki8gIkdlb3JnaWFuIiwKKyAgICAgICAgLyoxMTAwLi4xMUZGOyovICJIYW5ndWwgSmFtbyIsCisgICAgICAgIC8qMTIwMC4uMTM3RjsqLyAiRXRoaW9waWMiLAorICAgICAgICAvKjEzQTAuLjEzRkY7Ki8gIkNoZXJva2VlIiwKKyAgICAgICAgLyoxNDAwLi4xNjdGOyovICJVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIiwKKyAgICAgICAgLyoxNjgwLi4xNjlGOyovICJPZ2hhbSIsCisgICAgICAgIC8qMTZBMC4uMTZGRjsqLyAiUnVuaWMiLAorICAgICAgICAvKjE3ODAuLjE3RkY7Ki8gIktobWVyIiwKKyAgICAgICAgLyoxODAwLi4xOEFGOyovICJNb25nb2xpYW4iLAorICAgICAgICAvKjFFMDAuLjFFRkY7Ki8gIkxhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwiLAorICAgICAgICAvKjFGMDAuLjFGRkY7Ki8gIkdyZWVrIEV4dGVuZGVkIiwKKyAgICAgICAgLyoyMDAwLi4yMDZGOyovICJHZW5lcmFsIFB1bmN0dWF0aW9uIiwKKyAgICAgICAgLyoyMDcwLi4yMDlGOyovICJTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMiLAorICAgICAgICAvKjIwQTAuLjIwQ0Y7Ki8gIkN1cnJlbmN5IFN5bWJvbHMiLAorICAgICAgICAvKjIwRDAuLjIwRkY7Ki8gIkNvbWJpbmluZyBNYXJrcyBmb3IgU3ltYm9scyIsCisgICAgICAgIC8qMjEwMC4uMjE0RjsqLyAiTGV0dGVybGlrZSBTeW1ib2xzIiwKKyAgICAgICAgLyoyMTUwLi4yMThGOyovICJOdW1iZXIgRm9ybXMiLAorICAgICAgICAvKjIxOTAuLjIxRkY7Ki8gIkFycm93cyIsCisgICAgICAgIC8qMjIwMC4uMjJGRjsqLyAiTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyIsCisgICAgICAgIC8qMjMwMC4uMjNGRjsqLyAiTWlzY2VsbGFuZW91cyBUZWNobmljYWwiLAorICAgICAgICAvKjI0MDAuLjI0M0Y7Ki8gIkNvbnRyb2wgUGljdHVyZXMiLAorICAgICAgICAvKjI0NDAuLjI0NUY7Ki8gIk9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uIiwKKyAgICAgICAgLyoyNDYwLi4yNEZGOyovICJFbmNsb3NlZCBBbHBoYW51bWVyaWNzIiwKKyAgICAgICAgLyoyNTAwLi4yNTdGOyovICJCb3ggRHJhd2luZyIsCisgICAgICAgIC8qMjU4MC4uMjU5RjsqLyAiQmxvY2sgRWxlbWVudHMiLAorICAgICAgICAvKjI1QTAuLjI1RkY7Ki8gIkdlb21ldHJpYyBTaGFwZXMiLAorICAgICAgICAvKjI2MDAuLjI2RkY7Ki8gIk1pc2NlbGxhbmVvdXMgU3ltYm9scyIsCisgICAgICAgIC8qMjcwMC4uMjdCRjsqLyAiRGluZ2JhdHMiLAorICAgICAgICAvKjI4MDAuLjI4RkY7Ki8gIkJyYWlsbGUgUGF0dGVybnMiLAorICAgICAgICAvKjJFODAuLjJFRkY7Ki8gIkNKSyBSYWRpY2FscyBTdXBwbGVtZW50IiwKKyAgICAgICAgLyoyRjAwLi4yRkRGOyovICJLYW5neGkgUmFkaWNhbHMiLAorICAgICAgICAvKjJGRjAuLjJGRkY7Ki8gIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMiLAorICAgICAgICAvKjMwMDAuLjMwM0Y7Ki8gIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiIsCisgICAgICAgIC8qMzA0MC4uMzA5RjsqLyAiSGlyYWdhbmEiLAorICAgICAgICAvKjMwQTAuLjMwRkY7Ki8gIkthdGFrYW5hIiwKKyAgICAgICAgLyozMTAwLi4zMTJGOyovICJCb3BvbW9mbyIsCisgICAgICAgIC8qMzEzMC4uMzE4RjsqLyAiSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyIsCisgICAgICAgIC8qMzE5MC4uMzE5RjsqLyAiS2FuYnVuIiwKKyAgICAgICAgLyozMUEwLi4zMUJGOyovICJCb3BvbW9mbyBFeHRlbmRlZCIsCisgICAgICAgIC8qMzIwMC4uMzJGRjsqLyAiRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyIsCisgICAgICAgIC8qMzMwMC4uMzNGRjsqLyAiQ0pLIENvbXBhdGliaWxpdHkiLAorICAgICAgICAvKjM0MDAuLjREQjU7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEiLAorICAgICAgICAvKjRFMDAuLjlGRkY7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMiLAorICAgICAgICAvKkEwMDAuLkE0OEY7Ki8gIllpIFN5bGxhYmxlcyIsCisgICAgICAgIC8qQTQ5MC4uQTRDRjsqLyAiWWkgUmFkaWNhbHMiLAorICAgICAgICAvKkFDMDAuLkQ3QTM7Ki8gIkhhbmd1bCBTeWxsYWJsZXMiLAorICAgICAgICAvKkQ4MDAuLkRCN0Y7Ki8gIkhpZ2ggU3Vycm9nYXRlcyIsCisgICAgICAgIC8qREI4MC4uREJGRjsqLyAiSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzIiwKKyAgICAgICAgLypEQzAwLi5ERkZGOyovICJMb3cgU3Vycm9nYXRlcyIsCisgICAgICAgIC8qRTAwMC4uRjhGRjsqLyAiUHJpdmF0ZSBVc2UiLAorICAgICAgICAvKkY5MDAuLkZBRkY7Ki8gIkNKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMiLAorICAgICAgICAvKkZCMDAuLkZCNEY7Ki8gIkFscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zIiwKKyAgICAgICAgLypGQjUwLi5GREZGOyovICJBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUEiLAorICAgICAgICAvKkZFMjAuLkZFMkY7Ki8gIkNvbWJpbmluZyBIYWxmIE1hcmtzIiwKKyAgICAgICAgLypGRTMwLi5GRTRGOyovICJDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyIsCisgICAgICAgIC8qRkU1MC4uRkU2RjsqLyAiU21hbGwgRm9ybSBWYXJpYW50cyIsCisgICAgICAgIC8qRkU3MC4uRkVGRTsqLyAiQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CIiwKKyAgICAgICAgLypGRUZGLi5GRUZGOyovICJTcGVjaWFscyIsCisgICAgICAgIC8qRkYwMC4uRkZFRjsqLyAiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMiLAorICAgICAgICAgLy9taXNzaW5nIFNwZWNpYWxzIGFkZCBtYW51YWxseQorICAgICAgICAvKjEwMzAwLi4xMDMyRjsqLyAiT2xkIEl0YWxpYyIsCQkvLyA4NworICAgICAgICAvKjEwMzMwLi4xMDM0RjsqLyAiR290aGljIiwKKyAgICAgICAgLyoxMDQwMC4uMTA0NEY7Ki8gIkRlc2VyZXQiLAorICAgICAgICAvKjFEMDAwLi4xRDBGRjsqLyAiQnl6YW50aW5lIE11c2ljYWwgU3ltYm9scyIsCisgICAgICAgIC8qMUQxMDAuLjFEMUZGOyovICJNdXNpY2FsIFN5bWJvbHMiLAorICAgICAgICAvKjFENDAwLi4xRDdGRjsqLyAiTWF0aGVtYXRpY2FsIEFscGhhbnVtZXJpYyBTeW1ib2xzIiwKKyAgICAgICAgLyoyMDAwMC4uMkE2RDY7Ki8gIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIiLAorICAgICAgICAvKjJGODAwLi4yRkExRjsqLyAiQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50IiwKKyAgICAgICAgLypFMDAwMC4uRTAwN0Y7Ki8gIlRhZ3MiLAorICAgICAgICAvL21pc3NpbmcgMiBwcml2YXRlIHVzZSBhZGQgbWFudWFsbHkKKworICAgIH07CisgICAgLy9BREQgVEhPU0UgTUFOVUFMTFkKKyAgICAvL0YwMDAwLi5GRkZGRDsgIlByaXZhdGUgVXNlIiwKKyAgICAvLzEwMDAwMC4uMTBGRkZEOyAiUHJpdmF0ZSBVc2UiCisgICAgLy9GRkYwLi5GRkZEOyAiU3BlY2lhbHMiLCAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGJsb2NrUmFuZ2VzID0gCisgICAgICAgIlx1MDAwMFx1MDA3Rlx1MDA4MFx1MDBGRlx1MDEwMFx1MDE3Rlx1MDE4MFx1MDI0Rlx1MDI1MFx1MDJBRlx1MDJCMFx1MDJGRlx1MDMwMFx1MDM2RiIKKyAgICAgICAgKyJcdTAzNzBcdTAzRkZcdTA0MDBcdTA0RkZcdTA1MzBcdTA1OEZcdTA1OTBcdTA1RkZcdTA2MDBcdTA2RkZcdTA3MDBcdTA3NEZcdTA3ODBcdTA3QkYiCisgICAgICAgICsiXHUwOTAwXHUwOTdGXHUwOTgwXHUwOUZGXHUwQTAwXHUwQTdGXHUwQTgwXHUwQUZGXHUwQjAwXHUwQjdGXHUwQjgwXHUwQkZGXHUwQzAwXHUwQzdGXHUwQzgwXHUwQ0ZGIgorICAgICAgICArIlx1MEQwMFx1MEQ3Rlx1MEQ4MFx1MERGRlx1MEUwMFx1MEU3Rlx1MEU4MFx1MEVGRlx1MEYwMFx1MEZGRlx1MTAwMFx1MTA5Rlx1MTBBMFx1MTBGRlx1MTEwMFx1MTFGRiIKKyAgICAgICAgKyJcdTEyMDBcdTEzN0ZcdTEzQTBcdTEzRkZcdTE0MDBcdTE2N0ZcdTE2ODBcdTE2OUZcdTE2QTBcdTE2RkZcdTE3ODBcdTE3RkZcdTE4MDBcdTE4QUZcdTFFMDBcdTFFRkYiCisgICAgICAgICsiXHUxRjAwXHUxRkZGXHUyMDAwXHUyMDZGXHUyMDcwXHUyMDlGXHUyMEEwXHUyMENGXHUyMEQwXHUyMEZGXHUyMTAwXHUyMTRGXHUyMTUwXHUyMThGXHUyMTkwXHUyMUZGXHUyMjAwXHUyMkZGIgorICAgICAgICArIlx1MjMwMFx1MjNGRlx1MjQwMFx1MjQzRlx1MjQ0MFx1MjQ1Rlx1MjQ2MFx1MjRGRlx1MjUwMFx1MjU3Rlx1MjU4MFx1MjU5Rlx1MjVBMFx1MjVGRlx1MjYwMFx1MjZGRlx1MjcwMFx1MjdCRiIKKyAgICAgICAgKyJcdTI4MDBcdTI4RkZcdTJFODBcdTJFRkZcdTJGMDBcdTJGREZcdTJGRjBcdTJGRkZcdTMwMDBcdTMwM0ZcdTMwNDBcdTMwOUZcdTMwQTBcdTMwRkZcdTMxMDBcdTMxMkZcdTMxMzBcdTMxOEYiCisgICAgICAgICsiXHUzMTkwXHUzMTlGXHUzMUEwXHUzMUJGXHUzMjAwXHUzMkZGXHUzMzAwXHUzM0ZGXHUzNDAwXHU0REI1XHU0RTAwXHU5RkZGXHVBMDAwXHVBNDhGXHVBNDkwXHVBNENGIgorICAgICAgICArIlx1QUMwMFx1RDdBM1x1RDgwMFx1REI3Rlx1REI4MFx1REJGRlx1REMwMFx1REZGRlx1RTAwMFx1RjhGRlx1RjkwMFx1RkFGRlx1RkIwMFx1RkI0Rlx1RkI1MFx1RkRGRiIKKyAgICAgICAgKyJcdUZFMjBcdUZFMkZcdUZFMzBcdUZFNEZcdUZFNTBcdUZFNkZcdUZFNzBcdUZFRkVcdUZFRkZcdUZFRkZcdUZGMDBcdUZGRUYiOworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBub25CTVBCbG9ja1JhbmdlcyA9IHsKKyAgICAgICAgMHgxMDMwMCwgMHgxMDMyRiwgICAgICAgLy8gODcKKyAgICAgICAgMHgxMDMzMCwgMHgxMDM0RiwKKyAgICAgICAgMHgxMDQwMCwgMHgxMDQ0RiwKKyAgICAgICAgMHgxRDAwMCwgMHgxRDBGRiwKKyAgICAgICAgMHgxRDEwMCwgMHgxRDFGRiwKKyAgICAgICAgMHgxRDQwMCwgMHgxRDdGRiwKKyAgICAgICAgMHgyMDAwMCwgMHgyQTZENiwKKyAgICAgICAgMHgyRjgwMCwgMHgyRkExRiwKKyAgICAgICAgMHhFMDAwMCwgMHhFMDA3RgorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkJNUF9CTE9DS19TVEFSVCA9IDg3OworCisgICAgc3RhdGljIHByb3RlY3RlZCBSYW5nZVRva2VuIGdldFJhbmdlKFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlKSB7CisgICAgICAgIGlmIChUb2tlbi5jYXRlZ29yaWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRva2VuLmNhdGVnb3JpZXMpIHsKKyAgICAgICAgICAgICAgICBUb2tlbltdIHJhbmdlcyA9IG5ldyBUb2tlbltUb2tlbi5jYXRlZ29yeU5hbWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgcmFuZ2VzLmxlbmd0aDsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW2ldID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHR5cGU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgMHgxMDAwMDsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENoYXJhY3Rlci5nZXRUeXBlKChjaGFyKWkpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBDaGFyYWN0ZXIuU1RBUlRfUFVOQ1RVQVRJT04gfHwgCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENoYXJhY3Rlci5FTkRfUFVOQ1RVQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYnVpbGQgdGFibGUgb2YgUGkgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAweDAwQUIgfHwgaSA9PSAweDIwMTggfHwgaSA9PSAweDIwMUIgfHwgaSA9PSAweDIwMUMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09IDB4MjAxRiB8fCBpID09IDB4MjAzOSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0lOSVRfUVVPVEU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvL2J1aWxkIHRhYmxlIG9mIFBmIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMHgwMEJCIHx8IGkgPT0gMHgyMDE5IHx8IGkgPT0gMHgyMDFEIHx8IGkgPT0gMHgyMDNBICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0ZJTkFMX1FVT1RFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJhbmdlc1t0eXBlXS5hZGRSYW5nZShpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuVVBQRVJDQVNFX0xFVFRFUjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MT1dFUkNBU0VfTEVUVEVSOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlRJVExFQ0FTRV9MRVRURVI6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuTU9ESUZJRVJfTEVUVEVSOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX0xFVFRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX0xFVFRFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk5PTl9TUEFDSU5HX01BUks6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09NQklOSU5HX1NQQUNJTkdfTUFSSzoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5FTkNMT1NJTkdfTUFSSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX01BUks7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ERUNJTUFMX0RJR0lUX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MRVRURVJfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk9USEVSX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSEFSX05VTUJFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlNQQUNFX1NFUEFSQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5MSU5FX1NFUEFSQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5QQVJBR1JBUEhfU0VQQVJBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfU0VQQVJBVE9SOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuQ09OVFJPTDoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5GT1JNQVQ6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuU1VSUk9HQVRFOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlBSSVZBVEVfVVNFOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlVOQVNTSUdORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9PVEhFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNPTk5FQ1RPUl9QVU5DVFVBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5EQVNIX1BVTkNUVUFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLlNUQVJUX1BVTkNUVUFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkVORF9QVU5DVFVBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVJfSU5JVF9RVU9URToKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIQVJfRklOQUxfUVVPVEU6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfUFVOQ1RVQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hBUl9QVU5DVFVBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLk1BVEhfU1lNQk9MOgorICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkNVUlJFTkNZX1NZTUJPTDoKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5NT0RJRklFUl9TWU1CT0w6CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuT1RIRVJfU1lNQk9MOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENIQVJfU1lNQk9MOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5yZWdleC5Ub2tlbiNnZXRSYW5nZSgpOiBVbmtub3duIFVuaWNvZGUgY2F0ZWdvcnk6ICIrdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VzW3R5cGVdLmFkZFJhbmdlKGksIGkpOworICAgICAgICAgICAgICAgIH0gLy8gZm9yIGFsbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgcmFuZ2VzW0NoYXJhY3Rlci5VTkFTU0lHTkVEXS5hZGRSYW5nZSgweDEwMDAwLCBUb2tlbi5VVEYxNl9NQVgpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgcmFuZ2VzLmxlbmd0aDsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRva2VuLmNhdGVnb3J5TmFtZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gQ2hhcmFjdGVyLlVOQVNTSUdORUQpIHsgLy8gVW5hc3NpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXS5hZGRSYW5nZSgweDEwMDAwLCBUb2tlbi5VVEYxNl9NQVgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoVG9rZW4uY2F0ZWdvcnlOYW1lc1tpXSwgcmFuZ2VzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dChUb2tlbi5jYXRlZ29yeU5hbWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMocmFuZ2VzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9SRVZJU0lUOiBkbyB3ZSByZWFsbHkgbmVlZCB0byBzdXBwb3J0IGJsb2NrIG5hbWVzIGFzIGluIFVuaWNvZGUgMy4xCisgICAgICAgICAgICAgICAgLy8gICAgICAgICBvciB3ZSBjYW4ganVzdCBjcmVhdGUgYWxsIHRoZSBuYW1lcyBpbiBJc0JMT0NLTkFNRSBmb3JtYXQgKFhNTCBTY2hlbWEgUkVDKT8KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDUwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCBUb2tlbi5ibG9ja05hbWVzLmxlbmd0aDsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gcjEgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgTk9OQk1QX0JMT0NLX1NUQVJUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGkqMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByc3RhcnQgPSBUb2tlbi5ibG9ja1Jhbmdlcy5jaGFyQXQobG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbmQgPSBUb2tlbi5ibG9ja1Jhbmdlcy5jaGFyQXQobG9jYXRpb24rMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0RFQlVHSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihuKyIgIiArSW50ZWdlci50b0hleFN0cmluZyhyc3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICsiLSIrIEludGVnZXIudG9IZXhTdHJpbmcocmVuZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEuYWRkUmFuZ2UocnN0YXJ0LCByZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gKGkgLSBOT05CTVBfQkxPQ0tfU1RBUlQpICogMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKFRva2VuLm5vbkJNUEJsb2NrUmFuZ2VzW2xvY2F0aW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLm5vbkJNUEJsb2NrUmFuZ2VzW2xvY2F0aW9uICsgMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gVG9rZW4uYmxvY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uZXF1YWxzKCJTcGVjaWFscyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcjEuYWRkUmFuZ2UoMHhmZmYwLCAweGZmZmQpOworICAgICAgICAgICAgICAgICAgICBpZiAobi5lcXVhbHMoIlByaXZhdGUgVXNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxLmFkZFJhbmdlKDB4RjAwMDAsMHhGRkZGRCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMS5hZGRSYW5nZSgweDEwMDAwMCwweDEwRkZGRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQobiwgcjEpOworICAgICAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQobiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhyMSkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJJcyIpOworICAgICAgICAgICAgICAgICAgICBpZiAobi5pbmRleE9mKCcgJykgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY2kgPSAwOyAgY2kgPCBuLmxlbmd0aCgpOyAgY2kgKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uY2hhckF0KGNpKSAhPSAnICcpICBidWZmZXIuYXBwZW5kKChjaGFyKW4uY2hhckF0KGNpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKGJ1ZmZlci50b1N0cmluZygpLCBuLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUUiMxOCAxLjIKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiQVNTSUdORUQiLCAiQ24iLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIlVOQVNTSUdORUQiLCAiQ24iLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBUb2tlbiBhbGwgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgICAgIGFsbC5hZGRSYW5nZSgwLCBUb2tlbi5VVEYxNl9NQVgpOworICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJBTEwiLCBhbGwpOworICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dCgiQUxMIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhhbGwpKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJBU1NJR05FRCIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIlVOQVNTSUdORUQiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJBTEwiKTsKKworICAgICAgICAgICAgICAgIFRva2VuIGlzYWxwaGEgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgICAgIGlzYWxwaGEubWVyZ2VSYW5nZXMocmFuZ2VzW0NoYXJhY3Rlci5VUFBFUkNBU0VfTEVUVEVSXSk7IC8vIEx1CisgICAgICAgICAgICAgICAgaXNhbHBoYS5tZXJnZVJhbmdlcyhyYW5nZXNbQ2hhcmFjdGVyLkxPV0VSQ0FTRV9MRVRURVJdKTsgLy8gTGwKKyAgICAgICAgICAgICAgICBpc2FscGhhLm1lcmdlUmFuZ2VzKHJhbmdlc1tDaGFyYWN0ZXIuT1RIRVJfTEVUVEVSXSk7IC8vIExvCisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzQWxwaGEiLCBpc2FscGhhKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzQWxwaGEiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzYWxwaGEpKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0FscGhhIik7CisKKyAgICAgICAgICAgICAgICBUb2tlbiBpc2FsbnVtID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBpc2FsbnVtLm1lcmdlUmFuZ2VzKGlzYWxwaGEpOyAgIC8vIEx1IExsIExvCisgICAgICAgICAgICAgICAgaXNhbG51bS5tZXJnZVJhbmdlcyhyYW5nZXNbQ2hhcmFjdGVyLkRFQ0lNQUxfRElHSVRfTlVNQkVSXSk7IC8vIE5kCisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzQWxudW0iLCBpc2FsbnVtKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzQWxudW0iLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzYWxudW0pKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0FsbnVtIik7CisKKyAgICAgICAgICAgICAgICBUb2tlbiBpc3NwYWNlID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBpc3NwYWNlLm1lcmdlUmFuZ2VzKFRva2VuLnRva2VuX3NwYWNlcyk7CisgICAgICAgICAgICAgICAgaXNzcGFjZS5tZXJnZVJhbmdlcyhyYW5nZXNbQ0hBUl9TRVBBUkFUT1JdKTsgLy8gWgorICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc1NwYWNlIiwgaXNzcGFjZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc1NwYWNlIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc3NwYWNlKSk7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNTcGFjZSIpOworCisgICAgICAgICAgICAgICAgVG9rZW4gaXN3b3JkID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBpc3dvcmQubWVyZ2VSYW5nZXMoaXNhbG51bSk7ICAgICAvLyBMdSBMbCBMbyBOZAorICAgICAgICAgICAgICAgIGlzd29yZC5hZGRSYW5nZSgnXycsICdfJyk7CisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQoIklzV29yZCIsIGlzd29yZCk7CisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc1dvcmQiLCBUb2tlbi5jb21wbGVtZW50UmFuZ2VzKGlzd29yZCkpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzV29yZCIpOworCisgICAgICAgICAgICAgICAgVG9rZW4gaXNhc2NpaSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgICAgICAgICAgaXNhc2NpaS5hZGRSYW5nZSgwLCAxMjcpOworICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0FTQ0lJIiwgaXNhc2NpaSk7CisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0FTQ0lJIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc2FzY2lpKSk7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNBU0NJSSIpOworCisgICAgICAgICAgICAgICAgVG9rZW4gaXNub3RncmFwaCA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgICAgICAgICAgaXNub3RncmFwaC5tZXJnZVJhbmdlcyhyYW5nZXNbQ0hBUl9PVEhFUl0pOworICAgICAgICAgICAgICAgIGlzbm90Z3JhcGguYWRkUmFuZ2UoJyAnLCAnICcpOworICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc0dyYXBoIiwgVG9rZW4uY29tcGxlbWVudFJhbmdlcyhpc25vdGdyYXBoKSk7CisgICAgICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KCJJc0dyYXBoIiwgaXNub3RncmFwaCk7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNHcmFwaCIpOworCisgICAgICAgICAgICAgICAgVG9rZW4gaXN4ZGlnaXQgPSBUb2tlbi5jcmVhdGVSYW5nZSgpOworICAgICAgICAgICAgICAgIGlzeGRpZ2l0LmFkZFJhbmdlKCcwJywgJzknKTsKKyAgICAgICAgICAgICAgICBpc3hkaWdpdC5hZGRSYW5nZSgnQScsICdGJyk7CisgICAgICAgICAgICAgICAgaXN4ZGlnaXQuYWRkUmFuZ2UoJ2EnLCAnZicpOworICAgICAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMucHV0KCJJc1hEaWdpdCIsIFRva2VuLmNvbXBsZW1lbnRSYW5nZXMoaXN4ZGlnaXQpKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzMi5wdXQoIklzWERpZ2l0IiwgaXN4ZGlnaXQpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzWERpZ2l0Iik7CisKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNEaWdpdCIsICJOZCIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJJc1VwcGVyIiwgIkx1IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzTG93ZXIiLCAiTGwiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNDbnRybCIsICJDIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIklzUHJpbnQiLCAiQyIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiSXNQdW5jdCIsICJQIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNEaWdpdCIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzVXBwZXIiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc0xvd2VyIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiSXNDbnRybCIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoIklzUHJpbnQiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJJc1B1bmN0Iik7CisKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiYWxwaGEiLCAiSXNBbHBoYSIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJhbG51bSIsICJJc0FsbnVtIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImFzY2lpIiwgIklzQVNDSUkiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygiY250cmwiLCAiSXNDbnRybCIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJkaWdpdCIsICJJc0RpZ2l0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoImdyYXBoIiwgIklzR3JhcGgiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygibG93ZXIiLCAiSXNMb3dlciIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJwcmludCIsICJJc1ByaW50IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoInB1bmN0IiwgIklzUHVuY3QiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5zZXRBbGlhcygic3BhY2UiLCAiSXNTcGFjZSIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnNldEFsaWFzKCJ1cHBlciIsICJJc1VwcGVyIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoIndvcmQiLCAiSXNXb3JkIiwgdHJ1ZSk7IC8vIFBlcmwgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgVG9rZW4uc2V0QWxpYXMoInhkaWdpdCIsICJJc1hEaWdpdCIsIHRydWUpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImFscGhhIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiYWxudW0iKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJhc2NpaSIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImNudHJsIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygiZGlnaXQiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJncmFwaCIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoImxvd2VyIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygicHJpbnQiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJwdW5jdCIpOworICAgICAgICAgICAgICAgIFRva2VuLnJlZ2lzdGVyTm9uWFMoInNwYWNlIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygidXBwZXIiKTsKKyAgICAgICAgICAgICAgICBUb2tlbi5yZWdpc3Rlck5vblhTKCJ3b3JkIik7CisgICAgICAgICAgICAgICAgVG9rZW4ucmVnaXN0ZXJOb25YUygieGRpZ2l0Iik7CisgICAgICAgICAgICB9IC8vIHN5bmNocm9uaXplZAorICAgICAgICB9IC8vIGlmIG51bGwKKyAgICAgICAgUmFuZ2VUb2tlbiB0b2sgPSBwb3NpdGl2ZSA/IChSYW5nZVRva2VuKVRva2VuLmNhdGVnb3JpZXMuZ2V0KG5hbWUpCisgICAgICAgICAgICA6IChSYW5nZVRva2VuKVRva2VuLmNhdGVnb3JpZXMyLmdldChuYW1lKTsKKyAgICAgICAgLy9pZiAodG9rID09IG51bGwpIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHRvazsKKyAgICB9CisgICAgc3RhdGljIHByb3RlY3RlZCBSYW5nZVRva2VuIGdldFJhbmdlKFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlLCBib29sZWFuIHhzKSB7CisgICAgICAgIFJhbmdlVG9rZW4gcmFuZ2UgPSBUb2tlbi5nZXRSYW5nZShuYW1lLCBwb3NpdGl2ZSk7CisgICAgICAgIGlmICh4cyAmJiByYW5nZSAhPSBudWxsICYmIFRva2VuLmlzUmVnaXN0ZXJOb25YUyhuYW1lKSkKKyAgICAgICAgICAgIHJhbmdlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJhbmdlOworICAgIH0KKworICAgIHN0YXRpYyBIYXNodGFibGUgbm9ueHMgPSBudWxsOworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBvbmx5IGdldFJhbmdlKCkuCisgICAgICogU28gdGhpcyBtZXRob2QgbmVlZCBub3QgTVQtc2FmZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJOb25YUyhTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoVG9rZW4ubm9ueHMgPT0gbnVsbCkKKyAgICAgICAgICAgIFRva2VuLm5vbnhzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBUb2tlbi5ub254cy5wdXQobmFtZSwgbmFtZSk7CisgICAgfQorICAgIHN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlZ2lzdGVyTm9uWFMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFRva2VuLm5vbnhzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vREVCVUcKKyAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oImlzUmVnaXN0ZXJOb25YUzogIituYW1lKTsKKyAgICAgICAgcmV0dXJuIFRva2VuLm5vbnhzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld05hbWUsIFN0cmluZyBuYW1lLCBib29sZWFuIHBvc2l0aXZlKSB7CisgICAgICAgIFRva2VuIHQxID0gKFRva2VuKVRva2VuLmNhdGVnb3JpZXMuZ2V0KG5hbWUpOworICAgICAgICBUb2tlbiB0MiA9IChUb2tlbilUb2tlbi5jYXRlZ29yaWVzMi5nZXQobmFtZSk7CisgICAgICAgIGlmIChwb3NpdGl2ZSkgeworICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllcy5wdXQobmV3TmFtZSwgdDEpOworICAgICAgICAgICAgVG9rZW4uY2F0ZWdvcmllczIucHV0KG5ld05hbWUsIHQyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRva2VuLmNhdGVnb3JpZXMyLnB1dChuZXdOYW1lLCB0MSk7CisgICAgICAgICAgICBUb2tlbi5jYXRlZ29yaWVzLnB1dChuZXdOYW1lLCB0Mik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmlyYW1hU3RyaW5nID0KKyAgICAiXHUwOTREIi8vIDtERVZBTkFHQVJJIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OworICAgICsiXHUwOUNEIi8vO0JFTkdBTEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBBNEQiLy87R1VSTVVLSEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBBQ0QiLy87R1VKQVJBVEkgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBCNEQiLy87T1JJWUEgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBCQ0QiLy87VEFNSUwgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBDNEQiLy87VEVMVUdVIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OworICAgICsiXHUwQ0NEIi8vO0tBTk5BREEgU0lHTiBWSVJBTUE7TW47OTtPTjs7Ozs7Tjs7Ozs7CisgICAgKyJcdTBENEQiLy87TUFMQVlBTEFNIFNJR04gVklSQU1BO01uOzk7T047Ozs7O047Ozs7OworICAgICsiXHUwRTNBIi8vO1RIQUkgQ0hBUkFDVEVSIFBISU5USFU7TW47OTtPTjs7Ozs7TjtUSEFJIFZPV0VMIFNJR04gUEhJTlRIVTs7OzsKKyAgICArIlx1MEY4NCI7Ly87VElCRVRBTiBNQVJLIEhBTEFOVEE7TW47OTtPTjs7Ozs7TjtUSUJFVEFOIFZJUkFNQTs7OzsKKworICAgIHN0YXRpYyBwcml2YXRlIFRva2VuIHRva2VuX2dyYXBoZW1lID0gbnVsbDsKKyAgICBzdGF0aWMgc3luY2hyb25pemVkIFRva2VuIGdldEdyYXBoZW1lUGF0dGVybigpIHsKKyAgICAgICAgaWYgKFRva2VuLnRva2VuX2dyYXBoZW1lICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZ3JhcGhlbWU7CisKKyAgICAgICAgVG9rZW4gYmFzZV9jaGFyID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsgIC8vIFt7QVNTSUdORUR9XS1be019LHtDfV0KKyAgICAgICAgYmFzZV9jaGFyLm1lcmdlUmFuZ2VzKFRva2VuLmdldFJhbmdlKCJBU1NJR05FRCIsIHRydWUpKTsKKyAgICAgICAgYmFzZV9jaGFyLnN1YnRyYWN0UmFuZ2VzKFRva2VuLmdldFJhbmdlKCJNIiwgdHJ1ZSkpOworICAgICAgICBiYXNlX2NoYXIuc3VidHJhY3RSYW5nZXMoVG9rZW4uZ2V0UmFuZ2UoIkMiLCB0cnVlKSk7CisKKyAgICAgICAgVG9rZW4gdmlyYW1hID0gVG9rZW4uY3JlYXRlUmFuZ2UoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7ICBpIDwgVG9rZW4udmlyYW1hU3RyaW5nLmxlbmd0aCgpOyAgaSArKykgeworICAgICAgICAgICAgaW50IGNoID0gdmlyYW1hU3RyaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgIHZpcmFtYS5hZGRSYW5nZShpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRva2VuIGNvbWJpbmVyX3dvX3ZpcmFtYSA9IFRva2VuLmNyZWF0ZVJhbmdlKCk7CisgICAgICAgIGNvbWJpbmVyX3dvX3ZpcmFtYS5tZXJnZVJhbmdlcyhUb2tlbi5nZXRSYW5nZSgiTSIsIHRydWUpKTsKKyAgICAgICAgY29tYmluZXJfd29fdmlyYW1hLmFkZFJhbmdlKDB4MTE2MCwgMHgxMWZmKTsgLy8gaGFuZ3VsX21lZGlhbCBhbmQgaGFuZ3VsX2ZpbmFsCisgICAgICAgIGNvbWJpbmVyX3dvX3ZpcmFtYS5hZGRSYW5nZSgweGZmOWUsIDB4ZmY5Zik7IC8vIGV4dHJhcworCisgICAgICAgIFRva2VuIGxlZnQgPSBUb2tlbi5jcmVhdGVVbmlvbigpOyAgICAgICAvLyBiYXNlX2NoYXI/CisgICAgICAgIGxlZnQuYWRkQ2hpbGQoYmFzZV9jaGFyKTsKKyAgICAgICAgbGVmdC5hZGRDaGlsZChUb2tlbi50b2tlbl9lbXB0eSk7CisKKyAgICAgICAgVG9rZW4gZm9vID0gVG9rZW4uY3JlYXRlVW5pb24oKTsKKyAgICAgICAgZm9vLmFkZENoaWxkKFRva2VuLmNyZWF0ZUNvbmNhdCh2aXJhbWEsIFRva2VuLmdldFJhbmdlKCJMIiwgdHJ1ZSkpKTsKKyAgICAgICAgZm9vLmFkZENoaWxkKGNvbWJpbmVyX3dvX3ZpcmFtYSk7CisKKyAgICAgICAgZm9vID0gVG9rZW4uY3JlYXRlQ2xvc3VyZShmb28pOworCisgICAgICAgIGZvbyA9IFRva2VuLmNyZWF0ZUNvbmNhdChsZWZ0LCBmb28pOworCisgICAgICAgIFRva2VuLnRva2VuX2dyYXBoZW1lID0gZm9vOworICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fZ3JhcGhlbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZyBDaGFyYWN0ZXIgU2VxdWVuY2UgaW4gUGVybCA1LjYuCisgICAgICovCisgICAgc3RhdGljIHByaXZhdGUgVG9rZW4gdG9rZW5fY2NzID0gbnVsbDsKKyAgICBzdGF0aWMgc3luY2hyb25pemVkIFRva2VuIGdldENvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlKCkgeworICAgICAgICBpZiAoVG9rZW4udG9rZW5fY2NzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gVG9rZW4udG9rZW5fY2NzOworCisgICAgICAgIFRva2VuIGZvbyA9IFRva2VuLmNyZWF0ZUNsb3N1cmUoVG9rZW4uZ2V0UmFuZ2UoIk0iLCB0cnVlKSk7IC8vIFxwTSoKKyAgICAgICAgZm9vID0gVG9rZW4uY3JlYXRlQ29uY2F0KFRva2VuLmdldFJhbmdlKCJNIiwgZmFsc2UpLCBmb28pOyAvLyBcUE0gKyBccE0qCisgICAgICAgIFRva2VuLnRva2VuX2NjcyA9IGZvbzsKKyAgICAgICAgcmV0dXJuIFRva2VuLnRva2VuX2NjczsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU3RyaW5nVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgU3RyaW5nIHN0cmluZzsKKyAgICAgICAgaW50IHJlZk51bWJlcjsKKworICAgICAgICBTdHJpbmdUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHN0ciwgaW50IG4pIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHI7CisgICAgICAgICAgICB0aGlzLnJlZk51bWJlciA9IG47CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0UmVmZXJlbmNlTnVtYmVyKCkgeyAgICAgICAgICAgICAgLy8gZm9yIFNUUklORworICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmTnVtYmVyOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBnZXRTdHJpbmcoKSB7ICAgICAgICAgICAgICAgICAgICAvLyBmb3IgU1RSSU5HCisgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQkFDS1JFRkVSRU5DRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gIlxcIit0aGlzLnJlZk51bWJlcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gUkVVdGlsLnF1b3RlTWV0YSh0aGlzLnN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIENvbmNhdFRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIFRva2VuIGNoaWxkOworICAgICAgICBUb2tlbiBjaGlsZDI7CisgICAgICAgIAorICAgICAgICBDb25jYXRUb2tlbihUb2tlbiB0MSwgVG9rZW4gdDIpIHsKKyAgICAgICAgICAgIHN1cGVyKFRva2VuLkNPTkNBVCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkID0gdDE7CisgICAgICAgICAgICB0aGlzLmNoaWxkMiA9IHQyOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gdGhpcy5jaGlsZCA6IHRoaXMuY2hpbGQyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgeworICAgICAgICAgICAgU3RyaW5nIHJldDsKKyAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkMi50eXBlID09IENMT1NVUkUgJiYgdGhpcy5jaGlsZDIuZ2V0Q2hpbGQoMCkgPT0gdGhpcy5jaGlsZCkgeworICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIisiOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoaWxkMi50eXBlID09IE5PTkdSRUVEWUNMT1NVUkUgJiYgdGhpcy5jaGlsZDIuZ2V0Q2hpbGQoMCkgPT0gdGhpcy5jaGlsZCkgeworICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIis/IjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrdGhpcy5jaGlsZDIudG9TdHJpbmcob3B0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDaGFyVG9rZW4gZXh0ZW5kcyBUb2tlbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgaW50IGNoYXJkYXRhOworCisgICAgICAgIENoYXJUb2tlbihpbnQgdHlwZSwgaW50IGNoKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgICAgIHRoaXMuY2hhcmRhdGEgPSBjaDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKKyAgICAgICAgICAgICAgY2FzZSBDSEFSOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyZGF0YSkgeworICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6ICBjYXNlICcqJzogIGNhc2UgJysnOiAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgICBjYXNlICcoJzogIGNhc2UgJyknOiAgY2FzZSAnLic6ICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOiAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICByZXQgPSAiXFwiKyhjaGFyKXRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOiAgcmV0ID0gIlxcZiI7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogIHJldCA9ICJcXG4iOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBjYXNlICdccic6ICByZXQgPSAiXFxyIjsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOiAgcmV0ID0gIlxcdCI7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMHgxYjogIHJldCA9ICJcXGUiOyAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vY2FzZSAweDBiOiAgcmV0ID0gIlxcdiI7ICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYXJkYXRhID49IDB4MTAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSAiMCIrSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmNoYXJkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICJcXHYiK3ByZS5zdWJzdHJpbmcocHJlLmxlbmd0aCgpLTYsIHByZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIiIrKGNoYXIpdGhpcy5jaGFyZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSBBTkNIT1I6CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gVG9rZW4udG9rZW5fbGluZWJlZ2lubmluZyB8fCB0aGlzID09IFRva2VuLnRva2VuX2xpbmVlbmQpCisgICAgICAgICAgICAgICAgICAgIHJldCA9ICIiKyhjaGFyKXRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gIlxcIisoY2hhcil0aGlzLmNoYXJkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIG1hdGNoKGludCBjaCkgeworICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBDSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoID09IHRoaXMuY2hhcmRhdGE7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTkZBQXJyb3cjbWF0Y2goKTogSW50ZXJuYWwgZXJyb3I6ICIrdGhpcy50eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gcGFyc2UgdHJlZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQ2xvc3VyZVRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIGludCBtaW47CisgICAgICAgIGludCBtYXg7CisgICAgICAgIFRva2VuIGNoaWxkOworCisgICAgICAgIENsb3N1cmVUb2tlbihpbnQgdHlwZSwgVG9rZW4gdG9rKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGQgPSB0b2s7CisgICAgICAgICAgICB0aGlzLnNldE1pbigtMSk7CisgICAgICAgICAgICB0aGlzLnNldE1heCgtMSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFRva2VuIGdldENoaWxkKGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCB2b2lkIHNldE1pbihpbnQgbWluKSB7CisgICAgICAgICAgICB0aGlzLm1pbiA9IG1pbjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCB2b2lkIHNldE1heChpbnQgbWF4KSB7CisgICAgICAgICAgICB0aGlzLm1heCA9IG1heDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgZ2V0TWluKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBnZXRNYXgoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBDTE9TVVJFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWluKCkgPCAwICYmIHRoaXMuZ2V0TWF4KCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIioiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW4oKSA9PSB0aGlzLmdldE1heCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrInsiK3RoaXMuZ2V0TWluKCkrIn0iOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRNaW4oKSA+PSAwICYmIHRoaXMuZ2V0TWF4KCkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsIit0aGlzLmdldE1heCgpKyJ9IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPj0gMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsfSI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb2tlbiN0b1N0cmluZygpOiBDTE9TVVJFICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3RoaXMuZ2V0TWluKCkrIiwgIit0aGlzLmdldE1heCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TWluKCkgPCAwICYmIHRoaXMuZ2V0TWF4KCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIio/IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPT0gdGhpcy5nZXRNYXgoKSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyJ9PyI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldE1pbigpID49IDAgJiYgdGhpcy5nZXRNYXgoKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrInsiK3RoaXMuZ2V0TWluKCkrIiwiK3RoaXMuZ2V0TWF4KCkrIn0/IjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0TWluKCkgPj0gMCAmJiB0aGlzLmdldE1heCgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyJ7Iit0aGlzLmdldE1pbigpKyIsfT8iOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVG9rZW4jdG9TdHJpbmcoKTogTk9OR1JFRURZQ0xPU1VSRSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLmdldE1pbigpKyIsICIrdGhpcy5nZXRNYXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBwYXJzZSB0cmVlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBQYXJlblRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIFRva2VuIGNoaWxkOworICAgICAgICBpbnQgcGFyZW5udW1iZXI7CisKKyAgICAgICAgUGFyZW5Ub2tlbihpbnQgdHlwZSwgVG9rZW4gdG9rLCBpbnQgcGFyZW4pIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICAgICAgdGhpcy5jaGlsZCA9IHRvazsKKyAgICAgICAgICAgIHRoaXMucGFyZW5udW1iZXIgPSBwYXJlbjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRQYXJlbk51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVubnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgeworICAgICAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7CisgICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkgeworICAgICAgICAgICAgICBjYXNlIFBBUkVOOgorICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVubnVtYmVyID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gIig/OiIrdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKSsiKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gIigiK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIExPT0tBSEVBRDoKKyAgICAgICAgICAgICAgICByZXQgPSAiKD89Iit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tBSEVBRDoKKyAgICAgICAgICAgICAgICByZXQgPSAiKD8hIit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBMT09LQkVISU5EOgorICAgICAgICAgICAgICAgIHJldCA9ICIoPzw9Iit0aGlzLmNoaWxkLnRvU3RyaW5nKG9wdGlvbnMpKyIpIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBORUdBVElWRUxPT0tCRUhJTkQ6CisgICAgICAgICAgICAgICAgcmV0ID0gIig/PCEiK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIElOREVQRU5ERU5UOgorICAgICAgICAgICAgICAgIHJldCA9ICIoPz4iK3RoaXMuY2hpbGQudG9TdHJpbmcob3B0aW9ucykrIikiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqICg/KGNvbmRpdGlvbil5ZXMtcGF0dGVybnxuby1wYXR0ZXJuKQorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDb25kaXRpb25Ub2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBpbnQgcmVmTnVtYmVyOworICAgICAgICBUb2tlbiBjb25kaXRpb247CisgICAgICAgIFRva2VuIHllczsKKyAgICAgICAgVG9rZW4gbm87CisgICAgICAgIENvbmRpdGlvblRva2VuKGludCByZWZubywgVG9rZW4gY29uZCwgVG9rZW4geWVzcGF0LCBUb2tlbiBub3BhdCkgeworICAgICAgICAgICAgc3VwZXIoVG9rZW4uQ09ORElUSU9OKTsKKyAgICAgICAgICAgIHRoaXMucmVmTnVtYmVyID0gcmVmbm87CisgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmQ7CisgICAgICAgICAgICB0aGlzLnllcyA9IHllc3BhdDsKKyAgICAgICAgICAgIHRoaXMubm8gPSBub3BhdDsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5vID09IG51bGwgPyAxIDogMjsKKyAgICAgICAgfQorICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSAgcmV0dXJuIHRoaXMueWVzOworICAgICAgICAgICAgaWYgKGluZGV4ID09IDEpICByZXR1cm4gdGhpcy5ubzsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBFcnJvcjogIitpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworICAgICAgICAgICAgaWYgKHJlZk51bWJlciA+IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSAiKD8oIityZWZOdW1iZXIrIikiOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmRpdGlvbi50eXBlID09IFRva2VuLkFOQ0hPUikgeworICAgICAgICAgICAgICAgIHJldCA9ICIoPygiK3RoaXMuY29uZGl0aW9uKyIpIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gIig/Iit0aGlzLmNvbmRpdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMubm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldCArPSB0aGlzLnllcysiKSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCArPSB0aGlzLnllcysifCIrdGhpcy5ubysiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogKGltcy1pbXM6IC4uLi4gKQorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBNb2RpZmllclRva2VuIGV4dGVuZHMgVG9rZW4gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIFRva2VuIGNoaWxkOworICAgICAgICBpbnQgYWRkOworICAgICAgICBpbnQgbWFzazsKKworICAgICAgICBNb2RpZmllclRva2VuKFRva2VuIHRvaywgaW50IGFkZCwgaW50IG1hc2spIHsKKyAgICAgICAgICAgIHN1cGVyKFRva2VuLk1PRElGSUVSR1JPVVApOworICAgICAgICAgICAgdGhpcy5jaGlsZCA9IHRvazsKKyAgICAgICAgICAgIHRoaXMuYWRkID0gYWRkOworICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgVG9rZW4gZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRPcHRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkOworICAgICAgICB9CisgICAgICAgIGludCBnZXRPcHRpb25zTWFzaygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm1hc2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBvcHRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gIig/IgorICAgICAgICAgICAgICAgICsodGhpcy5hZGQgPT0gMCA/ICIiIDogUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLmFkZCkpCisgICAgICAgICAgICAgICAgKyh0aGlzLm1hc2sgPT0gMCA/ICIiIDogUkVVdGlsLmNyZWF0ZU9wdGlvblN0cmluZyh0aGlzLm1hc2spKQorICAgICAgICAgICAgICAgICsiOiIKKyAgICAgICAgICAgICAgICArdGhpcy5jaGlsZC50b1N0cmluZyhvcHRpb25zKQorICAgICAgICAgICAgICAgICsiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHBhcnNlIHRyZWUuCisgICAgICogZm9yIFVOSU9OIG9yIENPTkNBVC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVW5pb25Ub2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBWZWN0b3IgY2hpbGRyZW47CisKKyAgICAgICAgVW5pb25Ub2tlbihpbnQgdHlwZSkgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZENoaWxkKFRva2VuIHRvaykgeworICAgICAgICAgICAgaWYgKHRvayA9PSBudWxsKSAgcmV0dXJuOworICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgIHRoaXMuY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBpZiAodGhpcy50eXBlID09IFVOSU9OKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRFbGVtZW50KHRvayk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBDT05DQVQsIGFuZCBuZXcgY2hpbGQgaXMgQ09OQ0FULgorICAgICAgICAgICAgaWYgKHRvay50eXBlID09IENPTkNBVCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHRvay5zaXplKCk7ICBpICsrKQorICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkKHRvay5nZXRDaGlsZChpKSk7IC8vIFJlY3Vyc2lvbgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzaXplID0gdGhpcy5jaGlsZHJlbi5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRFbGVtZW50KHRvayk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVG9rZW4gcHJldmlvdXMgPSAoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoc2l6ZS0xKTsKKyAgICAgICAgICAgIGlmICghKChwcmV2aW91cy50eXBlID09IENIQVIgfHwgcHJldmlvdXMudHlwZSA9PSBTVFJJTkcpCisgICAgICAgICAgICAgICAgICAmJiAodG9rLnR5cGUgPT0gQ0hBUiB8fCB0b2sudHlwZSA9PSBTVFJJTkcpKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkRWxlbWVudCh0b2spOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oIk1lcmdlICciK3ByZXZpb3VzKyInIGFuZCAnIit0b2srIicuIik7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI7CisgICAgICAgICAgICBpbnQgbmV4dE1heExlbmd0aCA9ICh0b2sudHlwZSA9PSBDSEFSID8gMiA6IHRvay5nZXRTdHJpbmcoKS5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAocHJldmlvdXMudHlwZSA9PSBDSEFSKSB7ICAgICAgICAvLyBSZXBsYWNlIHByZXZpb3VzIHRva2VuIGJ5IFNUUklORworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMiArIG5leHRNYXhMZW5ndGgpOworICAgICAgICAgICAgICAgIGludCBjaCA9IHByZXZpb3VzLmdldENoYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChSRVV0aWwuZGVjb21wb3NlVG9TdXJyb2dhdGVzKGNoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWNoKTsKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IFRva2VuLmNyZWF0ZVN0cmluZyhudWxsKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNldEVsZW1lbnRBdChwcmV2aW91cywgc2l6ZS0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNUUklORworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJldmlvdXMuZ2V0U3RyaW5nKCkubGVuZ3RoKCkgKyBuZXh0TWF4TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByZXZpb3VzLmdldFN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRvay50eXBlID09IENIQVIpIHsKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSB0b2suZ2V0Q2hhcigpOworICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKQorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKFJFVXRpbC5kZWNvbXBvc2VUb1N1cnJvZ2F0ZXMoY2gpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpY2gpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRvay5nZXRTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgoU3RyaW5nVG9rZW4pcHJldmlvdXMpLnN0cmluZyA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4gPT0gbnVsbCA/IDAgOiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBUb2tlbiBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgb3B0aW9ucykgeworICAgICAgICAgICAgU3RyaW5nIHJldDsKKyAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gQ09OQ0FUKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4uc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gY2ggPSB0aGlzLmdldENoaWxkKDApOworICAgICAgICAgICAgICAgICAgICBUb2tlbiBjaDIgPSB0aGlzLmdldENoaWxkKDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2gyLnR5cGUgPT0gQ0xPU1VSRSAmJiBjaDIuZ2V0Q2hpbGQoMCkgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNoLnRvU3RyaW5nKG9wdGlvbnMpKyIrIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaDIudHlwZSA9PSBOT05HUkVFRFlDTE9TVVJFICYmIGNoMi5nZXRDaGlsZCgwKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2gudG9TdHJpbmcob3B0aW9ucykrIis/IjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjaC50b1N0cmluZyhvcHRpb25zKStjaDIudG9TdHJpbmcob3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgIGkgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoKFRva2VuKXRoaXMuY2hpbGRyZW4uZWxlbWVudEF0KGkpKS50b1N0cmluZyhvcHRpb25zKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZyhzYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplKCkgPT0gMiAmJiB0aGlzLmdldENoaWxkKDEpLnR5cGUgPT0gRU1QVFkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmdldENoaWxkKDApLnRvU3RyaW5nKG9wdGlvbnMpKyI/IjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGlsZHJlbi5zaXplKCkgPT0gMgorICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdldENoaWxkKDApLnR5cGUgPT0gRU1QVFkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLmdldENoaWxkKDEpLnRvU3RyaW5nKG9wdGlvbnMpKyI/PyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKChUb2tlbil0aGlzLmNoaWxkcmVuLmVsZW1lbnRBdCgwKSkudG9TdHJpbmcob3B0aW9ucykpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyAgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyAgaSArKykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpJ3wnKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCgoVG9rZW4pdGhpcy5jaGlsZHJlbi5lbGVtZW50QXQoaSkpLnRvU3RyaW5nKG9wdGlvbnMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFN0cmluZyhzYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlLnByb3BlcnRpZXMgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2UucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU0ODgwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMiBAQAorcGFyc2VyLnBhcnNlLjE9V3JvbmcgY2hhcmFjdGVyLgorcGFyc2VyLnBhcnNlLjI9SW52YWxpZCByZWZlcmVuY2UgbnVtYmVyLgorcGFyc2VyLm5leHQuMT1BIGNoYXJhY3RlciBpcyByZXF1aXJlZCBhZnRlciBcXC4KK3BhcnNlci5uZXh0LjI9Jz8nIGlzIG5vdCBleHBlY3RlZC4gICcoPzonIG9yICcoPz0nIG9yICcoPyEnIG9yICcoPzwnIG9yICcoPyMnIG9yICcoPz4nPworcGFyc2VyLm5leHQuMz0nKD88PScgb3IgJyg/PCEnIGlzIGV4cGVjdGVkLgorcGFyc2VyLm5leHQuND1BIGNvbW1lbnQgaXMgbm90IHRlcm1pbmF0ZWQuCitwYXJzZXIuZmFjdG9yLjE9JyknIGlzIGV4cGVjdGVkLgorcGFyc2VyLmZhY3Rvci4yPVVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBwYXR0ZXJuIGluIGEgbW9kaWZpZXIgZ3JvdXAuCitwYXJzZXIuZmFjdG9yLjM9JzonIGlzIGV4cGVjdGVkLgorcGFyc2VyLmZhY3Rvci40PVVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBwYXR0ZXJuIGluIGEgY29uZGl0aW9uYWwgZ3JvdXAuCitwYXJzZXIuZmFjdG9yLjU9QSBiYWNrIHJlZmVyZW5jZSBvciBhbiBhbmNob3Igb3IgYSBsb29rYWhlYWQgb3IgYSBsb29rYmVoaW5kIGlzIGV4cGVjdGVkIGluIGEgY29uZGl0aW9uYWwgcGF0dGVybi4KK3BhcnNlci5mYWN0b3IuNj1UaGVyZSBhcmUgbW9yZSB0aGFuIHRocmVlIGNob2lzZXMgaW4gYSBjb25kaXRpb25hbCBncm91cC4KK3BhcnNlci5hdG9tLjE9QSBjaGFyYWN0ZXIgaW4gVSswMDQwLVUrMDA1ZiBtdXN0IGZvbGxvdyBcXGMuCitwYXJzZXIuYXRvbS4yPUEgQ2F0ZWdvcnkgY2hhcmFjdGVyIG9yICd7JyBpcyByZXF1aXJlZC4KK3BhcnNlci5hdG9tLjM9QSBwcm9wZXJ0eSBuYW1lIGlzIG5vdCBjbG9zZWQgYnkgJ30nLgorcGFyc2VyLmF0b20uND1VbmV4cGVjdGVkIG1ldGEgY2hhcmFjdGVyLgorcGFyc2VyLmF0b20uNT1Vbmtub3duIHByb3BlcnR5LgorcGFyc2VyLmNjLjE9QSBQT1NJWCBjaGFyYWN0ZXIgY2xhc3MgbXVzdCBiZSBjbG9zZWQgYnkgJzpdJy4KK3BhcnNlci5jYy4yPVVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBwYXR0ZXJuIGluIGEgY2hhcmFjdGVyIGNsYXNzLgorcGFyc2VyLmNjLjM9VW5rbm93biBuYW1lIGZvciBhIFBPU0lYIGNoYXJhY3RlciBjbGFzcy4KK3BhcnNlci5jYy40PSctJyBpcyBpbnZhbGlkIGhlcmUuCitwYXJzZXIuY2MuNT0nXScgaXMgZXhwZWN0ZWQuCitwYXJzZXIuY2MuNj0nWycgaXMgaW52YWxpZCBpbiBhIGNoYXJhY2VyIGNsYXNzLiAgV3JpdGUgJ1xcWycuCitwYXJzZXIuY2MuNz0nXScgaXMgaW52YWxpZCBpbiBhIGNoYXJhY2VyIGNsYXNzLiAgV3JpdGUgJ1xcXScuCitwYXJzZXIub3BlLjE9J1snIGlzIGV4cGVjdGVkLgorcGFyc2VyLm9wZS4yPScpJyBvciAnLVsnIG9yICcrWycgb3IgJyZbJyBpcyBleHBlY3RlZC4KK3BhcnNlci5kZXNjYXBlLjE9SW52YWxpZCBVbmljb2RlIGhleCBub3RhdGlvbi4KK3BhcnNlci5kZXNjYXBlLjI9T3ZlcmZsb3cgaW4gYSBoZXggbm90YXRpb24uCitwYXJzZXIuZGVzY2FwZS4zPSdcXHh7JyBtdXN0IGJlIGNsb3NlZCBieSAnfScuCitwYXJzZXIuZGVzY2FwZS40PUludmFsaWQgVW5pY29kZSBjb2RlIHBvaW50LgorcGFyc2VyLmRlc2NhcGUuNT1BbiBhbmNob3IgbXVzdCBub3QgYmUgaGVyZS4KK3BhcnNlci5wcm9jZXNzLjE9VGhpcyBleHByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgb3B0aW9uIHNldHRpbmcuCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfZnIucHJvcGVydGllcyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZV9mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkM2U5ODEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3JlZ2V4L21lc3NhZ2VfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDMyIEBACisgcGFyc2VyLnBhcnNlLjE9Q2FyYWN0XHUwMGU4cmUgaW52YWxpZGUuCitwYXJzZXIucGFyc2UuMj1OdW1cdTAwZTlybyBkZSByXHUwMGU5Zlx1MDBlOXJlbmNlIGludmFsaWRlLgorcGFyc2VyLm5leHQuMT1VbiBcXCBkb2l0IFx1MDBlYXRyZSBzdWl2aSBkJ3VuIGNhcmFjdFx1MDBlOHJlLgorcGFyc2VyLm5leHQuMj0nPycgbidlc3QgcGFzIHBvc3NpYmxlIGljaS4gICcoPzonIG91ICcoPz0nIG91ICcoPyEnIG91ICcoPzwnIG91ICcoPyMnIG91ICcoPz4nPworcGFyc2VyLm5leHQuMz0nKD88PScgb3UgJyg/PCEnIHNvbnQgYXR0ZW5kdXMuCitwYXJzZXIubmV4dC40PVVuIGNvbW1lbnRhaXJlIG4nZXN0IHBhcyBmZXJtXHUwMGU5LgorcGFyc2VyLmZhY3Rvci4xPScpJyBtYW5xdWFudC4KK3BhcnNlci5mYWN0b3IuMj1GaW4gcHJcdTAwZTltYXR1clx1MDBlOWUgZGUgbW90aWYgZGFucyB1biBncm91cGUgbW9kaWZpYW50LgorcGFyc2VyLmZhY3Rvci4zPSc6JyBtYW5xdWFudC4KK3BhcnNlci5mYWN0b3IuND1GaW4gcHJcdTAwZTltYXR1clx1MDBlOWUgZGUgbW90aWYgZGFucyB1biBncm91cGUgY29uZGl0aW9uZWwuCitwYXJzZXIuZmFjdG9yLjU9VW5lIHJcdTAwZTlmXHUwMGU5cmVuY2UgYXJyaVx1MDBlOHJlIG91IHVuZSBhbmNyZSBvdSB1biBsb29rYWhlYWQgb3UgdW4gbG9va2JlaGluZCBlc3QgYXR0ZW5kdSBkYW5zIHVuIGdyb3VwZSBjb25kaXRpb25lbC4KK3BhcnNlci5mYWN0b3IuNj1JbCB5IGEgcGx1cyBkZSB0cm9pcyBjaG9peCBkYW5zIHVuIGdyb3VwZSBjb25kaXRpb25lbC4KK3BhcnNlci5hdG9tLjE9XFxjIGRvaXQgXHUwMGVhdHJlIHN1aXZpIGQndW4gY2FyYWN0XHUwMGU4cmUgZGFucyBsJ2ludGVydmFsbGUgVSswMDQwLVUrMDA1ZiAuCitwYXJzZXIuYXRvbS4yPVVuIGNhcmFjdFx1MDBlOHJlIGRlIGNhdFx1MDBlOWdvcmllIG91ICd7JyBlc3QgcmVxdWlzLgorcGFyc2VyLmF0b20uMz1VbiBub20gZGUgcHJvcHJpXHUwMGU5dFx1MDBlOSBuZSBzZSB0ZXJtaW5lIHBhcyBwYXIgJ30nLgorcGFyc2VyLmF0b20uND1NXHUwMGU5dGFjYXJhY3RcdTAwZThyZSBpbnRlcmRpdC4KK3BhcnNlci5hdG9tLjU9UHJvcHJpXHUwMGU5dFx1MDBlOSBpbmNvbm51ZS4KK3BhcnNlci5jYy4xPVVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUgUE9TSVggZG9pdCBcdTAwZWF0cmUgdGVybWluXHUwMGU5ZSBwYXIgJzpdJy4KK3BhcnNlci5jYy4yPUZpbiBwclx1MDBlOW1hdHVyXHUwMGU5ZSBkZSBtb3RpZiBkYW5zIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUuCitwYXJzZXIuY2MuMz1Ob20gaW5jb25udSBwb3VyIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUgUE9TSVguCitwYXJzZXIuY2MuND0nLScgZXN0IGludmFsaWRlLCBkYW5zIGNlIGNhcy4KK3BhcnNlci5jYy41PSddJyBtYW5xdWFudC4KK3BhcnNlci5jYy42PSdbJyBlc3QgaW52YWxpZGUgZGFucyB1bmUgY2xhc3NlIGRlIGNhcmFjdFx1MDBlOHJlLiBFY3JpdmV6ICdcXFsnLgorcGFyc2VyLmNjLjc9J10nIGVzdCBpbnZhbGlkZSBkYW5zIHVuZSBjbGFzc2UgZGUgY2FyYWN0XHUwMGU4cmUuIEVjcml2ZXogJ1xcXScuCitwYXJzZXIub3BlLjE9J1snIGVzdCBhdHRlbmR1LgorcGFyc2VyLm9wZS4yPScpJyBvdSAnLVsnIG91ICcrWycgb3UgJyZbJyBzb250IGF0dGVuZHVzLgorcGFyc2VyLmRlc2NhcGUuMT1Ob3RhdGlvbiBoZXhhZFx1MDBlOWNpbWFsZSBVbmljb2RlIGludmFsaWRlLgorcGFyc2VyLmRlc2NhcGUuMj1EXHUwMGU5cGFzc2VtZW50IGRlIGNhcGFjaXRcdTAwZTkgZGFucyB1bmUgZXhwcmVzc2lvbiBoZXhhZFx1MDBlOWNpbWFsZS4KK3BhcnNlci5kZXNjYXBlLjM9J1xceHsnIGRvaXQgc2UgdGVybWluZXIgcGFyIHVuICd9Jy4KK3BhcnNlci5kZXNjYXBlLjQ9UG9pbnQgZGUgY29kZSBVbmljb2RlIGludmFsaWRlLgorcGFyc2VyLmRlc2NhcGUuNT1BbmNyZSBpbnRlcmRpdGUgaWNpLgorcGFyc2VyLnByb2Nlc3MuMT1DZXR0ZSBleHByZXNzaW9uIG4nZXN0IHBhcyBhdXRvcmlzXHUwMGU5ZSBjb21wdGUgdGVudSBkZXMgb3B0aW9ucyBlbiBjb3Vycy4KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZV9qYS5wcm9wZXJ0aWVzIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9yZWdleC9tZXNzYWdlX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlODM5NAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvcmVnZXgvbWVzc2FnZV9qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzIgQEAKK3BhcnNlci5wYXJzZS4xPVx1MzA3OFx1MzA5M1x1MzA2YVx1NjU4N1x1NWI1Ny4KK3BhcnNlci5wYXJzZS4yPVx1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NzU2YVx1NTNmN1x1MzA2N1x1MzA1OS4KK3BhcnNlci5uZXh0LjE9XFwgXHUzMDZlXHU1ZjhjXHUzMDZiMVx1NjU4N1x1NWI1N1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OS4KK3BhcnNlci5uZXh0LjI9Jz8nIFx1MzA5Mlx1MzA1M1x1MzA1M1x1MzA2Ylx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4gXHUzMDgyXHUzMDU3XHUzMDRiXHUzMDU3XHUzMDY2ICcoPzonIFx1MzA0YiAnKD89JyBcdTMwNGIgJyg/IScgXHUzMDRiICcoPzwnIFx1MzA0YiAnKD8jJyBcdTMwNGIgJyg/PicgXHUzMDY3XHUzMDU5XHUzMDRiPworcGFyc2VyLm5leHQuMz0nKD88PScgXHUzMDRiICcoPzwhJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCitwYXJzZXIubmV4dC40PVx1OGEzYlx1OTFjOFx1MzA0Y1x1OTU4OVx1MzA1OFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5My4KK3BhcnNlci5mYWN0b3IuMT0nKScgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgorcGFyc2VyLmZhY3Rvci4yPVx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KK3BhcnNlci5mYWN0b3IuMz0nOicgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgorcGFyc2VyLmZhY3Rvci40PVx1Njc2MVx1NGVmNlx1NGVkOFx1MzA0ZFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGUyZFx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KK3BhcnNlci5mYWN0b3IuNT1cdTY3NjFcdTRlZjZcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwNmJcdTMwNmZcdTMwMDFcdTVmOGNcdTY1YjlcdTUzYzJcdTcxNjdcdTMwZmJcdTMwYTJcdTMwZjNcdTMwYWJcdTMwZmNcdTMwZmJcdTUxNDhcdThhYWRcdTMwN2ZcdTMwZmJcdTVmOGNcdThhYWRcdTMwN2ZcdTMwNmVcdTMwN2ZcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkuCitwYXJzZXIuZmFjdG9yLjY9XHU2NzYxXHU0ZWY2XHU0ZWQ4XHUzMDRkXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU0ZTJkXHUzMDZiM1x1NTAwYlx1NGVlNVx1NGUwYVx1MzA2ZVx1OTA3OFx1NjI5ZVx1MzA5Mlx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KK3BhcnNlci5hdG9tLjE9XFxjIFx1MzA2ZVx1NWY4Y1x1MzA2Ylx1MzA2Zlx1MzBiM1x1MzBmY1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA0YyBVKzAwNDBcdWZmNWVVKzAwNWYgXHUzMDZlXHU3YmM0XHU1NmYyXHUzMDZlXHU2NTg3XHU1YjU3XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgorcGFyc2VyLmF0b20uMj0xXHU2NTg3XHU1YjU3XHUzMDZlXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHU2NTg3XHU1YjU3XHUzMDRiICd7JyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCitwYXJzZXIuYXRvbS4zPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1NTQwZFx1MzA0YyAnfScgXHUzMDY3XHU5NTg5XHUzMDU4XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzLgorcGFyc2VyLmF0b20uND1cdTMwZTFcdTMwYmZcdTY1ODdcdTViNTdcdTMwNGNcdTU5MDlcdTMwNmFcdTMwNjhcdTMwNTNcdTMwOGRcdTMwNmJcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkuCitwYXJzZXIuYXRvbS41PVx1NjcyYVx1NzdlNVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1NTQwZFx1MzA2N1x1MzA1OS4KK3BhcnNlci5jYy4xPVBPU0lYIFx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1MzA2ZiAnOl0nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OS4KK3BhcnNlci5jYy4yPVx1NjU4N1x1NWI1N1x1MzBhZlx1MzBlOVx1MzBiOVx1NTE4NVx1MzA2N1x1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OS4KK3BhcnNlci5jYy4zPVx1NjcyYVx1NzdlNVx1MzA2ZSBQT1NJWCBcdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTU0MGRcdTMwNjdcdTMwNTkuCitwYXJzZXIuY2MuND1cdTMwNTNcdTMwNTNcdTMwNmIgJy0nIFx1MzA5Mlx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KK3BhcnNlci5jYy41PSddJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCitwYXJzZXIuY2MuNj1cdTY1ODdcdTViNTdcdTMwYWZcdTMwZTlcdTMwYjlcdTUxODVcdTMwNjdcdTMwNmYgJ1snIFx1MzA5Mlx1NzZmNFx1NjNhNVx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4gJ1xcWycgXHUzMDY4XHU2NmY4XHUzMDQ0XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0LgorcGFyc2VyLmNjLjc9XHU2NTg3XHU1YjU3XHUzMGFmXHUzMGU5XHUzMGI5XHU1MTg1XHUzMDY3XHUzMDZmICddJyBcdTMwOTJcdTc2ZjRcdTYzYTVcdTY2ZjhcdTMwNGZcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMuICdcXF0nIFx1MzA2OFx1NjZmOFx1MzA0NFx1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NC4KK3BhcnNlci5vcGUuMT0nWycgXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5LgorcGFyc2VyLm9wZS4yPScpJyBcdTMwNGIgJy1bJyBcdTMwNGIgJytbJyBcdTMwNGIgJyZbJyBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkuCitwYXJzZXIuZGVzY2FwZS4xPVx1MzBiM1x1MzBmY1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA2ZTE2XHU5MDMyXHU2NTcwXHU4ODY4XHU4YTE4XHU0ZTJkXHUzMDZiXHU5NTkzXHU5MDU1XHUzMDYzXHUzMDVmXHU2NTg3XHU1YjU3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5LgorcGFyc2VyLmRlc2NhcGUuMj1cdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNmVcdTY1NzBcdTUwMjRcdTMwNGNcdTU5MjdcdTMwNGRcdTMwNTlcdTMwNGVcdTMwN2VcdTMwNTkuCitwYXJzZXIuZGVzY2FwZS4zPSdcXHh7JyBcdTMwNmYgJ30nIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5My4KK3BhcnNlci5kZXNjYXBlLjQ9VW5pY29kZSBcdTMwNmVcdTMwYjNcdTMwZmNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzhcdTMwNjhcdTMwNTdcdTMwNjZcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkuCitwYXJzZXIuZGVzY2FwZS41PVx1MzBhMlx1MzBmM1x1MzBhYlx1MzBmY1x1MzA5Mlx1MzA1M1x1MzA1M1x1MzA2Ylx1NjZmOFx1MzA0Zlx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5My4KK3BhcnNlci5wcm9jZXNzLjE9XHUzMDUzXHUzMDZlXHU4ODY4XHU3M2ZlXHUzMDZmXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDZmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzLgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1M2EyNgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0J1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLmphdmEKQEAgLTAsMCArMSwxMDUxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEludGVnZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RyaW5nSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlNjaGVtYVJlZ3VsYXJFeHByZXNzaW9uOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitwdWJsaWMgY2xhc3MgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0gZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyQmFzZSBpbXBsZW1lbnRzIFNjaGVtYVR5cGVTeXN0ZW0KK3sKKyAgICAvLyBUaGUgZ2xvYmFsIGJ1aWx0aW4gdHlwZSBzeXN0ZW0KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0KCkKKyAgICAgICAgeyByZXR1cm4gX2dsb2JhbDsgfQorCisgICAgLy8gc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGVhcmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZVtdIEVNUFRZX1NDSEVNQVRZUEVfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlLlJlZltdIEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZS5SZWZbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hR2xvYmFsRWxlbWVudFtdIEVNUFRZX1NDSEVNQUVMRU1FTlRfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudFswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlWzBdOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYU1vZGVsR3JvdXBbXSBFTVBUWV9TQ0hFTUFNT0RFTEdST1VQX0FSUkFZID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBFTVBUWV9TQ0hFTUFBVFRSSUJVVEVHUk9VUF9BUlJBWSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFswXTsKKworICAgIHByaXZhdGUgc3RhdGljIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIF9nbG9iYWwgPSBuZXcgQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0oKTsKKworICAgIC8vIFVSIHR5cGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9BTllfVFlQRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQU5ZX1NJTVBMRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSk7CisKKyAgICAvLyBwcmltaXRpdmVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9CT09MRUFOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19CT09MRUFOKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0JBU0VfNjRfQklOQVJZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9IRVhfQklOQVJZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0FOWV9VUkkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfUU5BTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1FOQU1FKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05PVEFUSU9OID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OT1RBVElPTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9GTE9BVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRkxPQVQpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfRE9VQkxFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19ET1VCTEUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfREVDSU1BTCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfREVDSU1BTCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9TVFJJTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX1NUUklORyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RVUkFUSU9OID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19EVVJBVElPTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9EQVRFX1RJTUUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9USU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19USU1FKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0RBVEUgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0RBVEUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19ZRUFSX01PTlRIID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19ZRUFSID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX1lFQVIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfR19NT05USF9EQVkgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0dfREFZID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX0RBWSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9HX01PTlRIID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19HX01PTlRIKTsKKworICAgIC8vIGRlcml2ZWQgbnVtZXJpY3MKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lOVEVHRVIgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lOVEVHRVIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTE9ORyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTE9ORyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JTlQgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lOVCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9TSE9SVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfU0hPUlQpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfQllURSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfQllURSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT05fUE9TSVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9OX1BPU0lUSVZFX0lOVEVHRVIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTkVHQVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OT05fTkVHQVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfUE9TSVRJVkVfSU5URUdFUiA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9MT05HID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9MT05HKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX0lOVCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5UKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1VOU0lHTkVEX1NIT1JUID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9TSE9SVCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9VTlNJR05FRF9CWVRFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9CWVRFKTsKKworICAgIC8vIGRlcml2ZWQgc3RyaW5ncworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9STUFMSVpFRF9TVFJJTkcgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX1RPS0VOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19UT0tFTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OQU1FID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OQU1FKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05DTkFNRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTkNOQU1FKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0xBTkdVQUdFID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9JRCA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSUQpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfSURSRUYgPSBfZ2xvYmFsLmdldEJ1aWx0aW5UeXBlKFNjaGVtYVR5cGUuQlRDX0lEUkVGKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0lEUkVGUyA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfSURSRUZTKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0VOVElUWSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfRU5USVRZKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX0VOVElUSUVTID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19FTlRJVElFUyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlSW1wbCBTVF9OTVRPS0VOID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OTVRPS0VOKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGVJbXBsIFNUX05NVE9LRU5TID0gX2dsb2JhbC5nZXRCdWlsdGluVHlwZShTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUyk7CisKKyAgICAvLyB0aGUgbm8tdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZUltcGwgU1RfTk9fVFlQRSA9IF9nbG9iYWwuZ2V0QnVpbHRpblR5cGUoU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4pOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1BSRVNFUlZFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX1JFUExBQ0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZiBYTUxTVFJfQ09MTEFQU0UgPSBidWlsZFN0cmluZygicHJlc2VydmUiKTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTkUgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19OT05FID0gbmV3IGJvb2xlYW5bXQorICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfQ09MTEFQU0UgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX1JFUExBQ0UgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19SRVBMQUNFKSwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfV1NfUFJFU0VSVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19QUkVTRVJWRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0lOVEVHRVIgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xPTkcgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAorICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19JTlQgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAorICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19TSE9SVCA9IG5ldyBYbWxWYWx1ZVJlZltdCisgICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihTaG9ydC5NSU5fVkFMVUUpKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihTaG9ydC5NQVhfVkFMVUUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKKyAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfQllURSA9IG5ldyBYbWxWYWx1ZVJlZltdCisgICAgICAgIHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZihCeXRlLk1JTl9WQUxVRSkpLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTk5FR0FUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgbnVsbCwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKKyAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfUE9TSVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLk9ORSksIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX05PTlBPU0lUSVZFID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKKyAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfTkVHQVRJVkUgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLk9ORS5uZWdhdGUoKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX0xPTkcgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIobmV3IEJpZ0ludGVnZXIoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IikpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAorICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9JTlQgPSBuZXcgWG1sVmFsdWVSZWZbXQorICAgICAgICB7IG51bGwsIG51bGwsIG51bGwsIG51bGwsIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci52YWx1ZU9mKDQyOTQ5NjcyOTVMKSksIG51bGwsIG51bGwsIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIuWkVSTyksCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1VOU0lHTkVEX1NIT1JUID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZig2NTUzNSkpLCBudWxsLCBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLlpFUk8pLAorICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19VTlNJR05FRF9CWVRFID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBidWlsZEludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwgYnVpbGRJbnRlZ2VyKEJpZ0ludGVnZXIudmFsdWVPZigyNTUpKSwgbnVsbCwgbnVsbCwgYnVpbGRObkludGVnZXIoQmlnSW50ZWdlci5aRVJPKSwKKyAgICAgICAgICBidWlsZF93c3N0cmluZyhTY2hlbWFUeXBlLldTX0NPTExBUFNFKSwgbnVsbCwgbnVsbCB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfQlVJTFRJTl9MSVNUID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBidWlsZE5uSW50ZWdlcihCaWdJbnRlZ2VyLk9ORSksIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgYnVpbGRfd3NzdHJpbmcoU2NoZW1hVHlwZS5XU19DT0xMQVBTRSksIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfV1MgPSBuZXcgYm9vbGVhbltdCisgICAgICAgIHsgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICB0cnVlLCBmYWxzZSwgZmFsc2UgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfSU5URUdFUiA9IG5ldyBib29sZWFuW10KKyAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsCisgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07CisKKyAgICBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5JT04gPSBGQUNFVFNfTk9ORTsKKyAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19VTklPTiA9IEZJWEVEX0ZBQ0VUU19OT05FOworCisgICAgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX0xJU1QgPSBGQUNFVFNfV1NfQ09MTEFQU0U7CisgICAgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTElTVCA9IEZJWEVEX0ZBQ0VUU19XUzsKKworCisgICAgLyoKKyAgICAgKiBMQVNUIFN0YXRpYyBpbml0aWFsaXplcgorICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjsgaSA8PSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgX2dsb2JhbC5maWxsSW5UeXBlKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNYXAgX3R5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgU2NoZW1hVHlwZUltcGxbXSBfdHlwZUFycmF5ID0gbmV3IFNjaGVtYVR5cGVJbXBsW1NjaGVtYVR5cGUuQlRDX0xBU1RfQlVJTFRJTiArIDFdOworICAgIHByaXZhdGUgTWFwIF9oYW5kbGVzVG9PYmplY3RzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBfb2JqZWN0c1RvSGFuZGxlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3R5cGVzQnlDbGFzc25hbWUgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlSW1wbCBnZXRCdWlsdGluVHlwZShpbnQgYnRjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlQXJyYXlbYnRjXTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtKCkKKyAgICB7CisgICAgICAgIC8vIFVSIHR5cGVzCisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19BTllfVFlQRSwgImFueVR5cGUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUsICJhbnlTaW1wbGVUeXBlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZSIpOworCisgICAgICAgIC8vIHByaW1pdGl2ZXMKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4sICJib29sZWFuIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbiIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlksICJiYXNlNjRCaW5hcnkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnkiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlksICJoZXhCaW5hcnkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxIZXhCaW5hcnkiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0FOWV9VUkksICJhbnlVUkkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlVUkkiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX1FOQU1FLCAiUU5hbWUiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZSIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9UQVRJT04sICJOT1RBVElPTiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5PVEFUSU9OIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19GTE9BVCwgImZsb2F0IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RPVUJMRSwgImRvdWJsZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvdWJsZSIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfREVDSU1BTCwgImRlY2ltYWwiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19TVFJJTkcsICJzdHJpbmciLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmciKTsKKworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfRFVSQVRJT04sICJkdXJhdGlvbiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbER1cmF0aW9uIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUsICJkYXRlVGltZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGVUaW1lIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19USU1FLCAidGltZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRpbWUiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0RBVEUsICJkYXRlIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZSIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRILCAiZ1llYXJNb250aCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyTW9udGgiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfWUVBUiwgImdZZWFyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR1llYXIiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZLCAiZ01vbnRoRGF5IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoRGF5Iik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX0RBWSwgImdEYXkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxHRGF5Iik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19HX01PTlRILCAiZ01vbnRoIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR01vbnRoIik7CisKKyAgICAgICAgLy8gZGVyaXZlZCBudW1lcmljcworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSU5URUdFUiwgImludGVnZXIiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnRlZ2VyIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19MT05HLCAibG9uZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExvbmciKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lOVCwgImludCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludCIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfU0hPUlQsICJzaG9ydCIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0Iik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19CWVRFLCAiYnl0ZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJ5dGUiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSLCAibm9uUG9zaXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSLCAibmVnYXRpdmVJbnRlZ2VyIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTmVnYXRpdmVJbnRlZ2VyIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUiwgIm5vbk5lZ2F0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vbk5lZ2F0aXZlSW50ZWdlciIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUiwgInBvc2l0aXZlSW50ZWdlciIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFBvc2l0aXZlSW50ZWdlciIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORywgInVuc2lnbmVkTG9uZyIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkTG9uZyIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfSU5ULCAidW5zaWduZWRJbnQiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEludCIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQsICJ1bnNpZ25lZFNob3J0IiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRTaG9ydCIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURSwgInVuc2lnbmVkQnl0ZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkQnl0ZSIpOworCisgICAgICAgIC8vIGRlcml2ZWQgc3RyaW5ncworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkcsICJub3JtYWxpemVkU3RyaW5nIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9ybWFsaXplZFN0cmluZyIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfVE9LRU4sICJ0b2tlbiIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OQU1FLCAiTmFtZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5hbWUiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX05DTkFNRSwgIk5DTmFtZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5DTmFtZSIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTEFOR1VBR0UsICJsYW5ndWFnZSIsICJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExhbmd1YWdlIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19JRCwgIklEIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSUQiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0lEUkVGLCAiSURSRUYiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRiIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfSURSRUZTLCAiSURSRUZTIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSURSRUZTIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19FTlRJVFksICJFTlRJVFkiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxFTlRJVFkiKTsKKyAgICAgICAgc2V0dXBCdWlsdGluKFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTLCAiRU5USVRJRVMiLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxFTlRJVElFUyIpOworICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk1UT0tFTiwgIk5NVE9LRU4iLCAib3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOIik7CisgICAgICAgIHNldHVwQnVpbHRpbihTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUywgIk5NVE9LRU5TIiwgIm9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk1UT0tFTlMiKTsKKworICAgICAgICAvLyB0aGUgbm8tdHlwZQorICAgICAgICBzZXR1cEJ1aWx0aW4oU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU4sIG51bGwsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJzY2hlbWEudHlwZXN5c3RlbS5idWlsdGluIjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZURlZmluZWQoU3RyaW5nIG5hbWVzcGFjZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRUeXBlKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX3R5cGVNYXAuZ2V0KG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIFNjaGVtYVR5cGUgZmluZERvY3VtZW50VHlwZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IGZpbmRFbGVtZW50KFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGZpbmRBdHRyaWJ1dGUoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZmluZFR5cGUobmFtZSk7CisgICAgICAgIHJldHVybiAodHlwZSA9PSBudWxsID8gbnVsbCA6IHR5cGUuZ2V0UmVmKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kRG9jdW1lbnRUeXBlUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZEF0dHJpYnV0ZVR5cGVSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmIGZpbmRBdHRyaWJ1dGVHcm91cFJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZSBuYW1lKSAKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfdHlwZXNCeUNsYXNzbmFtZS5nZXQoY2xhc3NuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsgLy8gYnVpbHRpbiBzY2hlbWEgdHlwZSBzeXN0ZW0gaGFzIG5vIHNvdXJjZS4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzKCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfdHlwZUFycmF5Lmxlbmd0aCAtIDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF90eXBlQXJyYXksIDEsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQVRZUEVfQVJSQVk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYVR5cGVbXSBhdHRyaWJ1dGVUeXBlcygpCisgICAgeworICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BVFlQRV9BUlJBWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFFTEVNRU5UX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQUFUVFJJQlVURV9BUlJBWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBFTVBUWV9TQ0hFTUFNT0RFTEdST1VQX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBncm91cHMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBhdHRyaWJ1dGVHcm91cHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX1NDSEVNQUFUVFJJQlVURUdST1VQX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIHR5cGUgd2l0aGluIHRoaXMgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlRm9yVHlwZShTY2hlbWFUeXBlIHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gKFN0cmluZylfb2JqZWN0c1RvSGFuZGxlcy5nZXQodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3Nsb2FkZXIgdXNlZCBieSB0aGlzIGxvYWRlciBmb3IgcmVzb2x2aW5nIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpCisgICAgeworICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGlzIHR5cGUgdG8gYSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVRvRGlyZWN0b3J5KEZpbGUgY2xhc3NEaXIpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBidWlsdGluIHNjaGVtYSB0eXBlIHN5c3RlbSBjYW5ub3QgYmUgc2F2ZWQuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRfd3NzdHJpbmcoaW50IHdzcikKKyAgICB7CisgICAgICAgIHN3aXRjaCAod3NyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9QUkVTRVJWRTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOgorICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfUkVQTEFDRTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX0NPTExBUFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkTm5JbnRlZ2VyKEJpZ0ludGVnZXIgYmlnSW50KQorICAgIHsKKyAgICAgICAgaWYgKGJpZ0ludCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChiaWdJbnQuc2lnbnVtKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxJbnRlZ2VySW1wbCBpID0gbmV3IFhtbEludGVnZXJJbXBsKCk7CisgICAgICAgICAgICBpLnNldChiaWdJbnQpOworICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbFZhbHVlUmVmIGJ1aWxkSW50ZWdlcihCaWdJbnRlZ2VyIGJpZ0ludCkKKyAgICB7CisgICAgICAgIGlmIChiaWdJbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sSW50ZWdlckltcGwgaSA9IG5ldyBYbWxJbnRlZ2VySW1wbCgpOworICAgICAgICAgICAgaS5zZXQoYmlnSW50KTsKKyAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKGkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZFN0cmluZyhTdHJpbmcgc3RyKQorICAgIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbFN0cmluZ0ltcGwgaSA9IG5ldyBYbWxTdHJpbmdJbXBsKCk7CisgICAgICAgICAgICBpLnNldChzdHIpOworICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cEJ1aWx0aW4oaW50IGJ0YywgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIGNsYXNzbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlSW1wbCh0aGlzLCB0cnVlKTsKKyAgICAgICAgUU5hbWUgbmFtZSA9IGxvY2FsbmFtZSA9PSBudWxsID8gbnVsbCA6IFFOYW1lSGVscGVyLmZvckxOUyhsb2NhbG5hbWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOworICAgICAgICBTdHJpbmcgaGFuZGxlID0gIl9CSV8iICsgKGxvY2FsbmFtZSA9PSBudWxsID8gIk5PX1RZUEUiIDogbG9jYWxuYW1lKTsKKyAgICAgICAgcmVzdWx0LnNldE5hbWUobmFtZSk7CisgICAgICAgIHJlc3VsdC5zZXRCdWlsdGluVHlwZUNvZGUoYnRjKTsKKyAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcmVzdWx0LnNldEZ1bGxKYXZhTmFtZShjbGFzc25hbWUpOworCisgICAgICAgIF90eXBlQXJyYXlbYnRjXSA9IHJlc3VsdDsKKyAgICAgICAgX3R5cGVNYXAucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIF9oYW5kbGVzVG9PYmplY3RzLnB1dChoYW5kbGUsIHJlc3VsdCk7CisgICAgICAgIF9vYmplY3RzVG9IYW5kbGVzLnB1dChyZXN1bHQsIGhhbmRsZSk7CisgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIF90eXBlc0J5Q2xhc3NuYW1lLnB1dChjbGFzc25hbWUsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCisgICAgeworICAgICAgICAvLyB3ZSdyZSBib3JuIHJlc29sdmVkIGFuZCBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JIYW5kbGUoU3RyaW5nIGhhbmRsZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSlfaGFuZGxlc1RvT2JqZWN0cy5nZXQoaGFuZGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50IHJlc29sdmVIYW5kbGUoU3RyaW5nIGhhbmRsZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hQ29tcG9uZW50KV9oYW5kbGVzVG9PYmplY3RzLmdldChoYW5kbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpbmtzIGEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWxsSW5UeXBlKGludCBidGMpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSBnZXRCdWlsdGluVHlwZShidGMpOworICAgICAgICBTY2hlbWFUeXBlIGJhc2U7CisgICAgICAgIFNjaGVtYVR5cGUgaXRlbSA9IG51bGw7CisgICAgICAgIGludCB2YXJpZXR5ID0gU2NoZW1hVHlwZS5BVE9NSUM7CisgICAgICAgIGludCBkZXJpdmF0aW9uVHlwZSA9IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT047CisKKyAgICAgICAgc3dpdGNoIChidGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UX0JVSUxUSU46CisgICAgICAgICAgICAgICAgdmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRTsKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfQU5ZX1RZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6CisgICAgICAgICAgICAgICAgdmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRTsKKyAgICAgICAgICAgICAgICBiYXNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkZXJpdmF0aW9uVHlwZSA9IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfVFlQRTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9BTllfU0lNUExFOyBicmVhazsKKworICAgICAgICAgICAgLy8gZGVyaXZlZCBudW1lcmljcworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlRFR0VSOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9ERUNJTUFMOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MT05HOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlRFR0VSOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX0xPTkc7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlQ7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JZVEU6CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX1NIT1JUOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfSU5URUdFUjsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9OX1BPU0lUSVZFX0lOVEVHRVI7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9JTlRFR0VSOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19QT1NJVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OT05fTkVHQVRJVkVfSU5URUdFUjsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORzoKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfTk9OX05FR0FUSVZFX0lOVEVHRVI7IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfVU5TSUdORURfTE9ORzsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX1VOU0lHTkVEX0lOVDsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfVU5TSUdORURfU0hPUlQ7IGJyZWFrOworCisgICAgICAgICAgICAvLyBkZXJpdmVkIHN0cmluZ3MKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkc6CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX1NUUklORzsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVE9LRU46CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX05PUk1BTElaRURfU1RSSU5HOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9UT0tFTjsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgorICAgICAgICAgICAgICAgIGJhc2UgPSBTVF9OQU1FOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfTkNOQU1FOyBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKKyAgICAgICAgICAgICAgICBiYXNlID0gU1RfVE9LRU47IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGUzoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRJRVM6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TOgorICAgICAgICAgICAgICAgIHZhcmlldHkgPSBTY2hlbWFUeXBlLkxJU1Q7CisgICAgICAgICAgICAgICAgYmFzZSA9IFNUX0FOWV9TSU1QTEU7CisgICAgICAgICAgICAgICAgaWYgKGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19JRFJFRlMpCisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBTVF9JRFJFRjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfRU5USVRJRVMpCisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBTVF9FTlRJVFk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpdGVtID0gU1RfTk1UT0tFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdC5zZXREZXJpdmF0aW9uVHlwZShkZXJpdmF0aW9uVHlwZSk7CisgICAgICAgIHJlc3VsdC5zZXRTaW1wbGVUeXBlVmFyaWV0eSh2YXJpZXR5KTsKKyAgICAgICAgaWYgKHZhcmlldHkgIT0gU2NoZW1hVHlwZS5OT1RfU0lNUExFKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQuc2V0U2ltcGxlVHlwZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAoYnRjID09IFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFIHx8IGJ0YyA9PSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnNldEJhc2VUeXBlUmVmKGJhc2UgPT0gbnVsbCA/IG51bGwgOiBiYXNlLmdldFJlZigpKTsKKyAgICAgICAgcmVzdWx0LnNldEJhc2VEZXB0aChiYXNlID09IG51bGwgPyAwIDogKChTY2hlbWFUeXBlSW1wbCliYXNlKS5nZXRCYXNlRGVwdGgoKSArIDEpOworICAgICAgICByZXN1bHQuc2V0TGlzdEl0ZW1UeXBlUmVmKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLmdldFJlZigpKTsKKyAgICAgICAgaWYgKGJ0YyA+PSBTY2hlbWFUeXBlLkJUQ19GSVJTVF9QUklNSVRJVkUgJiYgYnRjIDw9IFNjaGVtYVR5cGUuQlRDX0xBU1RfUFJJTUlUSVZFKQorICAgICAgICAgICAgcmVzdWx0LnNldFByaW1pdGl2ZVR5cGVSZWYocmVzdWx0LmdldFJlZigpKTsKKyAgICAgICAgZWxzZSBpZiAodmFyaWV0eSA9PSBTY2hlbWFUeXBlLkFUT01JQykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYXNlIHdhcyBudWxsIGZvciAiICsgYnRjKTsKKyAgICAgICAgICAgIGlmIChiYXNlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhc2UuZ3B0IHdhcyBudWxsIGZvciAiICsgYnRjKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2UuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFZhbHVlUmVmW10gZmFjZXRzOworICAgICAgICBib29sZWFuW10gZml4ZWRmOworICAgICAgICBpbnQgd3NyID0gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKKyAgICAgICAgaW50IGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5OT1RfREVDSU1BTDsKKworICAgICAgICAvLyBub3cgc2V0IHVwIGZhY2V0cworICAgICAgICBzd2l0Y2ggKGJ0YykKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9UWVBFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RfQlVJTFRJTjoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTk9ORTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKKyAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfUFJFU0VSVkU7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7CisgICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgorICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19DT0xMQVBTRTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfV1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfV1NfQ09MTEFQU0U7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX1dTOworICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBkZXJpdmVkIG51bWVyaWNzCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTE9ORzoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTE9ORzsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9MT05HOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lOVDoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfSU5UOworICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19JTlRFR0VSOworICAgICAgICAgICAgICAgIGRlY2ltYWxTaXplID0gU2NoZW1hVHlwZS5TSVpFX0lOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TSE9SVDoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfU0hPUlQ7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQllURToKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfQllURTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CWVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19OT05QT1NJVElWRTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ORUdBVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19ORUdBVElWRTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fTkVHQVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfTk9OTkVHQVRJVkU7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUE9TSVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfUE9TSVRJVkU7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgZGVjaW1hbFNpemUgPSBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfTE9ORzoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfTE9ORzsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19VTlNJR05FRF9JTlQ6CisgICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1VOU0lHTkVEX0lOVDsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9MT05HOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19VTlNJR05FRF9TSE9SVDsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9JTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfVU5TSUdORURfQllURTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfSU5URUdFUjsKKyAgICAgICAgICAgICAgICBkZWNpbWFsU2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAvLyBkZXJpdmVkIHN0cmluZ3MKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9STUFMSVpFRF9TVFJJTkc6CisgICAgICAgICAgICAgICAgZmFjZXRzID0gRkFDRVRTX1dTX1JFUExBQ0U7CisgICAgICAgICAgICAgICAgZml4ZWRmID0gRklYRURfRkFDRVRTX05PTkU7CisgICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19SRVBMQUNFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RPS0VOOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGUzoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOOgorICAgICAgICAgICAgICAgIGZhY2V0cyA9IEZBQ0VUU19XU19DT0xMQVBTRTsKKyAgICAgICAgICAgICAgICBmaXhlZGYgPSBGSVhFRF9GQUNFVFNfTk9ORTsKKyAgICAgICAgICAgICAgICB3c3IgPSBTY2hlbWFUeXBlLldTX0NPTExBUFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUSUVTOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OTVRPS0VOUzoKKyAgICAgICAgICAgICAgICBmYWNldHMgPSBGQUNFVFNfQlVJTFRJTl9MSVNUOworICAgICAgICAgICAgICAgIGZpeGVkZiA9IEZJWEVEX0ZBQ0VUU19OT05FOworICAgICAgICAgICAgICAgIHdzciA9IFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBmdW5kYW1lbnRhbCBmYWNldHMKKyAgICAgICAgaW50IG9yZGVyZWQgPSBTY2hlbWFUeXBlLlVOT1JERVJFRDsKKyAgICAgICAgYm9vbGVhbiBpc051bWVyaWMgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBpc0Zpbml0ZSA9IGZhbHNlOworICAgICAgICBib29sZWFuIGlzQm91bmRlZCA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAoYnRjKQorICAgICAgICB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PUk1BTElaRURfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19UT0tFTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkNOQU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MQU5HVUFHRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSUQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0lEUkVGOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRFJFRlM6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRU5USVRJRVM6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05NVE9LRU5TOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46CisgICAgICAgICAgICAgICAgaXNGaW5pdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSU5URUdFUjoKKyAgICAgICAgICAgICAgICBpc051bWVyaWMgPSB0cnVlOworICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBTY2hlbWFUeXBlLlRPVEFMX09SREVSOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFNjaGVtYVR5cGUuUEFSVElBTF9PUkRFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19MT05HOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JTlQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NIT1JUOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CWVRFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT05fUE9TSVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkVHQVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9OX05FR0FUSVZFX0lOVEVHRVI6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1BPU0lUSVZFX0lOVEVHRVI6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0xPTkc6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVU5TSUdORURfU0hPUlQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgICAgaXNOdW1lcmljID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5UT1RBTF9PUkRFUjsKKyAgICAgICAgICAgICAgICBpc0Zpbml0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgaXNCb3VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdC5zZXRCYXNpY0ZhY2V0cyhmYWNldHMsIGZpeGVkZik7CisgICAgICAgIHJlc3VsdC5zZXRXaGl0ZVNwYWNlUnVsZSh3c3IpOworICAgICAgICByZXN1bHQuc2V0T3JkZXJlZChvcmRlcmVkKTsKKyAgICAgICAgcmVzdWx0LnNldEJvdW5kZWQoaXNCb3VuZGVkKTsKKyAgICAgICAgcmVzdWx0LnNldE51bWVyaWMoaXNOdW1lcmljKTsKKyAgICAgICAgcmVzdWx0LnNldEZpbml0ZShpc0Zpbml0ZSk7CisgICAgICAgIHJlc3VsdC5zZXREZWNpbWFsU2l6ZShkZWNpbWFsU2l6ZSk7CisgICAgICAgIHJlc3VsdC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZKTsKKworICAgICAgICAvLyBUT0RPOiBzZXQgdXAgcGF0dGVybnMgZm9yIE5DTkFNRSwgbGFuZ3VhZ2UsIGV0Yy4KKworICAgICAgICBTdHJpbmcgcGF0dGVybiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaGFzUGF0dGVybiA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAoYnRjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0xBTkdVQUdFOgorICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiW2EtekEtWl17MSw4fSgtW2EtekEtWjAtOV17MSw4fSkqIjsgLy8gd2UgdXNlZCB0byBoYXZlIChbYS16QS1aXXsyfXxbaUldLVthLXpBLVpdK3xbeFhdLVthLXpBLVpdezEsOH0pKC1bYS16QS1aXXsxLDh9KSoiLCBidXQgczRzIHVzZXMgdGhlIG1vcmUgbGVuaWVudCBwYXR0ZXJuIHRvIHRoZSBsZWZ0LiAKKyAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk1UT0tFTjoKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcYysiOyAKKyAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTkFNRToKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcaVxcYyoiOworICAgICAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OQ05BTUU6CisgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJbXFxpLVs6XV1bXFxjLVs6XV0qIjsKKyAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gVGhlc2UgdHlwZXMgaW5oZXJpdCB0aGVpciBwYXR0ZXJucworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19JRDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSURSRUY6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0VOVElUWToKKyAgICAgICAgICAgICAgICBoYXNQYXR0ZXJuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbiBwID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7IHAgPSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguU2NoZW1hUmVndWxhckV4cHJlc3Npb24uZm9yUGF0dGVybihwYXR0ZXJuKTsgfQorICAgICAgICAgICAgY2F0Y2ggKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5QYXJzZUV4Y2VwdGlvbiBlKSB7IGFzc2VydCBmYWxzZTsgfQorICAgICAgICAgICAgcmVzdWx0LnNldFBhdHRlcm5zKG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSB7cH0pOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5zZXRQYXR0ZXJuRmFjZXQoaGFzUGF0dGVybik7CisKKworCisgICAgICAgIC8vIEFOWV9UWVBFIGhhcyB0byBiZSBhYmxlIHRvIGFjdCBsaWtlIGEgY29tcGxleCB0eXBlCisgICAgICAgIGlmIChidGMgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBjb250ZW50TW9kZWwgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7CisgICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKTsKKyAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRXaWxkY2FyZFNldChRTmFtZVNldC5BTEwpOworICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFdpbGRjYXJkUHJvY2VzcyhTY2hlbWFQYXJ0aWNsZS5MQVgpOworICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLlpFUk8pOworICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1heE9jY3VycyhudWxsKTsKKyAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRUcmFuc2l0aW9uUnVsZXMoUU5hbWVTZXQuQUxMLCB0cnVlKTsKKyAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRUcmFuc2l0aW9uTm90ZXMoUU5hbWVTZXQuQUxMLCB0cnVlKTsKKworICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKKyAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFByb2Nlc3MoU2NoZW1hQXR0cmlidXRlTW9kZWwuTEFYKTsKKyAgICAgICAgICAgIGF0dHJNb2RlbC5zZXRXaWxkY2FyZFNldChRTmFtZVNldC5BTEwpOworCisgICAgICAgICAgICByZXN1bHQuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCk7CisgICAgICAgICAgICByZXN1bHQuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgZmFsc2UpOworICAgICAgICAgICAgcmVzdWx0LnNldEFub255bW91c1R5cGVSZWZzKEVNUFRZX1NDSEVNQVRZUEVSRUZfQVJSQVkpOworICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU3VtbWFyeShRTmFtZVNldC5BTEwsIHRydWUsIFFOYW1lU2V0LkFMTCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYnRjID09IFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzbyBkb2VzIHRoZSBub190eXBlIDogaXQgcGVybWl0cyBubyBjb250ZW50cyAoYW5kIGV2ZW4gZW1wdHkgY29udGVudHMgaXMgaW52YWxpZCwgYnV0IHRoYXQncyBzcGVjaWFsLWNhc2VkKQorICAgICAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIGNvbnRlbnRNb2RlbCA9IG51bGw7IC8vIGVtcHR5CisgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOyAvLyBlbXB0eQorICAgICAgICAgICAgcmVzdWx0LnNldENvbXBsZXhUeXBlVmFyaWV0eShTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpOworICAgICAgICAgICAgcmVzdWx0LnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIGZhbHNlKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhFTVBUWV9TQ0hFTUFUWVBFUkVGX0FSUkFZKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQuRU1QVFksIGZhbHNlLCBRTmFtZVNldC5FTVBUWSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LnNldE9yZGVyU2Vuc2l0aXZlKGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGUgZ2V0Tm9UeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTVF9OT19UWVBFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0NsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0NsYXNzTG9hZGVyUmVzb3VyY2VMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJlMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCit7CisgICAgQ2xhc3NMb2FkZXIgX2NsYXNzTG9hZGVyOworCisgICAgQ2xhc3NMb2FkZXJSZXNvdXJjZUxvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKKyAgICB7CisgICAgICAgIF9jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gX2NsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL0ZpbGVSZXNvdXJjZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGFjZGEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9GaWxlUmVzb3VyY2VMb2FkZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKKworcHVibGljIGNsYXNzIEZpbGVSZXNvdXJjZUxvYWRlciBpbXBsZW1lbnRzIFJlc291cmNlTG9hZGVyCit7CisgICAgcHJpdmF0ZSBGaWxlIF9kaXJlY3Rvcnk7CisgICAgcHJpdmF0ZSBaaXBGaWxlIF96aXBmaWxlOworCisgICAgcHVibGljIEZpbGVSZXNvdXJjZUxvYWRlcihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIF9kaXJlY3RvcnkgPSBmaWxlOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF96aXBmaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfemlwZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gX3ppcGZpbGUuZ2V0RW50cnkocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIF96aXBmaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShfZGlyZWN0b3J5LCByZXNvdXJjZU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoX3ppcGZpbGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3ppcGZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG9oIHdlbGwuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfemlwZmlsZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvUGF0aFJlc291cmNlTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2ZDg5MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBQYXRoUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50cyBSZXNvdXJjZUxvYWRlcgoreworICAgIHByaXZhdGUgUmVzb3VyY2VMb2FkZXJbXSBfcGF0aDsKKworICAgIHB1YmxpYyBQYXRoUmVzb3VyY2VMb2FkZXIoUmVzb3VyY2VMb2FkZXJbXSBsb2FkZXJwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIF9wYXRoID0gbmV3IFJlc291cmNlTG9hZGVyW2xvYWRlcnBhdGgubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShsb2FkZXJwYXRoLCAwLCBfcGF0aCwgMCwgX3BhdGgubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0aFJlc291cmNlTG9hZGVyKEZpbGVbXSBmaWxlcGF0aCkKKyAgICB7CisgICAgICAgIExpc3QgcGF0aGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXBhdGgubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlc291cmNlTG9hZGVyIHBhdGggPSBuZXcgRmlsZVJlc291cmNlTG9hZGVyKGZpbGVwYXRoW2ldKTsKKyAgICAgICAgICAgICAgICBwYXRobGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gY2FuJ3QgcmVhZCBhIGZpbGUgb24gY2xhc3NwYXRoPyBza2lwIGl0LgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9wYXRoID0gKFJlc291cmNlTG9hZGVyW10pcGF0aGxpc3QudG9BcnJheShuZXcgUmVzb3VyY2VMb2FkZXJbcGF0aGxpc3Quc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlc291cmNlTmFtZSkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhdGgubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc3VsdCA9IF9wYXRoW2ldLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3BhdGgubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9wYXRoW2ldLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gb2ggd2VsbC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1Jlc291cmNlTG9hZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9SZXNvdXJjZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNWFiMjcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9SZXNvdXJjZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTG9hZGVyCit7CisgICAgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2VOYW1lKTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2ZlMTQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKKworcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUF0dHJpYnV0ZUdyb3VwCit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIHByaXZhdGUgUU5hbWUgX25hbWU7CisgICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OworICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQorICAgIHsKKyAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtLCBRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgdGhpcyh0eXBlU3lzdGVtKTsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUU5hbWUgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uLCBYbWxPYmplY3QgeCkKKyAgICB7CisgICAgICAgIGFzc2VydCBfbmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCBfbmFtZSApOworCisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOworICAgICAgICBfcmVkZWZpbml0aW9uID0gcmVkZWZpbml0aW9uOworICAgICAgICBfcGFyc2VPYmplY3QgPSB4OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA7IH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKKyAgICAgICAgeyByZXR1cm4gX25hbWU7IH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0UGFyc2VPYmplY3QoKQorICAgICAgICB7IHJldHVybiBfcGFyc2VPYmplY3Q7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKKyAgICAgICAgeyByZXR1cm4gX3BhcnNlVE5TOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCisgICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9CisKKyAgICBwcml2YXRlIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYodGhpcyk7CisgICAgCisgICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBnZXRSZWYoKQorICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQorCisgICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKKyAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVkZWZpbml0aW9uKCkKKyAgICAgICAgeyByZXR1cm4gX3JlZGVmaW5pdGlvbjsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZlYmJhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKKworcHVibGljIGNsYXNzIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCBpbXBsZW1lbnRzIFNjaGVtYUF0dHJpYnV0ZU1vZGVsCit7CisgICAgcHJpdmF0ZSBNYXAgYXR0ck1hcDsKKyAgICBwcml2YXRlIFFOYW1lU2V0IHdjU2V0OworICAgIHByaXZhdGUgaW50IHdjUHJvY2VzczsKKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKQorICAgIHsKKyAgICAgICAgYXR0ck1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIHdjU2V0ID0gbnVsbDsKKyAgICAgICAgd2NQcm9jZXNzID0gTk9ORTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNhbSkKKyAgICB7CisgICAgICAgIGF0dHJNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBpZiAoc2FtID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdjU2V0ID0gbnVsbDsKKyAgICAgICAgICAgIHdjUHJvY2VzcyA9IE5PTkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gc2FtLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXR0ck1hcC5wdXQoYXR0cnNbaV0uZ2V0TmFtZSgpLCBhdHRyc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYW0uZ2V0V2lsZGNhcmRQcm9jZXNzKCkgIT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3Y1NldCA9IHNhbS5nZXRXaWxkY2FyZFNldCgpOworICAgICAgICAgICAgICAgIHdjUHJvY2VzcyA9IHNhbS5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIEVNUFRZX1NMQV9BUlJBWSA9IG5ldyBTY2hlbWFMb2NhbEF0dHJpYnV0ZVswXTsKKworICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGdldEF0dHJpYnV0ZXMoKQorICAgIHsKKyAgICAgICAgaWYgKGF0dHJNYXAudmFsdWVzKCkuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU0xBX0FSUkFZOworCisgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gZGF0YSA9IG5ldyBTY2hlbWFMb2NhbEF0dHJpYnV0ZVthdHRyTWFwLnZhbHVlcygpLnNpemUoKV07CisgICAgICAgIHJldHVybiAoU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSlhdHRyTWFwLnZhbHVlcygpLnRvQXJyYXkoZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUxvY2FsQXR0cmlidXRlIGdldEF0dHJpYnV0ZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTY2hlbWFMb2NhbEF0dHJpYnV0ZSlhdHRyTWFwLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0cnVzZSkKKyAgICB7CisgICAgICAgIGF0dHJNYXAucHV0KGF0dHJ1c2UuZ2V0TmFtZSgpLCBhdHRydXNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvaGliaXRlZEF0dHJpYnV0ZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgYXR0ck1hcC5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lU2V0IGdldFdpbGRjYXJkU2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB3Y1NldCA9PSBudWxsID8gUU5hbWVTZXQuRU1QVFkgOiB3Y1NldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFNldChRTmFtZVNldCBzZXQpCisgICAgeworICAgICAgICB3Y1NldCA9IHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpCisgICAgeworICAgICAgICByZXR1cm4gd2NQcm9jZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdpbGRjYXJkUHJvY2VzcyhpbnQgcHJvYykKKyAgICB7CisgICAgICAgIHdjUHJvY2VzcyA9IHByb2M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTUwMTYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworcHVibGljIGNsYXNzIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwKKyAgICAgICAgaW1wbGVtZW50cyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUKK3sKKyAgICBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIFN0cmluZyBfZmlsZW5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3BhcnNlVE5TOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2hhbWVsZW9uOworCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwoU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtKQorICAgIHsKKyAgICAgICAgX3R5cGVTeXN0ZW0gPSB0eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gX2ZpbGVuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIF9maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uKQorICAgIHsKKyAgICAgICAgX3BhcnNlT2JqZWN0ID0gcGFyc2VPYmplY3Q7CisgICAgICAgIF9wYXJzZVROUyA9IHRhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgX2NoYW1lbGVvbiA9IGNoYW1lbGVvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGdldFBhcnNlT2JqZWN0KCkKKyAgICAgICAgeyByZXR1cm4gX3BhcnNlT2JqZWN0OyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCisgICAgICAgIHsgcmV0dXJuIF9wYXJzZVROUzsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQorICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uID8gX3BhcnNlVE5TIDogbnVsbDsgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIF9zZWxmcmVmID0gbmV3IFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYodGhpcyk7CisKKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBnZXRSZWYoKQorICAgICAgICB7IHJldHVybiBfc2VsZnJlZjsgfQorCisgICAgcHVibGljIFNjaGVtYUNvbXBvbmVudC5SZWYgZ2V0Q29tcG9uZW50UmVmKCkKKyAgICAgICAgeyByZXR1cm4gZ2V0UmVmKCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUdsb2JhbEVsZW1lbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGIyODkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFHbG9iYWxFbGVtZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hTG9jYWxFbGVtZW50SW1wbAorICAgICAgICBpbXBsZW1lbnRzIFNjaGVtYUdsb2JhbEVsZW1lbnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZVtdIEVNUFRZX1FOQU1FX0FSUkFZID0gbmV3IFFOYW1lWzBdOworICAgIHByaXZhdGUgU2V0IF9zZ01lbWJlcnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBfZmluYWxFeHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbFJlc3Q7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIHByaXZhdGUgU3RyaW5nIF9maWxlbmFtZTsKKyAgICAvLyBwcml2YXRlIFhtbE9iamVjdCBfcGFyc2VPYmplY3Q7IG5vdyBpbmhlcml0ZWQgZnJvbSBiYXNlCisgICAgcHJpdmF0ZSBTdHJpbmcgX3BhcnNlVE5TOworICAgIHByaXZhdGUgYm9vbGVhbiBfY2hhbWVsZW9uOworICAgIHByaXZhdGUgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgX3NnOworCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKKyAgICB7CisgICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZVN5c3RlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9maWxlbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICBfZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpbmFsKGJvb2xlYW4gZmluYWxFeHQsIGJvb2xlYW4gZmluYWxSZXN0KQorICAgIHsKKyAgICAgICAgbXV0YXRlKCk7IF9maW5hbEV4dCA9IGZpbmFsRXh0OyBfZmluYWxSZXN0ID0gZmluYWxSZXN0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9zZyA9PSBudWxsID8gbnVsbCA6IF9zZy5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJzdGl0dXRpb25Hcm91cChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBzZykgCisgICAgeworICAgICAgICBfc2cgPSBzZzsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWVbXSBzdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKF9zZ01lbWJlcnMuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfUU5BTUVfQVJSQVk7CisgICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkobmV3IFFOYW1lW19zZ01lbWJlcnMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIG11dGF0ZSgpOyBfc2dNZW1iZXJzLmFkZChuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsRXh0ZW5zaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZmluYWxFeHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmluYWxSZXN0cmljdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gX2ZpbmFsUmVzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRleHQoWG1sT2JqZWN0IHBhcnNlT2JqZWN0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikKKyAgICB7CisgICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OworICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCisgICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQorICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKKyAgICAgICAgeyByZXR1cm4gX2NoYW1lbGVvbiA/IF9wYXJzZVROUyA6IG51bGw7IH0KKworICAgIHByaXZhdGUgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYodGhpcyk7CisKKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZ2V0UmVmKCkKKyAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KKworICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCisgICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3MzM2NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGltcGxlbWVudHMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50Cit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIHByaXZhdGUgU3RyaW5nIF9zZWxlY3RvcjsKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9maWVsZHM7CisgICAgcHJpdmF0ZSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIF9rZXk7CisgICAgcHJpdmF0ZSBRTmFtZSBfbmFtZTsKKyAgICBwcml2YXRlIGludCBfdHlwZTsKKyAgICBwcml2YXRlIFhtbE9iamVjdCBfcGFyc2U7CisgICAgcHJpdmF0ZSBNYXAgX25zTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKKworICAgIC8vIExhemlseSBjb21wdXRlZCBwYXRocworICAgIHByaXZhdGUgdm9sYXRpbGUgWFBhdGggX3NlbGVjdG9yUGF0aDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFhQYXRoW10gX2ZpZWxkUGF0aHM7CisKKyAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbChTY2hlbWFUeXBlU3lzdGVtIHN5cykgeworICAgICAgICBfdHlwZVN5c3RlbSA9IHN5czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gX3NlbGVjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0b3JQYXRoKCkgeworICAgICAgICBYUGF0aCBwID0gX3NlbGVjdG9yUGF0aDsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWlsZFBhdGhzKCk7CisgICAgICAgICAgICAgICAgcCA9IF9zZWxlY3RvclBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJGYWlsZWQgdG8gY29tcGlsZSB4cGF0aC4gU2hvdWxkIGJlIGNhdWdodCBieSBjb21waWxlciAiICsgZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROU01hcChNYXAgbnNNYXApIHsKKyAgICAgICAgX25zTWFwID0gbnNNYXA7CisgICAgfQorCisgICAgcHVibGljIE1hcCBnZXROU01hcCgpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfbnNNYXApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9yKFN0cmluZyBzZWxlY3RvcikgeworICAgICAgICBhc3NlcnQgc2VsZWN0b3IgIT0gbnVsbDsKKyAgICAgICAgX3NlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRzKFN0cmluZ1tdIGZpZWxkcykgeworICAgICAgICBhc3NlcnQgZmllbGRzICE9IG51bGwgJiYgZmllbGRzLmxlbmd0aCA+IDA7CisgICAgICAgIF9maWVsZHMgPSBmaWVsZHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEZpZWxkcygpIHsKKyAgICAgICAgU3RyaW5nW10gZmllbGRzID0gbmV3IFN0cmluZ1tfZmllbGRzLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2ZpZWxkcywgMCwgZmllbGRzLCAwLCBmaWVsZHMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkUGF0aChpbnQgaW5kZXgpIHsKKyAgICAgICAgWFBhdGhbXSBwID0gX2ZpZWxkUGF0aHM7CisgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnVpbGRQYXRocygpOworICAgICAgICAgICAgICAgIHAgPSBfZmllbGRQYXRoczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYUGF0aC5YUGF0aENvbXBpbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIkZhaWxlZCB0byBjb21waWxlIHhwYXRoLiBTaG91bGQgYmUgY2F1Z2h0IGJ5IGNvbXBpbGVyICIgKyBlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZFBhdGhzKCkgdGhyb3dzIFhQYXRoLlhQYXRoQ29tcGlsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IE5lZWQgdGhlIG5hbWVzcGFjZSBtYXAgLSByZXF1aXJlcyBzdG9yZSBzdXBwb3J0CisgICAgICAgIF9zZWxlY3RvclBhdGggPSBYUGF0aC5jb21waWxlWFBhdGgoX3NlbGVjdG9yLCBfbnNNYXApOworCisgICAgICAgIF9maWVsZFBhdGhzID0gbmV3IFhQYXRoW19maWVsZHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgX2ZpZWxkUGF0aHMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgX2ZpZWxkUGF0aHNbaV0gPSBYUGF0aC5jb21waWxlWFBhdGgoX2ZpZWxkc1tpXSwgX25zTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkS2V5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYga2V5KSB7CisgICAgICAgIF9rZXkgPSBrZXk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBnZXRSZWZlcmVuY2VkS2V5KCkgeworICAgICAgICByZXR1cm4gX2tleS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50Q2F0ZWdvcnkoaW50IHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0IHR5cGUgPj0gQ0NfS0VZICYmIHR5cGUgPD0gQ0NfVU5JUVVFOworICAgICAgICBfdHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsKKyAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKyAgICAgICAgX25hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gX25hbWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb21wb25lbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gSURFTlRJVFlfQ09OU1RSQUlOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCkgeworICAgICAgICByZXR1cm4gX3R5cGVTeXN0ZW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VDb250ZXh0KFhtbE9iamVjdCBvLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbikgeworICAgICAgICBfcGFyc2UgPSBvOworICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIF9wYXJzZVROUzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpIHsKKyAgICAgICAgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogT25seSBhcHBsaWNhYmxlIHRvIGtleXJlZnMuIE90aGVyIHR5cGVzIGFyZSBpbXBsaWNpdGx5IHJlc29sdmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSAhPSBDQ19LRVlSRUYgfHwgX2tleSAhPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBfc2VsZnJlZiA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKHRoaXMpOworCisgICAgcHVibGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWYgZ2V0UmVmKCkKKyAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KKworICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCisgICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsQXR0cmlidXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNjZlNzUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSwgU2NoZW1hV1NETEFycmF5VHlwZQoreworICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYsIGludCB1c2UsIFN0cmluZyBkZWZ0ZXh0LCBYbWxPYmplY3QgcGFyc2VPYmplY3QsIFhtbFZhbHVlUmVmIGRlZnZhbHVlLCBib29sZWFuIGlzRml4ZWQsIFNPQVBBcnJheVR5cGUgd3NkbEFycmF5KQorICAgIHsKKyAgICAgICAgaWYgKF94bWxOYW1lICE9IG51bGwgfHwgX3R5cGVyZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgX3VzZSA9IHVzZTsKKyAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOworICAgICAgICBfZGVmYXVsdFRleHQgPSBkZWZ0ZXh0OworICAgICAgICBfcGFyc2VPYmplY3QgPSBwYXJzZU9iamVjdDsKKyAgICAgICAgX2RlZmF1bHRWYWx1ZSA9IGRlZnZhbHVlOworICAgICAgICBfaXNEZWZhdWx0ID0gKGRlZnRleHQgIT0gbnVsbCk7CisgICAgICAgIF9pc0ZpeGVkID0gaXNGaXhlZDsKKyAgICAgICAgX3htbE5hbWUgPSBuYW1lOworICAgICAgICBfd3NkbEFycmF5VHlwZSA9IHdzZGxBcnJheTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdFRleHQ7CisgICAgLyogcGFja2FnZSAqLyBYbWxWYWx1ZVJlZiBfZGVmYXVsdFZhbHVlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNGaXhlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzRGVmYXVsdDsKKyAgICBwcml2YXRlIFFOYW1lIF94bWxOYW1lOworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7CisgICAgcHJpdmF0ZSBTT0FQQXJyYXlUeXBlIF93c2RsQXJyYXlUeXBlOworICAgIHByaXZhdGUgaW50IF91c2U7CisgICAgcHJvdGVjdGVkIFhtbE9iamVjdCBfcGFyc2VPYmplY3Q7IC8vIGZvciBRTmFtZSByZXNvbHV0aW9uCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVSZXNvbHZlZCgpCisgICAgeworICAgICAgICByZXR1cm4gKF90eXBlcmVmICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCisgICAgeworICAgICAgICBpZiAoX3R5cGVyZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3R5cGVyZWYgPSB0eXBlcmVmOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VXNlKCkKKyAgICAgICAgeyByZXR1cm4gX3VzZTsgfQorCisgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQorICAgICAgICB7IHJldHVybiBfeG1sTmFtZTsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpCisgICAgICAgIHsgcmV0dXJuIF9kZWZhdWx0VGV4dDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkKKyAgICAgICAgeyByZXR1cm4gX2lzRGVmYXVsdDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZCgpCisgICAgICAgIHsgcmV0dXJuIF9pc0ZpeGVkOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZSgpCisgICAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldFR5cGUoKQorICAgICAgICB7IHJldHVybiBfdHlwZXJlZi5nZXQoKTsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGdldFR5cGVSZWYoKQorICAgICAgICB7IHJldHVybiBfdHlwZXJlZjsgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCkKKyAgICAgICAgeyByZXR1cm4gX3VzZSA9PSBSRVFVSVJFRCA/IEJpZ0ludGVnZXIuT05FIDogQmlnSW50ZWdlci5aRVJPOyB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKQorICAgICAgICB7IHJldHVybiBfdXNlID09IFBST0hJQklURUQgPyBCaWdJbnRlZ2VyLlpFUk8gOiBCaWdJbnRlZ2VyLk9ORTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCisgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBwdWJsaWMgU09BUEFycmF5VHlwZSBnZXRXU0RMQXJyYXlUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3dzZGxBcnJheVR5cGU7IH0KKyAgICAKKyAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKQorICAgIHsKKyAgICAgICAgaWYgKF9kZWZhdWx0VmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlLmdldCgpOworICAgICAgICBpZiAoX2RlZmF1bHRUZXh0ICE9IG51bGwgJiYgWG1sQW55U2ltcGxlVHlwZS50eXBlLmlzQXNzaWduYWJsZUZyb20oZ2V0VHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wYXJzZU9iamVjdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KF9wYXJzZU9iamVjdCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5uZXdWYWx1ZShfZGVmYXVsdFRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShYbWxWYWx1ZVJlZiBkZWZhdWx0UmVmKQorICAgICAgICB7IF9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0UmVmOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEVsZW1lbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFMb2NhbEVsZW1lbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNWZjMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYUxvY2FsRWxlbWVudEltcGwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNPQVBBcnJheVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zb2FwLlNjaGVtYVdTRExBcnJheVR5cGU7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGV4dGVuZHMgU2NoZW1hUGFydGljbGVJbXBsCisgICAgICAgIGltcGxlbWVudHMgU2NoZW1hTG9jYWxFbGVtZW50LCBTY2hlbWFXU0RMQXJyYXlUeXBlCit7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja0V4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrUmVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrU3Vic3Q7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX2FiczsKKyAgICBwcml2YXRlIFNPQVBBcnJheVR5cGUgX3dzZGxBcnJheVR5cGU7CisgICAgcHJpdmF0ZSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gX2NvbnN0cmFpbnRzID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbMF07CisKKworICAgIHB1YmxpYyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCkKKyAgICB7CisgICAgICAgIHNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gX2Jsb2NrRXh0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9ibG9ja1Jlc3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYmxvY2tTdWJzdGl0dXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9ibG9ja1N1YnN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9hYnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiBhYnMpCisgICAgeworICAgICAgICBfYWJzID0gYWJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsb2NrKGJvb2xlYW4gZXh0ZW5zaW9uLCBib29sZWFuIHJlc3RyaWN0aW9uLCBib29sZWFuIHN1YnN0aXR1dGlvbikKKyAgICB7CisgICAgICAgIG11dGF0ZSgpOworICAgICAgICBfYmxvY2tFeHQgPSBleHRlbnNpb247CisgICAgICAgIF9ibG9ja1Jlc3QgPSByZXN0cmljdGlvbjsKKyAgICAgICAgX2Jsb2NrU3Vic3QgPSBzdWJzdGl0dXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3NkbEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIGFycmF5VHlwZSkKKyAgICB7CisgICAgICAgIF93c2RsQXJyYXlUeXBlID0gYXJyYXlUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF93c2RsQXJyYXlUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkZW50aXR5Q29uc3RyYWludHMoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGNvbnN0cmFpbnRzKSB7CisgICAgICAgIG11dGF0ZSgpOworICAgICAgICBfY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpIHsKKyAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtfY29uc3RyYWludHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgcmVzdWx0Lmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IF9jb25zdHJhaW50c1tpXS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltdIGdldElkZW50aXR5Q29uc3RyYWludFJlZnMoKSB7CisgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZltfY29uc3RyYWludHMubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfY29uc3RyYWludHMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFNb2RlbEdyb3VwSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIxYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hTW9kZWxHcm91cEltcGwuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFNb2RlbEdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitwdWJsaWMgY2xhc3MgU2NoZW1hTW9kZWxHcm91cEltcGwgaW1wbGVtZW50cyBTY2hlbWFNb2RlbEdyb3VwCit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIHByaXZhdGUgUU5hbWUgX25hbWU7CisgICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OworICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKKworICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0pCisgICAgeworICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSwgUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXModHlwZVN5c3RlbSk7CisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFFOYW1lIG5hbWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbiwgWG1sT2JqZWN0IHgpCisgICAgeworICAgICAgICBhc3NlcnQgX25hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscyggX25hbWUgKTsKKyAgICAgICAgCisgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgX3BhcnNlVE5TID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICBfY2hhbWVsZW9uID0gY2hhbWVsZW9uOworICAgICAgICBfcmVkZWZpbml0aW9uID0gcmVkZWZpbml0aW9uOworICAgICAgICBfcGFyc2VPYmplY3QgPSB4OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF90eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDsgfQorCisgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKQorICAgICAgICB7IHJldHVybiBfbmFtZTsgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCisgICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQorICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkKKyAgICAgICAgeyByZXR1cm4gX2NoYW1lbGVvbiA/IF9wYXJzZVROUyA6IG51bGw7IH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCisgICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KKworICAgIHByaXZhdGUgU2NoZW1hTW9kZWxHcm91cC5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hTW9kZWxHcm91cC5SZWYodGhpcyk7CisgICAgCisgICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGdldFJlZigpCisgICAgICAgIHsgcmV0dXJuIF9zZWxmcmVmOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hQ29tcG9uZW50LlJlZiBnZXRDb21wb25lbnRSZWYoKQorICAgICAgICB7IHJldHVybiBnZXRSZWYoKTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQYXJ0aWNsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y2ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hUGFydGljbGVJbXBsLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGNsYXNzIFNjaGVtYVBhcnRpY2xlSW1wbCBpbXBsZW1lbnRzIFNjaGVtYVBhcnRpY2xlCit7CisgICAgcHJpdmF0ZSBpbnQgX3BhcnRpY2xlVHlwZTsKKyAgICBwcml2YXRlIEJpZ0ludGVnZXIgX21pbk9jY3VyczsKKyAgICBwcml2YXRlIEJpZ0ludGVnZXIgX21heE9jY3VyczsKKyAgICBwcml2YXRlIFNjaGVtYVBhcnRpY2xlW10gX3BhcnRpY2xlQ2hpbGRyZW47CisgICAgcHJpdmF0ZSBib29sZWFuIF9pc0ltbXV0YWJsZTsKKyAgICBwcml2YXRlIFFOYW1lU2V0IF9zdGFydFNldDsKKyAgICBwcml2YXRlIFFOYW1lU2V0IF9leGNsdWRlTmV4dFNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzU2tpcHBhYmxlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNEZXRlcm1pbmlzdGljOworICAgIHByaXZhdGUgaW50IF9pbnRNaW5PY2N1cnM7CisgICAgcHJpdmF0ZSBpbnQgX2ludE1heE9jY3VyczsKKyAgICBwcml2YXRlIFFOYW1lU2V0IF93aWxkY2FyZFNldDsKKyAgICBwcml2YXRlIGludCBfd2lsZGNhcmRQcm9jZXNzOworICAgIHByaXZhdGUgU3RyaW5nIF9kZWZhdWx0VGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzRGVmYXVsdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzRml4ZWQ7CisgICAgcHJpdmF0ZSBRTmFtZSBfcU5hbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pc05pbGxhYmxlOworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7CisgICAgcHJvdGVjdGVkIFhtbE9iamVjdCBfcGFyc2VPYmplY3Q7CisgICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZiBfZGVmYXVsdFZhbHVlOworCisgICAgcHJvdGVjdGVkIHZvaWQgbXV0YXRlKCkKKyAgICAgICAgeyBpZiAoX2lzSW1tdXRhYmxlKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltbXV0YWJsZSgpCisgICAgICAgIHsgbXV0YXRlKCk7IF9pc0ltbXV0YWJsZSA9IHRydWU7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1RyYW5zaXRpb25SdWxlcygpCisgICAgICAgIHsgcmV0dXJuIChfc3RhcnRTZXQgIT0gbnVsbCk7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1RyYW5zaXRpb25Ob3RlcygpCisgICAgICAgIHsgcmV0dXJuIChfZXhjbHVkZU5leHRTZXQgIT0gbnVsbCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zaXRpb25SdWxlcyhRTmFtZVNldCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NraXBwYWJsZSkKKyAgICB7CisgICAgICAgIF9zdGFydFNldCA9IHN0YXJ0OworICAgICAgICBfaXNTa2lwcGFibGUgPSBpc1NraXBwYWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2l0aW9uTm90ZXMoUU5hbWVTZXQgZXhjbHVkZU5leHQsIGJvb2xlYW4gaXNEZXRlcm1pbmlzdGljKQorICAgIHsKKyAgICAgICAgX2V4Y2x1ZGVOZXh0U2V0ID0gZXhjbHVkZU5leHQ7CisgICAgICAgIF9pc0RldGVybWluaXN0aWMgPSBpc0RldGVybWluaXN0aWM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuU3RhcnRXaXRoRWxlbWVudChRTmFtZSBuYW1lKQorICAgICAgICB7IHJldHVybiBuYW1lICE9IG51bGwgJiYgX3N0YXJ0U2V0LmNvbnRhaW5zKG5hbWUpOyB9CisKKyAgICBwdWJsaWMgUU5hbWVTZXQgYWNjZXB0ZWRTdGFydE5hbWVzKCkKKyAgICAgICAgeyByZXR1cm4gX3N0YXJ0U2V0OyB9CisKKyAgICBwdWJsaWMgUU5hbWVTZXQgZ2V0RXhjbHVkZU5leHRTZXQoKQorICAgICAgICB7IHJldHVybiBfZXhjbHVkZU5leHRTZXQ7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcHBhYmxlKCkKKyAgICAgICAgeyByZXR1cm4gX2lzU2tpcHBhYmxlOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RldGVybWluaXN0aWMoKQorICAgICAgICB7IHJldHVybiBfaXNEZXRlcm1pbmlzdGljOyB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcnRpY2xlVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9wYXJ0aWNsZVR5cGU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpY2xlVHlwZShpbnQgcFR5cGUpCisgICAgICAgIHsgbXV0YXRlKCk7IF9wYXJ0aWNsZVR5cGUgPSBwVHlwZTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaW5nbGV0b24oKQorICAgICAgICB7IHJldHVybiBfbWF4T2NjdXJzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgX21heE9jY3Vycy5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgX21pbk9jY3Vycy5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDA7IH0KKworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pbk9jY3VycygpCisgICAgICAgIHsgcmV0dXJuIF9taW5PY2N1cnM7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VycyhCaWdJbnRlZ2VyIG1pbikKKyAgICAgICAgeyBtdXRhdGUoKTsgX21pbk9jY3VycyA9IG1pbjsgX2ludE1pbk9jY3VycyA9IHBlZ0JpZ0ludGVnZXIobWluKTsgfQorCisgICAgcHVibGljIGludCBnZXRJbnRNaW5PY2N1cnMoKQorICAgICAgICB7IHJldHVybiBfaW50TWluT2NjdXJzOyB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhPY2N1cnMoKQorICAgICAgICB7IHJldHVybiBfbWF4T2NjdXJzOyB9CisKKyAgICBwdWJsaWMgaW50IGdldEludE1heE9jY3VycygpCisgICAgICAgIHsgcmV0dXJuIF9pbnRNYXhPY2N1cnM7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhCaWdJbnRlZ2VyIG1heCkKKyAgICAgICAgeyBtdXRhdGUoKTsgX21heE9jY3VycyA9IG1heDsgX2ludE1heE9jY3VycyA9IHBlZ0JpZ0ludGVnZXIobWF4KTsgfQorCisgICAgcHVibGljIFNjaGVtYVBhcnRpY2xlW10gZ2V0UGFydGljbGVDaGlsZHJlbigpCisgICAgeworICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFQYXJ0aWNsZVtfcGFydGljbGVDaGlsZHJlbi5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9wYXJ0aWNsZUNoaWxkcmVuLCAwLCByZXN1bHQsIDAsIF9wYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFydGljbGVDaGlsZHJlbihTY2hlbWFQYXJ0aWNsZVtdIGNoaWxkcmVuKQorICAgICAgICB7IG11dGF0ZSgpOyBfcGFydGljbGVDaGlsZHJlbiA9IGNoaWxkcmVuOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hUGFydGljbGUgZ2V0UGFydGljbGVDaGlsZChpbnQgaSkKKyAgICAgICAgeyByZXR1cm4gX3BhcnRpY2xlQ2hpbGRyZW5baV07IH0KKworICAgIHB1YmxpYyBpbnQgY291bnRPZlBhcnRpY2xlQ2hpbGQoKQorICAgICAgICB7IHJldHVybiBfcGFydGljbGVDaGlsZHJlbiA9PSBudWxsID8gMCA6IF9wYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0V2lsZGNhcmRTZXQoUU5hbWVTZXQgc2V0KQorICAgICAgICB7IG11dGF0ZSgpOyBfd2lsZGNhcmRTZXQgPSBzZXQ7IH0KKworICAgIHB1YmxpYyBRTmFtZVNldCBnZXRXaWxkY2FyZFNldCgpCisgICAgICAgIHsgcmV0dXJuIF93aWxkY2FyZFNldDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0V2lsZGNhcmRQcm9jZXNzKGludCBwcm9jZXNzKQorICAgICAgICB7IG11dGF0ZSgpOyBfd2lsZGNhcmRQcm9jZXNzID0gcHJvY2VzczsgfQorCisgICAgcHVibGljIGludCBnZXRXaWxkY2FyZFByb2Nlc3MoKQorICAgICAgICB7IHJldHVybiBfd2lsZGNhcmRQcm9jZXNzOyB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXhpbnQgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHBlZ0JpZ0ludGVnZXIoQmlnSW50ZWdlciBiaSkKKyAgICB7CisgICAgICAgIGlmIChiaSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBpZiAoYmkuc2lnbnVtKCkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoYmkuY29tcGFyZVRvKF9tYXhpbnQpID49IDApCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIHJldHVybiBiaS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkKKyAgICAgICAgeyByZXR1cm4gX3FOYW1lOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lQW5kVHlwZVJlZihRTmFtZSBmb3JtbmFtZSwgU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKKyAgICAgICAgeyBtdXRhdGUoKTsgX3FOYW1lID0gZm9ybW5hbWU7IF90eXBlcmVmID0gdHlwZXJlZjsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlUmVzb2x2ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChfdHlwZXJlZiAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQorICAgIHsKKyAgICAgICAgaWYgKF90eXBlcmVmICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF90eXBlcmVmID0gdHlwZXJlZjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZSgpCisgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRUeXBlKCkKKyAgICAgICAgeyBpZiAoX3R5cGVyZWYgPT0gbnVsbCkgcmV0dXJuIG51bGw7IHJldHVybiBfdHlwZXJlZi5nZXQoKTsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpCisgICAgICAgIHsgcmV0dXJuIF9kZWZhdWx0VGV4dDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkKKyAgICAgICAgeyByZXR1cm4gX2lzRGVmYXVsdDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZCgpCisgICAgICAgIHsgcmV0dXJuIF9pc0ZpeGVkOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBkZWZ0ZXh0LCBib29sZWFuIGlzRml4ZWQsIFhtbE9iamVjdCBwYXJzZU9iamVjdCkKKyAgICB7CisgICAgICAgIG11dGF0ZSgpOworICAgICAgICBfZGVmYXVsdFRleHQgPSBkZWZ0ZXh0OworICAgICAgICBfaXNEZWZhdWx0ID0gKGRlZnRleHQgIT0gbnVsbCk7CisgICAgICAgIF9pc0ZpeGVkID0gaXNGaXhlZDsKKyAgICAgICAgX3BhcnNlT2JqZWN0ID0gcGFyc2VPYmplY3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCisgICAgICAgIHsgcmV0dXJuIF9pc05pbGxhYmxlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShib29sZWFuIG5pbGxhYmxlKQorICAgICAgICB7IG11dGF0ZSgpOyBfaXNOaWxsYWJsZSA9IG5pbGxhYmxlOyB9CisKKyAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKQorICAgIHsKKyAgICAgICAgaWYgKF9kZWZhdWx0VmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlLmdldCgpOworICAgICAgICBpZiAoX2RlZmF1bHRUZXh0ICE9IG51bGwgJiYgWG1sQW55U2ltcGxlVHlwZS50eXBlLmlzQXNzaWduYWJsZUZyb20oZ2V0VHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9wYXJzZU9iamVjdCAhPSBudWxsICYmIFhtbFFOYW1lLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShnZXRUeXBlKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KF9wYXJzZU9iamVjdCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZSgpLm5ld1ZhbHVlKF9kZWZhdWx0VGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5uZXdWYWx1ZShfZGVmYXVsdFRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoWG1sVmFsdWVSZWYgZGVmYXVsdFJlZikKKyAgICB7CisgICAgICAgIG11dGF0ZSgpOworICAgICAgICBfZGVmYXVsdFZhbHVlID0gZGVmYXVsdFJlZjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQcm9wZXJ0eUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVByb3BlcnR5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjJjZDgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFQcm9wZXJ0eUltcGwuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VDb250ZXh0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFQcm9wZXJ0eUltcGwgaW1wbGVtZW50cyBTY2hlbWFQcm9wZXJ0eQoreworICAgIHByaXZhdGUgUU5hbWUgX25hbWU7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfdHlwZXJlZjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzQXR0cmlidXRlOworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2NvbnRhaW5lclR5cGVSZWY7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2phdmFQcm9wZXJ0eU5hbWU7CisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9taW5PY2N1cnM7CisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF9tYXhPY2N1cnM7CisgICAgcHJpdmF0ZSBpbnQgX2hhc05pbGxhYmxlOworICAgIHByaXZhdGUgaW50IF9oYXNEZWZhdWx0OworICAgIHByaXZhdGUgaW50IF9oYXNGaXhlZDsKKyAgICBwcml2YXRlIFN0cmluZyBfZGVmYXVsdFRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pc0ltbXV0YWJsZTsKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9qYXZhQmFzZWRPblR5cGVSZWY7CisgICAgcHJpdmF0ZSBib29sZWFuIF9leHRlbmRzU2luZ2xldG9uOworICAgIHByaXZhdGUgYm9vbGVhbiBfZXh0ZW5kc0FycmF5OworICAgIHByaXZhdGUgYm9vbGVhbiBfZXh0ZW5kc09wdGlvbjsKKyAgICBwcml2YXRlIGludCBfamF2YVR5cGVDb2RlOworICAgIHByaXZhdGUgUU5hbWVTZXQgX2phdmFTZXR0ZXJEZWxpbWl0ZXI7CisgICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZiBfZGVmYXVsdFZhbHVlOworICAgIHByaXZhdGUgU2V0IF9hY2NlcHRlZE5hbWVzOworCisgICAgcHJpdmF0ZSB2b2lkIG11dGF0ZSgpCisgICAgICAgIHsgaWYgKF9pc0ltbXV0YWJsZSkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbW11dGFibGUoKQorICAgICAgICB7IG11dGF0ZSgpOyBfaXNJbW11dGFibGUgPSB0cnVlOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRDb250YWluZXJUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX2NvbnRhaW5lclR5cGVSZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lclR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKKyAgICAgICAgeyBtdXRhdGUoKTsgX2NvbnRhaW5lclR5cGVSZWYgPSB0eXBlcmVmOyB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCisgICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpCisgICAgICAgIHsgbXV0YXRlKCk7IF9uYW1lID0gbmFtZTsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhUHJvcGVydHlOYW1lKCkKKyAgICAgICAgeyByZXR1cm4gX2phdmFQcm9wZXJ0eU5hbWU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEphdmFQcm9wZXJ0eU5hbWUoU3RyaW5nIG5hbWUpCisgICAgICAgIHsgbXV0YXRlKCk7IF9qYXZhUHJvcGVydHlOYW1lID0gbmFtZTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKQorICAgICAgICB7IHJldHVybiBfaXNBdHRyaWJ1dGU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShib29sZWFuIGlzQXR0cmlidXRlKQorICAgICAgICB7IG11dGF0ZSgpOyBfaXNBdHRyaWJ1dGUgPSBpc0F0dHJpYnV0ZTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCisgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3R5cGVyZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKKyAgICAgICAgeyBtdXRhdGUoKTsgX3R5cGVyZWYgPSB0eXBlcmVmOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUoKQorICAgICAgICB7IHJldHVybiBfamF2YUJhc2VkT25UeXBlUmVmLmdldCgpOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmRzSmF2YVNpbmdsZXRvbigpCisgICAgICAgIHsgcmV0dXJuIF9leHRlbmRzU2luZ2xldG9uOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmRzSmF2YUFycmF5KCkKKyAgICAgICAgeyByZXR1cm4gX2V4dGVuZHNBcnJheTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXh0ZW5kc0phdmFPcHRpb24oKQorICAgICAgICB7IHJldHVybiBfZXh0ZW5kc09wdGlvbjsgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5kc0phdmEoU2NoZW1hVHlwZS5SZWYgamF2YUJhc2VkT25UeXBlUmVmLCBib29sZWFuIHNpbmdsZXRvbiwgYm9vbGVhbiBvcHRpb24sIGJvb2xlYW4gYXJyYXkpCisgICAgeworICAgICAgICBtdXRhdGUoKTsKKyAgICAgICAgX2phdmFCYXNlZE9uVHlwZVJlZiA9IGphdmFCYXNlZE9uVHlwZVJlZjsKKyAgICAgICAgX2V4dGVuZHNTaW5nbGV0b24gPSBzaW5nbGV0b247CisgICAgICAgIF9leHRlbmRzT3B0aW9uID0gb3B0aW9uOworICAgICAgICBfZXh0ZW5kc0FycmF5ID0gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lU2V0IGdldEphdmFTZXR0ZXJEZWxpbWl0ZXIoKQorICAgICAgICB7IHJldHVybiBfamF2YVNldHRlckRlbGltaXRlciA9PSBudWxsID8gUU5hbWVTZXQuRU1QVFkgOiBfamF2YVNldHRlckRlbGltaXRlcjsgfQorCisgICAgcHVibGljIHZvaWQgc2V0SmF2YVNldHRlckRlbGltaXRlcihRTmFtZVNldCBzZXQpCisgICAgICAgIHsgbXV0YXRlKCk7IF9qYXZhU2V0dGVyRGVsaW1pdGVyID0gc2V0OyB9CisKKyAgICBwdWJsaWMgUU5hbWVbXSBhY2NlcHRlZE5hbWVzKCkKKyAgICB7IAorICAgICAgICBpZiAoX2FjY2VwdGVkTmFtZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWVbXSB7IF9uYW1lIH07CisKKyAgICAgICAgcmV0dXJuIChRTmFtZVtdKV9hY2NlcHRlZE5hbWVzLnRvQXJyYXkobmV3IFFOYW1lW19hY2NlcHRlZE5hbWVzLnNpemUoKV0pOyAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRlZE5hbWVzKFNldCBzZXQpCisgICAgeworICAgICAgICBtdXRhdGUoKTsgCisgICAgICAgIF9hY2NlcHRlZE5hbWVzID0gc2V0OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRlZE5hbWVzKFFOYW1lU2V0IHNldCkKKyAgICB7IAorICAgICAgICBtdXRhdGUoKTsgCisgICAgICAgIF9hY2NlcHRlZE5hbWVzID0gc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRNaW5PY2N1cnMoKQorICAgICAgICB7IHJldHVybiBfbWluT2NjdXJzOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoQmlnSW50ZWdlciBtaW4pCisgICAgICAgIHsgbXV0YXRlKCk7IF9taW5PY2N1cnMgPSBtaW47IH0KKworICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpCisgICAgICAgIHsgcmV0dXJuIF9tYXhPY2N1cnM7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhCaWdJbnRlZ2VyIG1heCkKKyAgICAgICAgeyBtdXRhdGUoKTsgX21heE9jY3VycyA9IG1heDsgfQorCisgICAgcHVibGljIGludCBoYXNOaWxsYWJsZSgpCisgICAgICAgIHsgcmV0dXJuIF9oYXNOaWxsYWJsZTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoaW50IHdoZW4pCisgICAgICAgIHsgbXV0YXRlKCk7IF9oYXNOaWxsYWJsZSA9IHdoZW47IH0KKworICAgIHB1YmxpYyBpbnQgaGFzRGVmYXVsdCgpCisgICAgICAgIHsgcmV0dXJuIF9oYXNEZWZhdWx0OyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGludCB3aGVuKQorICAgICAgICB7IG11dGF0ZSgpOyBfaGFzRGVmYXVsdCA9IHdoZW47IH0KKworICAgIHB1YmxpYyBpbnQgaGFzRml4ZWQoKQorICAgICAgICB7IHJldHVybiBfaGFzRml4ZWQ7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpeGVkKGludCB3aGVuKQorICAgICAgICB7IG11dGF0ZSgpOyBfaGFzRml4ZWQgPSB3aGVuOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUZXh0KCkKKyAgICAgICAgeyByZXR1cm4gX2RlZmF1bHRUZXh0OyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VGV4dChTdHJpbmcgdmFsKQorICAgICAgICB7IG11dGF0ZSgpOyBfZGVmYXVsdFRleHQgPSB2YWw7IH0KKworICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpCisgICAgeworICAgICAgICBpZiAoX2RlZmF1bHRWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWUuZ2V0KCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoWG1sVmFsdWVSZWYgZGVmYXVsdFJlZikKKyAgICB7CisgICAgICAgIG11dGF0ZSgpOworICAgICAgICBfZGVmYXVsdFZhbHVlID0gZGVmYXVsdFJlZjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEphdmFUeXBlQ29kZSgpCisgICAgICAgIHsgcmV0dXJuIF9qYXZhVHlwZUNvZGU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEphdmFUeXBlQ29kZShpbnQgY29kZSkKKyAgICAgICAgeyBtdXRhdGUoKTsgX2phdmFUeXBlQ29kZSA9IGNvZGU7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWMyYzcwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hU3RyaW5nRW51bUVudHJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKKworcHVibGljIGNsYXNzIFNjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwgaW1wbGVtZW50cyBTY2hlbWFTdHJpbmdFbnVtRW50cnkKK3sKKyAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nOworICAgIHByaXZhdGUgaW50IF9pbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2VudW1OYW1lOworCisgICAgcHVibGljIFNjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwoU3RyaW5nIHN0ciwgaW50IGksIFN0cmluZyBlbnVtTmFtZSkKKyAgICB7CisgICAgICAgIF9zdHJpbmcgPSBzdHI7CisgICAgICAgIF9pbnQgPSBpOworICAgICAgICBfZW51bU5hbWUgPSBlbnVtTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gX3N0cmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfaW50OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW51bU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9lbnVtTmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVDb2RlUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTQ3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlQ29kZVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDIyNTUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuSW50ZXJmYWNlRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuRXh0ZW5zaW9uSG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuUHJlUG9zdEV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKKy8qKgorICogUHJpbnRzIHRoZSBqYXZhIGNvZGUgZm9yIGEgc2luZ2xlIHNjaGVtYSB0eXBlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWFUeXBlQ29kZVByaW50ZXIKK3sKKyAgICBXcml0ZXIgX3dyaXRlcjsKKyAgICBpbnQgICAgX2luZGVudDsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPQorICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgPT0gbnVsbAorICAgICAgICAgICAgPyAiXG4iCisgICAgICAgICAgICA6IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NQQUNFUyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgICBzdGF0aWMgZmluYWwgaW50IElOREVOVF9JTkNSRU1FTlQgPSA0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfQ0xBU1NOQU1FID0gIlR5cGVTeXN0ZW1Ib2xkZXIiOworCisgICAgcHVibGljIFNjaGVtYVR5cGVDb2RlUHJpbnRlciAoIFdyaXRlciB3cml0ZXIgKQorICAgIHsKKyAgICAgICAgX3dyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgX2luZGVudCA9IDA7CisgICAgfQorCisgICAgdm9pZCBpbmRlbnQoKQorICAgIHsKKyAgICAgICAgX2luZGVudCArPSBJTkRFTlRfSU5DUkVNRU5UOworICAgIH0KKworICAgIHZvaWQgb3V0ZGVudCgpCisgICAgeworICAgICAgICBfaW5kZW50IC09IElOREVOVF9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgU3RyaW5nIGVuY29kZVN0cmluZyAoIFN0cmluZyBzICkKKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoICciJyApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzLmxlbmd0aCgpIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KCBpICk7CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnIicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXFwnICk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnXCInICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXFwnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xcJyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xyJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdyJyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICduJyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICdcXCcgKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICd0JyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCggJyInICk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgdm9pZCBlbWl0KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBpbmRlbnQgPSBfaW5kZW50OworICAgICAgICAKKyAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkgLyAyKQorICAgICAgICAgICAgaW5kZW50ID0gTUFYX1NQQUNFUy5sZW5ndGgoKSAvIDQgKyBpbmRlbnQgLyAyOworICAgICAgICAKKyAgICAgICAgaWYgKGluZGVudCA+IE1BWF9TUEFDRVMubGVuZ3RoKCkpCisgICAgICAgICAgICBpbmRlbnQgPSBNQVhfU1BBQ0VTLmxlbmd0aCgpOworICAgICAgICAKKyAgICAgICAgX3dyaXRlci53cml0ZShNQVhfU1BBQ0VTLnN1YnN0cmluZygwLCBpbmRlbnQpKTsKKyAgICAgICAgX3dyaXRlci53cml0ZShzKTsKKyAgICAgICAgX3dyaXRlci53cml0ZShMSU5FX1NFUEFSQVRPUik7CisgICAgICAgIAorICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50KE1BWF9TUEFDRVMuc3Vic3RyaW5nKDAsIGluZGVudCkpOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZUltcGwgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlIHNUeXBlICkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBuZXcgU2NoZW1hVHlwZUNvZGVQcmludGVyKCB3cml0ZXIgKS5wcmludFR5cGVJbXBsKCBzVHlwZSwgc1R5cGUuZ2V0VHlwZVN5c3RlbSgpICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VHlwZSAoIFdyaXRlciB3cml0ZXIsIFNjaGVtYVR5cGUgc1R5cGUgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG5ldyBTY2hlbWFUeXBlQ29kZVByaW50ZXIoIHdyaXRlciApLiBwcmludFR5cGUoIHNUeXBlLCBzVHlwZS5nZXRUeXBlU3lzdGVtKCkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRMb2FkZXIgKCBXcml0ZXIgd3JpdGVyLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbmV3IFNjaGVtYVR5cGVDb2RlUHJpbnRlciggd3JpdGVyICkucHJpbnRJbmRleFR5cGUoIHN5c3RlbSApOworICAgIH0KKworICAgIHZvaWQgcHJpbnRUeXBlKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByaW50VG9wQ29tbWVudChzVHlwZSk7CisgICAgICAgIHByaW50UGFja2FnZShzVHlwZSwgdHJ1ZSk7CisgICAgICAgIGVtaXQoIiIpOworICAgICAgICBwcmludElubmVyVHlwZShzVHlwZSwgc3lzdGVtKTsKKyAgICAgICAgX3dyaXRlci5mbHVzaCgpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRUeXBlSW1wbChTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmludFRvcENvbW1lbnQoc1R5cGUpOworICAgICAgICBwcmludFBhY2thZ2Uoc1R5cGUsIGZhbHNlKTsKKyAgICAgICAgcHJpbnRJbm5lclR5cGVJbXBsKHNUeXBlLCBzeXN0ZW0sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW5jZSBub3QgYWxsIHNjaGVtYSB0eXBlcyBoYXZlIGphdmEgdHlwZXMsIHRoaXMgc2tpcHMKKyAgICAgKiBvdmVyIGFueSB0aGF0IGRvbid0IGFuZCBnaXZlcyB5b3UgdGhlIG5lYXJlc3QgamF2YSBiYXNlIHR5cGUuCisgICAgICovCisgICAgU3RyaW5nIGZpbmRKYXZhVHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQorICAgIHsKKyAgICAgICAgd2hpbGUgKCBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsICkKKyAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHByZXR0eVFOYW1lKFFOYW1lIHFuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHFuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc3VsdCArPSAiKEAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiKSI7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBwcmludElubmVyVHlwZUphdmFEb2MoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBRTmFtZSBuYW1lID0gc1R5cGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc1R5cGUuaXNEb2N1bWVudFR5cGUoKSkKKyAgICAgICAgICAgICAgICBuYW1lID0gc1R5cGUuZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCisgICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzVHlwZS5nZXRDb250YWluZXJGaWVsZCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgbmFtZSA9IHNUeXBlLmdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgZW1pdCgiLyoqIik7CisgICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGVsZW1lbnQuIik7CisgICAgICAgIGVsc2UgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQorICAgICAgICAgICAgZW1pdCgiICogQSBkb2N1bWVudCBjb250YWluaW5nIG9uZSAiICsgcHJldHR5UU5hbWUobmFtZSkgKyAiIGF0dHJpYnV0ZS4iKTsKKyAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsKQorICAgICAgICAgICAgZW1pdCgiICogQW4gWE1MICIgKyBwcmV0dHlRTmFtZShuYW1lKSArICIuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXQoIiAqIEFuIGFub255bW91cyBpbm5lciBYTUwgdHlwZS4iKTsKKyAgICAgICAgZW1pdCgiICoiKTsKKyAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5OT1RfU0lNUExFOgorICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBjb21wbGV4IHR5cGUuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgorICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYW4gYXRvbWljIHR5cGUgdGhhdCBpcyBhIHJlc3RyaWN0aW9uIG9mICIgKyBzVHlwZS5nZXRCYXNlVHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpICsgIi4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgorICAgICAgICAgICAgICAgIGVtaXQoIiAqIFRoaXMgaXMgYSBsaXN0IHR5cGUgd2hvc2UgaXRlbXMgYXJlICIgKyBzVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKSArICIuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgZW1pdCgiICogVGhpcyBpcyBhIHVuaW9uIHR5cGUuIEluc3RhbmNlcyBhcmUgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXM6Iik7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGVtaXQoIiAqICAgICAiICsgbWVtYmVyc1tpXS5nZXRGdWxsSmF2YU5hbWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW1pdCgiICovIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5kZXhDbGFzc0ZvclN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkKKyAgICB7CisgICAgICAgIFN0cmluZyBuYW1lID0gc3lzdGVtLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUgKyAiLiIgKyBJTkRFWF9DTEFTU05BTUU7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBzaG9ydEluZGV4Q2xhc3NGb3JTeXN0ZW0oU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pCisgICAgeworICAgICAgICByZXR1cm4gSU5ERVhfQ0xBU1NOQU1FOworICAgIH0KKworICAgIHZvaWQgcHJpbnRTdGF0aWNUeXBlRGVjbGFyYXRpb24oU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUgdHlwZSA9IChvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGUpIiArCisgICAgICAgICAgICAgICAgaW5kZXhDbGFzc0ZvclN5c3RlbShzeXN0ZW0pICsKKyAgICAgICAgICAgICAgICAiLnR5cGVTeXN0ZW0ucmVzb2x2ZUhhbmRsZShcIiIgKworICAgICAgICAgICAgICAgICgoU2NoZW1hVHlwZVN5c3RlbUltcGwpc3lzdGVtKS5oYW5kbGVGb3JUeXBlKHNUeXBlKSArICJcIik7Iik7CisgICAgfQorCisgICAgdm9pZCBwcmludEluZGV4VHlwZShTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc2hvcnRJbmRleENsYXNzRm9yU3lzdGVtKHN5c3RlbSk7CisgICAgICAgIGVtaXQoInBhY2thZ2UgIiArIHN5c3RlbS5nZXROYW1lKCkgKyAiOyIpOworICAgICAgICBlbWl0KCIiKTsKKyAgICAgICAgZW1pdCgicHVibGljIGZpbmFsIGNsYXNzICIgKyBzaG9ydE5hbWUpOworICAgICAgICBlbWl0KCJ7Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBlbWl0KCJwcml2YXRlICIgKyBzaG9ydE5hbWUgKyAiKCkgeyB9Iik7CisgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0gPSBsb2FkVHlwZVN5c3RlbSgpOyIpOworICAgICAgICBlbWl0KCJzdGF0aWMgeyB0eXBlU3lzdGVtLnJlc29sdmUoKTsgfSIpOworICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW0gbG9hZFR5cGVTeXN0ZW0oKSIpOworICAgICAgICBlbWl0KCJ7Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBlbWl0KCJ0cnkgeyByZXR1cm4gKG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbSlDbGFzcy5mb3JOYW1lKFwib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlU3lzdGVtSW1wbFwiLCB0cnVlLCAiICsgc2hvcnROYW1lICsgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IENsYXNzLmNsYXNzIH0pLm5ld0luc3RhbmNlKG5ldyBqYXZhLmxhbmcuT2JqZWN0W10geyAiICsgc2hvcnROYW1lICsgIi5jbGFzcyB9KTsgfSIpOworICAgICAgICBlbWl0KCJjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGxvYWQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLlNjaGVtYVR5cGVTeXN0ZW1JbXBsOiBtYWtlIHN1cmUgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGguXCIsIGUpOyB9Iik7CisgICAgICAgIGVtaXQoImNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBTY2hlbWFUeXBlU3lzdGVtSW1wbCAoXCIgKyBlLnRvU3RyaW5nKCkgKyBcIik6IGlzIHRoZSB2ZXJzaW9uIG9mIHhiZWFuLmphciBjb3JyZWN0P1wiLCBlKTsgfSIpOworICAgICAgICBvdXRkZW50KCk7CisgICAgICAgIGVtaXQoIn0iKTsKKyAgICAgICAgb3V0ZGVudCgpOworICAgICAgICBlbWl0KCJ9Iik7CisgICAgfQorCisgICAgdm9pZCBwcmludElubmVyVHlwZShTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBlbWl0KCIiKTsKKworICAgICAgICBwcmludElubmVyVHlwZUphdmFEb2Moc1R5cGUpOworCisgICAgICAgIHN0YXJ0SW50ZXJmYWNlKHNUeXBlKTsKKyAgICAgICAgCisgICAgICAgIHByaW50U3RhdGljVHlwZURlY2xhcmF0aW9uKHNUeXBlLCBzeXN0ZW0pOworCisgICAgICAgIGlmIChzVHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBwcmludFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcHMgPSBzVHlwZS5nZXREZXJpdmVkUHJvcGVydGllcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcHJvcHNbaV07CisKKyAgICAgICAgICAgICAgICBwcmludFByb3BlcnR5R2V0dGVycygKKyAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCisgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCisgICAgICAgICAgICAgICAgICAgIHhtbFR5cGVGb3JQcm9wZXJ0eShwcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAorICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFBcnJheSgpLAorICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzUmVhZE9ubHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50UHJvcGVydHlTZXR0ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVR5cGVDb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5KHByb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpbnROZXN0ZWRJbm5lclR5cGVzKHNUeXBlLCBzeXN0ZW0pOworCisgICAgICAgIHByaW50RmFjdG9yeShzVHlwZSk7CisKKyAgICAgICAgZW5kQmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50RmFjdG9yeShTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE9ubHkgbmVlZCBmdWxsIGZhY3RvcmllcyBmb3IgdG9wLWxldmVsIHR5cGVzCisgICAgICAgIGJvb2xlYW4gZnVsbEZhY3RvcnkgPSB0cnVlOworICAgICAgICBpZiAoc1R5cGUuaXNBbm9ueW1vdXNUeXBlKCkgJiYgISBzVHlwZS5pc0RvY3VtZW50VHlwZSgpICYmICFzVHlwZS5pc0F0dHJpYnV0ZVR5cGUoKSkKKyAgICAgICAgICAgIGZ1bGxGYWN0b3J5ID0gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisKKyAgICAgICAgZW1pdCgiIik7CisgICAgICAgIGVtaXQoIi8qKiIpOworICAgICAgICBlbWl0KCIgKiBBIGZhY3RvcnkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIik7CisgICAgICAgIGVtaXQoIiAqIG9mIHRoaXMgdHlwZS4iKTsKKyAgICAgICAgZW1pdCgiICovIik7CisgICAgICAgIGVtaXQoIiIpOworICAgICAgICAvLyBCVUdCVUcgLSBDYW4gSSB1c2UgdGhlIG5hbWUgbG9hZGVyIGhlcmU/ICBjb3VsZCBpdCBiZSBhCisgICAgICAgIC8vIG5lc3RlZCB0eXBlIG5hbWU/ICBJdCBpcyBsb3dlciBjYXNlIQorICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkiKTsKKyAgICAgICAgZW1pdCgieyIpOworICAgICAgICBpbmRlbnQoKTsKKworICAgICAgICBpZiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG9iaikgeyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9Iik7CisgICAgICAgICAgICBlbWl0KCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZSgpIHsiKTsKKyAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9Iik7CisgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeyIpOworICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0iKTsKKyAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgaWYgKGZ1bGxGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9Iik7CisgICAgICAgICAgICBlbWl0KCIiKTsKKworICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7CisgICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7CisgICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9Iik7CisgICAgICAgICAgICBlbWl0KCIiKTsKKworICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9Iik7CisgICAgICAgICAgICBlbWl0KCIiKTsKKworICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyAiICsgZnVsbE5hbWUgKyAiIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7Iik7CisgICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgcmV0dXJuICgiICsgZnVsbE5hbWUgKyAiKSBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgIiArIGZ1bGxOYW1lICsgIiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gKCIgKyBmdWxsTmFtZSArICIpIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljICIgKyBmdWxsTmFtZSArICIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7CisgICAgICAgICAgICBlbWl0KCIgIHJldHVybiAoIiArIGZ1bGxOYW1lICsgIikgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geyIpOworICAgICAgICAgICAgZW1pdCgiICByZXR1cm4gb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIiIpOworCisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Iik7CisgICAgICAgICAgICBlbWl0KCIgIHJldHVybiBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisgICAgICAgIH0KKworICAgICAgICBlbWl0KCJwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkIik7CisgICAgICAgIG91dGRlbnQoKTsKKyAgICAgICAgZW1pdCgifSIpOworICAgIH0KKworICAgIHZvaWQgcHJpbnROZXN0ZWRJbm5lclR5cGVzKFNjaGVtYVR5cGUgc1R5cGUsIFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVbXSBhbm9uVHlwZXMgPSBzVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFub25UeXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFub25UeXBlc1tpXS5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCisgICAgICAgICAgICAgICAgcHJpbnROZXN0ZWRJbm5lclR5cGVzKGFub25UeXBlc1tpXSwgc3lzdGVtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludElubmVyVHlwZShhbm9uVHlwZXNbaV0sIHN5c3RlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50VG9wQ29tbWVudChTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVtaXQoIi8qIik7CisgICAgICAgIGlmIChzVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgiICogWE1MIFR5cGU6ICAiICsgc1R5cGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgIGVtaXQoIiAqIE5hbWVzcGFjZTogIiArIHNUeXBlLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSB0aGVuYW1lID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHNUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhlbmFtZSA9IHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgKiBBbiBYTUwgZG9jdW1lbnQgdHlwZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoZW5hbWUgPSBzVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpOworICAgICAgICAgICAgICAgIGVtaXQoIiAqIEFuIFhNTCBhdHRyaWJ1dGUgdHlwZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisKKyAgICAgICAgICAgIGFzc2VydCggdGhlbmFtZSAhPSBudWxsICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVtaXQoIiAqIExvY2FsbmFtZTogIiArIHRoZW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOworICAgICAgICAgICAgZW1pdCgiICogTmFtZXNwYWNlOiAiICsgdGhlbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZW1pdCgiICogSmF2YSB0eXBlOiAiICsgc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkpOworICAgICAgICBlbWl0KCIgKiIpOworICAgICAgICBlbWl0KCIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBtb2RpZnkuIik7CisgICAgICAgIGVtaXQoIiAqLyIpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRQYWNrYWdlKFNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gaW50ZikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgZnFqbjsKKyAgICAgICAgaWYgKGludGYpCisgICAgICAgICAgICBmcWpuID0gc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZxam4gPSBzVHlwZS5nZXRGdWxsSmF2YUltcGxOYW1lKCk7CisKKyAgICAgICAgaW50IGxhc3Rkb3QgPSBmcWpuLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChsYXN0ZG90IDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RyaW5nIHBrZyA9IGZxam4uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOworICAgICAgICBlbWl0KCJwYWNrYWdlICIgKyBwa2cgKyAiOyIpOworICAgIH0KKworICAgIHZvaWQgc3RhcnRJbnRlcmZhY2UoU2NoZW1hVHlwZSBzVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc1R5cGUuZ2V0U2hvcnRKYXZhTmFtZSgpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGJhc2VJbnRlcmZhY2UgPSBmaW5kSmF2YVR5cGUoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNwZWNpYWxpemVkSW50ZXJmYWNlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDICYmCisgICAgICAgICAgICBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJpdHMgPSBzVHlwZS5nZXREZWNpbWFsU2l6ZSgpOworICAgICAgICAgICAgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSKQorICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5CaWdJbnRlZ2VyVmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9MT05HKQorICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgb3JnLmFwYWNoZS54bWxiZWFucy5Mb25nVmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChiaXRzIDw9IFNjaGVtYVR5cGUuU0laRV9JTlQpCisgICAgICAgICAgICAgICAgc3BlY2lhbGl6ZWRJbnRlcmZhY2VzLmFwcGVuZCgiLCBvcmcuYXBhY2hlLnhtbGJlYW5zLkludFZhbHVlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCisgICAgICAgICAgICBzcGVjaWFsaXplZEludGVyZmFjZXMuYXBwZW5kKCIsIG9yZy5hcGFjaGUueG1sYmVhbnMuTGlzdFZhbHVlIik7CisKKyAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIGN0eXBlID0gc1R5cGUuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIGphdmFUeXBlSG9sZGVyID0gamF2YVR5cGVIb2xkZXJGb3JUeXBlKGN0eXBlKTsKKyAgICAgICAgICAgIGlmIChqYXZhVHlwZUhvbGRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNwZWNpYWxpemVkSW50ZXJmYWNlcy5hcHBlbmQoIiwgIiArIGphdmFUeXBlSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIGVtaXQoInB1YmxpYyBpbnRlcmZhY2UgIiArIHNob3J0TmFtZSArICIgZXh0ZW5kcyAiICsgYmFzZUludGVyZmFjZSArIGdldEV4dGVuc2lvbkludGVyZmFjZXMoc1R5cGUpICk7CisgICAgICAgIGVtaXQoInsiKTsKKyAgICAgICAgaW5kZW50KCk7CisgICAgICAgIGVtaXRTcGVjaWFsaXplZEFjY2Vzc29ycyhzVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEV4dGVuc2lvbkludGVyZmFjZXMoU2NoZW1hVHlwZSBzVHlwZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gZ2V0SW1wbChzVHlwZSk7CisgICAgICAgIGlmIChzSW1wbD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgRXh0ZW5zaW9uSG9sZGVyIGV4dEhvbGRlciA9IHNJbXBsLmdldEV4dGVuc2lvbkhvbGRlcigpOworICAgICAgICBpZiAoZXh0SG9sZGVyIT1udWxsKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0IGV4dHMgPSBleHRIb2xkZXIuZ2V0SW50ZXJmYWNlRXh0ZW5zaW9uc0ZvcihzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW50ZXJmYWNlRXh0ZW5zaW9uIGV4dCA9IChJbnRlcmZhY2VFeHRlbnNpb24paS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIgKyBleHQuZ2V0SW50ZXJmYWNlTmFtZUZvckphdmFTb3VyY2UoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIGdldEltcGwoU2NoZW1hVHlwZSBzVHlwZSkKKyAgICB7CisgICAgICAgIGlmIChzVHlwZSBpbnN0YW5jZW9mIFNjaGVtYVR5cGVJbXBsKQorICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlSW1wbClzVHlwZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRTcGVjaWFsaXplZEFjY2Vzc29ycyhTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUMgJiYKKyAgICAgICAgICAgIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYml0cyA9IHNUeXBlLmdldERlY2ltYWxTaXplKCk7CisgICAgICAgICAgICBpbnQgcGFyZW50Qml0cyA9IHNUeXBlLmdldEJhc2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKTsKKyAgICAgICAgICAgIGlmIChiaXRzICE9IHBhcmVudEJpdHMgfHwgc1R5cGUuZ2V0QmFzZVR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiaXRzID09IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoImphdmEubWF0aC5CaWdJbnRlZ2VyIGdldEJpZ0ludGVnZXJWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShqYXZhLm1hdGguQmlnSW50ZWdlciBiaSk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLm1hdGguQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0KGphdmEubWF0aC5CaWdJbnRlZ2VyIGJpKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfTE9ORykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoImxvbmcgZ2V0TG9uZ1ZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgbCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJsb25nIGxvbmdWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQobG9uZyBsKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfSU5UKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGdldEludFZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0SW50VmFsdWUoaW50IGkpOyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiaW50IGludFZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChpbnQgaSk7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPT0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgic2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJzaG9ydCBzaG9ydFZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChzaG9ydCBzKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA9PSBTY2hlbWFUeXBlLlNJWkVfQllURSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoImJ5dGUgZ2V0Qnl0ZVZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgYik7Iik7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJieXRlIGJ5dGVWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQoYnl0ZSBiKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQoImphdmEubGFuZy5PYmplY3QgZ2V0T2JqZWN0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0T2JqZWN0VmFsdWUoamF2YS5sYW5nLk9iamVjdCB2YWwpOyIpOworICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7CisgICAgICAgICAgICBlbWl0KCJqYXZhLmxhbmcuT2JqZWN0IG9iamVjdFZhbHVlKCk7Iik7CisgICAgICAgICAgICBlbWl0KCIvKiogQGRlcHJlY2F0ZWQgKi8iKTsKKyAgICAgICAgICAgIGVtaXQoInZvaWQgb2JqZWN0U2V0KGphdmEubGFuZy5PYmplY3QgdmFsKTsiKTsKKyAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKTsiKTsKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgY3R5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7CisgICAgICAgICAgICBpZiAoY3R5cGUgIT0gbnVsbCAmJiBjdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTik7CisgICAgICAgICAgICAgICAgZW1pdFNwZWNpYWxpemVkQWNjZXNzb3JzKGN0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBnZXRMaXN0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0IHhnZXRMaXN0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0TGlzdFZhbHVlKGphdmEudXRpbC5MaXN0IGxpc3QpOyIpOworICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7CisgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuTGlzdCBsaXN0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgIGVtaXQoIi8qKiBAZGVwcmVjYXRlZCAqLyIpOworICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgeGxpc3RWYWx1ZSgpOyIpOworICAgICAgICAgICAgZW1pdCgiLyoqIEBkZXByZWNhdGVkICovIik7CisgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChqYXZhLnV0aWwuTGlzdCBsaXN0KTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZW1pdCgieyIpOworICAgICAgICBpbmRlbnQoKTsKKyAgICB9CisgICAgdm9pZCBlbmRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgb3V0ZGVudCgpOworICAgICAgICBlbWl0KCJ9Iik7CisgICAgfQorCisgICAgdm9pZCBwcmludEphdmFEb2MoU3RyaW5nIHNlbnRlbmNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVtaXQoIiIpOworICAgICAgICBlbWl0KCIvKioiKTsKKyAgICAgICAgZW1pdCgiICogIiArIHNlbnRlbmNlKTsKKyAgICAgICAgZW1pdCgiICovIik7CisgICAgfQorCisgICAgdm9pZCBwcmludFNob3J0SmF2YURvYyhTdHJpbmcgc2VudGVuY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZW1pdCgiLyoqICIgKyBzZW50ZW5jZSArICIgKi8iKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2NoZW1hVHlwZSBmaW5kQmFzZUVudW1UeXBlKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICB3aGlsZSAoc1R5cGUuZ2V0QmFzZVR5cGUoKS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCisgICAgICAgICAgICBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgIHJldHVybiBzVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhU3RyaW5nRXNjYXBlKFN0cmluZyBzdHIpCisgICAgeworICAgICAgICAvLyBmb3JiaWRkZW46IFxuLCBcciwgXCIsIFxcLgorICAgICAgICB0ZXN0OiB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRlc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOworICAgICAgICAgICAgc3dpdGNoIChjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgdm9pZCBwcmludFN0cmluZ0VudW1lcmF0aW9uKFNjaGVtYVR5cGUgc1R5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSBiYXNlRW51bVR5cGUgPSBmaW5kQmFzZUVudW1UeXBlKHNUeXBlKTsKKyAgICAgICAgU3RyaW5nIGJhc2VFbnVtQ2xhc3MgPSBiYXNlRW51bVR5cGUuZ2V0RnVsbEphdmFOYW1lKCk7CisKKyAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgiIik7CisgICAgICAgICAgICBlbWl0KCJvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCk7Iik7CisgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldChvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZSk7Iik7CisgICAgICAgIH0KKworICAgICAgICBlbWl0KCIiKTsKKyAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IHNUeXBlLmdldFN0cmluZ0VudW1FbnRyaWVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOworICAgICAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSAhPSBzVHlwZSkKKyAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgIiArIGJhc2VFbnVtQ2xhc3MgKyAiLkVudW0gIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIEVudW0gIiArIGNvbnN0TmFtZSArICIgPSBFbnVtLmZvclN0cmluZyhcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIpOyIpOworICAgICAgICB9CisgICAgICAgIGVtaXQoIiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBjb25zdE5hbWUgPSAiSU5UXyIgKyBlbnRyaWVzW2ldLmdldEVudW1OYW1lKCk7CisgICAgICAgICAgICBpZiAoYmFzZUVudW1UeXBlICE9IHNUeXBlKQorICAgICAgICAgICAgICAgIGVtaXQoInN0YXRpYyBmaW5hbCBpbnQgIiArIGNvbnN0TmFtZSArICIgPSAiICsgYmFzZUVudW1DbGFzcyArICIuIiArIGNvbnN0TmFtZSArICI7Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGludCAiICsgY29uc3ROYW1lICsgIiA9IEVudW0uIiArIGNvbnN0TmFtZSArICI7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VFbnVtVHlwZSA9PSBzVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgiIik7CisgICAgICAgICAgICBlbWl0KCIvKioiKTsKKyAgICAgICAgICAgIGVtaXQoIiAqIEVudW1lcmF0aW9uIHZhbHVlIGNsYXNzIGZvciAiICsgYmFzZUVudW1DbGFzcyArICIuIik7CisgICAgICAgICAgICBlbWl0KCIgKiBUaGVzZSBlbnVtIHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOiIpOworICAgICAgICAgICAgZW1pdCgiICogPHByZT4iKTsKKyAgICAgICAgICAgIGVtaXQoIiAqIGVudW0udG9TdHJpbmcoKTsgLy8gcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBlbnVtIik7CisgICAgICAgICAgICBlbWl0KCIgKiBlbnVtLmludFZhbHVlKCk7IC8vIHJldHVybnMgYW4gaW50IHZhbHVlLCB1c2VmdWwgZm9yIHN3aXRjaGVzIik7CisgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgZW1pdCgiICogLy8gZS5nLiwgY2FzZSBFbnVtLklOVF8iICsgZW50cmllc1swXS5nZXRFbnVtTmFtZSgpKTsKKyAgICAgICAgICAgIGVtaXQoIiAqIEVudW0uZm9yU3RyaW5nKHMpOyAvLyByZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZyIpOworICAgICAgICAgICAgZW1pdCgiICogRW51bS5mb3JJbnQoaSk7IC8vIHJldHVybnMgdGhlIGVudW0gdmFsdWUgZm9yIGFuIGludCIpOworICAgICAgICAgICAgZW1pdCgiICogPC9wcmU+Iik7CisgICAgICAgICAgICBlbWl0KCIgKiBFbnVtZXJhdGlvbiBvYmplY3RzIGFyZSBpbW11dGFibGUgc2luZ2xldG9uIG9iamVjdHMgdGhhdCIpOworICAgICAgICAgICAgZW1pdCgiICogY2FuIGJlIGNvbXBhcmVkIHVzaW5nID09IG9iamVjdCBlcXVhbGl0eS4gVGhleSBoYXZlIG5vIik7CisgICAgICAgICAgICBlbWl0KCIgKiBwdWJsaWMgY29uc3RydWN0b3IuIFNlZSB0aGUgY29uc3RhbnRzIGRlZmluZWQgd2l0aGluIHRoaXMiKTsKKyAgICAgICAgICAgIGVtaXQoIiAqIGNsYXNzIGZvciBhbGwgdGhlIHZhbGlkIHZhbHVlcy4iKTsKKyAgICAgICAgICAgIGVtaXQoIiAqLyIpOworICAgICAgICAgICAgZW1pdCgic3RhdGljIGZpbmFsIGNsYXNzIEVudW0gZXh0ZW5kcyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UiKTsKKyAgICAgICAgICAgIGVtaXQoInsiKTsKKyAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgZW1pdCgiLyoqIik7CisgICAgICAgICAgICBlbWl0KCIgKiBSZXR1cm5zIHRoZSBlbnVtIHZhbHVlIGZvciBhIHN0cmluZywgb3IgbnVsbCBpZiBub25lLiIpOworICAgICAgICAgICAgZW1pdCgiICovIik7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9yU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgcykiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgICB7IHJldHVybiAoRW51bSl0YWJsZS5mb3JTdHJpbmcocyk7IH0iKTsKKyAgICAgICAgICAgIGVtaXQoIi8qKiIpOworICAgICAgICAgICAgZW1pdCgiICogUmV0dXJucyB0aGUgZW51bSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuIGludCwgb3IgbnVsbCBpZiBub25lLiIpOworICAgICAgICAgICAgZW1pdCgiICovIik7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgc3RhdGljIEVudW0gZm9ySW50KGludCBpKSIpOworICAgICAgICAgICAgZW1pdCgiICAgIHsgcmV0dXJuIChFbnVtKXRhYmxlLmZvckludChpKTsgfSIpOworICAgICAgICAgICAgZW1pdCgiIik7CisgICAgICAgICAgICBlbWl0KCJwcml2YXRlIEVudW0oamF2YS5sYW5nLlN0cmluZyBzLCBpbnQgaSkiKTsKKyAgICAgICAgICAgIGVtaXQoIiAgICB7IHN1cGVyKHMsIGkpOyB9Iik7CisgICAgICAgICAgICBlbWl0KCIiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29uc3ROYW1lID0gIklOVF8iICsgZW50cmllc1tpXS5nZXRFbnVtTmFtZSgpOworICAgICAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9IGVudHJpZXNbaV0uZ2V0SW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJzdGF0aWMgZmluYWwgaW50ICIgKyBjb25zdE5hbWUgKyAiID0gIiArIGludFZhbHVlICsgIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtaXQoIiIpOworICAgICAgICAgICAgZW1pdCgicHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSIpOworICAgICAgICAgICAgZW1pdCgiICAgIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUiKTsKKyAgICAgICAgICAgIGVtaXQoIigiKTsKKyAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgZW1pdCgibmV3IEVudW1bXSIpOworICAgICAgICAgICAgZW1pdCgieyIpOworICAgICAgICAgICAgaW5kZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9IGVudHJpZXNbaV0uZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnN0TmFtZSA9ICJJTlRfIiArIGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJuZXcgRW51bShcIiIgKyBqYXZhU3RyaW5nRXNjYXBlKGVudW1WYWx1ZSkgKyAiXCIsICIgKyBjb25zdE5hbWUgKyAiKSwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dGRlbnQoKTsKKyAgICAgICAgICAgIGVtaXQoIn0iKTsKKyAgICAgICAgICAgIG91dGRlbnQoKTsKKyAgICAgICAgICAgIGVtaXQoIik7Iik7CisgICAgICAgICAgICBlbWl0KCJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiKTsKKyAgICAgICAgICAgIGVtaXQoInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCByZWFkUmVzb2x2ZSgpIHsgcmV0dXJuIGZvckludChpbnRWYWx1ZSgpKTsgfSAiKTsKKyAgICAgICAgICAgIG91dGRlbnQoKTsKKyAgICAgICAgICAgIGVtaXQoIn0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyB4bWxUeXBlRm9yUHJvcGVydHkoU2NoZW1hUHJvcGVydHkgc1Byb3ApCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCk7CisgICAgICAgIHJldHVybiBmaW5kSmF2YVR5cGUoc1R5cGUpLnJlcGxhY2UoJyQnLCAnLicpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIHhtbFR5cGVGb3JQcm9wZXJ0eUlzVW5pb24oU2NoZW1hUHJvcGVydHkgc1Byb3ApCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCk7CisgICAgICAgIHJldHVybiAoc1R5cGUuaXNTaW1wbGVUeXBlKCkgJiYgc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pOworICAgIH0KKworICAgIFN0cmluZyBqYXZhVHlwZUZvclByb3BlcnR5KFNjaGVtYVByb3BlcnR5IHNQcm9wKQorICAgIHsKKyAgICAgICAgLy8gVGhlIHR5cGUgdG8gdXNlIGlzIHRoZSBYTUwgb2JqZWN0Li4uLgorICAgICAgICBpZiAoc1Byb3AuZ2V0SmF2YVR5cGVDb2RlKCkgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNQcm9wLmphdmFCYXNlZE9uVHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIGZpbmRKYXZhVHlwZShzVHlwZSkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHNQcm9wLmdldEphdmFUeXBlQ29kZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJvb2xlYW4iOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmxvYXQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiAic2hvcnQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImludCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImxvbmciOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLm1hdGguQmlnSW50ZWdlciI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gImphdmEudXRpbC5EYXRlIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9RTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLnV0aWwuTGlzdCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJqYXZhLnV0aWwuQ2FsZW5kYXIiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc1Byb3AuamF2YUJhc2VkT25UeXBlKCkuZ2V0QmFzZUVudW1UeXBlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRKYXZhVHlwZShzVHlwZSkucmVwbGFjZSgnJCcsICcuJykgKyAiLkVudW0iOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLk9iamVjdCI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50UHJvcGVydHlHZXR0ZXJzKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IGphdmFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbGxhYmxlLCBib29sZWFuIG9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uKQorICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKKyAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOworCisgICAgICAgIGlmIChzaW5nbGV0b24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJHZXRzIGZpcnN0ICIgOiAiR2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KHR5cGUgKyAiIGdldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7CisKKyAgICAgICAgICAgIGlmICgheG1sdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIkdldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIHhnZXQiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmlsbGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRlc3RzIGZvciBuaWwgZmlyc3QgIiA6ICJUZXN0cyBmb3IgbmlsICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW4gaXNOaWwiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVHJ1ZSBpZiBoYXMgYXQgbGVhc3Qgb25lICIgOiAiVHJ1ZSBpZiBoYXMgIikgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJib29sZWFuIGlzU2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXZlcmFsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKKworICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOworICAgICAgICAgICAgZW1pdCh0eXBlICsgIltdIGdldCIgKyBhcnJheU5hbWUgKyAiKCk7Iik7CisKKyAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQodHlwZSArICIgZ2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOworCisgICAgICAgICAgICBpZiAoIXhtbHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJHZXRzIChhcyB4bWwpIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MgKyAicyIpOworICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiW10geGdldCIgKyBhcnJheU5hbWUgKyAiKCk7Iik7CisKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgeGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiVGVzdHMgZm9yIG5pbCBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJib29sZWFuIGlzTmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludEphdmFEb2MoIlJldHVybnMgbnVtYmVyIG9mICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJpbnQgc2l6ZU9mIiArIGFycmF5TmFtZSArICIoKTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJpbnRQcm9wZXJ0eVNldHRlcnMoUU5hbWUgcU5hbWUsIGJvb2xlYW4gaXNBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgeHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmlsbGFibGUsIGJvb2xlYW4gb3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V2ZXJhbCwgYm9vbGVhbiBzaW5nbGV0b24pCisgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2FmZVZhck5hbWUgPSBOYW1lVXRpbC5ub25KYXZhS2V5d29yZChOYW1lVXRpbC5sb3dlckNhbWVsQ2FzZShwcm9wZXJ0eU5hbWUpKTsKKyAgICAgICAgaWYgKHNhZmVWYXJOYW1lLmVxdWFscygiaSIpKQorICAgICAgICAgICAgc2FmZVZhck5hbWUgPSAiaVZhbHVlIjsKKyAgICAgICAgYm9vbGVhbiB4bWx0eXBlID0gKGphdmFUeXBlID09IFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1QpOworCisgICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7CisKKyAgICAgICAgaWYgKHNpbmdsZXRvbikKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgZmlyc3QgIiA6ICJTZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQoInZvaWQgc2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOworCisgICAgICAgICAgICBpZiAoIXhtbHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlNldHMgKGFzIHhtbCkgZmlyc3QgIiA6ICJTZXRzIChhcyB4bWwpIHRoZSAiKSArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHhzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoeG1sdHlwZSAmJiAhc2V2ZXJhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KHh0eXBlICsgIiBhZGROZXciICsgcHJvcGVydHlOYW1lICsgIigpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmlsbGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIk5pbHMgdGhlIGZpcnN0ICIgOiAiTmlscyB0aGUgIikgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXROaWwiICsgcHJvcGVydHlOYW1lICsgIigpOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiUmVtb3ZlcyBmaXJzdCAiIDogIlVuc2V0cyB0aGUgIikgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJ2b2lkIHVuc2V0IiArIHByb3BlcnR5TmFtZSArICIoKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXZlcmFsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgYXJyYXlOYW1lID0gcHJvcGVydHlOYW1lICsgIkFycmF5IjsKKworICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJTZXRzIGFycmF5IG9mIGFsbCAiICsgcHJvcGRlc2MpOworICAgICAgICAgICAgZW1pdCgidm9pZCBzZXQiICsgYXJyYXlOYW1lICsgIigiICsgdHlwZSArICJbXSAiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkpOyIpOworCisgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJ2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7CisKKyAgICAgICAgICAgIGlmICgheG1sdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgidm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoIiArIHh0eXBlICsgIltdIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KTsiKTsKKworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIHhzZXQiICsgYXJyYXlOYW1lICsgIihpbnQgaSwgIiArIHh0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiTmlscyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBzZXROaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgheG1sdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkluc2VydHMgdGhlIHZhbHVlIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJ2b2lkIGluc2VydCIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7CisKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkFwcGVuZHMgdGhlIHZhbHVlIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgidm9pZCBhZGQiICsgcHJvcGVydHlOYW1lICsgIigiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh4bWx0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiSW5zZXJ0cyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgaW5zZXJ0TmV3IiArIHByb3BlcnR5TmFtZSArICIoaW50IGkpOyIpOworICAgIAorICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSB2YWx1ZSAoYXMgeG1sKSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50SmF2YURvYygiUmVtb3ZlcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJ2b2lkIHJlbW92ZSIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBnZXRBdG9taWNSZXN0cmljdGlvblR5cGUoU2NoZW1hVHlwZSBzVHlwZSkgeworICAgICAgICBTY2hlbWFUeXBlIHBUeXBlID0gc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpOworICAgICAgICBzd2l0Y2ggKHBUeXBlLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEFueVNpbXBsZVR5cGVJbXBsIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUJvb2xlYW5Ib2xkZXJFeCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgorICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVFOYW1lSG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YU5vdGF0aW9uSG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyRXgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEb3VibGVIb2xkZXJFeCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFEZWNpbWFsSG9sZGVyRXgiOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50ZWdlckhvbGRlckV4IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhTG9uZ0hvbGRlckV4IjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQllURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSW50SG9sZGVyRXgiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmIChzVHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeCI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0hvbGRlckV4IjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFHRGF0ZUhvbGRlckV4IjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUdEdXJhdGlvbkhvbGRlckV4IjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJ1bnJlY29nbml6ZWQgcHJpbWl0aXZlIHR5cGUiOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFNjaGVtYVR5cGUgZmluZEJhc2VUeXBlKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICB3aGlsZSAoc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHNUeXBlID0gc1R5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHNUeXBlOworICAgIH0KKworICAgIFN0cmluZyBnZXRCYXNlQ2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkgeworICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlID0gZmluZEJhc2VUeXBlKHNUeXBlLmdldEJhc2VUeXBlKCkpOworCisgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTk9UX1NJTVBMRToKKyAgICAgICAgICAgICAgICAvLyBub24tc2ltcGxlLWNvbnRlbnQ6IGluaGVyaXQgZnJvbSBiYXNlIHR5cGUgaW1wbAorICAgICAgICAgICAgICAgIGlmICghWG1sT2JqZWN0LnR5cGUuZXF1YWxzKGJhc2VUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sQ29tcGxleENvbnRlbnRJbXBsIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZvciByZXN0cmljdGlvbnMKKyAgICAgICAgICAgICAgICBhc3NlcnQoISBzVHlwZS5pc0J1aWx0aW5UeXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRBdG9taWNSZXN0cmljdGlvblR5cGUoc1R5cGUpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sTGlzdEltcGwiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFVuaW9uSW1wbCI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludENvbnN0cnVjdG9yKFNjaGVtYVR5cGUgc1R5cGUsIFN0cmluZyBzaG9ydE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVtaXQoIiIpOworICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHNob3J0TmFtZSArICIob3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlIHNUeXBlKSIpOworICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgIGVtaXQoInN1cGVyKHNUeXBlIiArIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5OT1RfU0lNUExFID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIgKyAhc1R5cGUuaXNTaW1wbGVUeXBlKCkpICsKKyAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuTk9UX1NJTVBMRSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgiIik7CisgICAgICAgICAgICBlbWl0KCJwcm90ZWN0ZWQgIiArIHNob3J0TmFtZSArICIob3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlIHNUeXBlLCBib29sZWFuIGIpIik7CisgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICBlbWl0KCJzdXBlcihzVHlwZSwgYik7Iik7CisgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydENsYXNzKFNjaGVtYVR5cGUgc1R5cGUsIGJvb2xlYW4gaXNJbm5lcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gc1R5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGJhc2VDbGFzcyA9IGdldEJhc2VDbGFzcyhzVHlwZSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBpbnRlcmZhY2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnRlcmZhY2VzLmFwcGVuZChzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7CisKKyAgICAgICAgaWYgKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OKSB7CisgICAgICAgICAgICBTY2hlbWFUeXBlW10gbWVtYmVyVHlwZXMgPSBzVHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBtZW1iZXJUeXBlcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlcy5hcHBlbmQoIiwgIiArIG1lbWJlclR5cGVzW2ldLmdldEZ1bGxKYXZhTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKKyAgICAgICAgfQorCisgICAgICAgIGVtaXQoInB1YmxpYyAiICsgKCBpc0lubmVyID8gInN0YXRpYyAiOiAiIiApICsgImNsYXNzICIgKyBzaG9ydE5hbWUgKworICAgICAgICAgICAgIiBleHRlbmRzICIgKyBiYXNlQ2xhc3MgKyAiIGltcGxlbWVudHMgIiArIGludGVyZmFjZXMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgc3RhcnRCbG9jaygpOworICAgIH0KKworICAgIHZvaWQgbWFrZUF0dHJpYnV0ZURlZmF1bHRWYWx1ZShTdHJpbmcganRhcmdldFR5cGUsIFNjaGVtYVByb3BlcnR5IHByb3AsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGp0YXJnZXRUeXBlOworICAgICAgICBpZiAoZnVsbE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIGZ1bGxOYW1lID0gcHJvcC5qYXZhQmFzZWRPblR5cGUoKS5nZXRGdWxsSmF2YU5hbWUoKS5yZXBsYWNlKCckJywgJy4nKTsKKworICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIGZ1bGxOYW1lICsgIilnZXRfZGVmYXVsdF9hdHRyaWJ1dGVfdmFsdWUoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VNaXNzaW5nVmFsdWUoaW50IGphdmFUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN3aXRjaCAoamF2YVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgorICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiBmYWxzZTsiKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMC4wZjsiKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6CisgICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuIDAuMDsiKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gMDsiKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgorICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiAwTDsiKTsgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gbnVsbDsiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50SkdldEFycmF5VmFsdWUoaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgorICAgICAgICAgICAgICAgIGVtaXQodHlwZSArICJbXSByZXN1bHQgPSBuZXcgIiArIHR5cGUgKyAiW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJ0YXJnZXRMaXN0LnRvQXJyYXkocmVzdWx0KTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU06CisgICAgICAgICAgICAgICAgZW1pdCh0eXBlICsgIltdIHJlc3VsdCA9IG5ldyAiICsgdHlwZSArICJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOworICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7CisgICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgiICsgdHlwZSArICIpKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRFbnVtVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgorICAgICAgICAgICAgICAgIGVtaXQoImJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCb29sZWFuVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgorICAgICAgICAgICAgICAgIGVtaXQoImZsb2F0W10gcmVzdWx0ID0gbmV3IGZsb2F0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEZsb2F0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKKyAgICAgICAgICAgICAgICBlbWl0KCJkb3VibGVbXSByZXN1bHQgPSBuZXcgZG91YmxlW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldERvdWJsZVZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgorICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRCeXRlVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgorICAgICAgICAgICAgICAgIGVtaXQoInNob3J0W10gcmVzdWx0ID0gbmV3IHNob3J0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFNob3J0VmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKKyAgICAgICAgICAgICAgICBlbWl0KCJpbnRbXSByZXN1bHQgPSBuZXcgaW50W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEludFZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgorICAgICAgICAgICAgICAgIGVtaXQoImxvbmdbXSByZXN1bHQgPSBuZXcgbG9uZ1t0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRMb25nVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgorICAgICAgICAgICAgICAgIGVtaXQoImphdmEubWF0aC5CaWdEZWNpbWFsW10gcmVzdWx0ID0gbmV3IGphdmEubWF0aC5CaWdEZWNpbWFsW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgZW1pdCgiamF2YS5tYXRoLkJpZ0ludGVnZXJbXSByZXN1bHQgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOworICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7CisgICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc6CisgICAgICAgICAgICAgICAgZW1pdCgiamF2YS5sYW5nLlN0cmluZ1tdIHJlc3VsdCA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nW3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldFN0cmluZ1ZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgorICAgICAgICAgICAgICAgIGVtaXQoImJ5dGVbXVtdIHJlc3VsdCA9IG5ldyBieXRlW3RhcmdldExpc3Quc2l6ZSgpXVtdOyIpOworICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7CisgICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Qnl0ZUFycmF5VmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgorICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5DYWxlbmRhcltdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQ2FsZW5kYXJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOworICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7CisgICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0Q2FsZW5kYXJWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKKyAgICAgICAgICAgICAgICBlbWl0KCJqYXZhLnV0aWwuRGF0ZVtdIHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXREYXRlVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgorICAgICAgICAgICAgICAgIGVtaXQoIm9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVbXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRHRGF0ZVZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HRFVSQVRJT046CisgICAgICAgICAgICAgICAgZW1pdCgib3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bXSByZXN1bHQgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25bdGFyZ2V0TGlzdC5zaXplKCldOyIpOworICAgICAgICAgICAgICAgIGVtaXQoImZvciAoaW50IGkgPSAwLCBsZW4gPSB0YXJnZXRMaXN0LnNpemUoKSA7IGkgPCBsZW4gOyBpKyspIik7CisgICAgICAgICAgICAgICAgZW1pdCgiICAgIHJlc3VsdFtpXSA9ICgob3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZSl0YXJnZXRMaXN0LmdldChpKSkuZ2V0R0R1cmF0aW9uVmFsdWUoKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1FOQU1FOgorICAgICAgICAgICAgICAgIGVtaXQoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSByZXN1bHQgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRRTmFtZVZhbHVlKCk7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgorICAgICAgICAgICAgICAgIGVtaXQoImphdmEudXRpbC5MaXN0W10gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5MaXN0W3RhcmdldExpc3Quc2l6ZSgpXTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJmb3IgKGludCBpID0gMCwgbGVuID0gdGFyZ2V0TGlzdC5zaXplKCkgOyBpIDwgbGVuIDsgaSsrKSIpOworICAgICAgICAgICAgICAgIGVtaXQoIiAgICByZXN1bHRbaV0gPSAoKG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUpdGFyZ2V0TGlzdC5nZXQoaSkpLmdldExpc3RWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOgorICAgICAgICAgICAgICAgIGVtaXQoImphdmEubGFuZy5PYmplY3RbXSByZXN1bHQgPSBuZXcgamF2YS5sYW5nLk9iamVjdFt0YXJnZXRMaXN0LnNpemUoKV07Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZm9yIChpbnQgaSA9IDAsIGxlbiA9IHRhcmdldExpc3Quc2l6ZSgpIDsgaSA8IGxlbiA7IGkrKykiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCIgICAgcmVzdWx0W2ldID0gKChvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlKXRhcmdldExpc3QuZ2V0KGkpKS5nZXRPYmplY3RWYWx1ZSgpOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgZW1pdCgicmV0dXJuIHJlc3VsdDsiKTsKKyAgICB9CisgICAgdm9pZCBwcmludEpHZXRWYWx1ZShpbnQgamF2YVR5cGUsIFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzd2l0Y2ggKGphdmFUeXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDoKKyAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCb29sZWFuVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRGbG9hdFZhbHVlKCk7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9ET1VCTEU6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldERvdWJsZVZhbHVlKCk7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCeXRlVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRTaG9ydFZhbHVlKCk7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEludFZhbHVlKCk7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRMb25nVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCaWdEZWNpbWFsVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKKyAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0U3RyaW5nVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldEJ5dGVBcnJheVZhbHVlKCk7Iik7IGJyZWFrOworCisgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURToKKyAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0R0RhdGVWYWx1ZSgpOyIpOyBicmVhazsKKworICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgorICAgICAgICAgICAgZW1pdCgicmV0dXJuIHRhcmdldC5nZXRHRHVyYXRpb25WYWx1ZSgpOyIpOyBicmVhazsKKworICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldENhbGVuZGFyVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RBVEU6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldERhdGVWYWx1ZSgpOyIpOyBicmVhazsKKworICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldFFOYW1lVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q6CisgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmdldExpc3RWYWx1ZSgpOyIpOyBicmVhazsKKworICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTToKKyAgICAgICAgICAgIGVtaXQoInJldHVybiAoIiArIHR5cGUgKyAiKXRhcmdldC5nZXRFbnVtVmFsdWUoKTsiKTsgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDoKKyAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuZ2V0T2JqZWN0VmFsdWUoKTsiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcganNldE1ldGhvZChpbnQgamF2YVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3dpdGNoIChqYXZhVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldCI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJvb2xlYW5WYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRGbG9hdFZhbHVlIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXREb3VibGVWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJ5dGVWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9TSE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRTaG9ydFZhbHVlIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRJbnRWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldExvbmdWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRCaWdEZWNpbWFsVmFsdWUiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0QmlnSW50ZWdlclZhbHVlIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXRTdHJpbmdWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEJ5dGVBcnJheVZhbHVlIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEdEYXRlVmFsdWUiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEdEdXJhdGlvblZhbHVlIjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0NBTEVOREFSOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldENhbGVuZGFyVmFsdWUiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURToKKyAgICAgICAgICAgICAgICByZXR1cm4gInRhcmdldC5zZXREYXRlVmFsdWUiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0UU5hbWVWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9MSVNUOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldExpc3RWYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9FTlVNOgorICAgICAgICAgICAgICAgIHJldHVybiAidGFyZ2V0LnNldEVudW1WYWx1ZSI7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0YXJnZXQuc2V0T2JqZWN0VmFsdWUiOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBnZXRJZGVudGlmaWVyKE1hcCBxTmFtZU1hcCwgUU5hbWUgcU5hbWUpIHsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcU5hbWVNYXAuZ2V0KHFOYW1lKSlbMF07CisgICAgfQorCisgICAgU3RyaW5nIGdldFNldElkZW50aWZpZXIoTWFwIHFOYW1lTWFwLCBRTmFtZSBxTmFtZSkgeworICAgICAgICBTdHJpbmdbXSBpZGVudGlmaWVycyA9IChTdHJpbmdbXSlxTmFtZU1hcC5nZXQocU5hbWUpOworICAgICAgICByZXR1cm4gaWRlbnRpZmllcnNbMV0gPT0gbnVsbCA/IGlkZW50aWZpZXJzWzBdIDogaWRlbnRpZmllcnNbMV07CisgICAgfQorCisgICAgTWFwIHByaW50U3RhdGljRmllbGRzKFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFwIHJlc3VsdHMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIGVtaXQoIiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGlkZW50aWZpZXJzID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgIGZpbmFsIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOworICAgICAgICAgICAgZmluYWwgUU5hbWUgbmFtZSA9IHByb3AuZ2V0TmFtZSgpOworICAgICAgICAgICAgcmVzdWx0cy5wdXQobmFtZSwgaWRlbnRpZmllcnMpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphdmFOYW1lID0gcHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICBpZGVudGlmaWVyc1swXSA9IChqYXZhTmFtZSArICIkIiArIChpICogMikpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpU3RyaW5nID0gICJcIiIgKyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIlwiIjsKKworICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSAiICsgaWRlbnRpZmllcnNbMF0gKworICAgICAgICAgICAgICAgICAiID0gIiApOworICAgICAgICAgICAgaW5kZW50KCk7CisgICAgICAgICAgICBlbWl0KCJuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiICsKKyAgICAgICAgICAgICAgICAgdXJpU3RyaW5nICsgIiwgXCIiICsgbmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIik7Iik7CisgICAgICAgICAgICBvdXRkZW50KCk7CisKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLmFjY2VwdGVkTmFtZXMoKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lW10gcW5hbWVzID0gcHJvcGVydGllc1tpXS5hY2NlcHRlZE5hbWVzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAocW5hbWVzLmxlbmd0aCA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1sxXSA9IChqYXZhTmFtZSArICIkIiArIChpKjIrMSkpLnRvVXBwZXJDYXNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldCAiICsgaWRlbnRpZmllcnNbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIiA9IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQuZm9yQXJyYXkoIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10geyAiICk7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCA7IGogPCBxbmFtZXMubGVuZ3RoIDsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCJuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShcIiIgKyBxbmFtZXNbal0uZ2V0TmFtZXNwYWNlVVJJKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgXCIiICsgcW5hbWVzW2pdLmdldExvY2FsUGFydCgpICsgIlwiKSwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBlbWl0KCJ9KTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW1pdCgiIik7CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIHZvaWQgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVtaXQoInN5bmNocm9uaXplZCAobW9uaXRvcigpKSIpOworICAgICAgICBlbWl0KCJ7Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBlbWl0KCJjaGVja19vcnBoYW5lZCgpOyIpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgb3V0ZGVudCgpOworICAgICAgICBlbWl0KCJ9Iik7CisgICAgfQorICAgIAorICAgIHZvaWQgZW1pdERlY2xhcmVUYXJnZXQoYm9vbGVhbiBkZWNsYXJlVGFyZ2V0LCBTdHJpbmcgeHR5cGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChkZWNsYXJlVGFyZ2V0KQorICAgICAgICAgICAgZW1pdCh4dHlwZSArICIgdGFyZ2V0ID0gbnVsbDsiKTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXRBZGRUYXJnZXQoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gaXNBdHRyLCBib29sZWFuIGRlY2xhcmVUYXJnZXQsIFN0cmluZyB4dHlwZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoaXNBdHRyKQorICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuYWRkX2F0dHJpYnV0ZV91c2VyKCIgKyBpZGVudGlmaWVyICsgIik7Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmFkZF9lbGVtZW50X3VzZXIoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXRQcmUoU2NoZW1hVHlwZSBzVHlwZSwgaW50IG9wVHlwZSwgU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gaXNBdHRyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGVtaXRQcmUoc1R5cGUsIG9wVHlwZSwgaWRlbnRpZmllciwgaXNBdHRyLCAiLTEiKTsKKyAgICB9CisKKyAgICB2b2lkIGVtaXRQcmUoU2NoZW1hVHlwZSBzVHlwZSwgaW50IG9wVHlwZSwgU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gaXNBdHRyLCBTdHJpbmcgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZUltcGwgc0ltcGwgPSBnZXRJbXBsKHNUeXBlKTsKKyAgICAgICAgaWYgKHNJbXBsPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEV4dGVuc2lvbkhvbGRlciBleHRIb2xkZXIgPSBzSW1wbC5nZXRFeHRlbnNpb25Ib2xkZXIoKTsKKyAgICAgICAgaWYgKGV4dEhvbGRlcj09bnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBQcmVQb3N0RXh0ZW5zaW9uIGV4dCA9IGV4dEhvbGRlci5nZXRQcmVQb3N0RXh0ZW5zaW9uc0ZvcihzVHlwZS5nZXRGdWxsSmF2YU5hbWUoKSk7CisgICAgICAgIGlmIChleHQhPW51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleHQuaGFzUHJlQ2FsbCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQoImlmICggIiArIGV4dC5nZXRQcmVDYWxsKG9wVHlwZSwgaWRlbnRpZmllciwgaXNBdHRyLCBpbmRleCkgKyAiICkiKTsKKyAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGVtaXRQb3N0KFNjaGVtYVR5cGUgc1R5cGUsIGludCBvcFR5cGUsIFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIGlzQXR0cikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBlbWl0UG9zdChzVHlwZSwgb3BUeXBlLCBpZGVudGlmaWVyLCBpc0F0dHIsICItMSIpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGVtaXRQb3N0KFNjaGVtYVR5cGUgc1R5cGUsIGludCBvcFR5cGUsIFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIGlzQXR0ciwgU3RyaW5nIGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gZ2V0SW1wbChzVHlwZSk7CisgICAgICAgIGlmIChzSW1wbD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBFeHRlbnNpb25Ib2xkZXIgZXh0SG9sZGVyID0gc0ltcGwuZ2V0RXh0ZW5zaW9uSG9sZGVyKCk7CisgICAgICAgIGlmIChleHRIb2xkZXI9PW51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgUHJlUG9zdEV4dGVuc2lvbiBleHQgPSBleHRIb2xkZXIuZ2V0UHJlUG9zdEV4dGVuc2lvbnNGb3Ioc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkpOworICAgICAgICBpZiAoZXh0IT1udWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZXh0Lmhhc1ByZUNhbGwoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXh0Lmhhc1Bvc3RDYWxsKCkpCisgICAgICAgICAgICAgICAgZW1pdChleHQuZ2V0UG9zdENhbGwob3BUeXBlLCBpZGVudGlmaWVyLCBpc0F0dHIsIGluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USElORyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9ORVdfVkFMVUUgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPV19FWENFUFRJT04gPSA0OworCisgICAgdm9pZCBlbWl0R2V0VGFyZ2V0KFN0cmluZyBzZXRJZGVudGlmaWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBdHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bGxCZWhhdmlvdXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB4dHlwZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgc2V0SWRlbnRpZmllciAhPSBudWxsICYmIGlkZW50aWZpZXIgIT0gbnVsbDsKKworICAgICAgICBlbWl0KHh0eXBlICsgIiB0YXJnZXQgPSBudWxsOyIpOworCisgICAgICAgIGlmIChpc0F0dHIpCisgICAgICAgICAgICBlbWl0KCJ0YXJnZXQgPSAoIiArIHh0eXBlICsgIilnZXRfc3RvcmUoKS5maW5kX2F0dHJpYnV0ZV91c2VyKCIgKyBpZGVudGlmaWVyICsgIik7Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXQoInRhcmdldCA9ICgiICsgeHR5cGUgKyAiKWdldF9zdG9yZSgpLmZpbmRfZWxlbWVudF91c2VyKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgIiArIGluZGV4ICsgIik7Iik7CisKKyAgICAgICAgaWYgKG51bGxCZWhhdmlvdXIgPT0gTk9USElORykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7CisKKyAgICAgICAgc3RhcnRCbG9jaygpOworCisgICAgICAgIHN3aXRjaCAobnVsbEJlaGF2aW91cikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBRERfTkVXX1ZBTFVFOgorICAgICAgICAgICAgICAgIC8vIHRhcmdldCBhbHJlYWR5IGVtaXRlZCwgbm8gbmVlZCBmb3IgZW1pdERlY2xhcmVUYXJnZXQoZmFsc2UsIHh0eXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0QWRkVGFyZ2V0KGlkZW50aWZpZXIsIGlzQXR0ciwgZmFsc2UsIHh0eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUSFJPV19FWENFUFRJT046CisgICAgICAgICAgICAgICAgZW1pdCgidGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOT1RISU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJCYWQgYmVoYXZpb3VyIHR5cGU6ICIgKyBudWxsQmVoYXZpb3VyOworICAgICAgICB9CisKKyAgICAgICAgZW5kQmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50R2V0dGVySW1wbHMoCisgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AsIFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXR0ciwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgaW50IGphdmFUeXBlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHh0eXBlLCBib29sZWFuIG5pbGxhYmxlLAorICAgICAgICBib29sZWFuIG9wdGlvbmFsLCBib29sZWFuIHNldmVyYWwsIGJvb2xlYW4gc2luZ2xldG9uLAorICAgICAgICBib29sZWFuIGlzdW5pb24sCisgICAgICAgIFN0cmluZyBpZGVudGlmaWVyLCBTdHJpbmcgc2V0SWRlbnRpZmllciApCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBwcm9wZGVzYyA9ICJcIiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSArICJcIiIgKyAoaXNBdHRyID8gIiBhdHRyaWJ1dGUiIDogIiBlbGVtZW50Iik7CisgICAgICAgIGJvb2xlYW4geG1sdHlwZSA9IChqYXZhVHlwZSA9PSBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUKTsKKyAgICAgICAgU3RyaW5nIGp0YXJnZXRUeXBlID0gKGlzdW5pb24gfHwgIXhtbHR5cGUpID8gIm9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUiIDogeHR5cGU7CisKKyAgICAgICAgaWYgKHNpbmdsZXRvbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVmFsdWUgZ2V0UHJvcCgpCisgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyBmaXJzdCAiIDogIkdldHMgdGhlICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB0eXBlICsgIiBnZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7CisgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworCisgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBOT1RISU5HLCBqdGFyZ2V0VHlwZSk7CisKKyAgICAgICAgICAgIGlmIChpc0F0dHIgJiYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSB8fAorICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIG1ha2VBdHRyaWJ1dGVEZWZhdWx0VmFsdWUoanRhcmdldFR5cGUsIHByb3AsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0KCJpZiAodGFyZ2V0ID09IG51bGwpIik7CisgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICBtYWtlTWlzc2luZ1ZhbHVlKGphdmFUeXBlKTsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisKKworICAgICAgICAgICAgcHJpbnRKR2V0VmFsdWUoamF2YVR5cGUsIHR5cGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKworICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlIHhnZXRQcm9wKCkKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiR2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIkdldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIHhnZXQiICsgcHJvcGVydHlOYW1lICsgIigpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICIwIiwgTk9USElORywgeHR5cGUpOworCisgICAgICAgICAgICAgICAgaWYgKGlzQXR0ciAmJiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgICAgICBtYWtlQXR0cmlidXRlRGVmYXVsdFZhbHVlKHh0eXBlLCBwcm9wLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzTmlsUHJvcCgpCisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKChzZXZlcmFsID8gIlRlc3RzIGZvciBuaWwgZmlyc3QgIiA6ICJUZXN0cyBmb3IgbmlsICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyBib29sZWFuIGlzTmlsIiArIHByb3BlcnR5TmFtZSArICIoKSIpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIE5PVEhJTkcsIHh0eXBlKTsKKworICAgICAgICAgICAgICAgIGVtaXQoImlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIpOworICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQuaXNOaWwoKTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBib29sZWFuIGlzU2V0UHJvcCgpCisgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiVHJ1ZSBpZiBoYXMgYXQgbGVhc3Qgb25lICIgOiAiVHJ1ZSBpZiBoYXMgIikgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgYm9vbGVhbiBpc1NldCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKKworICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKworICAgICAgICAgICAgaWYgKGlzQXR0cikKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gZ2V0X3N0b3JlKCkuZmluZF9hdHRyaWJ1dGVfdXNlcigiICsgaWRlbnRpZmllciArIikgIT0gbnVsbDsiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gZ2V0X3N0b3JlKCkuY291bnRfZWxlbWVudHMoIiArIHNldElkZW50aWZpZXIgKyAiKSAhPSAwOyIpOworCisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V2ZXJhbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7CisKKyAgICAgICAgICAgIC8vIFZhbHVlW10gZ2V0UHJvcCgpCisgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgYXJyYXkgb2YgYWxsICIgKyBwcm9wZGVzYyArICJzIik7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHR5cGUgKyAiW10gZ2V0IiArIGFycmF5TmFtZSArICIoKSIpOworICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKworICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Iik7CisgICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5maW5kX2FsbF9lbGVtZW50X3VzZXJzKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgdGFyZ2V0TGlzdCk7Iik7CisKKyAgICAgICAgICAgIHByaW50SkdldEFycmF5VmFsdWUoamF2YVR5cGUsIHR5cGUpOworCisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisKKyAgICAgICAgICAgIC8vIFZhbHVlIGdldFByb3AoaW50IGkpCisgICAgICAgICAgICBwcmludEphdmFEb2MoIkdldHMgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHR5cGUgKyAiIGdldCIgKyBhcnJheU5hbWUgKyAiKGludCBpKSIpOworICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKworICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCBqdGFyZ2V0VHlwZSk7CisgICAgICAgICAgICBwcmludEpHZXRWYWx1ZShqYXZhVHlwZSwgdHlwZSk7CisKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlW10geGdldFByb3AoKQorICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjICsgInMiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIltdIHhnZXQiICsgYXJyYXlOYW1lICsgIigpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdCgiamF2YS51dGlsLkxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Iik7CisgICAgICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkuZmluZF9hbGxfZWxlbWVudF91c2VycygiICsgc2V0SWRlbnRpZmllciArICIsIHRhcmdldExpc3QpOyIpOworICAgICAgICAgICAgICAgIGVtaXQoeHR5cGUgKyAiW10gcmVzdWx0ID0gbmV3ICIgKyB4dHlwZSArICJbdGFyZ2V0TGlzdC5zaXplKCldOyIpOworICAgICAgICAgICAgICAgIGVtaXQoInRhcmdldExpc3QudG9BcnJheShyZXN1bHQpOyIpOworICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiByZXN1bHQ7Iik7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgICAgIC8vIFZhbHVlIHhnZXRQcm9wKGludCBpKQorICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiR2V0cyAoYXMgeG1sKSBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiB4Z2V0IiArIGFycmF5TmFtZSArICIoaW50IGkpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdCgicmV0dXJuICgiICsgeHR5cGUgKyAiKXRhcmdldDsiKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzTmlsKGludCBpKTsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlRlc3RzIGZvciBuaWwgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgicHVibGljIGJvb2xlYW4gaXNOaWwiICsgYXJyYXlOYW1lICsgIihpbnQgaSkiKTsKKyAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiLCBUSFJPV19FWENFUFRJT04sIHh0eXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0LmlzTmlsKCk7Iik7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaW50IGNvdW50UHJvcCgpOworICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZXR1cm5zIG51bWJlciBvZiAiICsgcHJvcGRlc2MpOworICAgICAgICAgICAgZW1pdCgicHVibGljIGludCBzaXplT2YiICsgYXJyYXlOYW1lICsgIigpIik7CisgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgZW1pdCgicmV0dXJuIGdldF9zdG9yZSgpLmNvdW50X2VsZW1lbnRzKCIgKyBzZXRJZGVudGlmaWVyICsiKTsiKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJpbnRTZXR0ZXJJbXBscyhRTmFtZSBxTmFtZSwgYm9vbGVhbiBpc0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBqYXZhVHlwZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB4dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuaWxsYWJsZSwgYm9vbGVhbiBvcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXZlcmFsLCBib29sZWFuIHNpbmdsZXRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllciwgU3RyaW5nIHNldElkZW50aWZpZXIsIFNjaGVtYVR5cGUgc1R5cGUgKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2FmZVZhck5hbWUgPSBOYW1lVXRpbC5ub25KYXZhS2V5d29yZChOYW1lVXRpbC5sb3dlckNhbWVsQ2FzZShwcm9wZXJ0eU5hbWUpKTsKKyAgICAgICAgaWYgKHNhZmVWYXJOYW1lLmVxdWFscygiaSIpKQorICAgICAgICAgICAgc2FmZVZhck5hbWUgPSAiaVZhbHVlIjsKKyAgICAgICAgZWxzZSBpZiAoc2FmZVZhck5hbWUuZXF1YWxzKCJ0YXJnZXQiKSkKKyAgICAgICAgICAgIHNhZmVWYXJOYW1lID0gInRhcmdldFZhbHVlIjsKKworICAgICAgICBib29sZWFuIHhtbHR5cGUgPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVCk7CisgICAgICAgIGJvb2xlYW4gaXNvYmogPSAoamF2YVR5cGUgPT0gU2NoZW1hUHJvcGVydHkuSkFWQV9PQkpFQ1QpOworICAgICAgICBib29sZWFuIGlzU3Vic3RHcm91cCA9IGlkZW50aWZpZXIgIT0gc2V0SWRlbnRpZmllcjsKKyAgICAgICAgU3RyaW5nIGpTZXQgPSBqc2V0TWV0aG9kKGphdmFUeXBlKTsKKyAgICAgICAgU3RyaW5nIGp0YXJnZXRUeXBlID0gKGlzdW5pb24gfHwgIXhtbHR5cGUpID8gIm9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWUiIDogeHR5cGU7CisKKyAgICAgICAgU3RyaW5nIHByb3BkZXNjID0gIlwiIiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIlwiIiArIChpc0F0dHIgPyAiIGF0dHJpYnV0ZSIgOiAiIGVsZW1lbnQiKTsKKworICAgICAgICBpZiAoc2luZ2xldG9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB2b2lkIHNldFByb3AoVmFsdWUgdik7CisgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyBmaXJzdCAiIDogIlNldHMgdGhlICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0IiArIHByb3BlcnR5TmFtZSArICIoIiArIHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7CisgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsIHNldmVyYWwgPyAiMCIgOiAiLTEiKTsKKyAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiMCIsIEFERF9ORVdfVkFMVUUsIGp0YXJnZXRUeXBlKTsKKyAgICAgICAgICAgIGVtaXQoalNldCArICIoIiArIHNhZmVWYXJOYW1lICsgIik7Iik7CisgICAgICAgICAgICBlbWl0UG9zdChzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsIHNldmVyYWwgPyAiMCIgOiAiLTEiKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHZvaWQgeHNldFByb3AoVmFsdWUgdikKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiU2V0cyAoYXMgeG1sKSBmaXJzdCAiIDogIlNldHMgKGFzIHhtbCkgdGhlICIpICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHhzZXQiICsgcHJvcGVydHlOYW1lICsgIigiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsIHNldmVyYWwgPyAiMCIgOiAiLTEiKTsKKyAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBBRERfTkVXX1ZBTFVFLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldCgiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0UG9zdChzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsIHNldmVyYWwgPyAiMCIgOiAiLTEiKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4bWx0eXBlICYmICFzZXZlcmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFZhbHVlIGFkZE5ld1Byb3AoKQorICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiQXBwZW5kcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSAiICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyAiICsgeHR5cGUgKyAiIGFkZE5ldyIgKyBwcm9wZXJ0eU5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbWl0RGVjbGFyZVRhcmdldCh0cnVlLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fSU5TRVJULCBpZGVudGlmaWVyLCBpc0F0dHIpOworICAgICAgICAgICAgICAgIGVtaXRBZGRUYXJnZXQoaWRlbnRpZmllciwgaXNBdHRyLCB0cnVlLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdFBvc3Qoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX0lOU0VSVCwgaWRlbnRpZmllciwgaXNBdHRyKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuaWxsYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoKHNldmVyYWwgPyAiTmlscyB0aGUgZmlyc3QgIiA6ICJOaWxzIHRoZSAiKSArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCBzZXROaWwiICsgcHJvcGVydHlOYW1lICsgIigpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsIHNldmVyYWwgPyAiMCIgOiAiLTEiKTsKKyAgICAgICAgICAgICAgICBlbWl0R2V0VGFyZ2V0KHNldElkZW50aWZpZXIsIGlkZW50aWZpZXIsIGlzQXR0ciwgIjAiLCBBRERfTkVXX1ZBTFVFLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldE5pbCgpOyIpOworICAgICAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0ciwgc2V2ZXJhbCA/ICIwIiA6ICItMSIpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9uYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50SmF2YURvYygoc2V2ZXJhbCA/ICJSZW1vdmVzIGZpcnN0ICIgOiAiVW5zZXRzIHRoZSAiKSArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHVuc2V0IiArIHByb3BlcnR5TmFtZSArICIoKSIpOworICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKyAgICAgICAgICAgIGVtaXRQcmUoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1JFTU9WRSwgaWRlbnRpZmllciwgaXNBdHRyLCBzZXZlcmFsID8gIjAiIDogIi0xIik7CisgICAgICAgICAgICBpZiAoaXNBdHRyKQorICAgICAgICAgICAgICAgIGVtaXQoImdldF9zdG9yZSgpLnJlbW92ZV9hdHRyaWJ1dGUoIiArIGlkZW50aWZpZXIgKyAiKTsiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbWl0KCJnZXRfc3RvcmUoKS5yZW1vdmVfZWxlbWVudCgiICsgc2V0SWRlbnRpZmllciArICIsIDApOyIpOworICAgICAgICAgICAgZW1pdFBvc3Qoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1JFTU9WRSwgaWRlbnRpZmllciwgaXNBdHRyLCBzZXZlcmFsID8gIjAiIDogIi0xIik7CisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2V2ZXJhbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IHByb3BlcnR5TmFtZSArICJBcnJheSI7CisKKyAgICAgICAgICAgIC8vIEpTRVRfSU5ERVgKKyAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKCIgKyB0eXBlICsgIltdICIgKyBzYWZlVmFyTmFtZSArICJBcnJheSkiKTsKKyAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICBlbWl0UHJlKHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0cik7CisKKyAgICAgICAgICAgIGlmIChpc29iaikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU3Vic3RHcm91cCkKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgidW5pb25BcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlbWl0KCJ1bmlvbkFycmF5U2V0dGVySGVscGVyKCIgKyBzYWZlVmFyTmFtZSArICJBcnJheSIgKyAiLCAiICsgaWRlbnRpZmllciArICIsICIgKyBzZXRJZGVudGlmaWVyICsgIik7IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaXNTdWJzdEdyb3VwKQorICAgICAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiLCAiICsgc2V0SWRlbnRpZmllciArICIpOyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0cik7CisgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgIGVuZEJsb2NrKCk7CisKKyAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgdHlwZSArICIgIiArIHNhZmVWYXJOYW1lICsgIikiKTsKKyAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICBlbWl0UHJlKHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgIGVtaXRHZXRUYXJnZXQoc2V0SWRlbnRpZmllciwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIsIFRIUk9XX0VYQ0VQVElPTiwganRhcmdldFR5cGUpOworICAgICAgICAgICAgZW1pdChqU2V0ICsgIigiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgZW5kQmxvY2soKTsKKworICAgICAgICAgICAgaWYgKCF4bWx0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiU2V0cyAoYXMgeG1sKSBhcnJheSBvZiBhbGwgIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgdm9pZCB4c2V0IiArIGFycmF5TmFtZSArICIoIiArIHh0eXBlICsgIltdIiArIHNhZmVWYXJOYW1lICsgIkFycmF5KSIpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgICAgIGVtaXRQcmUoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1NFVCwgaWRlbnRpZmllciwgaXNBdHRyKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJhcnJheVNldHRlckhlbHBlcigiICsgc2FmZVZhck5hbWUgKyAiQXJyYXkiICsgIiwgIiArIGlkZW50aWZpZXIgKyAiKTsiICk7CisKKyAgICAgICAgICAgICAgICBlbWl0UG9zdChzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIlNldHMgKGFzIHhtbCkgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgeHNldCIgKyBhcnJheU5hbWUgKyAiKGludCBpLCAiICsgeHR5cGUgKyAiICIgKyBzYWZlVmFyTmFtZSArICIpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIik7CisgICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldCgiICsgc2FmZVZhck5hbWUgKyAiKTsiKTsKKyAgICAgICAgICAgICAgICBlbWl0UG9zdChzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIik7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5pbGxhYmxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50SmF2YURvYygiTmlscyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgc2V0TmlsIiArIGFycmF5TmFtZSArICIoaW50IGkpIik7CisgICAgICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblByZWFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VULCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIik7CisgICAgICAgICAgICAgICAgZW1pdEdldFRhcmdldChzZXRJZGVudGlmaWVyLCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIiwgVEhST1dfRVhDRVBUSU9OLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0LnNldE5pbCgpOyIpOworICAgICAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9TRVQsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXhtbHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIHRoZSB2YWx1ZSBhcyB0aGUgaXRoICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgicHVibGljIHZvaWQgaW5zZXJ0IiArIHByb3BlcnR5TmFtZSArICIoaW50IGksICIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgICAgIGVtaXRQcmUoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX0lOU0VSVCwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIpOworICAgICAgICAgICAgICAgIGVtaXQoanRhcmdldFR5cGUgKyAiIHRhcmdldCA9ICIpOworICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgIGlmICghaXNTdWJzdEdyb3VwKQorICAgICAgICAgICAgICAgICAgICBlbWl0KCIoIiArIGp0YXJnZXRUeXBlICsgIilnZXRfc3RvcmUoKS5pbnNlcnRfZWxlbWVudF91c2VyKCIgKyBpZGVudGlmaWVyICsgIiwgaSk7Iik7CisgICAgICAgICAgICAgICAgZWxzZSAvLyBUaGlzIGlzIGEgc3Vic3QgZ3JvdXAgY2FzZQorICAgICAgICAgICAgICAgICAgICBlbWl0ICgiKCIgKyBqdGFyZ2V0VHlwZSArIilnZXRfc3RvcmUoKS5pbnNlcnRfZWxlbWVudF91c2VyKCIgKyBzZXRJZGVudGlmaWVyICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciArICIsIGkpOyIpOworICAgICAgICAgICAgICAgIG91dGRlbnQoKTsKKyAgICAgICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOworICAgICAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9JTlNFUlQsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25Qb3N0YW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworCisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIHRoZSB2YWx1ZSBhcyB0aGUgbGFzdCAiICsgcHJvcGRlc2MpOworICAgICAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIGFkZCIgKyBwcm9wZXJ0eU5hbWUgKyAiKCIgKyB0eXBlICsgIiAiICsgc2FmZVZhck5hbWUgKyAiKSIpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgICAgIGVtaXREZWNsYXJlVGFyZ2V0KHRydWUsIGp0YXJnZXRUeXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0UHJlKHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9JTlNFUlQsIGlkZW50aWZpZXIsIGlzQXR0cik7CisgICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIHRydWUsIGp0YXJnZXRUeXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0KGpTZXQgKyAiKCIgKyBzYWZlVmFyTmFtZSArICIpOyIpOworICAgICAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9JTlNFUlQsIGlkZW50aWZpZXIsIGlzQXR0cik7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHhtbHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJJbnNlcnRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJwdWJsaWMgIiArIHh0eXBlICsgIiBpbnNlcnROZXciICsgcHJvcGVydHlOYW1lICsgIihpbnQgaSkiKTsKKyAgICAgICAgICAgICAgICBzdGFydEJsb2NrKCk7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKyAgICAgICAgICAgICAgICBlbWl0RGVjbGFyZVRhcmdldCh0cnVlLCB4dHlwZSk7CisgICAgICAgICAgICAgICAgZW1pdFByZShzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fSU5TRVJULCBpZGVudGlmaWVyLCBpc0F0dHIsICJpIik7CisgICAgICAgICAgICAgICAgZW1pdCgidGFyZ2V0ID0gKCIgKyB4dHlwZSArICIpZ2V0X3N0b3JlKCkuaW5zZXJ0X2VsZW1lbnRfdXNlcigiICsgaWRlbnRpZmllciArICIsIGkpOyIpOworICAgICAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9JTlNFUlQsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJyZXR1cm4gdGFyZ2V0OyIpOworICAgICAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgICAgIGVuZEJsb2NrKCk7CisgICAgCisgICAgICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJBcHBlbmRzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IHZhbHVlIChhcyB4bWwpIGFzIHRoZSBsYXN0ICIgKyBwcm9wZGVzYyk7CisgICAgICAgICAgICAgICAgZW1pdCgicHVibGljICIgKyB4dHlwZSArICIgYWRkTmV3IiArIHByb3BlcnR5TmFtZSArICIoKSIpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0SW1wbGVtZW50YXRpb25QcmVhbWJsZSgpOworICAgICAgICAgICAgICAgIGVtaXREZWNsYXJlVGFyZ2V0KHRydWUsIHh0eXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0UHJlKHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9JTlNFUlQsIGlkZW50aWZpZXIsIGlzQXR0cik7CisgICAgICAgICAgICAgICAgZW1pdEFkZFRhcmdldChpZGVudGlmaWVyLCBpc0F0dHIsIHRydWUsIHh0eXBlKTsKKyAgICAgICAgICAgICAgICBlbWl0UG9zdChzVHlwZSwgUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fSU5TRVJULCBpZGVudGlmaWVyLCBpc0F0dHIpOworICAgICAgICAgICAgICAgIGVtaXQoInJldHVybiB0YXJnZXQ7Iik7CisgICAgICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUG9zdGFtYmxlKCk7CisgICAgICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRKYXZhRG9jKCJSZW1vdmVzIHRoZSBpdGggIiArIHByb3BkZXNjKTsKKyAgICAgICAgICAgIGVtaXQoInB1YmxpYyB2b2lkIHJlbW92ZSIgKyBwcm9wZXJ0eU5hbWUgKyAiKGludCBpKSIpOworICAgICAgICAgICAgc3RhcnRCbG9jaygpOworICAgICAgICAgICAgZW1pdEltcGxlbWVudGF0aW9uUHJlYW1ibGUoKTsKKyAgICAgICAgICAgIGVtaXRQcmUoc1R5cGUsIFByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1JFTU9WRSwgaWRlbnRpZmllciwgaXNBdHRyLCAiaSIpOworICAgICAgICAgICAgZW1pdCgiZ2V0X3N0b3JlKCkucmVtb3ZlX2VsZW1lbnQoIiArIHNldElkZW50aWZpZXIgKyAiLCBpKTsiKTsKKyAgICAgICAgICAgIGVtaXRQb3N0KHNUeXBlLCBQcmVQb3N0RXh0ZW5zaW9uLk9QRVJBVElPTl9SRU1PVkUsIGlkZW50aWZpZXIsIGlzQXR0ciwgImkiKTsKKyAgICAgICAgICAgIGVtaXRJbXBsZW1lbnRhdGlvblBvc3RhbWJsZSgpOworICAgICAgICAgICAgZW5kQmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFR5cGVOYW1lKENsYXNzIGMsIFN0cmluZ0J1ZmZlciBzYikgeworICAgICAgICBpbnQgYXJyYXlDb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChjLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgYyA9IGMuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgYXJyYXlDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKGMuZ2V0TmFtZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBhcnJheUNvdW50OyBpKyspCisgICAgICAgICAgICBzYi5hcHBlbmQoIltdIik7CisKKyAgICB9CisKKyAgICB2b2lkIHByaW50SW5uZXJUeXBlSW1wbCgKKyAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSwgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIGJvb2xlYW4gaXNJbm5lciApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHNob3J0TmFtZSA9IHNUeXBlLmdldFNob3J0SmF2YUltcGxOYW1lKCk7CisKKyAgICAgICAgcHJpbnRJbm5lclR5cGVKYXZhRG9jKHNUeXBlKTsKKworICAgICAgICBzdGFydENsYXNzKHNUeXBlLCBpc0lubmVyKTsKKworICAgICAgICBwcmludENvbnN0cnVjdG9yKHNUeXBlLCBzaG9ydE5hbWUpOworCisgICAgICAgIHByaW50RXh0ZW5zaW9uSW1wbE1ldGhvZHMoc1R5cGUpOworCisgICAgICAgIGlmICghc1R5cGUuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllczsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzaW1wbGUgY29udGVudCB0eXBlcyBpbXBscyBkZXJpdmUgZGlyZWN0bHkgZnJvbSAiaG9sZGVyIiBpbXBscworICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSAoZm9yIGludHMgb3Igc3RyaW5nIGVudW1zIGUuZy4pIHdoZXJlCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBzaW1wbGUgdHlwZSByZXN0cmljdGlvbi4gIFNvIHByb3BlcnR5IGdldHRlcnMgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIGJlIGltcGxlbWVudGVkICJmcm9tIHNjcmF0Y2giIGZvciBlYWNoIGRlcml2ZWQgY29tcGxleCB0eXBlCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNUeXBlLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjb21wbGV4IGNvbnRlbnQgdHlwZSBpbXBsZW1lbnRhdGlvbnMgZGVyaXZlIGZyb20gYmFzZSB0eXBlIGltcGxzCisgICAgICAgICAgICAgICAgLy8gc28gZGVyaXZlZCBwcm9wZXJ0eSBpbXBscyBjYW4gYmUgcmV1c2VkCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IHNUeXBlLmdldERlcml2ZWRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1hcCBxTmFtZU1hcCA9IHByaW50U3RhdGljRmllbGRzKHByb3BlcnRpZXMpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHByb3BlcnRpZXNbaV07CisKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcHJvcC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHhtbFR5cGUgPSB4bWxUeXBlRm9yUHJvcGVydHkoIHByb3AgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcmludEdldHRlckltcGxzKAorICAgICAgICAgICAgICAgICAgICBwcm9wLAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9wLmlzQXR0cmlidXRlKCksCisgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBwcm9wLmdldEphdmFUeXBlQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZUZvclByb3BlcnR5KHByb3ApLAorICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLAorICAgICAgICAgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIsCisgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFPcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCisgICAgICAgICAgICAgICAgICAgIHByb3AuZXh0ZW5kc0phdmFTaW5nbGV0b24oKSwKKyAgICAgICAgICAgICAgICAgICAgeG1sVHlwZUZvclByb3BlcnR5SXNVbmlvbihwcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgIGdldFNldElkZW50aWZpZXIocU5hbWVNYXAsIG5hbWUpCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc1JlYWRPbmx5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludFNldHRlckltcGxzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuaXNBdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZ2V0SmF2YVByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5nZXRKYXZhVHlwZUNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUeXBlRm9yUHJvcGVydHkocHJvcCksCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5oYXNOaWxsYWJsZSgpICE9IFNjaGVtYVByb3BlcnR5Lk5FVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YU9wdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC5leHRlbmRzSmF2YUFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxUeXBlRm9yUHJvcGVydHlJc1VuaW9uKHByb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWRlbnRpZmllcihxTmFtZU1hcCwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRJZGVudGlmaWVyKHFOYW1lTWFwLCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNUeXBlCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnROZXN0ZWRUeXBlSW1wbHMoc1R5cGUsIHN5c3RlbSk7CisKKyAgICAgICAgZW5kQmxvY2soKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRFeHRlbnNpb25JbXBsTWV0aG9kcyhTY2hlbWFUeXBlIHNUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gZ2V0SW1wbChzVHlwZSk7CisgICAgICAgIGlmIChzSW1wbD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBFeHRlbnNpb25Ib2xkZXIgZXh0SG9sZGVyID0gc0ltcGwuZ2V0RXh0ZW5zaW9uSG9sZGVyKCk7CisgICAgICAgIGlmIChleHRIb2xkZXI9PW51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTGlzdCBleHRzID0gZXh0SG9sZGVyLmdldEludGVyZmFjZUV4dGVuc2lvbnNGb3Ioc1R5cGUuZ2V0RnVsbEphdmFOYW1lKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEludGVyZmFjZUV4dGVuc2lvbiBleHQgPSAoSW50ZXJmYWNlRXh0ZW5zaW9uKWkubmV4dCgpOworICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGo8ZXh0LmdldEludGVyZmFjZU1ldGhvZENvdW50KCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludEphdmFEb2MoIkltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaW50ZXJmYWNlICIgKyBleHQuZ2V0SW50ZXJmYWNlTmFtZUZvckphdmFTb3VyY2UoKSApOworICAgICAgICAgICAgICAgIGVtaXQoZXh0LmdldEludGVyZmFjZU1ldGhvZERlY2woaikpOworICAgICAgICAgICAgICAgIHN0YXJ0QmxvY2soKTsKKyAgICAgICAgICAgICAgICBlbWl0KGV4dC5nZXRJbnRlcmZhY2VNZXRob2RJbXBsKGopKTsKKyAgICAgICAgICAgICAgICBlbmRCbG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwcmludE5lc3RlZFR5cGVJbXBscyhTY2hlbWFUeXBlIHNUeXBlLCBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTY2hlbWFUeXBlW10gYW5vblR5cGVzID0gc1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9uVHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbm9uVHlwZXNbaV0uaXNTa2lwcGVkQW5vbnltb3VzVHlwZSgpKQorICAgICAgICAgICAgICAgIHByaW50TmVzdGVkVHlwZUltcGxzKGFub25UeXBlc1tpXSwgc3lzdGVtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludElubmVyVHlwZUltcGwoYW5vblR5cGVzW2ldLCBzeXN0ZW0sIHRydWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNDg2OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyMDIxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuRXh0ZW5zaW9uSG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTY2hlbWFUeXBlSW1wbCBpbXBsZW1lbnRzIFNjaGVtYVR5cGUsIFR5cGVTdG9yZVVzZXJGYWN0b3J5Cit7CisgICAgLy8gZ2xvYmFsIHR5cGVzIGhhdmUgbmFtZXMKKyAgICBwcml2YXRlIFFOYW1lIF9uYW1lOworCisgICAgLy8gY29tcGlsYXRpb24gc3VwcG9ydAorICAgIHByaXZhdGUgaW50IF9yZXNvbHZlUGhhc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOUkVTT0xWRUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZJTkdfU0dTID0gMTsgLy8gRm9yIGRvY3VtZW50IHR5cGVzIG9ubHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWRURfU0dTID0gMjsgIC8vIEZvciBkb2N1bWVudCB0eXBlcyBvbmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVklORyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVEID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQUlaSU5HID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQUlaRUQgPSA2OworCisgICAgLy8gYW5vbnltb3VzIHR5cGUgc3VwcG9ydAorICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX291dGVyU2NoZW1hVHlwZVJlZjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVtYUNvbXBvbmVudC5SZWYgX2NvbnRhaW5lckZpZWxkUmVmOworICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hRmllbGQgX2NvbnRhaW5lckZpZWxkOworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IF9jb250YWluZXJGaWVsZENvZGU7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgX2NvbnRhaW5lckZpZWxkSW5kZXg7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZltdIF9hbm9ueW1vdXNUeXBlcmVmczsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzRG9jdW1lbnRUeXBlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNBdHRyaWJ1dGVUeXBlOworICAgIC8vIHByaXZhdGUgYm9vbGVhbiBfc2tpcHBlZEFub255bW91c1R5cGU7CisKKyAgICAvLyBjb21waWxldGltZSBqYXZhIHR5cGUgc3VwcG9ydAorICAgIHByaXZhdGUgYm9vbGVhbiBfaXNDb21waWxlZDsKKyAgICBwcml2YXRlIFN0cmluZyBfc2hvcnRKYXZhTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIF9zaG9ydEphdmFJbXBsTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBfZnVsbEphdmFJbXBsTmFtZTsKKyAgICBwcml2YXRlIEV4dGVuc2lvbkhvbGRlciBfZXh0ZW5zaW9uSG9sZGVyOworCisgICAgLy8gcnVudGltZSBqYXZhIHR5cGUgc3VwcG9ydDogdm9sYXRpbGUgYmVjYXVzZSB0aGV5J3JlIGNhY2hlZAorICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgX2phdmFDbGFzczsKKyAgICBwcml2YXRlIHZvbGF0aWxlIENsYXNzIF9qYXZhRW51bUNsYXNzOworICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xhc3MgX2phdmFJbXBsQ2xhc3M7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb25zdHJ1Y3RvciBfamF2YUltcGxDb25zdHJ1Y3RvcjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIENvbnN0cnVjdG9yIF9qYXZhSW1wbENvbnN0cnVjdG9yMjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gX2ltcGxOb3RBdmFpbGFibGU7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIF9jdHJBcmdzID0gbmV3IE9iamVjdFtdIHsgdGhpcyB9OworCisgICAgLy8gcmVmbGVjdGl2ZSBzdXBwb3J0CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF90eXBlU3lzdGVtOworICAgIHByaXZhdGUgU3RyaW5nIF9maWxlbmFtZTsKKworICAgIC8vIGNvbXBsZXggY29udGVudCBzdXBwb3J0CisgICAgcHJpdmF0ZSBTY2hlbWFQYXJ0aWNsZSBfY29udGVudE1vZGVsOworICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hTG9jYWxFbGVtZW50W10gX2xvY2FsRWx0czsgLy8gbGF6aWx5IGNvbXB1dGVkCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXAgX2VsdFRvSW5kZXhNYXA7IC8vIGxhemlseSBjb21wdXRlZAorICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9hdHRyVG9JbmRleE1hcDsgLy8gbGF6aWx5IGNvbXB1dGVkCisgICAgcHJpdmF0ZSBNYXAgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lOworICAgIHByaXZhdGUgTWFwIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzQWxsQ29udGVudDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX29yZGVyU2Vuc2l0aXZlOworICAgIHByaXZhdGUgUU5hbWVTZXQgX3R5cGVkV2lsZGNhcmRFbGVtZW50czsKKyAgICBwcml2YXRlIFFOYW1lU2V0IF90eXBlZFdpbGRjYXJkQXR0cmlidXRlczsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1dpbGRjYXJkRWxlbWVudHM7CisgICAgcHJpdmF0ZSBib29sZWFuIF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXM7CisgICAgLy8gc2V0IG9mIHZhbGlkIFFOYW1lcyB0aGF0IGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgYSBwcm9wZXJ0eQorICAgIHByaXZhdGUgU2V0IF92YWxpZFN1YnN0aXR1dGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisKKyAgICAvLyBzaW1wbGUgY29udGVudCBzdXBwb3J0CisgICAgcHJpdmF0ZSBpbnQgX2NvbXBsZXhUeXBlVmFyaWV0eTsKKyAgICBwcml2YXRlIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIF9hdHRyaWJ1dGVNb2RlbDsKKworICAgIC8vIHNpbXBsZSB0eXBlIHN1cHBvcnQKKyAgICBwcml2YXRlIGludCBfYnVpbHRpblR5cGVDb2RlOworCisgICAgcHJpdmF0ZSBpbnQgX3NpbXBsZVR5cGVWYXJpZXR5OworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNTaW1wbGVUeXBlOworCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfYmFzZVR5cGVyZWY7IC8vIHZpYSByZXN0cmljdGlvbiBvciBleHRlbnNpb24KKyAgICBwcml2YXRlIGludCBfYmFzZURlcHRoOyAvLyBob3cgbWFueSBpbmhlcml0YW5jZSBzdGVwcyB0byBBbnlUeXBlCisgICAgcHJpdmF0ZSBpbnQgX2Rlcml2YXRpb25UeXBlOworCisgICAgLy8gZmFjZXRzCisgICAgcHJpdmF0ZSBYbWxWYWx1ZVJlZltdIF9mYWNldEFycmF5OworICAgIHByaXZhdGUgYm9vbGVhbltdIF9maXhlZEZhY2V0QXJyYXk7CisKKyAgICAvLyBmdW5kYW1lbnRhbCBmYWNldHMKKyAgICBwcml2YXRlIGludCBfb3JkZXJlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzRmluaXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNCb3VuZGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBfaXNOdW1lcmljOworCisgICAgcHJpdmF0ZSBib29sZWFuIF9hYnM7CisgICAgcHJpdmF0ZSBib29sZWFuIF9maW5hbEV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsUmVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ZpbmFsVW5pb247CisgICAgcHJpdmF0ZSBib29sZWFuIF9ibG9ja0V4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2Jsb2NrUmVzdDsKKworICAgIC8vIHdoaXRlc3BhY2UgZmFjZXQKKyAgICBwcml2YXRlIGludCBfd2hpdGVTcGFjZVJ1bGU7CisKKyAgICAvLyByZWdleCBwYXR0ZXJucworICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzUGF0dGVybnM7IC8vIGFsc28gdGFrZXMgaW50byBhY2NvdW50IGJhc2UgY2xhc3NlcworICAgIHByaXZhdGUgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gX3BhdHRlcm5zOworCisgICAgLy8gZW51bWVyYXRlZCB2YWx1ZXMKKyAgICBwcml2YXRlIFhtbFZhbHVlUmVmW10gX2VudW1lcmF0aW9uVmFsdWVzOworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX2Jhc2VFbnVtVHlwZXJlZjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3N0cmluZ0VudW1FbnN1cmVkOworICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwIF9sb29rdXBTdHJpbmdFbnVtOworICAgIHByaXZhdGUgdm9sYXRpbGUgTGlzdCBfbGlzdE9mU3RyaW5nRW51bTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1hcCBfbG9va3VwU3RyaW5nRW51bUVudHJ5OworICAgIHByaXZhdGUgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gX3N0cmluZ0VudW1FbnRyaWVzOworCisgICAgLy8gZm9yIGxpc3RzIG9ubHkKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUuUmVmIF9saXN0SXRlbVR5cGVyZWY7CisKKyAgICAvLyBmb3IgdW5pb25zIG9ubHkKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzVW5pb25PZkxpc3RzOworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWZbXSBfdW5pb25NZW1iZXJUeXBlcmVmczsKKyAgICBwcml2YXRlIGludCBfYW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsOworICAgIHByaXZhdGUgdm9sYXRpbGUgU2NoZW1hVHlwZVtdIF91bmlvbkNvbnN0aXR1ZW50VHlwZXM7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFUeXBlW10gX3VuaW9uU3ViVHlwZXM7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlbWFUeXBlIF91bmlvbkNvbW1vbkJhc2VUeXBlOworCisgICAgLy8gZm9yIGF0b21pYyB0eXBlcyBvbmx5CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlLlJlZiBfcHJpbWl0aXZlVHlwZVJlZjsKKworICAgIC8vIGZvciBkZWNpbWFsIHJlc3RyaWN0aW9ucyBvbmx5CisgICAgcHJpdmF0ZSBpbnQgX2RlY2ltYWxTaXplOworCisgICAgLy8gbGF6eSBsb2FkaW5nIHN1cHBvcnQKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gX3VubG9hZGVkOworCisgICAgLy8gZm9yIGRvY3VtZW50IHR5cGVzIG9ubHkgLSBvbmx5IHZhbGlkIGR1cmluZyBjb21waWxhdGlvbgorICAgIHByaXZhdGUgUU5hbWUgX3NnOworICAgIHByaXZhdGUgTGlzdCBfc2dNZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmxvYWRlZCgpCisgICAgeworICAgICAgICByZXR1cm4gX3VubG9hZGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaExvYWRpbmcoKQorICAgIHsKKyAgICAgICAgX3VubG9hZGVkID0gZmFsc2U7CisgICAgfQorCisKKworICAgIFNjaGVtYVR5cGVJbXBsKFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbSkKKyAgICB7CisgICAgICAgIF90eXBlU3lzdGVtID0gdHlwZVN5c3RlbTsKKyAgICB9CisKKyAgICBTY2hlbWFUeXBlSW1wbChTY2hlbWFUeXBlU3lzdGVtIHR5cGVTeXN0ZW0sIGJvb2xlYW4gdW5sb2FkZWQpCisgICAgeworICAgICAgICBfdHlwZVN5c3RlbSA9IHR5cGVTeXN0ZW07CisgICAgICAgIF91bmxvYWRlZCA9IHVubG9hZGVkOworICAgICAgICBpZiAodW5sb2FkZWQpCisgICAgICAgICAgICBmaW5pc2hRdWljaygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU0dSZXNvbHZlZCgpCisgICAgICAgIHsgcmV0dXJuIF9yZXNvbHZlUGhhc2UgPj0gUkVTT0xWRURfU0dTOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NHUmVzb2x2aW5nKCkKKyAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA+PSBSRVNPTFZJTkdfU0dTOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkKKyAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA+PSBSRVNPTFZFRDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZpbmcoKQorICAgICAgICB7IHJldHVybiBfcmVzb2x2ZVBoYXNlID09IFJFU09MVklORzsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmphdmFpemVkKCkKKyAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA8IEpBVkFJWkVEOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0phdmFpemVkKCkKKyAgICAgICAgeyByZXR1cm4gX3Jlc29sdmVQaGFzZSA9PSBKQVZBSVpFRDsgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRSZXNvbHZpbmdTR3MoKQorICAgIHsKKyAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gVU5SRVNPTFZFRCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVklOR19TR1M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoUmVzb2x2aW5nU0dzKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklOR19TR1MpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZFRF9TR1M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRSZXNvbHZpbmcoKQorICAgIHsKKyAgICAgICAgaWYgKCAoX2lzRG9jdW1lbnRUeXBlICYmIF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWRURfU0dTKSB8fAorICAgICAgICAgICAgICghX2lzRG9jdW1lbnRUeXBlICYmIF9yZXNvbHZlUGhhc2UgIT0gVU5SRVNPTFZFRCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9yZXNvbHZlUGhhc2UgPSBSRVNPTFZJTkc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoUmVzb2x2aW5nKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVklORykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgX3Jlc29sdmVQaGFzZSA9IFJFU09MVkVEOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0SmF2YWl6aW5nKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfcmVzb2x2ZVBoYXNlID0gSkFWQUlaSU5HOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmlzaEphdmFpemluZygpCisgICAgeworICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBKQVZBSVpJTkcpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIF9yZXNvbHZlUGhhc2UgPSBKQVZBSVpFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmluaXNoUXVpY2soKQorICAgIHsKKyAgICAgICAgX3Jlc29sdmVQaGFzZSA9IEpBVkFJWkVEOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRVbnJlc29sdmVkKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFVOUkVTT0xWRUQgJiYgIV91bmxvYWRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U0dSZXNvbHZpbmcoKQorICAgIHsKKyAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HX1NHUyAmJiAhX3VubG9hZGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTR1Jlc29sdmVkKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEX1NHUyAmJiAhX3VubG9hZGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXNvbHZpbmcoKQorICAgIHsKKyAgICAgICAgaWYgKF9yZXNvbHZlUGhhc2UgIT0gUkVTT0xWSU5HICYmICFfdW5sb2FkZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc29sdmVkKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb2x2ZVBoYXNlICE9IFJFU09MVkVEICYmICFfdW5sb2FkZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEphdmFpemluZygpCisgICAgeworICAgICAgICBpZiAoX3Jlc29sdmVQaGFzZSAhPSBKQVZBSVpJTkcgJiYgIV91bmxvYWRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpCisgICAgICAgIHsgcmV0dXJuIF9uYW1lOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpCisgICAgICAgIHsgYXNzZXJ0VW5yZXNvbHZlZCgpOyBfbmFtZSA9IG5hbWU7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpCisgICAgeworICAgICAgICBpZiAoX2ZpbGVuYW1lICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2ZpbGVuYW1lOworICAgICAgICBpZiAoZ2V0T3V0ZXJUeXBlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRPdXRlclR5cGUoKS5nZXRTb3VyY2VOYW1lKCk7CisKKyAgICAgICAgU2NoZW1hRmllbGQgZmllbGQgPSBnZXRDb250YWluZXJGaWVsZCgpOworICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgU2NoZW1hR2xvYmFsRWxlbWVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTY2hlbWFHbG9iYWxFbGVtZW50KWZpZWxkKS5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWZpZWxkKS5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2ZpbGVuYW1lID0gZmlsZW5hbWU7IH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5UWVBFOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91c1R5cGUoKQorICAgICAgICB7IHJldHVybiBfbmFtZSA9PSBudWxsOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50VHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9pc0RvY3VtZW50VHlwZTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX2lzQXR0cmlidXRlVHlwZTsgfQorCisgICAgcHVibGljIFFOYW1lIGdldERvY3VtZW50RWxlbWVudE5hbWUoKQorICAgIHsKKyAgICAgICAgaWYgKF9pc0RvY3VtZW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgc3AgPSBnZXRDb250ZW50TW9kZWwoKTsKKyAgICAgICAgICAgIGlmIChzcCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzcC5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlVHlwZUF0dHJpYnV0ZU5hbWUoKQorICAgIHsKKyAgICAgICAgaWYgKF9pc0F0dHJpYnV0ZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNhbSA9IGdldEF0dHJpYnV0ZU1vZGVsKCk7CisgICAgICAgICAgICBpZiAoc2FtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGVbXSBzbGFBcnJheSA9IHNhbS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNsYUFycmF5ICE9IG51bGwgJiYgc2xhQXJyYXkubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlIHNsYSA9IHNsYUFycmF5WzBdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2xhLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFR5cGUoYm9vbGVhbiBpc0RvY3VtZW50KQorICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2lzRG9jdW1lbnRUeXBlID0gaXNEb2N1bWVudDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShib29sZWFuIGlzQXR0cmlidXRlKQorICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2lzQXR0cmlidXRlVHlwZSA9IGlzQXR0cmlidXRlOyB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX2NvbXBsZXhUeXBlVmFyaWV0eTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGxleFR5cGVWYXJpZXR5KGludCBjb21wbGV4VHlwZVZhcmlldHkpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9jb21wbGV4VHlwZVZhcmlldHkgPSBjb21wbGV4VHlwZVZhcmlldHk7IH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlciBnZXRFbGVtZW50U2VxdWVuY2VyKCkKKyAgICB7CisgICAgICAgIGlmIChfY29tcGxleFR5cGVWYXJpZXR5ID09IE5PVF9DT01QTEVYX1RZUEUpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcXVlbmNlckltcGwobnVsbCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW5jZXJJbXBsKG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoX2NvbnRlbnRNb2RlbCkpOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIGFic3RyYWN0IGFuZCBmaW5hbCBmbGFncyBmb3IgYSBjb21wbGV4IHR5cGUgKi8KKyAgICB2b2lkIHNldEFic3RyYWN0RmluYWwoCisgICAgICAgIGJvb2xlYW4gYWJzLCBib29sZWFuIGZpbmFsRXh0LCBib29sZWFuIGZpbmFsUmVzdCwgYm9vbGVhbiBmaW5hbExpc3QsIGJvb2xlYW4gZmluYWxVbmlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFJlc29sdmluZygpOworICAgICAgICBfYWJzID0gYWJzOworICAgICAgICBfZmluYWxFeHQgPSBmaW5hbEV4dDsgX2ZpbmFsUmVzdCA9IGZpbmFsUmVzdDsKKyAgICAgICAgX2ZpbmFsTGlzdCA9IGZpbmFsTGlzdDsgX2ZpbmFsVW5pb24gPSBmaW5hbFVuaW9uOworICAgIH0KKworICAgIC8qKiBTZXQgdGhlIGZpbmFsIGZsYWdzIGZvciBhIHNpbXBsZSB0eXBlICovCisgICAgdm9pZCBzZXRTaW1wbGVGaW5hbChib29sZWFuIGZpbmFsUmVzdCwgYm9vbGVhbiBmaW5hbExpc3QsIGJvb2xlYW4gZmluYWxVbmlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFJlc29sdmluZygpOyBfZmluYWxSZXN0ID0gZmluYWxSZXN0OyBfZmluYWxMaXN0ID0gZmluYWxMaXN0IDsgX2ZpbmFsVW5pb24gPSBmaW5hbFVuaW9uOworICAgIH0KKworICAgIHZvaWQgc2V0QmxvY2soYm9vbGVhbiBibG9ja0V4dCwgYm9vbGVhbiBibG9ja1Jlc3QpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsgX2Jsb2NrRXh0ID0gYmxvY2tFeHQgOyBfYmxvY2tSZXN0ID0gYmxvY2tSZXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKQorICAgIHsgcmV0dXJuIF9ibG9ja1Jlc3Q7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGJsb2NrRXh0ZW5zaW9uKCkKKyAgICB7IHJldHVybiBfYmxvY2tFeHQ7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKQorICAgIHsgcmV0dXJuIF9hYnM7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsRXh0ZW5zaW9uKCkKKyAgICB7IHJldHVybiBfZmluYWxFeHQ7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsUmVzdHJpY3Rpb24oKQorICAgIHsgcmV0dXJuIF9maW5hbFJlc3Q7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsTGlzdCgpCisgICAgeyByZXR1cm4gX2ZpbmFsTGlzdDsgfQorCisgICAgcHVibGljIGJvb2xlYW4gZmluYWxVbmlvbigpCisgICAgeyByZXR1cm4gX2ZpbmFsVW5pb247IH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hRmllbGQgZ2V0Q29udGFpbmVyRmllbGQoKQorICAgIHsKKyAgICAgICAgaWYgKF9jb250YWluZXJGaWVsZENvZGUgIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgb3V0ZXIgPSBnZXRPdXRlclR5cGUoKTsKKyAgICAgICAgICAgIGlmIChfY29udGFpbmVyRmllbGRDb2RlID09IDApCisgICAgICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gX2NvbnRhaW5lckZpZWxkUmVmID09IG51bGwgPyBudWxsIDogKFNjaGVtYUZpZWxkKV9jb250YWluZXJGaWVsZFJlZi5nZXRDb21wb25lbnQoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKF9jb250YWluZXJGaWVsZENvZGUgPT0gMSkKKyAgICAgICAgICAgICAgICBfY29udGFpbmVyRmllbGQgPSBvdXRlci5nZXRBdHRyaWJ1dGVNb2RlbCgpLmdldEF0dHJpYnV0ZXMoKVtfY29udGFpbmVyRmllbGRJbmRleF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gKChTY2hlbWFUeXBlSW1wbClvdXRlcikuZ2V0TG9jYWxFbGVtZW50QnlJbmRleChfY29udGFpbmVyRmllbGRJbmRleCk7CisgICAgICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9jb250YWluZXJGaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZChTY2hlbWFGaWVsZCBmaWVsZCkKKyAgICB7CisgICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKKyAgICAgICAgX2NvbnRhaW5lckZpZWxkID0gZmllbGQ7CisgICAgICAgIF9jb250YWluZXJGaWVsZENvZGUgPSAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZFJlZihTY2hlbWFDb21wb25lbnQuUmVmIHJlZikKKyAgICB7CisgICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKKyAgICAgICAgX2NvbnRhaW5lckZpZWxkUmVmID0gcmVmOworICAgICAgICBfY29udGFpbmVyRmllbGRDb2RlID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXJGaWVsZEluZGV4KHNob3J0IGNvZGUsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGFzc2VydFVucmVzb2x2ZWQoKTsKKyAgICAgICAgX2NvbnRhaW5lckZpZWxkQ29kZSA9IGNvZGU7CisgICAgICAgIF9jb250YWluZXJGaWVsZEluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0T3V0ZXJUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX291dGVyU2NoZW1hVHlwZVJlZiA9PSBudWxsID8gbnVsbCA6IF9vdXRlclNjaGVtYVR5cGVSZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dGVyU2NoZW1hVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQorICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX291dGVyU2NoZW1hVHlwZVJlZiA9IHR5cGVyZWY7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGlsZWQoKQorICAgICAgICB7IHJldHVybiBfaXNDb21waWxlZDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZWQoYm9vbGVhbiBmKQorICAgICAgICB7IGFzc2VydEphdmFpemluZygpOyBfaXNDb21waWxlZCA9IGY7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcHBlZEFub255bW91c1R5cGUoKQorICAgICAgICB7IHJldHVybiBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpLmdldEJhc2VUeXBlKCkgPT0gdGhpczsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTaG9ydEphdmFOYW1lKCkKKyAgICAgICAgeyByZXR1cm4gX3Nob3J0SmF2YU5hbWU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0SmF2YU5hbWUoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOworICAgICAgICBfc2hvcnRKYXZhTmFtZSA9IG5hbWU7CisgICAgICAgIFNjaGVtYVR5cGUgb3V0ZXIgPSBfb3V0ZXJTY2hlbWFUeXBlUmVmLmdldCgpOworICAgICAgICB3aGlsZSAob3V0ZXIuZ2V0RnVsbEphdmFOYW1lKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dGVyID0gb3V0ZXIuZ2V0T3V0ZXJUeXBlKCk7CisKKyAgICAgICAgX2Z1bGxKYXZhTmFtZSA9IG91dGVyLmdldEZ1bGxKYXZhTmFtZSgpICsgIiQiICsgX3Nob3J0SmF2YU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsSmF2YU5hbWUoKQorICAgICAgICB7IHJldHVybiBfZnVsbEphdmFOYW1lOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsSmF2YU5hbWUoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOworICAgICAgICBfZnVsbEphdmFOYW1lID0gbmFtZTsKKyAgICAgICAgaW50IGluZGV4ID0gTWF0aC5tYXgoX2Z1bGxKYXZhTmFtZS5sYXN0SW5kZXhPZignJCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFOYW1lLmxhc3RJbmRleE9mKCcuJykpICsgMTsKKyAgICAgICAgX3Nob3J0SmF2YU5hbWUgPSBfZnVsbEphdmFOYW1lLnN1YnN0cmluZyhpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRKYXZhSW1wbE5hbWUoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOworICAgICAgICBfc2hvcnRKYXZhSW1wbE5hbWUgPSBuYW1lOworICAgICAgICBTY2hlbWFUeXBlIG91dGVyID0gX291dGVyU2NoZW1hVHlwZVJlZi5nZXQoKTsKKyAgICAgICAgd2hpbGUgKG91dGVyLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSA9PSBudWxsKQorICAgICAgICAgICAgb3V0ZXIgPSBvdXRlci5nZXRPdXRlclR5cGUoKTsKKworICAgICAgICBfZnVsbEphdmFJbXBsTmFtZSA9IG91dGVyLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSArICIkIiArIF9zaG9ydEphdmFJbXBsTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsSmF2YUltcGxOYW1lKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKKyAgICAgICAgX2Z1bGxKYXZhSW1wbE5hbWUgPSBuYW1lOworICAgICAgICBpbnQgaW5kZXggPSBNYXRoLm1heChfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignJCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnVsbEphdmFJbXBsTmFtZS5sYXN0SW5kZXhPZignLicpKSArIDE7CisgICAgICAgIF9zaG9ydEphdmFJbXBsTmFtZSA9IF9mdWxsSmF2YUltcGxOYW1lLnN1YnN0cmluZyhpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uSG9sZGVyKEV4dGVuc2lvbkhvbGRlciBleHRIb2xkZXIpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZlZCgpOworICAgICAgICBfZXh0ZW5zaW9uSG9sZGVyID0gZXh0SG9sZGVyOworICAgIH0KKworICAgIHB1YmxpYyBFeHRlbnNpb25Ib2xkZXIgZ2V0RXh0ZW5zaW9uSG9sZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZXh0ZW5zaW9uSG9sZGVyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbEphdmFJbXBsTmFtZSgpIHsgcmV0dXJuIF9mdWxsSmF2YUltcGxOYW1lO30KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0SmF2YUltcGxOYW1lKCkgeyByZXR1cm4gX3Nob3J0SmF2YUltcGxOYW1lO30KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtIGdldFR5cGVTeXN0ZW0oKQorICAgICAgICB7IHJldHVybiBfdHlwZVN5c3RlbTsgfQorCisgICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGdldENvbnRlbnRNb2RlbCgpCisgICAgICAgIHsgcmV0dXJuIF9jb250ZW50TW9kZWw7IH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRFbHRMaXN0KExpc3QgZWx0TGlzdCwgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQorICAgIHsKKyAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN3aXRjaCAoY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgZWx0TGlzdC5hZGQoY29udGVudE1vZGVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkRWx0TGlzdChlbHRMaXN0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRMb2NhbEVsdHMoKQorICAgIHsKKyAgICAgICAgTGlzdCBlbHRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBidWlsZEVsdExpc3QoZWx0TGlzdCwgX2NvbnRlbnRNb2RlbCk7CisgICAgICAgIF9sb2NhbEVsdHMgPSAoU2NoZW1hTG9jYWxFbGVtZW50W10pZWx0TGlzdC50b0FycmF5KG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRbZWx0TGlzdC5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hTG9jYWxFbGVtZW50IGdldExvY2FsRWxlbWVudEJ5SW5kZXgoaW50IGkpCisgICAgeworICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRbXSBlbHRzID0gX2xvY2FsRWx0czsKKyAgICAgICAgaWYgKGVsdHMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRMb2NhbEVsdHMoKTsKKyAgICAgICAgICAgIGVsdHMgPSBfbG9jYWxFbHRzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbHRzW2ldOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhGb3JMb2NhbEVsZW1lbnQoU2NoZW1hTG9jYWxFbGVtZW50IGVsdCkKKyAgICB7CisgICAgICAgIE1hcCBsb2NhbEVsdE1hcCA9IF9lbHRUb0luZGV4TWFwOworICAgICAgICBpZiAobG9jYWxFbHRNYXAgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9sb2NhbEVsdHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWlsZExvY2FsRWx0cygpOworICAgICAgICAgICAgbG9jYWxFbHRNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbG9jYWxFbHRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvY2FsRWx0TWFwLnB1dChfbG9jYWxFbHRzW2ldLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZWx0VG9JbmRleE1hcCA9IGxvY2FsRWx0TWFwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEludGVnZXIpbG9jYWxFbHRNYXAuZ2V0KGVsdCkpLmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbmRleEZvckxvY2FsQXR0cmlidXRlKFNjaGVtYUxvY2FsQXR0cmlidXRlIGF0dHIpCisgICAgeworICAgICAgICBNYXAgbG9jYWxBdHRyTWFwID0gX2F0dHJUb0luZGV4TWFwOworICAgICAgICBpZiAobG9jYWxBdHRyTWFwID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsQXR0ck1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJzID0gdGhpcy5fYXR0cmlidXRlTW9kZWwuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2NhbEF0dHJNYXAucHV0KGF0dHJzW2ldLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYXR0clRvSW5kZXhNYXAgPSBsb2NhbEF0dHJNYXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoSW50ZWdlcilsb2NhbEF0dHJNYXAuZ2V0KGF0dHIpKS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBnZXRBdHRyaWJ1dGVNb2RlbCgpCisgICAgICAgIHsgcmV0dXJuIF9hdHRyaWJ1dGVNb2RlbDsgfQorCisgICAgcHVibGljIFNjaGVtYVByb3BlcnR5W10gZ2V0UHJvcGVydGllcygpCisgICAgeworICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlUHJvcGVydGllcygpOworCisgICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0LmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCkpOworICAgICAgICBsaXN0LmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS52YWx1ZXMoKSk7CisgICAgICAgIGlmIChsaXN0LnNpemUoKT09MCkKKyAgICAgICAgICAgIHJldHVybiBOT19QUk9QRVJUSUVTOworICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pbGlzdC50b0FycmF5KG5ldyBTY2hlbWFQcm9wZXJ0eVtsaXN0LnNpemUoKV0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVtYVByb3BlcnR5W10gTk9fUFJPUEVSVElFUyA9IG5ldyBTY2hlbWFQcm9wZXJ0eVswXTsKKworICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eVtdIGdldERlcml2ZWRQcm9wZXJ0aWVzKCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBnZXRCYXNlVHlwZSgpOworICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS52YWx1ZXMoKSk7CisKKyAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICByZXN1bHRzLmFkZEFsbChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZS52YWx1ZXMoKSk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHJlc3VsdHMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlpdC5uZXh0KCk7CisgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBiYXNlUHJvcCA9IHByb3AuaXNBdHRyaWJ1dGUoKSA/CisgICAgICAgICAgICAgICAgYmFzZVR5cGUuZ2V0QXR0cmlidXRlUHJvcGVydHkocHJvcC5nZXROYW1lKCkpIDoKKyAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRFbGVtZW50UHJvcGVydHkocHJvcC5nZXROYW1lKCkpOworCisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGVyaXZlZCBwcm9wZXJ0eSBmcm9tIHRoZSByZXN1bHRzIGlmIGl0IGlzCisgICAgICAgICAgICAvLyBBKSBwcmVzZW50IGluIHRoZSBiYXNlIHR5cGUgYW5kCisgICAgICAgICAgICAvLyBCKSBhbGwgdGhlIGRldGFpbHMgYXJlIHRoZSBzYW1lIChjYXJkaW5hbGl0eSwgbmlsbGFiaWxpdHkpCisKKyAgICAgICAgICAgIGlmIChiYXNlUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZXEocHJvcC5nZXRNaW5PY2N1cnMoKSwgYmFzZVByb3AuZ2V0TWluT2NjdXJzKCkpICYmCisgICAgICAgICAgICAgICAgICAgICBlcShwcm9wLmdldE1heE9jY3VycygpLCBiYXNlUHJvcC5nZXRNYXhPY2N1cnMoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSA9PSBiYXNlUHJvcC5oYXNOaWxsYWJsZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIE5PX1BST1BFUlRJRVM7CisgICAgICAgIHJldHVybiAoU2NoZW1hUHJvcGVydHlbXSlyZXN1bHRzLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W3Jlc3VsdHMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShCaWdJbnRlZ2VyIGEsIEJpZ0ludGVnZXIgYikKKyAgICB7CisgICAgICAgIGlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChhPT0gbnVsbCB8fCBiID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBhLmVxdWFscyhiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXRFbGVtZW50UHJvcGVydGllcygpCisgICAgeworICAgICAgICBpZiAoX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gTk9fUFJPUEVSVElFUzsKKworICAgICAgICByZXR1cm4gKFNjaGVtYVByb3BlcnR5W10pCisgICAgICAgICAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W19wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hUHJvcGVydHlbXSBnZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCkKKyAgICB7CisgICAgICAgIGlmIChfcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIE5PX1BST1BFUlRJRVM7CisKKyAgICAgICAgcmV0dXJuIChTY2hlbWFQcm9wZXJ0eVtdKQorICAgICAgICAgICAgICAgIF9wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVByb3BlcnR5W19wcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eSBnZXRFbGVtZW50UHJvcGVydHkoUU5hbWUgZWx0TmFtZSkKKyAgICAgICAgeyByZXR1cm4gX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lID09IG51bGwgPyBudWxsIDogKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7IH0KKworICAgIHB1YmxpYyBTY2hlbWFQcm9wZXJ0eSBnZXRBdHRyaWJ1dGVQcm9wZXJ0eShRTmFtZSBhdHRyTmFtZSkKKyAgICAgICAgeyByZXR1cm4gX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCA/IG51bGwgOiAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzQWxsQ29udGVudCgpCisgICAgICAgIHsgcmV0dXJuIF9oYXNBbGxDb250ZW50OyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09yZGVyU2Vuc2l0aXZlKCkKKyAgICAgICAgeyByZXR1cm4gX29yZGVyU2Vuc2l0aXZlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPcmRlclNlbnNpdGl2ZShib29sZWFuIHNlbnNpdGl2ZSkKKyAgICAgICAgeyBhc3NlcnRKYXZhaXppbmcoKTsgX29yZGVyU2Vuc2l0aXZlID0gc2Vuc2l0aXZlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoCisgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwsCisgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhdHRyTW9kZWwsCisgICAgICAgICAgICBNYXAgcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUsCisgICAgICAgICAgICBNYXAgcHJvcGVydHlNb2RlbEJ5QXR0cmlidXRlTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNBbGwpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKKyAgICAgICAgX2NvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKKyAgICAgICAgX2F0dHJpYnV0ZU1vZGVsID0gYXR0ck1vZGVsOworICAgICAgICBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUgPSBwcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZTsKKyAgICAgICAgX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eU1vZGVsQnlBdHRyaWJ1dGVOYW1lOworICAgICAgICBfaGFzQWxsQ29udGVudCA9IGlzQWxsOworCisKKyAgICAgICAgLy8gQWRkIGVudHJpZXMgZm9yIGVhY2ggZWxlbWVudCBwcm9wZXJ0eSBmb3Igc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMKKyAgICAgICAgaWYgKF9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfdmFsaWRTdWJzdGl0dXRpb25zID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gZWx0UHJvcHMgPSBfcHJvcGVydHlNb2RlbEJ5RWxlbWVudE5hbWUudmFsdWVzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZWx0UHJvcHMuaXRlcmF0b3IoKSA7IGl0Lmhhc05leHQoKSA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBRTmFtZVtdIG5hbWVzID0gcHJvcC5hY2NlcHRlZE5hbWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmFtZXMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmNvbnRhaW5zS2V5KG5hbWVzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF92YWxpZFN1YnN0aXR1dGlvbnMuYWRkKG5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNFbGVtZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q29udGVudFR5cGUoKSA9PSBFTEVNRU5UX0NPTlRFTlQgfHwKKyAgICAgICAgICAgICAgIGdldENvbnRlbnRUeXBlKCkgPT0gTUlYRURfQ09OVEVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVXaWxkY2FyZHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRWxlbWVudFdpbGRjYXJkcygpCisgICAgeworICAgICAgICByZXR1cm4gX2hhc1dpbGRjYXJkRWxlbWVudHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1YnN0aXR1dGlvbihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWxpZFN1YnN0aXR1dGlvbnMuY29udGFpbnMobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0RWxlbWVudFR5cGUoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCisgICAgeworICAgICAgICBpZiAoaXNTaW1wbGVUeXBlKCkgfHwgIWNvbnRhaW5zRWxlbWVudHMoKSB8fCBpc05vVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7CisKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlOworICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gKFNjaGVtYVByb3BlcnR5KV9wcm9wZXJ0eU1vZGVsQnlFbGVtZW50TmFtZS5nZXQoZWx0TmFtZSk7CisgICAgICAgIGlmIChwcm9wICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGUgPSBwcm9wLmdldFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3R5cGVkV2lsZGNhcmRFbGVtZW50cy5jb250YWlucyhlbHROYW1lKSB8fCB3aWxkY2FyZFR5cGVMb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKworICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQgPSB3aWxkY2FyZFR5cGVMb2FkZXIuZmluZEVsZW1lbnQoZWx0TmFtZSk7CisgICAgICAgICAgICBpZiAoZWx0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX05PX1RZUEU7CisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2tleS1sdmEsCisgICAgICAgICAgICAvLyB0aGUgbGluZSBhYm92ZSBzaG91bGQgcmV0dXJuIFNUX0FOWV9UWVBFLgorICAgICAgICAgICAgdHlwZSA9IGVsdC5nZXRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeHNpVHlwZSAhPSBudWxsICYmIHdpbGRjYXJkVHlwZUxvYWRlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIGl0eXBlID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRUeXBlKHhzaVR5cGUpOworCisgICAgICAgICAgICAvLyBOT1RFOiBhIHByZXZpb3VzIHZlcnNpb24gb2YgWE1MQmVhbnMgdXNlZCBTVF9OT19UWVBFIGlmIHRoZQorICAgICAgICAgICAgLy8geHNpVHlwZSB3YXMgbm90IGRlcml2ZWQgZnJvbSAndHlwZScsIGJ1dCB0aGlzIHJlc3VsdHMgaW4gYQorICAgICAgICAgICAgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uLiAgSW5zdGVhZCB3ZSBpZ25vcmUgeHNpOnR5cGUgaWYgaXQncyBub3QKKyAgICAgICAgICAgIC8vIGZvdW5kIG9yIGEgZGVyaXZlZCB0eXBlLgorICAgICAgICAgICAgaWYgKGl0eXBlICE9IG51bGwgJiYgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGl0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldEF0dHJpYnV0ZVR5cGUoUU5hbWUgYXR0ck5hbWUsIFNjaGVtYVR5cGVMb2FkZXIgd2lsZGNhcmRUeXBlTG9hZGVyKQorICAgIHsKKyAgICAgICAgaWYgKGlzU2ltcGxlVHlwZSgpIHx8IGlzTm9UeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKworICAgICAgICBpZiAoaXNVUlR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworCisgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsKKyAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwcm9wLmdldFR5cGUoKTsKKworICAgICAgICBpZiAoIV90eXBlZFdpbGRjYXJkQXR0cmlidXRlcy5jb250YWlucyhhdHRyTmFtZSkgfHwgd2lsZGNhcmRUeXBlTG9hZGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKworICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgYXR0ciA9IHdpbGRjYXJkVHlwZUxvYWRlci5maW5kQXR0cmlidXRlKGF0dHJOYW1lKTsKKyAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOworICAgICAgICByZXR1cm4gYXR0ci5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVFbGVtZW50VHlwZShRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcikKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IG51bGw7CisgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBudWxsOworICAgICAgICBpZiAoaXNTaW1wbGVUeXBlKCkgfHwgIWNvbnRhaW5zRWxlbWVudHMoKSB8fCBpc05vVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUVsZW1lbnROYW1lLmdldChlbHROYW1lKTsKKyAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IHByb3AuZ2V0VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIV90eXBlZFdpbGRjYXJkRWxlbWVudHMuY29udGFpbnMoZWx0TmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICFfdmFsaWRTdWJzdGl0dXRpb25zLmNvbnRhaW5zKGVsdE5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0ID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRFbGVtZW50KGVsdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChlbHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGVsdC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHhzaVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIGl0eXBlID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRUeXBlKHhzaVR5cGUpOworCisgICAgICAgICAgICAgICAgLy8gTk9URTogYSBwcmV2aW91cyB2ZXJzaW9uIG9mIFhNTEJlYW5zIHVzZWQgU1RfTk9fVFlQRSBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyB4c2lUeXBlIHdhcyBub3QgZGVyaXZlZCBmcm9tICd0eXBlJywgYnV0IHRoaXMgcmVzdWx0cyBpbiBhCisgICAgICAgICAgICAgICAgLy8gQ2xhc3NDYXN0RXhjZXB0aW9uLiAgSW5zdGVhZCB3ZSBpZ25vcmUgeHNpOnR5cGUgaWYgaXQncyBub3QKKyAgICAgICAgICAgICAgICAvLyBmb3VuZCBvciBhIGRlcml2ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICBpZiAoaXR5cGUgIT0gbnVsbCAmJiB0eXBlLmlzQXNzaWduYWJsZUZyb20oaXR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBpdHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuY3JlYXRlVW5hdHRhY2hlZE5vZGUocHJvcCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgY3JlYXRlQXR0cmlidXRlVHlwZShRTmFtZSBhdHRyTmFtZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlSW1wbCB0eXBlID0gbnVsbDsKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IG51bGw7CisgICAgICAgIGlmIChpc1NpbXBsZVR5cGUoKSB8fCBpc05vVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc1VSVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3AgPSAoU2NoZW1hUHJvcGVydHkpX3Byb3BlcnR5TW9kZWxCeUF0dHJpYnV0ZU5hbWUuZ2V0KGF0dHJOYW1lKTsKKyAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZSA9IChTY2hlbWFUeXBlSW1wbClwcm9wLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0ck5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyID0gd2lsZGNhcmRUeXBlTG9hZGVyLmZpbmRBdHRyaWJ1dGUoYXR0ck5hbWUpOworICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoU2NoZW1hVHlwZUltcGwpYXR0ci5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGVVbmF0dGFjaGVkTm9kZShwcm9wKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZFN1bW1hcnkoUU5hbWVTZXQgZWxlbWVudFNldCwgYm9vbGVhbiBoYXN3Y0VsdCwgUU5hbWVTZXQgYXR0cmlidXRlU2V0LCBib29sZWFuIGhhc3djQXR0KQorICAgIHsKKyAgICAgICAgYXNzZXJ0UmVzb2x2aW5nKCk7IF90eXBlZFdpbGRjYXJkRWxlbWVudHMgPSBlbGVtZW50U2V0OyBfaGFzV2lsZGNhcmRFbGVtZW50cyA9IGhhc3djRWx0OyBfdHlwZWRXaWxkY2FyZEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVTZXQ7IF9oYXNXaWxkY2FyZEF0dHJpYnV0ZXMgPSBoYXN3Y0F0dDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIGdldEFub255bW91c1R5cGVzKCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfYW5vbnltb3VzVHlwZXJlZnMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRbaV0gPSBfYW5vbnltb3VzVHlwZXJlZnNbaV0uZ2V0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVHlwZVJlZnMoU2NoZW1hVHlwZS5SZWZbXSBhbm9ueW1vdXNUeXBlcmVmcykKKyAgICB7CisgICAgICAgIF9hbm9ueW1vdXNUeXBlcmVmcyA9IGFub255bW91c1R5cGVyZWZzOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZVtdIHN0YUNvcHkoU2NoZW1hVHlwZVtdIGEpCisgICAgeworICAgICAgICBpZiAoYSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW2EubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhLCAwLCByZXN1bHQsIDAsIGEubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuW10gYm9hQ29weShib29sZWFuW10gYSkKKyAgICB7CisgICAgICAgIGlmIChhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bYS5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGEsIDAsIHJlc3VsdCwgMCwgYS5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlVmFyaWV0eShpbnQgdmFyaWV0eSkKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3NpbXBsZVR5cGVWYXJpZXR5ID0gdmFyaWV0eTsgfQorCisgICAgcHVibGljIGludCBnZXRTaW1wbGVWYXJpZXR5KCkKKyAgICAgICAgeyByZXR1cm4gX3NpbXBsZVR5cGVWYXJpZXR5OyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VSVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9UWVBFIHx8IF9idWlsdGluVHlwZUNvZGUgPT0gQlRDX0FOWV9TSU1QTEU7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTm9UeXBlKCkKKyAgICAgICAgeyByZXR1cm4gdGhpcyA9PSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKQorICAgICAgICB7IHJldHVybiBfaXNTaW1wbGVUeXBlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gZikKKyAgICAgICAgeyBhc3NlcnRVbnJlc29sdmVkKCk7IF9pc1NpbXBsZVR5cGUgPSBmOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuaW9uT2ZMaXN0cygpCisgICAgICAgIHsgcmV0dXJuIF9pc1VuaW9uT2ZMaXN0czsgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pb25PZkxpc3RzKGJvb2xlYW4gZikKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2lzVW5pb25PZkxpc3RzID0gZjsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9wcmltaXRpdmVUeXBlUmVmID09IG51bGwgPyBudWxsIDogX3ByaW1pdGl2ZVR5cGVSZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZVR5cGVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZikKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX3ByaW1pdGl2ZVR5cGVSZWYgPSB0eXBlcmVmOyB9CisKKyAgICBwdWJsaWMgaW50IGdldERlY2ltYWxTaXplKCkKKyAgICAgICAgeyByZXR1cm4gX2RlY2ltYWxTaXplOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsU2l6ZShpbnQgYml0cykKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2RlY2ltYWxTaXplID0gYml0czsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0QmFzZVR5cGUoKQorICAgICAgICB7IHJldHVybiBfYmFzZVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZVR5cGVyZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VUeXBlUmVmKFNjaGVtYVR5cGUuUmVmIHR5cGVyZWYpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9iYXNlVHlwZXJlZiA9IHR5cGVyZWY7IH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QmFzZURlcHRoKCkKKyAgICAgICAgeyByZXR1cm4gX2Jhc2VEZXB0aDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmFzZURlcHRoKGludCBkZXB0aCkKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Jhc2VEZXB0aCA9IGRlcHRoOyB9CisKKyAgICBwdWJsaWMgaW50IGdldERlcml2YXRpb25UeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX2Rlcml2YXRpb25UeXBlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXJpdmF0aW9uVHlwZShpbnQgdHlwZSkKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2Rlcml2YXRpb25UeXBlID0gdHlwZTsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0TGlzdEl0ZW1UeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX2xpc3RJdGVtVHlwZXJlZiA9PSBudWxsID8gbnVsbCA6IF9saXN0SXRlbVR5cGVyZWYuZ2V0KCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpc3RJdGVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiB0eXBlcmVmKQorICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfbGlzdEl0ZW1UeXBlcmVmID0gdHlwZXJlZjsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVbXSBnZXRVbmlvbk1lbWJlclR5cGVzKCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfdW5pb25NZW1iZXJUeXBlcmVmcyA9PW51bGwgPyAwIDogX3VuaW9uTWVtYmVyVHlwZXJlZnMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRbaV0gPSBfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlvbk1lbWJlclR5cGVSZWZzKFNjaGVtYVR5cGUuUmVmW10gdHlwZXJlZnMpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF91bmlvbk1lbWJlclR5cGVyZWZzID0gdHlwZXJlZnM7IH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCkKKyAgICAgICAgeyByZXR1cm4gX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKGludCBpKQorICAgICAgICB7IGFzc2VydFVucmVzb2x2ZWQoKTsgX2Fub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCA9IGk7IH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpCisgICAgeworICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOworICAgICAgICByZXR1cm4gc3RhQ29weShfdW5pb25Db25zdGl0dWVudFR5cGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VW5pb25Db25zdGl0dWVudFR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKKyAgICAgICAgeyBfdW5pb25Db25zdGl0dWVudFR5cGVzID0gdHlwZXM7IH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2NoZW1hVHlwZVtdIGdldFVuaW9uU3ViVHlwZXMoKQorICAgIHsKKyAgICAgICAgaWYgKF91bmlvbkNvbW1vbkJhc2VUeXBlID09IG51bGwpCisgICAgICAgICAgICBjb21wdXRlRmxhdFVuaW9uTW9kZWwoKTsKKyAgICAgICAgcmV0dXJuIHN0YUNvcHkoX3VuaW9uU3ViVHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVbmlvblN1YlR5cGVzKFNjaGVtYVR5cGVbXSB0eXBlcykKKyAgICAgICAgeyBfdW5pb25TdWJUeXBlcyA9IHR5cGVzOyB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFNjaGVtYVR5cGUgZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpCisgICAgeworICAgICAgICBpZiAoX3VuaW9uQ29tbW9uQmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpOworICAgICAgICByZXR1cm4gX3VuaW9uQ29tbW9uQmFzZVR5cGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQorICAgICAgICB7IF91bmlvbkNvbW1vbkJhc2VUeXBlID0gdHlwZTsgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVGbGF0VW5pb25Nb2RlbCgpCisgICAgeworICAgICAgICBTZXQgY29uc3RpdHVlbnRNZW1iZXJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgICAgIFNldCBhbGxTdWJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7CisgICAgICAgIFNjaGVtYVR5cGUgY29tbW9uQmFzZVR5cGUgPSBudWxsOworCisgICAgICAgIGFsbFN1YlR5cGVzLmFkZCh0aGlzKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF91bmlvbk1lbWJlclR5cGVyZWZzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbClfdW5pb25NZW1iZXJUeXBlcmVmc1tpXS5nZXQoKTsKKworICAgICAgICAgICAgc3dpdGNoIChtSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMuYWRkKG1JbXBsKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsU3ViVHlwZXMuYWRkKG1JbXBsKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBtSW1wbC5nZXRDb21tb25CYXNlVHlwZShjb21tb25CYXNlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKKyAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSkpOworICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtSW1wbC5nZXRVbmlvblN1YlR5cGVzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBvdGhlckNvbW1vbkJhc2VUeXBlID0gbUltcGwuZ2V0VW5pb25Db21tb25CYXNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJDb21tb25CYXNlVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uQmFzZVR5cGUgPSBvdGhlckNvbW1vbkJhc2VUeXBlLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKKyAgICAgICAgICAgICAgICAgICAgY29uc3RpdHVlbnRNZW1iZXJUeXBlcy5hZGQobUltcGwpOworICAgICAgICAgICAgICAgICAgICBhbGxTdWJUeXBlcy5hZGQobUltcGwpOworICAgICAgICAgICAgICAgICAgICBjb21tb25CYXNlVHlwZSA9IG1JbXBsLmdldENvbW1vbkJhc2VUeXBlKGNvbW1vbkJhc2VUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygoU2NoZW1hVHlwZVtdKQorICAgICAgICAgICAgICAgIGNvbnN0aXR1ZW50TWVtYmVyVHlwZXMudG9BcnJheShTdHNjU3RhdGUuRU1QVFlfU1RfQVJSQVkpKTsKKyAgICAgICAgc2V0VW5pb25TdWJUeXBlcygoU2NoZW1hVHlwZVtdKQorICAgICAgICAgICAgICAgIGFsbFN1YlR5cGVzLnRvQXJyYXkoU3RzY1N0YXRlLkVNUFRZX1NUX0FSUkFZKSk7CisgICAgICAgIHNldFVuaW9uQ29tbW9uQmFzZVR5cGUoY29tbW9uQmFzZVR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBRTmFtZSBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCisgICAgICAgIHsgcmV0dXJuIF9zZzsgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uR3JvdXAoUU5hbWUgc2cpCisgICAgICAgIHsgYXNzZXJ0U0dSZXNvbHZpbmcoKTsgX3NnID0gc2c7IH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVyKFFOYW1lIG1lbWJlcikKKyAgICAgICAgeyBhc3NlcnRTR1Jlc29sdmVkKCk7IF9zZ01lbWJlcnMuYWRkKG1lbWJlcik7IH0KKworICAgIHB1YmxpYyBRTmFtZVtdIGdldFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpCisgICAgeworICAgICAgICBRTmFtZVtdIHJlc3VsdCA9IG5ldyBRTmFtZVtfc2dNZW1iZXJzLnNpemUoKV07CisgICAgICAgIHJldHVybiAoUU5hbWVbXSlfc2dNZW1iZXJzLnRvQXJyYXkocmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdoaXRlU3BhY2VSdWxlKCkKKyAgICAgICAgeyByZXR1cm4gX3doaXRlU3BhY2VSdWxlOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXaGl0ZVNwYWNlUnVsZShpbnQgd3MpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF93aGl0ZVNwYWNlUnVsZSA9IHdzOyB9CisKKyAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZSBnZXRGYWNldChpbnQgZmFjZXRDb2RlKQorICAgIHsKKyAgICAgICAgaWYgKF9mYWNldEFycmF5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gX2ZhY2V0QXJyYXlbZmFjZXRDb2RlXTsKKyAgICAgICAgaWYgKHJlZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZWYuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWNldEZpeGVkKGludCBmYWNldENvZGUpCisgICAgeworICAgICAgICByZXR1cm4gX2ZpeGVkRmFjZXRBcnJheVtmYWNldENvZGVdOworICAgIH0KKworICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0QmFzaWNGYWNldHMoKQorICAgIHsKKyAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIHJlc3VsdCA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW1NjaGVtYVR5cGUuTEFTVF9GQUNFVCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gZ2V0RmFjZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbltdIGdldEZpeGVkRmFjZXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBib2FDb3B5KF9maXhlZEZhY2V0QXJyYXkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhc2ljRmFjZXRzKFhtbFZhbHVlUmVmW10gdmFsdWVzLCBib29sZWFuW10gZml4ZWQpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKKyAgICAgICAgX2ZhY2V0QXJyYXkgPSB2YWx1ZXM7CisgICAgICAgIF9maXhlZEZhY2V0QXJyYXkgPSBmaXhlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG9yZGVyZWQoKQorICAgICAgICB7IHJldHVybiBfb3JkZXJlZDsgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJlZChpbnQgb3JkZXJpbmcpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9vcmRlcmVkID0gb3JkZXJpbmc7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQm91bmRlZCgpCisgICAgICAgIHsgcmV0dXJuIF9pc0JvdW5kZWQ7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kZWQoYm9vbGVhbiBmKQorICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNCb3VuZGVkID0gZjsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pdGUoKQorICAgICAgICB7IHJldHVybiBfaXNGaW5pdGU7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbml0ZShib29sZWFuIGYpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9pc0Zpbml0ZSA9IGY7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTnVtZXJpYygpCisgICAgICAgIHsgcmV0dXJuIF9pc051bWVyaWM7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bWVyaWMoYm9vbGVhbiBmKQorICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaXNOdW1lcmljID0gZjsgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXR0ZXJuRmFjZXQoKQorICAgICAgICB7IHJldHVybiBfaGFzUGF0dGVybnM7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5GYWNldChib29sZWFuIGhhc1BhdHRlcm5zKQorICAgICAgICB7IGFzc2VydFJlc29sdmluZygpOyBfaGFzUGF0dGVybnMgPSBoYXNQYXR0ZXJuczsgfQorCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuRmFjZXQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoIV9oYXNQYXR0ZXJucykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChfcGF0dGVybnMgIT0gbnVsbCAmJiBfcGF0dGVybnMubGVuZ3RoID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3BhdHRlcm5zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcGF0dGVybnNbaV0ubWF0Y2hlcyhzKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA+PSBfcGF0dGVybnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRCYXNlVHlwZSgpLm1hdGNoUGF0dGVybkZhY2V0KHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXR0ZXJucygpCisgICAgeworICAgICAgICBpZiAoX3BhdHRlcm5zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgU3RyaW5nW10gcGF0dGVybnMgPSBuZXcgU3RyaW5nW19wYXR0ZXJucy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8IF9wYXR0ZXJucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gX3BhdHRlcm5zW2ldLmdldFBhdHRlcm4oKTsKKyAgICAgICAgcmV0dXJuIHBhdHRlcm5zOworICAgIH0KKworICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bXSBnZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKQorICAgIHsKKyAgICAgICAgaWYgKF9wYXR0ZXJucyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bMF07CisgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHJlc3VsdCA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb25bX3BhdHRlcm5zLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3BhdHRlcm5zLCAwLCByZXN1bHQsIDAsIF9wYXR0ZXJucy5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5zKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIGxpc3QpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9wYXR0ZXJucyA9IGxpc3Q7IH0KKworICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0RW51bWVyYXRpb25WYWx1ZXMoKQorICAgIHsKKyAgICAgICAgaWYgKF9lbnVtZXJhdGlvblZhbHVlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSByZXN1bHQgPSBuZXcgWG1sQW55U2ltcGxlVHlwZVtfZW51bWVyYXRpb25WYWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbFZhbHVlUmVmIHJlZiA9IF9lbnVtZXJhdGlvblZhbHVlc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IChyZWYgPT0gbnVsbCA/IG51bGwgOiByZWYuZ2V0KCkpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGlvblZhbHVlcyhYbWxWYWx1ZVJlZltdIGEpCisgICAgICAgIHsgYXNzZXJ0UmVzb2x2aW5nKCk7IF9lbnVtZXJhdGlvblZhbHVlcyA9IGE7IH0KKworICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JTdHJpbmcoU3RyaW5nIHMpCisgICAgeworICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOworICAgICAgICBpZiAoX2xvb2t1cFN0cmluZ0VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xvb2t1cFN0cmluZ0VudW0uZ2V0KHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JJbnQoaW50IGkpCisgICAgeworICAgICAgICBlbnN1cmVTdHJpbmdFbnVtSW5mbygpOworICAgICAgICBpZiAoX2xpc3RPZlN0cmluZ0VudW0gPT0gbnVsbCB8fCBpIDwgMCB8fCBpID49IF9saXN0T2ZTdHJpbmdFbnVtLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX2xpc3RPZlN0cmluZ0VudW0uZ2V0KGkpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnkgZW51bUVudHJ5Rm9yU3RyaW5nKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgZW5zdXJlU3RyaW5nRW51bUluZm8oKTsKKyAgICAgICAgaWYgKF9sb29rdXBTdHJpbmdFbnVtRW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKFNjaGVtYVN0cmluZ0VudW1FbnRyeSlfbG9va3VwU3RyaW5nRW51bUVudHJ5LmdldChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRCYXNlRW51bVR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9iYXNlRW51bVR5cGVyZWYgPT0gbnVsbCA/IG51bGwgOiBfYmFzZUVudW1UeXBlcmVmLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VFbnVtVHlwZVJlZihTY2hlbWFUeXBlLlJlZiBiYXNlRW51bVR5cGVyZWYpCisgICAgeworICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUVudW1UeXBlcmVmOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBnZXRTdHJpbmdFbnVtRW50cmllcygpCisgICAgeworICAgICAgICBpZiAoX3N0cmluZ0VudW1FbnRyaWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gcmVzdWx0ID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeVtfc3RyaW5nRW51bUVudHJpZXMubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfc3RyaW5nRW51bUVudHJpZXMsIDAsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nRW51bUVudHJpZXMoU2NoZW1hU3RyaW5nRW51bUVudHJ5IHNFbnVtc1tdKQorICAgIHsKKyAgICAgICAgYXNzZXJ0SmF2YWl6aW5nKCk7CisgICAgICAgIF9zdHJpbmdFbnVtRW50cmllcyA9IHNFbnVtczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlU3RyaW5nRW51bUluZm8oKQorICAgIHsKKyAgICAgICAgaWYgKF9zdHJpbmdFbnVtRW5zdXJlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBzRW51bXMgPSBfc3RyaW5nRW51bUVudHJpZXM7CisgICAgICAgIGlmIChzRW51bXMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX3N0cmluZ0VudW1FbnN1cmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1hcCBsb29rdXBTdHJpbmdFbnVtID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7CisgICAgICAgIExpc3QgbGlzdE9mU3RyaW5nRW51bSA9IG5ldyBBcnJheUxpc3Qoc0VudW1zLmxlbmd0aCArIDEpOworICAgICAgICBNYXAgbG9va3VwU3RyaW5nRW51bUVudHJ5ID0gbmV3IEhhc2hNYXAoc0VudW1zLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW1FbnRyeS5wdXQoc0VudW1zW2ldLmdldFN0cmluZygpLCBzRW51bXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgamMgPSBfYmFzZUVudW1UeXBlcmVmLmdldCgpLmdldEVudW1KYXZhQ2xhc3MoKTsKKyAgICAgICAgaWYgKGpjICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UuVGFibGUgdGFibGUgPSAoU3RyaW5nRW51bUFic3RyYWN0QmFzZS5UYWJsZSlqYy5nZXRGaWVsZCgidGFibGUiKS5nZXQobnVsbCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzRW51bXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IHNFbnVtc1tpXS5nZXRJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWwgPSB0YWJsZS5mb3JJbnQoaik7CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZ0VudW0ucHV0KHNFbnVtc1tpXS5nZXRTdHJpbmcoKSwgZW51bVZhbCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsaXN0T2ZTdHJpbmdFbnVtLnNpemUoKSA8PSBqKQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3RPZlN0cmluZ0VudW0uc2V0KGosIGVudW1WYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvbWV0aGluZyB3cm9uZzogY291bGQgbm90IGxvY2F0ZSBlbnVtIHRhYmxlIGZvciAiICsgamMpOworICAgICAgICAgICAgICAgIGpjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGpjID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VudW1zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqID0gc0VudW1zW2ldLmdldEludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzRW51bXNbaV0uZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsID0gbmV3IFN0cmluZ0VudW1WYWx1ZShzLCBqKTsKKyAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmdFbnVtLnB1dChzLCBlbnVtVmFsKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGlzdE9mU3RyaW5nRW51bS5zaXplKCkgPD0gaikKKyAgICAgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgbGlzdE9mU3RyaW5nRW51bS5zZXQoaiwgZW51bVZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3N0cmluZ0VudW1FbnN1cmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9sb29rdXBTdHJpbmdFbnVtID0gbG9va3VwU3RyaW5nRW51bTsKKyAgICAgICAgICAgICAgICBfbGlzdE9mU3RyaW5nRW51bSA9IGxpc3RPZlN0cmluZ0VudW07CisgICAgICAgICAgICAgICAgX2xvb2t1cFN0cmluZ0VudW1FbnRyeSA9IGxvb2t1cFN0cmluZ0VudW1FbnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBIQUNLSEFDSzogdHdvIHN5bmNyaG9uaXplZCBibG9ja3MgZm9yY2UgYSBtZW1vcnkgYmFycmllcjoKKyAgICAgICAgLy8gQlVHQlVHOiB0aGlzIGJlaGF2aW9yIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gZnV0dXJlIFZNcworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zdHJpbmdFbnVtRW5zdXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdHJpbmdFbnVtVmFsdWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfc3RyaW5nRW51bUVudHJpZXMgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5RW51bWVyYXRpb25WYWx1ZXMoU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCisgICAgeworICAgICAgICBhc3NlcnRSZXNvbHZpbmcoKTsKKyAgICAgICAgX2VudW1lcmF0aW9uVmFsdWVzID0gYmFzZUltcGwuX2VudW1lcmF0aW9uVmFsdWVzOworICAgICAgICBfYmFzZUVudW1UeXBlcmVmID0gYmFzZUltcGwuX2Jhc2VFbnVtVHlwZXJlZjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpCisgICAgICAgIHsgcmV0dXJuIF9idWlsdGluVHlwZUNvZGU7IH0gLy8gc3BlY2lhbDogc2V0IHVwIHByZS1pbml0CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsdGluVHlwZUNvZGUoaW50IGJ1aWx0aW5UeXBlQ29kZSkKKyAgICAgICAgeyBhc3NlcnRSZXNvbHZpbmcoKTsgX2J1aWx0aW5UeXBlQ29kZSA9IGJ1aWx0aW5UeXBlQ29kZTsgfQorCisgICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpCisgICAgeworICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgorICAgICAgICBpZiAoX2phdmFDbGFzcyA9PSBudWxsICYmIGdldEZ1bGxKYXZhTmFtZSgpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsgX2phdmFDbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0RnVsbEphdmFOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsgfQorICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIGNsYXNzIG5hbWUgIiArIGdldEZ1bGxKYXZhTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlYXJjaGVkIGluIGNsYXNzbG9hZGVyICIgKyBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICBfamF2YUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfamF2YUNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhSW1wbENsYXNzKCkgeworICAgICAgICBpZiAoX2ltcGxOb3RBdmFpbGFibGUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAoX2phdmFJbXBsQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0RnVsbEphdmFJbXBsTmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9qYXZhSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShnZXRGdWxsSmF2YUltcGxOYW1lKCksIGZhbHNlLCBfdHlwZVN5c3RlbS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9pbXBsTm90QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBfaW1wbE5vdEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2phdmFJbXBsQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yIGdldEphdmFJbXBsQ29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yID09IG51bGwgJiYgIV9pbXBsTm90QXZhaWxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsID0gZ2V0SmF2YUltcGxDbGFzcygpOworICAgICAgICAgICAgaWYgKGltcGwgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfamF2YUltcGxDb25zdHJ1Y3RvciA9IGltcGwuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBTY2hlbWFUeXBlLmNsYXNzIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2phdmFJbXBsQ29uc3RydWN0b3I7CisKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3IgZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcjIoKQorICAgIHsKKyAgICAgICAgaWYgKF9qYXZhSW1wbENvbnN0cnVjdG9yMiA9PSBudWxsICYmICFfaW1wbE5vdEF2YWlsYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQ2xhc3MgaW1wbCA9IGdldEphdmFJbXBsQ2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChpbXBsID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2phdmFJbXBsQ29uc3RydWN0b3IyID0gaW1wbC5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGUuY2xhc3MsIGJvb2xlYW4uY2xhc3MgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfamF2YUltcGxDb25zdHJ1Y3RvcjI7CisKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0RW51bUphdmFDbGFzcygpCisgICAgeworICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGRlY2xhcmVkIHZvbGF0aWxlIGFuZCBDbGFzcyBpcyBpbW11dGFibGUgc28gdGhpcyBpcyBhbGxvd2VkLgorICAgICAgICBpZiAoX2phdmFFbnVtQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IENsYXNzLmZvck5hbWUoZ2V0QmFzZUVudW1UeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCkgKyAiJEVudW0iLCBmYWxzZSwgX3R5cGVTeXN0ZW0uZ2V0Q2xhc3NMb2FkZXIoKSk7IH0KKyAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeyBfamF2YUVudW1DbGFzcyA9IG51bGw7IH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfamF2YUVudW1DbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoKTsKKyAgICAgICAgX2phdmFDbGFzcyA9IGphdmFDbGFzczsKKyAgICAgICAgc2V0RnVsbEphdmFOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gKGdldEJ1aWx0aW5UeXBlQ29kZSgpID49IEJUQ19GSVJTVF9QUklNSVRJVkUgJiYKKyAgICAgICAgICAgICAgICBnZXRCdWlsdGluVHlwZUNvZGUoKSA8PSBCVENfTEFTVF9QUklNSVRJVkUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQnVpbHRpblR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBjcmVhdGVVbndyYXBwZWROb2RlKCkKKyAgICB7CisgICAgICAgIC8vIFRvZG86IGF0dGFjaCBhIG5ldyB4bWwgc3RvcmUhCisgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjcmVhdGVVbmF0dGFjaGVkTm9kZShudWxsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUeXBlU3RvcmVVc2VyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKWNyZWF0ZVVuYXR0YWNoZWROb2RlKG51bGwpOworICAgIH0KKworCisgICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsaWRhdGluZ1ZhbHVlKE9iamVjdCBvYmopCisgICAgeworICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCB0cnVlKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgc2ltcGxlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopCisgICAgeworICAgICAgICByZXR1cm4gbmV3VmFsdWUob2JqLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsdWUoT2JqZWN0IG9iaiwgYm9vbGVhbiB2YWxpZGF0ZU9uU2V0KQorICAgIHsKKyAgICAgICAgaWYgKCFpc1NpbXBsZVR5cGUoKSAmJiBnZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IC8vIHZhbHVlcyBtdXN0IGJlIHNpbXBsZQorCisgICAgICAgIFhtbE9iamVjdEJhc2UgcmVzdWx0ID0gKFhtbE9iamVjdEJhc2UpY3JlYXRlVW5hdHRhY2hlZE5vZGUobnVsbCk7CisgICAgICAgIGlmICh2YWxpZGF0ZU9uU2V0KQorICAgICAgICAgICAgcmVzdWx0LnNldFZhbGlkYXRlT25TZXQoKTsKKworICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiB0cmVlIGNvcHksIG5lZWQgdG8gY2FsbCBhIHNwZWNsYSBzZXR0ZXIgdG8gYXZvaWQKKyAgICAgICAgLy8gc2V0KFhtbE9iamVjdCkKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkKKyAgICAgICAgICAgIHJlc3VsdC5zZXRfbmV3VmFsdWUoKFhtbE9iamVjdClvYmopOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQub2JqZWN0U2V0KG9iaik7CisKKyAgICAgICAgcmVzdWx0LmNoZWNrX2RhdGVkKCk7CisgICAgICAgIHJlc3VsdC5zZXRJbW11dGFibGUoKTsKKworICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkTm9kZShTY2hlbWFQcm9wZXJ0eSBwcm9wKQorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaWYgKCFpc0J1aWx0aW5UeXBlKCkgJiYgIWlzTm9UeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkIGltcGwgY2xhc3M6ICIgKyBnZXRGdWxsSmF2YUltcGxOYW1lKCkpOworICAgICAgICAgICAgQ29uc3RydWN0b3IgY3RyID0gZ2V0SmF2YUltcGxDb25zdHJ1Y3RvcigpOworICAgICAgICAgICAgaWYgKGN0ciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZWVkZWQhIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KWN0ci5uZXdJbnN0YW5jZShfY3RyQXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUJ1aWx0aW5JbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgbm8gcmVzdWx0LCB3ZSBtdXN0IGJlIGEgcmVzdHJpY3Rpb24gb2Ygc29tZSBjb21waWxlZCB0eXBlCisgICAgICAgIGZvciAoU2NoZW1hVHlwZSBzVHlwZSA9IHRoaXM7IHJlc3VsdCA9PSBudWxsOyBzVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCkpCisgICAgICAgICAgICByZXN1bHQgPSAoKFNjaGVtYVR5cGVJbXBsKXNUeXBlKS5jcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3ModGhpcyk7CisKKyAgICAgICAgKChYbWxPYmplY3RCYXNlKXJlc3VsdCkuaW5pdF9mbGFncyhwcm9wKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVVbmF0dGFjaGVkU3ViY2xhc3MoU2NoZW1hVHlwZSBzVHlwZSkKKyAgICB7CisgICAgICAgIGlmICghaXNCdWlsdGluVHlwZSgpICYmICFpc05vVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dGVtcHRpbmcgdG8gbG9hZCBpbXBsIGNsYXNzOiAiICsgZ2V0RnVsbEphdmFJbXBsTmFtZSgpKTsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0ciA9IGdldEphdmFJbXBsQ29uc3RydWN0b3IyKCk7CisgICAgICAgICAgICBpZiAoY3RyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2NlZWRlZCEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpY3RyLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHNUeXBlLCBzVHlwZS5pc1NpbXBsZVR5cGUoKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUUgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRyeWluZyB0byBpbnN0YW50aWF0ZSBpbXBsIGNsYXNzLiIpOworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0aW5TdWJjbGFzcyhzVHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFhtbE9iamVjdCBjcmVhdGVCdWlsdGluSW5zdGFuY2UoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChnZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCVENfTk9UX0JVSUxUSU46CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlUeXBlSW1wbChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT19UWVBFKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJvb2xlYW5JbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19CQVNFXzY0X0JJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEJhc2U2NEJpbmFyeUltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxIZXhCaW5hcnlJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19BTllfVVJJOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VXJpSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfUU5BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxRTmFtZUltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05PVEFUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm90YXRpb25JbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEZsb2F0SW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRG91YmxlSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbERlY2ltYWxJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTdHJpbmdJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbER1cmF0aW9uSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVGltZUltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0RBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEYXRlSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0dfWUVBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdZZWFySW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfR19NT05USF9EQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhEYXlJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19HX01PTlRIOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludGVnZXJJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTG9uZ0ltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEludEltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1NIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2hvcnRJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05PTl9QT1NJVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uUG9zaXRpdmVJbnRlZ2VySW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfTkVHQVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5lZ2F0aXZlSW50ZWdlckltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfUE9TSVRJVkVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0xPTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZExvbmdJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRTaG9ydEltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEJ5dGVJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19UT0tFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFRva2VuSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19MQU5HVUFHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExhbmd1YWdlSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZEltcGwoKTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19JRFJFRlM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJZFJlZnNJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19FTlRJVFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxFbnRpdHlJbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbCgpOworICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5JbXBsKCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5tVG9rZW5zSW1wbCgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBYbWxPYmplY3QgY3JlYXRlQnVpbHRpblN1YmNsYXNzKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICBib29sZWFuIGNvbXBsZXggPSAhc1R5cGUuaXNTaW1wbGVUeXBlKCk7CisgICAgICAgIHN3aXRjaCAoZ2V0QnVpbHRpblR5cGVDb2RlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQlRDX05PVF9CVUlMVElOOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQW55VHlwZUltcGwoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTk9fVFlQRSk7CisgICAgICAgICAgICBjYXNlIEJUQ19BTllfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9TSU1QTEU6CisgICAgICAgICAgICAgICAgc3dpdGNoIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9TSU1QTEU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbENvbXBsZXhDb250ZW50SW1wbChzVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRPTUlDOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExpc3RJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBVTklPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5pb25JbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQm9vbGVhblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQmFzZTY0QmluYXJ5UmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfSEVYX0JJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0FOWV9VUkk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxBbnlVcmlSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19RTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFFOYW1lUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfTk9UQVRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb3RhdGlvblJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0ZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRmxvYXRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEb3VibGVSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19ERUNJTUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAoc1R5cGUuaGFzU3RyaW5nRW51bVZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFN0cmluZ0VudW1lcmF0aW9uKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU3RyaW5nUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfRFVSQVRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxEdXJhdGlvbkltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfREFURV9USU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZVRpbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1RJTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxUaW1lSW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19EQVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRGF0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSX01PTlRIOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJNb250aEltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfR19ZRUFSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR1llYXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEhfREFZOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sR01vbnRoRGF5SW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19HX0RBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEdEYXlJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxHTW9udGhJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRlZ2VyUmVzdHJpY3Rpb24oc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbExvbmdSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxJbnRSZXN0cmljdGlvbihzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19TSE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sQnl0ZUltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfTk9OX1BPU0lUSVZFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05FR0FUSVZFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05PTl9ORUdBVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19QT1NJVElWRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRMb25nSW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZEludEltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfVU5TSUdORURfU0hPUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxVbnNpZ25lZFNob3J0SW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVW5zaWduZWRCeXRlSW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OT1JNQUxJWkVEX1NUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX1RPS0VOOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVG9rZW5JbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX05BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOYW1lSW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OQ05BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxOQ05hbWVJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0xBTkdVQUdFOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTGFuZ3VhZ2VJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lEOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSWRSZWZJbXBsKHNUeXBlLCBjb21wbGV4KTsKKyAgICAgICAgICAgIGNhc2UgQlRDX0lEUkVGUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbElkUmVmc0ltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfRU5USVRZOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sRW50aXR5SW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19FTlRJVElFUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVudGl0aWVzSW1wbChzVHlwZSwgY29tcGxleCk7CisgICAgICAgICAgICBjYXNlIEJUQ19OTVRPS0VOOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sTm1Ub2tlbkltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgY2FzZSBCVENfTk1UT0tFTlM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxObVRva2Vuc0ltcGwoc1R5cGUsIGNvbXBsZXgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgYnVpbHRpbiB0eXBlOiAiICsgZ2V0QnVpbHRpblR5cGVDb2RlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0Q29tbW9uQmFzZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgLy8gbnVsbCB0eXBlIGlzIHRyZWF0ZWQgYXMgdGhlIG5vLXR5cGUKKyAgICAgICAgaWYgKHRoaXMgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgdHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgIC8vIGFueSB0eXBlIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlOyBub1R5cGUgaXMgdGhlIHVuaXZlcnNhbCBkZXJpdmVkIHR5cGUKKyAgICAgICAgaWYgKHR5cGUgPT0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUgfHwgaXNOb1R5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworCisgICAgICAgIC8vIHRoZSByZWd1bGFyIGNhc2U6CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOworICAgICAgICB3aGlsZSAoc0ltcGwxLmdldEJhc2VEZXB0aCgpID4gZ2V0QmFzZURlcHRoKCkpCisgICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsMiA9IHRoaXM7CisgICAgICAgIHdoaWxlIChzSW1wbDIuZ2V0QmFzZURlcHRoKCkgPiBzSW1wbDEuZ2V0QmFzZURlcHRoKCkpCisgICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzSW1wbDEuZXF1YWxzKHNJbXBsMikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzSW1wbDEgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwxLmdldEJhc2VUeXBlKCk7CisgICAgICAgICAgICBzSW1wbDIgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwyLmdldEJhc2VUeXBlKCk7CisgICAgICAgICAgICBhc3NlcnQoc0ltcGwxICE9IG51bGwgJiYgc0ltcGwyICE9IG51bGwpOyAvLyBtdXN0IG1lZXQgYXQgYW55VHlwZQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzSW1wbDE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShTY2hlbWFUeXBlIHR5cGUpCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuaXNOb1R5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChpc05vVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBkZXB0aCA9ICgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkgLSBnZXRCYXNlRGVwdGgoKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGRlcHRoID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgICAgIGRlcHRoIC09IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0eXBlLmVxdWFscyh0aGlzKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmIChnZXROYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiVD0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldE5hbWUoKSk7CisKKyAgICAgICAgaWYgKGlzRG9jdW1lbnRUeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gIkQ9IiArIFFOYW1lSGVscGVyLnByZXR0eShnZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOworCisgICAgICAgIGlmIChpc0F0dHJpYnV0ZVR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiAiUj0iICsgUU5hbWVIZWxwZXIucHJldHR5KGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOworCisgICAgICAgIFN0cmluZyBwcmVmaXg7CisKKyAgICAgICAgaWYgKGdldENvbnRhaW5lckZpZWxkKCkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZml4ID0gKGdldENvbnRhaW5lckZpZWxkKCkuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJRPSIgOiAiRT0iKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSA/ICJBPSIgOiAiVT0iKSkKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKKyAgICAgICAgICAgIGlmIChnZXRPdXRlclR5cGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiQCIgKyBnZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc05vVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuICJOPSI7CisgICAgICAgIGVsc2UgaWYgKGdldE91dGVyVHlwZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIm5vb3V0ZXIiOworICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRCYXNlVHlwZSgpID09IHRoaXMpCisgICAgICAgICAgICBwcmVmaXggPSAiQj0iOworICAgICAgICBlbHNlIGlmIChnZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICAgICAgcHJlZml4ID0gIkk9IjsKKyAgICAgICAgZWxzZSBpZiAoZ2V0T3V0ZXJUeXBlKCkuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuVU5JT04pCisgICAgICAgICAgICBwcmVmaXggPSAiTT0iICsgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByZWZpeCA9ICJzdHJhbmdlPSI7CisKKyAgICAgICAgcmV0dXJuIHByZWZpeCArICJ8IiArIGdldE91dGVyVHlwZSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBYbWxPYmplY3QgX3BhcnNlT2JqZWN0OworICAgIHByaXZhdGUgU3RyaW5nIF9wYXJzZVROUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2NoYW1lbGVvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3JlZGVmaW5pdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChYbWxPYmplY3QgcGFyc2VPYmplY3QsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKKyAgICB7CisgICAgICAgIF9wYXJzZU9iamVjdCA9IHBhcnNlT2JqZWN0OworICAgICAgICBfcGFyc2VUTlMgPSB0YXJnZXROYW1lc3BhY2U7CisgICAgICAgIF9jaGFtZWxlb24gPSBjaGFtZWxlb247CisgICAgICAgIF9yZWRlZmluaXRpb24gPSByZWRlZmluaXRpb247CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBnZXRQYXJzZU9iamVjdCgpCisgICAgICAgIHsgcmV0dXJuIF9wYXJzZU9iamVjdDsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQorICAgICAgICB7IHJldHVybiBfcGFyc2VUTlM7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbWVsZW9uICggKQorICAgICAgICB7IHJldHVybiBfY2hhbWVsZW9uOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYW1lbGVvbk5hbWVzcGFjZSgpCisgICAgICAgIHsgcmV0dXJuIF9jaGFtZWxlb24gPyBfcGFyc2VUTlMgOiBudWxsOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZGVmaW5pdGlvbigpCisgICAgICAgIHsgcmV0dXJuIF9yZWRlZmluaXRpb247IH0KKworICAgIHByaXZhdGUgU2NoZW1hVHlwZS5SZWYgX3NlbGZyZWYgPSBuZXcgU2NoZW1hVHlwZS5SZWYodGhpcyk7CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZ2V0UmVmKCkKKyAgICAgICAgeyByZXR1cm4gX3NlbGZyZWY7IH0KKworICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQuUmVmIGdldENvbXBvbmVudFJlZigpCisgICAgICAgIHsgcmV0dXJuIGdldFJlZigpOyB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFscyBvZiBlbGVtZW50IHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXF1ZW5jZXJJbXBsIGltcGxlbWVudHMgU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIF92aXNpdG9yOworCisgICAgICAgIHByaXZhdGUgU2VxdWVuY2VySW1wbChTY2hlbWFUeXBlVmlzaXRvckltcGwgdmlzaXRvcikKKyAgICAgICAgeworICAgICAgICAgICAgX3Zpc2l0b3IgPSB2aXNpdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbmV4dChRTmFtZSBlbGVtZW50TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF92aXNpdG9yID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IudmlzaXQoZWxlbWVudE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVlayhRTmFtZSBlbGVtZW50TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF92aXNpdG9yID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gX3Zpc2l0b3IudGVzdFZhbGlkKGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVMb2FkZXJCYXNlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2MyNDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsNTcyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3IuVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmFjdG9yeUhvb2s7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hVHlwZUxvYWRlckJhc2UgaW1wbGVtZW50cyBTY2hlbWFUeXBlTG9hZGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9yb290QnVpbGRlciA9IGdldE1ldGhvZCggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290IiwgIm5ld1N0b3JlIiwgbmV3IENsYXNzW10geyBTY2hlbWFUeXBlTG9hZGVyLmNsYXNzLCBTY2hlbWFUeXBlLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0gKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3BhdGhDb21waWxlciA9IGdldE1ldGhvZCggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5QYXRoIiwgImdldENvbXBpbGVkUGF0aCIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0gKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX3F1ZXJ5Q29tcGlsZXIgPSBnZXRNZXRob2QoICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUGF0aCIsICJnZXRDb21waWxlZFF1ZXJ5IiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MgfSApOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZCAoIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3MgKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIGNsYXNzTmFtZSApLgorICAgICAgICAgICAgICAgICAgICBnZXREZWNsYXJlZE1ldGhvZCggbWV0aG9kTmFtZSwgYXJncyApOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgIiArIGNsYXNzTmFtZSArICIuIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAiLiAgdmVyaWZ5IHRoYXQgeG1sc3RvcmUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiKGZyb20geGJlYW4uamFyKSBpcyBvbiBjbGFzc3BhdGgiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kICggTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncyApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoIG1ldGhvZCwgYXJncyApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIGlzZS5pbml0Q2F1c2UoIGUgKTsKKyAgICAgICAgICAgIHRocm93IGlzZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICBpc2UuaW5pdENhdXNlKCBlICk7CisgICAgICAgICAgICB0aHJvdyBpc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFhtbFN0b3JlIGNyZWF0ZU5ld1N0b3JlICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoWG1sU3RvcmUpCisgICAgICAgICAgICAgICAgaW52b2tlTWV0aG9kKCBfcm9vdEJ1aWxkZXIsIG5ldyBPYmplY3RbXSB7IHRoaXMsIHR5cGUsIG9wdGlvbnMgfSApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkb0NvbXBpbGVQYXRoICggU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB7IHJldHVybiAoU3RyaW5nKSBpbnZva2VNZXRob2QoIF9wYXRoQ29tcGlsZXIsIG5ldyBPYmplY3RbXSB7IHBhdGhFeHByLCBvcHRpb25zIH0gKTsgfQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkb0NvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHsgcmV0dXJuIChTdHJpbmcpIGludm9rZU1ldGhvZCggX3F1ZXJ5Q29tcGlsZXIsIG5ldyBPYmplY3RbXSB7IHF1ZXJ5RXhwciwgb3B0aW9ucyB9ICk7IH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmRUeXBlKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlLlJlZiByZWYgPSBmaW5kVHlwZVJlZihuYW1lKTsKKyAgICAgICAgaWYgKHJlZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFNjaGVtYVR5cGUgcmVzdWx0ID0gcmVmLmdldCgpOworICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IGZpbmREb2N1bWVudFR5cGVSZWYobmFtZSk7CisgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IHJlZi5nZXQoKTsKKyAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBmaW5kQXR0cmlidXRlVHlwZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVmID0gZmluZEF0dHJpYnV0ZVR5cGVSZWYobmFtZSk7CisgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IHJlZi5nZXQoKTsKKyAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cCBmaW5kTW9kZWxHcm91cChRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU2NoZW1hTW9kZWxHcm91cC5SZWYgcmVmID0gZmluZE1vZGVsR3JvdXBSZWYobmFtZSk7CisgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTY2hlbWFNb2RlbEdyb3VwIHJlc3VsdCA9IHJlZi5nZXQoKTsKKyAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAgZmluZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgcmVmID0gZmluZEF0dHJpYnV0ZUdyb3VwUmVmKG5hbWUpOworICAgICAgICBpZiAocmVmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXAgcmVzdWx0ID0gcmVmLmdldCgpOworICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IGZpbmRFbGVtZW50KFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiByZWYgPSBmaW5kRWxlbWVudFJlZihuYW1lKTsKKyAgICAgICAgaWYgKHJlZiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgcmVzdWx0ID0gcmVmLmdldCgpOworICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluZEF0dHJpYnV0ZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiByZWYgPSBmaW5kQXR0cmlidXRlUmVmKG5hbWUpOworICAgICAgICBpZiAocmVmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIHJlc3VsdCA9IHJlZi5nZXQoKTsKKyAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHB1YmxpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7CisgICAgICAgIGlmIChob29rICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaG9vay5uZXdJbnN0YW5jZSggdGhpcywgdHlwZSwgb3B0aW9ucyApOworCisgICAgICAgIHJldHVybiBjcmVhdGVOZXdTdG9yZSggdHlwZSwgb3B0aW9ucyApLmdldE9iamVjdCgpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTdHJpbmcgeG1sVGV4dCwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7CisgICAgICAgIGlmIChob29rICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaG9vay5wYXJzZSggdGhpcywgeG1sVGV4dCwgdHlwZSwgb3B0aW9ucyApOworCisgICAgICAgIHJldHVybiBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIHhtbFRleHQsIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOworICAgICAgICBpZiAoaG9vayAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIHhpcywgdHlwZSwgb3B0aW9ucyApOworCisgICAgICAgIHJldHVybiBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIHhpcywgdHlwZSwgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBGaWxlIGZpbGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIGZpbGUudG9VUkkoKS5ub3JtYWxpemUoKS50b1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmICghIG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUpKQorICAgICAgICB7CisgICAgICAgICAgICBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoIG9wdGlvbnMgKTsKKyAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1NPVVJDRV9OQU1FLCBmaWxlLnRvVVJJKCkubm9ybWFsaXplKCkudG9TdHJpbmcoKSApOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZSApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2UoIGZpcywgdHlwZSwgb3B0aW9ucyApOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggVVJMIHVybCwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSwgdXJsLnRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKCEgb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOworICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUsIHVybC50b1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBkb3dubG9hZDogdHJ5CisgICAgICAgIHsKKworICAgICAgICAgICAgYm9vbGVhbiByZWRpcmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIGNvbm4uYWRkUmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgIkFwYWNoZSBYTUxCZWFucy8xLjAuMyIpOworICAgICAgICAgICAgICAgIGNvbm4uYWRkUmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgKi8qIik7CisgICAgICAgICAgICAgICAgaWYgKGNvbm4gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHBjb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pY29ubjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBodHRwY29uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkID0gKGNvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9NT1ZFRF9QRVJNIHx8IGNvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9NT1ZFRF9URU1QKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0ZWQgJiYgY291bnQgPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TG9jYXRpb24gPSBodHRwY29uLmdldEhlYWRlckZpZWxkKCJMb2NhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0xvY2F0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwobmV3TG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAocmVkaXJlY3RlZCk7CisKKyAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZSggc3RyZWFtLCB0eXBlLCBvcHRpb25zICk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEZhY3RvcnlIb29rIGhvb2sgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKKyAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gZGlnZXN0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgc2V0dXBEaWdlc3Q6IGlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX01FU1NBR0VfRElHRVNUKSkKKyAgICAgICAgeworICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBzaGE7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGEgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhayBzZXR1cERpZ2VzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlnZXN0U3RyZWFtID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGppb2lzLCBzaGEpOworICAgICAgICAgICAgamlvaXMgPSBkaWdlc3RTdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9vayAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIGppb2lzLCB0eXBlLCBvcHRpb25zICk7CisKKyAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGNyZWF0ZU5ld1N0b3JlKCBudWxsLCBvcHRpb25zICkubG9hZFhtbCggamlvaXMsIHR5cGUsIG9wdGlvbnMgKTsKKworICAgICAgICBpZiAoZGlnZXN0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuc2V0TWVzc2FnZURpZ2VzdChkaWdlc3RTdHJlYW0uZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBSZWFkZXIgamlvciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOworICAgICAgICBpZiAoaG9vayAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGhvb2sucGFyc2UoIHRoaXMsIGppb3IsIHR5cGUsIG9wdGlvbnMgKTsKKworICAgICAgICByZXR1cm4gY3JlYXRlTmV3U3RvcmUoIG51bGwsIG9wdGlvbnMgKS5sb2FkWG1sKCBqaW9yLCB0eXBlLCBvcHRpb25zICk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIE5vZGUgbm9kZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxGYWN0b3J5SG9vayBob29rID0gWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5nZXRIb29rKCk7CisgICAgICAgIGlmIChob29rICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gaG9vay5wYXJzZSggdGhpcywgbm9kZSwgdHlwZSwgb3B0aW9ucyApOworCisgICAgICAgIHJldHVybiBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLmxvYWRYbWwoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sU2F4SGFuZGxlciBuZXdYbWxTYXhIYW5kbGVyICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgWG1sRmFjdG9yeUhvb2sgaG9vayA9IFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuZ2V0SG9vaygpOworICAgICAgICBpZiAoaG9vayAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGhvb2submV3WG1sU2F4SGFuZGxlciggdGhpcywgdHlwZSwgb3B0aW9ucyApOworCisgICAgICAgIHJldHVybiBjcmVhdGVOZXdTdG9yZSggbnVsbCwgb3B0aW9ucyApLm5ld1NheEhhbmRsZXIoIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdGhpcywgdHlwZSwgb3B0aW9ucyApOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHVibGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciApCisgICAgeworICAgICAgICByZXR1cm4gY29tcGlsZVBhdGgoIHBhdGhFeHByLCBudWxsICk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHJldHVybiBkb0NvbXBpbGVQYXRoKCBwYXRoRXhwciwgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgY29tcGlsZVF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciApCisgICAgeworICAgICAgICByZXR1cm4gY29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICByZXR1cm4gZG9Db21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gbG9hZCBhIHR5cGUgZnJvbSBhIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEEgc2lnbmF0dXJlIGlzIHRoZSBzdHJpbmcgeW91IGdldCBmcm9tIHR5cGUudG9TdHJpbmcoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yU2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpCisgICAgeworICAgICAgICBpbnQgZW5kID0gc2lnbmF0dXJlLmluZGV4T2YoJ0AnKTsKKyAgICAgICAgU3RyaW5nIHVyaTsKKworICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgdXJpID0gIiI7CisgICAgICAgICAgICBlbmQgPSBzaWduYXR1cmUubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1cmkgPSBzaWduYXR1cmUuc3Vic3RyaW5nKGVuZCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdCBwYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZW5kOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZXh0YyA9IHNpZ25hdHVyZS5pbmRleE9mKCc6JywgaW5kZXgpOworICAgICAgICAgICAgaW50IG5leHRkID0gc2lnbmF0dXJlLmluZGV4T2YoJ3wnLCBpbmRleCk7CisgICAgICAgICAgICBpbnQgbmV4dCA9IChuZXh0YyA8IDAgPyBuZXh0ZCA6IG5leHRkIDwgMCA/IG5leHRjIDogbmV4dGMgPCBuZXh0ZCA/IG5leHRjIDogbmV4dGQpOworICAgICAgICAgICAgaWYgKG5leHQgPCAwIHx8IG5leHQgPiBlbmQpCisgICAgICAgICAgICAgICAgbmV4dCA9IGVuZDsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gc2lnbmF0dXJlLnN1YnN0cmluZyhpbmRleCwgbmV4dCk7CisgICAgICAgICAgICBwYXJ0cy5hZGQocGFydCk7CisgICAgICAgICAgICBpbmRleCA9IG5leHQgKyAxOworICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hVHlwZSBjdXJUeXBlID0gbnVsbDsKKworICAgICAgICBvdXRlcjogZm9yIChpbnQgaSA9IHBhcnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaSAtPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGFydCA9IChTdHJpbmcpcGFydHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHBhcnQubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAocGFydC5sZW5ndGgoKSA+PSAyICYmIHBhcnQuY2hhckF0KDEpID09ICc9JykgPyAyIDogMTsKKyAgICAgICAgICAgIGNhc2VzOiBzd2l0Y2ggKHBhcnQuY2hhckF0KDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gZmluZFR5cGUoUU5hbWVIZWxwZXIuZm9yTE5TKHBhcnQuc3Vic3RyaW5nKG9mZnNldCksIHVyaSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGN1clR5cGUgPSBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOiAvLyBkZXByZWNhdGVkCisgICAgICAgICAgICAgICAgY2FzZSAnUic6IC8vIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgIGNhc2UgJ1UnOiAvLyBkaXN0aW5ndWlzaCBxdWFsaWZpZWQvdW5xdWFsaWZpZWQgVEJECisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldENvbnRlbnRUeXBlKCkgPCBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzdWJUeXBlcyA9IGN1clR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwYXJ0LnN1YnN0cmluZyhvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJUeXBlcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZCA9IHN1YlR5cGVzW2pdLmdldENvbnRhaW5lckZpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgIWZpZWxkLmlzQXR0cmlidXRlKCkgJiYgZmllbGQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhsb2NhbE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjYXNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZWx0ID0gZmluZEVsZW1lbnQoUU5hbWVIZWxwZXIuZm9yTE5TKHBhcnQuc3Vic3RyaW5nKG9mZnNldCksIHVyaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IGVsdC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICBjYXNlICdRJzogLy8gZGlzdGluZ3Vpc2ggcXVhbGlmaWVkL3VucXVhbGlmaWVkIFRCRAorICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzdWJUeXBlcyA9IGN1clR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwYXJ0LnN1YnN0cmluZyhvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJUeXBlcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZCA9IHN1YlR5cGVzW2pdLmdldENvbnRhaW5lckZpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuaXNBdHRyaWJ1dGUoKSAmJiBmaWVsZC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGxvY2FsTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gc3ViVHlwZXNbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNhc2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHIgPSBmaW5kQXR0cmlidXRlKFFOYW1lSGVscGVyLmZvckxOUyhwYXJ0LnN1YnN0cmluZyhvZmZzZXQpLCB1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gYXR0ci5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVtdIHN1YlR5cGVzID0gY3VyVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlR5cGVzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUeXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkxJU1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViVHlwZXMubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJUeXBlID0gc3ViVHlwZXNbMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnQuc3Vic3RyaW5nKG9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gc3ViVHlwZXMgPSBjdXJUeXBlLmdldEFub255bW91c1R5cGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViVHlwZXMubGVuZ3RoIDw9IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyVHlwZSA9IHN1YlR5cGVzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VyVHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlTG9hZGVySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDgwYzFhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZUxvYWRlckltcGwuamF2YQpAQCAtMCwwICsxLDUxMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWEJlYW5EZWJ1ZzsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworCitwdWJsaWMgY2xhc3MgU2NoZW1hVHlwZUxvYWRlckltcGwgZXh0ZW5kcyBTY2hlbWFUeXBlTG9hZGVyQmFzZQoreworICAgIHByaXZhdGUgUmVzb3VyY2VMb2FkZXIgX3Jlc291cmNlTG9hZGVyOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2NsYXNzTG9hZGVyOworICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlcltdIF9zZWFyY2hQYXRoOworCisgICAgcHJpdmF0ZSBNYXAgX2NsYXNzcGF0aFR5cGVTeXN0ZW1zOworICAgIHByaXZhdGUgTWFwIF9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zOworICAgIHByaXZhdGUgTWFwIF9lbGVtZW50Q2FjaGU7CisgICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUNhY2hlOworICAgIHByaXZhdGUgTWFwIF9tb2RlbEdyb3VwQ2FjaGU7CisgICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwQ2FjaGU7CisgICAgcHJpdmF0ZSBNYXAgX2lkQ29uc3RyYWludENhY2hlOworICAgIHByaXZhdGUgTWFwIF90eXBlQ2FjaGU7CisgICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50Q2FjaGU7CisgICAgcHJpdmF0ZSBNYXAgX2NsYXNzbmFtZUNhY2hlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlckltcGwgYnVpbGRDb250ZXh0VHlwZUxvYWRlcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNjaGVtYVR5cGVMb2FkZXJJbXBsKG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKSB9ICwgbnVsbCwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgX3RocmVhZFR5cGVTeXN0ZW1zID0KKyAgICAgICAgbmV3IFRocmVhZExvY2FsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7IHJldHVybiBuZXcgV2Vha0hhc2hNYXAoKTsgfQorICAgICAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVySW1wbCBnZXRDb250ZXh0VHlwZUxvYWRlcigpCisgICAgeworICAgICAgICBXZWFrSGFzaE1hcCBjYW5kaWRhdGVzID0gKFdlYWtIYXNoTWFwKSBfdGhyZWFkVHlwZVN5c3RlbXMuZ2V0KCk7CisgICAgICAgIENsYXNzTG9hZGVyIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXJJbXBsIGNhbmRpZGF0ZSA9IChTY2hlbWFUeXBlTG9hZGVySW1wbCkgY2FuZGlkYXRlcy5nZXQoIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciApOworCisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuZGlkYXRlID0gYnVpbGRDb250ZXh0VHlwZUxvYWRlcigpOworICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXQoIHRocmVhZENvbnRleHRDbGFzc0xvYWRlciwgY2FuZGlkYXRlICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIGJ1aWxkKFNjaGVtYVR5cGVMb2FkZXJbXSBzZWFyY2hQYXRoLCBSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCisgICAgeworICAgICAgICBpZiAoc2VhcmNoUGF0aCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzZWFyY2hQYXRoID0gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFzc2VtYmxlIGEgZmxhdHRlbmVkIHNlYXJjaCBwYXRoIHdpdGggbm8gZHVwbGljYXRlcworICAgICAgICAgICAgU3ViTG9hZGVyTGlzdCBsaXN0ID0gbmV3IFN1YkxvYWRlckxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VhcmNoUGF0aFtpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWFyY2hQYXRoWyIgKyBpICsgIl0gaXMgbnVsbCIpOworICAgICAgICAgICAgICAgIGlmICghKHNlYXJjaFBhdGhbaV0gaW5zdGFuY2VvZiBTY2hlbWFUeXBlTG9hZGVySW1wbCkpCisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHNlYXJjaFBhdGhbaV0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVMb2FkZXJJbXBsIHN1YiA9IChTY2hlbWFUeXBlTG9hZGVySW1wbClzZWFyY2hQYXRoW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ViLl9jbGFzc0xvYWRlciAhPSBudWxsIHx8IHN1Yi5fcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN1Yik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgZm9yIChpbnQgaiA9IDA7IGogPCBzdWIuX3NlYXJjaFBhdGgubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzdWIuX3NlYXJjaFBhdGhbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlYXJjaFBhdGggPSBsaXN0LnRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWFyY2hQYXRoLmxlbmd0aCA9PSAxICYmIHJlc291cmNlTG9hZGVyID09IG51bGwgJiYgY2xhc3NMb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoWzBdOworCisgICAgICAgIHJldHVybiBuZXcgU2NoZW1hVHlwZUxvYWRlckltcGwoc2VhcmNoUGF0aCwgcmVzb3VyY2VMb2FkZXIsIGNsYXNzTG9hZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKdXN0IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRlIHBhdGggZW50cmllcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1YkxvYWRlckxpc3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgTGlzdCB0aGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwcml2YXRlIE1hcCBzZWVuID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGQoU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZWVuLmNvbnRhaW5zS2V5KGxvYWRlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdGhlTGlzdC5hZGQobG9hZGVyKTsKKyAgICAgICAgICAgIHNlZW4ucHV0KGxvYWRlciwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlcltdIHRvQXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhlTGlzdC5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWTsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcltdKXRoZUxpc3QudG9BcnJheShuZXcgU2NoZW1hVHlwZUxvYWRlclt0aGVMaXN0LnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFNjaGVtYVR5cGVMb2FkZXJJbXBsIHRoYXQgc2VhcmNoZXMgZm9yIG9iamVjdHMKKyAgICAgKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAqCisgICAgICogKDEpIEZpcnN0IG9uIHRoZSBzZWFyY2hQYXRoIG9mIG90aGVyIFNjaGVtYVR5cGVTeXN0ZW1zIHN1cHBsaWVkLAorICAgICAqICAgICBpbiBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZC4KKyAgICAgKiAoMikgTmV4dCBvbiB0aGUgY2xhc3NwYXRoIG9mIC5qYXIgZmlsZXMgb3IgZGlyZWN0b3JpZXMgc3VwcGxpZWQsCisgICAgICogICAgIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZC4gV2hlbiB0eXBlcyBhcmUgcmV0dXJuZWQgaW4KKyAgICAgKiAgICAgdGhpcyB3YXksIHRoZXkgYXJlIGluc3RhbnRpYXRlZCBmcm9tIGEgcHJpdmF0ZSB0eXBlc3lzdGVtLgorICAgICAqICAgICBJbiBvdGhlciB3b3JkcywgaWYgYSB0eXBlIGlzIGxvYWRlZCBmcm9tIGFub3RoZXIgU2NoZW1hVHlwZUxvYWRlckltcGwKKyAgICAgKiAgICAgdGhhdCB3YXMgaW5pdGlhbGl6ZWQgb24gdGhlIHNhbWUgZmlsZSwgdGhlIGluc3RhbmNlIG9mIHRoZSB0eXBlIHdpbGwKKyAgICAgKiAgICAgYmUgZGlmZmVyZW50LgorICAgICAqICgzKSBGaW5hbGx5IG9uIHRoZSBjbGFzc2xvYWRlciBzdXBwbGllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNjaGVtYVR5cGVMb2FkZXJJbXBsKFNjaGVtYVR5cGVMb2FkZXJbXSBzZWFyY2hQYXRoLCBSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCisgICAgeworICAgICAgICBpZiAoc2VhcmNoUGF0aCA9PSBudWxsKQorICAgICAgICAgICAgX3NlYXJjaFBhdGggPSBFTVBUWV9TQ0hFTUFUWVBFTE9BREVSX0FSUkFZOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfc2VhcmNoUGF0aCA9IHNlYXJjaFBhdGg7CisgICAgICAgIF9yZXNvdXJjZUxvYWRlciA9IHJlc291cmNlTG9hZGVyOworICAgICAgICBfY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKworICAgICAgICBpbml0Q2FjaGVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNhY2hlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdENhY2hlcygpCisgICAgeworICAgICAgICBfY2xhc3NwYXRoVHlwZVN5c3RlbXMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIF9jbGFzc0xvYWRlclR5cGVTeXN0ZW1zID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgICAgICBfZWxlbWVudENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgICAgICBfYXR0cmlidXRlQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIF9tb2RlbEdyb3VwQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIF9hdHRyaWJ1dGVHcm91cENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgICAgICBfaWRDb25zdHJhaW50Q2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIF90eXBlQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIF9kb2N1bWVudENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgICAgICBfY2xhc3NuYW1lQ2FjaGUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7CisgICAgfQorCisgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgdHlwZVN5c3RlbUZvckNvbXBvbmVudChTdHJpbmcgc2VhcmNoZGlyLCBRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHNlYXJjaGZvciA9IHNlYXJjaGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIobmFtZSkgKyAiLnhzYiI7CisgICAgICAgIFN0cmluZyB0c25hbWUgPSBudWxsOworCisgICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRzbmFtZSA9IGNyYWNrRW50cnkoX3Jlc291cmNlTG9hZGVyLCBzZWFyY2hmb3IpOworCisgICAgICAgIGlmIChfY2xhc3NMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHRzbmFtZSA9IGNyYWNrRW50cnkoX2NsYXNzTG9hZGVyLCBzZWFyY2hmb3IpOworCisgICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbUltcGwpdHlwZVN5c3RlbUZvck5hbWUodHNuYW1lKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtRm9yTmFtZShTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChfcmVzb3VyY2VMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSByZXN1bHQgPSBnZXRUeXBlU3lzdGVtT25DbGFzc3BhdGgobmFtZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfY2xhc3NMb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSByZXN1bHQgPSBnZXRUeXBlU3lzdGVtT25DbGFzc2xvYWRlcihuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHR5cGVTeXN0ZW1Gb3JDbGFzc25hbWUoU3RyaW5nIHNlYXJjaGRpciwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBTdHJpbmcgc2VhcmNoZm9yID0gc2VhcmNoZGlyICsgbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIueHNiIjsKKworICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0c25hbWUgPSBjcmFja0VudHJ5KF9yZXNvdXJjZUxvYWRlciwgc2VhcmNoZm9yKTsKKyAgICAgICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZVN5c3RlbU9uQ2xhc3NwYXRoKHRzbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2NsYXNzTG9hZGVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0c25hbWUgPSBjcmFja0VudHJ5KF9jbGFzc0xvYWRlciwgc2VhcmNoZm9yKTsKKyAgICAgICAgICAgIGlmICh0c25hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZVN5c3RlbU9uQ2xhc3Nsb2FkZXIodHNuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGdldFR5cGVTeXN0ZW1PbkNsYXNzcGF0aChTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIHJlc3VsdCA9IChTY2hlbWFUeXBlU3lzdGVtSW1wbClfY2xhc3NwYXRoVHlwZVN5c3RlbXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtSW1wbChfcmVzb3VyY2VMb2FkZXIsIG5hbWUsIHRoaXMpOworICAgICAgICAgICAgX2NsYXNzcGF0aFR5cGVTeXN0ZW1zLnB1dChuYW1lLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgZ2V0VHlwZVN5c3RlbU9uQ2xhc3Nsb2FkZXIoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJGaW5kaW5nIHR5cGUgc3lzdGVtICIgKyBuYW1lICsgIiBvbiBjbGFzc2xvYWRlciIsIDApOworICAgICAgICBTY2hlbWFUeXBlU3lzdGVtSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZVN5c3RlbUltcGwpX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlR5cGUgc3lzdGVtICIgKyBuYW1lICsgIiBub3QgY2FjaGVkIC0gY29uc3VsdGluZyBmaWVsZCIsIDApOworICAgICAgICAgICAgcmVzdWx0ID0gU2NoZW1hVHlwZVN5c3RlbUltcGwuZm9yTmFtZShuYW1lLCBfY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgX2NsYXNzTG9hZGVyVHlwZVN5c3RlbXMucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNyYWNrRW50cnkoUmVzb3VyY2VMb2FkZXIgbG9hZGVyLCBTdHJpbmcgc2VhcmNoZm9yKQorICAgIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShzZWFyY2hmb3IpOworICAgICAgICBpZiAoaXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gY3JhY2tQb2ludGVyKGlzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNyYWNrRW50cnkoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgc2VhcmNoZm9yKQorICAgIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oc2VhcmNoZm9yKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBjcmFja1BvaW50ZXIoc3RyZWFtKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGNyYWNrUG9pbnRlcihJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgeworICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuY3JhY2tQb2ludGVyKHN0cmVhbSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKF9zZWFyY2hQYXRoW2ldLmlzTmFtZXNwYWNlRGVmaW5lZChuYW1lc3BhY2UpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvbmFtZXNwYWNlLyIsIG5ldyBRTmFtZShuYW1lc3BhY2UsICJ4bWxucyIpKTsKKyAgICAgICAgcmV0dXJuIChzdHMgIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRUeXBlUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlLlJlZiByZXN1bHQgPSAoU2NoZW1hVHlwZS5SZWYpX3R5cGVDYWNoZS5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX3R5cGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZFR5cGVSZWYobmFtZSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL3R5cGUvIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kVHlwZVJlZihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIHR5cGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX3R5cGVDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKKyAgICB7CisgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCckJywgJy4nKTsKKworICAgICAgICBTY2hlbWFUeXBlIHJlc3VsdCA9IChTY2hlbWFUeXBlKV9jbGFzc25hbWVDYWNoZS5nZXQoY2xhc3NuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfY2xhc3NuYW1lQ2FjaGUuY29udGFpbnNLZXkoY2xhc3NuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0udHlwZUZvckNsYXNzbmFtZShjbGFzc25hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDbGFzc25hbWUoInNjaGVtYS9qYXZhbmFtZS8iLCBjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMudHlwZUZvckNsYXNzbmFtZShjbGFzc25hbWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgdHlwZSAiICsgY2xhc3NuYW1lICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfY2xhc3NuYW1lQ2FjaGUucHV0KGNsYXNzbmFtZSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kRG9jdW1lbnRUeXBlUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlLlJlZiByZXN1bHQgPSAoU2NoZW1hVHlwZS5SZWYpX2RvY3VtZW50Q2FjaGUuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9kb2N1bWVudENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kRG9jdW1lbnRUeXBlUmVmKG5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9lbGVtZW50LyIsIG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZERvY3VtZW50VHlwZVJlZihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IGNvbnRhaW4gZG9jdW1lbnQgdHlwZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2RvY3VtZW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZEF0dHJpYnV0ZVR5cGVSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlc3VsdCA9IChTY2hlbWFUeXBlLlJlZilfYXR0cmlidXRlQ2FjaGUuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9hdHRyaWJ1dGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEF0dHJpYnV0ZVR5cGVSZWYobmFtZSkpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHRzID0gdHlwZVN5c3RlbUZvckNvbXBvbmVudCgic2NoZW1hL2F0dHJpYnV0ZS8iLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRBdHRyaWJ1dGVUeXBlUmVmKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgYXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyAiIGJ1dCBkb2VzIG5vdCBjb250YWluIGF0dHJpYnV0ZSB0eXBlIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudC5SZWYgZmluZEVsZW1lbnRSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilfZWxlbWVudENhY2hlLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfZWxlbWVudENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kRWxlbWVudFJlZihuYW1lKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvZWxlbWVudC8iLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRFbGVtZW50UmVmKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgZWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfZWxlbWVudENhY2hlLnB1dChuYW1lLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZS5SZWYgZmluZEF0dHJpYnV0ZVJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiByZXN1bHQgPSAoU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZilfYXR0cmlidXRlQ2FjaGUuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgIV9hdHRyaWJ1dGVDYWNoZS5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2VhcmNoUGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAocmVzdWx0ID0gX3NlYXJjaFBhdGhbaV0uZmluZEF0dHJpYnV0ZVJlZihuYW1lKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvYXR0cmlidXRlLyIsIG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHMuZmluZEF0dHJpYnV0ZVJlZihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxsKSA6ICJUeXBlIHN5c3RlbSByZWdpc3RlcmVkIGF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYXR0cmlidXRlQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYU1vZGVsR3JvdXAuUmVmIHJlc3VsdCA9IChTY2hlbWFNb2RlbEdyb3VwLlJlZilfbW9kZWxHcm91cENhY2hlLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICFfbW9kZWxHcm91cENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kTW9kZWxHcm91cFJlZihuYW1lKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvbW9kZWxncm91cC8iLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRzLmZpbmRNb2RlbEdyb3VwUmVmKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgbW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX21vZGVsR3JvdXBDYWNoZS5wdXQobmFtZSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZilfYXR0cmlidXRlR3JvdXBDYWNoZS5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2F0dHJpYnV0ZUdyb3VwQ2FjaGUuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3NlYXJjaFBhdGgubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKHJlc3VsdCA9IF9zZWFyY2hQYXRoW2ldLmZpbmRBdHRyaWJ1dGVHcm91cFJlZihuYW1lKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHMgPSB0eXBlU3lzdGVtRm9yQ29tcG9uZW50KCJzY2hlbWEvYXR0cmlidXRlZ3JvdXAvIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kQXR0cmlidXRlR3JvdXBSZWYobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbCkgOiAiVHlwZSBzeXN0ZW0gcmVnaXN0ZXJlZCBhdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArICIgYnV0IGRvZXMgbm90IHJldHVybiBpdCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2F0dHJpYnV0ZUdyb3VwQ2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZiBmaW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIHJlc3VsdCA9IChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKV9pZENvbnN0cmFpbnRDYWNoZS5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAhX2lkQ29uc3RyYWludENhY2hlLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9zZWFyY2hQYXRoLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChyZXN1bHQgPSBfc2VhcmNoUGF0aFtpXS5maW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKG5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSB0cyA9IHR5cGVTeXN0ZW1Gb3JDb21wb25lbnQoInNjaGVtYS9pZGVudGl0eWNvbnN0cmFpbnQvIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cy5maW5kSWRlbnRpdHlDb25zdHJhaW50UmVmKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzdWx0ICE9IG51bGwpIDogIlR5cGUgc3lzdGVtIHJlZ2lzdGVyZWQgaWRlbnRpdHkgY29uc3RyYWludCAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpICsgIiBidXQgZG9lcyBub3QgcmV0dXJuIGl0IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaWRDb25zdHJhaW50Q2FjaGUucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U291cmNlQXNTdHJlYW0oU3RyaW5nIHNvdXJjZU5hbWUpCisgICAgeworICAgICAgICBJbnB1dFN0cmVhbSByZXN1bHQgPSBudWxsOworCisgICAgICAgIGlmICghc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICBzb3VyY2VOYW1lID0gIi8iICsgc291cmNlTmFtZTsKKworICAgICAgICBpZiAoX3Jlc291cmNlTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICByZXN1bHQgPSBfcmVzb3VyY2VMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgic2NoZW1hL3NyYyIgKyBzb3VyY2VOYW1lKTsKKworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgX2NsYXNzTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2NsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oInNjaGVtYS9zcmMiICsgc291cmNlTmFtZSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlTG9hZGVyW10gRU1QVFlfU0NIRU1BVFlQRUxPQURFUl9BUlJBWSA9IG5ldyBTY2hlbWFUeXBlTG9hZGVyWzBdOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzljZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudC5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yV2F0Y2hlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnLlNjaGVtYUNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitwdWJsaWMgY2xhc3MgU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJzCisgICAgeworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFNjaGVtYVtdIHNjaGVtYXM7CisgICAgICAgIHByaXZhdGUgQ29uZmlnW10gY29uZmlnczsKKyAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbzsKKyAgICAgICAgcHJpdmF0ZSBYbWxPcHRpb25zIG9wdGlvbnM7CisgICAgICAgIHByaXZhdGUgQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gamF2YWl6ZTsKKyAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVSSTsKKyAgICAgICAgcHJpdmF0ZSBNYXAgc291cmNlc1RvQ29weU1hcDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gZ2V0U2NoZW1hcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzY2hlbWFzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hcyhTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSBzY2hlbWFzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbmZpZ0RvY3VtZW50LkNvbmZpZ1tdIGdldENvbmZpZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3MoQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10gY29uZmlncykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jb25maWdzID0gY29uZmlnczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTY2hlbWFUeXBlTG9hZGVyIGdldExpbmtUbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaW5rVG87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5rVG8oU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGlua1RvID0gbGlua1RvOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbE9wdGlvbnMgZ2V0T3B0aW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvcHRpb25zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFcnJvckxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yTGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckxpc3RlbmVyKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5lcnJvckxpc3RlbmVyID0gZXJyb3JMaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YWl6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SmF2YWl6ZShib29sZWFuIGphdmFpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuamF2YWl6ZSA9IGphdmFpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVUkkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVSSTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVUkkoVVJJIGJhc2VVUkkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZVVSSSA9IGJhc2VVUkk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwIGdldFNvdXJjZXNUb0NvcHlNYXAoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlc1RvQ29weU1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZXNUb0NvcHlNYXAoTWFwIHNvdXJjZXNUb0NvcHlNYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlc1RvQ29weU1hcCA9IHNvdXJjZXNUb0NvcHlNYXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gY29tcGlsZShQYXJhbWV0ZXJzIHBhcmFtcykKKyAgICB7CisgICAgICAgIHJldHVybiBjb21waWxlSW1wbChwYXJhbXMuZ2V0TmFtZSgpLCBwYXJhbXMuZ2V0U2NoZW1hcygpLCBwYXJhbXMuZ2V0Q29uZmlncygpLCBwYXJhbXMuZ2V0TGlua1RvKCksIHBhcmFtcy5nZXRPcHRpb25zKCksIHBhcmFtcy5nZXRFcnJvckxpc3RlbmVyKCksIHBhcmFtcy5pc0phdmFpemUoKSwgcGFyYW1zLmdldEJhc2VVUkkoKSwgcGFyYW1zLmdldFNvdXJjZXNUb0NvcHlNYXAoKSk7CisgICAgfQorICAgIAorICAgIC8qIHBhY2thZ2UhISEgKi8gc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGNvbXBpbGVJbXBsKAorICAgICAgICBTdHJpbmcgbmFtZSwgU2NoZW1hW10gc2NoZW1hcywgQ29uZmlnW10gY29uZmlncywKKyAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBsaW5rVG8sIFhtbE9wdGlvbnMgb3B0aW9ucywgQ29sbGVjdGlvbiBvdXRzaWRlRXJyb3JzLCBib29sZWFuIGphdmFpemUsIFVSSSBiYXNlVVJJLCBNYXAgc291cmNlc1RvQ29weU1hcCkKKyAgICB7CisgICAgICAgIGlmIChsaW5rVG8gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3VwcGx5IGxpbmtUbyIpOworCisgICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvcldhdGNoZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKG91dHNpZGVFcnJvcnMpOworCisgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgc3RhdGUKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLnN0YXJ0KCk7CisgICAgICAgIGJvb2xlYW4gdmFsaWRhdGUgPSAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfTk9fVkFMSURBVElPTikpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcldhdGNoZXIpOworICAgICAgICAgICAgc3RhdGUuc2V0U2NoZW1hQ29uZmlnKFNjaGVtYUNvbmZpZy5mb3JDb25maWdEb2N1bWVudHMoY29uZmlncykpOworICAgICAgICAgICAgc3RhdGUuc2V0T3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgICAgIHN0YXRlLnNldEdpdmVuVHlwZVN5c3RlbU5hbWUobmFtZSk7CisgICAgICAgICAgICBpZiAoYmFzZVVSSSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0YXRlLnNldEJhc2VVcmkoYmFzZVVSSSk7CisKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgY2xhc3NwYXRoICh5b3UgYWx3YXlzIGdldCB0aGUgYnVpbHRpbiB0eXBlcykKKyAgICAgICAgICAgIGxpbmtUbyA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG5ldyBTY2hlbWFUeXBlTG9hZGVyW10geyBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKSwgbGlua1RvIH0sIG51bGwsIG51bGwpOworICAgICAgICAgICAgc3RhdGUuc2V0SW1wb3J0aW5nVHlwZUxvYWRlcihsaW5rVG8pOworCisgICAgICAgICAgICBMaXN0IHZhbGlkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3Qoc2NoZW1hcy5sZW5ndGgpOworCisgICAgICAgICAgICAvLyBsb2FkIGFsbCB0aGUgeHNkIGZpbGVzIGludG8gaXQKKyAgICAgICAgICAgIGlmICh2YWxpZGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hc1tpXS52YWxpZGF0ZShuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JXYXRjaGVyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFNjaGVtYXMuYWRkKHNjaGVtYXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWxpZFNjaGVtYXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc2NoZW1hcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY2hlbWFbXSBzdGFydFdpdGggPSAoU2NoZW1hW10pdmFsaWRTY2hlbWFzLnRvQXJyYXkobmV3IFNjaGVtYVt2YWxpZFNjaGVtYXMuc2l6ZSgpXSk7CisKKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBpbXBvcnRzIGFuZCBpbmNsdWRlcworICAgICAgICAgICAgU3RzY0ltcG9ydGVyLlNjaGVtYVRvUHJvY2Vzc1tdIHNjaGVtYXNBbmRDaGFtZWxlb25zID0gU3RzY0ltcG9ydGVyLnJlc29sdmVJbXBvcnRzQW5kSW5jbHVkZXMoc3RhcnRXaXRoKTsKKworICAgICAgICAgICAgLy8gY2FsbCB0aGUgdHJhbnNsYXRvciBzbyB0aGF0IGl0IG1heSBhbHNvIHBlcmZvcm0gbWFnaWMKKyAgICAgICAgICAgIFN0c2NUcmFuc2xhdG9yLmFkZEFsbERlZmluaXRpb25zKHNjaGVtYXNBbmRDaGFtZWxlb25zKTsKKworICAgICAgICAgICAgLy8gY2FsbCB0aGUgcmVzb2x2ZXIgdG8gZG8gaXRzIG1hZ2ljCisgICAgICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZUFsbCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjYWxsIHRoZSBjaGVja2VyIHRvIGNoZWNrIGJvdGggcmVzdHJpY3Rpb25zIGFuZCBkZWZhdWx0cworICAgICAgICAgICAgU3RzY0NoZWNrZXIuY2hlY2tBbGwoKTsKKworICAgICAgICAgICAgLy8gY2FsbCB0aGUgamF2YWl6ZXIgdG8gZG8gaXRzIG1hZ2ljCisgICAgICAgICAgICBTdHNjSmF2YWl6ZXIuamF2YWl6ZUFsbFR5cGVzKGphdmFpemUpOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGxvYWRlciBvdXQgb2YgdGhlIHN0YXRlCisgICAgICAgICAgICBzdGF0ZS5nZXQoKS5zdHMoKS5sb2FkRnJvbVN0c2NTdGF0ZShzdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIGZpbGwgaW4gdGhlIHNvdXJjZS1jb3B5IG1hcAorICAgICAgICAgICAgaWYgKHNvdXJjZXNUb0NvcHlNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzb3VyY2VzVG9Db3B5TWFwLnB1dEFsbChzdGF0ZS5zb3VyY2VDb3B5TWFwKCkpOworCisgICAgICAgICAgICAvLyBpZiBhbnkgZXJyb3JzLCByZXR1cm4gbnVsbAorICAgICAgICAgICAgaWYgKGVycm9yV2F0Y2hlci5oYXNFcnJvcigpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gc3RhdGUuZ2V0KCkuc3RzKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBTdHNjU3RhdGUuZW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVN5c3RlbUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyN2FmYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVTeXN0ZW1JbXBsLmphdmEKQEAgLTAsMCArMSwzMTE5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sT2JqZWN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTW9kZWxHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZUdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVN0cmluZ0VudW1FbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU2NoZW1hV1NETEFycmF5VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50OworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Hcm91cERvY3VtZW50OworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuQXR0cmlidXRlR3JvdXBEb2N1bWVudDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKKworcHVibGljIGNsYXNzIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlckJhc2UgaW1wbGVtZW50cyBTY2hlbWFUeXBlU3lzdGVtCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9CQUJFID0gMHhEQTdBQkFCRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9WRVJTSU9OID0gMjsgIC8vIG11c3QgbWF0Y2ggPT0gdG8gYmUgY29tcGF0aWJsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1ZFUlNJT04gPSAxODsgLy8gbXVzdCBiZSA8PSB0byBiZSBjb21wYXRpYmxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMRUFTRV9OVU1CRVIgPSAwOyAvLyBzaG91bGQgYmUgY29tcGF0aWJsZSBldmVuIGlmIDwgb3IgPgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BSU5ERVggPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQVRZUEUgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUVMRU1FTlQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BUE9JTlRFUiA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVAgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVCA9IDg7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfU0tJUFBBQkxFID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklYRUQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9OSUxMQUJMRSA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLRVhUID0gMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLUkVTVCA9IDMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9CTE9DS1NVQlNUID0gNjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0FCU1RSQUNUID0gMTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTEVYVCA9IDI1NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfRklOQUxSRVNUID0gNTEyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0lTQVRUUiA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBT1BUSU9OQUwgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUFJPUF9KQVZBQVJSQVkgPSA4OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTk9ORSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfR0xPQkFMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEFUVFIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0xPQ0FMRUxUID0gMzsKKworICAgIC8vIHR5cGUgZmxhZ3MKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0lNUExFX1RZUEUgICAgID0gMHgxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ET0NVTUVOVF9UWVBFICAgPSAweDI7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX09SREVSRUQgICAgICAgICA9IDB4NDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQk9VTkRFRCAgICAgICAgID0gMHg4OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JVEUgICAgICAgICAgPSAweDEwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OVU1FUklDICAgICAgICAgPSAweDIwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVFJJTkdFTlVNICAgICAgPSAweDQwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTklPTl9PRl9MSVNUUyAgPSAweDgwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfUEFUVEVSTiAgICAgPSAweDEwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJfU0VOU0lUSVZFID0gMHgyMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPVEFMX09SREVSICAgICA9IDB4NDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QSUxFRCAgICAgICAgPSAweDgwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQkxPQ0tfRVhUICAgICAgID0gMHgxMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19SRVNUICAgICAgPSAweDIwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0VYVCAgICAgICA9IDB4NDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfUkVTVCAgICAgID0gMHg4MDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9VTklPTiAgICAgPSAweDEwMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9MSVNUICAgICAgPSAweDIwMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BQlNUUkFDVCAgICAgICAgPSAweDQwMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEVfVFlQRSAgPSAweDgwMDAwOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVRvUGF0aFN0cmluZyhTdHJpbmcgbmFtZUZvclN5c3RlbSkKKyAgICB7CisgICAgICAgIG5hbWVGb3JTeXN0ZW0gPSBuYW1lRm9yU3lzdGVtLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgIGlmICghbmFtZUZvclN5c3RlbS5lbmRzV2l0aCgiLyIpICYmIG5hbWVGb3JTeXN0ZW0ubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgbmFtZUZvclN5c3RlbSA9IG5hbWVGb3JTeXN0ZW0gKyAiLyI7CisKKyAgICAgICAgcmV0dXJuIG5hbWVGb3JTeXN0ZW07CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsKENsYXNzIGluZGV4Y2xhc3MpCisgICAgeworICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSBpbmRleGNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgX25hbWUgPSBmdWxsbmFtZS5zdWJzdHJpbmcoMCwgZnVsbG5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkxvYWRpbmcgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAxKTsKKyAgICAgICAgX2Jhc2VQYWNrYWdlID0gbmFtZVRvUGF0aFN0cmluZyhfbmFtZSk7CisgICAgICAgIF9jbGFzc2xvYWRlciA9IGluZGV4Y2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgX2xpbmtlciA9IFNjaGVtYVR5cGVMb2FkZXJJbXBsLmJ1aWxkKG51bGwsIG51bGwsIF9jbGFzc2xvYWRlcik7CisgICAgICAgIF9yZXNvdXJjZUxvYWRlciA9IG5ldyBDbGFzc0xvYWRlclJlc291cmNlTG9hZGVyKF9jbGFzc2xvYWRlcik7CisgICAgICAgIGluaXRGcm9tSGVhZGVyKCk7CisgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkZpbmlzaGVkIGxvYWRpbmcgdHlwZSBzeXN0ZW0gIiArIF9uYW1lLCAtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hW10gRU1QVFlfU0NIRU1BX0FSUkFZID0gbmV3IFNjaGVtYVswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWdbXSBFTVBUWV9DT05GSUdfQVJSQVkgPSBuZXcgQ29uZmlnWzBdOworCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbCBmb3JTY2hlbWFYbWwoCisgICAgICAgIFhtbE9iamVjdFtdIGlucHV0LCBTY2hlbWFUeXBlTG9hZGVyIGxpbmtUbywgWG1sT3B0aW9ucyBvcHRpb25zKQorICAgICAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwob3B0aW9ucyk7CisgICAgICAgIEFycmF5TGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBcnJheUxpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBTY2hlbWEpCisgICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoaW5wdXRbaV0pOworICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRbaV0gaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCAmJiAoKFNjaGVtYURvY3VtZW50KWlucHV0W2ldKS5nZXRTY2hlbWEoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKCgoU2NoZW1hRG9jdW1lbnQpaW5wdXRbaV0pLmdldFNjaGVtYSgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgQ29uZmlnKQorICAgICAgICAgICAgICAgIGNvbmZpZ3MuYWRkKGlucHV0W2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0W2ldIGluc3RhbmNlb2YgQ29uZmlnRG9jdW1lbnQgJiYgKChDb25maWdEb2N1bWVudClpbnB1dFtpXSkuZ2V0Q29uZmlnKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb25maWdzLmFkZCgoKENvbmZpZ0RvY3VtZW50KWlucHV0W2ldKS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbigiVGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICAiOiBUaGUgIiArIGkgKyAidGggc3VwcGxpZWQgaW5wdXQgaXMgbm90IGEgc2NoZW1hIG9yIGEgY29uZmlnIGRvY3VtZW50OiBpdHMgdHlwZSBpcyAiICsgaW5wdXRbaV0uc2NoZW1hVHlwZSgpKTsKKyAgICAgICAgfQorCisKKworICAgICAgICBDb2xsZWN0aW9uIHVzZXJFcnJvcnMgPSAoQ29sbGVjdGlvbilvcHRpb25zLmdldChYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSKTsKKyAgICAgICAgWG1sRXJyb3JXYXRjaGVyIGVycm9yV2F0Y2hlciA9IG5ldyBYbWxFcnJvcldhdGNoZXIodXNlckVycm9ycyk7CisKKyAgICAgICAgU2NoZW1hVHlwZVN5c3RlbUltcGwgc3RzaSA9CisgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuY29tcGlsZUltcGwoCisgICAgICAgICAgICAgICAgbnVsbCwgKFNjaGVtYVtdKXNjaGVtYXMudG9BcnJheShFTVBUWV9TQ0hFTUFfQVJSQVkpLAorICAgICAgICAgICAgICAgIChDb25maWdbXSljb25maWdzLnRvQXJyYXkoRU1QVFlfQ09ORklHX0FSUkFZKSwgbGlua1RvLCBvcHRpb25zLCBlcnJvcldhdGNoZXIsIGZhbHNlLCBudWxsLCBudWxsKTsKKworICAgICAgICBpZiAoZXJyb3JXYXRjaGVyLmhhc0Vycm9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oZXJyb3JXYXRjaGVyLmZpcnN0RXJyb3IoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RzaTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUNvbnRhaW5zVHlwZVN5c3RlbShGaWxlIGZpbGUsIFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGluZGV4bmFtZSA9IG5hbWVUb1BhdGhTdHJpbmcobmFtZSkgKyAiaW5kZXgueHNiIjsKKworICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBGaWxlKGZpbGUsIGluZGV4bmFtZSkpLmlzRmlsZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWmlwRmlsZSB6aXBmaWxlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHppcGZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHppcGZpbGUuZ2V0RW50cnkoaW5kZXhuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5ICE9IG51bGwgJiYgIWVudHJ5LmlzRGlyZWN0b3J5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2coIlByb2JsZW0gbG9hZGluZyBTY2hlbWFUeXBlU3lzdGVtLCB6aXBmaWxlbmFtZSAiICsgZmlsZSk7CisgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIG5hbWUsICJpbmRleCIsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemlwZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0cnkgeyB6aXBmaWxlLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGZvck5hbWUoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShuYW1lICsgIi4iICsgU2NoZW1hVHlwZUNvZGVQcmludGVyLklOREVYX0NMQVNTTkFNRSwgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbUltcGwpYy5nZXRGaWVsZCgidHlwZVN5c3RlbSIpLmdldChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVTeXN0ZW1JbXBsKFJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyLCBTdHJpbmcgbmFtZSwgU2NoZW1hVHlwZUxvYWRlciBsaW5rZXIpCisgICAgeworICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgIF9iYXNlUGFja2FnZSA9IG5hbWVUb1BhdGhTdHJpbmcoX25hbWUpOworICAgICAgICBfbGlua2VyID0gbGlua2VyOworICAgICAgICBfcmVzb3VyY2VMb2FkZXIgPSByZXNvdXJjZUxvYWRlcjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRGcm9tSGVhZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFcnJvciBlKQorICAgICAgICB7CisgICAgICAgICAgICBYQmVhbkRlYnVnLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEZyb21IZWFkZXIoKQorICAgIHsKKyAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVhZGluZyB1bnJlc29sdmVkIGhhbmRsZXMgZm9yIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMCk7CisgICAgICAgIFhzYlJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSwgd2hpY2ggc3RhcnRzIHdpdGggYSBoZWFkZXIuCisgICAgICAgICAgICByZWFkZXIgPSBuZXcgWHNiUmVhZGVyKCJpbmRleCIsIEZJTEVUWVBFX1NDSEVNQUlOREVYKTsKKworICAgICAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCisgICAgICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKKyAgICAgICAgICAgIHJlYWRlci5yZWFkSGFuZGxlUG9vbChfbG9jYWxIYW5kbGVzKTsKKworICAgICAgICAgICAgLy8gdGhlbiBhIHFuYW1lIG1hcCBvZiBnbG9iYWwgZWxlbWVudHMgKGNvdW50LCBxbmFtZS9oYW5kbGUsIHFuYW1lL2hhbmRsZS4uLikKKyAgICAgICAgICAgIF9nbG9iYWxFbGVtZW50cyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIG1vZGVsIGdyb3VwcworICAgICAgICAgICAgX21vZGVsR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOworCisgICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgYXR0cmlidXRlIGdyb3VwcworICAgICAgICAgICAgX2F0dHJpYnV0ZUdyb3VwcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKKworICAgICAgICAgICAgX2lkZW50aXR5Q29uc3RyYWludHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7CisKKyAgICAgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgdHlwZXMKKyAgICAgICAgICAgIF9nbG9iYWxUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50CisgICAgICAgICAgICBfZG9jdW1lbnRUeXBlcyA9IHJlYWRlci5yZWFkUU5hbWVSZWZNYXAoKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwZSBvZiBhdHRyaWJ1dGUgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGF0dHJpYnV0ZQorICAgICAgICAgICAgX2F0dHJpYnV0ZVR5cGVzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOworCisgICAgICAgICAgICAvLyBzdHJpbmcgbWFwIG9mIGFsbCB0eXBlcywgYnkgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQorICAgICAgICAgICAgX3R5cGVSZWZzQnlDbGFzc25hbWUgPSByZWFkZXIucmVhZENsYXNzbmFtZVJlZk1hcCgpOworCisgICAgICAgICAgICBfbmFtZXNwYWNlcyA9IHJlYWRlci5yZWFkTmFtZXNwYWNlcygpOworCisgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciByZWRlZmluZSwgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorICAgICAgICAgICAgaWYgKHJlYWRlci5hdExlYXN0KDIsIDE1LCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7CisgICAgICAgICAgICAgICAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzID0gcmVhZGVyLnJlYWRRTmFtZVJlZk1hcCgpOworICAgICAgICAgICAgICAgIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMgPSByZWFkZXIucmVhZFFOYW1lUmVmTWFwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2F2ZUluZGV4KCkKKyAgICB7CisgICAgICAgIFN0cmluZyBoYW5kbGUgPSAiaW5kZXgiOworICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7CisgICAgICAgIHNhdmVyLndyaXRlSW5kZXhEYXRhKCk7CisgICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUlOREVYKTsKKyAgICAgICAgc2F2ZXIud3JpdGVJbmRleERhdGEoKTsKKyAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNhdmVQb2ludGVycygpCisgICAgeworICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKGdsb2JhbEVsZW1lbnRzKCksICJzY2hlbWEvZWxlbWVudC8iKTsKKyAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhnbG9iYWxBdHRyaWJ1dGVzKCksICJzY2hlbWEvYXR0cmlidXRlLyIpOworICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKG1vZGVsR3JvdXBzKCksICJzY2hlbWEvbW9kZWxncm91cC8iKTsKKyAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhhdHRyaWJ1dGVHcm91cHMoKSwgInNjaGVtYS9hdHRyaWJ1dGVncm91cC8iKTsKKyAgICAgICAgc2F2ZVBvaW50ZXJzRm9yQ29tcG9uZW50cyhnbG9iYWxUeXBlcygpLCAic2NoZW1hL3R5cGUvIik7CisgICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoaWRlbnRpdHlDb25zdHJhaW50cygpLCAic2NoZW1hL2lkZW50aXR5Y29uc3RyYWludC8iKTsKKyAgICAgICAgc2F2ZVBvaW50ZXJzRm9yTmFtZXNwYWNlcyhfbmFtZXNwYWNlcywgInNjaGVtYS9uYW1lc3BhY2UvIik7CisgICAgICAgIHNhdmVQb2ludGVyc0ZvckNsYXNzbmFtZXMoX3R5cGVSZWZzQnlDbGFzc25hbWUua2V5U2V0KCksICJzY2hlbWEvamF2YW5hbWUvIik7CisgICAgICAgIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMocmVkZWZpbmVkTW9kZWxHcm91cHMoKSwgInNjaGVtYS9yZWRlZmluZWRtb2RlbGdyb3VwLyIpOworICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpLCAic2NoZW1hL3JlZGVmaW5lZGF0dHJpYnV0ZWdyb3VwLyIpOworICAgICAgICBzYXZlUG9pbnRlcnNGb3JDb21wb25lbnRzKHJlZGVmaW5lZEdsb2JhbFR5cGVzKCksICJzY2hlbWEvcmVkZWZpbmVkdHlwZS8iKTsKKyAgICB9CisKKyAgICB2b2lkIHNhdmVQb2ludGVyc0ZvckNvbXBvbmVudHMoU2NoZW1hQ29tcG9uZW50W10gY29tcG9uZW50cywgU3RyaW5nIGRpcikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIoY29tcG9uZW50c1tpXS5nZXROYW1lKCkpLCBfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNhdmVQb2ludGVyc0ZvckNsYXNzbmFtZXMoU2V0IGNsYXNzbmFtZXMsIFN0cmluZyBkaXIpCisgICAgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbGFzc25hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgJy8nKSwgX25hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzYXZlUG9pbnRlcnNGb3JOYW1lc3BhY2VzKFNldCBuYW1lc3BhY2VzLCBTdHJpbmcgZGlyKQorICAgIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgc2F2ZVBvaW50ZXJGaWxlKGRpciArIFFOYW1lSGVscGVyLmhleHNhZmVkaXIobmV3IFFOYW1lKG5zLCAieG1sbnMiKSksIF9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2F2ZVBvaW50ZXJGaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGZpbGVuYW1lKTsKKyAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihmaWxlbmFtZSwgRklMRVRZUEVfU0NIRU1BUE9JTlRFUik7CisgICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgICBzYXZlci53cml0ZUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9ubHkgdXNlZCBpbiB0aGUgbm9uYm9vdHN0cmFwcGVkIGNhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKCkKKyAgICB7CisgICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRvY3VtZW50VHlwZXMoKSkpOworICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXR0cmlidXRlVHlwZXMoKSkpOworICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2xvYmFsVHlwZXMoKSkpOworCisgICAgICAgIC8vIG5vdyBmdWxseSBqYXZhaXplIGV2ZXJ5dGhpbmcgZGVlcGx5LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZSBnVHlwZSA9IChTY2hlbWFUeXBlKWFsbFNlZW5UeXBlcy5nZXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChjbGFzc05hbWUucmVwbGFjZSgnJCcsICcuJyksIGdUeXBlLmdldFJlZigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcCBidWlsZFR5cGVSZWZzQnlDbGFzc25hbWUoTWFwIHR5cGVzQnlDbGFzc25hbWUpCisgICAgeworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXNCeUNsYXNzbmFtZS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQoY2xhc3NOYW1lLCAoKFNjaGVtYVR5cGUpdHlwZXNCeUNsYXNzbmFtZS5nZXQoY2xhc3NOYW1lKSkuZ2V0UmVmKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkQ29tcG9uZW50UmVmTWFwKFNjaGVtYUNvbXBvbmVudFtdIGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0LnB1dChjb21wb25lbnRzW2ldLmdldE5hbWUoKSwgY29tcG9uZW50c1tpXS5nZXRDb21wb25lbnRSZWYoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkRG9jdW1lbnRNYXAoU2NoZW1hVHlwZVtdIHR5cGVzKQorICAgIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHQucHV0KHR5cGVzW2ldLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSwgdHlwZXNbaV0uZ2V0UmVmKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEF0dHJpYnV0ZVR5cGVNYXAoU2NoZW1hVHlwZVtdIHR5cGVzKQorICAgIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHQucHV0KHR5cGVzW2ldLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCksIHR5cGVzW2ldLmdldFJlZigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSYW5kb20gX3JhbmRvbTsKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gX21hc2sgPSBuZXcgYnl0ZVsxMjggLyA4XTsKKworICAgIC8qKgorICAgICAqIEZ1biwgZnVuLiAgUHJvZHVjZSAxMjggYml0cyBvZiB1bmlxdWVuZXNzIHJhbmRvbWx5LgorICAgICAqIFdlIHVzZWQgdG8gdXNlIFNlY3VyZVJhbmRvbSwgYnV0IG5vdyB3ZSBkb24ndCBiZWNhdXNlIFNlY3VyZVJhbmRvbQorICAgICAqIGhpdHMgdGhlIGZpbGVzeXN0ZW0gYW5kIGhhbmdzIHVzIG9uIGEgZmlsZXN5c3RlbSBsb2NrLiAgSXQgYWxzbyBlYXRzCisgICAgICogYSB0aHJlYWQgYW5kIG90aGVyIGV4cGVuc2l2ZSByZXNvdXJjZXMuLiA6LSkuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCByZWFsbHkgY2FyZSB0aGF0IG5vbi1zZWN1cmUgUmFuZG9tKCkgY2FuIG9ubHkgZG8gNDggYml0cyBvZgorICAgICAqIHJhbmRvbW5lc3MsIHNpbmNlIHdlJ3JlIGNlcnRhaW5seSBub3QgZ29pbmcgdG8gYmUgY2FsbGVkIG1vcmUgdGhhbiAyXjQ4CisgICAgICogdGltZXMgd2l0aGluIG91ciBwcm9jZXNzIGxpZmV0aW1lLgorICAgICAqCisgICAgICogT3VyIHJlYWwgY29uY2VybiBpcyB0aGF0IGJ5IHNlZWRpbmcgUmFuZG9tKCkgd2l0aCB0aGUgY3VycmVudAorICAgICAqIHRpbWUsIHR3byB1c2VycyB3aWxsIGVuZCB1cCB3aXRoIHRoZSBzYW1lIGJpdHMgaWYgdGhleSBzdGFydCBhCisgICAgICogc2NoZW1hIGNvbXBpbGF0aW9uIHdpdGhpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC4gIFRoYXQgbWFrZXMgdGhlCisgICAgICogcHJvYmFiaWxpdHkgb2YgY29sbGlzaW9uIGluIHRoZSByZWFsIHdvcmxkIHNsaWdodGx5IHRvbyBoaWdoLgorICAgICAqIFdlJ3JlIGdvaW5nIHRvIGhhdmUgbWlsbGlvbnMgb2YgdXNlcnMsIHJlbWVtYmVyPyAgV2l0aCBhIG1pbGxpb24KKyAgICAgKiB1c2VycywgYW5kIG9uZS1jb21waWxhdGlvbi1wZXItZGF5IGVhY2gsIHdlJ2Qgc2VlIGEgY29sbGlzaW9uIGV2ZXJ5CisgICAgICogZmV3IG1vbnRocy4KKyAgICAgKgorICAgICAqIFNvIHdlJ2xsIGp1c3QgeG9yIHRoZSByZXN1bHRzIG9mIHJhbmRvbSB3aXRoIG91ciBmZXcgZXh0cmEKKyAgICAgKiBiaXRzIG9mIGluZm9ybWF0aW9uIGNvbXB1dGVkIGJlbG93IHRvIGhlbHAgcmVkdWNlIHRoZSBwcm9iYWJpbGl0eQorICAgICAqIG9mIGNvbGxpc2lvbiBieSBhIGZldyBkZWNpbWFsIHBsYWNlcy4gIFRvIGNvbGxpZGUsIHlvdSB3aWxsIGhhdmUgaGFkCisgICAgICogdG8gaGF2ZSB0aGUgc2FtZSBhbW91bnQgb2YgZnJlZSBtZW1vcnksIHRoZSBzYW1lIHVzZXIgbmFtZSwgdGltZXpvbmUsCisgICAgICogYW5kIGNvdW50cnksIHRoZSBzYW1lIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGUgc2FtZSBqYXZhIGNsYXNzcGF0aCwKKyAgICAgKiB0aGUgc2FtZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBqdm0gdmVyc2lvbiwgYW5kIHRoZSBzYW1lIGNob2ljZXMgb2YKKyAgICAgKiBpZGVudGl0eSBoYXNoY29kZXMgZm9yIGEgZmV3IG9iamVjdHMuIEFuZCBiZSBzdGFydGVkIHdpdGhpbiB0aGUgc2FtZQorICAgICAqIG1pbGxpc2Vjb25kLiBPciB5b3UgY2FuIGNvbGxpZGUgaWYgeW91IGhhdmUgYSBjb3NtaWMgMTI4LWJpdCBtYXRoZW1hdGljYWwKKyAgICAgKiBjb2luY2lkZW5jZS4gTm8gd29ycmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBuZXh0Qnl0ZXMoYnl0ZVtdIHJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChfcmFuZG9tID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gZGFvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworCisgICAgICAgICAgICAgICAgLy8gYXQgbGVhc3QgMTAgYml0cyBvZiB1bnFpZXVlbmVzcywgcmlnaHQ/ICBNYXliZSBldmVuIDUwIG9yIDYwLgorICAgICAgICAgICAgICAgIGRhb3Mud3JpdGVJbnQoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoU2NoZW1hVHlwZVN5c3RlbUltcGwuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wcyA9IG5ldyBTdHJpbmdbXSB7ICJ1c2VyLm5hbWUiLCAidXNlci5kaXIiLCAidXNlci50aW1lem9uZSIsICJ1c2VyLmNvdW50cnkiLCAiamF2YS5jbGFzcy5wYXRoIiwgImphdmEuaG9tZSIsICJqYXZhLnZlbmRvciIsICJqYXZhLnZlcnNpb24iLCAib3MudmVyc2lvbiIgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcHNbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYW9zLndyaXRlVVRGKHByb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgZGFvcy53cml0ZUludChTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShwcm9wKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGFvcy53cml0ZUxvbmcoUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKKyAgICAgICAgICAgICAgICBkYW9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGkgJSBfbWFzay5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIF9tYXNrW2pdICo9IDIxOworICAgICAgICAgICAgICAgICAgICBfbWFza1tqXSArPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhCZWFuRGVidWcubG9nRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgX3JhbmRvbS5uZXh0Qnl0ZXMocmVzdWx0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqID0gaSAmIF9tYXNrLmxlbmd0aDsKKyAgICAgICAgICAgIHJlc3VsdFtpXSBePSBfbWFza1tqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlU3lzdGVtSW1wbChTdHJpbmcgbmFtZUZvclN5c3RlbSkKKyAgICB7CisgICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gbmFtZSwgc2VsZWN0IGEgcmFuZG9tIG9uZQorICAgICAgICBpZiAobmFtZUZvclN5c3RlbSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBnZXQgMTI4IHJhbmRvbSBiaXRzICh0aGF0J2xsIGJlIDMyIGhleCBkaWdpdHMpCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMjgvOF07CisgICAgICAgICAgICBuZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICAgICAgbmFtZUZvclN5c3RlbSA9ICJzIiArIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShieXRlcykpOworICAgICAgICB9CisKKyAgICAgICAgX25hbWUgPSAic2NoZW1hLnN5c3RlbS4iICsgbmFtZUZvclN5c3RlbTsKKyAgICAgICAgX2Jhc2VQYWNrYWdlID0gbmFtZVRvUGF0aFN0cmluZyhfbmFtZSk7CisgICAgICAgIF9jbGFzc2xvYWRlciA9IG51bGw7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkRnJvbUJ1aWxkZXIoU2NoZW1hR2xvYmFsRWxlbWVudFtdIGdsb2JhbEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBnbG9iYWxBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMpCisgICAgeworICAgICAgICBhc3NlcnQoX2NsYXNzbG9hZGVyID09IG51bGwpOworICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKKyAgICAgICAgX2dsb2JhbEVsZW1lbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoZ2xvYmFsRWxlbWVudHMpOworICAgICAgICBfZ2xvYmFsQXR0cmlidXRlcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKGdsb2JhbEF0dHJpYnV0ZXMpOworICAgICAgICBfZ2xvYmFsVHlwZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChnbG9iYWxUeXBlcyk7CisgICAgICAgIF9kb2N1bWVudFR5cGVzID0gYnVpbGREb2N1bWVudE1hcChkb2N1bWVudFR5cGVzKTsKKyAgICAgICAgX2F0dHJpYnV0ZVR5cGVzID0gYnVpbGREb2N1bWVudE1hcChhdHRyaWJ1dGVUeXBlcyk7CisgICAgICAgIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKCk7CisgICAgICAgIF9uYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkRnJvbVN0c2NTdGF0ZShTdHNjU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBhc3NlcnQoX2NsYXNzbG9hZGVyID09IG51bGwpOworICAgICAgICBfbG9jYWxIYW5kbGVzID0gbmV3IEhhbmRsZVBvb2woKTsKKyAgICAgICAgX2dsb2JhbEVsZW1lbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuZ2xvYmFsRWxlbWVudHMoKSk7CisgICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuZ2xvYmFsQXR0cmlidXRlcygpKTsKKyAgICAgICAgX21vZGVsR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUubW9kZWxHcm91cHMoKSk7CisgICAgICAgIF9yZWRlZmluZWRNb2RlbEdyb3VwcyA9IGJ1aWxkQ29tcG9uZW50UmVmTWFwKHN0YXRlLnJlZGVmaW5lZE1vZGVsR3JvdXBzKCkpOworICAgICAgICBfYXR0cmlidXRlR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuYXR0cmlidXRlR3JvdXBzKCkpOworICAgICAgICBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUucmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkpOworICAgICAgICBfZ2xvYmFsVHlwZXMgPSBidWlsZENvbXBvbmVudFJlZk1hcChzdGF0ZS5nbG9iYWxUeXBlcygpKTsKKyAgICAgICAgX3JlZGVmaW5lZEdsb2JhbFR5cGVzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUucmVkZWZpbmVkR2xvYmFsVHlwZXMoKSk7CisgICAgICAgIF9kb2N1bWVudFR5cGVzID0gYnVpbGREb2N1bWVudE1hcChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpOworICAgICAgICBfYXR0cmlidXRlVHlwZXMgPSBidWlsZEF0dHJpYnV0ZVR5cGVNYXAoc3RhdGUuYXR0cmlidXRlVHlwZXMoKSk7CisgICAgICAgIF90eXBlUmVmc0J5Q2xhc3NuYW1lID0gYnVpbGRUeXBlUmVmc0J5Q2xhc3NuYW1lKHN0YXRlLnR5cGVzQnlDbGFzc25hbWUoKSk7CisgICAgICAgIF9pZGVudGl0eUNvbnN0cmFpbnRzID0gYnVpbGRDb21wb25lbnRSZWZNYXAoc3RhdGUuaWRDb25zdHJhaW50cygpKTsKKyAgICAgICAgX25hbWVzcGFjZXMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHN0YXRlLmdldE5hbWVzcGFjZXMoKSkpOworICAgIH0KKworICAgIGZpbmFsIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIGdldFR5cGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFN0cmluZ1Bvb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgTGlzdCBpbnRzVG9TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwcml2YXRlIE1hcCBzdHJpbmdzVG9JbnRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2hhbmRsZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX25hbWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgU3RyaW5nUG9vbCB0byBiZSBmaWxsZWQgd2l0aCBzdHJpbmdzLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nUG9vbChTdHJpbmcgaGFuZGxlLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgX2hhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGludHNUb1N0cmluZ3MuYWRkKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvZGVGb3JTdHJpbmcoU3RyaW5nIHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilzdHJpbmdzVG9JbnRzLmdldChzdHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJbnRlZ2VyKGludHNUb1N0cmluZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChzdHIpOworICAgICAgICAgICAgICAgIHN0cmluZ3NUb0ludHMucHV0KHN0ciwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHJpbmdGb3JDb2RlKGludCBjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpaW50c1RvU3RyaW5ncy5nZXQoY29kZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVG8oRGF0YU91dHB1dFN0cmVhbSBvdXRwdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRzVG9TdHJpbmdzLnNpemUoKSA+IFNob3J0Lk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVG9vIG1hbnkgc3RyaW5ncyAoIiArIGludHNUb1N0cmluZ3Muc2l6ZSgpICsgIikiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JTlRfVE9PX0xBUkdFKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlU2hvcnQoaW50c1RvU3RyaW5ncy5zaXplKCkpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBpbnRzVG9TdHJpbmdzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgZm9yIChpLm5leHQoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVVEYoc3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVhZEZyb20oRGF0YUlucHV0U3RyZWFtIGlucHV0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW50c1RvU3RyaW5ncy5zaXplKCkgIT0gMSB8fCBzdHJpbmdzVG9JbnRzLnNpemUoKSAhPSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnB1dC5yZWFkVVRGKCkuaW50ZXJuKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gY29kZUZvclN0cmluZyhzdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpID09IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6ICJJTyBFeGNlcHRpb24iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04sIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgSGFuZGxlUG9vbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBNYXAgX2hhbmRsZXNUb1JlZnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcCBfY29tcG9uZW50c1RvSGFuZGxlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7IC8vIHBvcHVsYXRlZCBvbiB3cml0ZQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gX3N0YXJ0ZWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgSGFuZGxlUG9vbCB0byBiZSBwb3B1bGF0ZWQuCisgICAgICAgICAqLworICAgICAgICBIYW5kbGVQb29sKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWRkVW5pcXVlSGFuZGxlKFNjaGVtYUNvbXBvbmVudCBvYmosIFN0cmluZyBiYXNlKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlID0gYmFzZS50b0xvd2VyQ2FzZSgpOyAgLy8gd2UgbG93ZXJjYXNlIGhhbmRsZXMgYmVjYXVzZSBvZiBjYXNlLWluc2Vuc2l0aXZlIFdpbmRvd3MgZmlsZW5hbWVzISEhCisgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gYmFzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMjsgX2hhbmRsZXNUb1JlZnMuY29udGFpbnNLZXkoaGFuZGxlKTsgaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBiYXNlICsgaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaGFuZGxlc1RvUmVmcy5wdXQoaGFuZGxlLCBvYmouZ2V0Q29tcG9uZW50UmVmKCkpOworICAgICAgICAgICAgX2NvbXBvbmVudHNUb0hhbmRsZXMucHV0KG9iaiwgaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaGFuZGxlRm9yQ29tcG9uZW50KFNjaGVtYUNvbXBvbmVudCBjb21wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGNvbXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFUeXBlKQorICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JUeXBlKChTY2hlbWFUeXBlKWNvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQorICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JFbGVtZW50KChTY2hlbWFHbG9iYWxFbGVtZW50KWNvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvckF0dHJpYnV0ZSgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWNvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFNb2RlbEdyb3VwKQorICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVGb3JNb2RlbEdyb3VwKChTY2hlbWFNb2RlbEdyb3VwKWNvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFBdHRyaWJ1dGVHcm91cCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRm9yQXR0cmlidXRlR3JvdXAoKFNjaGVtYUF0dHJpYnV0ZUdyb3VwKWNvbXApOworICAgICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUZvcklkZW50aXR5Q29uc3RyYWludCgoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50KWNvbXApOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tcG9uZW50IHR5cGUgY2Fubm90IGhhdmUgYSBoYW5kbGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBoYW5kbGVGb3JFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnQgZWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHN1cHBseSBoYW5kbGVzIGZvciB0eXBlcyBmcm9tIGFub3RoZXIgdHlwZSBzeXN0ZW0iKTsKKyAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSAoU3RyaW5nKV9jb21wb25lbnRzVG9IYW5kbGVzLmdldChlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZWxlbWVudCwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoZWxlbWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpICsgIkVsZW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaGFuZGxlRm9yQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGF0dHJpYnV0ZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCisgICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGF0dHJpYnV0ZSwgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoYXR0cmlidXRlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiQXR0cmlidXRlIik7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhhbmRsZUZvck1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cCBncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGdyb3VwKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZ3JvdXAsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGdyb3VwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiTW9kZWxHcm91cCIpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBoYW5kbGVGb3JBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cCBncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGdyb3VwKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSBhZGRVbmlxdWVIYW5kbGUoZ3JvdXAsIE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGdyb3VwLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiQXR0cmlidXRlR3JvdXAiKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaGFuZGxlRm9ySWRlbnRpdHlDb25zdHJhaW50KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpZGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZGMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmIChpZGMuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KGlkYyk7CisgICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCisgICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKGlkYywgTmFtZVV0aWwudXBwZXJDYW1lbENhc2UoaWRjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkgKyAiSWRlbnRpdHlDb25zdHJhaW50Iik7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhhbmRsZUZvclR5cGUoU2NoZW1hVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZVN5c3RlbSgpICE9IGdldFR5cGVTeXN0ZW0oKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcGx5IGhhbmRsZXMgZm9yIHR5cGVzIGZyb20gYW5vdGhlciB0eXBlIHN5c3RlbSIpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpX2NvbXBvbmVudHNUb0hhbmRsZXMuZ2V0KHR5cGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gIiI7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzRG9jdW1lbnRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJEb2MiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiQXR0clR5cGUiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdHlwZS5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKS5pc0F0dHJpYnV0ZSgpID8gIkF0dHIiIDogIkVsZW0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lOworICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxID0gSW50ZWdlci50b0hleFN0cmluZyh0eXBlLnRvU3RyaW5nKCkuaGFzaENvZGUoKSB8IDB4ODAwMDAwMDApLnN1YnN0cmluZyg0KS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gIkFub24iICsgdW5pcSArICJUeXBlIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gTmFtZVV0aWwudXBwZXJDYW1lbENhc2UobmFtZS5nZXRMb2NhbFBhcnQoKSkgKyB1bmlxICsgc3VmZml4ICsgIlR5cGUiOworCisgICAgICAgICAgICAgICAgaGFuZGxlID0gYWRkVW5pcXVlSGFuZGxlKHR5cGUsIGJhc2VOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVmRm9ySGFuZGxlKFN0cmluZyBoYW5kbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFDb21wb25lbnQuUmVmKV9oYW5kbGVzVG9SZWZzLmdldChoYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgU2V0IGdldEFsbEhhbmRsZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2hhbmRsZXNUb1JlZnMua2V5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0V3JpdGVNb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgX3N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgX2NvbXBvbmVudHNUb0hhbmRsZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2hhbmRsZXNUb1JlZnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gKFN0cmluZylpLm5leHQoKTsKKy8vICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JpdGluZyBwcmVleGlzdGluZyBoYW5kbGUgIiArIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50IGNvbXAgPSAoKFNjaGVtYUNvbXBvbmVudC5SZWYpX2hhbmRsZXNUb1JlZnMuZ2V0KGhhbmRsZSkpLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgICAgIF9jb21wb25lbnRzVG9IYW5kbGVzLnB1dChjb21wLCBoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBfYmFzZVBhY2thZ2U7CisKKyAgICAvLyBjbGFzc2xvYWRlciBpcyBhdmFpbGFibGUgZm9yIHN0cydzIHRoYXQgd2VyZSBjb21waWxlZCBhbmQgbG9hZGVkLCBub3QgZHluYW1pYyBvbmVzCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3Nsb2FkZXI7CisKKyAgICAvLyB0aGUgbG9hZGVyIGZvciBsb2FkaW5nIC54c2IgcmVzb3VyY2VzCisgICAgcHJpdmF0ZSBSZXNvdXJjZUxvYWRlciBfcmVzb3VyY2VMb2FkZXI7CisKKyAgICAvLyB0aGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gbGluayByZWZlcmVuY2VzIGR1cmluZyBsb2FkCisgICAgU2NoZW1hVHlwZUxvYWRlciBfbGlua2VyOworCisgICAgcHJpdmF0ZSBIYW5kbGVQb29sIF9sb2NhbEhhbmRsZXM7CisgICAgcHJpdmF0ZSBGaWxlIF9iYXNlU2F2ZURpcjsKKworICAgIC8vIGFjdHVhbCB0eXBlIHN5c3RlbSBkYXRhLCBtYXAgUU5hbWVzIC0+IFNjaGVtYUNvbXBvbmVudC5SZWYKKyAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkTW9kZWxHcm91cHM7CisgICAgcHJpdmF0ZSBNYXAgX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwczsKKyAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkR2xvYmFsVHlwZXM7CisKKyAgICBwcml2YXRlIE1hcCBfZ2xvYmFsRWxlbWVudHM7CisgICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEF0dHJpYnV0ZXM7CisgICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBzOworICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVHcm91cHM7CisgICAgcHJpdmF0ZSBNYXAgX2dsb2JhbFR5cGVzOworICAgIHByaXZhdGUgTWFwIF9kb2N1bWVudFR5cGVzOworICAgIHByaXZhdGUgTWFwIF9hdHRyaWJ1dGVUeXBlczsKKyAgICBwcml2YXRlIE1hcCBfaWRlbnRpdHlDb25zdHJhaW50cyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwcml2YXRlIE1hcCBfdHlwZVJlZnNCeUNsYXNzbmFtZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBTZXQgX25hbWVzcGFjZXM7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFUeXBlW10gRU1QVFlfU1RfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZVswXTsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFHbG9iYWxFbGVtZW50W10gRU1QVFlfR0VfQVJSQVkgPSBuZXcgU2NoZW1hR2xvYmFsRWxlbWVudFswXTsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBFTVBUWV9HQV9BUlJBWSA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbMF07CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hTW9kZWxHcm91cFtdIEVNUFRZX01HX0FSUkFZID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBbMF07CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBFTVBUWV9BR19BUlJBWSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFswXTsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBFTVBUWV9JQ19BUlJBWSA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbMF07CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlVG9EaXJlY3RvcnkoRmlsZSBjbGFzc0RpcikKKyAgICB7CisgICAgICAgIF9iYXNlU2F2ZURpciA9IGNsYXNzRGlyOworCisgICAgICAgIF9sb2NhbEhhbmRsZXMuc3RhcnRXcml0ZU1vZGUoKTsKKyAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoZ2xvYmFsVHlwZXMoKSk7CisgICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KGRvY3VtZW50VHlwZXMoKSk7CisgICAgICAgIHNhdmVUeXBlc1JlY3Vyc2l2ZWx5KGF0dHJpYnV0ZVR5cGVzKCkpOworICAgICAgICBzYXZlR2xvYmFsRWxlbWVudHMoZ2xvYmFsRWxlbWVudHMoKSk7CisgICAgICAgIHNhdmVHbG9iYWxBdHRyaWJ1dGVzKGdsb2JhbEF0dHJpYnV0ZXMoKSk7CisgICAgICAgIHNhdmVNb2RlbEdyb3Vwcyhtb2RlbEdyb3VwcygpKTsKKyAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwcyhhdHRyaWJ1dGVHcm91cHMoKSk7CisgICAgICAgIHNhdmVJZGVudGl0eUNvbnN0cmFpbnRzKGlkZW50aXR5Q29uc3RyYWludHMoKSk7CisKKyAgICAgICAgc2F2ZVR5cGVzUmVjdXJzaXZlbHkocmVkZWZpbmVkR2xvYmFsVHlwZXMoKSk7CisgICAgICAgIHNhdmVNb2RlbEdyb3VwcyhyZWRlZmluZWRNb2RlbEdyb3VwcygpKTsKKyAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwcyhyZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMoKSk7CisKKyAgICAgICAgc2F2ZUluZGV4KCk7CisgICAgICAgIHNhdmVQb2ludGVycygpOworICAgIH0KKworICAgIHZvaWQgc2F2ZVR5cGVzUmVjdXJzaXZlbHkoU2NoZW1hVHlwZVtdIHR5cGVzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmdldFR5cGVTeXN0ZW0oKSAhPSBnZXRUeXBlU3lzdGVtKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzYXZlVHlwZSh0eXBlc1tpXSk7CisgICAgICAgICAgICBzYXZlVHlwZXNSZWN1cnNpdmVseSh0eXBlc1tpXS5nZXRBbm9ueW1vdXNUeXBlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxFbGVtZW50cyhTY2hlbWFHbG9iYWxFbGVtZW50W10gZWx0cykKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZUdsb2JhbEVsZW1lbnQoZWx0c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlR2xvYmFsQXR0cmlidXRlcyhTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbXSBhdHRycykKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhdmVHbG9iYWxBdHRyaWJ1dGUoYXR0cnNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZU1vZGVsR3JvdXBzKFNjaGVtYU1vZGVsR3JvdXBbXSBncm91cHMpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZU1vZGVsR3JvdXAoZ3JvdXBzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVBdHRyaWJ1dGVHcm91cHMoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBncm91cHMpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZUF0dHJpYnV0ZUdyb3VwKGdyb3Vwc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlSWRlbnRpdHlDb25zdHJhaW50cyhTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpZGNzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZGNzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzYXZlSWRlbnRpdHlDb25zdHJhaW50KGlkY3NbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZUdsb2JhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCBlbHQpCisgICAgeworICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JFbGVtZW50KGVsdCk7CisgICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKKyAgICAgICAgc2F2ZXIud3JpdGVQYXJ0aWNsZURhdGEoKFNjaGVtYVBhcnRpY2xlKWVsdCk7CisgICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGVsdC5nZXRTb3VyY2VOYW1lKCkpOworICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UKTsKKyAgICAgICAgc2F2ZXIud3JpdGVQYXJ0aWNsZURhdGEoKFNjaGVtYVBhcnRpY2xlKWVsdCk7CisgICAgICAgIHNhdmVyLndyaXRlU3RyaW5nKGVsdC5nZXRTb3VyY2VOYW1lKCkpOworICAgICAgICBzYXZlci53cml0ZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVHbG9iYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlIGF0dHIpCisgICAgeworICAgICAgICBTdHJpbmcgaGFuZGxlID0gX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JBdHRyaWJ1dGUoYXR0cik7CisgICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKKyAgICAgICAgc2F2ZXIud3JpdGVBdHRyaWJ1dGVEYXRhKGF0dHIpOworICAgICAgICBzYXZlci53cml0ZVN0cmluZyhhdHRyLmdldFNvdXJjZU5hbWUoKSk7CisgICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSk7CisgICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlRGF0YShhdHRyKTsKKyAgICAgICAgc2F2ZXIud3JpdGVTdHJpbmcoYXR0ci5nZXRTb3VyY2VOYW1lKCkpOworICAgICAgICBzYXZlci53cml0ZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXAgZ3JwKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yTW9kZWxHcm91cChncnApOworICAgICAgICBYc2JSZWFkZXIgc2F2ZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSk7CisgICAgICAgIHNhdmVyLndyaXRlTW9kZWxHcm91cERhdGEoZ3JwKTsKKyAgICAgICAgc2F2ZXIud3JpdGVSZWFsSGVhZGVyKGhhbmRsZSwgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCk7CisgICAgICAgIHNhdmVyLndyaXRlTW9kZWxHcm91cERhdGEoZ3JwKTsKKyAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlQXR0cmlidXRlR3JvdXAoU2NoZW1hQXR0cmlidXRlR3JvdXAgZ3JwKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yQXR0cmlidXRlR3JvdXAoZ3JwKTsKKyAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOworICAgICAgICBzYXZlci53cml0ZUF0dHJpYnV0ZUdyb3VwRGF0YShncnApOworICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCk7CisgICAgICAgIHNhdmVyLndyaXRlQXR0cmlidXRlR3JvdXBEYXRhKGdycCk7CisgICAgICAgIHNhdmVyLndyaXRlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZUlkZW50aXR5Q29uc3RyYWludChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgaWRjKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9ySWRlbnRpdHlDb25zdHJhaW50KGlkYyk7CisgICAgICAgIFhzYlJlYWRlciBzYXZlciA9IG5ldyBYc2JSZWFkZXIoaGFuZGxlKTsKKyAgICAgICAgc2F2ZXIud3JpdGVJZENvbnN0cmFpbnREYXRhKGlkYyk7CisgICAgICAgIHNhdmVyLndyaXRlUmVhbEhlYWRlcihoYW5kbGUsIEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVCk7CisgICAgICAgIHNhdmVyLndyaXRlSWRDb25zdHJhaW50RGF0YShpZGMpOworICAgICAgICBzYXZlci53cml0ZUVuZCgpOworICAgIH0KKworICAgIHZvaWQgc2F2ZVR5cGUoU2NoZW1hVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGhhbmRsZSA9IF9sb2NhbEhhbmRsZXMuaGFuZGxlRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgWHNiUmVhZGVyIHNhdmVyID0gbmV3IFhzYlJlYWRlcihoYW5kbGUpOworICAgICAgICBzYXZlci53cml0ZVR5cGVEYXRhKHR5cGUpOworICAgICAgICBzYXZlci53cml0ZVJlYWxIZWFkZXIoaGFuZGxlLCBGSUxFVFlQRV9TQ0hFTUFUWVBFKTsKKyAgICAgICAgc2F2ZXIud3JpdGVUeXBlRGF0YSh0eXBlKTsKKyAgICAgICAgc2F2ZXIud3JpdGVFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmFja1BvaW50ZXIoSW5wdXRTdHJlYW0gc3RyZWFtKQorICAgIHsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dFN0cmVhbShzdHJlYW0pOworCisgICAgICAgICAgICBpbnQgbWFnaWMgPSBpbnB1dC5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAobWFnaWMgIT0gREFUQV9CQUJFKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBpbnQgbWFqb3J2ZXIgPSBpbnB1dC5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGludCBtaW5vcnZlciA9IGlucHV0LnJlYWRTaG9ydCgpOworCisgICAgICAgICAgICBpZiAobWFqb3J2ZXIgIT0gTUFKT1JfVkVSU0lPTikKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKG1pbm9ydmVyID4gTUlOT1JfVkVSU0lPTikKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgaWYgKG1ham9ydmVyID4gMiB8fCBtYWpvcnZlciA9PSAyICYmIG1pbm9ydmVyID49IDE4KQorICAgICAgICAgICAgICAgIGlucHV0LnJlYWRTaG9ydCgpOyAvLyByZWxlYXNlIG51bWJlciBwcmVzZW50IGluIGF0TGVhc3QoMiwgMTgsIDApCisKKyAgICAgICAgICAgIGludCBhY3R1YWxmaWxldHlwZSA9IGlucHV0LnJlYWRTaG9ydCgpOworICAgICAgICAgICAgaWYgKGFjdHVhbGZpbGV0eXBlICE9IEZJTEVUWVBFX1NDSEVNQVBPSU5URVIpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFN0cmluZ1Bvb2wgc3RyaW5nUG9vbCA9IG5ldyBTdHJpbmdQb29sKCJwb2ludGVyIiwgInVuayIpOworICAgICAgICAgICAgc3RyaW5nUG9vbC5yZWFkRnJvbShpbnB1dCk7CisKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdQb29sLnN0cmluZ0ZvckNvZGUoaW5wdXQucmVhZFNob3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRyeSB7IGlucHV0LmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFhzYlJlYWRlcgorICAgIHsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIF9pbnB1dDsKKyAgICAgICAgRGF0YU91dHB1dFN0cmVhbSBfb3V0cHV0OworICAgICAgICBTdHJpbmdQb29sIF9zdHJpbmdQb29sOworICAgICAgICBTdHJpbmcgX2hhbmRsZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgX21ham9ydmVyOworICAgICAgICBwcml2YXRlIGludCBfbWlub3J2ZXI7CisgICAgICAgIHByaXZhdGUgaW50IF9yZWxlYXNlbm87CisgICAgICAgIGludCBfYWN0dWFsZmlsZXR5cGU7CisKKyAgICAgICAgcHVibGljIFhzYlJlYWRlcihTdHJpbmcgaGFuZGxlLCBpbnQgZmlsZXR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZW5hbWUgPSBfYmFzZVBhY2thZ2UgKyBoYW5kbGUgKyAiLnhzYiI7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSByYXdpbnB1dCA9IGdldExvYWRlclN0cmVhbShyZXNvdXJjZW5hbWUpOworICAgICAgICAgICAgaWYgKHJhd2lucHV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IENvdWxkIG5vdCBsb2NhdGUgY29tcGlsZWQgc2NoZW1hIHJlc291cmNlICIgKyByZXNvdXJjZW5hbWUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTk9fUkVTT1VSQ0UpOworCisgICAgICAgICAgICBfaW5wdXQgPSBuZXcgRGF0YUlucHV0U3RyZWFtKHJhd2lucHV0KTsKKyAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7CisKKyAgICAgICAgICAgIGludCBtYWdpYyA9IHJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChtYWdpYyAhPSBEQVRBX0JBQkUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlhNTC1CRUFOUyBjb21waWxlZCBzY2hlbWE6IFdyb25nIG1hZ2ljIGNvb2tpZSIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUFHSUNfQ09PS0lFKTsKKworICAgICAgICAgICAgX21ham9ydmVyID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBfbWlub3J2ZXIgPSByZWFkU2hvcnQoKTsKKworICAgICAgICAgICAgaWYgKF9tYWpvcnZlciAhPSBNQUpPUl9WRVJTSU9OKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBXcm9uZyBtYWpvciB2ZXJzaW9uIC0gZXhwZWN0aW5nICIgKyBNQUpPUl9WRVJTSU9OICsgIiwgZ290ICIgKyBfbWFqb3J2ZXIsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfTUFKT1JfVkVSU0lPTik7CisKKyAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPiBNSU5PUl9WRVJTSU9OKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJYTUwtQkVBTlMgY29tcGlsZWQgc2NoZW1hOiBJbmNvbXBhdGlibGUgbWlub3IgdmVyc2lvbiAtIGV4cGVjdGluZyB1cCB0byAiICsgTUlOT1JfVkVSU0lPTiArICIsIGdvdCAiICsgX21pbm9ydmVyLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01JTk9SX1ZFUlNJT04pOworCisgICAgICAgICAgICAvLyBDbGlwIHRvIDE0IGJlY2F1c2Ugd2UncmUgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyCisgICAgICAgICAgICAvLyBtaW5vciB2ZXJzaW9ucy4gIFJlbW92ZSB0aGlzIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3IG1ham9yCisgICAgICAgICAgICAvLyB2ZXJzaW9uCisKKyAgICAgICAgICAgIGlmIChfbWlub3J2ZXIgPCAxNCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogSW5jb21wYXRpYmxlIG1pbm9yIHZlcnNpb24gLSBleHBlY3RpbmcgYXQgbGVhc3QgMTQsIGdvdCAiICsgX21pbm9ydmVyLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX01JTk9SX1ZFUlNJT04pOworCisgICAgICAgICAgICBpZiAoYXRMZWFzdCgyLCAxOCwgMCkpCisgICAgICAgICAgICAgICAgX3JlbGVhc2VubyA9IHJlYWRTaG9ydCgpOworCisgICAgICAgICAgICBpbnQgYWN0dWFsZmlsZXR5cGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGlmIChhY3R1YWxmaWxldHlwZSAhPSBmaWxldHlwZSAmJiBmaWxldHlwZSAhPSAtMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiWE1MLUJFQU5TIGNvbXBpbGVkIHNjaGVtYTogRmlsZSBoYXMgdGhlIHdyb25nIHR5cGUgLSBleHBlY3RpbmcgdHlwZSAiICsgZmlsZXR5cGUgKyAiLCBnb3QgdHlwZSAiICsgYWN0dWFsZmlsZXR5cGUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfRklMRV9UWVBFKTsKKworICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbChfaGFuZGxlLCBfbmFtZSk7CisgICAgICAgICAgICBfc3RyaW5nUG9vbC5yZWFkRnJvbShfaW5wdXQpOworCisgICAgICAgICAgICBfYWN0dWFsZmlsZXR5cGUgPSBhY3R1YWxmaWxldHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGF0TGVhc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPCBtYWpvcnZlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoX21pbm9ydmVyIDwgbWlub3J2ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIChfcmVsZWFzZW5vID49IHJlbGVhc2Vubyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdE1vc3QoaW50IG1ham9ydmVyLCBpbnQgbWlub3J2ZXIsIGludCByZWxlYXNlbm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX21ham9ydmVyIDwgbWFqb3J2ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoX21pbm9ydmVyID4gbWlub3J2ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIChfcmVsZWFzZW5vIDw9IHJlbGVhc2Vubyk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0QWN0dWFsRmlsZXR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2FjdHVhbGZpbGV0eXBlOworICAgICAgICB9CisKKyAgICAgICAgWHNiUmVhZGVyKFN0cmluZyBoYW5kbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9oYW5kbGUgPSBoYW5kbGU7CisgICAgICAgICAgICBfc3RyaW5nUG9vbCA9IG5ldyBTdHJpbmdQb29sKF9oYW5kbGUsIF9uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVSZWFsSGVhZGVyKFN0cmluZyBoYW5kbGUsIGludCBmaWxldHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaGFja2Vyb286IGlmIGhhbmRsZSBjb250YWlucyBhICIvIiBpdCdzIG5vdCByZWxhdGl2ZS4KKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZW5hbWU7CisKKyAgICAgICAgICAgIGlmIChoYW5kbGUuaW5kZXhPZignLycpID49IDApCisgICAgICAgICAgICAgICAgcmVzb3VyY2VuYW1lID0gaGFuZGxlICsgIi54c2IiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc291cmNlbmFtZSA9IF9iYXNlUGFja2FnZSArIGhhbmRsZSArICIueHNiIjsKKworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHJhd291dHB1dCA9IGdldFNhdmVyU3RyZWFtKHJlc291cmNlbmFtZSk7CisgICAgICAgICAgICBpZiAocmF3b3V0cHV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBjb21waWxlZCBzY2hlbWEgcmVzb3VyY2UgIiArIHJlc291cmNlbmFtZSwgX25hbWUsIGhhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5OT1RfV1JJVEVBQkxFKTsKKworICAgICAgICAgICAgX291dHB1dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHJhd291dHB1dCk7CisgICAgICAgICAgICBfaGFuZGxlID0gaGFuZGxlOworCisgICAgICAgICAgICB3cml0ZUludChEQVRBX0JBQkUpOworICAgICAgICAgICAgd3JpdGVTaG9ydChNQUpPUl9WRVJTSU9OKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQoTUlOT1JfVkVSU0lPTik7CisgICAgICAgICAgICB3cml0ZVNob3J0KFJFTEVBU0VfTlVNQkVSKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQoZmlsZXR5cGUpOworCisgICAgICAgICAgICBfc3RyaW5nUG9vbC53cml0ZVRvKF9vdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWFkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9pbnB1dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfaW5wdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG9oLCB3ZWxsLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lucHV0ID0gbnVsbDsKKyAgICAgICAgICAgIF9zdHJpbmdQb29sID0gbnVsbDsKKyAgICAgICAgICAgIF9oYW5kbGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9vdXRwdXQgPSBudWxsOworICAgICAgICAgICAgX3N0cmluZ1Bvb2wgPSBudWxsOworICAgICAgICAgICAgX2hhbmRsZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlsZVR5cGVGcm9tQ29tcG9uZW50VHlwZShpbnQgY29tcG9uZW50VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFUWVBFOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlU3lzdGVtSW1wbC5GSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURTsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5NT0RFTF9HUk9VUDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUltcGwuRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGVTeXN0ZW1JbXBsLkZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNvbXBvbmVudCB0eXBlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlSW5kZXhEYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaGFzIGEgaGFuZGxlIHBvb2wgKGNvdW50LCBoYW5kbGUvdHlwZSwgaGFuZGxlL3R5cGUuLi4pCisgICAgICAgICAgICB3cml0ZUhhbmRsZVBvb2woX2xvY2FsSGFuZGxlcyk7CisKKyAgICAgICAgICAgIC8vIHRoZW4gYSBxbmFtZSBtYXAgb2YgZ2xvYmFsIGVsZW1lbnRzIChjb3VudCwgcW5hbWUvaGFuZGxlLCBxbmFtZS9oYW5kbGUuLi4pCisgICAgICAgICAgICB3cml0ZVFOYW1lTWFwKGdsb2JhbEVsZW1lbnRzKCkpOworCisgICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoZ2xvYmFsQXR0cmlidXRlcygpKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIG1vZGVsIGdyb3VwcworICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChtb2RlbEdyb3VwcygpKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSBncm91cHMKKyAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoYXR0cmlidXRlR3JvdXBzKCkpOworCisgICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgaWRlbnRpdHkgY29uc3RyYWludHMKKyAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAoaWRlbnRpdHlDb25zdHJhaW50cygpKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGdsb2JhbCB0eXBlcworICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChnbG9iYWxUeXBlcygpKTsKKworICAgICAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGRvY3VtZW50IHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50CisgICAgICAgICAgICB3cml0ZURvY3VtZW50VHlwZU1hcChkb2N1bWVudFR5cGVzKCkpOworCisgICAgICAgICAgICAvLyBxbmFtZSBtYXAgb2YgYXR0cmlidXRlIHR5cGVzLCBieSB0aGUgcW5hbWUgb2YgdGhlIGNvbnRhaW5lZCBhdHRyaWJ1dGUKKyAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlVHlwZU1hcChhdHRyaWJ1dGVUeXBlcygpKTsKKworICAgICAgICAgICAgLy8gYWxsIHRoZSB0eXBlcyBieSBjbGFzc25hbWUKKyAgICAgICAgICAgIHdyaXRlQ2xhc3NuYW1lTWFwKF90eXBlUmVmc0J5Q2xhc3NuYW1lKTsKKworICAgICAgICAgICAgLy8gYWxsIHRoZSBuYW1lc3BhY2VzCisgICAgICAgICAgICB3cml0ZU5hbWVzcGFjZXMoX25hbWVzcGFjZXMpOworCisgICAgICAgICAgICAvLyBWRVJTSU9OIDIuMTUgYW5kIG5ld2VyIGJlbG93CisgICAgICAgICAgICB3cml0ZVFOYW1lTWFwKHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkpOworICAgICAgICAgICAgd3JpdGVRTmFtZU1hcChyZWRlZmluZWRNb2RlbEdyb3VwcygpKTsKKyAgICAgICAgICAgIHdyaXRlUU5hbWVNYXAocmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUhhbmRsZVBvb2woSGFuZGxlUG9vbCBwb29sKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZVNob3J0KHBvb2wuX2NvbXBvbmVudHNUb0hhbmRsZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvb2wuX2NvbXBvbmVudHNUb0hhbmRsZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFDb21wb25lbnQgY29tcCA9IChTY2hlbWFDb21wb25lbnQpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IChTdHJpbmcpcG9vbC5fY29tcG9uZW50c1RvSGFuZGxlcy5nZXQoY29tcCk7CisgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBmaWxlVHlwZUZyb21Db21wb25lbnRUeXBlKGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhoYW5kbGUpOworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlYWRIYW5kbGVQb29sKEhhbmRsZVBvb2wgcG9vbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvb2wuX2hhbmRsZXNUb1JlZnMuc2l6ZSgpICE9IDAgfHwgcG9vbC5fc3RhcnRlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb25lbXB0eSBoYW5kbGUgc2V0IGJlZm9yZSByZWFkIik7CisKKyAgICAgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlID0gcmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHNob3J0IGNvZGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0OworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlLlJlZihnZXRUeXBlU3lzdGVtKCksIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hTW9kZWxHcm91cC5SZWYoZ2V0VHlwZVN5c3RlbSgpLCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlERU5USVRZQ09OU1RSQUlOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKGdldFR5cGVTeXN0ZW0oKSwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlNjaGVtYSBpbmRleCBoYXMgYW4gdW5yZWNvZ25pemVkIGVudHJ5IG9mIHR5cGUgIiArIGNvZGUsIF9uYW1lLCBoYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uVU5SRUNPR05JWkVEX0lOREVYX0VOVFJZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9vbC5faGFuZGxlc1RvUmVmcy5wdXQoaGFuZGxlLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2hvcnQgcmVhZFNob3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9pbnB1dC5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNob3J0KGludCBzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocyA+IFNob3J0Lk1BWF9WQUxVRSB8fCBzIDwgU2hvcnQuTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJWYWx1ZSAiICsgcyArICIgb3V0IG9mIHJhbmdlOiBtdXN0IGZpdCBpbiBhIDE2LWJpdCBzaG9ydC4iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JTlRfVE9PX0xBUkdFKTsKKyAgICAgICAgICAgIGlmIChfb3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlU2hvcnQocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHJlYWRJbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRJbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUludChpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXQud3JpdGVJbnQoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3N0cmluZ1Bvb2wuc3RyaW5nRm9yQ29kZShyZWFkU2hvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gX3N0cmluZ1Bvb2wuY29kZUZvclN0cmluZyhzdHIpOworICAgICAgICAgICAgd3JpdGVTaG9ydChjb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIFFOYW1lIHJlYWRRTmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gcmVhZFN0cmluZygpOworICAgICAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlUU5hbWUoUU5hbWUgcW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChxbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG51bGwpOworICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKHFuYW1lLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNPQVBBcnJheVR5cGUgcmVhZFNPQVBBcnJheVR5cGUoKQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHJlYWRRTmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIGRpbWVuc2lvbnMgPSByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU09BUEFycmF5VHlwZShxTmFtZSwgZGltZW5zaW9ucyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU09BUEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIGFycmF5VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFycmF5VHlwZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobnVsbCk7CisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShhcnJheVR5cGUuZ2V0UU5hbWUoKSk7CisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoYXJyYXlUeXBlLnNvYXAxMURpbWVuc2lvblN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVhZEhhbmRsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBoYW5kbGUgPSByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChoYW5kbGUuY2hhckF0KDApICE9ICdfJykKKyAgICAgICAgICAgICAgICByZXR1cm4gX2xvY2FsSGFuZGxlcy5yZWZGb3JIYW5kbGUoaGFuZGxlKTsKKworICAgICAgICAgICAgc3dpdGNoIChoYW5kbGUuY2hhckF0KDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBfQklfIC0gYnVpbHQtaW4gc2NoZW1hIHR5cGUgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFNjaGVtYVR5cGUpQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCkucmVzb2x2ZUhhbmRsZShoYW5kbGUpKS5nZXRSZWYoKTsKKyAgICAgICAgICAgICAgICBjYXNlICdUJzogLy8gX1hUXyAtIGV4dGVybmFsIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZFR5cGVSZWYoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpOworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiAvLyBfWEVfIC0gZXh0ZXJuYWwgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kRWxlbWVudFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7CisgICAgICAgICAgICAgICAgY2FzZSAnQSc6IC8vIF9YQV8gLSBleHRlcm5hbCBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEF0dHJpYnV0ZVJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7CisgICAgICAgICAgICAgICAgY2FzZSAnTSc6IC8vIF9YTV8gLSBleHRlcm5hbCBtb2RlbCBncm91cAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kTW9kZWxHcm91cFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIF9YTl8gLSBleHRlcm5hbCBhdHRyaWJ1dGUgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKTsKKyAgICAgICAgICAgICAgICBjYXNlICdEJzogLy8gX1hEXyAtIGV4dGVybmFsIGlkZW50aXR5IGNvbnN0cmFpbnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZElkZW50aXR5Q29uc3RyYWludFJlZihRTmFtZUhlbHBlci5mb3JQcmV0dHkoaGFuZGxlLCA0KSk7CisgICAgICAgICAgICAgICAgY2FzZSAnUic6IC8vIF9YUl8gLSBleHRlcm5hbCByZWYgdG8gYXR0cmlidXRlJ3MgdHlwZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xpbmtlci5maW5kQXR0cmlidXRlKFFOYW1lSGVscGVyLmZvclByZXR0eShoYW5kbGUsIDQpKS5nZXRUeXBlKCkuZ2V0UmVmKCk7CisgICAgICAgICAgICAgICAgY2FzZSAnUyc6IC8vIF9YU18gLSBleHRlcm5hbCByZWYgdG8gZWxlbWVudCdzIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saW5rZXIuZmluZEVsZW1lbnQoUU5hbWVIZWxwZXIuZm9yUHJldHR5KGhhbmRsZSwgNCkpLmdldFR5cGUoKS5nZXRSZWYoKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IHJlc29sdmUgaGFuZGxlICIgKyBoYW5kbGUsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9IQU5ETEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUhhbmRsZShTY2hlbWFDb21wb25lbnQgY29tcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCB8fCBjb21wLmdldFR5cGVTeXN0ZW0oKSA9PSBnZXRUeXBlU3lzdGVtKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoX2xvY2FsSGFuZGxlcy5oYW5kbGVGb3JDb21wb25lbnQoY29tcCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjb21wLmdldENvbXBvbmVudFR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWEFfIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuTU9ERUxfR1JPVVA6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWE1fIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOgorICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZygiX1hOXyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY29tcC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWEVfIiArIFFOYW1lSGVscGVyLnByZXR0eShjb21wLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YRF8iICsgUU5hbWVIZWxwZXIucHJldHR5KGNvbXAuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgorICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSAoU2NoZW1hVHlwZSljb21wOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0J1aWx0aW5UeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfQklfIiArIHR5cGUuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGZpeCBmb3IgQ1IxMjA3NTkgLSBhZGRlZCBvdXRwdXQgb2YgdHlwZXMgX1hSXyAmIF9YU18KKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhbiBhdHRyaWJ1dGUgKF9YUl8pIG9yIGVsZW1lbnQgKF9YU18pIGRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZXMgcmVmIHRvIHJlZmVyIHRvIGFuIGF0dHJpYnV0ZSBvciBlbGVtZW50IGluIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gc2NoZW1hIGFuZCB0aGUgdHlwZSBvZiB0aGF0IGF0dHJpYnV0ZSBvciBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC8vIGlzIGFuIGFub255bW91cyAobG9jYWwpIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWFRfIiArIFFOYW1lSGVscGVyLnByZXR0eSh0eXBlLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hRmllbGQgc2YgPSB0eXBlLmdldENvbnRhaW5lckZpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKHNmICE9IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNmLmlzQXR0cmlidXRlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoIl9YUl8iICsgUU5hbWVIZWxwZXIucHJldHR5KHNmLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKCJfWFNfIiArIFFOYW1lSGVscGVyLnByZXR0eShzZi5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgaGFuZGxlIGZvciBjb21wb25lbnQgIiArIGNvbXAsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9IQU5ETEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hVHlwZS5SZWYgcmVhZFR5cGVSZWYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKXJlYWRIYW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVUeXBlKFNjaGVtYVR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVIYW5kbGUodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBNYXAgcmVhZFFOYW1lUmVmTWFwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHJlYWRRTmFtZSgpOworICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgb2JqID0gcmVhZEhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobmFtZSwgb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlUU5hbWVNYXAoU2NoZW1hQ29tcG9uZW50W10gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydChjb21wb25lbnRzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShjb21wb25lbnRzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoY29tcG9uZW50c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlRG9jdW1lbnRUeXBlTWFwKFNjaGVtYVR5cGVbXSBkb2N0eXBlcykKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydChkb2N0eXBlcy5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N0eXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGRvY3R5cGVzW2ldLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7CisgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoZG9jdHlwZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUF0dHJpYnV0ZVR5cGVNYXAoU2NoZW1hVHlwZVtdIGF0dHJ0eXBlcykKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRydHlwZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoYXR0cnR5cGVzW2ldLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCkpOworICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGF0dHJ0eXBlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFUeXBlLlJlZltdIHJlYWRUeXBlUmVmQXJyYXkoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgU2NoZW1hVHlwZS5SZWZbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZS5SZWZbc2l6ZV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZWFkVHlwZVJlZigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVUeXBlQXJyYXkoU2NoZW1hVHlwZVtdIGFycmF5KQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZVNob3J0KGFycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1hcCByZWFkQ2xhc3NuYW1lUmVmTWFwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU2NoZW1hQ29tcG9uZW50LlJlZiBvYmogPSByZWFkSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChuYW1lLCBvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVDbGFzc25hbWVNYXAoTWFwIHR5cGVzQnlDbGFzcykKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlc0J5Q2xhc3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzQnlDbGFzcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoKChTY2hlbWFUeXBlLlJlZil0eXBlc0J5Q2xhc3MuZ2V0KGNsYXNzTmFtZSkpLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNldCByZWFkTmFtZXNwYWNlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlTmFtZXNwYWNlcyhTZXQgbmFtZXNwYWNlcykKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydChuYW1lc3BhY2VzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRTdHJlYW0gZ2V0U2F2ZXJTdHJlYW0oU3RyaW5nIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9iYXNlU2F2ZURpciwgbmFtZSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGdldExvYWRlclN0cmVhbShTdHJpbmcgcmVzb3VyY2VuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5pc2hlcyBsb2FkaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50IGZpbmlzaExvYWRpbmdFbGVtZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBpbXBsID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKGdldFR5cGVTeXN0ZW0oKSk7CisgICAgICAgICAgICAgICAgc2hvcnQgcGFydGljbGVUeXBlID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlVHlwZSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiV3JvbmcgcGFydGljbGUgdHlwZSAiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5CQURfUEFSVElDTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgbG9hZFBhcnRpY2xlKGltcGwsIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQsIHRydWUpOworICAgICAgICAgICAgICAgIGltcGwuc2V0RmlsZW5hbWUocmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgZmluaXNoTG9hZGluZ0F0dHJpYnV0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgaW1wbCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKGdldFR5cGVTeXN0ZW0oKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2FkQXR0cmlidXRlKGltcGwpOworICAgICAgICAgICAgICAgIGltcGwuc2V0RmlsZW5hbWUocmVhZFN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYU1vZGVsR3JvdXAgZmluaXNoTG9hZGluZ01vZGVsR3JvdXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBpbXBsID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBJbXBsKGdldFR5cGVTeXN0ZW0oKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvYWRNb2RlbEdyb3VwKGltcGwpOworICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBmaW5pc2hMb2FkaW5nSWRlbnRpdHlDb25zdHJhaW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGltcGwgPSBuZXcgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbChnZXRUeXBlU3lzdGVtKCkpOworICAgICAgICAgICAgICAgIGltcGwuc2V0TmFtZShyZWFkUU5hbWUoKSk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXRDb25zdHJhaW50Q2F0ZWdvcnkocmVhZFNob3J0KCkpOworICAgICAgICAgICAgICAgIGltcGwuc2V0U2VsZWN0b3IocmVhZFN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbcmVhZFNob3J0KCldOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGZpZWxkcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpbXBsLnNldEZpZWxkcyhmaWVsZHMpOworCisgICAgICAgICAgICAgICAgaWYgKGltcGwuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWVJFRikKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRSZWZlcmVuY2VkS2V5KChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKXJlYWRIYW5kbGUoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgbWFwQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBNYXAgbnNNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWFwQ291bnQgOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gcmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBuc01hcHBpbmdzLnB1dChwcmVmaXgsIHVyaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltcGwuc2V0TlNNYXAobnNNYXBwaW5ncyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1wbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgdHlwZSBmcm9tIHR5cGVzeXN0ZW0iLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5ORVNURURfRVhDRVBUSU9OLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cCBmaW5pc2hMb2FkaW5nQXR0cmlidXRlR3JvdXAoKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwoZ2V0VHlwZVN5c3RlbSgpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9hZEF0dHJpYnV0ZUdyb3VwKGltcGwpOworICAgICAgICAgICAgICAgIHJldHVybiBpbXBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCB0eXBlIGZyb20gdHlwZXN5c3RlbSIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk5FU1RFRF9FWENFUFRJT04sIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmlzaExvYWRpbmdUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgaW1wbCA9IG5ldyBTY2hlbWFUeXBlSW1wbChnZXRUeXBlU3lzdGVtKCksIHRydWUpOworICAgICAgICAgICAgICAgIGltcGwuc2V0TmFtZShyZWFkUU5hbWUoKSk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNlRGVwdGgocmVhZFNob3J0KCkpOworICAgICAgICAgICAgICAgIGltcGwuc2V0QmFzZVR5cGVSZWYocmVhZFR5cGVSZWYoKSk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXREZXJpdmF0aW9uVHlwZShyZWFkU2hvcnQoKSk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlYWRTaG9ydCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9HTE9CQUw6CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRhaW5lckZpZWxkUmVmKHJlYWRIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRhaW5lckZpZWxkSW5kZXgoKHNob3J0KTEsIHJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMRUxUOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb250YWluZXJGaWVsZEluZGV4KChzaG9ydCkyLCByZWFkU2hvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW1wbC5zZXRGdWxsSmF2YU5hbWUocmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpbXBsLnNldEZ1bGxKYXZhSW1wbE5hbWUocmVhZFN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMocmVhZFR5cGVSZWZBcnJheSgpKTsKKworICAgICAgICAgICAgICAgIGltcGwuc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKHJlYWRTaG9ydCgpKTsKKworICAgICAgICAgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgICAgICAgICBmbGFncyA9IHJlYWRJbnQoKTsKKworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NvbXBsZXhUeXBlID0gKChmbGFncyAmIEZMQUdfU0lNUExFX1RZUEUpID09IDApOworICAgICAgICAgICAgICAgIGltcGwuc2V0Q29tcGlsZWQoKGZsYWdzICYgRkxBR19DT01QSUxFRCkgIT0gMCk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXREb2N1bWVudFR5cGUoKGZsYWdzICYgRkxBR19ET0NVTUVOVF9UWVBFKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpbXBsLnNldEF0dHJpYnV0ZVR5cGUoKGZsYWdzICYgRkxBR19BVFRSSUJVVEVfVFlQRSkgIT0gMCk7CisgICAgICAgICAgICAgICAgaW1wbC5zZXRTaW1wbGVUeXBlKCFpc0NvbXBsZXhUeXBlKTsKKworICAgICAgICAgICAgICAgIHNob3J0IGNvbXBsZXhWYXJpZXR5ID0gU2NoZW1hVHlwZS5OT1RfQ09NUExFWF9UWVBFOworICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXhUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRBYnN0cmFjdEZpbmFsKChmbGFncyAmIEZMQUdfQUJTVFJBQ1QpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX0VYVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfUkVTVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfTElTVCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfRklOQUxfVU5JT04pICE9IDApOworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJsb2NrKChmbGFncyAmIEZMQUdfQkxPQ0tfRVhUKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19CTE9DS19SRVNUKSAhPSAwKTsKKworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldE9yZGVyU2Vuc2l0aXZlKChmbGFncyAmIEZMQUdfT1JERVJfU0VOU0lUSVZFKSAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxleFZhcmlldHkgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBNb2RlbCBUYWJsZQorICAgICAgICAgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOworCisgICAgICAgICAgICAgICAgICAgIHNob3J0IGF0dHJDb3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck1vZGVsLmFkZEF0dHJpYnV0ZShyZWFkQXR0cmlidXRlRGF0YSgpKTsKKworICAgICAgICAgICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRTZXQocmVhZFFOYW1lU2V0KCkpOworICAgICAgICAgICAgICAgICAgICBhdHRyTW9kZWwuc2V0V2lsZGNhcmRQcm9jZXNzKHJlYWRTaG9ydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgUHJvcGVydHkgVGFibGUKKyAgICAgICAgICAgICAgICAgICAgTWFwIGF0dHJQcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgYXR0clByb3BDb3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJQcm9wQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHJlYWRQcm9wZXJ0eURhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcC5pc0F0dHJpYnV0ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJBdHRyaWJ1dGUgcHJvcGVydHkgIiArIGkgKyAiIGlzIG5vdCBhbiBhdHRyaWJ1dGUiLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5XUk9OR19QUk9QRVJUWV9UWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJQcm9wZXJ0aWVzLnB1dChwcm9wLmdldE5hbWUoKSwgcHJvcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBNYXAgZWxlbVByb3BlcnRpZXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBzaG9ydCBpc0FsbCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UIHx8IGNvbXBsZXhWYXJpZXR5ID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGVudCBNb2RlbCBUcmVlCisgICAgICAgICAgICAgICAgICAgICAgICBpc0FsbCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0cyA9IHJlYWRQYXJ0aWNsZUFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudE1vZGVsID0gcGFydHNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TW9kZWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJDb250ZW50IG1vZGVsIG5vdCB3ZWxsLWZvcm1lZCIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLk1BTEZPUk1FRF9DT05URU5UX01PREVMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBQcm9wZXJ0eSBUYWJsZQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtUHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBlbGVtUHJvcENvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1Qcm9wQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gcmVhZFByb3BlcnR5RGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmlzQXR0cmlidXRlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJFbGVtZW50IHByb3BlcnR5ICIgKyBpICsgIiBpcyBub3QgYW4gZWxlbWVudCIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLldST05HX1BST1BFUlRZX1RZUEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1Qcm9wZXJ0aWVzLnB1dChwcm9wLmdldE5hbWUoKSwgcHJvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbVByb3BlcnRpZXMsIGF0dHJQcm9wZXJ0aWVzLCBpc0FsbCA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuV2lsZGNhcmRSZXN1bHQgd2NFbHQgPSBTdHNjQ29tcGxleFR5cGVSZXNvbHZlci5zdW1tYXJpemVFbHRXaWxkY2FyZHMoY29udGVudE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXNDb21wbGV4VHlwZSB8fCBjb21wbGV4VmFyaWV0eSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgc2ltcGxlVmFyaWV0eSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KHNpbXBsZVZhcmlldHkpOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpbmdFbnVtID0gKChmbGFncyAmIEZMQUdfU1RSSU5HRU5VTSkgIT0gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRPcmRlcmVkKChmbGFncyAmIEZMQUdfT1JERVJFRCkgIT0gMCA/IFNjaGVtYVR5cGUuVU5PUkRFUkVEIDogKChmbGFncyAmIEZMQUdfVE9UQUxfT1JERVIpICE9IDAgPyBTY2hlbWFUeXBlLlRPVEFMX09SREVSIDogU2NoZW1hVHlwZS5QQVJUSUFMX09SREVSKSk7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0Qm91bmRlZCgoZmxhZ3MgJiBGTEFHX0JPVU5ERUQpICE9IDApOworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEZpbml0ZSgoZmxhZ3MgJiBGTEFHX0ZJTklURSkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0TnVtZXJpYygoZmxhZ3MgJiBGTEFHX05VTUVSSUMpICE9IDApOworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFVuaW9uT2ZMaXN0cygoZmxhZ3MgJiBGTEFHX1VOSU9OX09GX0xJU1RTKSAhPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRTaW1wbGVGaW5hbCgoZmxhZ3MgJiBGTEFHX0ZJTkFMX1JFU1QpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX0xJU1QpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0ZJTkFMX1VOSU9OKSAhPSAwKTsKKworICAgICAgICAgICAgICAgICAgICBYbWxWYWx1ZVJlZltdIGZhY2V0cyA9IG5ldyBYbWxWYWx1ZVJlZltTY2hlbWFUeXBlLkxBU1RfRkFDRVQgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIGZpeGVkRmFjZXRzID0gbmV3IGJvb2xlYW5bU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUICsgMV07CisgICAgICAgICAgICAgICAgICAgIHNob3J0IGZhY2V0Q291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYWNldENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGZhY2V0Q29kZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRzW2ZhY2V0Q29kZV0gPSByZWFkWG1sVmFsdWVPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkRmFjZXRzW2ZhY2V0Q29kZV0gPSAocmVhZFNob3J0KCkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRCYXNpY0ZhY2V0cyhmYWNldHMsIGZpeGVkRmFjZXRzKTsKKworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFdoaXRlU3BhY2VSdWxlKHJlYWRTaG9ydCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldFBhdHRlcm5GYWNldCgoZmxhZ3MgJiBGTEFHX0hBU19QQVRURVJOKSAhPSAwKTsKKworICAgICAgICAgICAgICAgICAgICBzaG9ydCBwYXR0ZXJuQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW10gcGF0dGVybnMgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnJlZ2V4LlJlZ3VsYXJFeHByZXNzaW9uW3BhdHRlcm5Db3VudF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zW2ldID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbihyZWFkU3RyaW5nKCksICJYIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQYXR0ZXJucyhwYXR0ZXJucyk7CisKKyAgICAgICAgICAgICAgICAgICAgc2hvcnQgZW51bUNvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFhtbFZhbHVlUmVmW10gZW51bVZhbHVlcyA9IG5ldyBYbWxWYWx1ZVJlZltlbnVtQ291bnRdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtVmFsdWVzW2ldID0gcmVhZFhtbFZhbHVlT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRFbnVtZXJhdGlvblZhbHVlcyhlbnVtQ291bnQgPT0gMCA/IG51bGwgOiBlbnVtVmFsdWVzKTsKKworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEJhc2VFbnVtVHlwZVJlZihyZWFkVHlwZVJlZigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nRW51bSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgc2VDb3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cmllcyA9IG5ldyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbc2VDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzW2ldID0gbmV3IFNjaGVtYVN0cmluZ0VudW1FbnRyeUltcGwocmVhZFN0cmluZygpLCByZWFkU2hvcnQoKSwgcmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0U3RyaW5nRW51bUVudHJpZXMoZW50cmllcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpbXBsZVZhcmlldHkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0RGVjaW1hbFNpemUocmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKHJlYWRUeXBlUmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhyZWFkVHlwZVJlZkFycmF5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKCJTaW1wbGUgdHlwZSBkb2VzIG5vdCBoYXZlIGEgcmVjb2duaXplZCB2YXJpZXR5IiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uV1JPTkdfU0lNUExFX1ZBUklFVFkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW1wbC5zZXRGaWxlbmFtZShyZWFkU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGltcGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHR5cGUgZnJvbSB0eXBlc3lzdGVtIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uTkVTVEVEX0VYQ0VQVElPTiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVR5cGVEYXRhKFNjaGVtYVR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVRTmFtZSh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRPdXRlclR5cGUoKSk7CisgICAgICAgICAgICB3cml0ZVNob3J0KCgoU2NoZW1hVHlwZUltcGwpdHlwZSkuZ2V0QmFzZURlcHRoKCkpOworICAgICAgICAgICAgd3JpdGVUeXBlKHR5cGUuZ2V0QmFzZVR5cGUoKSk7CisgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSk7CisgICAgICAgICAgICBpZiAodHlwZS5nZXRDb250YWluZXJGaWVsZCgpID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChGSUVMRF9OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZ2V0T3V0ZXJUeXBlKCkuaXNBdHRyaWJ1dGVUeXBlKCkgfHwgdHlwZS5nZXRPdXRlclR5cGUoKS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfR0xPQkFMKTsKKyAgICAgICAgICAgICAgICB3cml0ZUhhbmRsZSgoU2NoZW1hQ29tcG9uZW50KXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmdldENvbnRhaW5lckZpZWxkKCkuaXNBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KEZJRUxEX0xPQ0FMQVRUUik7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCgoKFNjaGVtYVR5cGVJbXBsKXR5cGUuZ2V0T3V0ZXJUeXBlKCkpLmdldEluZGV4Rm9yTG9jYWxBdHRyaWJ1dGUoKFNjaGVtYUxvY2FsQXR0cmlidXRlKXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoRklFTERfTE9DQUxFTFQpOworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoKChTY2hlbWFUeXBlSW1wbCl0eXBlLmdldE91dGVyVHlwZSgpKS5nZXRJbmRleEZvckxvY2FsRWxlbWVudCgoU2NoZW1hTG9jYWxFbGVtZW50KXR5cGUuZ2V0Q29udGFpbmVyRmllbGQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVTdHJpbmcodHlwZS5nZXRGdWxsSmF2YU5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZyh0eXBlLmdldEZ1bGxKYXZhSW1wbE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVR5cGVBcnJheSh0eXBlLmdldEFub255bW91c1R5cGVzKCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldEFub255bW91c1VuaW9uTWVtYmVyT3JkaW5hbCgpKTsKKworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfU0lNUExFX1RZUEU7CisgICAgICAgICAgICBpZiAodHlwZS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRE9DVU1FTlRfVFlQRTsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzQXR0cmlidXRlVHlwZSgpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQVRUUklCVVRFX1RZUEU7CisgICAgICAgICAgICBpZiAodHlwZS5vcmRlcmVkKCkgIT0gU2NoZW1hVHlwZS5VTk9SREVSRUQpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19PUkRFUkVEOworICAgICAgICAgICAgaWYgKHR5cGUub3JkZXJlZCgpID09IFNjaGVtYVR5cGUuVE9UQUxfT1JERVIpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19UT1RBTF9PUkRFUjsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzQm91bmRlZCgpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQk9VTkRFRDsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzRmluaXRlKCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5JVEU7CisgICAgICAgICAgICBpZiAodHlwZS5pc051bWVyaWMoKSkKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX05VTUVSSUM7CisgICAgICAgICAgICBpZiAodHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19TVFJJTkdFTlVNOworICAgICAgICAgICAgaWYgKCgoU2NoZW1hVHlwZUltcGwpdHlwZSkuaXNVbmlvbk9mTGlzdHMoKSkKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1VOSU9OX09GX0xJU1RTOworICAgICAgICAgICAgaWYgKHR5cGUuaGFzUGF0dGVybkZhY2V0KCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19IQVNfUEFUVEVSTjsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzT3JkZXJTZW5zaXRpdmUoKSkKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX09SREVSX1NFTlNJVElWRTsKKworICAgICAgICAgICAgaWYgKHR5cGUuYmxvY2tFeHRlbnNpb24oKSkKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0JMT0NLX0VYVDsKKyAgICAgICAgICAgIGlmICh0eXBlLmJsb2NrUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0JMT0NLX1JFU1Q7CisgICAgICAgICAgICBpZiAodHlwZS5maW5hbEV4dGVuc2lvbigpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfRVhUOworICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxSZXN0cmljdGlvbigpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfRVhUOworICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxMaXN0KCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19GSU5BTF9MSVNUOworICAgICAgICAgICAgaWYgKHR5cGUuZmluYWxVbmlvbigpKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOQUxfVU5JT047CisgICAgICAgICAgICBpZiAodHlwZS5pc0Fic3RyYWN0KCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19BQlNUUkFDVDsKKworICAgICAgICAgICAgd3JpdGVJbnQoZmxhZ3MpOworCisgICAgICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldENvbnRlbnRUeXBlKCkpOworCisgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIE1vZGVsIFRhYmxlCisgICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYXR0ck1vZGVsID0gdHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOworICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSBhdHRyTW9kZWwuZ2V0QXR0cmlidXRlcygpOworCisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRycy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlRGF0YShhdHRyc1tpXSk7CisKKyAgICAgICAgICAgICAgICB3cml0ZVFOYW1lU2V0KGF0dHJNb2RlbC5nZXRXaWxkY2FyZFNldCgpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGF0dHJNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgUHJvcGVydHkgVGFibGUKKyAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGF0dHJQcm9wZXJ0aWVzID0gdHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyUHJvcGVydGllcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0clByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEYXRhKGF0dHJQcm9wZXJ0aWVzW2ldKTsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgfHwKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnRlbnQgTW9kZWwgVHJlZQorICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHR5cGUuaGFzQWxsQ29udGVudCgpID8gMSA6IDApOworICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRzOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBuZXcgU2NoZW1hUGFydGljbGVbXSB7IHR5cGUuZ2V0Q29udGVudE1vZGVsKCkgfTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBuZXcgU2NoZW1hUGFydGljbGVbMF07CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZUFycmF5KHBhcnRzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IFByb3BlcnR5IFRhYmxlCisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gZWx0UHJvcGVydGllcyA9IHR5cGUuZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbHRQcm9wZXJ0aWVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0UHJvcGVydGllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEYXRhKGVsdFByb3BlcnRpZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkgfHwgdHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgZmFjZXRDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gU2NoZW1hVHlwZS5MQVNUX0ZBQ0VUOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldEZhY2V0KGkpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmYWNldENvdW50Kys7CisgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChmYWNldENvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBTY2hlbWFUeXBlLkxBU1RfRkFDRVQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgZmFjZXQgPSB0eXBlLmdldEZhY2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydCh0eXBlLmlzRmFjZXRGaXhlZChpKSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpKTsKKworICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbltdIHBhdHRlcm5zID0gKChTY2hlbWFUeXBlSW1wbCl0eXBlKS5nZXRQYXR0ZXJuRXhwcmVzc2lvbnMoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHBhdHRlcm5zLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcocGF0dGVybnNbaV0uZ2V0UGF0dGVybigpKTsKKworICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBlbnVtVmFsdWVzID0gdHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOworICAgICAgICAgICAgICAgIGlmIChlbnVtVmFsdWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChlbnVtVmFsdWVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlWG1sVmFsdWVPYmplY3QoZW51bVZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbmV3IGZvciB2ZXJzaW9uIDIuMworICAgICAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldEJhc2VFbnVtVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5oYXNTdHJpbmdFbnVtVmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTY2hlbWFTdHJpbmdFbnVtRW50cnlbXSBlbnRyaWVzID0gdHlwZS5nZXRTdHJpbmdFbnVtRW50cmllcygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGVudHJpZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhlbnRyaWVzW2ldLmdldFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoZW50cmllc1tpXS5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGVudHJpZXNbaV0uZ2V0RW51bU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUludCh0eXBlLmdldERlY2ltYWxTaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUodHlwZS5nZXRMaXN0SXRlbVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVBcnJheSh0eXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKHR5cGUuZ2V0U291cmNlTmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVhZEV4dGVuc2lvbnNMaXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBhc3NlcnQgY291bnQgPT0gMDsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmVhZFN0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgcmVhZEF0dHJpYnV0ZURhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOworICAgICAgICAgICAgbG9hZEF0dHJpYnV0ZShyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbG9hZE1vZGVsR3JvdXAoU2NoZW1hTW9kZWxHcm91cEltcGwgcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuaW5pdChyZWFkUU5hbWUoKSwgcmVhZFN0cmluZygpLCByZWFkU2hvcnQoKSA9PSAxLCBhdExlYXN0KDIsIDE1LCAwKSA/IHJlYWRTaG9ydCgpID09IDEgOiBmYWxzZSwgR3JvdXBEb2N1bWVudC5GYWN0b3J5LnBhcnNlKCByZWFkU3RyaW5nKCkgKS5nZXRHcm91cCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBsb2FkQXR0cmlidXRlR3JvdXAoU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmluaXQoIHJlYWRRTmFtZSgpLCByZWFkU3RyaW5nKCksIHJlYWRTaG9ydCgpID09IDEsIGF0TGVhc3QoMiwgMTUsIDApID8gcmVhZFNob3J0KCkgPT0gMSA6IGZhbHNlLCBBdHRyaWJ1dGVHcm91cERvY3VtZW50LkZhY3RvcnkucGFyc2UoIHJlYWRTdHJpbmcoKSApLmdldEF0dHJpYnV0ZUdyb3VwKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBYbWxFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGxvYWRBdHRyaWJ1dGUoU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmFtZSwgdHlwZSwgdXNlLCBkZWZ0ZXh0LCBkZWZ2YWwsIGZpeGVkLCBzb2FwYXJyYXl0eXBlCisgICAgICAgICAgICByZXN1bHQuaW5pdChyZWFkUU5hbWUoKSwgcmVhZFR5cGVSZWYoKSwgcmVhZFNob3J0KCksIHJlYWRTdHJpbmcoKSwgbnVsbCwgYXRMZWFzdCgyLCAxNiwgMCkgPyByZWFkWG1sVmFsdWVPYmplY3QoKSA6IG51bGwsIHJlYWRTaG9ydCgpID09IDEsIHJlYWRTT0FQQXJyYXlUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUF0dHJpYnV0ZURhdGEoU2NoZW1hTG9jYWxBdHRyaWJ1dGUgYXR0cikKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVRTmFtZShhdHRyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVR5cGUoYXR0ci5nZXRUeXBlKCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyLmdldFVzZSgpKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKGF0dHIuZ2V0RGVmYXVsdFRleHQoKSk7CisgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KGF0dHIuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydChhdHRyLmlzRml4ZWQoKSA/IDEgOiAwKTsKKyAgICAgICAgICAgIHdyaXRlU09BUEFycmF5VHlwZSgoKFNjaGVtYVdTRExBcnJheVR5cGUpYXR0cikuZ2V0V1NETEFycmF5VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVJZENvbnN0cmFpbnREYXRhKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludCBpZGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlUU5hbWUoaWRjLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVNob3J0KGlkYy5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZyhpZGMuZ2V0U2VsZWN0b3IoKSk7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IGlkYy5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQoZmllbGRzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBmaWVsZHMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgICAgIHdyaXRlU3RyaW5nKGZpZWxkc1tpXSk7CisKKworICAgICAgICAgICAgaWYgKGlkYy5nZXRDb25zdHJhaW50Q2F0ZWdvcnkoKSA9PSBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuQ0NfS0VZUkVGKQorICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGlkYy5nZXRSZWZlcmVuY2VkS2V5KCkpOworCisgICAgICAgICAgICBTZXQgbWFwcGluZ3MgPSBpZGMuZ2V0TlNNYXAoKS5lbnRyeVNldCgpOworICAgICAgICAgICAgd3JpdGVTaG9ydChtYXBwaW5ncy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcHBpbmdzLml0ZXJhdG9yKCkgOyBpdC5oYXNOZXh0KCkgOyApIHsKKyAgICAgICAgICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpaXQubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpZS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJlZml4KTsKKyAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyh1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHJlYWRQYXJ0aWNsZUFycmF5KCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hUGFydGljbGVbcmVhZFNob3J0KCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVhZFBhcnRpY2xlRGF0YSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVQYXJ0aWNsZUFycmF5KFNjaGVtYVBhcnRpY2xlW10gc3BhKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZVNob3J0KHNwYS5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGEubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZURhdGEoc3BhW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVBhcnRpY2xlIHJlYWRQYXJ0aWNsZURhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCBwYXJ0aWNsZVR5cGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCByZXN1bHQ7CisgICAgICAgICAgICBpZiAocGFydGljbGVUeXBlICE9IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7CisgICAgICAgICAgICBsb2FkUGFydGljbGUocmVzdWx0LCBwYXJ0aWNsZVR5cGUsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGxvYWRQYXJ0aWNsZShTY2hlbWFQYXJ0aWNsZUltcGwgcmVzdWx0LCBpbnQgcGFydGljbGVUeXBlLCBib29sZWFuIGdsb2JhbCkKKyAgICAgICAgeworICAgICAgICAgICAgc2hvcnQgcGFydGljbGVGbGFncyA9IHJlYWRTaG9ydCgpOworCisgICAgICAgICAgICByZXN1bHQuc2V0UGFydGljbGVUeXBlKHBhcnRpY2xlVHlwZSk7CisgICAgICAgICAgICByZXN1bHQuc2V0TWluT2NjdXJzKHJlYWRCaWdJbnRlZ2VyKCkpOworICAgICAgICAgICAgcmVzdWx0LnNldE1heE9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKKworICAgICAgICAgICAgcmVzdWx0LnNldFRyYW5zaXRpb25SdWxlcyhyZWFkUU5hbWVTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfU0tJUFBBQkxFKSAhPSAwKTsKKworICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZVR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkU2V0KHJlYWRRTmFtZVNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFdpbGRjYXJkUHJvY2VzcyhyZWFkU2hvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIGxyZXN1bHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50SW1wbClyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0TmFtZUFuZFR5cGVSZWYocmVhZFFOYW1lKCksIHJlYWRUeXBlUmVmKCkpOworICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldERlZmF1bHQocmVhZFN0cmluZygpLCAocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9GSVhFRCkgIT0gMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0RGVmYXVsdFZhbHVlKHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXROaWxsYWJsZSgocGFydGljbGVGbGFncyAmIEZMQUdfUEFSVF9OSUxMQUJMRSkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0QmxvY2soKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tFWFQpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQkxPQ0tSRVNUKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0JMT0NLU1VCU1QpICE9IDApOworICAgICAgICAgICAgICAgICAgICBscmVzdWx0LnNldFdzZGxBcnJheVR5cGUocmVhZFNPQVBBcnJheVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGxyZXN1bHQuc2V0QWJzdHJhY3QoKHBhcnRpY2xlRmxhZ3MgJiBGTEFHX1BBUlRfQUJTVFJBQ1QpICE9IDApOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBncmVzdWx0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKWxyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBncmVzdWx0LnNldEZpbmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0ZJTkFMRVhUKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJ0aWNsZUZsYWdzICYgRkxBR19QQVJUX0ZJTkFMUkVTVCkgIT0gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE3LCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVzdWx0LnNldFN1YnN0aXR1dGlvbkdyb3VwKChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilyZWFkSGFuZGxlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzdWJzdEdyb3VwQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RHcm91cENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jlc3VsdC5hZGRTdWJzdGl0dXRpb25Hcm91cE1lbWJlcihyZWFkUU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gaWRjcyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW3JlYWRTaG9ydCgpXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkY3NbaV0gPSAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilyZWFkSGFuZGxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgbHJlc3VsdC5zZXRJZGVudGl0eUNvbnN0cmFpbnRzKGlkY3MpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFBhcnRpY2xlQ2hpbGRyZW4ocmVhZFBhcnRpY2xlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oIlVucmVjb2duaXplZCBwYXJ0aWNsZSB0eXBlICIsIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLkJBRF9QQVJUSUNMRV9UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVQYXJ0aWNsZURhdGEoU2NoZW1hUGFydGljbGUgcGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVTaG9ydChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKTsKKyAgICAgICAgICAgIHNob3J0IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJ0LmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19QQVJUX1NLSVBQQUJMRTsKKyAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IGxwYXJ0ID0gKFNjaGVtYUxvY2FsRWxlbWVudClwYXJ0OworICAgICAgICAgICAgICAgIGlmIChscGFydC5pc0ZpeGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSVhFRDsKKyAgICAgICAgICAgICAgICBpZiAobHBhcnQuaXNOaWxsYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfTklMTEFCTEU7CisgICAgICAgICAgICAgICAgaWYgKGxwYXJ0LmJsb2NrRXh0ZW5zaW9uKCkpCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9CTE9DS0VYVDsKKyAgICAgICAgICAgICAgICBpZiAobHBhcnQuYmxvY2tSZXN0cmljdGlvbigpKQorICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQkxPQ0tSRVNUOworICAgICAgICAgICAgICAgIGlmIChscGFydC5ibG9ja1N1YnN0aXR1dGlvbigpKQorICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQkxPQ0tTVUJTVDsKKyAgICAgICAgICAgICAgICBpZiAobHBhcnQuaXNBYnN0cmFjdCgpKQorICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX1BBUlRfQUJTVFJBQ1Q7CisKKyAgICAgICAgICAgICAgICBpZiAobHBhcnQgaW5zdGFuY2VvZiBTY2hlbWFHbG9iYWxFbGVtZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCBncGFydCA9IChTY2hlbWFHbG9iYWxFbGVtZW50KWxwYXJ0OworICAgICAgICAgICAgICAgICAgICBpZiAoZ3BhcnQuZmluYWxFeHRlbnNpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSU5BTEVYVDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdwYXJ0LmZpbmFsUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUEFSVF9GSU5BTFJFU1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVTaG9ydChmbGFncyk7CisgICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocGFydC5nZXRNaW5PY2N1cnMoKSk7CisgICAgICAgICAgICB3cml0ZUJpZ0ludGVnZXIocGFydC5nZXRNYXhPY2N1cnMoKSk7CisgICAgICAgICAgICB3cml0ZVFOYW1lU2V0KHBhcnQuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOworCisgICAgICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZVNldChwYXJ0LmdldFdpbGRjYXJkU2V0KCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHBhcnQuZ2V0V2lsZGNhcmRQcm9jZXNzKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IGxwYXJ0ID0gKFNjaGVtYUxvY2FsRWxlbWVudClwYXJ0OworICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGxwYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZShscGFydC5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmluZyhscGFydC5nZXREZWZhdWx0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChscGFydC5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU09BUEFycmF5VHlwZSgoKFNjaGVtYVdTRExBcnJheVR5cGUpbHBhcnQpLmdldFdTRExBcnJheVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChscGFydCBpbnN0YW5jZW9mIFNjaGVtYUdsb2JhbEVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnQgZ3BhcnQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudClscGFydDsKKworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVIYW5kbGUoZ3BhcnQuc3Vic3RpdHV0aW9uR3JvdXAoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lW10gc3Vic3RHcm91cE1lbWJlcnMgPSBncGFydC5zdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoc3Vic3RHcm91cE1lbWJlcnMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RHcm91cE1lbWJlcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShzdWJzdEdyb3VwTWVtYmVyc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbXSBpZGNzID0gbHBhcnQuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpOworCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoaWRjcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSGFuZGxlKGlkY3NbaV0pOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVQYXJ0aWNsZUFycmF5KHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHBhcnRpY2xlIHR5cGUgIiwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uQkFEX1BBUlRJQ0xFX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcmVhZFByb3BlcnR5RGF0YSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBwcm9wID0gbmV3IFNjaGVtYVByb3BlcnR5SW1wbCgpOworICAgICAgICAgICAgcHJvcC5zZXROYW1lKHJlYWRRTmFtZSgpKTsKKyAgICAgICAgICAgIHByb3Auc2V0VHlwZVJlZihyZWFkVHlwZVJlZigpKTsKKyAgICAgICAgICAgIHNob3J0IHByb3BmbGFncyA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgcHJvcC5zZXRBdHRyaWJ1dGUoKHByb3BmbGFncyAmIEZMQUdfUFJPUF9JU0FUVFIpICE9IDApOworICAgICAgICAgICAgcHJvcC5zZXRDb250YWluZXJUeXBlUmVmKHJlYWRUeXBlUmVmKCkpOworICAgICAgICAgICAgcHJvcC5zZXRNaW5PY2N1cnMocmVhZEJpZ0ludGVnZXIoKSk7CisgICAgICAgICAgICBwcm9wLnNldE1heE9jY3VycyhyZWFkQmlnSW50ZWdlcigpKTsKKyAgICAgICAgICAgIHByb3Auc2V0TmlsbGFibGUocmVhZFNob3J0KCkpOworICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0KHJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgIHByb3Auc2V0Rml4ZWQocmVhZFNob3J0KCkpOworICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0VGV4dChyZWFkU3RyaW5nKCkpOworCisgICAgICAgICAgICBwcm9wLnNldEphdmFQcm9wZXJ0eU5hbWUocmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgIHByb3Auc2V0SmF2YVR5cGVDb2RlKHJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgIHByb3Auc2V0RXh0ZW5kc0phdmEocmVhZFR5cGVSZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgKHByb3BmbGFncyAmIEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAocHJvcGZsYWdzICYgRkxBR19QUk9QX0pBVkFPUFRJT05BTCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgKHByb3BmbGFncyAmIEZMQUdfUFJPUF9KQVZBQVJSQVkpICE9IDApOworICAgICAgICAgICAgcHJvcC5zZXRKYXZhU2V0dGVyRGVsaW1pdGVyKHJlYWRRTmFtZVNldCgpKTsKKyAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKKyAgICAgICAgICAgICAgICBwcm9wLnNldERlZmF1bHRWYWx1ZShyZWFkWG1sVmFsdWVPYmplY3QoKSk7CisKKyAgICAgICAgICAgIGlmICghcHJvcC5pc0F0dHJpYnV0ZSgpICYmIGF0TGVhc3QoMiwgMTcsIDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNob3J0IHNpemUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBMaW5rZWRIYXNoU2V0IHFuYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0KHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNpemUgOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHFuYW1lcy5hZGQocmVhZFFOYW1lKCkpOworICAgICAgICAgICAgICAgIHByb3Auc2V0QWNjZXB0ZWROYW1lcyhxbmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvcC5zZXRJbW11dGFibGUoKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9wOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVByb3BlcnR5RGF0YShTY2hlbWFQcm9wZXJ0eSBwcm9wKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZVFOYW1lKHByb3AuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHdyaXRlVHlwZShwcm9wLmdldFR5cGUoKSk7CisgICAgICAgICAgICB3cml0ZVNob3J0KChwcm9wLmlzQXR0cmlidXRlKCkgPyBGTEFHX1BST1BfSVNBVFRSIDogMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5leHRlbmRzSmF2YVNpbmdsZXRvbigpID8gRkxBR19QUk9QX0pBVkFTSU5HTEVUT04gOiAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgIChwcm9wLmV4dGVuZHNKYXZhT3B0aW9uKCkgPyBGTEFHX1BST1BfSkFWQU9QVElPTkFMIDogMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAocHJvcC5leHRlbmRzSmF2YUFycmF5KCkgPyBGTEFHX1BST1BfSkFWQUFSUkFZIDogMCkpOworICAgICAgICAgICAgd3JpdGVUeXBlKHByb3AuZ2V0Q29udGFpbmVyVHlwZSgpKTsKKyAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwcm9wLmdldE1pbk9jY3VycygpKTsKKyAgICAgICAgICAgIHdyaXRlQmlnSW50ZWdlcihwcm9wLmdldE1heE9jY3VycygpKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5oYXNOaWxsYWJsZSgpKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQocHJvcC5oYXNEZWZhdWx0KCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmhhc0ZpeGVkKCkpOworICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJvcC5nZXREZWZhdWx0VGV4dCgpKTsKKworICAgICAgICAgICAgd3JpdGVTdHJpbmcocHJvcC5nZXRKYXZhUHJvcGVydHlOYW1lKCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydChwcm9wLmdldEphdmFUeXBlQ29kZSgpKTsKKyAgICAgICAgICAgIHdyaXRlVHlwZShwcm9wLmphdmFCYXNlZE9uVHlwZSgpKTsKKyAgICAgICAgICAgIHdyaXRlUU5hbWVTZXQocHJvcC5nZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCkpOworICAgICAgICAgICAgd3JpdGVYbWxWYWx1ZU9iamVjdChwcm9wLmdldERlZmF1bHRWYWx1ZSgpKTsKKworICAgICAgICAgICAgaWYgKCEgcHJvcC5pc0F0dHJpYnV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFOYW1lW10gbmFtZXMgPSBwcm9wLmFjY2VwdGVkTmFtZXMoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KG5hbWVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmFtZXMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKG5hbWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVNb2RlbEdyb3VwRGF0YShTY2hlbWFNb2RlbEdyb3VwIGdycCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgaW1wbCA9IChTY2hlbWFNb2RlbEdyb3VwSW1wbClncnA7CisgICAgICAgICAgICB3cml0ZVFOYW1lKGltcGwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOworICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwgPyAxIDogMCk7CisgICAgICAgICAgICB3cml0ZVNob3J0KGltcGwuaXNSZWRlZmluaXRpb24oKSA/IDEgOiAwKTsgLy8gbmV3IGZvciB2ZXJzaW9uIDIuMTUKKyAgICAgICAgICAgIHdyaXRlU3RyaW5nKGltcGwuZ2V0UGFyc2VPYmplY3QoKS54bWxUZXh0KG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZU91dGVyKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVBdHRyaWJ1dGVHcm91cERhdGEoU2NoZW1hQXR0cmlidXRlR3JvdXAgZ3JwKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgaW1wbCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpZ3JwOworICAgICAgICAgICAgd3JpdGVRTmFtZShpbXBsLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQoaW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsID8gMSA6IDApOworICAgICAgICAgICAgd3JpdGVTaG9ydChpbXBsLmlzUmVkZWZpbml0aW9uKCkgPyAxIDogMCk7IC8vIG5ldyBmb3IgdmVyc2lvbiAyLjE1CisgICAgICAgICAgICB3cml0ZVN0cmluZyhpbXBsLmdldFBhcnNlT2JqZWN0KCkueG1sVGV4dChuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVPdXRlcigpKSk7CisgICAgICAgIH0KKworICAgICAgICBYbWxWYWx1ZVJlZiByZWFkWG1sVmFsdWVPYmplY3QoKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlLlJlZiB0eXBlcmVmID0gcmVhZFR5cGVSZWYoKTsKKyAgICAgICAgICAgIGlmICh0eXBlcmVmID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpbnQgYnRjID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGJ0YykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNob3J0KHZhbHVlcy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChyZWFkWG1sVmFsdWVPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHJlYWRTdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxWYWx1ZVJlZih0eXBlcmVmLCByZWFkQnl0ZUFycmF5KCkpOworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhtbFZhbHVlUmVmKHR5cGVyZWYsIHJlYWRRTmFtZSgpKTsKKworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYodHlwZXJlZiwgbmV3IERvdWJsZShyZWFkRG91YmxlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVYbWxWYWx1ZU9iamVjdChYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlLnNjaGVtYVR5cGUoKTsKKyAgICAgICAgICAgIHdyaXRlVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBTY2hlbWFUeXBlIGlUeXBlID0gKChTaW1wbGVWYWx1ZSl2YWx1ZSkuaW5zdGFuY2VUeXBlKCk7CisgICAgICAgICAgICBpZiAoaVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KC0xKTsKKyAgICAgICAgICAgICAgICBMaXN0IHZhbHVlcyA9ICgoWG1sT2JqZWN0QmFzZSl2YWx1ZSkueGdldExpc3RWYWx1ZSgpOworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQodmFsdWVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVhtbFZhbHVlT2JqZWN0KChYbWxBbnlTaW1wbGVUeXBlKWkubmV4dCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGJ0YyA9IGlUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGJ0Yyk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChidGMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcodmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ5dGVBcnJheSgoKFNpbXBsZVZhbHVlKXZhbHVlKS5nZXRCeXRlQXJyYXlWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKCgoU2ltcGxlVmFsdWUpdmFsdWUpLmdldFFOYW1lVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEb3VibGUoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0RmxvYXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEb3VibGUoKChTaW1wbGVWYWx1ZSl2YWx1ZSkuZ2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgcmVhZERvdWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZERvdWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIF9uYW1lLCBfaGFuZGxlLCBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uLklPX0VYQ0VQVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dC53cml0ZURvdWJsZShkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgX25hbWUsIF9oYW5kbGUsIFNjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uSU9fRVhDRVBUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBRTmFtZVNldCByZWFkUU5hbWVTZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBzaG9ydCBmbGFnID0gcmVhZFNob3J0KCk7CisKKyAgICAgICAgICAgIFNldCB1cmlTZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgc2hvcnQgdXJpQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB1cmlTZXQuYWRkKHJlYWRTdHJpbmcoKSk7CisKKyAgICAgICAgICAgIFNldCBxbmFtZVNldDEgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgc2hvcnQgcW5jb3VudDEgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDE7IGkrKykKKyAgICAgICAgICAgICAgICBxbmFtZVNldDEuYWRkKHJlYWRRTmFtZSgpKTsKKworICAgICAgICAgICAgU2V0IHFuYW1lU2V0MiA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICBzaG9ydCBxbmNvdW50MiA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmNvdW50MjsgaSsrKQorICAgICAgICAgICAgICAgIHFuYW1lU2V0Mi5hZGQocmVhZFFOYW1lKCkpOworCisgICAgICAgICAgICBpZiAoZmxhZyA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKHVyaVNldCwgbnVsbCwgcW5hbWVTZXQxLCBxbmFtZVNldDIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTZXRzKG51bGwsIHVyaVNldCwgcW5hbWVTZXQyLCBxbmFtZVNldDEpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVFOYW1lU2V0KFFOYW1lU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiBpbnZlcnQgPSAoc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpOworICAgICAgICAgICAgd3JpdGVTaG9ydChpbnZlcnQgPyAxIDogMCk7CisKKyAgICAgICAgICAgIFNldCB1cmlTZXQgPSBpbnZlcnQgPyBzZXQuZXhjbHVkZWRVUklzKCkgOiBzZXQuaW5jbHVkZWRVUklzKCk7CisgICAgICAgICAgICB3cml0ZVNob3J0KHVyaVNldC5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdXJpU2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgd3JpdGVTdHJpbmcoKFN0cmluZylpLm5leHQoKSk7CisKKyAgICAgICAgICAgIFNldCBxbmFtZVNldDEgPSBpbnZlcnQgPyBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpIDogc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQocW5hbWVTZXQxLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZVNldDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKChRTmFtZSlpLm5leHQoKSk7CisKKyAgICAgICAgICAgIFNldCBxbmFtZVNldDIgPSBpbnZlcnQgPyBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpIDogc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKTsKKyAgICAgICAgICAgIHdyaXRlU2hvcnQocW5hbWVTZXQyLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBxbmFtZVNldDIuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKChRTmFtZSlpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gcmVhZEJ5dGVBcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNob3J0IGxlbiA9IF9pbnB1dC5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgICAgICBfaW5wdXQucmVhZEZ1bGx5KHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShieXRlW10gYmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYmEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoX291dHB1dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfb3V0cHV0LndyaXRlKGJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFUeXBlTG9hZGVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBfbmFtZSwgX2hhbmRsZSwgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5JT19FWENFUFRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQmlnSW50ZWdlciByZWFkQmlnSW50ZWdlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSByZWFkQnl0ZUFycmF5KCk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPOworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVCaWdJbnRlZ2VyKEJpZ0ludGVnZXIgYmkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiaSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChiaS5zaWdudW0oKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KFNJTkdMRV9aRVJPX0JZVEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KGJpLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIFNJTkdMRV9aRVJPX0JZVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpMCB9OworCisgICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckhhbmRsZShTdHJpbmcgaGFuZGxlKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChfcmVzb2x2ZWRIYW5kbGVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUpX3Jlc29sdmVkSGFuZGxlcy5nZXQoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmIHJlZiA9IChTY2hlbWFUeXBlLlJlZilfdHlwZVJlZnNCeUNsYXNzbmFtZS5nZXQoY2xhc3NuYW1lKTsKKyAgICAgICAgcmV0dXJuIChyZWYgIT0gbnVsbCkgPyByZWYuZ2V0KCkgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQgcmVzb2x2ZUhhbmRsZShTdHJpbmcgaGFuZGxlKQorICAgIHsKKyAgICAgICAgU2NoZW1hQ29tcG9uZW50IHJlc3VsdDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKF9yZXNvbHZlZEhhbmRsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFDb21wb25lbnQpX3Jlc29sdmVkSGFuZGxlcy5nZXQoaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhzYlJlYWRlciByZWFkZXIgPSBuZXcgWHNiUmVhZGVyKGhhbmRsZSwgLTEpOworICAgICAgICAgICAgaW50IGZpbGV0eXBlID0gcmVhZGVyLmdldEFjdHVhbEZpbGV0eXBlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKGZpbGV0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRToKKyAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIHR5cGUgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGVsZW1lbnQgZm9yIGhhbmRsZSAiICsgaGFuZGxlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLmZpbmlzaExvYWRpbmdFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgYXR0cmlidXRlIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nQXR0cmlidXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDoKKyAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIG1vZGVsIGdyb3VwIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nTW9kZWxHcm91cCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOgorICAgICAgICAgICAgICAgICAgICBYQmVhbkRlYnVnLnRyYWNlKFhCZWFuRGVidWcuVFJBQ0VfU0NIRU1BX0xPQURJTkcsICJSZXNvbHZpbmcgYXR0cmlidXRlIGdyb3VwIGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nQXR0cmlidXRlR3JvdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFJREVOVElUWUNPTlNUUkFJTlQ6CisgICAgICAgICAgICAgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmluZyBpZCBjb25zdHJhaW50IGZvciBoYW5kbGUgIiArIGhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlYWRlci5maW5pc2hMb2FkaW5nSWRlbnRpdHlDb25zdHJhaW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklsbGVnYWwgaGFuZGxlIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3luY2hyb25pemVkIChfcmVzb2x2ZWRIYW5kbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX3Jlc29sdmVkSGFuZGxlcy5jb250YWluc0tleShoYW5kbGUpKQorICAgICAgICAgICAgICAgICAgICBfcmVzb2x2ZWRIYW5kbGVzLnB1dChoYW5kbGUsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hQ29tcG9uZW50KV9yZXNvbHZlZEhhbmRsZXMuZ2V0KGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBfcmVzb2x2ZWRIYW5kbGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2FsbE5vbkdyb3VwSGFuZGxlc1Jlc29sdmVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKKyAgICB7CisgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIlJlc29sdmUgY2FsbGVkIHR5cGUgc3lzdGVtICIgKyBfbmFtZSwgMCk7CisgICAgICAgIGlmIChfYWxsTm9uR3JvdXBIYW5kbGVzUmVzb2x2ZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgWEJlYW5EZWJ1Zy50cmFjZShYQmVhbkRlYnVnLlRSQUNFX1NDSEVNQV9MT0FESU5HLCAiUmVzb2x2aW5nIGFsbCBoYW5kbGVzIGZvciB0eXBlIHN5c3RlbSAiICsgX25hbWUsIDEpOworCisgICAgICAgIExpc3QgcmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcmVmcy5hZGRBbGwoX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpKTsKKyAgICAgICAgcmVmcy5hZGRBbGwoX2dsb2JhbEF0dHJpYnV0ZXMudmFsdWVzKCkpOworICAgICAgICByZWZzLmFkZEFsbChfZ2xvYmFsVHlwZXMudmFsdWVzKCkpOworICAgICAgICByZWZzLmFkZEFsbChfZG9jdW1lbnRUeXBlcy52YWx1ZXMoKSk7CisgICAgICAgIHJlZnMuYWRkQWxsKF9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKSk7CisgICAgICAgIHJlZnMuYWRkQWxsKF9pZGVudGl0eUNvbnN0cmFpbnRzLnZhbHVlcygpKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZWZzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUNvbXBvbmVudC5SZWYgcmVmID0gKFNjaGVtYUNvbXBvbmVudC5SZWYpaS5uZXh0KCk7CisgICAgICAgICAgICByZWYuZ2V0Q29tcG9uZW50KCk7IC8vIEZvcmNlcyByZWYgdG8gYmUgcmVzb2x2ZWQKKyAgICAgICAgfQorCisgICAgICAgIFhCZWFuRGVidWcudHJhY2UoWEJlYW5EZWJ1Zy5UUkFDRV9TQ0hFTUFfTE9BRElORywgIkZpbmlzaGVkIHJlc29sdmluZyB0eXBlIHN5c3RlbSAiICsgX25hbWUsIC0xKTsKKyAgICAgICAgX2FsbE5vbkdyb3VwSGFuZGxlc1Jlc29sdmVkID0gdHJ1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRGVmaW5lZChTdHJpbmcgbmFtZXNwYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2VzLmNvbnRhaW5zKG5hbWVzcGFjZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRUeXBlUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gKFNjaGVtYVR5cGUuUmVmKV9nbG9iYWxUeXBlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmREb2N1bWVudFR5cGVSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZS5SZWYpX2RvY3VtZW50VHlwZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kQXR0cmlidXRlVHlwZVJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlLlJlZilfYXR0cmlidXRlVHlwZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTY2hlbWFHbG9iYWxFbGVtZW50LlJlZilfZ2xvYmFsRWxlbWVudHMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmIGZpbmRBdHRyaWJ1dGVSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZilfZ2xvYmFsQXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXAuUmVmIGZpbmRNb2RlbEdyb3VwUmVmKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gKFNjaGVtYU1vZGVsR3JvdXAuUmVmKV9tb2RlbEdyb3Vwcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwLlJlZiBmaW5kQXR0cmlidXRlR3JvdXBSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKV9hdHRyaWJ1dGVHcm91cHMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LlJlZilfaWRlbnRpdHlDb25zdHJhaW50cy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVbXSBnbG9iYWxUeXBlcygpCisgICAgeworICAgICAgICBpZiAoX2dsb2JhbFR5cGVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVF9BUlJBWTsKKworICAgICAgICBTY2hlbWFUeXBlW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGVbX2dsb2JhbFR5cGVzLnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2dsb2JhbFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCisgICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYVR5cGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVtdIHJlZGVmaW5lZEdsb2JhbFR5cGVzKCkKKyAgICB7CisgICAgICAgIGlmIChfcmVkZWZpbmVkR2xvYmFsVHlwZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUX0FSUkFZOworCisgICAgICAgIFNjaGVtYVR5cGVbXSByZXN1bHQgPSBuZXcgU2NoZW1hVHlwZVtfcmVkZWZpbmVkR2xvYmFsVHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcmVkZWZpbmVkR2xvYmFsVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSkKKyAgICB7CisgICAgICAgIGlmICghc291cmNlTmFtZS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICBzb3VyY2VOYW1lID0gIi8iICsgc291cmNlTmFtZTsKKworICAgICAgICByZXR1cm4gX3Jlc291cmNlTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oInNjaGVtYS9zcmMiICsgc291cmNlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVbXSBkb2N1bWVudFR5cGVzKCkKKyAgICB7CisgICAgICAgIGlmIChfZG9jdW1lbnRUeXBlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7CisKKyAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19kb2N1bWVudFR5cGVzLnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2RvY3VtZW50VHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZS5SZWYpaS5uZXh0KCkpLmdldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlW10gYXR0cmlidXRlVHlwZXMoKQorICAgIHsKKyAgICAgICAgaWYgKF9hdHRyaWJ1dGVUeXBlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RfQVJSQVk7CisKKyAgICAgICAgU2NoZW1hVHlwZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFUeXBlW19hdHRyaWJ1dGVUeXBlcy5zaXplKCldOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9hdHRyaWJ1dGVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQorICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFUeXBlLlJlZilpLm5leHQoKSkuZ2V0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpCisgICAgeworICAgICAgICBpZiAoX2dsb2JhbEVsZW1lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9HRV9BUlJBWTsKKworICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50W10gcmVzdWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRbX2dsb2JhbEVsZW1lbnRzLnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2dsb2JhbEVsZW1lbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBqKyspCisgICAgICAgICAgICByZXN1bHRbal0gPSAoKFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmKWkubmV4dCgpKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpCisgICAgeworICAgICAgICBpZiAoX2dsb2JhbEF0dHJpYnV0ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0dBX0FSUkFZOworCisgICAgICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIHJlc3VsdCA9IG5ldyBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVbX2dsb2JhbEF0dHJpYnV0ZXMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfZ2xvYmFsQXR0cmlidXRlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQorICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGUuUmVmKWkubmV4dCgpKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKKyAgICB7CisgICAgICAgIGlmIChfbW9kZWxHcm91cHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01HX0FSUkFZOworCisgICAgICAgIFNjaGVtYU1vZGVsR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hTW9kZWxHcm91cFtfbW9kZWxHcm91cHMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfbW9kZWxHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hTW9kZWxHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwW10gcmVkZWZpbmVkTW9kZWxHcm91cHMoKQorICAgIHsKKyAgICAgICAgaWYgKF9yZWRlZmluZWRNb2RlbEdyb3Vwcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfTUdfQVJSQVk7CisKKyAgICAgICAgU2NoZW1hTW9kZWxHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFNb2RlbEdyb3VwW19yZWRlZmluZWRNb2RlbEdyb3Vwcy5zaXplKCldOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9yZWRlZmluZWRNb2RlbEdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQorICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFNb2RlbEdyb3VwLlJlZilpLm5leHQoKSkuZ2V0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gYXR0cmlidXRlR3JvdXBzKCkKKyAgICB7CisgICAgICAgIGlmIChfYXR0cmlidXRlR3JvdXBzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9BR19BUlJBWTsKKworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtfYXR0cmlidXRlR3JvdXBzLnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2F0dHJpYnV0ZUdyb3Vwcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQorICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYpaS5uZXh0KCkpLmdldCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIHJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwcygpCisgICAgeworICAgICAgICBpZiAoX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfQUdfQVJSQVk7CisKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBbX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy5zaXplKCldOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hQXR0cmlidXRlR3JvdXAuUmVmKWkubmV4dCgpKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gaWRlbnRpdHlDb25zdHJhaW50cygpCisgICAgeworICAgICAgICBpZiAoX2lkZW50aXR5Q29uc3RyYWludHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lDX0FSUkFZOworCisgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIHJlc3VsdCA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRbX2lkZW50aXR5Q29uc3RyYWludHMuc2l6ZSgpXTsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaWRlbnRpdHlDb25zdHJhaW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKQorICAgICAgICAgICAgcmVzdWx0W2pdID0gKChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmKWkubmV4dCgpKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9jbGFzc2xvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIElOVEVSTkFMTFkgT05MWSBieSB0aGUgY29kZSBnZW5lcmF0b3IgQUZURVIgdGhlIHR5cGUgc3lzdGVtIGhhcworICAgICAqIGJlZW4gc2F2ZWQgYW5kIGEgaGFuZGxlIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBlYWNoIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBoYW5kbGVGb3JUeXBlKFNjaGVtYVR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBfbG9jYWxIYW5kbGVzLmhhbmRsZUZvclR5cGUodHlwZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSB0eXBlU3lzdGVtRm9yTmFtZShTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChfbmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKF9uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU2NoZW1hVHlwZVZpc2l0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwYTQzMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1NjaGVtYVR5cGVWaXNpdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTEwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVWaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBUaGlzIHN0YXRlIG1hY2hpbmUgdmFsaWRhdGVzIGVsZW1lbnQgb3JkZXIgYmFzZWQgb24gYSBkZXRlcm1pbmlzdGljCisgKiBjb250ZW50IG1vZGVsLgorICovCitwdWJsaWMgY2xhc3MgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIGltcGxlbWVudHMgVHlwZVN0b3JlVmlzaXRvcgoreworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpdCBieSBwYXNzaW5nIHRoZSByb290IG9mIHRoZSBjb250ZW50IG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFUeXBlVmlzaXRvckltcGwoU2NoZW1hUGFydGljbGUgcGFydCkKKyAgICB7CisgICAgICAgIGluaXQocGFydCk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVWaXNpdG9ySW1wbCgpCisgICAgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChTY2hlbWFQYXJ0aWNsZSBwYXJ0KQorICAgIHsKKyAgICAgICAgaWYgKF9zdGFjayA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfc3RhY2sgPSBleHBhbmQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9yb2xsYmFjayA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfcm9sbGJhY2sgPSBleHBhbmQobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBfc3RhY2tTaXplID0gMDsKKyAgICAgICAgX3JvbGxiYWNrU2l6ZSA9IDA7CisKKyAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVzaChwYXJ0KTsKKyAgICAgICAgICAgIF9yb2xsYmFja0luZGV4ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWaXNpdG9yU3RhdGVbXSBleHBhbmQoVmlzaXRvclN0YXRlW10gb3JpZykKKyAgICB7CisgICAgICAgIGludCBuZXdzaXplID0gKG9yaWcgPT0gbnVsbCA/IDQgOiBvcmlnLmxlbmd0aCAqIDIpOworICAgICAgICBWaXNpdG9yU3RhdGVbXSByZXN1bHQgPSBuZXcgVmlzaXRvclN0YXRlW25ld3NpemVdOworICAgICAgICBpZiAob3JpZyAhPSBudWxsKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnLCAwLCByZXN1bHQsIDAsIG9yaWcubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IChvcmlnID09IG51bGwgPyAwIDogb3JpZy5sZW5ndGgpOyBpIDwgbmV3c2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgVmlzaXRvclN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKworICAgIGZpbmFsIHN0YXRpYyBib29sZWFuIFBST0JFX1ZBTElESVRZID0gdHJ1ZTsKKyAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbiBDSEVDS19WQUxJRElUWSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBWaXNpdG9yU3RhdGVbXSBfc3RhY2s7CisgICAgcHJpdmF0ZSBWaXNpdG9yU3RhdGVbXSBfcm9sbGJhY2s7CisgICAgaW50IF9zdGFja1NpemU7CisgICAgaW50IF9yb2xsYmFja1NpemU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pc1ZhbGlkOworICAgIHByaXZhdGUgU2NoZW1hUGFydGljbGUgX21hdGNoZWRQYXJ0aWNsZTsKKyAgICBwcml2YXRlIFZpc2l0b3JTdGF0ZSBfdG9wOworICAgIHByaXZhdGUgaW50IF9yb2xsYmFja0luZGV4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmlzaXRvclN0YXRlCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBjb3B5KFZpc2l0b3JTdGF0ZSBvcmlnKQorICAgICAgICB7CisgICAgICAgICAgICBfY3VyUGFydCA9IG9yaWcuX2N1clBhcnQ7CisgICAgICAgICAgICBfY3VyQ291bnQgPSBvcmlnLl9jdXJDb3VudDsKKyAgICAgICAgICAgIF9jdXJNaW4gPSBvcmlnLl9jdXJNaW47CisgICAgICAgICAgICBfY3VyTWF4ID0gb3JpZy5fY3VyTWF4OworICAgICAgICAgICAgX3Byb2Nlc3NlZENoaWxkQ291bnQgPSBvcmlnLl9wcm9jZXNzZWRDaGlsZENvdW50OworICAgICAgICAgICAgX2NoaWxkQ291bnQgPSBvcmlnLl9jaGlsZENvdW50OworICAgICAgICAgICAgX3NlZW4gPSBvcmlnLl9zZWVuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChTY2hlbWFQYXJ0aWNsZSBwYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBfY3VyUGFydCA9IHBhcnQ7CisgICAgICAgICAgICBfY3VyTWluID0gcGFydC5nZXRJbnRNaW5PY2N1cnMoKTsKKyAgICAgICAgICAgIF9jdXJNYXggPSBwYXJ0LmdldEludE1heE9jY3VycygpOworICAgICAgICAgICAgX2N1ckNvdW50ID0gMDsKKyAgICAgICAgICAgIF9wcm9jZXNzZWRDaGlsZENvdW50ID0gMDsKKyAgICAgICAgICAgIF9jaGlsZENvdW50ID0gcGFydC5jb3VudE9mUGFydGljbGVDaGlsZCgpOworICAgICAgICAgICAgX3NlZW4gPSBwYXJ0LmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCA/CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYm9vbGVhbltfY2hpbGRDb3VudF0gOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hUGFydGljbGUgX2N1clBhcnQ7CisgICAgICAgIGludCBfY3VyQ291bnQ7CisgICAgICAgIGludCBfY3VyTWF4OworICAgICAgICBpbnQgX2N1ck1pbjsKKyAgICAgICAgaW50IF9wcm9jZXNzZWRDaGlsZENvdW50OworICAgICAgICBpbnQgX2NoaWxkQ291bnQ7CisgICAgICAgIGJvb2xlYW5bXSBfc2VlbjsKKyAgICB9CisKKyAgICBWaXNpdG9yU3RhdGUgdG9wUmVmKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfc3RhY2tbX3N0YWNrU2l6ZSAtIDFdOworICAgIH0KKworICAgIHZvaWQgc2F2ZUNvcHkoVmlzaXRvclN0YXRlIHJlZikKKyAgICB7CisgICAgICAgIGlmIChfcm9sbGJhY2subGVuZ3RoID09IF9yb2xsYmFja1NpemUpCisgICAgICAgICAgICBfcm9sbGJhY2sgPSBleHBhbmQoX3JvbGxiYWNrKTsKKworICAgICAgICBfcm9sbGJhY2tbX3JvbGxiYWNrU2l6ZV0uY29weShyZWYpOworICAgICAgICBfcm9sbGJhY2tTaXplICs9IDE7CisgICAgfQorCisgICAgdm9pZCBhZGRQYXJ0aWNsZShTY2hlbWFQYXJ0aWNsZSBwYXJ0KQorICAgIHsKKyAgICAgICAgaWYgKF9zdGFjay5sZW5ndGggPT0gX3N0YWNrU2l6ZSkKKyAgICAgICAgICAgIF9zdGFjayA9IGV4cGFuZChfc3RhY2spOworICAgICAgICBfc3RhY2tbX3N0YWNrU2l6ZV0uaW5pdChwYXJ0KTsKKyAgICAgICAgX3N0YWNrU2l6ZSArPSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWNvbmRpdGlvbjoKKyAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0KQorICAgICAqIHRvcDogICAgICBudWxsIG9yIGRpc2NhcmRhYmxlIGR1ZSB0byBwb3AgaW4gcHJvZ3Jlc3MKKyAgICAgKiByb2xsYmFjazogKFI4IFI3IFI2IFI1KSAoZW1wdHkgYXQgdGhlIHN0YXJ0IG9mICJ2aXNpdCIpCisgICAgICoKKyAgICAgKiBQb3N0Y29uZGl0aW9uOgorICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMpCisgICAgICogdG9wOiAgICAgIEQ0ID0gbXV0YWJsZSBjb3B5IG9mIFI0CisgICAgICogcm9sbGJhY2sgIChSOCBSNyBSNiBSNSBSNCkKKyAgICAgKi8KKyAgICBib29sZWFuIHByZXBhcmUoKQorICAgIHsKKyAgICAgICAgaWYgKF9yb2xsYmFja0luZGV4ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF90b3AgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgX3RvcCA9IHRvcFJlZigpOworICAgICAgICBzYXZlQ29weShfdG9wKTsKKyAgICAgICAgX3JvbGxiYWNrSW5kZXggPSBfc3RhY2tTaXplIC0gMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlY29uZGl0aW9uOgorICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYpCisgICAgICogdG9wOiAgICAgIEQ3CisgICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkKKyAgICAgKgorICAgICAqIFBvc3Rjb25kaXRpb246CisgICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBENSBENiBENykKKyAgICAgKiB0b3A6ICAgICAgRDggPSBuZXcgc3RhdGUgYmFzZWQgb24gcGFydAorICAgICAqIHJvbGxiYWNrICAoUjggUjcgUjYgUjUpCisgICAgICovCisgICAgdm9pZCBwdXNoKFNjaGVtYVBhcnRpY2xlIHBhcnQpCisgICAgeworICAgICAgICBhZGRQYXJ0aWNsZShwYXJ0KTsKKyAgICAgICAgX3RvcCA9IHRvcFJlZigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWNvbmRpdGlvbjoKKyAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQorICAgICAqIHRvcDogICAgICBENyBpcyBkaXNjYXJkYWJsZQorICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCisgICAgICoKKyAgICAgKiBQb3N0Y29uZGl0aW9uOgorICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUpCisgICAgICogdG9wOiAgICAgIEQ2IChzZWUgcHJlcGFyZSBpbiBjYXNlIGl0J3MgYW4gUiBzdGF0ZSkKKyAgICAgKiByb2xsYmFjayAgKFI4IFI3IFI2IFI1KQorICAgICAqLworICAgIGJvb2xlYW4gcG9wKCkKKyAgICB7CisgICAgICAgIF9zdGFja1NpemUgLT0gMTsKKyAgICAgICAgaWYgKF9zdGFja1NpemUgPD0gX3JvbGxiYWNrSW5kZXgpCisgICAgICAgICAgICByZXR1cm4gcHJlcGFyZSgpOworICAgICAgICBfdG9wID0gdG9wUmVmKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWNvbmRpdGlvbjoKKyAgICAgKiBzdGFjazogICAgKFIxIFIyIFIzIFI0IEQ1IEQ2KQorICAgICAqIHRvcDogICAgICBENworICAgICAqIHJvbGxiYWNrOiAoUjggUjcgUjYgUjUpCisgICAgICoKKyAgICAgKiBQb3N0Y29uZGl0aW9uOgorICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYgRDcpIC0+IGFuZCByZW5hbWUgdG8gRCdzIHRvIFIncworICAgICAqIHRvcDogICAgICBudWxsCisgICAgICogcm9sbGJhY2sgICgpCisgICAgICovCisgICAgdm9pZCBjb21taXQoKQorICAgIHsKKyAgICAgICAgX3RvcCA9IG51bGw7CisgICAgICAgIF9yb2xsYmFja0luZGV4ID0gX3N0YWNrU2l6ZTsKKyAgICAgICAgX3JvbGxiYWNrU2l6ZSA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlY29uZGl0aW9uOgorICAgICAqIHN0YWNrOiAgICAoUjEgUjIgUjMgUjQgRDUgRDYpCisgICAgICogdG9wOiAgICAgIEQ3IGlzIGRpc2NhcmRhYmxlCisgICAgICogcm9sbGJhY2s6IChSOCBSNyBSNiBSNSkKKyAgICAgKgorICAgICAqIFBvc3Rjb25kaXRpb246CisgICAgICogc3RhY2s6ICAgIChSMSBSMiBSMyBSNCBSNSBSNiBSNyBSOCkKKyAgICAgKiB0b3A6ICAgICAgbnVsbAorICAgICAqIHJvbGxiYWNrICAoKQorICAgICAqLworICAgIHZvaWQgcm9sbGJhY2soKQorICAgIHsKKyAgICAgICAgd2hpbGUgKF9yb2xsYmFja1NpemUgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBfcm9sbGJhY2tTaXplIC09IDE7CisgICAgICAgICAgICBWaXNpdG9yU3RhdGUgdGVtcCA9IF9zdGFja1tfcm9sbGJhY2tJbmRleF07CisgICAgICAgICAgICBfc3RhY2tbX3JvbGxiYWNrSW5kZXhdID0gX3JvbGxiYWNrW19yb2xsYmFja1NpemVdOworICAgICAgICAgICAgX3JvbGxiYWNrW19yb2xsYmFja1NpemVdID0gdGVtcDsKKyAgICAgICAgICAgIF9yb2xsYmFja0luZGV4ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgX3N0YWNrU2l6ZSA9IF9yb2xsYmFja0luZGV4OworICAgICAgICBfdG9wID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIG5vIHZhbGlkIG5leHQgc3RhdGUgY2FuIGJlIGZvdW5kLCB0aGVuICJub3RWYWxpZCIKKyAgICAgKiBpcyByZXR1cm5lZC4gSXQgcm9sbHMgYmFjayBhbnkgY2hhbmdlcyB0byB0aGUgc3RhdGUKKyAgICAgKiBtYWNoaW5lIHN0YWNrLCBzZXRzIHRvIGZhbHNlIHRoZSB2YWxpZCBiaXQsIGFuZCBjbGVhcnMKKyAgICAgKiB0aGUgbWF0Y2hlZCBlbGVtZW50IHN0YXRlIGJlZm9yZSByZXR1cm5pbmcgZmFsc2UuCisgICAgICovCisgICAgYm9vbGVhbiBub3RWYWxpZCgpCisgICAgeworICAgICAgICBfaXNWYWxpZCA9IGZhbHNlOworICAgICAgICBfbWF0Y2hlZFBhcnRpY2xlID0gbnVsbDsKKyAgICAgICAgcm9sbGJhY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gYSB2YWxpZCBzdGF0ZSB0cmFuc2l0aW9uIGhhcyBiZWVuIGRvbmUsIHRoZW4gIm9rIgorICAgICAqIGlzIHJldHVybmVkLiBJdCBjb21taXRzIHRoZSBjaGFuZ2VkIHN0YXRlIG1hY2hpbmUgc3RhdGUsCisgICAgICogc3RvcmVzIHRoZSBtYXRjaGVkIGVsZW1lbnQgc3RhdGUsIGFuZCByZXR1cm5zIHRydWUuCisgICAgICovCisgICAgYm9vbGVhbiBvayhTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBib29sZWFuIHRlc3RWYWxpZGl0eSkKKyAgICB7CisgICAgICAgIGlmICggISB0ZXN0VmFsaWRpdHkgKQorICAgICAgICB7CisgICAgICAgICAgICBfbWF0Y2hlZFBhcnRpY2xlID0gcGFydDsKKyAgICAgICAgICAgIGNvbW1pdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcm9sbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKj09IFZJU0lUT1IgSU1QTEVNRU5UQVRJT04gPT0qLworCisgICAgLyoqCisgICAgICogVHJhdmVyc2VzIGEgZGV0ZXJtaW5pc3RpYyBjb250ZW50IG1vZGVsLCBjaGVja2luZyBmb3IKKyAgICAgKiB2YWxpZGl0eSBhdCBhbnkgZ2l2ZW4gcG9pbnQuCisgICAgICoKKyAgICAgKiBDYWxsIHZpc2l0KG51bGwpIG9uY2UgYXQgdGhlIGVuZCBpZiB5b3UncmUgY2hlY2tpbmcgZm9yCisgICAgICogY29tcGxldGUgdmFsaWRpdHkgb2YgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBhY3R1YWwgdmlzaXQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoUU5hbWUgZWx0TmFtZSkKKyAgICB7CisgICAgICByZXR1cm4gdmlzaXQoZWx0TmFtZSwgQ0hFQ0tfVkFMSURJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gdGhhdAorICAgICAqIHRyYXZlcnNlcyBhIGRldGVybWluaXN0aWMgY29udGVudCBtb2RlbCwgY2hlY2tpbmcgZm9yCisgICAgICogdmFsaWRpdHkgYXQgYW55IGdpdmVuIHBvaW50LgorICAgICAqCisgICAgICogV2hlbiB0ZXN0VmFsaWRpdHkgaXMgZmFsc2UgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIGNoYW5nZSBzdGF0ZXMKKyAgICAgKiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB2YWxpZAorICAgICAqCisgICAgICogV2hlbiB0ZXN0VmFsaWRpdHkgaXMgdHJ1ZSB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSBzdGF0ZXMKKyAgICAgKiBhbmQgd2lsbCByZXR1cm4gaWYgYSBwYXJ0aWN1bGFyIHN0YXRlIGlzIHZhbGlkIG9yIGludmFsaWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KFFOYW1lIGVsdE5hbWUgLGJvb2xlYW4gdGVzdFZhbGlkaXR5KQorICAgIHsKKyAgICAgICAgaWYgKCFwcmVwYXJlKCkpCisgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKKworICAgICAgICAvLyBpbml0IHdpdGggc29tZSB2YWx1ZXMgb3V0IG9mIHByb2Nlc3NlZENoaWxkQ291bnQgYW5kIHN0YWNrU2l6ZSByYW5nZQorICAgICAgICBpbnQgbGFzdEF0UHJvY2Vzc2VkQ2hpbGRDb3VudCA9IC0yOworICAgICAgICBpbnQgbGFzdEF0U3RhY2tTaXplID0gLTI7CisKKyAgICAgICAgdHJhdmVyc2luZzogZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gIG9wdGltaXphdGlvbiBmb3IgY2FzZXMgd2hlcmUgc3RhdGUgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiBfdG9wLl9jdXJNaW4gYW5kIF90b3AuX2N1ck1heAorICAgICAgICAgICAgLy8gIGNoZWNrIGZvciBzdGF0ZSBjaGFuZ2UgICAgICAgIHNlZSBKSVJBIGJ1ZyBYTUxCRUFOUy0zNworICAgICAgICAgICAgaWYgKF90b3AuX2N1ckNvdW50Pl90b3AuX2N1ck1pbiAmJgorICAgICAgICAgICAgICAgIGxhc3RBdFByb2Nlc3NlZENoaWxkQ291bnQ9PV90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgJiYKKyAgICAgICAgICAgICAgICBsYXN0QXRTdGFja1NpemU9PV9zdGFja1NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQgPSBfdG9wLl9jdXJNYXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNhdmUgc3RhdGUKKyAgICAgICAgICAgIGxhc3RBdFByb2Nlc3NlZENoaWxkQ291bnQgPSBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50OworICAgICAgICAgICAgbGFzdEF0U3RhY2tTaXplID0gX3N0YWNrU2l6ZTsKKworICAgICAgICAgICAgd2hpbGUgKF90b3AuX2N1ckNvdW50ID49IF90b3AuX2N1ck1heCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBvcCgpKQorICAgICAgICAgICAgICAgICAgICBicmVhayB0cmF2ZXJzaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtaW5tYXg6IHN3aXRjaCAoX3RvcC5fY3VyUGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCwgdGVzdFZhbGlkaXR5KTsKKworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfdG9wLl9jdXJQYXJ0LmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdG9wLl9jdXJDb3VudCA8IF90b3AuX2N1ck1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG1pbm1heDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfdG9wLl9jdXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2soX3RvcC5fY3VyUGFydCwgdGVzdFZhbGlkaXR5KTsKKworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBfdG9wLl9wcm9jZXNzZWRDaGlsZENvdW50OyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goY2FuZGlkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUuaXNTa2lwcGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCAhPSAwIHx8IF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKKworCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fY3VyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJhdmVyc2luZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fY3VyQ291bnQgPCBfdG9wLl9jdXJNaW4gJiYgIV90b3AuX2N1clBhcnQuaXNTa2lwcGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhayBtaW5tYXg7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKworICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGFsbHNjYW46IGZvciAoaW50IGkgPSAwOyBpIDwgX3RvcC5fY2hpbGRDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RvcC5fc2VlbltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBhbGxzY2FuOworCisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjYW5kaWRhdGUgPSBfdG9wLl9jdXJQYXJ0LmdldFBhcnRpY2xlQ2hpbGQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmNhblN0YXJ0V2l0aEVsZW1lbnQoZWx0TmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvcC5fcHJvY2Vzc2VkQ2hpbGRDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b3AuX3NlZW5baV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goY2FuZGlkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cmF2ZXJzaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2FuZGlkYXRlLmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwcGVkIDwgX3RvcC5fY2hpbGRDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90b3AuX2N1ckNvdW50IDwgX3RvcC5fY3VyTWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3RWYWxpZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWlubWF4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF90b3AuX2N1ckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIF90b3AuX3Byb2Nlc3NlZENoaWxkQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChfdG9wLl9zZWVuLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRyYXZlcnNpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNvbWVib2R5IGNhbGxlZCAiYnJlYWsgbWlubWF4Iiwgc28gcG9wIG91dCBvZiBsb29wCisgICAgICAgICAgICBpZiAoIXBvcCgpKQorICAgICAgICAgICAgICAgIGJyZWFrIHRyYXZlcnNpbmc7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSd2ZSBjb21wbGV0ZWQgdGhlIG91dGVybW9zdCBsb29wCisgICAgICAgIGlmIChlbHROYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb2sobnVsbCwgdGVzdFZhbGlkaXR5KTsKKworICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmUgZXh0cmEgZWxlbWVudHMgYXQgdGhlIGVuZAorICAgICAgICByZXR1cm4gbm90VmFsaWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0VmFsaWQoUU5hbWUgZWx0TmFtZSkKKyAgICB7CisgICAgICByZXR1cm4gdmlzaXQoZWx0TmFtZSxQUk9CRV9WQUxJRElUWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBlbGVtZW50ZmxhZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZSgpID09IG51bGwgfHwgY3VycmVudFBhcnRpY2xlKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBlbHQgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWN1cnJlbnRQYXJ0aWNsZSgpOworCisgICAgICAgIHJldHVybiAoZWx0LmlzTmlsbGFibGUoKSA/IFR5cGVTdG9yZS5OSUxMQUJMRSA6IDApIHwKKyAgICAgICAgICAgICAgIChlbHQuaXNEZWZhdWx0KCkgPyBUeXBlU3RvcmUuSEFTREVGQVVMVCA6IDApIHwKKyAgICAgICAgICAgICAgIChlbHQuaXNGaXhlZCgpID8gVHlwZVN0b3JlLkZJWEVEIDogMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBkZWZhdWx0IHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X3RleHQoKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnRQYXJ0aWNsZSgpID09IG51bGwgfHwgY3VycmVudFBhcnRpY2xlKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiAoKFNjaGVtYUxvY2FsRWxlbWVudCljdXJyZW50UGFydGljbGUoKSkuZ2V0RGVmYXVsdFRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYUZpZWxkIGdldF9zY2hlbWFfZmllbGQoKSB7CisgICAgICAgIGlmIChjdXJyZW50UGFydGljbGUoKSBpbnN0YW5jZW9mIFNjaGVtYUZpZWxkKQorICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFGaWVsZCljdXJyZW50UGFydGljbGUoKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNjaGVtYSBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIFNjaGVtYVBhcnRpY2xlIGN1cnJlbnRQYXJ0aWNsZSgpCisgICAgeworICAgICAgICByZXR1cm4gX21hdGNoZWRQYXJ0aWNsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudGlyZSBjb250ZW50IHVwIHRvIG5vdyBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbFZhbGlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfaXNWYWxpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjQ2hlY2tlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VlNzgwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NoZWNrZXIuamF2YQpAQCAtMCwwICsxLDE1OTUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YQmVhbkRlYnVnOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworcHVibGljIGNsYXNzIFN0c2NDaGVja2VyCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQWxsKCkKKyAgICB7CisgICAgICAgIC8vIHdhbGsgdGhlIHRyZWUgb2YgdHlwZXMKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCFzdGF0ZS5ub1B2cigpICYmICAvLyBvcHRpb24gdG8gdHVybiBvZmYgcGFydGljbGUgcmVzdHJpY3Rpb24gY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAhZ1R5cGUuaXNEb2N1bWVudFR5cGUoKSkgLy8gRG9uJ3QgY2hlY2sgZG9jIHR5cGVzIGZvciByZXN0cmljdGlvbi4gCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hlY2tSZXN0cmljdGlvbigoU2NoZW1hVHlwZUltcGwpZ1R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2tGaWVsZHMoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKKyAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7CisgICAgICAgIH0KKworICAgICAgICBjaGVja1N1YnN0aXR1dGlvbkdyb3VwcyhzdGF0ZS5nbG9iYWxFbGVtZW50cygpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGNoZWNrcyBydWxlICM1IG9mIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjb3NzLWN0CisgICAgICogYXMgd2VsbCBhcyBhdHRyaWJ1dGUgKyBlbGVtZW50IGRlZmF1bHQvZml4ZWQgdmFsaWRpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrRmllbGRzKFNjaGVtYVR5cGVJbXBsIHNUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKHNUeXBlLmlzU2ltcGxlVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0IGxvY2F0aW9uID0gc1R5cGUuZ2V0UGFyc2VPYmplY3QoKTsKKyAgICAgICAgCisgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIHNBdHRyTW9kZWwgPSBzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOworICAgICAgICBpZiAoc0F0dHJNb2RlbCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIHNBdHRycyAgPSBzQXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIFFOYW1lIGlkQXR0ciA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNBdHRycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoWG1sSUQudHlwZS5pc0Fzc2lnbmFibGVGcm9tKHNBdHRyc1tpXS5nZXRUeXBlKCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXR0ciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWRBdHRyID0gc0F0dHJzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJCb3RoICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaWRBdHRyKSArICIgYW5kICIgKyBzQXR0cnNbaV0uZ2V0TmFtZSgpICsgIiBhcmUgeHM6SUQgYXR0cmlidXRlczsgb25seSBvbmUgSUQgYXR0cmlidXRlIGlzIGFsbG93ZWQgb24gYSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0cnNbaV0uZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBbiBhdHRyaWJ1dGUgb2YgdHlwZSB4czpJRCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIGEgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbnN0cmFpbnQgPSBzQXR0cnNbaV0uZ2V0RGVmYXVsdFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlQ29uc3RyYWludCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIHZhbCA9IHNBdHRyc1tpXS5nZXREZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbC52YWxpZGF0ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNQcm9wID0gKFNjaGVtYVByb3BlcnR5SW1wbClzVHlwZS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShzQXR0cnNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb3AgIT0gbnVsbCAmJiBzUHJvcC5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcC5zZXREZWZhdWx0VmFsdWUobmV3IFhtbFZhbHVlUmVmKHZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHJzW2ldLmlzRml4ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJUaGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShzQXR0cnNbaV0uZ2V0TmFtZSgpKSArICIgZWxlbWVudCBmaXhlZCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc0F0dHJzW2ldLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNBdHRyc1tpXS5nZXROYW1lKCkpICsgIiBlbGVtZW50IGRlZmF1bHQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNBdHRyc1tpXS5nZXRUeXBlKCkpLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjaGVja0VsZW1lbnREZWZhdWx0cyhzVHlwZS5nZXRDb250ZW50TW9kZWwoKSwgbG9jYXRpb24sIHNUeXBlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VsZW1lbnREZWZhdWx0cyhTY2hlbWFQYXJ0aWNsZSBtb2RlbCwgWG1sT2JqZWN0IGxvY2F0aW9uLCBTY2hlbWFUeXBlIHBhcmVudFR5cGUpCisgICAgeworICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3dpdGNoIChtb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IG1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tFbGVtZW50RGVmYXVsdHMoY2hpbGRyZW5baV0sIGxvY2F0aW9uLCBwYXJlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVDb25zdHJhaW50ID0gbW9kZWwuZ2V0RGVmYXVsdFRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVDb25zdHJhaW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0VHlwZSgpLmlzU2ltcGxlVHlwZSgpIHx8IG1vZGVsLmdldFR5cGUoKS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgdmFsID0gbW9kZWwuZ2V0RGVmYXVsdFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwudmFsaWRhdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzUHJvcCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpcGFyZW50VHlwZS5nZXRFbGVtZW50UHJvcGVydHkobW9kZWwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb3AgIT0gbnVsbCAmJiBzUHJvcC5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcC5zZXREZWZhdWx0VmFsdWUobmV3IFhtbFZhbHVlUmVmKHZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZml4ZWQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKG1vZGVsLmdldFR5cGUoKSksIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIlRoZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG1vZGVsLmdldE5hbWUoKSkgKyAiIGVsZW1lbnQgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUobW9kZWwuZ2V0VHlwZSgpKSwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5nZXRUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZ2V0VHlwZSgpLmdldENvbnRlbnRNb2RlbCgpLmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnN0cmFpbnROYW1lID0gKG1vZGVsLmlzRml4ZWQoKSA/ICJmaXhlZCIgOiAiZGVmYXVsdCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJUaGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShtb2RlbC5nZXROYW1lKCkpICsgIiBlbGVtZW50IGNhbm5vdCBoYXZlIGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50TmFtZSArICIgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBiZWNhdXNlIGl0J3MgY29udGVudCBpcyBtaXhlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm90IGVtcHRpYWJsZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgRGVmYXVsdCBWYWxpZCAoSW1tZWRpYXRlKTogY29zLXZhbGlkLWRlZmF1bHQuMi4yLjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHZhbGlkYXRlIHRoZSB2YWx1ZTsgdHlwZSBpcyBhIHhzOnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzUHJvcCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpcGFyZW50VHlwZS5nZXRFbGVtZW50UHJvcGVydHkobW9kZWwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1Byb3AgIT0gbnVsbCAmJiBzUHJvcC5nZXREZWZhdWx0VGV4dCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUHJvcC5zZXREZWZhdWx0VmFsdWUobmV3IFhtbFZhbHVlUmVmKFhtbFN0cmluZy50eXBlLm5ld1ZhbHVlKHZhbHVlQ29uc3RyYWludCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZWwuZ2V0VHlwZSgpLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiVGhlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobW9kZWwuZ2V0TmFtZSgpKSArICIgZWxlbWVudCBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgJyIgKyB2YWx1ZUNvbnN0cmFpbnQgKyAiJyBiZWNhdXNlIGl0cyB0eXBlIGhhcyBlbGVtZW50IGNvbnRlbnQgb25seS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsLmdldFR5cGUoKS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJUaGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShtb2RlbC5nZXROYW1lKCkpICsgIiBlbGVtZW50IGNhbm5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAnIiArIHZhbHVlQ29uc3RyYWludCArICInIGJlY2F1c2UgaXRzIHR5cGUgaGFzIGVtcHR5IGNvbnRlbnQgb25seS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIG9ubHkgY2hlY2tzIHJ1bGUgIzUgb2YgaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Rlcml2YXRpb24tb2stcmVzdHJpY3Rpb24KKyAgICAgKiAgKEV2ZXJ5dGhpbmcgZWxzZSBjYW4gYW5kIHNob3VsZCBiZSBkb25lIGluIFN0c2NSZXNvbHZlciwgYmVjYXVzZSB3ZSBjYW4gZ2l2ZSBtb3JlIGRldGFpbGVkIGxpbmUgIyBpbmZvIHRoZXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrUmVzdHJpY3Rpb24oU2NoZW1hVHlwZUltcGwgc1R5cGUpCisgICAgeworICAgICAgICBpZiAoc1R5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OICYmICFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB3ZSBkb24ndCByZW1lbWJlciB2ZXJ5IHByZWNpc2UgbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbi4KKyAgICAgICAgICAgIFhtbE9iamVjdCBsb2NhdGlvbiA9IHNUeXBlLmdldFBhcnNlT2JqZWN0KCk7CisgICAgICAgIAorICAgICAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZSA9IHNUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBiYXNlIHR5cGUgb2YgYSBjb21wbGV4IHR5cGUgcmVzdHJpY3Rpb24gbXVzdCBiZSBhIGNvbXBsZXggdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gNSBUaGUgYXBwcm9wcmlhdGUgY2FzZSBhbW9uZyB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0Q29udGVudFR5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIC8vIDUuMSBJZiB0aGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uIGlzIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiwgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuMS4xIFRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgZGVmaW5pdGlvbiBvZiB3aGljaCB0aGUge2NvbnRlbnQgdHlwZX0gaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IGFzIGRlZmluZWQgaW4gRGVyaXZhdGlvbiBWYWxpZCAoUmVzdHJpY3Rpb24sIFNpbXBsZSkgKKczLjE0LjYpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IHdlIGRvbid0IGFsbG93IHRoZSBjb250ZW50IHR5cGUgdG8gYmUgYW4gIm9uIHRoZSBzaWRlIiBzaW1wbGUgdHlwZSwgc28gbm90aGluZyBmYW5jeSB0byBjaGVjayBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjEuMiBUaGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBtdXN0IGJlIG1peGVkIGFuZCBoYXZlIGEgcGFydGljbGUgd2hpY2ggaXMgt2VtcHRpYWJsZbcgYXMgZGVmaW5lZCBpbiBQYXJ0aWNsZSBFbXB0aWFibGUgKKczLjkuNikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldENvbnRlbnRNb2RlbCgpLmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggYSBzaW1wbGUgY29udGVudCBtb2RlbCBjYW4gb25seSByZXN0cmljdCBhIG1peGVkIGNvbnRlbnQgbW9kZWwgdGhhdCBoYXMgc2tpcHBhYmxlIGVsZW1lbnRzLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgd2l0aCBhIHNpbXBsZSBjb250ZW50IG1vZGVsIGNhbiBvbmx5IHJlc3RyaWN0IGEgc2ltcGxlIG9yIG1peGVkIGNvbnRlbnQgbW9kZWwuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UOgorICAgICAgICAgICAgICAgICAgICAvLyA1LjIgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSBjb21wbGV4IHR5cGUgaXRzZWxmIGlzIGVtcHR5ICwgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNS4yLjEgVGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3QgYWxzbyBiZSBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1LjIuMiBUaGUge2NvbnRlbnQgdHlwZX0gb2YgdGhlIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gbXVzdCBiZSBlbGVtZW50T25seSBvciBtaXhlZCBhbmQgaGF2ZSBhIHBhcnRpY2xlIHdoaWNoIGlzILdlbXB0aWFibGW3IGFzIGRlZmluZWQgaW4gUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGFuIGVtcHR5IGNvbnRlbnQgbW9kZWwgY2FuIG9ubHkgcmVzdHJpY3QgYSBjb250ZW50IG1vZGVsIHRoYXQgaGFzIHNraXBwYWJsZSBlbGVtZW50cy4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGFuIGVtcHR5IGNvbnRlbnQgbW9kZWwgY2Fubm90IHJlc3RyaWN0IGEgdHlwZSB3aXRoIGEgc2ltcGxlIGNvbnRlbnQgbW9kZWwuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOgorICAgICAgICAgICAgICAgICAgICAvLyA1LjMgSWYgdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB7YmFzZSB0eXBlIGRlZmluaXRpb259IGlzIG1peGVkLi4uCisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGEgbWl4ZWQgY29udGVudCBtb2RlbCBjYW4gb25seSByZXN0cmljdCBhbm90aGVyIHR5cGUgd2l0aCBhIG1peGVkIGNvbnRlbnQgbW9kZWwuIiwgWG1sRXJyb3JDb250ZXh0LklMTEVHQUxfUkVTVFJJQ1RJT04sIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UOgorICAgICAgICAgICAgICAgICAgICAvLyA1LjMgLi4uIG9yIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUgY29tcGxleCB0eXBlIGRlZmluaXRpb24gaXRzZWxmIGlzIGVsZW1lbnQtb25seSwuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHdpdGggZWxlbWVudCBvciBtaXhlZCBjb250ZW50IGNhbm5vdCByZXN0cmljdCBhbiBlbXB0eSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSB3aXRoIGVsZW1lbnQgb3IgbWl4ZWQgY29udGVudCBjYW5ub3QgcmVzdHJpY3QgYSBzaW1wbGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyA1LjMgLi4uIHRoZW4gdGhlIHBhcnRpY2xlIG9mIHRoZSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBpdHNlbGYgbXVzdCBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIG9mIHRoZSB7Y29udGVudCB0eXBlfSBvZiB0aGUge2Jhc2UgdHlwZSBkZWZpbml0aW9ufQorICAgICAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwgPSBiYXNlVHlwZS5nZXRDb250ZW50TW9kZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsID0gc1R5cGUuZ2V0Q29udGVudE1vZGVsKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChiYXNlTW9kZWwgIT0gbnVsbCAmJiBkZXJpdmVkTW9kZWwgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlTW9kZWwgPT0gbnVsbCB8fCBkZXJpdmVkTW9kZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJOdWxsIG1vZGVscyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IEVNUFRZX0NPTlRFTlQ6ICIgKyBiYXNlVHlwZSArICIgKCIgKyBiYXNlTW9kZWwgKyAiKSwgIiArIHNUeXBlICsgIiAoIiArIGRlcml2ZWRNb2RlbCArICIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSWxsZWdhbCByZXN0cmljdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSUxMRUdBTF9SRVNUUklDVElPTiwgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyA1LjMgLi4uICBhcyBkZWZpbmVkIGluIFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCisgICAgICAgICAgICAgICAgICAgIExpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBhZGQgdGhlIGxhc3QgZXJyb3IsIGJlY2F1c2UgaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24gbWF5IGFkZCBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXQgbGF0ZXIgY2hhbmdlcyBpdHMgbWluZCBhYm91dCwgb3IgaXQgbWF5IChpbmFkdmVydGVudGx5KQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yZ2V0IHRvIGRlc2NyaWJlIGFuIGVycm9yIGludG8gdGhlIGNvbGxlY3Rpb24uLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIHJlc3RyaWN0aW9uLiIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ2V0RXJyb3JMaXN0ZW5lcigpLmFkZChlcnJvcnMuZ2V0KGVycm9ycy5zaXplKCkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbiB0d28gc2NoZW1hIHBhcnRpY2xlIHR5cGVzLCBhIGJhc2VNb2RlbCwgYW5kIGEgZGVyaXZlZCBtb2RlbCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZQorICAgICAqIGRlcml2ZWRNb2RlbCBjYW4gYmUgZWdpdGltYXRlbHkgYmUgdXNlZCBmb3IgcmVzdHJpY3Rpb24uICBFcnJvcnMgYXJlIHB1dCBpbnRvIHRoZSBlcnJvcnMgY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGJhc2VNb2RlbCAtIFRoZSBiYXNlIHNjaGVtYSBwYXJ0aWNsZQorICAgICAqIEBwYXJhbSBkZXJpdmVkTW9kZWwgLSBUaGUgZGVyaXZlZCAocmVzdHJpY3RlZCkgc2NoZW1hIHBhcnRpY2xlCisgICAgICogQHBhcmFtIGVycm9ycyAtIEludmFsaWQgcmVzdHJpY3Rpb24gZXJyb3JzIGFyZSBwdXQgaW50byB0aGlzIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqIEByZXR1cm4gYm9vbGVhbiwgdHJ1ZSBpZiB2YWxpZCByZXN0cnVjdGlvbiwgZmFsc2UgaWYgaW52YWxpZCByZXN0cmljdGlvbgorICAgICAqIEAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgIHsKKyAgICAgICAgYm9vbGVhbiByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7CisgICAgICAgIC8vIDEgVGhleSBhcmUgdGhlIHNhbWUgcGFydGljbGUuCisgICAgICAgIGlmIChiYXNlTW9kZWwuZXF1YWxzKGRlcml2ZWRNb2RlbCkpIHsKKyAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSW1wbGVtZW50IHRhYmxlIGRlZmluZWQgaW4gc2NoZW1hIHNwZWMgb24gcmVzdHJpY3Rpb25zIGF0OgorICAgICAgICAgICAgLy8gICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jY29zLXBhcnRpY2xlLXJlc3RyaWN0CisgICAgICAgICAgICBzd2l0Y2ggKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbmFtZUFuZFR5cGVPSygoU2NoZW1hTG9jYWxFbGVtZW50KSBiYXNlTW9kZWwsIChTY2hlbWFMb2NhbEVsZW1lbnQpIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbnNDb21wYXQoYmFzZU1vZGVsLCAoU2NoZW1hTG9jYWxFbGVtZW50KSBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc1N1YnNldChiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlQXNJZkdyb3VwKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRJbnZhbGlkQ29tYmluYXRpb25FcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gcmVjdXJzZShiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VVbm9yZGVyZWQoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VBc0lmR3JvdXAoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSByZWN1cnNlTGF4KGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvblZhbGlkID0gbWFwQW5kU3VtKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBYQmVhbkRlYnVnLmxvZ1N0YWNrVHJhY2UoIlVua25vd24gc2NoZW1hIHR5cGUgZm9yIERlcml2ZWQgVHlwZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2VBc0lmR3JvdXAoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRDb21iaW5hdGlvbkVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb25WYWxpZCA9IHJlY3Vyc2UoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6IFhCZWFuRGVidWcubG9nU3RhY2tUcmFjZSgiVW5rbm93biBzY2hlbWEgdHlwZSBmb3IgRGVyaXZlZCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogWEJlYW5EZWJ1Zy5sb2dTdGFja1RyYWNlKCJVbmtub3duIHNjaGVtYSB0eXBlIGZvciBCYXNlIFR5cGUiKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3RyaWN0aW9uVmFsaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXBBbmRTdW0oU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgIHsKKyAgICAgICAgLy8gbWFwQW5kU3VtIGlzIGNhbGwgaWYgYmFzZTogQ0hPSUNFLCBkZXJpdmVkOiBTRVFVRU5DRQorICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRTsKKyAgICAgICAgYXNzZXJ0IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRTsKKyAgICAgICAgYm9vbGVhbiBtYXBBbmRTdW1WYWxpZCA9IHRydWU7CisgICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogUGFydGljbGUgRGVyaXZhdGlvbiBPSyAoU2VxdWVuY2U6Q2hvaWNlIC0tIE1hcEFuZFN1bSkKKyAgICAgICAgLy8gRm9yIGEgc2VxdWVuY2UgZ3JvdXAgcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgY2hvaWNlIGdyb3VwIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nCisgICAgICAgIC8vIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBUaGVyZSBpcyBhIGNvbXBsZXRlIGZ1bmN0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgdG8gdGhlIHBhcnRpY2xlcyBpbiB0aGUKKyAgICAgICAgLy8ge3BhcnRpY2xlc30gb2YgQiBzdWNoIHRoYXQgZWFjaCBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiBpcyBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIGluCisgICAgICAgIC8vIHRoZSB7cGFydGljbGVzfSBvZiBCIGl0IG1hcHMgdG8gYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBWYWxpZCAoUmVzdHJpY3Rpb24pICinMy45LjYpLgorICAgICAgICAvLyBpbnRlcnByZXRhdGlvbjogIGVhY2ggcGFydGljbGUgY2hpbGQgaW4gZGVyaXZlZCBzaG91bGQgaGF2ZSBhIG1hdGNoIGluIGJhc2UuCisgICAgICAgIC8vIDIgVGhlIHBhaXIgY29uc2lzdGluZyBvZiB0aGUgcHJvZHVjdCBvZiB0aGUge21pbiBvY2N1cnN9IG9mIFIgYW5kIHRoZSBsZW5ndGggb2YgaXRzIHtwYXJ0aWNsZXN9IGFuZCB1bmJvdW5kZWQKKyAgICAgICAgLy8gaWYge21heCBvY2N1cnN9IGlzIHVuYm91bmRlZCBvdGhlcndpc2UgdGhlIHByb2R1Y3Qgb2YgdGhlIHttYXggb2NjdXJzfSBvZiBSIGFuZCB0aGUgbGVuZ3RoIG9mIGl0cyB7cGFydGljbGVzfQorICAgICAgICAvLyBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkgT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KKyAgICAgICAgLy8gTk9URTogVGhpcyBjbGF1c2UgaXMgaW4gcHJpbmNpcGxlIG1vcmUgcmVzdHJpY3RpdmUgdGhhbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSwgYnV0IGluIHByYWN0aWNlIHdpbGwgY292ZXIKKyAgICAgICAgLy8gYWxsIHRoZSBsaWtlbHkgY2FzZXMsIGFuZCBpcyBtdWNoIGVhc2llciB0byBzcGVjaWZ5IHRoYW4gdGhlIGZ1bGx5IGdlbmVyYWwgdmVyc2lvbi4KKyAgICAgICAgLy8gTk9URTogVGhpcyBjYXNlIGFsbG93cyB0aGUgInVuZm9sZGluZyIgb2YgaXRlcmF0ZWQgZGlzanVuY3Rpb25zIGludG8gc2VxdWVuY2VzLiBJdCBtYXkgYmUgcGFydGljdWxhcmx5IHVzZWZ1bAorICAgICAgICAvLyB3aGVuIHRoZSBkaXNqdW5jdGlvbiBpcyBhbiBpbXBsaWNpdCBvbmUgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2Ygc3Vic3RpdHV0aW9uIGdyb3Vwcy4KKworICAgICAgICAvLyBNYXAgc3RlcCAtIGZvciBlYWNoIG1lbWJlciBvZiB0aGUgZGVyaXZlZCBtb2RlbCdzIHBhcnRpY2xlIGNoaWxkcmVuIHNlYXJjaCBiYXNlIG1vZGVsJ3MgcGFydGljbGUgY2hpbGRyZW4KKyAgICAgICAgLy8gIGZvciBtYXRjaAorICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGRlcml2ZWRQYXJ0aWNsZUFycmF5ID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgU2NoZW1hUGFydGljbGVbXSBiYXNlUGFydGljbGVBcnJheSA9IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZFBhcnRpY2xlQXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSA9IGRlcml2ZWRQYXJ0aWNsZUFycmF5W2ldOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlID0gYmFzZVBhcnRpY2xlQXJyYXlbal07CisgICAgICAgICAgICAgICAgLy8gcmVjdXJzZSB0byBjaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoCisgICAgICAgICAgICAgICAgaWYgKGlzUGFydGljbGVWYWxpZFJlc3RyaWN0aW9uKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlLCBlcnJvcnMsIGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgbWF0Y2ggdGhlbiBubyBuZWVkIHRvIGNoZWNrIGJhc2UgcGFydGljbGVzIGFueW1vcmUKKyAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmRNYXRjaCkgeworICAgICAgICAgICAgICAgIG1hcEFuZFN1bVZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0TWFwcGluZ0Vycm9yKCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1bSBzdGVwCisgICAgICAgIEJpZ0ludGVnZXIgZGVyaXZlZFJhbmdlTWluID0gZGVyaXZlZE1vZGVsLmdldE1pbk9jY3VycygpLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpLmxlbmd0aCkpOworICAgICAgICBCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1heCA9IG51bGw7CisgICAgICAgIEJpZ0ludGVnZXIgVU5CT1VOREVEID0gbnVsbDsKKyAgICAgICAgaWYgKGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKKyAgICAgICAgICAgIGRlcml2ZWRSYW5nZU1heCA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXJpdmVkUmFuZ2VNYXggPSBkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkubGVuZ3RoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgY2hlY2sgZGVyaXZlZFJhbmdlIChkZXJpdmVkUmFuZ2VNaW4gYW5kIGRlcml2ZWRSYW5nZU1heCkgYWdhaW5zdCBiYXNlIG1vZGVsIG9jY3VycmVuY2UgcmFuZ2UKKyAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBPY2N1cnJlbmNlIFJhbmdlIE9LCisgICAgICAgIC8vIEZvciBhIHBhcnRpY2xlJ3Mgb2NjdXJyZW5jZSByYW5nZSB0byBiZSBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIGFub3RoZXIncyBvY2N1cnJlbmNlIHJhbmdlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBJdHMge21pbiBvY2N1cnN9IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncyB7bWluIG9jY3Vyc30uCisgICAgICAgIC8vIDIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgorICAgICAgICAvLyAgIDIuMSBUaGUgb3RoZXIncyB7bWF4IG9jY3Vyc30gaXMgdW5ib3VuZGVkLgorICAgICAgICAvLyAgIDIuMiBCb3RoIHttYXggb2NjdXJzfSBhcmUgbnVtYmVycywgYW5kIHRoZSBwYXJ0aWNsZSdzIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncy4KKworICAgICAgICBpZiAoZGVyaXZlZFJhbmdlTWluLmNvbXBhcmVUbyhiYXNlTW9kZWwuZ2V0TWluT2NjdXJzKCkpIDwgMCkgeworICAgICAgICAgICAgbWFwQW5kU3VtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWluRXJyb3JDaG9pY2VTZXF1ZW5jZShkZXJpdmVkUmFuZ2VNaW4sIGJhc2VNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEIHx8IGRlcml2ZWRSYW5nZU1heCAhPSBVTkJPVU5ERUQgJiYgZGVyaXZlZFJhbmdlTWF4LmNvbXBhcmVUbyhiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkpID4gMCkgeworICAgICAgICAgICAgbWFwQW5kU3VtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3JDaG9pY2VTZXF1ZW5jZShkZXJpdmVkUmFuZ2VNYXgsIGJhc2VNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXBBbmRTdW1WYWxpZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvckNob2ljZVNlcXVlbmNlKEJpZ0ludGVnZXIgZGVyaXZlZFJhbmdlTWluLCBTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIHRvdGFsIG1pbk9jY3VycyBmb3IgdGhlIGRlcml2ZWQgPHNlcXVlbmNlPidzIGVsZW1lbnRzOiAiCisgICAgICAgICAgICAgICAgKyBkZXJpdmVkUmFuZ2VNaW4udG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIm11c3Qgbm90IGJlIGxlc3MgdGhhbiB0aGUgYmFzZSA8Y2hvaWNlPidzIG1pbk9jY3VycyAoIgorICAgICAgICAgICAgICAgICsgYmFzZU1vZGVsLmdldE1pbk9jY3VycygpLnRvU3RyaW5nKCkgKyAiKSI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE9jY3VyZW5jZVJhbmdlTWF4RXJyb3JDaG9pY2VTZXF1ZW5jZShCaWdJbnRlZ2VyIGRlcml2ZWRSYW5nZU1heCwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSB0b3RhbCBtYXhPY2N1cnMgZm9yIHRoZSBkZXJpdmVkIDxzZXF1ZW5jZT4ncyBlbGVtZW50cyAoIgorICAgICAgICAgICAgICAgICsgZGVyaXZlZFJhbmdlTWF4LnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICArICIpIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgYmFzZSA8Y2hvaWNlPidzIG1heE9jY3VycyAoIgorICAgICAgICAgICAgICAgICsgcHJpbnRNYXhPY2N1cnMoYmFzZU1vZGVsLmdldE1heE9jY3VycygpKSArICIpIjsKKyAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0TWFwcGluZ0Vycm9yKCkgeworICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBBdCBsZWFzdCBvbmUgcmVzdHJpY3RlZCB0eXBlIGRvZXMgbm90IG1hdGNoLiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlQXNJZkdyb3VwKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gcmVjdXJzZUFzSWZHcm91cCBpcyBjYWxsZWQgaWY6CisgICAgICAgIC8vIGJhc2U6IEFMTCwgZGVyaXZlZDogRUxFTUVOVAorICAgICAgICAvLyBiYXNlOiBDSE9JQ0UsIGRlcml2ZWQ6IEVMRU1FTlQKKyAgICAgICAgLy8gYmFzZTogU0VRVUVOQ0UsIGRlcml2ZWQ6IEVMRU1FTlQKKyAgICAgICAgYXNzZXJ0IChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQorICAgICAgICAgICAgICAgIHx8IChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKQorICAgICAgICAgICAgICAgIHx8IChiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuU0VRVUVOQ0UgJiYgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpOworICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKEVsdDpBbGwvQ2hvaWNlL1NlcXVlbmNlIC0tIFJlY3Vyc2VBc0lmR3JvdXApCisKKyAgICAgICAgLy8gRm9yIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgdG8gYmUgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIGEgZ3JvdXAgcGFydGljbGUKKyAgICAgICAgLy8gKGFsbCwgY2hvaWNlIG9yIHNlcXVlbmNlKSBhIGdyb3VwIHBhcnRpY2xlIG9mIHRoZSB2YXJpZXR5IGNvcnJlc3BvbmRpbmcgdG8gQidzLCB3aXRoIHttaW4gb2NjdXJzfSBhbmQKKyAgICAgICAgLy8ge21heCBvY2N1cnN9IG9mIDEgYW5kIHdpdGgge3BhcnRpY2xlc30gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBwYXJ0aWNsZSB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbgorICAgICAgICAvLyBtdXN0IGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgZ3JvdXAgYXMgZGVmaW5lZCBieSBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LCisgICAgICAgIC8vIChBbGw6QWxsLFNlcXVlbmNlOlNlcXVlbmNlIC0tIFJlY3Vyc2UpICinMy45LjYpLCBQYXJ0aWNsZSBEZXJpdmF0aW9uIE9LIChDaG9pY2U6Q2hvaWNlIC0tIFJlY3Vyc2VMYXgpCisgICAgICAgIC8vICinMy45LjYpIG9yIFBhcnRpY2xlIERlcml2YXRpb24gT0sgKEFsbDpBbGwsU2VxdWVuY2U6U2VxdWVuY2UgLS0gUmVjdXJzZSkgKKczLjkuNiksIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgICAgICAgIC8vIHRoZSBncm91cCBpcyBhbGwsIGNob2ljZSBvciBzZXF1ZW5jZQorCisgICAgICAgIC8vIGludGVycHJldGF0aW9uOiAgbWFrZSBhIGZha2UgZ3JvdXAgb2YgdGhlIHJpZ2h0IHR5cGUsIHdpdGggbWluIG9jY3VycyBhbmQgbWF4IG9jY3VycyBvZiAxCisgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBhc0lmUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKKyAgICAgICAgYXNJZlBhcnQuc2V0UGFydGljbGVUeXBlKGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSk7CisgICAgICAgIGFzSWZQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGFzSWZQYXJ0LnNldE1heE9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGFzSWZQYXJ0LnNldFBhcnRpY2xlQ2hpbGRyZW4obmV3IFNjaGVtYVBhcnRpY2xlW10geyBkZXJpdmVkTW9kZWwgfSk7CisgICAgICAgIAorICAgICAgICAvLyB0aGUgcmVjdXJzZQorICAgICAgICByZXR1cm4gaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24oYmFzZU1vZGVsLCBhc0lmUGFydCwgZXJyb3JzLCBjb250ZXh0KTsgCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWN1cnNlTGF4KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpICB7CisgICAgICAgIC8vIHJlY3Vyc2VMYXggaXMgY2FsbGVkIGlmIGJhc2U6IENIT0lDRSwgZGVyaXZlZDogQ0hPSUNFCisgICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U7CisgICAgICAgIGJvb2xlYW4gcmVjdXJzZUxheFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgLy9TY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKENob2ljZTpDaG9pY2UgLS0gUmVjdXJzZUxheCkKKyAgICAgICAgLy8gRm9yIGEgY2hvaWNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhbm90aGVyIGNob2ljZSBncm91cCBwYXJ0aWNsZSBhbGwgb2YgdGhlCisgICAgICAgIC8vIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgIC8vIDEgUidzIG9jY3VycmVuY2UgcmFuZ2UgaXMgYSB2YWxpZCByZXN0cmljdGlvbiBvZiBCJ3Mgb2NjdXJyZW5jZSByYW5nZSBhcyBkZWZpbmVkIGJ5IE9jY3VycmVuY2UKKyAgICAgICAgLy8gUmFuZ2UgT0sgKKczLjkuNik7CisgICAgICAgIC8vIDIgVGhlcmUgaXMgYSBjb21wbGV0ZSC3b3JkZXItcHJlc2VydmluZ7cgZnVuY3Rpb25hbCBtYXBwaW5nIGZyb20gdGhlIHBhcnRpY2xlcyBpbiB0aGUge3BhcnRpY2xlc30gb2YgUgorICAgICAgICAvLyB0byB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBCIHN1Y2ggdGhhdCBlYWNoIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIGlzIGEKKyAgICAgICAgLy8gt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiB0aGUgcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgaXQgbWFwcyB0byBhcyBkZWZpbmVkIGJ5CisgICAgICAgIC8vIFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCisgICAgICAgIC8vIE5PVEU6IEFsdGhvdWdoIHRoZSC3dmFsaWRhdGlvbrcgc2VtYW50aWNzIG9mIGEgY2hvaWNlIGdyb3VwIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgaXRzIHBhcnRpY2xlcywKKyAgICAgICAgLy8gZGVyaXZlZCBjaG9pY2UgZ3JvdXBzIGFyZSByZXF1aXJlZCB0byBtYXRjaCB0aGUgb3JkZXIgb2YgdGhlaXIgYmFzZSBpbiBvcmRlciB0byBzaW1wbGlmeQorICAgICAgICAvLyBjaGVja2luZyB0aGF0IHRoZSBkZXJpdmF0aW9uIGlzIE9LLgorICAgICAgICAvLyBpbnRlcnByZXRhdGlvbjogIGNoZWNrIGRlcml2ZWQgY2hvaWNlcyBmb3IgbWF0Y2ggaW4gb3JkZXIsIG11c3QgZ2V0IGFuIGluIG9yZGVyIG1hdGNoIG9uIGEgYmFzZSBwYXJ0aWNsZSwKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGNoZWNrIGlmIGJhc2UgcGFydGljbGVzIGFyZSBza2lwcGFibGUuICBhIGxvdCBsaWtlIHJlY3Vyc2UKKworICAgICAgICBpZiAoIW9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3ljbGUgdGhydSBib3RoIGRlcml2ZWQgcGFydGljbGUgY2hpbGRyZW4gYW5kIGJhc2UgcGFydGljbGUgY2hpbGRyZW4gbG9va2luZyBmb3IgbWF0Y2hlcworICAgICAgICAvLyAgaWYgdGhlIGRlcml2ZWQgcGFydGljbGUgZG9lcyBub3QgbWF0Y2ggdGhlIGJhc2UgcGFydGljbGUgdGhlbiBiYXNlIHBhcnRpY2xlIGNhbiBiZSBza2lwcGVkCisKKyAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVBcnJheSA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7CisgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gYmFzZVBhcnRpY2xlQXJyYXkgPSBiYXNlTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBpbnQgaSA9IDAsIGogPSAwOworICAgICAgICBmb3IgKDsgaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aCAmJiBqIDwgYmFzZVBhcnRpY2xlQXJyYXkubGVuZ3RoOykgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlID0gZGVyaXZlZFBhcnRpY2xlQXJyYXlbaV07CisgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUgPSBiYXNlUGFydGljbGVBcnJheVtqXTsKKyAgICAgICAgICAgIC8vIHRyeSB0byBtYXRjaCB0aGUgdHdvIHBhcnRpY2xlcyBieSByZWN1cnNpbmcKKyAgICAgICAgICAgIGlmIChpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KSkgeworICAgICAgICAgICAgICAgIC8vIGNvb2wgZm91bmQgYSBtYXRjaCwgaW5jcmVtZW50IGJvdGggaW5kZXhlcworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGluY3JlbWVudCB0aGUgYmFzZSBwYXJ0aWNsZSBhcnJheSBpbmRleCBvbmx5CisgICAgICAgICAgICAgICAgLy8gT2ssIGxldCdzIHNraXAgdGhpcyBiYXNlIHBhcnRpY2xlLCBpbmNyZW1lbnQgYmFzZSBwYXJ0aWNsZSBhcnJheSBpbmRleCBvbmx5CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gb2ssIGdvdCB0byB0aGUgZW5kIG9mIG9uZSBvZiB0aGUgYXJyYXlzCisgICAgICAgIC8vIGlmIGF0IGVuZCBvZiBiYXNlIHBhcnRpY2xlIGFycmF5IGFuZCBub3QgYXQgdGhlIGVuZCBvZiBkZXJpdmVkIHBhcnRpY2xlIGFycmF5IHRoZW4gcmVtYWluaW5nIGRlcml2ZWQKKyAgICAgICAgLy8gIHBhcnRpY2xlcyBtdXN0IG5vdCBtYXRjaAorICAgICAgICBpZiAoaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgcmVjdXJzZUxheFZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCBkZXJpdmVkIHBhcnRpY2xlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBpbiB0aGUgYmFzZSBjb250ZW50IG1vZGVsLiI7CisgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICB9CisKKworICAgICAgICByZXR1cm4gcmVjdXJzZUxheFZhbGlkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVjdXJzZVVub3JkZXJlZChTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIC8vIHJlY3Vyc2VVbm9yZGVyIGlzIGNhbGxlZCB3aGVuIGJhc2U6IEFMTCBhbmQgZGVyaXZlZDogU0VRCisgICAgICAgIGFzc2VydCBiYXNlTW9kZWwuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuQUxMICYmIGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRTsKKyAgICAgICAgYm9vbGVhbiByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSB0cnVlOworICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIERlcml2YXRpb24gT0sgKFNlcXVlbmNlOkFsbCAtLSBSZWN1cnNlVW5vcmRlcmVkKQorICAgICAgICAvLyBGb3IgYSBzZXF1ZW5jZSBncm91cCBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYW4gYWxsIGdyb3VwIHBhcnRpY2xlIGFsbCBvZiB0aGUKKyAgICAgICAgLy8gZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkKKyAgICAgICAgLy8gT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KKyAgICAgICAgLy8gMiBUaGVyZSBpcyBhIGNvbXBsZXRlIGZ1bmN0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgdG8gdGhlIHBhcnRpY2xlcworICAgICAgICAvLyBpbiB0aGUge3BhcnRpY2xlc30gb2YgQiBzdWNoIHRoYXQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgorICAgICAgICAvLyAyLjEgTm8gcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgaXMgbWFwcGVkIHRvIGJ5IG1vcmUgdGhhbiBvbmUgb2YgdGhlIHBhcnRpY2xlcyBpbgorICAgICAgICAvLyB0aGUge3BhcnRpY2xlc30gb2YgUjsKKyAgICAgICAgLy8gMi4yIEVhY2ggcGFydGljbGUgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIFIgaXMgYSC3dmFsaWQgcmVzdHJpY3Rpb263IG9mIHRoZSBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgQgorICAgICAgICAvLyBpdCBtYXBzIHRvIGFzIGRlZmluZWQgYnkgUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KTsKKyAgICAgICAgLy8gMi4zIEFsbCBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgd2hpY2ggYXJlIG5vdCBtYXBwZWQgdG8gYnkgYW55IHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfQorICAgICAgICAvLyBvZiBSIGFyZSC3ZW1wdGlhYmxltyBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIEVtcHRpYWJsZSAopzMuOS42KS4KKyAgICAgICAgLy8gTk9URTogQWx0aG91Z2ggdGhpcyBjbGF1c2UgYWxsb3dzIHJlb3JkZXJpbmcsIGJlY2F1c2Ugb2YgdGhlIGxpbWl0cyBvbiB0aGUgY29udGVudHMgb2YgYWxsIGdyb3VwcyB0aGUKKyAgICAgICAgLy8gY2hlY2tpbmcgcHJvY2VzcyBjYW4gc3RpbGwgYmUgZGV0ZXJtaW5pc3RpYy4KKyAgICAgICAgLy8gMSwgMi4yLCBhbmQgMi4zIGFyZSB0aGUgc2FtZSBhcyByZWN1cnNlLCBzbyBkbyAyLjEgYW5kIHRoZW4gY2FsbCByZWN1cnNlCisKKyAgICAgICAgaWYgKCFvY2N1cnJlbmNlUmFuZ2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVhZCBiYXNlUGFydGljbGUgYXJyYXkgUU5hbWVzIGludG8gaGFzaG1hcAorICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGJhc2VQYXJ0aWNsZXMgPSBiYXNlTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBIYXNoTWFwIGJhc2VQYXJ0aWNsZU1hcCA9IG5ldyBIYXNoTWFwKDEwKTsKKyAgICAgICAgT2JqZWN0IE1BUFBFRCA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaG1hcAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQYXJ0aWNsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBiYXNlUGFydGljbGVNYXAucHV0KGJhc2VQYXJ0aWNsZXNbaV0uZ2V0TmFtZSgpLCBiYXNlUGFydGljbGVzW2ldKTsKKyAgICAgICAgCisgICAgICAgIC8vIGdvIHRocnUgdGhlIHNlcXVlbmNlIChkZXJpdmVkIG1vZGVsJ3MgY2hpbGRyZW4pIGFuZCBjaGVjayBvZmYgZnJvbSBiYXNlIHBhcnRpY2xlIG1hcAorICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIGRlcml2ZWRQYXJ0aWNsZXMgPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRQYXJ0aWNsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIG1hdGNoZWRCYXNlUGFydGljbGUgPSAoU2NoZW1hUGFydGljbGUpIGJhc2VQYXJ0aWNsZU1hcC5nZXQoZGVyaXZlZFBhcnRpY2xlc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG1hdGNoZWRCYXNlUGFydGljbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRBbGxTZXFNYXBwaW5nRXJyb3IoKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBnb3QgYSBtYXRjaAorICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQmFzZVBhcnRpY2xlID09IE1BUFBFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3aG9hLCB0aGlzIGJhc2UgcGFydGljbGUgaGFzIGFscmVhZHkgYmVlbiBtYXRjaGVkIChzZWUgMi4xIGFib3ZlKQorICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0TWFwcGVkTW9yZVRoYW5PbmNlRXJyb3IoYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXJpdmVkUGFydGljbGVzW2ldLmdldE1heE9jY3VycygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkUGFydGljbGVzW2ldLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBkZXJpdmVkIHBhcnRpY2xlcyBjYW4gaGF2ZSBhIG1heCBvY2N1cnMgZ3JlYXRlciB0aGFuIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0QWxsU2VxTWF4T2NjdXJzR3JlYXRlclRoYW4xRXJyb3IoZGVyaXZlZFBhcnRpY2xlc1tpXSksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNQYXJ0aWNsZVZhbGlkUmVzdHJpY3Rpb24obWF0Y2hlZEJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlc1tpXSwgZXJyb3JzLCBjb250ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXZlIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlVW5vcmRlcmVkVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgY29vbCwgZ290IGEgbWF0Y2gsIHVwZGF0ZSB0byBNQVBQRUQKKyAgICAgICAgICAgICAgICAgICAgYmFzZVBhcnRpY2xlTWFwLnB1dChkZXJpdmVkUGFydGljbGVzW2ldLmdldE5hbWUoKSwgTUFQUEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBldmVyeXRoaW5nIGlzIGNvb2wgc28gZmFyIHRoZW4gY2hlY2sgdG8gc2VlIGlmIGFueSBiYXNlIHBhcnRpY2xlcyBhcmUgbm90IG1hdGNoZWQKKyAgICAgICAgaWYgKHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCkgeworICAgICAgICAgICAgLy8gZ2V0IGFsbCB0aGUgaGFzaG1hcCBrZXlzIGFuZCBsb29wIHRocnUgbG9va2luZyBmb3IgTk9UX01BUFBFRAorICAgICAgICAgICAgU2V0IGJhc2VQYXJ0aWNsZUNvbGxlY3Rpb24gPSBiYXNlUGFydGljbGVNYXAua2V5U2V0KCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFzZVBhcnRpY2xlQ29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgUU5hbWUgYmFzZVBhcnRpY2xlUU5hbWUgPSAoUU5hbWUpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlTWFwLmdldChiYXNlUGFydGljbGVRTmFtZSkgIT0gTUFQUEVEICYmICEoKFNjaGVtYVBhcnRpY2xlKWJhc2VQYXJ0aWNsZU1hcC5nZXQoYmFzZVBhcnRpY2xlUU5hbWUpKS5pc1NraXBwYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYmFzZSBwYXJ0aWNsZSB3YXMgbm90IG1hcHBlZCBhbmQgaXMgbm90ICJwYXJ0aWNsZSBlbXB0aWFibGUiIChza2lwcGFibGUpCisgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VVbm9yZGVyZWRWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRHcm91cE1hcHBpbmdFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVjdXJzZVVub3JkZXJlZFZhbGlkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRBbGxTZXFNYXhPY2N1cnNHcmVhdGVyVGhhbjFFcnJvcihTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlICIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZE1vZGVsKQorICAgICAgICAgICAgICAgICsgIiBoYXMgYSBtYXhPY2N1cnMgZ3JlYXQgdGhhbiAxICgiCisgICAgICAgICAgICAgICAgKyBwcmludE1heE9jY3VycyhkZXJpdmVkTW9kZWwuZ2V0TWF4T2NjdXJzKCkpCisgICAgICAgICAgICAgICAgKyAiKS4gIFdoZW4gcmVzdHJpY3RpbmcgYW4gPGFsbD4gd2l0aCBhIDxzZXF1ZW5jZT4sIG5vIDxlbGVtZW50PiBjYW4gaGF2ZSBhIG1heE9jY3VycyA+IDEiOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRJbnZhbGlkQWxsU2VxTWFwcGluZ0Vycm9yKCkgeworICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBFYWNoIGVsZW1lbnQgaW4gdGhlIGRlcml2ZWQgY29udGVudCBtb2RlbCBtdXN0IG1hdGNoIGFuIGVsZW1lbnQgaW4gdGhlIGJhc2UgIgorICAgICAgICAgICAgICAgICsgImNvbnRlbnQgbW9kZWwuIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0R3JvdXBNYXBwaW5nRXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1lbWJlcnMgb2YgdGhlIGRlcml2ZWQgY29udGVudCBtb2RlbCBtdXN0IG1hdGNoIHRoZSBtZW1iZXJzIG9mIHRoZSBiYXNlICIKKyAgICAgICAgICAgICAgICArICIgY29udGVudCBtb2RlbCB1bmxlc3MgdGhlIG1lbWJlciBvZiB0aGUgYmFzZSBjb250ZW50IG1vZGVsIGlzIG9wdGlvbmFsIChwYXJ0aWNsZSBlbXB0aWFibGUpLiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE1hcHBlZE1vcmVUaGFuT25jZUVycm9yKFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFdoZW4gdXNpbmcgYSA8c2VxdWVuY2U+IHRvIHJlc3RyaWN0IGFuIDxhbGw+IHRoZSBlbGVtZW50cyBpbiB0aGUgPGFsbD4gY2FuIGJlIG1hcHBlZCBvbmx5IG9uY2UuICIKKyAgICAgICAgICAgICAgICArICIgRm91bmQgZWxlbWVudCBpbiB0aGUgPHNlcXVlbmNlPiB0aGF0IG1hcHMgYW4gZWxlbWVudCBpbiB0aGUgPGFsbD4gbW9yZSB0aGFuIG9uY2UuIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlY3Vyc2UoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyByZWN1cnNlIGlzIGNhbGxlZCB3aGVuIGJhc2U6IEFMTCBkZXJpdmVkOiBBTEwgb3IgYmFzZTogU0VRVUVOQ0UgZGVyaXZlZDogU0VRVUVOQ0UKKyAgICAgICAgYm9vbGVhbiByZWN1cnNlVmFsaWQgPSB0cnVlOworICAgICAgICAvLyBGb3IgYW4gYWxsIG9yIHNlcXVlbmNlIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhbm90aGVyIGdyb3VwIHBhcnRpY2xlIHdpdGggdGhlIHNhbWUKKyAgICAgICAgLy8ge2NvbXBvc2l0b3J9IGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIG9mIEIncyBvY2N1cnJlbmNlIHJhbmdlIGFzIGRlZmluZWQgYnkKKyAgICAgICAgLy8gT2NjdXJyZW5jZSBSYW5nZSBPSyAopzMuOS42KS4KKyAgICAgICAgLy8gMiBUaGVyZSBpcyBhIGNvbXBsZXRlILdvcmRlci1wcmVzZXJ2aW5ntyBmdW5jdGlvbmFsIG1hcHBpbmcgZnJvbSB0aGUgcGFydGljbGVzIGluIHRoZSB7cGFydGljbGVzfSBvZiBSIHRvCisgICAgICAgIC8vIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgc3VjaCB0aGF0IGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gICAyLjEgRWFjaCBwYXJ0aWNsZSBpbiB0aGUge3BhcnRpY2xlc30gb2YgUiBpcyBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfQorICAgICAgICAvLyAgIG9mIEIgaXQgbWFwcyB0byBhcyBkZWZpbmVkIGJ5IFBhcnRpY2xlIFZhbGlkIChSZXN0cmljdGlvbikgKKczLjkuNikuCisgICAgICAgIC8vICAgMi4yIEFsbCBwYXJ0aWNsZXMgaW4gdGhlIHtwYXJ0aWNsZXN9IG9mIEIgd2hpY2ggYXJlIG5vdCBtYXBwZWQgdG8gYnkgYW55IHBhcnRpY2xlIGluIHRoZSB7cGFydGljbGVzfQorICAgICAgICAvLyAgIG9mIFIgYXJlILdlbXB0aWFibGW3IGFzIGRlZmluZWQgYnkgUGFydGljbGUgRW1wdGlhYmxlICinMy45LjYpLgorICAgICAgICAvLyBOT1RFOiBBbHRob3VnaCB0aGUgt3ZhbGlkYXRpb263IHNlbWFudGljcyBvZiBhbiBhbGwgZ3JvdXAgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBpdHMgcGFydGljbGVzLAorICAgICAgICAvLyBkZXJpdmVkIGFsbCBncm91cHMgYXJlIHJlcXVpcmVkIHRvIG1hdGNoIHRoZSBvcmRlciBvZiB0aGVpciBiYXNlIGluIG9yZGVyIHRvIHNpbXBsaWZ5IGNoZWNraW5nIHRoYXQKKyAgICAgICAgLy8gdGhlIGRlcml2YXRpb24gaXMgT0suCisgICAgICAgIC8vIFtEZWZpbml0aW9uOl0gIEEgY29tcGxldGUgZnVuY3Rpb25hbCBtYXBwaW5nIGlzIG9yZGVyLXByZXNlcnZpbmcgaWYgZWFjaCBwYXJ0aWNsZSByIGluIHRoZSBkb21haW4gUiBtYXBzCisgICAgICAgIC8vIHRvIGEgcGFydGljbGUgYiBpbiB0aGUgcmFuZ2UgQiB3aGljaCBmb2xsb3dzIChub3QgbmVjZXNzYXJpbHkgaW1tZWRpYXRlbHkpIHRoZSBwYXJ0aWNsZSBpbiB0aGUgcmFuZ2UgQgorICAgICAgICAvLyBtYXBwZWQgdG8gYnkgdGhlIHByZWRlY2Vzc29yIG9mIHIsIGlmIGFueSwgd2hlcmUgInByZWRlY2Vzc29yIiBhbmQgImZvbGxvd3MiIGFyZSBkZWZpbmVkIHdpdGggcmVzcGVjdCB0bworICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIGxpc3RzIHdoaWNoIGNvbnN0aXR1dGUgUiBhbmQgQi4KKworICAgICAgICBpZiAoIW9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsLCBlcnJvcnMsIGNvbnRleHQpKSB7CisgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIGlzIGZvcm1hdHRlZCBpbiBvY2N1cnJlbmNSYW5nZU9LIC4uLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGN5Y2xlIHRocnUgYm90aCBkZXJpdmVkIHBhcnRpY2xlIGNoaWxkcmVuIGFuZCBiYXNlIHBhcnRpY2xlIGNoaWxkcmVuIGxvb2tpbmcgZm9yIG1hdGNoZXMKKyAgICAgICAgLy8gIGlmIHRoZSBkZXJpdmVkIHBhcnRpY2xlIGRvZXMgbm90IG1hdGNoIHRoZSBiYXNlIHBhcnRpY2xlIHRoZW4gYmFzZSBwYXJ0aWNsZSBjYW4gYmUgc2tpcHBlZCBpZiBpdCBpcworICAgICAgICAvLyAgc2tpcHBhYmxlIChzYW1lIGFzICJwYXJ0aWNsZSBlbXB0aWFibGUiKSBvdGhlcndpc2UgaXMgYW4gaW52YWxpZCByZXN0cmljdGlvbi4KKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGRlcml2ZWQgcGFydGljbGVzIGhhdmUgYmVlbiBjeWNsZWQgaWYgdGhlcmUgYXJlIGFueSBiYXNlIHBhcnRpY2xlcyBsZWZ0IG92ZXIgdGhlbiB0aGV5CisgICAgICAgIC8vICBtdXN0IGJlIHNraXBwYWJsZSBvciBpbnZhbGlkIHJlc3RyaWN0aW9uCisKKyAgICAgICAgU2NoZW1hUGFydGljbGVbXSBkZXJpdmVkUGFydGljbGVBcnJheSA9IGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCk7CisgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gYmFzZVBhcnRpY2xlQXJyYXkgPSBiYXNlTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBpbnQgaSA9IDAsIGogPSAwOworICAgICAgICBmb3IgKDsgaSA8IGRlcml2ZWRQYXJ0aWNsZUFycmF5Lmxlbmd0aCAmJiBqIDwgYmFzZVBhcnRpY2xlQXJyYXkubGVuZ3RoOykgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlID0gZGVyaXZlZFBhcnRpY2xlQXJyYXlbaV07CisgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUgPSBiYXNlUGFydGljbGVBcnJheVtqXTsKKyAgICAgICAgICAgIC8vIHRyeSB0byBtYXRjaCB0aGUgdHdvIHBhcnRpY2xlcyBieSByZWN1cnNpbmcKKyAgICAgICAgICAgIGlmIChpc1BhcnRpY2xlVmFsaWRSZXN0cmljdGlvbihiYXNlUGFydGljbGUsIGRlcml2ZWRQYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KSkgeworICAgICAgICAgICAgICAgIC8vIGNvb2wgZm91bmQgYSBtYXRjaCwgaW5jcmVtZW50IGJvdGggaW5kZXhlcworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRpZCBub3QgbWF0Y2gsIGluY3JlbWVudCB0aGUgYmFzZSBwYXJ0aWNsZSBhcnJheSBpbmRleCBvbmx5CisgICAgICAgICAgICAgICAgLy8gIHRoYXQncyBvayBpZiB0aGUgYmFzZSBwYXJ0aWNsZSBpcyBza2lwcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoYmFzZVBhcnRpY2xlLmlzU2tpcHBhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT2ssIGxldCdzIHNraXAgdGhpcyBiYXNlIHBhcnRpY2xlLCBpbmNyZW1lbnQgYmFzZSBwYXJ0aWNsZSBhcnJheSBpbmRleCBvbmx5CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB3aG9hLCBwYXJ0aWNsZXMgYXJlIG5vdCB2YWxpZCByZXN0cmljdGlvbnMgYW5kIGJhc2UgaXMgbm90IHNraXBwYWJsZSAtIEVSUk9SCisgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGb3VuZCBub24tb3B0aW9uYWwgcGFydGljbGUgdGhhdCBpcyBub3QgbWFwcGVkIGluIGJhc2UgY29udGVudCBtb2RlbC4iOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXREZXJpdmVkTWFwcGluZ0Vycm9yKG1lc3NhZ2UsIGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBvaywgZ290IHRvIHRoZSBlbmQgb2Ygb25lIG9mIHRoZSBhcnJheXMKKyAgICAgICAgLy8gaWYgYXQgZW5kIG9mIGJhc2UgcGFydGljbGUgYXJyYXkgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGRlcml2ZWQgcGFydGljbGUgYXJyYXkgdGhlbiByZW1haW5pbmcgZGVyaXZlZAorICAgICAgICAvLyAgcGFydGljbGVzIG11c3Qgbm90IG1hdGNoCisgICAgICAgIGlmIChpIDwgZGVyaXZlZFBhcnRpY2xlQXJyYXkubGVuZ3RoKSB7CisgICAgICAgICAgICByZWN1cnNlVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZvdW5kIGRlcml2ZWQgcGFydGljbGVzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGluIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwuIjsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdERlcml2ZWRNYXBwaW5nRXJyb3IobWVzc2FnZSwgYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBhdCBlbmQgb2YgZGVyaXZlZCBwYXJ0aWNsZSBhcnJheSBhbmQgbm90IGF0IGVuZCBvZiBiYXNlIHBhcnRpY2xlIGFycmF5IHRoZW4gY2hjayByZW1haW5pbmcKKyAgICAgICAgICAgIC8vICBiYXNlIHBhcnRpY2xlcyB0byBhc3N1cmUgdGhleSBhcmUgc2tpcHBhYmxlCisgICAgICAgICAgICBpZiAoaiA8IGJhc2VQYXJ0aWNsZUFycmF5Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBqOyBrIDwgYmFzZVBhcnRpY2xlQXJyYXkubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlUGFydGljbGVBcnJheVtrXS5pc1NraXBwYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZvdW5kIHRyYWlsaW5nIGJhc2UgcGFydGljbGVzIHRoYXQgYXJlIG5vdCBvcHRpb25hbCBhbmQgYXJlIG5vdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcHJlc2VudGVkIGluIHRoZSBkZXJpdmVkIGNvbnRlbnQgbW9kZWwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdERlcml2ZWRNYXBwaW5nRXJyb3IobWVzc2FnZSwgYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWN1cnNlVmFsaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdERlcml2ZWRNYXBwaW5nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBkZXJpdmVkIChyZXN0cmljdGVkKSBjb250ZW50IG1vZGVsIG11c3QgbWF0Y2ggdGhlIGJhc2UgY29udGVudCBtb2RlbCB1bmxlc3MgIgorICAgICAgICAgICAgICAgICsgInRoZSBwYXJ0IG9mIHRoZSBiYXNlIGNvbnRlbnQgbW9kZWwgdGhhdCBkb2VzIG5vdCBtYXRjaCBpcyBvcHRpb25hbC4gIEEgbWlzbWF0Y2ggZm91bmQgYmV0d2VlbiBhIGJhc2UgIiArCisgICAgICAgICAgICAgICAgcHJpbnRQYXJ0aWNsZShiYXNlTW9kZWwpICsgIiBhbmQgYSBkZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkgKyAiLiAgIiArIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KFNjaGVtYVBhcnRpY2xlIGJhc2VNb2RlbCwgU2NoZW1hUGFydGljbGUgZGVyaXZlZE1vZGVsLCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSBpcyBjYWxsZWQgd2hlbjoKKyAgICAgICAgLy8gYmFzZTogQU5ZLCBkZXJpdmVkOiBBTEwKKyAgICAgICAgLy8gYmFzZTogQU5ZLCBkZXJpdmVkOiBDSE9JQ0UKKyAgICAgICAgLy8gYmFzZTogQU5ZLCBkZXJpdmVkOiBTRVFVRU5DRQorICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOworICAgICAgICBhc3NlcnQgKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEwpCisgICAgICAgICAgICAgICAgfHwgKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UpCisgICAgICAgICAgICAgICAgfHwgKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CisgICAgICAgIGJvb2xlYW4gbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IHRydWU7CisgICAgICAgIC8vIEZvciBhIGdyb3VwIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhIHdpbGRjYXJkIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBFdmVyeSBtZW1iZXIgb2YgdGhlIHtwYXJ0aWNsZXN9IG9mIHRoZSBncm91cCBpcyBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgdGhlIHdpbGRjYXJkIGFzIGRlZmluZWQgYnkgUGFydGljbGUgVmFsaWQgKFJlc3RyaWN0aW9uKSAopzMuOS42KS4KKyAgICAgICAgLy8gIE5vdGU6ICBub3QgcG9zaXRpdmUgd2hhdCB0aGlzIG1lYW5zLiAgSW50ZXJwcmV0aW5nIHRvIG1lYW4gdGhhdCBldmVyeSBwYXJ0aWNsZSBvZiB0aGUgZ3JvdXAgbXVzdCBhZGhlcmUgdG8gd2lsZGNhcmQgZGVyaXZhdGlvbiBydWxlcworICAgICAgICAvLyAgICAgICAgIGluIGEgcmVjdXJzaXZlIG1hbm5lcgorICAgICAgICAvLyAgTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBwYXJ0aWNsZXMgb2YgdGhlIGdyb3VwIGFuZCBpbnZva2UgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciB3aWxkY2FyZCByZXN0cmljdGlvbiB2YWxpZGl0eQorICAgICAgICAKKyAgICAgICAgLy8gQkFVIC0gYW4gZXJyYXRhIHNob3VsZCBiZSBzdWJtaXR0ZWQgb24gdGhpcyBjbGF1c2Ugb2YgdGhlIHNwZWMsIGJlY2F1c2UgdGhlCisgICAgICAgIC8vIHNwZWMgbWFrZXMgbm8gc2Vuc2UsIGFzIHRoZSB4c3RjIHBhcnRpY2xlc1IwMTMueHNkIHRlc3QgZXhlbXBsaWZpZXMuCisgICAgICAgIC8vIHdoYXQgd2UgX3Nob3VsZF8gc28gaXMgYW4gImFzIGlmIiBvbiB0aGUgd2lsZGNhcmQsIGFsbG93aW5nIGl0IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCisgICAgICAgIC8vIGJlZm9yZSByZWN1cnNpbmcKKyAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIGFzSWZQYXJ0ID0gbmV3IFNjaGVtYVBhcnRpY2xlSW1wbCgpOworICAgICAgICBhc0lmUGFydC5zZXRQYXJ0aWNsZVR5cGUoYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpKTsKKyAgICAgICAgYXNJZlBhcnQuc2V0V2lsZGNhcmRQcm9jZXNzKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFByb2Nlc3MoKSk7CisgICAgICAgIGFzSWZQYXJ0LnNldFdpbGRjYXJkU2V0KGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpKTsKKyAgICAgICAgYXNJZlBhcnQuc2V0TWluT2NjdXJzKEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIGFzSWZQYXJ0LnNldE1heE9jY3VycyhudWxsKTsKKyAgICAgICAgYXNJZlBhcnQuc2V0VHJhbnNpdGlvblJ1bGVzKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLCB0cnVlKTsKKyAgICAgICAgYXNJZlBhcnQuc2V0VHJhbnNpdGlvbk5vdGVzKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpLCB0cnVlKTsKKworICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRpY2xlQ2hpbGRyZW4gPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKKyAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBXaWxkY2FyZC9FbGVtZW50IGRlcml2YXRpb24KKyAgICAgICAgICAgICAgICAgICAgbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IG5zQ29tcGF0KGFzSWZQYXJ0LCAoU2NoZW1hTG9jYWxFbGVtZW50KSBwYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkIFdpbGRjYXJkL1dpbGRjYXJkIGRlcml2YXRpb24KKyAgICAgICAgICAgICAgICAgICAgbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IG5zU3Vic2V0KGFzSWZQYXJ0LCBwYXJ0aWNsZSwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkIFdpbGRjYXJkL0dyb3VwIGRlcml2YXRpb24KKyAgICAgICAgICAgICAgICAgICAgbnNSZWN1cnNlQ2hlY2tDYXJkaW5hbGl0eSA9IG5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkoYXNJZlBhcnQsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBhbnkgcGFydGljbGUgaXMgaW52YWxpZCB0aGVuIGJyZWFrIHRoZSBsb29wCisgICAgICAgICAgICBpZiAoIW5zUmVjdXJzZUNoZWNrQ2FyZGluYWxpdHkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIDIgVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiB0aGUgZ3JvdXAsIGFzIGRlZmluZWQgYnkgRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChhbGwgYW5kIHNlcXVlbmNlKSAopzMuOC42KQorICAgICAgICAvLyAoaWYgdGhlIGdyb3VwIGlzIGFsbCBvciBzZXF1ZW5jZSkgb3IgRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChjaG9pY2UpICinMy44LjYpIChpZiBpdCBpcyBjaG9pY2UpIGlzIGEgdmFsaWQKKyAgICAgICAgLy8gcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgorCisgICAgICAgIGlmIChuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5KSB7CisgICAgICAgICAgICBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5ID0gY2hlY2tHcm91cE9jY3VycmVuY2VPSyhiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuc1JlY3Vyc2VDaGVja0NhcmRpbmFsaXR5OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tHcm91cE9jY3VycmVuY2VPSyhTY2hlbWFQYXJ0aWNsZSBiYXNlTW9kZWwsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGJvb2xlYW4gZ3JvdXBPY2N1cnJlbmNlT0sgPSB0cnVlOworICAgICAgICBCaWdJbnRlZ2VyIG1pblJhbmdlID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBCaWdJbnRlZ2VyIG1heFJhbmdlID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBzd2l0Y2ggKGRlcml2ZWRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgIG1pblJhbmdlID0gZ2V0RWZmZWN0aXZlTWluUmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGdldEVmZmVjdGl2ZU1heFJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQ2hvaWNlKGRlcml2ZWRNb2RlbCk7CisgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBnZXRFZmZlY3RpdmVNYXhSYW5nZUNob2ljZShkZXJpdmVkTW9kZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgbWluIG9jY3VycyBmb3IgdmFsaWRpdHkKKyAgICAgICAgLy8gZGVyaXZlZCBtaW4gb2NjdXJzIGlzIHZhbGlkIGlmIGl0cyB7bWluIG9jY3Vyc30gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzIHttaW4gb2NjdXJzfS4KKyAgICAgICAgaWYgKG1pblJhbmdlLmNvbXBhcmVUbyhiYXNlTW9kZWwuZ2V0TWluT2NjdXJzKCkpIDwgMCkgeworICAgICAgICAgICAgZ3JvdXBPY2N1cnJlbmNlT0sgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEdyb3VwTWluT2NjdXJzRXJyb3IoZGVyaXZlZE1vZGVsLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgbWF4IG9jY3VycyBmb3IgdmFsaWRpdHkKKyAgICAgICAgLy8gb25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOgorICAgICAgICAvLyBUaGUgYmFzZSBtb2RlbCdzIHttYXggb2NjdXJzfSBpcyB1bmJvdW5kZWQuCisgICAgICAgIC8vIG9yIGJvdGgge21heCBvY2N1cnN9IGFyZSBudW1iZXJzLCBhbmQgdGhlIHBhcnRpY2xlJ3MgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzCisgICAgICAgIEJpZ0ludGVnZXIgVU5CT1VOREVEID0gbnVsbDsKKyAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRNYXhPY2N1cnMoKSAhPSBVTkJPVU5ERUQpIHsKKyAgICAgICAgICAgIGlmIChtYXhSYW5nZSA9PSBVTkJPVU5ERUQpIHsKKyAgICAgICAgICAgICAgICBncm91cE9jY3VycmVuY2VPSyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEdyb3VwTWF4T2NjdXJzRXJyb3IoZGVyaXZlZE1vZGVsLCBiYXNlTW9kZWwpLCBjb250ZXh0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtYXhSYW5nZS5jb21wYXJlVG8oYmFzZU1vZGVsLmdldE1heE9jY3VycygpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBPY2N1cnJlbmNlT0sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0R3JvdXBNYXhPY2N1cnNFcnJvcihkZXJpdmVkTW9kZWwsIGJhc2VNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdyb3VwT2NjdXJyZW5jZU9LOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRHcm91cE1heE9jY3Vyc0Vycm9yKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtYXhPY2N1cnMgZm9yIHRoZSBkZXJpdmVkIGdyb3VwICIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZE1vZGVsKQorICAgICAgICAgICAgICAgICsgIiBpcyBncmVhdCB0aGFuIHRoZSBiYXNlIG1heE9jY3VycyBvZiAiCisgICAgICAgICAgICAgICAgKyBwcmludE1heE9jY3VycyhiYXNlTW9kZWwuZ2V0TWF4T2NjdXJzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRHcm91cE1pbk9jY3Vyc0Vycm9yKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCwgU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtaW5PY2N1cnMgZm9yIHRoZSBkZXJpdmVkIGdyb3VwICIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZE1vZGVsKQorICAgICAgICAgICAgICAgICsgIiBpcyBsZXNzIHRoYW4gdGhlIGJhc2UgbWluT2NjdXJzIG9mICIKKyAgICAgICAgICAgICAgICArIGJhc2VNb2RlbC5nZXRNaW5PY2N1cnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIGdldEVmZmVjdGl2ZU1heFJhbmdlQ2hvaWNlKFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRNb2RlbCkgeworICAgICAgICBCaWdJbnRlZ2VyIG1heFJhbmdlID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBCaWdJbnRlZ2VyIFVOQk9VTkRFRCA9IG51bGw7CisgICAgICAgIC8vIFNjaGVtYSBDb21wb25lbnQgQ29uc3RyYWludDogRWZmZWN0aXZlIFRvdGFsIFJhbmdlIChjaG9pY2UpCisgICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgY2hvaWNlCisgICAgICAgIC8vIGlzIGEgcGFpciBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgorICAgICAgICAvLyBNQVhJTVVNCisgICAgICAgIC8vIDEpIHVuYm91bmRlZCBpZiB0aGUge21heCBvY2N1cnN9IG9mIGFueSB3aWxkY2FyZCBvciBlbGVtZW50IGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IG9yCisgICAgICAgIC8vIHRoZSBtYXhpbXVtIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhbnkgb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBpcworICAgICAgICAvLyB1bmJvdW5kZWQgKG5vdGU6IHNlZW1zIHRvIGJlIHRoZSBzYW1lIGFzIE1heCBSYW5nZSBBbGwgb3IgU2VxdWVuY2UpLAorICAgICAgICAvLyBvciAyKSBpZiBhbnkgb2YgdGhvc2UgaXMgbm9uLXplcm8gYW5kIHRoZSB7bWF4IG9jY3Vyc30gb2YgdGhlIHBhcnRpY2xlIGl0c2VsZiBpcyB1bmJvdW5kZWQsCisgICAgICAgIC8vIG90aGVyd2lzZSAzKSB0aGUgcHJvZHVjdCBvZiB0aGUgcGFydGljbGUncyB7bWF4IG9jY3Vyc30gYW5kIHRoZSBtYXhpbXVtIG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgZXZlcnkKKyAgICAgICAgLy8gd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlICptYXhpbXVtKiAobm90ZTogdGhpcyBpcyB0aGUgZGlmZmVyZW5jZQorICAgICAgICAvLyBiZXR3ZWVuIE1heFJhbmdlIENob2ljZSBhbnMgTWF4UmFuZ2UgQWxsIG9yIFNlcXVlbmNlKSBwYXJ0IG9mIHRoZQorICAgICAgICAvLyBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9CisgICAgICAgIC8vIChvciAwIGlmIHRoZXJlIGFyZSBubyB7cGFydGljbGVzfSkuCisKKyAgICAgICAgYm9vbGVhbiBub25aZXJvUGFydGljbGVDaGlsZEZvdW5kID0gZmFsc2U7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzSW5XaWxkQ2FyZE9yRWxlbWVudCA9IEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnNJbkdyb3VwID0gQmlnSW50ZWdlci5aRVJPOworICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRpY2xlQ2hpbGRyZW4gPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpY2xlQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gcGFydGljbGVDaGlsZHJlbltpXTsKKyAgICAgICAgICAgIHN3aXRjaCAocGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdW5ib3VuZGVkIHRoZW4gbWF4b2NjdXJzIHdpbGwgYmUgbnVsbAorICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgPT0gVU5CT1VOREVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IFVOQk9VTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZS5nZXRJbnRNYXhPY2N1cnMoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRodCBhdCBsZWFzdCBvbmUgbm9uLXplcm8gcGFydGljbGUgaXMgZm91bmQgZm9yIGxhdGVyIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25aZXJvUGFydGljbGVDaGlsZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKG1heE9jY3Vyc0luV2lsZENhcmRPckVsZW1lbnQpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNJbldpbGRDYXJkT3JFbGVtZW50ID0gcGFydGljbGUuZ2V0TWF4T2NjdXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBoaWdoZXN0IG1heG9jY3VycyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlLmNvbXBhcmVUbyhtYXhPY2N1cnNJbkdyb3VwKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNJbkdyb3VwID0gbWF4UmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBoaWdoZXN0IG1heG9jY3VycyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlLmNvbXBhcmVUbyhtYXhPY2N1cnNJbkdyb3VwKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNJbkdyb3VwID0gbWF4UmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBhbiB1bmJvdW5kZWQgaGFzIGJlZW4gZm91bmQgdGhlbiB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgaWYgKG1heFJhbmdlID09IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gMSkgdW5ib3VuZGVkIGlmIHRoZSB7bWF4IG9jY3Vyc30gb2YgYW55IHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gb3IKKyAgICAgICAgLy8gdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGFueSBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGlzCisgICAgICAgIC8vIHVuYm91bmRlZAorICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7CisgICAgICAgICAgICAvLyAyKSBpZiBhbnkgb2YgdGhvc2UgaXMgbm9uLXplcm8gYW5kIHRoZSB7bWF4IG9jY3Vyc30gb2YgdGhlIHBhcnRpY2xlIGl0c2VsZiBpcyB1bmJvdW5kZWQKKyAgICAgICAgICAgIGlmIChub25aZXJvUGFydGljbGVDaGlsZEZvdW5kICYmIGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKKyAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IFVOQk9VTkRFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gMykgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21heCBvY2N1cnN9IGFuZCB0aGUgbWF4aW11bSBvZiB0aGUge21heCBvY2N1cnN9IG9mIGV2ZXJ5CisgICAgICAgICAgICAgICAgLy8gd2lsZGNhcmQgb3IgZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlICptYXhpbXVtKgorICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBlYWNoIG9mIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30KKyAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKS5tdWx0aXBseShtYXhPY2N1cnNJbldpbGRDYXJkT3JFbGVtZW50LmFkZChtYXhPY2N1cnNJbkdyb3VwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWF4UmFuZ2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRFZmZlY3RpdmVNYXhSYW5nZUFsbFNlcShTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgQmlnSW50ZWdlciBtYXhSYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgQmlnSW50ZWdlciBVTkJPVU5ERUQgPSBudWxsOworICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IEVmZmVjdGl2ZSBUb3RhbCBSYW5nZSAoYWxsIGFuZCBzZXF1ZW5jZSkKKyAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhIHBhcnRpY2xlIHdob3NlIHt0ZXJtfSBpcyBhIGdyb3VwIHdob3NlIHtjb21wb3NpdG9yfSBpcyBhbGwgb3Igc2VxdWVuY2UgaXMgYQorICAgICAgICAvLyBwYWlyIG9mIG1pbmltdW0gYW5kIG1heGltdW0sIGFzIGZvbGxvd3M6CisgICAgICAgIC8vIE1BWElNVU0KKyAgICAgICAgLy8gMSkgdW5ib3VuZGVkIGlmIHRoZSB7bWF4IG9jY3Vyc30gb2YgYW55IHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gb3IKKyAgICAgICAgLy8gdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGFueSBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGlzCisgICAgICAgIC8vIHVuYm91bmRlZCwgb3IgMikgaWYgYW55IG9mIHRob3NlIGlzIG5vbi16ZXJvIGFuZCB0aGUge21heCBvY2N1cnN9IG9mIHRoZSBwYXJ0aWNsZSBpdHNlbGYgaXMgdW5ib3VuZGVkLCBvdGhlcndpc2UKKyAgICAgICAgLy8gMykgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21heCBvY2N1cnN9IGFuZCB0aGUgKnN1bSogb2YgdGhlIHttYXggb2NjdXJzfSBvZiBldmVyeSB3aWxkY2FyZCBvciBlbGVtZW50CisgICAgICAgIC8vIGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGFuZCB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZgorICAgICAgICAvLyB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IChvciAwIGlmIHRoZXJlIGFyZSBubyB7cGFydGljbGVzfSkuCisKKyAgICAgICAgYm9vbGVhbiBub25aZXJvUGFydGljbGVDaGlsZEZvdW5kID0gZmFsc2U7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzVG90YWwgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzSW5Hcm91cCA9IEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgU2NoZW1hUGFydGljbGVbXSBwYXJ0aWNsZUNoaWxkcmVuID0gZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWNsZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHBhcnRpY2xlQ2hpbGRyZW5baV07CisgICAgICAgICAgICBzd2l0Y2ggKHBhcnRpY2xlLmdldFBhcnRpY2xlVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVuYm91bmRlZCB0aGVuIG1heG9jY3VycyB3aWxsIGJlIG51bGwKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1heE9jY3VycygpID09IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmFuZ2UgPSBVTkJPVU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUuZ2V0SW50TWF4T2NjdXJzKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aHQgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIHBhcnRpY2xlIGlzIGZvdW5kIGZvciBsYXRlciB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uWmVyb1BhcnRpY2xlQ2hpbGRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzVG90YWwgPSBtYXhPY2N1cnNUb3RhbC5hZGQocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBoaWdoZXN0IG1heG9jY3VycyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlLmNvbXBhcmVUbyhtYXhPY2N1cnNJbkdyb3VwKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNJbkdyb3VwID0gbWF4UmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgIG1heFJhbmdlID0gZ2V0RWZmZWN0aXZlTWF4UmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlICE9IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBoaWdoZXN0IG1heG9jY3VycyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFJhbmdlLmNvbXBhcmVUbyhtYXhPY2N1cnNJbkdyb3VwKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnNJbkdyb3VwID0gbWF4UmFuZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBhbiB1bmJvdW5kZWQgaGFzIGJlZW4gZm91bmQgdGhlbiB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgaWYgKG1heFJhbmdlID09IFVOQk9VTkRFRCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gMSkgdW5ib3VuZGVkIGlmIHRoZSB7bWF4IG9jY3Vyc30gb2YgYW55IHdpbGRjYXJkIG9yIGVsZW1lbnQgZGVjbGFyYXRpb24gcGFydGljbGUgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30gb3IKKyAgICAgICAgLy8gdGhlIG1heGltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGFueSBvZiB0aGUgZ3JvdXAgcGFydGljbGVzIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGlzCisgICAgICAgIC8vIHVuYm91bmRlZAorICAgICAgICBpZiAobWF4UmFuZ2UgIT0gVU5CT1VOREVEKSB7CisgICAgICAgICAgICAvLyAyKSBpZiBhbnkgb2YgdGhvc2UgaXMgbm9uLXplcm8gYW5kIHRoZSB7bWF4IG9jY3Vyc30gb2YgdGhlIHBhcnRpY2xlIGl0c2VsZiBpcyB1bmJvdW5kZWQKKyAgICAgICAgICAgIGlmIChub25aZXJvUGFydGljbGVDaGlsZEZvdW5kICYmIGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBVTkJPVU5ERUQpIHsKKyAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IFVOQk9VTkRFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gMykgdGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21heCBvY2N1cnN9IGFuZCB0aGUgc3VtIG9mIHRoZSB7bWF4IG9jY3Vyc30gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAorICAgICAgICAgICAgICAgIC8vIGRlY2xhcmF0aW9uIHBhcnRpY2xlIGluIHRoZSBncm91cCdzIHtwYXJ0aWNsZXN9IGFuZCB0aGUgbWF4aW11bSBwYXJ0IG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgZWFjaCBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBncm91cCBwYXJ0aWNsZXMgaW4gdGhlIGdyb3VwJ3Mge3BhcnRpY2xlc30KKyAgICAgICAgICAgICAgICBtYXhSYW5nZSA9IGRlcml2ZWRNb2RlbC5nZXRNYXhPY2N1cnMoKS5tdWx0aXBseShtYXhPY2N1cnNUb3RhbC5hZGQobWF4T2NjdXJzSW5Hcm91cCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1heFJhbmdlOworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRFZmZlY3RpdmVNaW5SYW5nZUNob2ljZShTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGNob2ljZSkKKyAgICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB0b3RhbCByYW5nZSBvZiBhIHBhcnRpY2xlIHdob3NlIHt0ZXJtfSBpcyBhIGdyb3VwIHdob3NlIHtjb21wb3NpdG9yfSBpcyBjaG9pY2UgaXMgYSBwYWlyIG9mCisgICAgICAgIC8vIG1pbmltdW0gYW5kIG1heGltdW0sIGFzIGZvbGxvd3M6CisgICAgICAgIC8vIE1JTklNVU0KKyAgICAgICAgLy8gVGhlIHByb2R1Y3Qgb2YgdGhlIHBhcnRpY2xlJ3Mge21pbiBvY2N1cnN9CisgICAgICAgIC8vIGFuZCB0aGUgKm1pbmltdW0qIG9mIHRoZSB7bWluIG9jY3Vyc30gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAorICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSBhbmQgdGhlIG1pbmltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2ggb2YKKyAgICAgICAgLy8gdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgorICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRpY2xlQ2hpbGRyZW4gPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBpZiAocGFydGljbGVDaGlsZHJlbi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIEJpZ0ludGVnZXIgbWluUmFuZ2UgPSBudWxsOworICAgICAgICAvLyBnZXQgdGhlIG1pbmltdW0gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAorICAgICAgICAvLyB0b3RhbCB1cCB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIGZvciBlYWNoIGdyb3VwCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOworICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICBpZiAobWluUmFuZ2UgPT0gbnVsbCB8fCBtaW5SYW5nZS5jb21wYXJlVG8ocGFydGljbGUuZ2V0TWluT2NjdXJzKCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1ycyA9IGdldEVmZmVjdGl2ZU1pblJhbmdlQWxsU2VxKGRlcml2ZWRNb2RlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaW5SYW5nZSA9PSBudWxsIHx8IG1pblJhbmdlLmNvbXBhcmVUbyhtcnMpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluUmFuZ2UgPSBtcnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbXJjID0gZ2V0RWZmZWN0aXZlTWluUmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJhbmdlID09IG51bGwgfHwgbWluUmFuZ2UuY29tcGFyZVRvKG1yYykgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5SYW5nZSA9IG1yYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWluUmFuZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIG1pblJhbmdlID0gQmlnSW50ZWdlci5aRVJPOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdG90YWwKKyAgICAgICAgbWluUmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWluT2NjdXJzKCkubXVsdGlwbHkobWluUmFuZ2UpOworICAgICAgICByZXR1cm4gbWluUmFuZ2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBnZXRFZmZlY3RpdmVNaW5SYW5nZUFsbFNlcShTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgQmlnSW50ZWdlciBtaW5SYW5nZSA9IEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgLy8gU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBFZmZlY3RpdmUgVG90YWwgUmFuZ2UgKGFsbCBhbmQgc2VxdWVuY2UpCisgICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgdG90YWwgcmFuZ2Ugb2YgYSBwYXJ0aWNsZSB3aG9zZSB7dGVybX0gaXMgYSBncm91cCB3aG9zZSB7Y29tcG9zaXRvcn0gaXMgYWxsIG9yIHNlcXVlbmNlIGlzIGEKKyAgICAgICAgLy8gcGFpciBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtLCBhcyBmb2xsb3dzOgorICAgICAgICAvLyBNSU5JTVVNCisgICAgICAgIC8vIFRoZSBwcm9kdWN0IG9mIHRoZSBwYXJ0aWNsZSdzIHttaW4gb2NjdXJzfQorICAgICAgICAvLyBhbmQgdGhlICpzdW0qIG9mIHRoZSB7bWluIG9jY3Vyc30gb2YgZXZlcnkgd2lsZGNhcmQgb3IgZWxlbWVudAorICAgICAgICAvLyBkZWNsYXJhdGlvbiBwYXJ0aWNsZSBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfQorICAgICAgICAvLyBhbmQgdGhlIG1pbmltdW0gcGFydCBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIHJhbmdlIG9mIGVhY2gKKyAgICAgICAgLy8gb2YgdGhlIGdyb3VwIHBhcnRpY2xlcyBpbiB0aGUgZ3JvdXAncyB7cGFydGljbGVzfSAob3IgMCBpZiB0aGVyZSBhcmUgbm8ge3BhcnRpY2xlc30pLgorICAgICAgICBTY2hlbWFQYXJ0aWNsZVtdIHBhcnRpY2xlQ2hpbGRyZW4gPSBkZXJpdmVkTW9kZWwuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICBCaWdJbnRlZ2VyIHBhcnRpY2xlVG90YWxNaW5PY2N1cnMgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBwYXJ0aWNsZUNoaWxkcmVuW2ldOworICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzID0gcGFydGljbGVUb3RhbE1pbk9jY3Vycy5hZGQocGFydGljbGUuZ2V0TWluT2NjdXJzKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzID0gcGFydGljbGVUb3RhbE1pbk9jY3Vycy5hZGQoZ2V0RWZmZWN0aXZlTWluUmFuZ2VBbGxTZXEoZGVyaXZlZE1vZGVsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZVRvdGFsTWluT2NjdXJzID0gcGFydGljbGVUb3RhbE1pbk9jY3Vycy5hZGQoZ2V0RWZmZWN0aXZlTWluUmFuZ2VDaG9pY2UoZGVyaXZlZE1vZGVsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWluUmFuZ2UgPSBkZXJpdmVkTW9kZWwuZ2V0TWluT2NjdXJzKCkubXVsdGlwbHkocGFydGljbGVUb3RhbE1pbk9jY3Vycyk7CisKKyAgICAgICAgcmV0dXJuIG1pblJhbmdlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnNTdWJzZXQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyBuc1N1YnNldCBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTlksIGRlcml2ZWQ6IEFOWQorICAgICAgICBhc3NlcnQgYmFzZU1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOworICAgICAgICBhc3NlcnQgZGVyaXZlZE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOworICAgICAgICBib29sZWFuIG5zU3Vic2V0ID0gZmFsc2U7CisgICAgICAgIC8vIEZvciBhIHdpbGRjYXJkIHBhcnRpY2xlIHRvIGJlIGEgt3ZhbGlkIHJlc3RyaWN0aW9utyBvZiBhbm90aGVyIHdpbGRjYXJkIHBhcnRpY2xlIGFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMSBSJ3Mgb2NjdXJyZW5jZSByYW5nZSBtdXN0IGJlIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgorICAgICAgICBpZiAob2NjdXJyZW5jZVJhbmdlT0soYmFzZU1vZGVsLCBkZXJpdmVkTW9kZWwsIGVycm9ycywgY29udGV4dCkpIHsKKyAgICAgICAgICAgIC8vIDIgUidzIHtuYW1lc3BhY2UgY29uc3RyYWludH0gbXVzdCBiZSBhbiBpbnRlbnNpb25hbCBzdWJzZXQgb2YgQidzIHtuYW1lc3BhY2UgY29uc3RyYWludH0gYXMgZGVmaW5lZAorICAgICAgICAgICAgLy8gYnkgV2lsZGNhcmQgU3Vic2V0ICinMy4xMC42KS4KKyAgICAgICAgICAgIGlmIChiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5pbnZlcnNlKCkuaXNEaXNqb2ludChkZXJpdmVkTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKSkpIHsKKyAgICAgICAgICAgICAgICBuc1N1YnNldCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5zU3Vic2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0TlNJc05vdFN1YnNldEVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnNTdWJzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdE5TSXNOb3RTdWJzZXRFcnJvcihiYXNlTW9kZWwsIGRlcml2ZWRNb2RlbCksIGNvbnRleHQpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dXJuIG5zU3Vic2V0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbnNDb21wYXQoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyBuc0NvbXBhdCBpcyBjYWxsZWQgd2hlbiBiYXNlOiBBTlksIGRlcml2ZWQ6IEVMRU1FTlQKKyAgICAgICAgYXNzZXJ0IGJhc2VNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDsKKyAgICAgICAgYm9vbGVhbiBuc0NvbXBhdCA9IGZhbHNlOworICAgICAgICAvLyBGb3IgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBwYXJ0aWNsZSB0byBiZSBhILd2YWxpZCByZXN0cmljdGlvbrcgb2YgYSB3aWxkY2FyZCBwYXJ0aWNsZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgIC8vIDEgVGhlIGVsZW1lbnQgZGVjbGFyYXRpb24ncyB7dGFyZ2V0IG5hbWVzcGFjZX0gaXMgt3ZhbGlktyB3aXRoIHJlc3BlY3QgdG8gdGhlIHdpbGRjYXJkJ3Mge25hbWVzcGFjZSBjb25zdHJhaW50fQorICAgICAgICAvLyBhcyBkZWZpbmVkIGJ5IFdpbGRjYXJkIGFsbG93cyBOYW1lc3BhY2UgTmFtZSAopzMuMTAuNCkuCisgICAgICAgIGlmIChiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5jb250YWlucyhkZXJpdmVkRWxlbWVudC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAvLyAyIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgorICAgICAgICAgICAgaWYgKG9jY3VycmVuY2VSYW5nZU9LKGJhc2VNb2RlbCwgKFNjaGVtYVBhcnRpY2xlKSBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KSkgeworICAgICAgICAgICAgICAgIG5zQ29tcGF0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvcihiYXNlTW9kZWwsIChTY2hlbWFQYXJ0aWNsZSkgZGVyaXZlZEVsZW1lbnQpLCBjb250ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuc0NvbXBhdCA9IGZhbHNlOworICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0TlNJc05vdFN1YnNldEVycm9yKGJhc2VNb2RlbCwgKFNjaGVtYVBhcnRpY2xlKSBkZXJpdmVkRWxlbWVudCksIGNvbnRleHQpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dXJuIG5zQ29tcGF0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXROU0lzTm90U3Vic2V0RXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiBUaGUgbmFtZXNwYWNlKHMpIG9mIHRoZSBkZXJpdmVkIGZpZWxkOiAiICsgcHJpbnRQYXJ0aWNsZShkZXJpdmVkUGFydGljbGUpCisgICAgICAgICAgICAgICAgKyAiIGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIG5hbWVzcGFjZShzKSBvZiB0aGUgYmFzZSBmaWVsZDogIiArIHByaW50UGFydGljbGUoYmFzZVBhcnRpY2xlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SW52YWxpZENvbWJpbmF0aW9uRXJyb3IoU2NoZW1hUGFydGljbGUgYmFzZU1vZGVsLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkTW9kZWwpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIGRlcml2ZWQgY29udGVudCBtb2RlbCAiCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRNb2RlbCkKKyAgICAgICAgICAgICAgICArICIgY2Fubm90IHJlc3RyaWN0IGJhc2UgY29udGVudCBtb2RlbCAiCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VNb2RlbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuYW1lQW5kVHlwZU9LKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlRWxlbWVudCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRFbGVtZW50LCBDb2xsZWN0aW9uIGVycm9ycywgWG1sT2JqZWN0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gbmFtZUFuZFR5cGVPSyBjYWxsZWQgd2hlbiBiYXNlOiBFTEVNRU5UIGFuZCBkZXJpdmVkOiBFTEVNRU5UCisgICAgICAgIGJvb2xlYW4gbmFtZUFuZFR5cGVPSyA9IGZhbHNlOworICAgICAgICAvLyBTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IFBhcnRpY2xlIFJlc3RyaWN0aW9uIE9LIChFbHQ6RWx0IC0tIE5hbWVBbmRUeXBlT0spCisgICAgICAgIC8vIDEgVGhlIGRlY2xhcmF0aW9ucycge25hbWV9cyBhbmQge3RhcmdldCBuYW1lc3BhY2V9cyBhcmUgdGhlIHNhbWUuCisgICAgICAgIGlmICgoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KS5jYW5TdGFydFdpdGhFbGVtZW50KGRlcml2ZWRFbGVtZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIC8vIDIgRWl0aGVyIEIncyB7bmlsbGFibGV9IGlzIHRydWUgb3IgUidzIHtuaWxsYWJsZX0gaXMgZmFsc2UuCisgICAgICAgICAgICBpZiAoYmFzZUVsZW1lbnQuaXNOaWxsYWJsZSgpIHx8ICFkZXJpdmVkRWxlbWVudC5pc05pbGxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyAzIFIncyBvY2N1cnJlbmNlIHJhbmdlIGlzIGEgdmFsaWQgcmVzdHJpY3Rpb24gb2YgQidzIG9jY3VycmVuY2UgcmFuZ2UgYXMgZGVmaW5lZCBieSBPY2N1cnJlbmNlIFJhbmdlIE9LICinMy45LjYpLgorICAgICAgICAgICAgICAgIGlmIChvY2N1cnJlbmNlUmFuZ2VPSygoU2NoZW1hUGFydGljbGUpIGJhc2VFbGVtZW50LCAoU2NoZW1hUGFydGljbGUpIGRlcml2ZWRFbGVtZW50LCBlcnJvcnMsIGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDQgZWl0aGVyIEIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBhYnNlbnQsIG9yIGlzIG5vdCBmaXhlZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgUidzIGRlY2xhcmF0aW9uJ3Mge3ZhbHVlIGNvbnN0cmFpbnR9IGlzIGZpeGVkIHdpdGggdGhlIHNhbWUgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIG5hbWVBbmRUeXBlT0sgPSBjaGVja0ZpeGVkKGJhc2VFbGVtZW50LCBkZXJpdmVkRWxlbWVudCwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVBbmRUeXBlT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgUidzIGRlY2xhcmF0aW9uJ3Mge2lkZW50aXR5LWNvbnN0cmFpbnQgZGVmaW5pdGlvbnN9IGlzIGEgc3Vic2V0IG9mIEIncyBkZWNsYXJhdGlvbidzIHtpZGVudGl0eS1jb25zdHJhaW50IGRlZmluaXRpb25zfSwgaWYgYW55LgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUFuZFR5cGVPSyA9IGNoZWNrSWRlbnRpdHlDb25zdHJhaW50cyhiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUFuZFR5cGVPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDcgUidzIHt0eXBlIGRlZmluaXRpb259IGlzIHZhbGlkbHkgZGVyaXZlZCBnaXZlbiB7ZXh0ZW5zaW9uLCBsaXN0LCB1bmlvbn0gZnJvbSBCJ3Mge3R5cGUgZGVmaW5pdGlvbn0gYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIGJ5IFR5cGUgRGVyaXZhdGlvbiBPSyAoQ29tcGxleCkgKKczLjQuNikgb3IgVHlwZSBEZXJpdmF0aW9uIE9LIChTaW1wbGUpICinMy4xNC42KSwgYXMgYXBwcm9wcmlhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUFuZFR5cGVPSyA9IHR5cGVEZXJpdmF0aW9uT0soYmFzZUVsZW1lbnQuZ2V0VHlwZSgpLCBkZXJpdmVkRWxlbWVudC5nZXRUeXBlKCksIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVBbmRUeXBlT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNiBSJ3MgZGVjbGFyYXRpb24ncyB7ZGlzYWxsb3dlZCBzdWJzdGl0dXRpb25zfSBpcyBhIHN1cGVyc2V0IG9mIEIncyBkZWNsYXJhdGlvbidzIHtkaXNhbGxvd2VkIHN1YnN0aXR1dGlvbnN9LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQW5kVHlwZU9LID0gYmxvY2tTZXRPSyhiYXNlRWxlbWVudCwgZGVyaXZlZEVsZW1lbnQsIGVycm9ycywgY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lQW5kVHlwZU9LOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGJsb2NrU2V0T0soU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VFbGVtZW50LCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkKKyAgICB7CisgICAgICAgIGlmIChiYXNlRWxlbWVudC5ibG9ja1Jlc3RyaWN0aW9uKCkgJiYgIWRlcml2ZWRFbGVtZW50LmJsb2NrUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIlJlc3RyaWN0aW9uIEludmFsaWQuICBEZXJpdmVkICIgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSlkZXJpdmVkRWxlbWVudCkgKyAiIGRvZXMgbm90IGJsb2NrIHJlc3RyaWN0aW9uIGFzIGRvZXMgdGhlIGJhc2UgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KSwgY29udGV4dCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlRWxlbWVudC5ibG9ja0V4dGVuc2lvbigpICYmICFkZXJpdmVkRWxlbWVudC5ibG9ja0V4dGVuc2lvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiUmVzdHJpY3Rpb24gSW52YWxpZC4gIERlcml2ZWQgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRFbGVtZW50KSArICIgZG9lcyBub3QgYmxvY2sgZXh0ZW5zaW9uIGFzIGRvZXMgdGhlIGJhc2UgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KSwgY29udGV4dCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlRWxlbWVudC5ibG9ja1N1YnN0aXR1dGlvbigpICYmICFkZXJpdmVkRWxlbWVudC5ibG9ja1N1YnN0aXR1dGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiUmVzdHJpY3Rpb24gSW52YWxpZC4gIERlcml2ZWQgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRFbGVtZW50KSArICIgZG9lcyBub3QgYmxvY2sgc3Vic3RpdHV0aW9uIGFzIGRvZXMgdGhlIGJhc2UgIiArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWJhc2VFbGVtZW50KSwgY29udGV4dCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOyAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVEZXJpdmF0aW9uT0soU2NoZW1hVHlwZSBiYXNlVHlwZSwgU2NoZW1hVHlwZSBkZXJpdmVkVHlwZSwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGJvb2xlYW4gdHlwZURlcml2YXRpb25PSyA9IGZhbHNlOworICAgICAgICAvLyAxIElmIEIgYW5kIEQgYXJlIG5vdCB0aGUgc2FtZSB0eXBlIGRlZmluaXRpb24sIHRoZW4gdGhlIHtkZXJpdmF0aW9uIG1ldGhvZH0gb2YgRCBtdXN0IG5vdCBiZSBpbiB0aGUgc3Vic2V0LgorICAgICAgICAvLyAyIE9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZToKKyAgICAgICAgLy8gMi4xIEIgYW5kIEQgbXVzdCBiZSB0aGUgc2FtZSB0eXBlIGRlZmluaXRpb24uCisgICAgICAgIC8vIDIuMiBCIG11c3QgYmUgRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0uCisgICAgICAgIC8vIDIuMyBBbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgIC8vIDIuMy4xIEQncyB7YmFzZSB0eXBlIGRlZmluaXRpb259IG11c3Qgbm90IGJlIHRoZSC3dXItdHlwZSBkZWZpbml0aW9uty4KKyAgICAgICAgLy8gMi4zLjIgVGhlIGFwcHJvcHJpYXRlIGNhc2UgYW1vbmcgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgIC8vIDIuMy4yLjEgSWYgRCdzIHtiYXNlIHR5cGUgZGVmaW5pdGlvbn0gaXMgY29tcGxleCwgdGhlbiBpdCBtdXN0IGJlIHZhbGlkbHkgZGVyaXZlZCBmcm9tIEIgZ2l2ZW4gdGhlIHN1YnNldCBhcyBkZWZpbmVkIGJ5IHRoaXMgY29uc3RyYWludC4KKyAgICAgICAgLy8gMi4zLjIuMiBJZiBEJ3Mge2Jhc2UgdHlwZSBkZWZpbml0aW9ufSBpcyBzaW1wbGUsIHRoZW4gaXQgbXVzdCBiZSB2YWxpZGx5IGRlcml2ZWQgZnJvbSBCIGdpdmVuIHRoZSBzdWJzZXQgYXMgZGVmaW5lZCBpbiBUeXBlIERlcml2YXRpb24gT0sgKFNpbXBsZSkgKKczLjE0LjYpLgorICAgICAgICAvLyAgIFRoaXMgbGluZSB3aWxsIGNoZWNrIGlmIGRlcml2ZWRUeXBlIGlzIGEgc3ViVHlwZSBvZiBiYXNlVHlwZSAoc2hvdWxkIGhhbmRsZSBhbGwgb2YgdGhlIDIueHggY2hlY2tzIGFib3ZlKQorICAgICAgICBpZiAoYmFzZVR5cGUuaXNBc3NpZ25hYmxlRnJvbShkZXJpdmVkVHlwZSkpIHsKKyAgICAgICAgICAgIC8vIE9rIGRlcml2ZWQgdHlwZSBpcyBzdWJ0eXBlIGJ1dCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBvZiB0aGUgZGVyaXZhdGlvbnMgYmV0d2VlbiB0aGUgdHdvIHR5cGVzIGFyZSBieQorICAgICAgICAgICAgLy8gUmVzdHJpY3Rpb24uCisgICAgICAgICAgICB0eXBlRGVyaXZhdGlvbk9LID0gY2hlY2tBbGxEZXJpdmF0aW9uc0ZvclJlc3RyaWN0aW9uKGJhc2VUeXBlLCBkZXJpdmVkVHlwZSwgZXJyb3JzLCBjb250ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGRlcml2ZWQgdHlwZSBpcyBub3QgYSBzdWItdHlwZSBvZiBiYXNlIHR5cGUKKyAgICAgICAgICAgIHR5cGVEZXJpdmF0aW9uT0sgPSBmYWxzZTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdERlcml2ZWRUeXBlTm90U3ViVHlwZUVycm9yKGJhc2VUeXBlLCBkZXJpdmVkVHlwZSksIGNvbnRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0eXBlRGVyaXZhdGlvbk9LOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXREZXJpdmVkVHlwZU5vdFN1YlR5cGVFcnJvcihTY2hlbWFUeXBlIGJhc2VUeXBlLCBTY2hlbWFUeXBlIGRlcml2ZWRUeXBlKSB7CisgICAgICAgIHJldHVybiAiUmVzdHJpY3Rpb24gSW52YWxpZC4gIERlcml2ZWQgVHlwZTogIiArIHByaW50VHlwZShkZXJpdmVkVHlwZSkgKyAiIGlzIG5vdCBhIHN1Yi10eXBlIG9mIEJhc2UgVHlwZTogIiArIHByaW50VHlwZShiYXNlVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0FsbERlcml2YXRpb25zRm9yUmVzdHJpY3Rpb24oU2NoZW1hVHlwZSBiYXNlVHlwZSwgU2NoZW1hVHlwZSBkZXJpdmVkVHlwZSwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7CisKKyAgICAgICAgYm9vbGVhbiBhbGxEZXJpdmF0aW9uc0FyZVJlc3RyaWN0aW9ucyA9IHRydWU7CisgICAgICAgIFNjaGVtYVR5cGUgY3VycmVudFR5cGUgPSBkZXJpdmVkVHlwZTsKKyAgICAgICAgLy8gcnVuIHVwIHRoZSB0eXBlcyBoaWVyYXJjaHkgZnJvbSBkZXJpdmVkIFR5cGUgdG8gYmFzZSBUeXBlIGFuZCBtYWtlIHN1cmUgdGhhdCBhbGwgYXJlIGRlcml2ZWQgYnkKKyAgICAgICAgLy8gICByZXN0cmljdGlvbi4gIElmIGFueSBhcmUgbm90IHRoZW4gdGhpcyBpcyBub3QgYSB2YWxpZCByZXN0cmljdGlvbi4KKyAgICAgICAgd2hpbGUgKCFiYXNlVHlwZS5lcXVhbHMoY3VycmVudFR5cGUpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudFR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKSB7CisgICAgICAgICAgICAgICAgY3VycmVudFR5cGUgPSBjdXJyZW50VHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbGxEZXJpdmF0aW9uc0FyZVJlc3RyaWN0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEFsbERlcml2YXRpb25zQXJlTm90UmVzdHJpY3Rpb25zRXJyb3IoYmFzZVR5cGUsIGRlcml2ZWRUeXBlLCBjdXJyZW50VHlwZSksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsRGVyaXZhdGlvbnNBcmVSZXN0cmljdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEFsbERlcml2YXRpb25zQXJlTm90UmVzdHJpY3Rpb25zRXJyb3IoU2NoZW1hVHlwZSBiYXNlVHlwZSwgU2NoZW1hVHlwZSBkZXJpdmVkVHlwZSwgU2NoZW1hVHlwZSBjdXJyZW50VHlwZSkgeworICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgdHlwZSAiICsgcHJpbnRUeXBlKGRlcml2ZWRUeXBlKSArICIgZGVyaXZlZCBmcm9tIGJhc2UgdHlwZSAiCisgICAgICAgICAgICAgICAgKyBwcmludFR5cGUoYmFzZVR5cGUpICsgIiBoYXMgYW4gaW50ZXJtZWRpYXJ5IHR5cGUgIiArIHByaW50VHlwZShjdXJyZW50VHlwZSkKKyAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCBkZXJpdmVkIGJ5IHJlc3RyaWN0aW9uLiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0lkZW50aXR5Q29uc3RyYWludHMoU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VFbGVtZW50LCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyA1IFIncyBkZWNsYXJhdGlvbidzIHtpZGVudGl0eS1jb25zdHJhaW50IGRlZmluaXRpb25zfSBpcyBhIHN1YnNldCBvZiBCJ3MgZGVjbGFyYXRpb24ncyB7aWRlbnRpdHktY29uc3RyYWludCBkZWZpbml0aW9uc30sIGlmIGFueS4KKyAgICAgICAgYm9vbGVhbiBpZGVudGl0eUNvbnN0cmFpbnRzT0sgPSB0cnVlOworCisgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGJhc2VDb25zdHJhaW50cyA9IGJhc2VFbGVtZW50LmdldElkZW50aXR5Q29uc3RyYWludHMoKTsKKyAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gZGVyaXZlZENvbnN0cmFpbnRzID0gZGVyaXZlZEVsZW1lbnQuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpOworICAgICAgICAvLyBjeWNsZSB0aHJ1IGRlcml2ZWQncyBpZGVudGl0eSBjb25zdHJhaW50cyBhbmQgY2hlY2sgZWFjaCB0byBhc3N1cmUgdGhleSBpbiB0aGUgYXJyYXkgb2YgYmFzZSBjb25zdHJhaW50cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRDb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGRlcml2ZWRDb25zdHJhaW50ID0gZGVyaXZlZENvbnN0cmFpbnRzW2ldOworICAgICAgICAgICAgaWYgKGNoZWNrRm9ySWRlbnRpdHlDb25zdHJhaW50RXhpc3RlbmNlKGJhc2VDb25zdHJhaW50cywgZGVyaXZlZENvbnN0cmFpbnQpKSB7CisgICAgICAgICAgICAgICAgaWRlbnRpdHlDb25zdHJhaW50c09LID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0SWRlbnRpdHlDb25zdHJhaW50c05vdFN1YnNldEVycm9yKGJhc2VFbGVtZW50LCBkZXJpdmVkRWxlbWVudCksIGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWRlbnRpdHlDb25zdHJhaW50c09LOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRJZGVudGl0eUNvbnN0cmFpbnRzTm90U3Vic2V0RXJyb3IoU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VFbGVtZW50LCBTY2hlbWFMb2NhbEVsZW1lbnQgZGVyaXZlZEVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuICJSZXN0cmljdGlvbiBJbnZhbGlkLiAgVGhlIGlkZW50aXR5IGNvbnN0cmFpbnRzIGZvciAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpZGVyaXZlZEVsZW1lbnQpCisgICAgICAgICAgICAgICAgKyAiIGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIGlkZW50aXR5IGNvbnN0cmFpbnRzIGZvciAiICsgcHJpbnRQYXJ0aWNsZSgoU2NoZW1hUGFydGljbGUpYmFzZUVsZW1lbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tGb3JJZGVudGl0eUNvbnN0cmFpbnRFeGlzdGVuY2UoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50W10gYmFzZUNvbnN0cmFpbnRzLCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZGVyaXZlZENvbnN0cmFpbnQpIHsKKyAgICAgICAgLy8gc3BpbiB0aHJ1IHRoZSBiYXNlIGlkZW50aXR5IGNvbnN0cmFpbnRzIGNoZWNrIHRvIHNlZSBpZiBkZXJpdmVkIGNvbnN0cmFpbnQgZXhpc3RzCisgICAgICAgIGJvb2xlYW4gaWRlbnRpdHlDb25zdHJhaW50RXhpc3RzID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZUNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgYmFzZUNvbnN0cmFpbnQgPSBiYXNlQ29uc3RyYWludHNbaV07CisgICAgICAgICAgICBpZiAoYmFzZUNvbnN0cmFpbnQuZ2V0TmFtZSgpLmVxdWFscyhkZXJpdmVkQ29uc3RyYWludC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaWRlbnRpdHlDb25zdHJhaW50RXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWRlbnRpdHlDb25zdHJhaW50RXhpc3RzOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpeGVkKFNjaGVtYUxvY2FsRWxlbWVudCBiYXNlTW9kZWwsIFNjaGVtYUxvY2FsRWxlbWVudCBkZXJpdmVkTW9kZWwsIENvbGxlY3Rpb24gZXJyb3JzLCBYbWxPYmplY3QgY29udGV4dCkgeworICAgICAgICAvLyA0IGVpdGhlciBCJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgYWJzZW50LCBvciBpcyBub3QgZml4ZWQsCisgICAgICAgIC8vIG9yIFIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBmaXhlZCB3aXRoIHRoZSBzYW1lIHZhbHVlLgorICAgICAgICBib29sZWFuIGNoZWNrRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGJhc2VNb2RlbC5pc0ZpeGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChiYXNlTW9kZWwuZ2V0RGVmYXVsdFRleHQoKS5lcXVhbHMoZGVyaXZlZE1vZGVsLmdldERlZmF1bHRUZXh0KCkpKSB7CisgICAgICAgICAgICAgICAgLy8gIFIncyBkZWNsYXJhdGlvbidzIHt2YWx1ZSBjb25zdHJhaW50fSBpcyBmaXhlZCB3aXRoIHRoZSBzYW1lIHZhbHVlLgorICAgICAgICAgICAgICAgIGNoZWNrRml4ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZGVyaXZlZCBlbGVtZW50IGhhcyBhIGZpeGVkIHZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJhc2UgZWxlbWVudAorICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KGZvcm1hdEludmFsaWRGaXhlZEVycm9yKGJhc2VNb2RlbCwgZGVyaXZlZE1vZGVsKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgIGNoZWNrRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vICBCJ3MgZGVjbGFyYXRpb24ncyB7dmFsdWUgY29uc3RyYWludH0gaXMgYWJzZW50LCBvciBpcyBub3QgZml4ZWQsCisgICAgICAgICAgICBjaGVja0ZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2tGaXhlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SW52YWxpZEZpeGVkRXJyb3IoU2NoZW1hTG9jYWxFbGVtZW50IGJhc2VNb2RlbCwgU2NoZW1hTG9jYWxFbGVtZW50IGRlcml2ZWRNb2RlbCkgeworICAgICAgICByZXR1cm4gIlRoZSBEZXJpdmVkIENvbnRlbnQgTW9kZWwgb24gRWxlbWVudDogJyIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoKFNjaGVtYVBhcnRpY2xlKWRlcml2ZWRNb2RlbCkKKyAgICAgICAgICAgICAgICArICInIGhhcyBhIGZpeGVkIHZhbHVlIG9mOiAnIgorICAgICAgICAgICAgICAgICsgZGVyaXZlZE1vZGVsLmdldERlZmF1bHRUZXh0KCkKKyAgICAgICAgICAgICAgICArICInIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBCYXNlIENvbnRlbnQgTW9kZWw6ICciCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKChTY2hlbWFQYXJ0aWNsZSliYXNlTW9kZWwpCisgICAgICAgICAgICAgICAgKyAiJyB3aGF0IGhhcyBhIGZpeGVkIHZhbHVlIG9mOiAnIgorICAgICAgICAgICAgICAgICsgYmFzZU1vZGVsLmdldERlZmF1bHRUZXh0KCkgKyAiJyI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvY2N1cnJlbmNlUmFuZ2VPSyhTY2hlbWFQYXJ0aWNsZSBiYXNlUGFydGljbGUsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRQYXJ0aWNsZSwgQ29sbGVjdGlvbiBlcnJvcnMsIFhtbE9iamVjdCBjb250ZXh0KSB7CisgICAgICAgIGJvb2xlYW4gb2NjdXJyZW5jZVJhbmdlT0sgPSBmYWxzZTsKKyAgICAgICAgLy8gTm90ZTogaW4gdGhlIGZvbGxvd2luZyBjb21tZW50cyAoZnJvbSB0aGUgc2NoZW1hIHNwZWMpIG90aGVyIGlzIHRoZSBiYXNlTW9kZWwKKyAgICAgICAgLy8gMSBJdHMge21pbiBvY2N1cnN9IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgb3RoZXIncyB7bWluIG9jY3Vyc30uCisgICAgICAgIGlmIChkZXJpdmVkUGFydGljbGUuZ2V0TWluT2NjdXJzKCkuY29tcGFyZVRvKGJhc2VQYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKSkgPj0gMCkgeworICAgICAgICAgICAgLy8gMiBvbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6CisgICAgICAgICAgICAvLyAyLjEgVGhlIG90aGVyJ3Mge21heCBvY2N1cnN9IGlzIHVuYm91bmRlZC4KKyAgICAgICAgICAgIGlmIChiYXNlUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gMi4yIEJvdGgge21heCBvY2N1cnN9IGFyZSBudW1iZXJzLCBhbmQgdGhlIHBhcnRpY2xlJ3MgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvdGhlcidzLgorICAgICAgICAgICAgICAgIGlmIChkZXJpdmVkUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgIT0gbnVsbCAmJiBiYXNlUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZFBhcnRpY2xlLmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhiYXNlUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2NjdXJyZW5jZVJhbmdlT0sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VSYW5nZU9LID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydGljbGUuZ2V0TmFtZSgpID09IG51bGwgfHwgZGVyaXZlZFBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yR3JvdXAoYmFzZVBhcnRpY2xlLCBkZXJpdmVkUGFydGljbGUpLCBjb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1heEVycm9yKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlKSwgY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2NjdXJyZW5jZVJhbmdlT0sgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChiYXNlUGFydGljbGUuZ2V0TmFtZSgpID09IG51bGwgfHwgZGVyaXZlZFBhcnRpY2xlLmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvckdyb3VwKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlKSwgY29udGV4dCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdChmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yKGJhc2VQYXJ0aWNsZSwgZGVyaXZlZFBhcnRpY2xlKSwgY29udGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvY2N1cnJlbmNlUmFuZ2VPSzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvckdyb3VwKFNjaGVtYVBhcnRpY2xlIGJhc2VQYXJ0aWNsZSwgU2NoZW1hUGFydGljbGUgZGVyaXZlZFBhcnRpY2xlKSB7CisgICAgICAgIHJldHVybiAiSW52YWxpZCBSZXN0cmljdGlvbi4gIFRoZSBtYXhPY2N1cnMgZm9yIHRoZSAiCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGRlcml2ZWRQYXJ0aWNsZSkKKyAgICAgICAgICAgICAgICArICIgKCIgKyBwcmludE1heE9jY3VycyhkZXJpdmVkUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpCisgICAgICAgICAgICAgICAgKyAiKSBpcyBncmVhdGVyIHRoYW4gdGhhbiB0aGUgbWF4T2NjdXJzIGZvciB0aGUgYmFzZSAiCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VQYXJ0aWNsZSkKKyAgICAgICAgICAgICAgICArICIgKCIgKyBwcmludE1heE9jY3VycyhiYXNlUGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpICsgIikiOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRPY2N1cmVuY2VSYW5nZU1pbkVycm9yR3JvdXAoU2NoZW1hUGFydGljbGUgYmFzZVBhcnRpY2xlLCBTY2hlbWFQYXJ0aWNsZSBkZXJpdmVkUGFydGljbGUpIHsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJlc3RyaWN0aW9uLiAgVGhlIG1pbk9jY3VycyBmb3IgdGhlICIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZFBhcnRpY2xlKQorICAgICAgICAgICAgICAgICsgIiAoIiArIGRlcml2ZWRQYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgKyAiKSBpcyBsZXNzIHRoYW4gdGhhbiB0aGUgbWluT2NjdXJzIGZvciB0aGUgYmFzZSAiCisgICAgICAgICAgICAgICAgKyBwcmludFBhcnRpY2xlKGJhc2VQYXJ0aWNsZSkKKyAgICAgICAgICAgICAgICArICIgKCIgKyBiYXNlUGFydGljbGUuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKSArICIpIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNaW5FcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlRmllbGQsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRGaWVsZCkgeworICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWluT2NjdXJzIGZvciB0aGUgZWxlbWVudDogJyIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZEZpZWxkKQorICAgICAgICAgICAgICAgICsgIicgKCIgKyBkZXJpdmVkRmllbGQuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICsgIikgaXMgbGVzcyB0aGFuIHRoYW4gdGhlIG1pbk9jY3VycyBmb3IgdGhlIGJhc2UgZWxlbWVudDogJyIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoYmFzZUZpZWxkKQorICAgICAgICAgICAgICAgICsgIicgKCIgKyBiYXNlRmllbGQuZ2V0TWluT2NjdXJzKCkudG9TdHJpbmcoKSArICIpIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0T2NjdXJlbmNlUmFuZ2VNYXhFcnJvcihTY2hlbWFQYXJ0aWNsZSBiYXNlRmllbGQsIFNjaGVtYVBhcnRpY2xlIGRlcml2ZWRGaWVsZCkgeworICAgICAgICByZXR1cm4gIkludmFsaWQgUmVzdHJpY3Rpb24uICBUaGUgbWF4T2NjdXJzIGZvciB0aGUgZWxlbWVudDogJyIKKyAgICAgICAgICAgICAgICArIHByaW50UGFydGljbGUoZGVyaXZlZEZpZWxkKQorICAgICAgICAgICAgICAgICsgIicgKCIgKyBwcmludE1heE9jY3VycyhkZXJpdmVkRmllbGQuZ2V0TWF4T2NjdXJzKCkpCisgICAgICAgICAgICAgICAgKyAiKSBpcyBncmVhdGVyIHRoYW4gdGhhbiB0aGUgbWF4T2NjdXJzIGZvciB0aGUgYmFzZSBlbGVtZW50OiAnIgorICAgICAgICAgICAgICAgICsgcHJpbnRQYXJ0aWNsZShiYXNlRmllbGQpICsgIicgKCIgKyBwcmludE1heE9jY3VycyhiYXNlRmllbGQuZ2V0TWF4T2NjdXJzKCkpICsgIikiOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRQYXJ0aWNsZShTY2hlbWFQYXJ0aWNsZSBwYXJ0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxhbGw+IjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgIHJldHVybiAiPGNob2ljZT4iOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAiPGVsZW1lbnQgbmFtZT1cIiIgKyBRTmFtZUhlbHBlci5wcmV0dHkocGFydC5nZXROYW1lKCkpICsgIlwiPiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgIHJldHVybiAiPHNlcXVlbmNlPiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgIHJldHVybiAiPGFueT4iOworICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgcmV0dXJuICI/PyI7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50TWF4T2NjdXJzKEJpZ0ludGVnZXIgYmkpCisgICAgeworICAgICAgICBpZiAoYmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAidW5ib3VuZGVkIjsKKyAgICAgICAgcmV0dXJuIGJpLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmludFR5cGUoU2NoZW1hVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0TmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gUU5hbWVIZWxwZXIucHJldHR5KHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHR5cGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrU3Vic3RpdHV0aW9uR3JvdXBzKFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBlbHRzKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGVsdHMubGVuZ3RoIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGVsdCA9IGVsdHNbaV07CisgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGhlYWQgPSBlbHQuc3Vic3RpdHV0aW9uR3JvdXAoKTsKKworICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIGhlYWRUeXBlID0gaGVhZC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSB0YWlsVHlwZSA9IGVsdC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHBhcnNlVHJlZSA9ICgoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpZWx0KS5fcGFyc2VPYmplY3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoISBoZWFkVHlwZS5pc0Fzc2lnbmFibGVGcm9tKHRhaWxUeXBlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZWx0LmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBtdXN0IGhhdmUgYSB0eXBlIHRoYXQgaXMgZGVyaXZlZCBmcm9tIHRoZSB0eXBlIG9mIGl0cyBzdWJzdGl0dXRpb24gZ3JvdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5JTkNPTlNJU1RFTlRfVFlQRSwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlYWQuZmluYWxFeHRlbnNpb24oKSAmJiBoZWFkLmZpbmFsUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZWx0LmdldE5hbWUoKSkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciBlbGVtZW50IHdpdGggZmluYWw9JyNhbGwnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghIGhlYWRUeXBlLmVxdWFscyh0YWlsVHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZC5maW5hbEV4dGVuc2lvbigpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsVHlwZS5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIGVsZW1lbnQgd2l0aCBmaW5hbD0nZXh0ZW5zaW9uJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVhZC5maW5hbFJlc3RyaWN0aW9uKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbFR5cGUuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGVsdC5nZXROYW1lKCkpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIGVsZW1lbnQgd2l0aCBmaW5hbD0ncmVzdHJpY3Rpb24nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YzZkNAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NDb21wbGV4VHlwZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxOTY0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5BbnlEb2N1bWVudC5Bbnk7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXRCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hQXR0cmlidXRlTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldFNwZWNpZmljYXRpb247CisKK3B1YmxpYyBjbGFzcyBTdHNjQ29tcGxleFR5cGVSZXNvbHZlcgoreworICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAgZ2V0Q29udGVudE1vZGVsKENvbXBsZXhUeXBlIHBhcnNlQ3QpCisgICAgeworICAgICAgICBpZiAocGFyc2VDdC5nZXRBbGwoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ3QuZ2V0QWxsKCk7CisKKyAgICAgICAgaWYgKHBhcnNlQ3QuZ2V0U2VxdWVuY2UoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ3QuZ2V0U2VxdWVuY2UoKTsKKworICAgICAgICBpZiAocGFyc2VDdC5nZXRDaG9pY2UoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ3QuZ2V0Q2hvaWNlKCk7CisKKyAgICAgICAgaWYgKHBhcnNlQ3QuZ2V0R3JvdXAoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ3QuZ2V0R3JvdXAoKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdyb3VwIGdldENvbnRlbnRNb2RlbChDb21wbGV4UmVzdHJpY3Rpb25UeXBlIHBhcnNlUmVzdCkKKyAgICB7CisgICAgICAgIGlmIChwYXJzZVJlc3QuZ2V0QWxsKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3QuZ2V0QWxsKCk7CisKKyAgICAgICAgaWYgKHBhcnNlUmVzdC5nZXRTZXF1ZW5jZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VSZXN0LmdldFNlcXVlbmNlKCk7CisKKyAgICAgICAgaWYgKHBhcnNlUmVzdC5nZXRDaG9pY2UoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmVzdC5nZXRDaG9pY2UoKTsKKworICAgICAgICBpZiAocGFyc2VSZXN0LmdldEdyb3VwKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3QuZ2V0R3JvdXAoKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR3JvdXAgZ2V0Q29udGVudE1vZGVsKEV4dGVuc2lvblR5cGUgcGFyc2VFeHQpCisgICAgeworICAgICAgICBpZiAocGFyc2VFeHQuZ2V0QWxsKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUV4dC5nZXRBbGwoKTsKKworICAgICAgICBpZiAocGFyc2VFeHQuZ2V0U2VxdWVuY2UoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlRXh0LmdldFNlcXVlbmNlKCk7CisKKyAgICAgICAgaWYgKHBhcnNlRXh0LmdldENob2ljZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VFeHQuZ2V0Q2hvaWNlKCk7CisKKyAgICAgICAgaWYgKHBhcnNlRXh0LmdldEdyb3VwKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUV4dC5nZXRHcm91cCgpOworCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hIGdldFNjaGVtYShYbWxPYmplY3QgbykKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gby5uZXdDdXJzb3IoKTsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIGMudG9QYXJlbnQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbyA9IGMuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG8uc2NoZW1hVHlwZSgpLmVxdWFscyhTY2hlbWEudHlwZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU2NoZW1hKSBvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlQ29tcGxleFR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICBDb21wbGV4VHlwZSBwYXJzZUN0ID0gKENvbXBsZXhUeXBlKXNJbXBsLmdldFBhcnNlT2JqZWN0KCk7CisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYShwYXJzZUN0KTsKKworICAgICAgICAvLyBTZXQgYWJzdHJhY3QgJiBmaW5hbCBmbGFncworICAgICAgICBib29sZWFuIGFicyA9IHBhcnNlQ3QuaXNTZXRBYnN0cmFjdCgpID8gcGFyc2VDdC5nZXRBYnN0cmFjdCgpIDogZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZmluYWxFeHQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmaW5hbFJlc3QgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmaW5hbExpc3QgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBmaW5hbFVuaW9uID0gZmFsc2U7CisKKyAgICAgICAgT2JqZWN0IGRzID0gbnVsbDsKKyAgICAgICAgaWYgKHBhcnNlQ3QuaXNTZXRGaW5hbCgpKQorICAgICAgICB7CisgICAgICAgICAgICBkcyA9IHBhcnNlQ3QuZ2V0RmluYWwoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnNwZWN0IHRoZSBmaW5hbCBkZWZhdWx0IGF0dHJpYnV0ZSBvbiB0aGUgc2NoZW1hCisgICAgICAgIGVsc2UgaWYgKHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5pc1NldEZpbmFsRGVmYXVsdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBkcyA9IHNjaGVtYS5nZXRGaW5hbERlZmF1bHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkcyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZHMuZXF1YWxzKCIjYWxsIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gI0FMTCB2YWx1ZQorICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gZmluYWxSZXN0ID0gZmluYWxMaXN0ID0gZmluYWxVbmlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkcyBpbnN0YW5jZW9mIExpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoImV4dGVuc2lvbiIpKQorICAgICAgICAgICAgICAgICAgICBmaW5hbEV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IHRydWU7CisKKy8vIFNpbmNlIGNvbXBsZXggdHlwZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbGlzdCBhbmQgdW5pb25zLCB0aGVzZSBjYW4gcmVtYWluCisvLyBmYWxzZS4gIFBlcmhhcHMgd2Ugc2hvdWxkIHRocm93IGFuIGVycm9yLgorCisvLyAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygibGlzdCIpKQorLy8gICAgICAgICAgICAgICAgICAgIGZpbmFsTGlzdCA9IHRydWU7CisvLyAgICAgICAgICAgICAgICAKKy8vICAgICAgICAgICAgICAgIGlmICgoKExpc3QpZHMpLmNvbnRhaW5zKCJ1bmlvbiIpKQorLy8gICAgICAgICAgICAgICAgICAgIGZpbmFsVW5pb24gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc0ltcGwuc2V0QWJzdHJhY3RGaW5hbChhYnMsIGZpbmFsRXh0LCBmaW5hbFJlc3QsIGZpbmFsTGlzdCwgZmluYWxVbmlvbik7CisKKyAgICAgICAgLy8gU2V0IGJsb2NrIGZsYWdzCisgICAgICAgIGJvb2xlYW4gYmxvY2tFeHQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibG9ja1Jlc3QgPSBmYWxzZTsKKyAgICAgICAgT2JqZWN0IGJsb2NrID0gbnVsbDsKKworICAgICAgICBpZiAocGFyc2VDdC5pc1NldEJsb2NrKCkpCisgICAgICAgICAgICBibG9jayA9IHBhcnNlQ3QuZ2V0QmxvY2soKTsKKyAgICAgICAgZWxzZSBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmlzU2V0QmxvY2tEZWZhdWx0KCkpCisgICAgICAgICAgICBibG9jayA9IHNjaGVtYS5nZXRCbG9ja0RlZmF1bHQoKTsKKworICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgU3RyaW5nICYmIGJsb2NrLmVxdWFscygiI2FsbCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICNBTEwgdmFsdWUKKyAgICAgICAgICAgICAgICBibG9ja0V4dCA9IGJsb2NrUmVzdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChibG9jayBpbnN0YW5jZW9mIExpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoImV4dGVuc2lvbiIpKQorICAgICAgICAgICAgICAgICAgICBibG9ja0V4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClibG9jaykuY29udGFpbnMoInJlc3RyaWN0aW9uIikpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrUmVzdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzSW1wbC5zZXRCbG9jayhibG9ja0V4dCwgYmxvY2tSZXN0KTsKKworICAgICAgICAvLyBWZXJpZnk6IGhhdmUgc2ltcGxlQ29udGVudCwgY29tcGxleENvbnRlbnQsIG9yIGRpcmVjdCBzdHVmZgorICAgICAgICBDb21wbGV4Q29udGVudERvY3VtZW50LkNvbXBsZXhDb250ZW50IHBhcnNlQ2MgPSBwYXJzZUN0LmdldENvbXBsZXhDb250ZW50KCk7CisgICAgICAgIFNpbXBsZUNvbnRlbnREb2N1bWVudC5TaW1wbGVDb250ZW50IHBhcnNlU2MgPSBwYXJzZUN0LmdldFNpbXBsZUNvbnRlbnQoKTsKKyAgICAgICAgR3JvdXAgcGFyc2VHcm91cCA9IGdldENvbnRlbnRNb2RlbChwYXJzZUN0KTsKKyAgICAgICAgaW50IGNvdW50ID0KKyAgICAgICAgICAgICAgICAocGFyc2VDYyAhPSBudWxsID8gMSA6IDApICsKKyAgICAgICAgICAgICAgICAocGFyc2VTYyAhPSBudWxsID8gMSA6IDApICsKKyAgICAgICAgICAgICAgICAocGFyc2VHcm91cCAhPSBudWxsID8gMSA6IDApOworICAgICAgICBpZiAoY291bnQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBjb21wbGV4IHR5cGUgbXVzdCBkZWZpbmUgZWl0aGVyIGEgY29udGVudCBtb2RlbCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgc2ltcGxlQ29udGVudCBvciBjb21wbGV4Q29udGVudCBkZXJpdmF0aW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAibW9yZSB0aGFuIG9uZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0NPTlRFTlRfTU9ERUwsIHBhcnNlQ3QpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIHRoZSBmaXJzdCBvZiBjb21wbGV4Q29udGVudCwgc2ltcGxlQ29udGVudCwgbW9kZWwKKyAgICAgICAgICAgIHBhcnNlR3JvdXAgPSBudWxsOworICAgICAgICAgICAgaWYgKHBhcnNlQ2MgIT0gbnVsbCAmJiBwYXJzZVNjICE9IG51bGwpCisgICAgICAgICAgICAgICAgcGFyc2VTYyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZUNjICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZUNjLmdldEV4dGVuc2lvbigpICE9IG51bGwgJiYgcGFyc2VDYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlc3RyaWN0aW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfQ09OVEVOVF9NT0RFTCwgcGFyc2VDYy5nZXRSZXN0cmljdGlvbigpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTWl4ZWQgY2FuIGJlIHNwZWNpZmllZCBpbiB0d28gcGxhY2VzOiB0aGUgcnVsZXMgYXJlIHRoYXQgQ2Mgd2lucyBvdmVyIEN0IGlmIHByZXNlbnQKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjLW12ZQorICAgICAgICAgICAgYm9vbGVhbiBtaXhlZCA9IHBhcnNlQ2MuaXNTZXRNaXhlZCgpID8gcGFyc2VDYy5nZXRNaXhlZCgpIDogcGFyc2VDdC5nZXRNaXhlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocGFyc2VDYy5nZXRFeHRlbnNpb24oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc29sdmVDY0V4dGVuc2lvbihzSW1wbCwgcGFyc2VDYy5nZXRFeHRlbnNpb24oKSwgbWl4ZWQpOworICAgICAgICAgICAgZWxzZSBpZiAocGFyc2VDYy5nZXRSZXN0cmljdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzb2x2ZUNjUmVzdHJpY3Rpb24oc0ltcGwsIHBhcnNlQ2MuZ2V0UmVzdHJpY3Rpb24oKSwgbWl4ZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNaXNzaW5nIHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbiIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX1JFU1RSSUNUSU9OX09SX0VYVEVOU0lPTiwgcGFyc2VDYyk7CisgICAgICAgICAgICAgICAgcmVzb2x2ZUVycm9yVHlwZShzSW1wbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyc2VTYyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2VTYy5nZXRFeHRlbnNpb24oKSAhPSBudWxsICYmIHBhcnNlU2MuZ2V0UmVzdHJpY3Rpb24oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZXN0cmljdGlvbiBjb25mbGljdHMgd2l0aCBleHRlbnNpb24iLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0NPTlRFTlRfTU9ERUwsIHBhcnNlU2MuZ2V0UmVzdHJpY3Rpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChwYXJzZVNjLmdldEV4dGVuc2lvbigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzb2x2ZVNjRXh0ZW5zaW9uKHNJbXBsLCBwYXJzZVNjLmdldEV4dGVuc2lvbigpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlU2MuZ2V0UmVzdHJpY3Rpb24oKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlc29sdmVTY1Jlc3RyaWN0aW9uKHNJbXBsLCBwYXJzZVNjLmdldFJlc3RyaWN0aW9uKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNaXNzaW5nIHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbiIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX1JFU1RSSUNUSU9OX09SX0VYVEVOU0lPTiwgcGFyc2VTYyk7CisgICAgICAgICAgICAgICAgcmVzb2x2ZUVycm9yVHlwZShzSW1wbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzb2x2ZUJhc2ljQ29tcGxleFR5cGUoc0ltcGwpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHJlc29sdmVFcnJvclR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyB0eXBlIG9mIGVycm9yIHJlY292ZXJ5IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICBzdGF0aWMgdm9pZCByZXNvbHZlQmFzaWNDb21wbGV4VHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIENvbXBsZXhUeXBlIHBhcnNlVHJlZSA9IChDb21wbGV4VHlwZSlzSW1wbC5nZXRQYXJzZU9iamVjdCgpOworICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOworICAgICAgICBHcm91cCBwYXJzZUdyb3VwID0gZ2V0Q29udGVudE1vZGVsKHBhcnNlVHJlZSk7CisKKyAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IGV4dGVuZCBvciByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLgorICAgICAgICB9CisKKyAgICAgICAgaW50IHBhcnRpY2xlQ29kZSA9IHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShwYXJzZUdyb3VwKTsKKworICAgICAgICAvLyB1c2VkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSAoZG9lc24ndCBiZWNvbWUgcGFydCBvZiB0aGUgcmVzdWx0KQorICAgICAgICBNYXAgZWxlbWVudE1vZGVsID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKworICAgICAgICAvLyBidWlsZCBjb250ZW50IG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsID0gdHJhbnNsYXRlQ29udGVudE1vZGVsKHNJbXBsLCBwYXJzZUdyb3VwLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcGFydGljbGVDb2RlLCBhbm9ueW1vdXNUeXBlcywgZWxlbWVudE1vZGVsLCBmYWxzZSwgbnVsbCk7CisKKyAgICAgICAgLy8gZGV0ZWN0IHRoZSBub25lbXB0eSAiYWxsIiBjYXNlIChlbXB0eSA8YWxsPiBkb2Vzbid0IGNvdW50IC0gaXQgbmVlZHMgdG8gYmUgZWxpbWluYXRlZCB0byBtYXRjaCBYU0QgdGVzdCBjYXNlcykKKyAgICAgICAgYm9vbGVhbiBpc0FsbCA9IGNvbnRlbnRNb2RlbCAhPSBudWxsICYmIGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEw7CisgICAgICAgIAorICAgICAgICAvLyBidWlsZCBhdHRyIG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKKyAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIG51bGwsIHRydWUsIG51bGwpOworCisgICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgorICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0VsdCA9IHN1bW1hcml6ZUVsdFdpbGRjYXJkcyhjb250ZW50TW9kZWwpOworICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7CisKKyAgICAgICAgLy8gYnVpbGQgc3RhdGUgbWFjaGluZSBhbmQgdmVyaWZ5IHRoYXQgY29udGVudCBtb2RlbCBpcyBkZXRlcm1pbmlzdGljCisgICAgICAgIGlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRTdGF0ZU1hY2hpbmUoY29udGVudE1vZGVsKTsKKyAgICAgICAgICAgIGlmICghU3RzY1N0YXRlLmdldCgpLm5vVXBhKCkgJiYgISgoU2NoZW1hUGFydGljbGVJbXBsKWNvbnRlbnRNb2RlbCkuaXNEZXRlcm1pbmlzdGljKCkpCisgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJDb250ZW50IG1vZGVsIHZpb2xhdGVzIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSIsIFhtbEVycm9yQ29udGV4dC5OT05ERVRFUk1JTklTVElDX01PREVMLCBwYXJzZUdyb3VwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIHByb3BlcnR5IG1vZGVsCisgICAgICAgIC8vIGVtaXREQkcoIkJ1aWxkaW5nIGNvbnRlbnQgTW9kZWwgZm9yICIgKyBzSW1wbCk7CisgICAgICAgIE1hcCBlbGVtZW50UHJvcGVydHlNb2RlbCA9IGJ1aWxkQ29udGVudFByb3BlcnR5TW9kZWxCeVFOYW1lKGNvbnRlbnRNb2RlbCwgc0ltcGwpOworCisgICAgICAgIC8vIGFkZCBhdHRyaWJ1dGUgcHJvcGVydHkgbW9kZWwKKyAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPSBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKGF0dHJNb2RlbCwgc0ltcGwpOworCisgICAgICAgIC8vIGZpZ3VyZSBvdXQgY29udGVudCB0eXBlCisgICAgICAgIGludCBjb21wbGV4VmFyaWV0eSA9CisgICAgICAgICAgICBwYXJzZVRyZWUuZ2V0TWl4ZWQoKQorICAgICAgICAgICAgICAgID8gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UCisgICAgICAgICAgICAgICAgOiBjb250ZW50TW9kZWwgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVAorICAgICAgICAgICAgICAgICAgICA6IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UOworCisgICAgICAgIC8vIG5vdyBmaWxsIGluIHRoZSBhY3R1YWwgc2NoZW1hIHR5cGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUuZ2V0UmVmKCkpOworICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUuZ2V0QmFzZURlcHRoKCkgKyAxKTsKKyAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04pOworICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoY29tcGxleFZhcmlldHkpOworICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwoY29udGVudE1vZGVsLCBhdHRyTW9kZWwsIGVsZW1lbnRQcm9wZXJ0eU1vZGVsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBpc0FsbCk7CisgICAgICAgIHNJbXBsLnNldEFub255bW91c1R5cGVSZWZzKG1ha2VSZWZBcnJheShhbm9ueW1vdXNUeXBlcykpOworICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkod2NFbHQudHlwZWRXaWxkY2FyZHMsIHdjRWx0Lmhhc1dpbGRjYXJkcywgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCByZXNvbHZlQ2NSZXN0cmljdGlvbihTY2hlbWFUeXBlSW1wbCBzSW1wbCwgQ29tcGxleFJlc3RyaWN0aW9uVHlwZSBwYXJzZVRyZWUsIGJvb2xlYW4gbWl4ZWQpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7CisKKyAgICAgICAgLy8gQlVHQlVHOiBOT1QgWUVUIFJFQUxMWSBJTVBMRU1FTlRFRAorICAgICAgICAvLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZC4iKTsKKworICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlOworICAgICAgICBpZiAocGFyc2VUcmVlLmdldEJhc2UoKSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSBjb21wbGV4Q29udGVudCBtdXN0IGRlZmluZSBhIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX0JBU0UsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICBiYXNlVHlwZSA9IG51bGw7IC8vIHJlY292ZXJ5OiBubyBpbmhlcml0YW5jZS4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCBleHRlbmQgdGhlIG9yaWdpbmFsIHR5cGUgZGVmaW5pdGlvbiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHBhcnNlVHJlZS5nZXRCYXNlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCisgICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFOworCisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmZpbmFsUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCByZXN0cmljdCBhIGZpbmFsIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGp1c3Qga2VlcCBnb2luZworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzaW9uCisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpKQorICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeTogbm8gaW5oZXJpdGFuY2UKKyAgICAgICAgfQorCisgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEdyb3VwIHBhcnNlRWcgPSBnZXRDb250ZW50TW9kZWwocGFyc2VUcmVlKTsKKworICAgICAgICAvLyBkZXRlY3QgdGhlICJhbGwiIGNhc2UKKyAgICAgICAgaW50IHBhcnRpY2xlQ29kZSA9IHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShwYXJzZUVnKTsKKworICAgICAgICAvLyB1c2VkIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSAoZG9lc24ndCBiZWNvbWUgcGFydCBvZiB0aGUgcmVzdWx0KQorICAgICAgICBNYXAgZWxlbWVudE1vZGVsID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKworICAgICAgICAvLyBidWlsZCBjb250ZW50IG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsID0gdHJhbnNsYXRlQ29udGVudE1vZGVsKAorICAgICAgICAgICAgc0ltcGwsIHBhcnNlRWcsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBwYXJ0aWNsZUNvZGUsIGFub255bW91c1R5cGVzLCBlbGVtZW50TW9kZWwsIGZhbHNlLCBudWxsKTsKKworICAgICAgICAvLyBkZXRlY3QgdGhlIG5vbmVtcHR5ICJhbGwiIGNhc2UgKGVtcHR5IDxhbGw+IGRvZXNuJ3QgY291bnQgLSBpdCBuZWVkcyB0byBiZSBlbGltaW5hdGVkIHRvIG1hdGNoIFhTRCB0ZXN0IGNhc2VzKQorICAgICAgICBib29sZWFuIGlzQWxsID0gY29udGVudE1vZGVsICE9IG51bGwgJiYgY29udGVudE1vZGVsLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKKyAgICAgICAgCisgICAgICAgIC8vIGJ1aWxkIGF0dHIgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwgYXR0ck1vZGVsOworICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKKyAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCBmYWxzZSwgbnVsbCk7CisKKyAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCisgICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjRWx0ID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbCk7CisgICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKKworICAgICAgICAvLyBidWlsZCBzdGF0ZSBtYWNoaW5lIGFuZCB2ZXJpZnkgdGhhdCBjb250ZW50IG1vZGVsIGlzIGRldGVybWluaXN0aWMKKyAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZFN0YXRlTWFjaGluZShjb250ZW50TW9kZWwpOworICAgICAgICAgICAgaWYgKCFTdHNjU3RhdGUuZ2V0KCkubm9VcGEoKSAmJiAhKChTY2hlbWFQYXJ0aWNsZUltcGwpY29udGVudE1vZGVsKS5pc0RldGVybWluaXN0aWMoKSkKKyAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkNvbnRlbnQgbW9kZWwgdmlvbGF0ZXMgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIiwgWG1sRXJyb3JDb250ZXh0Lk5PTkRFVEVSTUlOSVNUSUNfTU9ERUwsIHBhcnNlRWcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgcHJvcGVydHkgbW9kZWwKKyAgICAgICAgLy8gZW1pdERCRygiQnVpbGRpbmcgY29udGVudCBNb2RlbCBmb3IgIiArIHNJbXBsKTsKKyAgICAgICAgTWFwIGVsZW1lbnRQcm9wZXJ0eU1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY29udGVudE1vZGVsLCBzSW1wbCk7CisKKyAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAorICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7CisKKyAgICAgICAgLy8gY29tcHV0ZSBlbXB0eS9lbGVtZW50L21peGVkCisgICAgICAgIGludCBjb21wbGV4VmFyaWV0eSA9IChjb250ZW50TW9kZWwgPT0gbnVsbCA/IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCA6CisgICAgICAgICAgICAobWl4ZWQgPyBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgOiBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCkpOworCisgICAgICAgIC8vIG5vdyBmaWxsIGluIHRoZSBhY3R1YWwgc2NoZW1hIHR5cGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UmVmKCkpOworICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKKyAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTik7CisgICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShjb21wbGV4VmFyaWV0eSk7CisgICAgICAgIHNJbXBsLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwsIGF0dHJNb2RlbCwgZWxlbWVudFByb3BlcnR5TW9kZWwsIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwsIGlzQWxsKTsKKyAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7CisgICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeSh3Y0VsdC50eXBlZFdpbGRjYXJkcywgd2NFbHQuaGFzV2lsZGNhcmRzLCB3Y0F0dHIudHlwZWRXaWxkY2FyZHMsIHdjQXR0ci5oYXNXaWxkY2FyZHMpOworICAgIH0KKworICAgIHN0YXRpYyBNYXAgZXh0cmFjdEVsZW1lbnRNb2RlbChTY2hlbWFUeXBlIHNUeXBlKQorICAgIHsKKyAgICAgICAgTWFwIGVsZW1lbnRNb2RlbCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGlmIChzVHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIHNQcm9wcyA9IHNUeXBlLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1Byb3BzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzUHJvcHNbaV0uaXNBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZWxlbWVudE1vZGVsLnB1dChzUHJvcHNbaV0uZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1Byb3BzW2ldLmdldFR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnRNb2RlbDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCByZXNvbHZlQ2NFeHRlbnNpb24oU2NoZW1hVHlwZUltcGwgc0ltcGwsIEV4dGVuc2lvblR5cGUgcGFyc2VUcmVlLCBib29sZWFuIG1peGVkKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSBiYXNlVHlwZTsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgIGJvb2xlYW4gY2hhbWVsZW9uID0gKHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwpOworCisgICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0QmFzZSgpID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIGNvbXBsZXhDb250ZW50IG11c3QgZGVmaW5lIGEgYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0Lk1JU1NJTkdfQkFTRSwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gcmVjb3Zlcnk6IG5vIGluaGVyaXRhbmNlLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNJbXBsLmlzUmVkZWZpbml0aW9uKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kUmVkZWZpbmVkR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IGV4dGVuZCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHBhcnNlVHJlZS5nZXRCYXNlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzaW9uCisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpKQorICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeTogbm8gaW5oZXJpdGFuY2UKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIChiYXNlVHlwZS5pc1NpbXBsZVR5cGUoKSB8fCBiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIHNwZWNpZmllZCBiYXNlIHR5cGUgaXMgbm90IGEgY29tcGxleCB0eXBlIHdpdGggY29tcGxleCBjb250ZW50LiIsIFhtbEVycm9yQ29udGV4dC5DT01QTEVYX0JBU0VfTk9UX0NPTVBMRVgsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKKyAgICAgICAgICAgIGJhc2VUeXBlID0gbnVsbDsgLy8gcmVjb3Zlcnk6IG5vIGluaGVyaXRhbmNlLgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxFeHRlbnNpb24oKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBleHRlbmQgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlVHJlZS54Z2V0QmFzZSgpKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBqdXN0IGtlZXAgZ29pbmcKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gZ2V0IGJhc2UgY29udGVudCBtb2RlbAorICAgICAgICBTY2hlbWFQYXJ0aWNsZSBiYXNlQ29udGVudE1vZGVsID0gKGJhc2VUeXBlID09IG51bGwgPyBudWxsIDogYmFzZVR5cGUuZ2V0Q29udGVudE1vZGVsKCkpOworICAgICAgICAvLyBUT0RPOiBhdHRyaWJ1dGUgbW9kZWwgYWxzbworCisgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE1hcCBiYXNlRWxlbWVudE1vZGVsID0gZXh0cmFjdEVsZW1lbnRNb2RlbChiYXNlVHlwZSk7CisgICAgICAgIEdyb3VwIHBhcnNlRWcgPSBnZXRDb250ZW50TW9kZWwocGFyc2VUcmVlKTsKKyAgICAgICAgCisgICAgICAgIC8vIGJ1aWxkIGV4dGVuc2lvbiBtb2RlbAorICAgICAgICBTY2hlbWFQYXJ0aWNsZSBleHRlbnNpb25Nb2RlbCA9IHRyYW5zbGF0ZUNvbnRlbnRNb2RlbCgKKyAgICAgICAgICAgICAgICBzSW1wbCwgcGFyc2VFZywgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShwYXJzZUVnKSwKKyAgICAgICAgICAgICAgICBhbm9ueW1vdXNUeXBlcywgYmFzZUVsZW1lbnRNb2RlbCwgZmFsc2UsIG51bGwpOworICAgICAgICAKKyAgICAgICAgLy8gYXBwbHkgcnVsZSAjMiBuZWFyIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNjLW12ZTogZW1wdHkgZXh0IG1vZGVsIC0+IG1peGVkIHRha2VuIGZyb20gYmFzZQorICAgICAgICBpZiAoZXh0ZW5zaW9uTW9kZWwgPT0gbnVsbCAmJiAhbWl4ZWQpCisgICAgICAgICAgICBtaXhlZCA9IChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCk7CisgICAgICAgIAorICAgICAgICAvLyBhcHBseSBEZXJpdmF0aW9uIFZhbGlkIChFeHRlbnNpb24pIHJ1bGUgMS40LjIuMgorICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAoYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQpICYmCisgICAgICAgICAgICAgICAgKChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpID09IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCkgIT0gbWl4ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGV4dGVuZCBhbiBlbGVtZW50LW9ubHkgdHlwZSB3aXRoIGEgbWl4ZWQgdHlwZSBvciB2aWNlLXZlcnNhIiwgWG1sRXJyb3JDb250ZXh0LklOQ09OU0lTVEVOVF9UWVBFLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCisgICAgICAgIH0KKworICAgICAgICAvLyBkZXRlY3QgdGhlICJhbGwiIGJhc2UgY2FzZQorICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5oYXNBbGxDb250ZW50KCkgJiYgZXh0ZW5zaW9uTW9kZWwgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBleHRlbmQgYSB0eXBlIHdpdGggJ2FsbCcgY29udGVudCBtb2RlbCIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRVhURU5EX0FMTCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOworICAgICAgICAgICAgZXh0ZW5zaW9uTW9kZWwgPSBudWxsOyAvLyByZWNvdmVyeTogZHJvcCBleHRlbnNpb24KKyAgICAgICAgfQorCisgICAgICAgIC8vIGJ1aWxkIGNvbnRlbnQgbW9kZWwgYW5kIGFub255bW91cyB0eXBlcworICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwgPSBleHRlbmRDb250ZW50TW9kZWwoYmFzZUNvbnRlbnRNb2RlbCwgZXh0ZW5zaW9uTW9kZWwsIHBhcnNlVHJlZSk7CisKKyAgICAgICAgLy8gZGV0ZWN0IHRoZSBub25lbXB0eSAiYWxsIiBjYXNlIChlbXB0eSA8YWxsPiBkb2Vzbid0IGNvdW50IC0gaXQgbmVlZHMgdG8gYmUgZWxpbWluYXRlZCB0byBtYXRjaCBYU0QgdGVzdCBjYXNlcykKKyAgICAgICAgYm9vbGVhbiBpc0FsbCA9IGNvbnRlbnRNb2RlbCAhPSBudWxsICYmIGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5BTEw7CisgICAgICAgIAorICAgICAgICAvLyBidWlsZCBhdHRyIG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbDsKKyAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCisgICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoYmFzZVR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKSk7CisgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKHBhcnNlVHJlZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBzSW1wbCwgbnVsbCwgYXR0ck1vZGVsLCBiYXNlVHlwZSwgdHJ1ZSwgbnVsbCk7CisKKyAgICAgICAgLy8gc3VtbWFyaXplIHdpbGRjYXJkIGluZm9ybWF0aW9uCisgICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjRWx0ID0gc3VtbWFyaXplRWx0V2lsZGNhcmRzKGNvbnRlbnRNb2RlbCk7CisgICAgICAgIFdpbGRjYXJkUmVzdWx0IHdjQXR0ciA9IHN1bW1hcml6ZUF0dHJXaWxkY2FyZHMoYXR0ck1vZGVsKTsKKworICAgICAgICAvLyBidWlsZCBzdGF0ZSBtYWNoaW5lIGFuZCB2ZXJpZnkgdGhhdCBjb250ZW50IG1vZGVsIGlzIGRldGVybWluaXN0aWMKKyAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZFN0YXRlTWFjaGluZShjb250ZW50TW9kZWwpOworICAgICAgICAgICAgaWYgKCFTdHNjU3RhdGUuZ2V0KCkubm9VcGEoKSAmJiAhKChTY2hlbWFQYXJ0aWNsZUltcGwpY29udGVudE1vZGVsKS5pc0RldGVybWluaXN0aWMoKSkKKyAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkNvbnRlbnQgbW9kZWwgdmlvbGF0ZXMgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIiwgWG1sRXJyb3JDb250ZXh0Lk5PTkRFVEVSTUlOSVNUSUNfTU9ERUwsIHBhcnNlRWcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgcHJvcGVydHkgbW9kZWwKKyAgICAgICAgLy8gZW1pdERCRygiQnVpbGRpbmcgY29udGVudCBNb2RlbCBmb3IgIiArIHNJbXBsKTsKKyAgICAgICAgTWFwIGVsZW1lbnRQcm9wZXJ0eU1vZGVsID0gYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoY29udGVudE1vZGVsLCBzSW1wbCk7CisKKyAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAorICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7CisKKyAgICAgICAgLy8gY29tcHV0ZSBlbXB0eS9lbGVtZW50L21peGVkCisgICAgICAgIGludCBjb21wbGV4VmFyaWV0eSA9ICAoIG1peGVkID8gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UIDoKKyAgICAgICAgICAgIChjb250ZW50TW9kZWwgPT0gbnVsbCA/IFNjaGVtYVR5cGUuRU1QVFlfQ09OVEVOVCA6IFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UKSk7CisKKyAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIGJhc2VUeXBlID0gWG1sT2JqZWN0LnR5cGU7CisgICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VUeXBlLmdldFJlZigpKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpLmdldEJhc2VEZXB0aCgpICsgMSk7CisgICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKTsKKyAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KGNvbXBsZXhWYXJpZXR5KTsKKyAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKGNvbnRlbnRNb2RlbCwgYXR0ck1vZGVsLCBlbGVtZW50UHJvcGVydHlNb2RlbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgaXNBbGwpOworICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKKyAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KHdjRWx0LnR5cGVkV2lsZGNhcmRzLCB3Y0VsdC5oYXNXaWxkY2FyZHMsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzb2x2ZVNjUmVzdHJpY3Rpb24oU2NoZW1hVHlwZUltcGwgc0ltcGwsIFNpbXBsZVJlc3RyaWN0aW9uVHlwZSBwYXJzZVRyZWUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIGJhc2VUeXBlOworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSAoc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCk7CisgICAgICAgIGlmIChwYXJzZVRyZWUuZ2V0U2ltcGxlVHlwZSgpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIk5lc3RlZCBzaW1wbGUgdHlwZXMgaW5zaWRlIHNpbXBsZSBjb250ZW50IHJlc3RyaWN0aW9ucyBhcmUgdW5zdXBwb3J0ZWQgLSBpZ25vcmluZyIsIFhtbEVycm9yQ29udGV4dC5JTExFR0FMX1JFU1RSSUNUSU9OLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgbmVzdGVkIHNpbXBsZSB0eXBlIGVsZW1lbnQuCisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRCYXNlKCkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgc2ltcGxlQ29udGVudCByZXN0cmljdGlvbiBtdXN0IGRlZmluZSBhIGJhc2UgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5NSVNTSU5HX0JBU0UsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKKyAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gc3RhdGUuZmluZFJlZGVmaW5lZEdsb2JhbFR5cGUocGFyc2VUcmVlLmdldEJhc2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCksIHNJbXBsLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgIWJhc2VUeXBlLmdldE5hbWUoKS5lcXVhbHMoc0ltcGwuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgdHlwZSBkZWZpbml0aW9uIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShwYXJzZVRyZWUuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHBhcnNlVHJlZS5nZXRCYXNlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VUcmVlLnhnZXRCYXNlKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQorICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY3Vyc2lvbgorICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKTsKKworICAgICAgICBpZiAoYmFzZVR5cGUuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJTaW1wbGUgdHlwZSAnIiArIGJhc2VUeXBlLmdldE5hbWUoKSArICInIGNhbm5vdCBiZSB1c2VkIGFzIHRoZSBiYXNlIHR5cGUgb2YgYSBzaW1wbGUgY29udGVudCByZXN0cmljdGlvbi4gKFVzZSBleHRlbnNpb24gaW5zdGVhZC4pIiwgWG1sRXJyb3JDb250ZXh0LlNJTVBMRV9CQVNFX05PVF9TSU1QTEUsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKKyAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorICAgICAgICAvLyBCVUdCVUc6IGNhbiByZXN0cmljdCBtaXhlZCBjb250ZW50IGFzIGxvbmcgYXMgYWxsIGNoaWxkIGVsZW1lbnRzIGFyZSBvcHRpb25hbAorICAgICAgICBlbHNlIGlmIChiYXNlVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgc3BlY2lmaWVkIGJhc2UgdHlwZSAiICsgYmFzZVR5cGUudG9TdHJpbmcoKSArICIgZG9lcyBub3QgaGF2ZSBzaW1wbGUgY29udGVudC4iLCBYbWxFcnJvckNvbnRleHQuU0lNUExFX0JBU0VfTk9UX1NJTVBMRSwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBleHRlbmRzIEFOWV9TSU1QTEUgdHlwZQorICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZmluYWxSZXN0cmljdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IHJlc3RyaWN0IGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBhdHRyIG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbDsKKyAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCisgICAgICAgICAgICBhdHRyTW9kZWwgPSBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF0dHJNb2RlbCA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVNb2RlbEltcGwoYmFzZVR5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKSk7CisgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKHBhcnNlVHJlZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBzSW1wbCwgbnVsbCwgYXR0ck1vZGVsLCBiYXNlVHlwZSwgZmFsc2UsIG51bGwpOworCisgICAgICAgIC8vIHN1bW1hcml6ZSB3aWxkY2FyZCBpbmZvcm1hdGlvbgorICAgICAgICBXaWxkY2FyZFJlc3VsdCB3Y0F0dHIgPSBzdW1tYXJpemVBdHRyV2lsZGNhcmRzKGF0dHJNb2RlbCk7CisKKyAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZSBwcm9wZXJ0eSBtb2RlbAorICAgICAgICBNYXAgYXR0cmlidXRlUHJvcGVydHlNb2RlbCA9IGJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoYXR0ck1vZGVsLCBzSW1wbCk7CisKKyAgICAgICAgLy8gbm93IGZpbGwgaW4gdGhlIGFjdHVhbCBzY2hlbWEgdHlwZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZihiYXNlVHlwZS5nZXRSZWYoKSk7CisgICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aCgoKFNjaGVtYVR5cGVJbXBsKWJhc2VUeXBlKS5nZXRCYXNlRGVwdGgoKSArIDEpOworICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZShTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OKTsKKyAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMobWFrZVJlZkFycmF5KGFub255bW91c1R5cGVzKSk7CisgICAgICAgIHNJbXBsLnNldFdpbGRjYXJkU3VtbWFyeShRTmFtZVNldC5FTVBUWSwgZmFsc2UsIHdjQXR0ci50eXBlZFdpbGRjYXJkcywgd2NBdHRyLmhhc1dpbGRjYXJkcyk7CisgICAgICAgIHNJbXBsLnNldENvbXBsZXhUeXBlVmFyaWV0eShTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKTsKKyAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKG51bGwsIGF0dHJNb2RlbCwgbnVsbCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgZmFsc2UpOworICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShiYXNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkpOworICAgICAgICBzSW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBudWxsID8gbnVsbCA6IGJhc2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRSZWYoKSk7CisgICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRMaXN0SXRlbVR5cGVSZWYoYmFzZVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCkuZ2V0UmVmKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0VW5pb25NZW1iZXJUeXBlUmVmcyhtYWtlUmVmQXJyYXkoQXJyYXlzLmFzTGlzdChiYXNlVHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCkpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWFsIHdpdGggZmFjZXRzCisgICAgICAgIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIucmVzb2x2ZUZhY2V0cyhzSW1wbCwgcGFyc2VUcmVlLCAoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpOworCisgICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcworICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzb2x2ZVNjRXh0ZW5zaW9uKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBTaW1wbGVFeHRlbnNpb25UeXBlIHBhcnNlVHJlZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGU7CisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICBib29sZWFuIGNoYW1lbGVvbiA9IChzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsKTsKKyAgICAgICAgaWYgKHBhcnNlVHJlZS5nZXRCYXNlKCkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgc2ltcGxlQ29udGVudCBleHRlbnNpb24gbXVzdCBkZWZpbmUgYSBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuTUlTU0lOR19CQVNFLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCisgICAgICAgICAgICBiYXNlVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLCBzSW1wbC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmICFiYXNlVHlwZS5nZXROYW1lKCkuZXF1YWxzKHNJbXBsLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHR5cGUgcmVkZWZpbml0aW9uIG11c3QgZXh0ZW5kIHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHBhcnNlVHJlZS5nZXRCYXNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IocGFyc2VUcmVlLmdldEJhc2UoKSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVRyZWUueGdldEJhc2UoKSk7CisgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGV4dGVuZHMgQU5ZX1NJTVBMRSB0eXBlCisgICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzaW9uCisgICAgICAgIFN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZSgoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpOworCisgICAgICAgIGlmICghYmFzZVR5cGUuaXNTaW1wbGVUeXBlKCkgJiYgYmFzZVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhlIHNwZWNpZmllZCBiYXNlIHR5cGUgIiArIGJhc2VUeXBlLnRvU3RyaW5nKCkgKyAiIGRvZXMgbm90IGhhdmUgc2ltcGxlIGNvbnRlbnQuIiwgWG1sRXJyb3JDb250ZXh0LlNJTVBMRV9CQVNFX05PVF9TSU1QTEUsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogZXh0ZW5kcyBBTllfU0lNUExFIHR5cGUKKyAgICAgICAgICAgIGJhc2VUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsICYmIGJhc2VUeXBlLmZpbmFsRXh0ZW5zaW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZXh0ZW5kIGEgZmluYWwgdHlwZSIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZVRyZWUueGdldEJhc2UoKSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeToganVzdCBrZWVwIGdvaW5nCisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBhdHRyIG1vZGVsIGFuZCBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJNb2RlbDsKKyAgICAgICAgYXR0ck1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbChiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpKTsKKyAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlTW9kZWwocGFyc2VUcmVlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgYW5vbnltb3VzVHlwZXMsIHNJbXBsLCBudWxsLCBhdHRyTW9kZWwsIGJhc2VUeXBlLCB0cnVlLCBudWxsKTsKKworICAgICAgICAvLyBzdW1tYXJpemUgd2lsZGNhcmQgaW5mb3JtYXRpb24KKyAgICAgICAgV2lsZGNhcmRSZXN1bHQgd2NBdHRyID0gc3VtbWFyaXplQXR0cldpbGRjYXJkcyhhdHRyTW9kZWwpOworCisgICAgICAgIC8vIGFkZCBhdHRyaWJ1dGUgcHJvcGVydHkgbW9kZWwKKyAgICAgICAgTWFwIGF0dHJpYnV0ZVByb3BlcnR5TW9kZWwgPSBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKGF0dHJNb2RlbCwgc0ltcGwpOworCisgICAgICAgIC8vIG5vdyBmaWxsIGluIHRoZSBhY3R1YWwgc2NoZW1hIHR5cGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UmVmKCkpOworICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoKChTY2hlbWFUeXBlSW1wbCliYXNlVHlwZSkuZ2V0QmFzZURlcHRoKCkgKyAxKTsKKyAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoU2NoZW1hVHlwZS5EVF9FWFRFTlNJT04pOworICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vbnltb3VzVHlwZXMpKTsKKyAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSwgd2NBdHRyLnR5cGVkV2lsZGNhcmRzLCB3Y0F0dHIuaGFzV2lsZGNhcmRzKTsKKyAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpOworICAgICAgICBzSW1wbC5zZXRDb250ZW50TW9kZWwobnVsbCwgYXR0ck1vZGVsLCBudWxsLCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsLCBmYWxzZSk7CisgICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KGJhc2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSk7CisgICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG51bGwgPyBudWxsIDogYmFzZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldFJlZigpKTsKKyAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRTaW1wbGVWYXJpZXR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5MSVNUOgorICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihiYXNlVHlwZS5nZXRMaXN0SXRlbVR5cGUoKS5nZXRSZWYoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRVbmlvbk1lbWJlclR5cGVSZWZzKG1ha2VSZWZBcnJheShBcnJheXMuYXNMaXN0KGJhc2VUeXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKSkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlYWwgd2l0aCBmYWNldHMKKyAgICAgICAgU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5yZXNvbHZlRmFjZXRzKHNJbXBsLCBudWxsLCAoU2NoZW1hVHlwZUltcGwpYmFzZVR5cGUpOworCisgICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcworICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFdpbGRjYXJkUmVzdWx0CisgICAgeworICAgICAgICBXaWxkY2FyZFJlc3VsdChRTmFtZVNldCB0eXBlZFdpbGRjYXJkcywgYm9vbGVhbiBoYXNXaWxkY2FyZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZWRXaWxkY2FyZHMgPSB0eXBlZFdpbGRjYXJkczsKKyAgICAgICAgICAgIHRoaXMuaGFzV2lsZGNhcmRzID0gaGFzV2lsZGNhcmRzOworICAgICAgICB9CisgICAgICAgIFFOYW1lU2V0IHR5cGVkV2lsZGNhcmRzOworICAgICAgICBib29sZWFuIGhhc1dpbGRjYXJkczsKKyAgICB9CisKKyAgICBzdGF0aWMgV2lsZGNhcmRSZXN1bHQgc3VtbWFyaXplQXR0cldpbGRjYXJkcyhTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhdHRyTW9kZWwpCisgICAgeworICAgICAgICBpZiAoYXR0ck1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCisgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSk7CisgICAgICAgIGlmIChhdHRyTW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuU0tJUCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoUU5hbWVTZXQuRU1QVFksIHRydWUpOworICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KGF0dHJNb2RlbC5nZXRXaWxkY2FyZFNldCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgV2lsZGNhcmRSZXN1bHQgc3VtbWFyaXplRWx0V2lsZGNhcmRzKFNjaGVtYVBhcnRpY2xlIGNvbnRlbnRNb2RlbCkKKyAgICB7CisgICAgICAgIGlmIChjb250ZW50TW9kZWwgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXaWxkY2FyZFJlc3VsdChRTmFtZVNldC5FTVBUWSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgIFFOYW1lU2V0QnVpbGRlciBzZXQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNXaWxkY2FyZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBXaWxkY2FyZFJlc3VsdCBpbm5lciA9IHN1bW1hcml6ZUVsdFdpbGRjYXJkcyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSk7CisgICAgICAgICAgICAgICAgICAgIHNldC5hZGRBbGwoaW5uZXIudHlwZWRXaWxkY2FyZHMpOworICAgICAgICAgICAgICAgICAgICBoYXNXaWxkY2FyZHMgfD0gaW5uZXIuaGFzV2lsZGNhcmRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KHNldC50b1FOYW1lU2V0KCksIGhhc1dpbGRjYXJkcyk7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2lsZGNhcmRSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgIChjb250ZW50TW9kZWwuZ2V0V2lsZGNhcmRQcm9jZXNzKCkgPT0gU2NoZW1hUGFydGljbGUuU0tJUCkgPworICAgICAgICAgICAgICAgICAgICBRTmFtZVNldC5FTVBUWSA6IGNvbnRlbnRNb2RlbC5nZXRXaWxkY2FyZFNldCgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZmFsbHRocm91Z2gKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpbGRjYXJkUmVzdWx0KFFOYW1lU2V0LkVNUFRZLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGVBdHRyaWJ1dGVNb2RlbCgKKyAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLAorICAgICAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcywgU2NoZW1hVHlwZSBvdXRlclR5cGUsCisgICAgICAgICAgICBTZXQgc2VlbkF0dHJpYnV0ZXMsIFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCByZXN1bHQsIFNjaGVtYVR5cGUgYmFzZVR5cGUsIGJvb2xlYW4gZXh0ZW5zaW9uLCBRTmFtZSByZWRlZmluaXRpb25Gb3IpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisgICAgICAgIGlmIChzZWVuQXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgc2VlbkF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBib29sZWFuIHNlZW5XaWxkY2FyZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNlZW5SZWRlZmluaXRpb24gPSBmYWxzZTsKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgYmFzZU1vZGVsID0gbnVsbDsKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCisgICAgICAgICAgICBiYXNlTW9kZWwgPSBiYXNlVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOworCisgICAgICAgIFhtbEN1cnNvciBjdXIgPSBwYXJzZVRyZWUubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zbGF0ZUF0dHJpYnV0ZUNvZGUoY3VyLmdldE5hbWUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBBVFRSSUJVVEVfQ09ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSB4c2RhdHRyID0gKEF0dHJpYnV0ZSljdXIuZ2V0T2JqZWN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc0F0dHIgPSBTdHNjVHJhbnNsYXRvci50cmFuc2xhdGVBdHRyaWJ1dGUoeHNkYXR0ciwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBvdXRlclR5cGUsIGJhc2VNb2RlbCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5BdHRyaWJ1dGVzLmNvbnRhaW5zKHNBdHRyLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZGVmaW5lZCAiLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FUVFJJQlVURV9OQU1FLCB4c2RhdHRyLnhnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgZHVwbGljYXRlIGF0dHIKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZW5BdHRyaWJ1dGVzLmFkZChzQXR0ci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VNb2RlbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBiYXNlQXR0ciA9IGJhc2VNb2RlbC5nZXRBdHRyaWJ1dGUoc0F0dHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlQXR0ciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5jb250YWlucyhzQXR0ci5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IGludHJvZHVjZSBhIG5ldyBhdHRyaWJ1dGUgdGhhdCB3b3VsZCBub3QgYmUgYWxsb3dlZCBpbiB0aGUgYmFzZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpID09IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQW4gZXh0ZW5zaW9uIGNhbm5vdCBwcm9oaWJpdCBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgYmFzZSB0eXBlOyB1c2UgcmVzdHJpY3Rpb24gaW5zdGVhZC4iLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0FUVFJJQlVURV9OQU1FLCB4c2RhdHRyLnhnZXRVc2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VBdHRyLmdldFVzZSgpID09IFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHJlc3RyaWN0aW9uIGNhbm5vdCBtb2RpZnkgYW4gYXR0cmlidXRlIHRoYXQgaXMgcmVxdWlyZWQgaW4gdGhlIGJhc2UgdHlwZSB0byBiZSBwcm9oaWJpdGVkIG9yIG9wdGlvbmFsLiIsIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfQVRUUklCVVRFX05BTUUsIHhzZGF0dHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlUHJvaGliaXRlZEF0dHJpYnV0ZShzQXR0ci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNBdHRyLmdldFVzZSgpICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQXR0cmlidXRlKHNBdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoc0F0dHIuZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsICYmICFzQXR0ci5pc0ZpeGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzQXR0ci5nZXRVc2UoKSAhPSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIG11c3QgYmUgb3B0aW9uYWwgaW4gb3JkZXIgdG8gc3BlY2lmeSBhIGRlZmF1bHQiLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYXR0cik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEFOWV9BVFRSSUJVVEVfQ09ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkIHhzZHdjID0gKFdpbGRjYXJkKWN1ci5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5XaWxkY2FyZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk9ubHkgb25lIGF0dHJpYnV0ZSB3aWxkY2FyZCBhbGxvd2VkIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHRoZSBleHRyYSB3aWxkY2FyZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlZW5XaWxkY2FyZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNMaXN0ID0geHNkd2MueGdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnNUZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAobnNMaXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSAiIyNhbnkiOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBuc1RleHQgPSBuc0xpc3QuZ2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgd2NzZXQgPSBRTmFtZVNldC5mb3JXaWxkY2FyZE5hbWVzcGFjZVN0cmluZyhuc1RleHQsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1vZGVsICE9IG51bGwgJiYgIWV4dGVuc2lvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VNb2RlbC5nZXRXaWxkY2FyZFNldCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgcmVzdHJpY3Rpb24gY2Fubm90IGFkZCBhbnlBdHRyaWJ1dGUgd2hlbiB0aGUgYmFzZSB0eXBlIGRvZXMgbm90IGhhdmUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgZXh0cmEgd2lsZGNhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFiYXNlTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKS5jb250YWluc0FsbCh3Y3NldCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoZSBhbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSciICsgbnNUZXh0ICsgIicgaXMgbm90IGEgc3Vic2V0IG9mIHRoZSBiYXNlIHR5cGUgYW55QXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9BTllfQVRUUklCVVRFLCB4c2R3Yyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSB0aGUgcmVzdHJpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50IHdjcHJvY2VzcyA9IHRyYW5zbGF0ZVdpbGRjYXJkUHJvY2Vzcyh4c2R3Yy54Z2V0UHJvY2Vzc0NvbnRlbnRzKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFdpbGRjYXJkUHJvY2VzcygpID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLk5PTkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRQcm9jZXNzKHdjcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFNldCh3Y3NldC51bmlvbihyZXN1bHQuZ2V0V2lsZGNhcmRTZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRXaWxkY2FyZFByb2Nlc3Mod2Nwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0V2lsZGNhcmRTZXQod2NzZXQuaW50ZXJzZWN0KHJlc3VsdC5nZXRXaWxkY2FyZFNldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBvbGQgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEFUVFJJQlVURV9HUk9VUF9DT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlR3JvdXBSZWYgeHNkYWcgPSAoQXR0cmlidXRlR3JvdXBSZWYpY3VyLmdldE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICBRTmFtZSByZWYgPSB4c2RhZy5nZXRSZWYoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkFUVFJJQlVURV9HUk9VUF9NSVNTSU5HX1JFRiwgeHNkYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIGdyb3VwOworICAgICAgICAgICAgICAgICAgICBpZiAocmVkZWZpbml0aW9uRm9yICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUuZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCwgcmVkZWZpbml0aW9uRm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIHJlZGVmaW5pdGlvbkZvci5lcXVhbHMoZ3JvdXAuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblJlZGVmaW5pdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkFuIGF0dHJpYnV0ZSBncm91cCByZWRlZmluaXRpb24gbXVzdCBpbmNsdWRlIGF0IG1vc3Qgb25lIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgeHNkYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5SZWRlZmluaXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kQXR0cmlidXRlR3JvdXAocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfR1JPVVBfTk9UX0ZPVU5ELCB4c2RhZy54Z2V0UmVmKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ViVGFyZ2V0TmFtZXNwYWNlID0gZ3JvdXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFtZWxlb24gPSBncm91cC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3RhcnRQcm9jZXNzaW5nKGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmVzdGVkUmVkZWZpbml0aW9uRm9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmlzUmVkZWZpbml0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWRlZmluaXRpb25Gb3IgPSBncm91cC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZU1vZGVsKGdyb3VwLmdldFBhcnNlT2JqZWN0KCksIHN1YlRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBhbm9ueW1vdXNUeXBlcywgb3V0ZXJUeXBlLCBzZWVuQXR0cmlidXRlcywgcmVzdWx0LCBiYXNlVHlwZSwgZXh0ZW5zaW9uLCBuZXN0ZWRSZWRlZmluaXRpb25Gb3IpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maW5pc2hQcm9jZXNzaW5nKGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGluZ3MgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSBtb2RlbC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU2NoZW1hUGFydGljbGUgZXh0ZW5kQ29udGVudE1vZGVsKFNjaGVtYVBhcnRpY2xlIGJhc2VDb250ZW50TW9kZWwsIFNjaGVtYVBhcnRpY2xlIGV4dGVuZGVkQ29udGVudE1vZGVsLCBYbWxPYmplY3QgcGFyc2VUcmVlKQorICAgIHsKKyAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY29tcGxleENvbnRlbnQ6OmV4dGVuc2lvbgorICAgICAgICAKKyAgICAgICAgLy8gMi4xIElmIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXMgZW1wdHksIHRoZW4gdGhlIHtjb250ZW50IHR5cGV9IG9mIHRoZSB0eXBlIGRlZmluaXRpb24gt3Jlc29sdmVktyB0byBieSB0aGUgt2FjdHVhbCB2YWx1Zbcgb2YgdGhlIGJhc2UgW2F0dHJpYnV0ZV0gCisgICAgICAgIGlmIChleHRlbmRlZENvbnRlbnRNb2RlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGJhc2VDb250ZW50TW9kZWw7CisgICAgICAgIAorICAgICAgICAvLyAyLjIgSWYgdGhlIHR5cGUgZGVmaW5pdGlvbiC3cmVzb2x2ZWS3IHRvIGJ5IHRoZSC3YWN0dWFsIHZhbHVltyBvZiB0aGUgYmFzZSBbYXR0cmlidXRlXSBoYXMgYSB7Y29udGVudCB0eXBlfSBvZiBlbXB0eSwgdGhlbiBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIHRoZSC3ZXhwbGljaXQgY29udGVudLcgaXRzZWxmOworICAgICAgICBpZiAoYmFzZUNvbnRlbnRNb2RlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGV4dGVuZGVkQ29udGVudE1vZGVsOworICAgICAgICAKKyAgICAgICAgLy8gMi4zIG90aGVyd2lzZSBhIHBhaXIgb2YgbWl4ZWQgb3IgZWxlbWVudE9ubHkgKGRldGVybWluZWQgYXMgcGVyIGNsYXVzZSAxLjIuMSBhYm92ZSkgYW5kIGEgcGFydGljbGUgd2hvc2UgcHJvcGVydGllcyBhcmUgYXMgZm9sbG93czogIAorICAgICAgICBTY2hlbWFQYXJ0aWNsZUltcGwgc1BhcnQgPSBuZXcgU2NoZW1hUGFydGljbGVJbXBsKCk7CisgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CisKKyAgICAgICAgTGlzdCBhY2N1bXVsYXRlID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBhZGRNaW51c1BvaW50bGVzc1BhcnRpY2xlcyhhY2N1bXVsYXRlLCBiYXNlQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CisgICAgICAgIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKGFjY3VtdWxhdGUsIGV4dGVuZGVkQ29udGVudE1vZGVsLCBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSk7CisgICAgICAgIHNQYXJ0LnNldE1pbk9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIHNQYXJ0LnNldE1heE9jY3VycyhCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlQ2hpbGRyZW4oKFNjaGVtYVBhcnRpY2xlW10pCisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZS50b0FycmF5KG5ldyBTY2hlbWFQYXJ0aWNsZVthY2N1bXVsYXRlLnNpemUoKV0pKTsKKworICAgICAgICByZXR1cm4gZmlsdGVyUG9pbnRsZXNzUGFydGljbGVzQW5kVmVyaWZ5QWxsUGFydGljbGVzKHNQYXJ0LCBwYXJzZVRyZWUpOworICAgIH0KKworICAgIHN0YXRpYyBCaWdJbnRlZ2VyIGV4dHJhY3RNaW5PY2N1cnMoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIG5uaSkKKyAgICB7CisgICAgICAgIGlmIChubmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKKyAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBubmkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgQmlnSW50ZWdlciBleHRyYWN0TWF4T2NjdXJzKEFsbE5OSSBhbGxOTkkpCisgICAgeworICAgICAgICBpZiAoYWxsTk5JID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5PTkU7CisKKyAgICAgICAgaWYgKGFsbE5OSS5pbnN0YW5jZVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfREVDSU1BTCkKKyAgICAgICAgICAgIHJldHVybiAoKFhtbEludGVnZXIpYWxsTk5JKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZGVmaW5pdGlvbkZvckdyb3VwCisgICAgeworICAgICAgICBwcml2YXRlIFFOYW1lIGdyb3VwTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5SZWRlZmluaXRpb24gPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgUmVkZWZpbml0aW9uRm9yR3JvdXAoUU5hbWUgZ3JvdXBOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IGdyb3VwTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRTmFtZSBnZXRHcm91cE5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXBOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWVuUmVkZWZpbml0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlZW5SZWRlZmluaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWVuUmVkZWZpbml0aW9uKGJvb2xlYW4gc2VlblJlZGVmaW5pdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zZWVuUmVkZWZpbml0aW9uID0gc2VlblJlZGVmaW5pdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTY2hlbWFQYXJ0aWNsZSB0cmFuc2xhdGVDb250ZW50TW9kZWwoCisgICAgICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSwKKyAgICAgICAgICAgIFhtbE9iamVjdCBwYXJzZVRyZWUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLAorICAgICAgICAgICAgaW50IHBhcnRpY2xlQ29kZSwKKyAgICAgICAgICAgIExpc3QgYW5vbnltb3VzVHlwZXMsIE1hcCBlbGVtZW50TW9kZWwsCisgICAgICAgICAgICBib29sZWFuIGFsbG93RWx0LCBSZWRlZmluaXRpb25Gb3JHcm91cCByZWRlZmluaXRpb25Gb3IpCisgICAgeworICAgICAgICBpZiAocGFyc2VUcmVlID09IG51bGwgfHwgcGFydGljbGVDb2RlID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgLy8gZW1pdERCRygiVHJhbnNsYXRpbmcgY29udGVudCBtb2RlbCBmb3IgIiArIG91dGVyVHlwZSk7CisgICAgICAgIC8vIGluZGVudERCRygpOworICAgICAgICBhc3NlcnQocGFydGljbGVDb2RlICE9IDApOworCisgICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnM7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzOworICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCBncm91cCA9IG51bGw7CisKKyAgICAgICAgU2NoZW1hUGFydGljbGVJbXBsIHNQYXJ0OworCisgICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgPT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBkZXRlY3Qgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQgYW5kIGNvbnN0cnVjdCBhIGNob2ljZQorCisgICAgICAgICAgICBMb2NhbEVsZW1lbnQgcGFyc2VFbHQgPSAoTG9jYWxFbGVtZW50KXBhcnNlVHJlZTsKKyAgICAgICAgICAgIHNQYXJ0ID0gU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlRWxlbWVudChwYXJzZUVsdCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGFub255bW91c1R5cGVzLCBvdXRlclR5cGUpOworICAgICAgICAgICAgaWYgKHNQYXJ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBtaW5PY2N1cnMgPSBleHRyYWN0TWluT2NjdXJzKHBhcnNlRWx0LnhnZXRNaW5PY2N1cnMoKSk7CisgICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlRWx0LnhnZXRNYXhPY2N1cnMoKSk7CisKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgb2xkVHlwZSA9IChTY2hlbWFUeXBlKWVsZW1lbnRNb2RlbC5nZXQoc1BhcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChvbGRUeXBlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWxlbWVudE1vZGVsLnB1dChzUGFydC5nZXROYW1lKCksIHNQYXJ0LmdldFR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc1BhcnQuZ2V0VHlwZSgpLmVxdWFscyhvbGRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVHlwZSBvZiAiICsgUU5hbWVIZWxwZXIucHJldHR5KHNQYXJ0LmdldE5hbWUoKSkgKyAiIGlzIGluY29uc2lzdGVudCB3aXRoIGFub3RoZXIgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhpcyBjb250ZW50IG1vZGVsIiwgWG1sRXJyb3JDb250ZXh0LklOQ09OU0lTVEVOVF9UWVBFLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29kZSA9PSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhbGxvd0VsdCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIHNlcXVlbmNlLCBjaG9pY2Ugb3IgYWxsIGhlcmUiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBwYXJzZVRyZWUpOworICAgICAgICAgICAgQW55IHBhcnNlQW55ID0gKEFueSlwYXJzZVRyZWU7CisgICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKKyAgICAgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRCk7CisgICAgICAgICAgICBRTmFtZVNldCB3Y3NldDsKKyAgICAgICAgICAgIE5hbWVzcGFjZUxpc3QgbnNsaXN0ID0gcGFyc2VBbnkueGdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgaWYgKG5zbGlzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuQUxMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdjc2V0ID0gUU5hbWVTZXQuZm9yV2lsZGNhcmROYW1lc3BhY2VTdHJpbmcobnNsaXN0LmdldFN0cmluZ1ZhbHVlKCksIHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFNldCh3Y3NldCk7CisgICAgICAgICAgICBzUGFydC5zZXRXaWxkY2FyZFByb2Nlc3ModHJhbnNsYXRlV2lsZGNhcmRQcm9jZXNzKHBhcnNlQW55LnhnZXRQcm9jZXNzQ29udGVudHMoKSkpOworICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUFueS54Z2V0TWluT2NjdXJzKCkpOworICAgICAgICAgICAgbWF4T2NjdXJzID0gZXh0cmFjdE1heE9jY3VycyhwYXJzZUFueS54Z2V0TWF4T2NjdXJzKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgR3JvdXAgcGFyc2VHcm91cCA9IChHcm91cClwYXJzZVRyZWU7CisgICAgICAgICAgICBzUGFydCA9IG5ldyBTY2hlbWFQYXJ0aWNsZUltcGwoKTsKKworICAgICAgICAgICAgLy8gZ3JhYiBtaW4vbWF4T2NjdXJzIGJlZm9yZSBkZXJlZmVyZW5jaWduIGdyb3VwIHJlZgorICAgICAgICAgICAgbWluT2NjdXJzID0gZXh0cmFjdE1pbk9jY3VycyhwYXJzZUdyb3VwLnhnZXRNaW5PY2N1cnMoKSk7CisgICAgICAgICAgICBtYXhPY2N1cnMgPSBleHRyYWN0TWF4T2NjdXJzKHBhcnNlR3JvdXAueGdldE1heE9jY3VycygpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSBNT0RFTF9HUk9VUF9DT0RFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFOYW1lIHJlZiA9IHBhcnNlR3JvdXAuZ2V0UmVmKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdyb3VwIHJlZmVyZW5jZSBtdXN0IGhhdmUgYSByZWYgYXR0cmlidXRlIiwgWG1sRXJyb3JDb250ZXh0LkdST1VQX01JU1NJTkdfUkVGLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5maW5kUmVkZWZpbmVkTW9kZWxHcm91cChyZWYsIGNoYW1lbGVvbiA/IHRhcmdldE5hbWVzcGFjZSA6IG51bGwsIHJlZGVmaW5pdGlvbkZvci5nZXRHcm91cE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsICYmIGdyb3VwLmdldE5hbWUoKS5lcXVhbHMocmVkZWZpbml0aW9uRm9yLmdldEdyb3VwTmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5pdGlvbkZvci5pc1NlZW5SZWRlZmluaXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiR3JvdXAgcmVkZWZpbml0aW9uIG11c3QgcmVmZXIgdG8gdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gYXQgbW9zdCBvbmNlIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJpZ0ludGVnZXIuT05FLmVxdWFscyhtYXhPY2N1cnMpIHx8ICFCaWdJbnRlZ2VyLk9ORS5lcXVhbHMobWluT2NjdXJzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiV2hlbiByZWZlcmVuY2luZyB0aGUgb3JpZ2luYWwgZ3JvdXAgZGVmaW5pdGlvbiBpbiBhIHJlZGVmaW5pdGlvbiwgbWF4T2NjdXJzIGFuZCBtaW5PY2N1cnMgbXVzdCBiZSAxIiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWRlZmluaXRpb25Gb3Iuc2V0U2VlblJlZGVmaW5pdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBncm91cCA9IHN0YXRlLmZpbmRNb2RlbEdyb3VwKHJlZiwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5NT0RFTF9HUk9VUF9OT1RfRk9VTkQsICgoR3JvdXApcGFyc2VUcmVlKS54Z2V0UmVmKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmlzUHJvY2Vzc2luZyhncm91cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShncm91cC5nZXROYW1lKCkpICsgIiByZWZlcmVuY2VzIGl0c2VsZiIsIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBubyBnbyB0byB0aGUgY2hpbGQuCisgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IGdyb3VwLmdldFBhcnNlT2JqZWN0KCkubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFydGljbGVDb2RlID0gdHJhbnNsYXRlUGFydGljbGVDb2RlKGN1ci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGVDb2RlICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlVHJlZSA9IHBhcnNlR3JvdXAgPSAoR3JvdXApY3VyLmdldE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlQ29kZSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgZW1wdHkiLCBYbWxFcnJvckNvbnRleHQuRVhQTElDSVRfR1JPVVBfTkVFREVELCBncm91cC5nZXRQYXJzZU9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQUxMICYmIHBhcnRpY2xlQ29kZSAhPSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBwYXJ0aWNsZUNvZGUgIT0gU2NoZW1hUGFydGljbGUuQ0hPSUNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk1vZGVsIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZ3JvdXAuZ2V0TmFtZSgpKSArICIgaXMgbm90IGEgc2VxdWVuY2UsIGFsbCwgb3IgY2hvaWNlIiwgWG1sRXJyb3JDb250ZXh0LkVYUExJQ0lUX0dST1VQX05FRURFRCwgZ3JvdXAuZ2V0UGFyc2VPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UgPSBncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3VGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChwYXJ0aWNsZUNvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICAgICAgc1BhcnQuc2V0UGFydGljbGVUeXBlKHBhcnRpY2xlQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIm1heE9jY3VycyBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gbWluT2NjdXJzIiwgWG1sRXJyb3JDb250ZXh0Lk1JTl9NQVhfT0NDVVJTLCBwYXJzZVRyZWUpOworICAgICAgICAgICAgbWF4T2NjdXJzID0gbWluT2NjdXJzOyAvLyByZW1lZHk6IHBpbiBtYXggdXAgdG8gbWluCisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgbWF4T2NjdXJzLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBsaXN0IG9mIGFub255bW91cyB0eXBlcyBpZiBpdCB3YXMgYWRkZWQKKyAgICAgICAgICAgIGFub255bW91c1R5cGVzLnJlbW92ZShzUGFydC5nZXRUeXBlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIG1heE9jY3VycyA9PSBtaW5PY2N1cnMgPT0gMCwgc2FtZSBhcyBubyBwYXJ0aWNsZSBhdCBhbGwuCisgICAgICAgIH0KKworICAgICAgICBzUGFydC5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKKyAgICAgICAgc1BhcnQuc2V0TWF4T2NjdXJzKG1heE9jY3Vycyk7CisgICAgICAgIAorICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuc3RhcnRQcm9jZXNzaW5nKGdyb3VwKTsKKyAgICAgICAgICAgIHJlZGVmaW5pdGlvbkZvciA9IG51bGw7CisgICAgICAgICAgICBpZiAoZ3JvdXAuaXNSZWRlZmluaXRpb24oKSkKKyAgICAgICAgICAgICAgICByZWRlZmluaXRpb25Gb3IgPSBuZXcgUmVkZWZpbml0aW9uRm9yR3JvdXAoZ3JvdXAuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNDaGlsZHJlbikKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHBhcnNlVHJlZS5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgIExpc3QgYWNjdW11bGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoYm9vbGVhbiBtb3JlID0gY3VyLnRvRmlyc3RDaGlsZCgpOyBtb3JlOyBtb3JlID0gY3VyLnRvTmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZSA9IHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShjdXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhZGRNaW51c1BvaW50bGVzc1BhcnRpY2xlcyhhY2N1bXVsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQ29udGVudE1vZGVsKG91dGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLmdldE9iamVjdCgpLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzVHlwZXMsIGVsZW1lbnRNb2RlbCwgdHJ1ZSwgcmVkZWZpbml0aW9uRm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LmdldFBhcnRpY2xlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNQYXJ0LnNldFBhcnRpY2xlQ2hpbGRyZW4oKFNjaGVtYVBhcnRpY2xlW10pCisgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUudG9BcnJheShuZXcgU2NoZW1hUGFydGljbGVbYWNjdW11bGF0ZS5zaXplKCldKSk7CisgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIFNjaGVtYVBhcnRpY2xlIHJlc3VsdCA9IGZpbHRlclBvaW50bGVzc1BhcnRpY2xlc0FuZFZlcmlmeUFsbFBhcnRpY2xlcyhzUGFydCwgcGFyc2VUcmVlKTsKKworICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZmluaXNoUHJvY2Vzc2luZyhncm91cCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3V0ZGVudERCRygpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgaW50IHRyYW5zbGF0ZVdpbGRjYXJkUHJvY2VzcyhBbnkuUHJvY2Vzc0NvbnRlbnRzIHByb2Nlc3MpCisgICAgeworICAgICAgICBpZiAocHJvY2VzcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVBhcnRpY2xlLlNUUklDVDsKKworICAgICAgICBTdHJpbmcgcHJvY2Vzc1ZhbHVlID0gcHJvY2Vzcy5nZXRTdHJpbmdWYWx1ZSgpOworCisgICAgICAgIGlmICgibGF4Ii5lcXVhbHMocHJvY2Vzc1ZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFQYXJ0aWNsZS5MQVg7CisKKyAgICAgICAgaWYgKCJza2lwIi5lcXVhbHMocHJvY2Vzc1ZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFQYXJ0aWNsZS5TS0lQOworCisgICAgICAgIHJldHVybiBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1Q7CisgICAgfQorCisgICAgc3RhdGljIFNjaGVtYVBhcnRpY2xlIGZpbHRlclBvaW50bGVzc1BhcnRpY2xlc0FuZFZlcmlmeUFsbFBhcnRpY2xlcyhTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBYbWxPYmplY3QgcGFyc2VUcmVlKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnQuZ2V0TWF4T2NjdXJzKCkgIT0gbnVsbCAmJiBwYXJ0LmdldE1heE9jY3VycygpLnNpZ251bSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICBpZiAocGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzU2luZ2xldG9uKCkgJiYgcGFydC5jb3VudE9mUGFydGljbGVDaGlsZCgpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0LmdldFBhcnRpY2xlQ2hpbGQoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKS5sZW5ndGggPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBwYXJ0LmdldE1pbk9jY3VycygpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGlmIChwYXJ0LmlzU2luZ2xldG9uKCkgJiYgcGFydC5jb3VudE9mUGFydGljbGVDaGlsZCgpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0LmdldFBhcnRpY2xlQ2hpbGQoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gaXNBbGwgPSBwYXJ0LmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTDsKKyAgICAgICAgCisgICAgICAgIGlmIChpc0FsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvcy1hbGwtbGltaXRlZAorICAgICAgICAgICAgaWYgKHBhcnQuZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCB8fCBwYXJ0LmdldE1heE9jY3VycygpLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQW4gYWxsIGdyb3VwIG11c3QgaGF2ZSBtYXhPY2N1cnMgPD0gMSIsIFhtbEVycm9yQ29udGV4dC5BTExfQ09OVEVOVFMsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlIGNoaWxkID0gcGFydC5nZXRQYXJ0aWNsZUNoaWxkKGkpOworICAgICAgICAgICAgaWYgKGNoaWxkLmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLkFMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkFuIGFsbCBncm91cCBpcyBvbmx5IGFsbG93ZWQgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgY29udGVudCBtb2RlbCIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRVhURU5EX0FMTCwgcGFyc2VUcmVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGlzQWxsICYmIChjaGlsZC5nZXRQYXJ0aWNsZVR5cGUoKSAhPSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UIHx8IGNoaWxkLmdldE1heE9jY3VycygpID09IG51bGwgfHwgY2hpbGQuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQW4gYWxsIGdyb3VwIGNhbiBjb250YWluIG9ubHkgZWxlbWVudCBwYXJ0aWNsZXMgd2l0aCBtYXhPY2N1cnMgPD0gMSIsIFhtbEVycm9yQ29udGV4dC5BTExfQ09OVEVOVFMsIHBhcnNlVHJlZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBwYXJ0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFkZE1pbnVzUG9pbnRsZXNzUGFydGljbGVzKAorICAgICAgICAgICAgTGlzdCBsaXN0LCBTY2hlbWFQYXJ0aWNsZSBwYXJ0LCBpbnQgcGFyZW50UGFydGljbGVUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudFBhcnRpY2xlVHlwZSA9PSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRSAmJiBwYXJ0LmlzU2luZ2xldG9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbWl0REJHKCJkcm9wcGluZyByZWR1bmRhbnQgc2VxdWVuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50UGFydGljbGVUeXBlID09IFNjaGVtYVBhcnRpY2xlLkNIT0lDRSAmJiBwYXJ0LmlzU2luZ2xldG9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbWl0REJHKCJkcm9wcGluZyByZWR1bmRhbnQgY2hvaWNlIik7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFydC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgbGlzdC5hZGQocGFydCk7CisgICAgfQorCisgICAgc3RhdGljIE1hcCBidWlsZEF0dHJpYnV0ZVByb3BlcnR5TW9kZWxCeVFOYW1lKFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGF0dHJNb2RlbCwgU2NoZW1hVHlwZSBvd25lcikKKyAgICB7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZVtdIGF0dHJ1c2VzID0gYXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJ1c2VzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0LnB1dChhdHRydXNlc1tpXS5nZXROYW1lKCksIGJ1aWxkVXNlUHJvcGVydHkoYXR0cnVzZXNbaV0sIG93bmVyKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgTWFwIGJ1aWxkQ29udGVudFByb3BlcnR5TW9kZWxCeVFOYW1lKFNjaGVtYVBhcnRpY2xlIHBhcnQsIFNjaGVtYVR5cGUgb3duZXIpCisgICAgeworICAgICAgICBpZiAocGFydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKworICAgICAgICBib29sZWFuIGFzU2VxdWVuY2UgPSBmYWxzZTsKKyAgICAgICAgTWFwIG1vZGVsID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHBhcnQuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICBhc1NlcXVlbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQ0hPSUNFOgorICAgICAgICAgICAgICAgIGFzU2VxdWVuY2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBtb2RlbCA9IGJ1aWxkRWxlbWVudFByb3BlcnR5TW9kZWwoKFNjaGVtYUxvY2FsRWxlbWVudClwYXJ0LCBvd25lcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgIG1vZGVsID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBidWlsZCBtb2RlbCBmb3IgY2hpbGRyZW4KKyAgICAgICAgICAgIG1vZGVsID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpbmRlbnREQkcoKTsKKyAgICAgICAgICAgICAgICBNYXAgY2hpbGRNb2RlbCA9IGJ1aWxkQ29udGVudFByb3BlcnR5TW9kZWxCeVFOYW1lKGNoaWxkcmVuW2ldLCBvd25lcik7CisgICAgICAgICAgICAgICAgLy8gb3V0ZGVudERCRygpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGNoaWxkTW9kZWwudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IGlQcm9wID0gKFNjaGVtYVByb3BlcnR5KWoubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgb1Byb3AgPSAoU2NoZW1hUHJvcGVydHlJbXBsKW1vZGVsLmdldChpUHJvcC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAob1Byb3AgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhc1NlcXVlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2NoZW1hUHJvcGVydHlJbXBsKWlQcm9wKS5zZXRNaW5PY2N1cnMoQmlnSW50ZWdlci5aRVJPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnB1dChpUHJvcC5nZXROYW1lKCksIGlQcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IHZlcmlmaWVkIGluIGFuIGVhcmxpZXIgc3RlcAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQob1Byb3AuZ2V0VHlwZSgpLmVxdWFscyhpUHJvcC5nZXRUeXBlKCkpKTsKKworICAgICAgICAgICAgICAgICAgICBtZXJnZVByb3BlcnRpZXMob1Byb3AsIGlQcm9wLCBhc1NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZpbmFsbHkgZGVhbCB3aXRoIG1pbk9jY3VycywgbWF4T2NjdXJzIG92ZXIgd2hvbGUgZ3JvdXAKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgbWluID0gcGFydC5nZXRNaW5PY2N1cnMoKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4ID0gcGFydC5nZXRNYXhPY2N1cnMoKTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gbW9kZWwudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBvUHJvcCA9IChTY2hlbWFQcm9wZXJ0eSlqLm5leHQoKTsKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbk9jY3VycyA9IG9Qcm9wLmdldE1pbk9jY3VycygpOworICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzID0gb1Byb3AuZ2V0TWF4T2NjdXJzKCk7CisKKyAgICAgICAgICAgICAgICBtaW5PY2N1cnMgPSBtaW5PY2N1cnMubXVsdGlwbHkobWluKTsKKyAgICAgICAgICAgICAgICBpZiAobWF4ICE9IG51bGwgJiYgbWF4LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQorICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnMgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4T2NjdXJzICE9IG51bGwgJiYgIW1heE9jY3Vycy5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkKKyAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gbWF4ID09IG51bGwgPyBudWxsIDogbWF4T2NjdXJzLm11bHRpcGx5KG1heCk7CisKKyAgICAgICAgICAgICAgICAoKFNjaGVtYVByb3BlcnR5SW1wbClvUHJvcCkuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7CisgICAgICAgICAgICAgICAgKChTY2hlbWFQcm9wZXJ0eUltcGwpb1Byb3ApLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0KKworICAgIHN0YXRpYyBNYXAgYnVpbGRFbGVtZW50UHJvcGVydHlNb2RlbChTY2hlbWFMb2NhbEVsZW1lbnQgZXBhcnQsIFNjaGVtYVR5cGUgb3duZXIpCisgICAgeworICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoMSk7CisKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgc1Byb3AgPSBidWlsZFVzZVByb3BlcnR5KGVwYXJ0LCBvd25lcik7CisgICAgICAgIHJlc3VsdC5wdXQoc1Byb3AuZ2V0TmFtZSgpLCBzUHJvcCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIFNjaGVtYVByb3BlcnR5IGJ1aWxkVXNlUHJvcGVydHkoU2NoZW1hRmllbGQgdXNlLCBTY2hlbWFUeXBlIG93bmVyKQorICAgIHsKKyAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNQcm9wSW1wbCA9IG5ldyBTY2hlbWFQcm9wZXJ0eUltcGwoKTsKKyAgICAgICAgc1Byb3BJbXBsLnNldE5hbWUodXNlLmdldE5hbWUoKSk7CisgICAgICAgIHNQcm9wSW1wbC5zZXRDb250YWluZXJUeXBlUmVmKG93bmVyLmdldFJlZigpKTsKKyAgICAgICAgc1Byb3BJbXBsLnNldFR5cGVSZWYodXNlLmdldFR5cGUoKS5nZXRSZWYoKSk7CisgICAgICAgIHNQcm9wSW1wbC5zZXRBdHRyaWJ1dGUodXNlLmlzQXR0cmlidXRlKCkpOworICAgICAgICBzUHJvcEltcGwuc2V0RGVmYXVsdCh1c2UuaXNEZWZhdWx0KCkgPyBTY2hlbWFQcm9wZXJ0eS5DT05TSVNURU5UTFkgOiBTY2hlbWFQcm9wZXJ0eS5ORVZFUik7CisgICAgICAgIHNQcm9wSW1wbC5zZXRGaXhlZCh1c2UuaXNGaXhlZCgpID8gU2NoZW1hUHJvcGVydHkuQ09OU0lTVEVOVExZIDogU2NoZW1hUHJvcGVydHkuTkVWRVIpOworICAgICAgICBzUHJvcEltcGwuc2V0TmlsbGFibGUodXNlLmlzTmlsbGFibGUoKSA/IFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWSA6IFNjaGVtYVByb3BlcnR5Lk5FVkVSKTsKKyAgICAgICAgc1Byb3BJbXBsLnNldERlZmF1bHRUZXh0KHVzZS5nZXREZWZhdWx0VGV4dCgpKTsKKyAgICAgICAgc1Byb3BJbXBsLnNldE1pbk9jY3Vycyh1c2UuZ2V0TWluT2NjdXJzKCkpOworICAgICAgICBzUHJvcEltcGwuc2V0TWF4T2NjdXJzKHVzZS5nZXRNYXhPY2N1cnMoKSk7CisKKyAgICAgICAgaWYgKHVzZSBpbnN0YW5jZW9mIFNjaGVtYUxvY2FsRWxlbWVudEltcGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgZWx0ID0gKFNjaGVtYUxvY2FsRWxlbWVudEltcGwpdXNlOworICAgICAgICAgICAgc1Byb3BJbXBsLnNldEFjY2VwdGVkTmFtZXMoZWx0LmFjY2VwdGVkU3RhcnROYW1lcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzUHJvcEltcGw7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWVyZ2VQcm9wZXJ0aWVzKFNjaGVtYVByb3BlcnR5SW1wbCBpbnRvLCBTY2hlbWFQcm9wZXJ0eSBmcm9tLCBib29sZWFuIGFzU2VxdWVuY2UpCisgICAgeworICAgICAgICAvLyBtaW5vY2N1ciwgbWF4b2NjdXIKKyAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnMgPSBpbnRvLmdldE1pbk9jY3VycygpOworICAgICAgICBCaWdJbnRlZ2VyIG1heE9jY3VycyA9IGludG8uZ2V0TWF4T2NjdXJzKCk7CisgICAgICAgIGlmIChhc1NlcXVlbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBtaW5PY2N1cnMgPSBtaW5PY2N1cnMuYWRkKGZyb20uZ2V0TWluT2NjdXJzKCkpOworICAgICAgICAgICAgaWYgKG1heE9jY3VycyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1heE9jY3VycyA9IChmcm9tLmdldE1heE9jY3VycygpID09IG51bGwgPyBudWxsIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnMuYWRkKGZyb20uZ2V0TWF4T2NjdXJzKCkpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbk9jY3VycyA9IG1pbk9jY3Vycy5taW4oZnJvbS5nZXRNaW5PY2N1cnMoKSk7CisgICAgICAgICAgICBpZiAobWF4T2NjdXJzICE9IG51bGwpCisgICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gKGZyb20uZ2V0TWF4T2NjdXJzKCkgPT0gbnVsbCA/IG51bGwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnMubWF4KGZyb20uZ2V0TWF4T2NjdXJzKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpbnRvLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOworICAgICAgICBpbnRvLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOworCisgICAgICAgIC8vIG5pbGxhYmxlLCBkZWZhdWx0LCBmaXhlZAorICAgICAgICBpZiAoZnJvbS5oYXNOaWxsYWJsZSgpICE9IGludG8uaGFzTmlsbGFibGUoKSkKKyAgICAgICAgICAgIGludG8uc2V0TmlsbGFibGUoU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpOworICAgICAgICBpZiAoZnJvbS5oYXNEZWZhdWx0KCkgIT0gaW50by5oYXNEZWZhdWx0KCkpCisgICAgICAgICAgICBpbnRvLnNldERlZmF1bHQoU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpOworICAgICAgICBpZiAoZnJvbS5oYXNGaXhlZCgpICE9IGludG8uaGFzRml4ZWQoKSkKKyAgICAgICAgICAgIGludG8uc2V0Rml4ZWQoU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpOworCisgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgaWYgKGludG8uZ2V0RGVmYXVsdFRleHQoKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZnJvbS5nZXREZWZhdWx0VGV4dCgpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhaW50by5nZXREZWZhdWx0VGV4dCgpLmVxdWFscyhmcm9tLmdldERlZmF1bHRUZXh0KCkpKQorICAgICAgICAgICAgICAgIGludG8uc2V0RGVmYXVsdFRleHQobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU2NoZW1hUGFydGljbGVbXSBlbnN1cmVTdGF0ZU1hY2hpbmUoU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1aWxkU3RhdGVNYWNoaW5lKGNoaWxkcmVuW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hpbGRyZW47CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYnVpbGRTdGF0ZU1hY2hpbmUoU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQorICAgIHsKKyAgICAgICAgaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNjaGVtYVBhcnRpY2xlSW1wbCBwYXJ0SW1wbCA9IChTY2hlbWFQYXJ0aWNsZUltcGwpY29udGVudE1vZGVsOworICAgICAgICBpZiAocGFydEltcGwuaGFzVHJhbnNpdGlvbk5vdGVzKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHN0YXJ0ID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOworICAgICAgICBRTmFtZVNldEJ1aWxkZXIgZXhjbHVkZW5leHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7CisgICAgICAgIGJvb2xlYW4gZGV0ZXJtaW5pc3RpYyA9IHRydWU7CisgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBudWxsOworICAgICAgICBib29sZWFuIGNhbnNraXAgPSAocGFydEltcGwuZ2V0TWluT2NjdXJzKCkuc2lnbnVtKCkgPT0gMCk7CisKKyAgICAgICAgc3dpdGNoIChwYXJ0SW1wbC5nZXRQYXJ0aWNsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgc3RhcnQgYW5kIGV4Y2x1ZGVOZXh0OyBjYW5za2lwIGlzIGFscmVhZHkgY29ycmVjdAorICAgICAgICAgICAgICAgIGlmIChwYXJ0SW1wbC5oYXNUcmFuc2l0aW9uUnVsZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKHBhcnRJbXBsLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZChwYXJ0SW1wbC5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBzdGFydCBhbmQgZXhjbHVkZU5leHQ7IGNhbnNraXAgaXMgYWxyZWFkeSBjb3JyZWN0CisgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKHBhcnRJbXBsLmdldFdpbGRjYXJkU2V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZW5zdXJlU3RhdGVNYWNoaW5lKHBhcnRJbXBsLmdldFBhcnRpY2xlQ2hpbGRyZW4oKSk7CisKKyAgICAgICAgICAgICAgICAvLyBhZGp1c3QgY2Fuc2tpcCBpZiBhbGwgY2hpbGRyZW4gYXJlIHNraXBwYWJsZQorICAgICAgICAgICAgICAgIGNhbnNraXAgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBjYW5za2lwICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2Fuc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBidWJibGUgdXAgbm9uZGV0ZXJtaW5pc3RpYyBiaXQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZGV0ZXJtaW5pc3RpYyAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoISgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2ldKS5pc0RldGVybWluaXN0aWMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGRldGVybWluaXN0aWMgYW5kIGNvbXB1dGUgZXhjbHVkZU5leHQgc2V0CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbCgoKFNjaGVtYVBhcnRpY2xlSW1wbCljaGlsZHJlbltpIC0gMV0pLmdldEV4Y2x1ZGVOZXh0U2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZXJtaW5pc3RpYyAmJiAhZXhjbHVkZW5leHQuaXNEaXNqb2ludCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZHJlbltpXSkuaXNTa2lwcGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVuZXh0LmFkZEFsbCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBuZXh0LCBjb21wdXRlIHN0YXJ0IHNldAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGFydC5hZGRBbGwoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGVuc3VyZVN0YXRlTWFjaGluZShwYXJ0SW1wbC5nZXRQYXJ0aWNsZUNoaWxkcmVuKCkpOworCisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGNhbnNraXAgaWYgYW55IGNoaWxkcmVuIGFyZSBza2lwcGFibGUKKyAgICAgICAgICAgICAgICBjYW5za2lwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFjYW5za2lwICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY2hpbGRyZW5baV0pLmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5za2lwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBidWJibGUgdXAgbm9uZGV0ZXJtaW5pc3RpYyBiaXQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZGV0ZXJtaW5pc3RpYyAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoISgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2ldKS5pc0RldGVybWluaXN0aWMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBzdGFydCBhbmQgZXhjbHVkZU5leHQgc2V0cywgdmVyaWZ5IGRldGVybWluaXN0aWMKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVybWluaXN0aWMgJiYgIXN0YXJ0LmlzRGlzam9pbnQoKGNoaWxkcmVuW2ldKS5hY2NlcHRlZFN0YXJ0TmFtZXMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LmFkZEFsbCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKCgoU2NoZW1hUGFydGljbGVJbXBsKWNoaWxkcmVuW2ldKS5nZXRFeGNsdWRlTmV4dFNldCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5BTEw6CisgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBlbnN1cmVTdGF0ZU1hY2hpbmUocGFydEltcGwuZ2V0UGFydGljbGVDaGlsZHJlbigpKTsKKworICAgICAgICAgICAgICAgIC8vIGFkanVzdCBjYW5za2lwIGlmIGFsbCBjaGlsZHJlbiBhcmUgc2tpcHBhYmxlCisgICAgICAgICAgICAgICAgY2Fuc2tpcCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFjYW5za2lwICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGNoaWxkcmVuW2ldKS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2Fuc2tpcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGJ1YmJsZSB1cCBub25kZXRlcm1pbmlzdGljIGJpdAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBkZXRlcm1pbmlzdGljICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmlzRGV0ZXJtaW5pc3RpYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHN0YXJ0IGFuZCBleGNsdWRlTmV4dCBzZXRzLCB2ZXJpZnkgZGV0ZXJtaW5pc3RpYworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZXJtaW5pc3RpYyAmJiAhc3RhcnQuaXNEaXNqb2ludCgoY2hpbGRyZW5baV0pLmFjY2VwdGVkU3RhcnROYW1lcygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluaXN0aWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQuYWRkQWxsKChjaGlsZHJlbltpXSkuYWNjZXB0ZWRTdGFydE5hbWVzKCkpOworICAgICAgICAgICAgICAgICAgICBleGNsdWRlbmV4dC5hZGRBbGwoKChTY2hlbWFQYXJ0aWNsZUltcGwpY2hpbGRyZW5baV0pLmdldEV4Y2x1ZGVOZXh0U2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2Fuc2tpcCkKKyAgICAgICAgICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKHN0YXJ0KTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIHdpbGRjYXJkLCBhbGwgY2FzZXMgbnlpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHNjaGVtYSBwYXJ0aWNsZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbHkgbG9vcGluZyBsb2dpYworCisgICAgICAgIEJpZ0ludGVnZXIgbWluT2NjdXJzID0gcGFydEltcGwuZ2V0TWluT2NjdXJzKCk7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4T2NjdXJzID0gcGFydEltcGwuZ2V0TWF4T2NjdXJzKCk7CisgICAgICAgIGJvb2xlYW4gY2FubG9vcCA9IChtYXhPY2N1cnMgPT0gbnVsbCB8fCBtYXhPY2N1cnMuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApOworICAgICAgICBib29sZWFuIHZhcmxvb3AgPSAobWF4T2NjdXJzID09IG51bGwgfHwgbWluT2NjdXJzLmNvbXBhcmVUbyhtYXhPY2N1cnMpIDwgMCk7CisKKyAgICAgICAgaWYgKGNhbmxvb3AgJiYgZGV0ZXJtaW5pc3RpYyAmJiAhZXhjbHVkZW5leHQuaXNEaXNqb2ludChzdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwb3NzaWJsZSBsb29waW5nIG5vbmRldGVybWluaXNtLgorICAgICAgICAgICAgLy8gbGV0J3MgdGFrZSBzb21lIHRpbWUgbm93IHRvIHNlZSBpZiBpdCdzIGFjdHVhbGx5IGNhdXNlZAorICAgICAgICAgICAgLy8gYnkgbm9uLXVuaXF1ZS1wYXJ0aWNsZS1hdHRyaWJ1dGUgb3Igbm90LgorICAgICAgICAgICAgUU5hbWVTZXQgc3VzcGVjdFNldCA9IGV4Y2x1ZGVuZXh0LmludGVyc2VjdChzdGFydCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIHNldCBvZiBhbGwgcGFydGljbGVzIHRoYXQgY291bGQgc3RhcnQgdGhpcyBncm91cAorICAgICAgICAgICAgTWFwIHN0YXJ0TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQocGFydEltcGwsIHN1c3BlY3RTZXQsIHN0YXJ0TWFwLCBuZXcgUU5hbWVTZXRCdWlsZGVyKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBzZXQgb2YgYWxsIHBhcnRpY2xlcyB0aGF0IGNvdWxkIGhhdmUgYmVlbiByZXBlYXRlZCByYXRoZXIgdGhhbiBlbmRpbmcgdGhpcyBncm91cAorICAgICAgICAgICAgTWFwIGFmdGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIocGFydEltcGwsIHN1c3BlY3RTZXQsIGFmdGVyTWFwLCBuZXcgUU5hbWVTZXRCdWlsZGVyKCksIHRydWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgYSBtZW1iZXIgb2YgYWZ0ZXIgdGhhdCBpcyBub3QgYSBtZW1iZXIgb2Ygc3RhcnQKKyAgICAgICAgICAgIC8vIGlmIHdlIGNhbiwgdGhlbiBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBpcyBub3QgdW5pcXVlCisgICAgICAgICAgICBkZXRlcm1pbmlzdGljID0gYWZ0ZXJNYXBTdWJzdW1lZEJ5U3RhcnRNYXAoc3RhcnRNYXAsIGFmdGVyTWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YXJsb29wKQorICAgICAgICAgICAgZXhjbHVkZW5leHQuYWRkQWxsKHN0YXJ0KTsKKworICAgICAgICBjYW5za2lwID0gY2Fuc2tpcCB8fCBtaW5PY2N1cnMuc2lnbnVtKCkgPT0gMDsKKworICAgICAgICBwYXJ0SW1wbC5zZXRUcmFuc2l0aW9uUnVsZXMoc3RhcnQudG9RTmFtZVNldCgpLCBjYW5za2lwKTsKKyAgICAgICAgcGFydEltcGwuc2V0VHJhbnNpdGlvbk5vdGVzKGV4Y2x1ZGVuZXh0LnRvUU5hbWVTZXQoKSwgZGV0ZXJtaW5pc3RpYyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWZ0ZXJNYXBTdWJzdW1lZEJ5U3RhcnRNYXAoTWFwIHN0YXJ0TWFwLCBNYXAgYWZ0ZXJNYXApCisgICAgeworICAgICAgICBpZiAoYWZ0ZXJNYXAuc2l6ZSgpID4gc3RhcnRNYXAuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKGFmdGVyTWFwLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RhcnRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUGFydGljbGUgcGFydCA9IChTY2hlbWFQYXJ0aWNsZSlpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpID09IFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhZnRlck1hcC5jb250YWluc0tleShwYXJ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0IHN0YXJ0U2V0ID0gKFFOYW1lU2V0KXN0YXJ0TWFwLmdldChwYXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgUU5hbWVTZXQgYWZ0ZXJTZXQgPSAoUU5hbWVTZXQpYWZ0ZXJNYXAuZ2V0KHBhcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0U2V0LmNvbnRhaW5zQWxsKGFmdGVyU2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZnRlck1hcC5yZW1vdmUocGFydCk7CisgICAgICAgICAgICBpZiAoYWZ0ZXJNYXAuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYWZ0ZXJNYXAuaXNFbXB0eSgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJ0aWNsZXNNYXRjaGluZ1N0YXJ0KFNjaGVtYVBhcnRpY2xlIHBhcnQsIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzdXNwZWN0U2V0LCBNYXAgcmVzdWx0LCBRTmFtZVNldEJ1aWxkZXIgZWxpbWluYXRlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwYXJ0LmdldFBhcnRpY2xlVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFzdXNwZWN0U2V0LmNvbnRhaW5zKHBhcnQuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQocGFydCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZWxpbWluYXRlLmFkZChwYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5XSUxEQ0FSRDoKKyAgICAgICAgICAgICAgICBpZiAoc3VzcGVjdFNldC5pc0Rpc2pvaW50KHBhcnQuZ2V0V2lsZGNhcmRTZXQoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KHBhcnQsIHBhcnQuZ2V0V2lsZGNhcmRTZXQoKS5pbnRlcnNlY3Qoc3VzcGVjdFNldCkpOworICAgICAgICAgICAgICAgIGVsaW1pbmF0ZS5hZGRBbGwocGFydC5nZXRXaWxkY2FyZFNldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hUGFydGljbGVbXSBjaGlsZHJlbiA9IHBhcnQuZ2V0UGFydGljbGVDaGlsZHJlbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChjaGlsZHJlbltpXSwgc3VzcGVjdFNldCwgcmVzdWx0LCBlbGltaW5hdGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuWzBdLmlzU2tpcHBhYmxlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nU3RhcnQoY2hpbGRyZW5bMF0sIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgcmVtYWluaW5nU3VzcGVjdHMgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHN1c3BlY3RTZXQpOworICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgc3VzcGVjdHNUb0VsaW1pbmF0ZSA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChjaGlsZHJlbltpXSwgcmVtYWluaW5nU3VzcGVjdHMsIHJlc3VsdCwgc3VzcGVjdHNUb0VsaW1pbmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGltaW5hdGUuYWRkQWxsKHN1c3BlY3RzVG9FbGltaW5hdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbltpXS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1N1c3BlY3RzLnJlbW92ZUFsbChzdXNwZWN0c1RvRWxpbWluYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTdXNwZWN0cy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdHNUb0VsaW1pbmF0ZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJ0aWNsZXNNYXRjaGluZ0FmdGVyKFNjaGVtYVBhcnRpY2xlIHBhcnQsIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzdXNwZWN0U2V0LCBNYXAgcmVzdWx0LCBRTmFtZVNldEJ1aWxkZXIgZWxpbWluYXRlLCBib29sZWFuIHRvcCkKKyAgICB7CisgICAgICAgIHJlY3Vyc2U6IHN3aXRjaCAocGFydC5nZXRQYXJ0aWNsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlc01hdGNoaW5nQWZ0ZXIoY2hpbGRyZW5baV0sIHN1c3BlY3RTZXQsIHJlc3VsdCwgZWxpbWluYXRlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVBhcnRpY2xlW10gY2hpbGRyZW4gPSBwYXJ0LmdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ0FmdGVyKGNoaWxkcmVuWzBdLCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgcmVtYWluaW5nU3VzcGVjdHMgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHN1c3BlY3RTZXQpOworICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgc3VzcGVjdHNUb0VsaW1pbmF0ZSA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNsZXNNYXRjaGluZ0FmdGVyKGNoaWxkcmVuW2ldLCByZW1haW5pbmdTdXNwZWN0cywgcmVzdWx0LCBzdXNwZWN0c1RvRWxpbWluYXRlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGltaW5hdGUuYWRkQWxsKHN1c3BlY3RzVG9FbGltaW5hdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbltpXS5pc1NraXBwYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTdXNwZWN0cy5yZW1vdmVBbGwoc3VzcGVjdHNUb0VsaW1pbmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nU3VzcGVjdHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJlY3Vyc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZWN0c1RvRWxpbWluYXRlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgcmVjdXJzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciBtaW5PY2N1cnMgPSBwYXJ0LmdldE1pbk9jY3VycygpOworICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhPY2N1cnMgPSBwYXJ0LmdldE1heE9jY3VycygpOworICAgICAgICAgICAgYm9vbGVhbiB2YXJsb29wID0gKG1heE9jY3VycyA9PSBudWxsIHx8IG1pbk9jY3Vycy5jb21wYXJlVG8obWF4T2NjdXJzKSA8IDApOworICAgICAgICAgICAgaWYgKHZhcmxvb3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydGljbGVzTWF0Y2hpbmdTdGFydChwYXJ0LCBzdXNwZWN0U2V0LCByZXN1bHQsIGVsaW1pbmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2RlRm9yTmFtZUVudHJ5CisgICAgeworICAgICAgICBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lIG5hbWUsIGludCBjb2RlKQorICAgICAgICAgICAgeyB0aGlzLm5hbWUgPSBuYW1lOyB0aGlzLmNvZGUgPSBjb2RlOyB9CisgICAgICAgIHB1YmxpYyBRTmFtZSBuYW1lOworICAgICAgICBwdWJsaWMgaW50IGNvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVMX0dST1VQX0NPREUgPSAxMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb2RlRm9yTmFtZUVudHJ5W10gcGFydGljbGVDb2RlcyA9IG5ldyBDb2RlRm9yTmFtZUVudHJ5W10KKyAgICB7CisgICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYWxsIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLkFMTCksCisgICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygic2VxdWVuY2UiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0UpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImNob2ljZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0UpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImVsZW1lbnQiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hUGFydGljbGUuRUxFTUVOVCksCisgICAgICAgIG5ldyBDb2RlRm9yTmFtZUVudHJ5KFFOYW1lSGVscGVyLmZvckxOUygiYW55IiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEKSwKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJncm91cCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBNT0RFTF9HUk9VUF9DT0RFKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIHBhcnRpY2xlQ29kZU1hcCA9IGJ1aWxkUGFydGljbGVDb2RlTWFwKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXAgYnVpbGRQYXJ0aWNsZUNvZGVNYXAoKQorICAgIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVDb2Rlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdC5wdXQocGFydGljbGVDb2Rlc1tpXS5uYW1lLCAgbmV3IEludGVnZXIocGFydGljbGVDb2Rlc1tpXS5jb2RlKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbGF0ZVBhcnRpY2xlQ29kZShHcm91cCBwYXJzZUVnKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnNlRWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlUGFydGljbGVDb2RlKHBhcnNlRWcubmV3Q3Vyc29yKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgdHJhbnNsYXRlUGFydGljbGVDb2RlKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKXBhcnRpY2xlQ29kZU1hcC5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9DT0RFID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVBfQ09ERSA9IDEwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5ZX0FUVFJJQlVURV9DT0RFID0gMTAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29kZUZvck5hbWVFbnRyeVtdIGF0dHJpYnV0ZUNvZGVzID0gbmV3IENvZGVGb3JOYW1lRW50cnlbXQorICAgIHsKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhdHRyaWJ1dGUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgQVRUUklCVVRFX0NPREUpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoImF0dHJpYnV0ZUdyb3VwIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIEFUVFJJQlVURV9HUk9VUF9DT0RFKSwKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJhbnlBdHRyaWJ1dGUiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgQU5ZX0FUVFJJQlVURV9DT0RFKSwKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGF0dHJpYnV0ZUNvZGVNYXAgPSBidWlsZEF0dHJpYnV0ZUNvZGVNYXAoKTsKKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBidWlsZEF0dHJpYnV0ZUNvZGVNYXAoKQorICAgIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlQ29kZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHQucHV0KGF0dHJpYnV0ZUNvZGVzW2ldLm5hbWUsICBuZXcgSW50ZWdlcihhdHRyaWJ1dGVDb2Rlc1tpXS5jb2RlKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGludCB0cmFuc2xhdGVBdHRyaWJ1dGVDb2RlKFFOYW1lIGN1cnJlbnROYW1lKQorICAgIHsKKyAgICAgICAgSW50ZWdlciByZXN1bHQgPSAoSW50ZWdlcilhdHRyaWJ1dGVDb2RlTWFwLmdldChjdXJyZW50TmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY0ltcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjMzhhMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NJbXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsNzA3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5SZWRlZmluZURvY3VtZW50LlJlZGVmaW5lOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQuU2NoZW1hOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbXBvcnREb2N1bWVudC5JbXBvcnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQuSW5jbHVkZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JDb250ZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworCitwdWJsaWMgY2xhc3MgU3RzY0ltcG9ydGVyCit7CisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUb1Byb2Nlc3NbXSByZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKFNjaGVtYVtdIHN0YXJ0V2l0aCkKKyAgICB7CisgICAgICAgIERvd25sb2FkVGFibGUgZW5naW5lID0gbmV3IERvd25sb2FkVGFibGUoc3RhcnRXaXRoKTsKKyAgICAgICAgcmV0dXJuIGVuZ2luZS5yZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY2hlbWFUb1Byb2Nlc3MKKyAgICB7CisgICAgICAgIHByaXZhdGUgU2NoZW1hIHNjaGVtYTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlOworICAgICAgICBwcml2YXRlIFJlZGVmaW5lIHJlZGVmaW5lOworCisgICAgICAgIHB1YmxpYyBTY2hlbWFUb1Byb2Nlc3MoU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUmVkZWZpbmUgcmVkZWZpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOworICAgICAgICAgICAgdGhpcy5jaGFtZWxlb25OYW1lc3BhY2UgPSBjaGFtZWxlb25OYW1lc3BhY2U7CisgICAgICAgICAgICB0aGlzLnJlZGVmaW5lID0gcmVkZWZpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNjaGVtYSB0byBwYXJzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNjaGVtYTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFzZSBVUkkgZm9yIHRoaXMgc3RwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2NoZW1hLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWRlZmluZSBlbGVtZW50LCBpZiBwcm9jZXNzZWQgdmlhIHJlZGVmaW5lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVkZWZpbmUgZ2V0UmVkZWZpbmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVkZWZpbmU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNoYW1lbGVvbiBuYW1lc3BhY2UuIE51bGwgaWYgdGhpcyBzY2hlbWEgaXMgbm90IGJlaW5nIHRyZWF0ZWQKKyAgICAgICAgICogYXMgYSBjaGFtZWxlb24uIChUaGUgb3JkaW5hcnkgdGFyZ2V0TmFtZXNwYWNlIHdpbGwganVzdCBiZSBleHRyYWN0ZWQKKyAgICAgICAgICogZnJvbSB0aGUgc3ludGF4IG9mIHRoZSBzY2hlbWEuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFtZWxlb25OYW1lc3BhY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hhbWVsZW9uTmFtZXNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTY2hlbWFUb1Byb2Nlc3MpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGZpbmFsIFNjaGVtYVRvUHJvY2VzcyBzY2hlbWFUb1Byb2Nlc3MgPSAoU2NoZW1hVG9Qcm9jZXNzKSBvOworCisgICAgICAgICAgICBpZiAoY2hhbWVsZW9uTmFtZXNwYWNlICE9IG51bGwgPyAhY2hhbWVsZW9uTmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUb1Byb2Nlc3MuY2hhbWVsZW9uTmFtZXNwYWNlKSA6IHNjaGVtYVRvUHJvY2Vzcy5jaGFtZWxlb25OYW1lc3BhY2UgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHJlZGVmaW5lICE9IG51bGwgPyAhcmVkZWZpbmUuZXF1YWxzKHNjaGVtYVRvUHJvY2Vzcy5yZWRlZmluZSkgOiBzY2hlbWFUb1Byb2Nlc3MucmVkZWZpbmUgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKCFzY2hlbWEuZXF1YWxzKHNjaGVtYVRvUHJvY2Vzcy5zY2hlbWEpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBzY2hlbWEuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKGNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsID8gY2hhbWVsZW9uTmFtZXNwYWNlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKHJlZGVmaW5lICE9IG51bGwgPyByZWRlZmluZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfVVJMX1BSRUZJWCA9ICJwcm9qZWN0Oi8vbG9jYWwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VVUkxGb3JEb2MoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIFN0cmluZyBwYXRoID0gb2JqLmRvY3VtZW50UHJvcGVydGllcygpLmdldFNvdXJjZU5hbWUoKTsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcmV0dXJuIFBST0pFQ1RfVVJMX1BSRUZJWCArIHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOworCisgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBVUkw/CisgICAgICAgIGludCBjb2xvbiA9IHBhdGguaW5kZXhPZignOicpOworICAgICAgICBpZiAoY29sb24gPiAxICYmIHBhdGguc3Vic3RyaW5nKDAsIGNvbG9uKS5tYXRjaGVzKCJeXFx3KyQiKSkKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICAgIHJldHVybiBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgcGFyc2VVUkkoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gc3ludGF4KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy93b3JrYXJvdW5kIGZvciBTdW4gYnVnICMgNDcyMzcyNgorICAgIHByaXZhdGUgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBTdHJpbmcgY2hpbGQpCisgICAgeworICAgICAgICBVUkkgcnVyaSA9IGJhc2UucmVzb2x2ZShjaGlsZCk7CisgICAgICAgIAorICAgICAgICAvL2ZpeCB1cCBub3JtYWxpemF0aW9uIGJ1ZworICAgICAgICBpZiAoImZpbGUiLmVxdWFscyhydXJpLmdldFNjaGVtZSgpKSAmJiAhIGNoaWxkLmVxdWFscyhydXJpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhc2UuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikgJiYgIXJ1cmkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiLy8vIi5jb25jYXQocnVyaS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnVyaSA9IG5ldyBVUkkoImZpbGUiLCBudWxsLCBwYXRoLCBydXJpLmdldFF1ZXJ5KCksIHJ1cmkuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzKQorICAgICAgICAgICAgICAgIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ1cmk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3dubG9hZFRhYmxlCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogTmFtZXNwYWNlL3NjaGVtYUxvY2F0aW9uIHBhaXIuCisgICAgICAgICAqCisgICAgICAgICAqIERvd25sb2FkZWQgc2NoZW1hcyBhcmUgaW5kZXhlZCBieSBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uLCBhbmQgYm90aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBwZXJmZWN0IG1hdGNoIGlzIHByZWZlcnJlZCwgYnV0IGEgbWF0Y2gtYnktbmFtZXNwYWNlIGlzIGFjY2VwdGVkLgorICAgICAgICAgKiBBIG1hdGNoLWJ5LXNjaGVtYUxvY2F0aW9uIGlzIG9ubHkgYWNjZXB0ZWQgZm9yIGluY2x1ZGVzIChub3QgaW1wb3J0cykuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOc0xvY1BhaXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25VUkw7CisKKyAgICAgICAgICAgIHB1YmxpYyBOc0xvY1BhaXIoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2F0aW9uVVJMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOworICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb25VUkwgPSBsb2NhdGlvblVSTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBFbXB0eSBzdHJpbmcgZm9yIG5vLW5hbWVzcGFjZSwgbnVsbCBmb3IgbmFtZXNwYWNlLW5vdC1wYXJ0LW9mLWtleQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uVVJMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE5zTG9jUGFpcikpIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIGZpbmFsIE5zTG9jUGFpciBuc0xvY1BhaXIgPSAoTnNMb2NQYWlyKSBvOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uVVJMICE9IG51bGwgPyAhbG9jYXRpb25VUkwuZXF1YWxzKG5zTG9jUGFpci5sb2NhdGlvblVSTCkgOiBuc0xvY1BhaXIubG9jYXRpb25VUkwgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCA/ICFuYW1lc3BhY2VVUkkuZXF1YWxzKG5zTG9jUGFpci5uYW1lc3BhY2VVUkkpIDogbnNMb2NQYWlyLm5hbWVzcGFjZVVSSSAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAobmFtZXNwYWNlVVJJICE9IG51bGwgPyBuYW1lc3BhY2VVUkkuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKGxvY2F0aW9uVVJMICE9IG51bGwgPyBsb2NhdGlvblVSTC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2VzdEtleQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gX2RpZ2VzdDsKKyAgICAgICAgICAgIGludCBfaGFzaENvZGU7CisgICAgICAgICAgICBEaWdlc3RLZXkoYnl0ZVtdIGRpZ2VzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZGlnZXN0ID0gZGlnZXN0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNCAmJiBpIDwgZGlnZXN0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2hhc2hDb2RlID0gX2hhc2hDb2RlIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIF9oYXNoQ29kZSA9IF9oYXNoQ29kZSArIGRpZ2VzdFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGlnZXN0S2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKF9kaWdlc3QsICgoRGlnZXN0S2V5KW8pLl9kaWdlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2hhc2hDb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNYXAgc2NoZW1hQnlOc0xvY1BhaXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcCBzY2hlbWFCeURpZ2VzdEtleSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByaXZhdGUgTGlua2VkTGlzdCBzY2FuTmVlZGVkID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgcHJpdmF0ZSBTZXQgZW1wdHlOYW1lc3BhY2VTY2hlbWFzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgcHJpdmF0ZSBTZXQgc2Nhbm5lZEFscmVhZHkgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBwcml2YXRlIFNldCBmYWlsZWREb3dubG9hZHMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIHByaXZhdGUgU2NoZW1hIGRvd25sb2FkU2NoZW1hKFhtbE9iamVjdCByZWZlcmVuY2VkQnksIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvblVSTCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm8gbG9jYXRpb24gVVJMIHByb3ZpZGVkPyAgVGhlbiBub3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZpcnN0IHJlc29sdmUgcmVsYXRpdmUgVVJMcyB3aXRoIHJlc3BlY3QgdG8gYmFzZSBVUkwgZm9yIGRvYworICAgICAgICAgICAgVVJJIGJhc2VVUkkgPSBwYXJzZVVSSShiYXNlVVJMRm9yRG9jKHJlZmVyZW5jZWRCeSkpOworICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlVVJMID0gYmFzZVVSSSA9PSBudWxsID8gbG9jYXRpb25VUkwgOiByZXNvbHZlKGJhc2VVUkksIGxvY2F0aW9uVVJMKS50b1N0cmluZygpOworCisgICAgICAgICAgICAvLyBwcm9iZSAxOiBucyt1cmwgLSBwZXJmZWN0IG1hdGNoCisgICAgICAgICAgICBpZiAoYWJzb2x1dGVVUkwgIT0gbnVsbCAmJiB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWEgcmVzdWx0ID0gKFNjaGVtYSlzY2hlbWFCeU5zTG9jUGFpci5nZXQobmV3IE5zTG9jUGFpcih0YXJnZXROYW1lc3BhY2UsIGFic29sdXRlVVJMKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIHByb2JlIDI6IHdlIGhhdmUgcHJlZXhpc3Rpbmcga25vd2xlZGdlIG9mIHRoaXMgbmFtZXNwYWNlLAorICAgICAgICAgICAgLy8gZWl0aGVyIGZyb20gYW5vdGhlciBzY2hlbWEgZmlsZSBvciBmcm9tIHRoZSBsaW5rZXIuCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZG93bmxvYWRpbmcgdGhlIGdpdmVuIFVSTCwgc2tpcCBpdCBzaWxlbnRseSBpZiB0aGUKKyAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBpcyBhbHJlYWR5IHJlcHJlc2VudGVkIGJ5IGEgZmlsZSB3ZSBoYXZlLgorICAgICAgICAgICAgLy8gQWxzbywgc3VwcHJlc3MgZG93bmxvYWRzIG9mIFVSTHMgdG8gbmFtZXNwYWNlcyB0aGF0IGFyZSBhbHJlYWR5CisgICAgICAgICAgICAvLyBrbm93biBieSB0aGUgbGlua2VyLgorICAgICAgICAgICAgLy8gKFdlIG5ldmVyIGFzc3VtZSBwcmVleGlzdGluZyBrbm93bGVkZ2Ugb2YgdGhlIG5vLW5hbWVzcGFjZSwKKyAgICAgICAgICAgIC8vIGV2ZW4gaWYgd2UgaGF2ZSBzb21lIGRlZmluaXRpb25zLCBzaW5jZSBpdCdzIGxpa2VseSB0aGF0CisgICAgICAgICAgICAvLyBtb3JlIHRoYW4gb25lIHBlcnNvbiBpcyBwbGF5aW5nIGluIHRoZSBuby1uYW1lc3BhY2UgYXQgb25jZS4pCisgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHRoZSBVUkwgaXMgbm90IG9uZSB0byBkb3dubG9hZDsgc2hvdWxkIHdlIGFzc3VtZSB3ZSBrbm93IGFib3V0IHRoZSBuYW1lc3BhY2U/CisgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5zaG91bGREb3dubG9hZFVSSShhYnNvbHV0ZVVSTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBzY2hlbWEgcmVwcmVzZW50aW5nIHRoaXMgbmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHNraXAgdGhpcyBVUkwgc2lsZW50bHkgd2l0aG91dCBwcm9kdWNpbmcgYW4gZXJyb3IuCisgICAgICAgICAgICAgICAgICAgIFNjaGVtYSByZXN1bHQgPSAoU2NoZW1hKXNjaGVtYUJ5TnNMb2NQYWlyLmdldChuZXcgTnNMb2NQYWlyKHRhcmdldE5hbWVzcGFjZSwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5rZXIgYWxyZWFkeSBrbm93cyBhYm91dCB0aGlzIG5hbWVzcGFjZSwgc2tpcAorICAgICAgICAgICAgICAgIC8vIHRoaXMgVVJMLgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5saW5rZXJEZWZpbmVzTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcm9iZSAzOiB1cmwgb25seQorICAgICAgICAgICAgaWYgKGFic29sdXRlVVJMICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IChTY2hlbWEpc2NoZW1hQnlOc0xvY1BhaXIuZ2V0KG5ldyBOc0xvY1BhaXIobnVsbCwgYWJzb2x1dGVVUkwpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vIG1hdGNoOiBlcnJvciBpZiB3ZSBjYW4ndCBvciB3b24ndCBkb3dubG9hZC4KKyAgICAgICAgICAgIGlmIChhYnNvbHV0ZVVSTCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSAtIG5vIHZhbGlkIGxvY2F0aW9uIFVSTC4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmV2aW91c2x5RmFpbGVkVG9Eb3dubG9hZChhYnNvbHV0ZVVSTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYW4gZXJyb3IgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIHByb2R1Y2VkLgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN0YXRlLnNob3VsZERvd25sb2FkVVJJKGFic29sdXRlVVJMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ291bGQgbm90IGxvYWQgcmVzb3VyY2UgXCIiICsgYWJzb2x1dGVVUkwgKyAiXCIgKG5ldHdvcmsgZG93bmxvYWRzIGRpc2FibGVkKS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7CisgICAgICAgICAgICAgICAgYWRkRmFpbGVkRG93bmxvYWQoYWJzb2x1dGVVUkwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0cnkgdG8gZG93bmxvYWQKKyAgICAgICAgICAgIGRvd25sb2FkOiB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxPYmplY3QgeGRvYyA9IGRvd25sb2FkRG9jdW1lbnQoc3RhdGUuZ2V0UzRTTG9hZGVyKCksIHRhcmdldE5hbWVzcGFjZSwgYWJzb2x1dGVVUkwpOworCisgICAgICAgICAgICAgICAgU2NoZW1hIHJlc3VsdCA9IGZpbmRNYXRjaEJ5RGlnZXN0KHhkb2MpOworICAgICAgICAgICAgICAgIFN0cmluZyBzaG9ydG5hbWUgPSBzdGF0ZS5yZWxhdGl2aXplKGFic29sdXRlVVJMKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbiBleGFjdGx5LXRoZS1zYW1lIGRvY3VtZW50IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLCB1c2UgdGhlIG9yaWdpbmFsIGFuZCBzcGV3CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkdXBuYW1lID0gc3RhdGUucmVsYXRpdml6ZShyZXN1bHQuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1cG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmluZm8oc2hvcnRuYW1lICsgIiBpcyB0aGUgc2FtZSBhcyAiICsgZHVwbmFtZSArICIgKGlnbm9yaW5nIHRoZSBkdXBsaWNhdGUgZmlsZSkiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5mbyhzaG9ydG5hbWUgKyAiIGlzIHRoZSBzYW1lIGFzIGFub3RoZXIgc2NoZW1hIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQncyBhIG5ldyBkb2N1bWVudDogdmFsaWRhdGUgaXQgYW5kIGdyYWIgdGhlIGNvbnRlbnRzCisgICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgdm9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgICB2b3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKHN0YXRlLmdldEVycm9yTGlzdGVuZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHhkb2MgaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCkgfHwgIXhkb2MudmFsaWRhdGUodm9wdGlvbnMpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUmVmZXJlbmNlZCBkb2N1bWVudCBpcyBub3QgYSB2YWxpZCBzY2hlbWEiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkb3dubG9hZDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IHNEb2MgPSAoU2NoZW1hRG9jdW1lbnQpeGRvYzsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzRG9jLmdldFNjaGVtYSgpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbmZvKCJMb2FkaW5nIHJlZmVyZW5jZWQgZmlsZSAiICsgc2hvcnRuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTnNMb2NQYWlyIGtleSA9IG5ldyBOc0xvY1BhaXIoZW1wdHlTdHJpbmdJZk51bGwocmVzdWx0LmdldFRhcmdldE5hbWVzcGFjZSgpKSwgYWJzb2x1dGVVUkwpOworICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NmdWxEb3dubG9hZChrZXksIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWFsZm9ybWVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJVUkwgXCIiICsgYWJzb2x1dGVVUkwgKyAiXCIgaXMgbm90IHdlbGwtZm9ybWVkIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9GSU5EX1JFU09VUkNFLCByZWZlcmVuY2VkQnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGNvbm5lY3Rpb25Qcm9ibGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKGNvbm5lY3Rpb25Qcm9ibGVtLnRvU3RyaW5nKCksIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfRklORF9SRVNPVVJDRSwgcmVmZXJlbmNlZEJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiUHJvYmxlbSBwYXJzaW5nIHJlZmVyZW5jZWQgWE1MIHJlc291cmNlIC0gIiArIGUuZ2V0TWVzc2FnZSgpLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0ZJTkRfUkVTT1VSQ0UsIHJlZmVyZW5jZWRCeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlY29yZCBmYWlsdXJlIHNvIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGRvd25sb2FkIHRoaXMgVVJMIGFnYWluCisgICAgICAgICAgICBhZGRGYWlsZWREb3dubG9hZChhYnNvbHV0ZVVSTCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3QgZG93bmxvYWREb2N1bWVudChTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGFic29sdXRlVVJMKQorICAgICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYbWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IHN0YXRlLmdldEVudGl0eVJlc29sdmVyKCk7CisgICAgICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2U7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXNvbHZlci5yZXNvbHZlRW50aXR5KG5hbWVzcGFjZSwgYWJzb2x1dGVVUkwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gZmlyc3QgcHJlZmVyZW5jZSBmb3IgSW5wdXRTb3VyY2UgY29udHJhY3Q6IGNoYXJhY3RlciBzdHJlYW0KKyAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gc291cmNlLmdldENoYXJhY3RlclN0cmVhbSgpOworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZShyZWFkZXIsIG51bGwsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBzZWNvbmQgcHJlZmVyZW5jZSBmb3IgSW5wdXRTb3VyY2UgY29udHJhY3Q6IAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGJ5dGVzID0gc291cmNlLmdldEJ5dGVTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNvdXJjZS5nZXRFbmNvZGluZygpOworICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRMaW5lTnVtYmVycygpOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRNZXNzYWdlRGlnZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldENoYXJhY3RlckVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZShieXRlcywgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHRoaXJkIHByZWZlcmVuY2U6IHVzZSB0aGUgKHBvc3NpYmx5IHJlZGlyZWN0ZWQpIHVybAorICAgICAgICAgICAgICAgIFN0cmluZyB1cmxUb0xvYWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKTsKKyAgICAgICAgICAgICAgICBpZiAodXJsVG9Mb2FkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW50aXR5UmVzb2x2ZXIgdW5hYmxlIHRvIHJlc29sdmUgIiArIGFic29sdXRlVVJMICsgIiAoZm9yIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlICsgIikiKTsKKyAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZExpbmVOdW1iZXJzKCk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOworICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0RG9jdW1lbnRTb3VyY2VOYW1lKGFic29sdXRlVVJMKTsKKyAgICAgICAgICAgICAgICBVUkwgdXJsRG93bmxvYWQgPSBuZXcgVVJMKHVybFRvTG9hZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZSh1cmxEb3dubG9hZCwgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIG5vIHJlc29sdmVyIC0ganVzdCB1c2UgdGhlIFVSTCBkaXJlY3RseSwgbm8gc3Vic3RpdHV0aW9uCisgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFVSTCB1cmxEb3dubG9hZCA9IG5ldyBVUkwoYWJzb2x1dGVVUkwpOworICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5wYXJzZSh1cmxEb3dubG9hZCwgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkU3VjY2Vzc2Z1bERvd25sb2FkKE5zTG9jUGFpciBrZXksIFNjaGVtYSBzY2hlbWEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBkaWdlc3QgPSBzY2hlbWEuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOworICAgICAgICAgICAgaWYgKGRpZ2VzdCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5hZGRTY2hlbWFEaWdlc3QobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlnZXN0S2V5IGRrID0gbmV3IERpZ2VzdEtleShkaWdlc3QpOworICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQnlEaWdlc3RLZXkuY29udGFpbnNLZXkoZGspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hQnlEaWdlc3RLZXkucHV0KG5ldyBEaWdlc3RLZXkoZGlnZXN0KSwgc2NoZW1hKTsKKyAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZFNjaGVtYURpZ2VzdChkaWdlc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2NoZW1hQnlOc0xvY1BhaXIucHV0KGtleSwgc2NoZW1hKTsKKyAgICAgICAgICAgIE5zTG9jUGFpciBrZXkxID0gbmV3IE5zTG9jUGFpcihrZXkuZ2V0TmFtZXNwYWNlVVJJKCksIG51bGwpOworICAgICAgICAgICAgaWYgKCFzY2hlbWFCeU5zTG9jUGFpci5jb250YWluc0tleShrZXkxKSkKKyAgICAgICAgICAgICAgICBzY2hlbWFCeU5zTG9jUGFpci5wdXQoa2V5MSwgc2NoZW1hKTsKKyAgICAgICAgICAgIE5zTG9jUGFpciBrZXkyID0gbmV3IE5zTG9jUGFpcihudWxsLCBrZXkuZ2V0TG9jYXRpb25VUkwoKSk7CisgICAgICAgICAgICBpZiAoIXNjaGVtYUJ5TnNMb2NQYWlyLmNvbnRhaW5zS2V5KGtleTIpKQorICAgICAgICAgICAgICAgIHNjaGVtYUJ5TnNMb2NQYWlyLnB1dChrZXkyLCBzY2hlbWEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTY2hlbWEgZmluZE1hdGNoQnlEaWdlc3QoWG1sT2JqZWN0IG9yaWdpbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gZGlnZXN0ID0gb3JpZ2luYWwuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0TWVzc2FnZURpZ2VzdCgpOworICAgICAgICAgICAgaWYgKGRpZ2VzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIChTY2hlbWEpc2NoZW1hQnlEaWdlc3RLZXkuZ2V0KG5ldyBEaWdlc3RLZXkoZGlnZXN0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkRmFpbGVkRG93bmxvYWQoU3RyaW5nIGxvY2F0aW9uVVJMKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsZWREb3dubG9hZHMuYWRkKGxvY2F0aW9uVVJMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c2x5RmFpbGVkVG9Eb3dubG9hZChTdHJpbmcgbG9jYXRpb25VUkwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWREb3dubG9hZHMuY29udGFpbnMobG9jYXRpb25VUkwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBudWxsYWJsZVN0cmluZ3NNYXRjaChTdHJpbmcgczEsIFN0cmluZyBzMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMxID09IG51bGwgJiYgczIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzMSA9PSBudWxsIHx8IHMyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIChzMS5lcXVhbHMoczIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbXB0eVN0cmluZ0lmTnVsbChTdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBhZGRTY2FuTmVlZGVkKFNjaGVtYVRvUHJvY2VzcyBzdHApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc2Nhbm5lZEFscmVhZHkuY29udGFpbnMoc3RwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2FubmVkQWxyZWFkeS5hZGQoc3RwKTsKKyAgICAgICAgICAgICAgICBzY2FuTmVlZGVkLmFkZChzdHApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEVtcHR5TmFtZXNwYWNlU2NoZW1hKFNjaGVtYSBzKQorICAgICAgICB7CisgICAgICAgICAgICBlbXB0eU5hbWVzcGFjZVNjaGVtYXMuYWRkKHMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVzZWRFbXB0eU5hbWVzcGFjZVNjaGVtYShTY2hlbWEgcykKKyAgICAgICAgeworICAgICAgICAgICAgZW1wdHlOYW1lc3BhY2VTY2hlbWFzLnJlbW92ZShzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmZXRjaFJlbWFpbmluZ0VtcHR5TmFtZXNwYWNlU2NoZW1hcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbXB0eU5hbWVzcGFjZVNjaGVtYXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZW1wdHlOYW1lc3BhY2VTY2hlbWFzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3Moc2NoZW1hLCBudWxsLCBudWxsKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtcHR5TmFtZXNwYWNlU2NoZW1hcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dFRvU2NhbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhc2Nhbk5lZWRlZC5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNjaGVtYVRvUHJvY2VzcyBuZXh0VG9TY2FuKCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVG9Qcm9jZXNzIG5leHQgPSAoU2NoZW1hVG9Qcm9jZXNzKXNjYW5OZWVkZWQucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERvd25sb2FkVGFibGUoU2NoZW1hW10gc3RhcnRXaXRoKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0V2l0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc3RhcnRXaXRoW2ldLmdldFRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgIE5zTG9jUGFpciBrZXkgPSBuZXcgTnNMb2NQYWlyKHRhcmdldE5hbWVzcGFjZSwgYmFzZVVSTEZvckRvYyhzdGFydFdpdGhbaV0pKTsKKyAgICAgICAgICAgICAgICBhZGRTdWNjZXNzZnVsRG93bmxvYWQoa2V5LCBzdGFydFdpdGhbaV0pOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKHN0YXJ0V2l0aFtpXSwgbnVsbCwgbnVsbCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYWRkRW1wdHlOYW1lc3BhY2VTY2hlbWEoc3RhcnRXaXRoW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTY2hlbWFUb1Byb2Nlc3NbXSByZXNvbHZlSW1wb3J0c0FuZEluY2x1ZGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgICAgIC8vIGFsZ29yaXRobSBpcyB0byBzY2FuIHRocm91Z2ggZWFjaCBzY2hlbWEgZG9jdW1lbnQgYW5kCisgICAgICAgICAgICAvLyAxLiBkb3dubG9hZCBlYWNoIGltcG9ydCBhbmQgaW5jbHVkZSAoaWYgbm90IGFscmVhZHkgZG93bmxvYWRlZCkKKyAgICAgICAgICAgIC8vIDIuIHF1ZXVlIGVhY2ggaW1wb3J0ZWQgb3IgaW5jbHVkZWQgc2NoZW1hIHRvIGJlIHByb2Nlc3MgKGlmIG5vdCBhbHJlYWR5IHF1ZXVlZCkKKworICAgICAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBpcyBydW4gdHdpY2UgdHdpY2U6IGZpcnN0IHdlIGJlZ2luIHdpdGggbm9uLWVtcHR5CisgICAgICAgICAgICAvLyBuYW1lc3BhY2Ugc2NoZW1hcyBvbmx5LiAgVGhlbiB3ZSByZXBlYXQgc3RhcnRpbmcgd2l0aCBhbnkKKyAgICAgICAgICAgIC8vIGVtcHR5IGVtcHR5LW5hbWVzcGFjZSBzY2hlbWFzIHRoYXQgaGF2ZSBOT1QgYmVlbiBjaGFtZWxlb24tCisgICAgICAgICAgICAvLyBpbmNsdWRlZCBieSBvdGhlciBzY2hlbWFzIGFuZCBwcm9jZXNzIHRoZW0uCisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGhhc05leHRUb1NjYW4oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNjaGVtYVRvUHJvY2VzcyBzdHAgPSBuZXh0VG9TY2FuKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmFkZFNvdXJjZVVyaShzdHAuZ2V0U291cmNlTmFtZSgpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzdHApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGltcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydFtdIGltcG9ydHMgPSBzdHAuZ2V0U2NoZW1hKCkuZ2V0SW1wb3J0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWEgaW1wb3J0ZWQgPSBkb3dubG9hZFNjaGVtYShpbXBvcnRzW2ldLCBlbXB0eVN0cmluZ0lmTnVsbChpbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpKSwgaW1wb3J0c1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3dubG9hZCBmYWlscywgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFudWxsYWJsZVN0cmluZ3NNYXRjaChpbXBvcnRlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgaW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkltcG9ydGVkIHNjaGVtYSBoYXMgYSB0YXJnZXQgbmFtZXNwYWNlIFwiIiArIGltcG9ydGVkLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIlwiIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBcIiIgKyBpbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0Lk1JU01BVENIRURfVEFSR0VUX05BTUVTUEFDRSwgaW1wb3J0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhpbXBvcnRlZCwgbnVsbCwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGluY2x1ZGVzCisgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlW10gaW5jbHVkZXMgPSBzdHAuZ2V0U2NoZW1hKCkuZ2V0SW5jbHVkZUFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZXNwYWNlID0gc3RwLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzcGFjZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzcGFjZSA9IGVtcHR5U3RyaW5nSWZOdWxsKHN0cC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYSBpbmNsdWRlZCA9IGRvd25sb2FkU2NoZW1hKGluY2x1ZGVzW2ldLCBudWxsLCBpbmNsdWRlc1tpXS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkb3dubG9hZCBmYWlscywgYW4gZXJyb3IgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5U3RyaW5nSWZOdWxsKGluY2x1ZGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKS5lcXVhbHMoc291cmNlTmFtZXNwYWNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1jaGFtZWxlb24gY2FzZSAtIGp1c3QgbGlrZSBhbiBpbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2Nhbk5lZWRlZChuZXcgU2NoZW1hVG9Qcm9jZXNzKGluY2x1ZGVkLCBudWxsLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluY2x1ZGVkLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIGluY2x1ZGU6IGluY2x1ZGVkIHNjaGVtYSBpbiB3cm9uZyBuYW1lc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW5jbHVkZWQgc2NoZW1hIGhhcyBhIHRhcmdldCBuYW1lc3BhY2UgXCIiICsgaW5jbHVkZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiXCIgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgc291cmNlIG5hbWVzcGFjZSBcIiIgKyBzb3VyY2VOYW1lc3BhY2UgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuTUlTTUFUQ0hFRF9UQVJHRVRfTkFNRVNQQUNFLCBpbmNsdWRlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW1lbGVvbiBpbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNjYW5OZWVkZWQobmV3IFNjaGVtYVRvUHJvY2VzcyhpbmNsdWRlZCwgc291cmNlTmFtZXNwYWNlLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRFbXB0eU5hbWVzcGFjZVNjaGVtYShpbmNsdWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcmVkZWZpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICBSZWRlZmluZVtdIHJlZGVmaW5lcyA9IHN0cC5nZXRTY2hlbWEoKS5nZXRSZWRlZmluZUFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZXNwYWNlID0gc3RwLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5hbWVzcGFjZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWVzcGFjZSA9IGVtcHR5U3RyaW5nSWZOdWxsKHN0cC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZGVmaW5lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWEgcmVkZWZpbmVkID0gZG93bmxvYWRTY2hlbWEocmVkZWZpbmVzW2ldLCBudWxsLCByZWRlZmluZXNbaV0uZ2V0U2NoZW1hTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZG93bmxvYWQgZmFpbHMsIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5lZCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHlTdHJpbmdJZk51bGwocmVkZWZpbmVkLmdldFRhcmdldE5hbWVzcGFjZSgpKS5lcXVhbHMoc291cmNlTmFtZXNwYWNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1jaGFtZWxlb24gY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MocmVkZWZpbmVkLCBudWxsLCByZWRlZmluZXNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVkZWZpbmVkLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIGluY2x1ZGU6IGluY2x1ZGVkIHNjaGVtYSBpbiB3cm9uZyBuYW1lc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiUmVkZWZpbmVkIHNjaGVtYSBoYXMgYSB0YXJnZXQgbmFtZXNwYWNlIFwiIiArIHJlZGVmaW5lZC5nZXRUYXJnZXROYW1lc3BhY2UoKSArICJcIiB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBzb3VyY2UgbmFtZXNwYWNlIFwiIiArIHNvdXJjZU5hbWVzcGFjZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5NSVNNQVRDSEVEX1RBUkdFVF9OQU1FU1BBQ0UsIHJlZGVmaW5lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW1lbGVvbiByZWRlZmluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTY2FuTmVlZGVkKG5ldyBTY2hlbWFUb1Byb2Nlc3MocmVkZWZpbmVkLCBzb3VyY2VOYW1lc3BhY2UsIHJlZGVmaW5lc1tpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkRW1wdHlOYW1lc3BhY2VTY2hlbWEocmVkZWZpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZldGNoUmVtYWluaW5nRW1wdHlOYW1lc3BhY2VTY2hlbWFzKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKFNjaGVtYVRvUHJvY2Vzc1tdKXJlc3VsdC50b0FycmF5KG5ldyBTY2hlbWFUb1Byb2Nlc3NbcmVzdWx0LnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSmF2YWl6ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NKYXZhaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODcxNzEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjSmF2YWl6ZXIuamF2YQpAQCAtMCwwICsxLDkzMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVBhcnRpY2xlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFTdHJpbmdFbnVtRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLk5hbWVVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuSW50ZXJmYWNlRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuRXh0ZW5zaW9uSG9sZGVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFN0c2NKYXZhaXplcgoreworICAgIC8qKgorICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGphdmFpemVBbGxUeXBlcyhib29sZWFuIGphdmFpemUpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgTGlzdCBhbGxTZWVuVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5kb2N1bWVudFR5cGVzKCkpKTsKKyAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmF0dHJpYnV0ZVR5cGVzKCkpKTsKKyAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLmdsb2JhbFR5cGVzKCkpKTsKKworICAgICAgICAvLyBGaXJzdCBkaXN0cmlidXRlIHRoZSBnbG9iYWwgbmFtZXMgYW1vbmcgdGhlIHRvcCBlbnRpdGllcy4KKyAgICAgICAgaWYgKGphdmFpemUpCisgICAgICAgICAgICBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoYWxsU2VlblR5cGVzKTsKKworICAgICAgICAvLyBub3cgZnVsbHkgamF2YWl6ZSBldmVyeXRoaW5nIGRlZXBseS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGphdmFpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgamF2YWl6ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ1R5cGUuZ2V0RnVsbEphdmFOYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRDbGFzc25hbWUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpLCBnVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2tpcEphdmFpemluZ1R5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKKyAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhc3NpZ25HbG9iYWxKYXZhTmFtZXMoQ29sbGVjdGlvbiBzY2hlbWFUeXBlcykKKyAgICB7CisgICAgICAgIEhhc2hTZXQgdXNlZE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNJbXBsID0gKFNjaGVtYVR5cGVJbXBsKWkubmV4dCgpOworICAgICAgICAgICAgUU5hbWUgdG9wTmFtZSA9IGZpbmRUb3BOYW1lKHNJbXBsKTsKKyAgICAgICAgICAgIFN0cmluZyBwaWNrZWROYW1lID0gc3RhdGUuZ2V0SmF2YW5hbWUodG9wTmFtZSk7CisgICAgICAgICAgICBpZiAoc0ltcGwuaXNVbmphdmFpemVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0RnVsbEphdmFOYW1lKHBpY2tGdWxsSmF2YUNsYXNzTmFtZSh1c2VkTmFtZXMsIGZpbmRUb3BOYW1lKHNJbXBsKSwgcGlja2VkTmFtZSwgc0ltcGwuaXNEb2N1bWVudFR5cGUoKSwgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRGdWxsSmF2YUltcGxOYW1lKHBpY2tGdWxsSmF2YUltcGxOYW1lKHVzZWROYW1lcywgc0ltcGwuZ2V0RnVsbEphdmFOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXRFeHRlbnNpb25zKHNJbXBsLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2ZXJpZnlJbnRlcmZhY2VOYW1lQ29sbGlzaW9ucyh1c2VkTmFtZXMsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUludGVyZmFjZU5hbWVDb2xsaXNpb25zKFNldCB1c2VkTmFtZXMsIFN0c2NTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN0YXRlLmdldEV4dGVuc2lvbkhvbGRlcigpLnZlcmlmeUludGVyZmFjZU5hbWVDb2xsaXNpb25zKHVzZWROYW1lcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRFeHRlbnNpb25zKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBTdHNjU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBTdHJpbmcgamF2YU5hbWUgPSBzSW1wbC5nZXRGdWxsSmF2YU5hbWUoKTsKKworICAgICAgICBpZiAoamF2YU5hbWUhPW51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNJbXBsLnNldEV4dGVuc2lvbkhvbGRlcihzdGF0ZS5nZXRFeHRlbnNpb25Ib2xkZXIoamF2YU5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdHJpbmdUeXBlKFNjaGVtYVR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwgfHwgdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHBpY2tDb25zdGFudE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIHdvcmRzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBOYW1lVXRpbC51cHBlckNhc2VVbmRlcmJhcih3b3Jkcyk7CisKKyAgICAgICAgaWYgKGJhc2UubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZSA9ICJYIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYXNlLnN0YXJ0c1dpdGgoIklOVF8iKSkgLy8gcmVzZXJ2ZWQgZm9yIGludCBjb2RlcworICAgICAgICB7CisgICAgICAgICAgICBiYXNlID0gIlhfIiArIGJhc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdW5pcU5hbWU7CisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGZvciAodW5pcU5hbWUgPSBiYXNlOyB1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyAiXyIgKyBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOworCisgICAgICAgIHJldHVybiB1bmlxTmFtZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBza2lwSmF2YWl6aW5nVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIGlmIChzSW1wbC5pc0phdmFpemVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU2NoZW1hVHlwZUltcGwgYmFzZVR5cGUgPSAoU2NoZW1hVHlwZUltcGwpc0ltcGwuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCisgICAgICAgICAgICBza2lwSmF2YWl6aW5nVHlwZShiYXNlVHlwZSk7CisKKyAgICAgICAgc0ltcGwuc3RhcnRKYXZhaXppbmcoKTsKKyAgICAgICAgc2Vjb25kUGFzc1Byb2Nlc3NUeXBlKHNJbXBsKTsKKyAgICAgICAgc0ltcGwuZmluaXNoSmF2YWl6aW5nKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc2Vjb25kUGFzc1Byb2Nlc3NUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQorICAgIHsKKyAgICAgICAgaWYgKGlzU3RyaW5nVHlwZShzSW1wbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBlbnVtVmFscyA9IHNJbXBsLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gZW51bWVyYXRlZCBzdHJpbmcgdHlwZSwgdmFsdWVzIGFyZSB0byBiZQorICAgICAgICAgICAgLy8gamF2YWl6ZWQgYXMgY29uc3RhbnRzLgorICAgICAgICAgICAgaWYgKGVudW1WYWxzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZW50cnlBcnJheSA9IG5ldyBTY2hlbWFTdHJpbmdFbnVtRW50cnlbZW51bVZhbHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIGJhc2VkT24gPSBzSW1wbC5nZXRCYXNlRW51bVR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZWRPbiA9PSBzSW1wbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNldCB1c2VkTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1WYWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gZW51bVZhbHNbaV0uZ2V0U3RyaW5nVmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlBcnJheVtpXSA9IG5ldyBTY2hlbWFTdHJpbmdFbnVtRW50cnlJbXBsKHZhbCwgaSArIDEsIHBpY2tDb25zdGFudE5hbWUodXNlZE5hbWVzLCB2YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1WYWxzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsID0gZW51bVZhbHNbaV0uZ2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5QXJyYXlbaV0gPSBiYXNlZE9uLmVudW1FbnRyeUZvclN0cmluZyh2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNJbXBsLnNldFN0cmluZ0VudW1FbnRyaWVzKGVudHJ5QXJyYXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgamF2YWl6ZVR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICBpZiAoc0ltcGwuaXNKYXZhaXplZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VUeXBlID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsLmdldEJhc2VUeXBlKCk7CisgICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKQorICAgICAgICAgICAgamF2YWl6ZVR5cGUoYmFzZVR5cGUpOworCisgICAgICAgIHNJbXBsLnN0YXJ0SmF2YWl6aW5nKCk7CisKKyAgICAgICAgc0ltcGwuc2V0Q29tcGlsZWQodHJ1ZSk7CisKKyAgICAgICAgc2Vjb25kUGFzc1Byb2Nlc3NUeXBlKHNJbXBsKTsKKworICAgICAgICBpZiAoIXNJbXBsLmlzU2ltcGxlVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eVtdIGVsdFByb3BzID0gc0ltcGwuZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gYXR0clByb3BzID0gc0ltcGwuZ2V0QXR0cmlidXRlUHJvcGVydGllcygpOworCisgICAgICAgICAgICAvLyBlbGVtZW50IHNldHRlcnMgcmVzdWx0IGZyb20gYSBjb21wdXRhdGlvbgorICAgICAgICAgICAgaWYgKGVsdFByb3BzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgYXNzaWduSmF2YUVsZW1lbnRTZXR0ZXJNb2RlbChlbHRQcm9wcywgc0ltcGwuZ2V0Q29udGVudE1vZGVsKCkpOworCisgICAgICAgICAgICAvLyBIYW5kaW5nIG91dCBqYXZhIG5hbWVzIC0gdGhpcyBwZXJtaXRzIHVzIHRvIGF2b2lkIGNvbGxpc2lvbnMuCisgICAgICAgICAgICBTZXQgdXNlZFByb3BOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAgICAgICAgIC8vIGNvdW50IGluIHRoZSBtZXRob2RzIGZyb20gZXh0ZW5zaW9uIGludGVyZmFjZXMKKyAgICAgICAgICAgIGF2b2lkRXh0ZW5zaW9uTWV0aG9kcyh1c2VkUHJvcE5hbWVzLCBzSW1wbCk7CisKKyAgICAgICAgICAgIC8vIEFzc2lnbiBuYW1lcyBpbiB0d28gcGFzc2VzOiBmaXJzdCBpbmhlcml0ZWQgbmFtZXMsIHRoZW4gb3RoZXJzLgorICAgICAgICAgICAgZm9yIChib29sZWFuIGRvSW5oZXJpdGVkID0gdHJ1ZTsgOyBkb0luaGVyaXRlZCA9IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbHRQcm9wcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICBhc3NpZ25KYXZhUHJvcGVydHlOYW1lcyh1c2VkUHJvcE5hbWVzLCBlbHRQcm9wcywgYmFzZVR5cGUsIGRvSW5oZXJpdGVkKTsKKworICAgICAgICAgICAgICAgIGFzc2lnbkphdmFQcm9wZXJ0eU5hbWVzKHVzZWRQcm9wTmFtZXMsIGF0dHJQcm9wcywgYmFzZVR5cGUsIGRvSW5oZXJpdGVkKTsKKworICAgICAgICAgICAgICAgIGlmIChkb0luaGVyaXRlZCA9PSBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gYWxscHJvcHMgPSBzSW1wbC5nZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIG9yZGVyIGluc2Vuc2l0aXZlCisgICAgICAgICAgICBib29sZWFuIGluc2Vuc2l0aXZlID0gaXNQcm9wZXJ0eU1vZGVsT3JkZXJJbnNlbnNpdGl2ZShhbGxwcm9wcyk7CisKKyAgICAgICAgICAgIC8vIEZpbGwgaW4gdGhlIGphdmEgdHlwZSBjb2RlcyBub3cuCisgICAgICAgICAgICAvLyBUaGlzIGRlcGVuZHMgb24gcmVjdXJzaXZlIHR5cGUgaW5mb3JtYXRpb24sIHNvIGl0J3MgZG9uZSBpbiB0eXBlY2hlY2tpbmcKKyAgICAgICAgICAgIGFzc2lnbkphdmFUeXBlQ29kZXMoYWxscHJvcHMpOworCisgICAgICAgICAgICBzSW1wbC5zZXRPcmRlclNlbnNpdGl2ZSghaW5zZW5zaXRpdmUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXNzaWduIGphdmEgdHlwZSBuYW1lcyB0byBhbm9ueW1vdXMgdHlwZXMKKyAgICAgICAgYXNzaWduSmF2YUFub255bW91c1R5cGVOYW1lcyhzSW1wbCk7CisKKyAgICAgICAgc0ltcGwuZmluaXNoSmF2YWl6aW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJFRklYRVMgPSBuZXcgU3RyaW5nW10KKyAgICB7ImdldCIsICJ4Z2V0IiwgImlzTmlsIiwgImlzU2V0IiwgInNpemVPZiIsICJzZXQiLCAieHNldCIsICJhZGROZXciLCAic2V0TmlsIiwgInVuc2V0IiwgImluc2VydCIsICJhZGQiLCAiaW5zZXJ0TmV3IiwgImFkZE5ldyIsICJyZW1vdmUifTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXZvaWRFeHRlbnNpb25NZXRob2RzKFNldCB1c2VkUHJvcE5hbWVzLCBTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIEV4dGVuc2lvbkhvbGRlciBleHRIb2xkZXIgPSBzSW1wbC5nZXRFeHRlbnNpb25Ib2xkZXIoKTsKKyAgICAgICAgaWYgKGV4dEhvbGRlciE9bnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdCBleHRzID0gZXh0SG9sZGVyLmdldEludGVyZmFjZUV4dGVuc2lvbnNGb3Ioc0ltcGwuZ2V0RnVsbEphdmFOYW1lKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEludGVyZmFjZUV4dGVuc2lvbiBleHQgPSAoSW50ZXJmYWNlRXh0ZW5zaW9uKSBleHRzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSBleHQuZ2V0SW50ZXJmYWNlTWV0aG9kQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8bWV0aG9kQ291bnQ7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gZXh0LmdldEludGVyZmFjZU1ldGhvZE5hbWUoaik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgUFJFRklYRVMubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBQUkVGSVhFU1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkUHJvcE5hbWVzLmFkZChtZXRob2ROYW1lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFBbm9ueW1vdXNUeXBlTmFtZXMoU2NoZW1hVHlwZUltcGwgb3V0ZXJUeXBlKQorICAgIHsKKyAgICAgICAgU2V0IHVzZWRUeXBlTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTY2hlbWFUeXBlW10gYW5vbnltb3VzVHlwZXMgPSBvdXRlclR5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKTsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIC8vIEJlY2F1c2Ugd2UgZ2VuZXJhdGUgbmVzdGVkIGphdmEgaW50ZXJmYWNlcywgYW5kIG5lc3RlZAorICAgICAgICAvLyBpbnRlcmZhY2UgbmFtZXMgbXVzdCBub3QgYmUgdGhlIHNhbWUgYXMgYW4gYW5jZXN0b3IsIHVzZSB1cAorICAgICAgICAvLyB0aGUgYW5jZXN0b3JzCisKKyAgICAgICAgZm9yICggU2NoZW1hVHlwZSBzY2FuT3V0ZXJUeXBlID0gb3V0ZXJUeXBlIDsKKyAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSAhPSBudWxsIDsKKyAgICAgICAgICAgICAgc2Nhbk91dGVyVHlwZSA9IHNjYW5PdXRlclR5cGUuZ2V0T3V0ZXJUeXBlKCkgKQorICAgICAgICB7CisgICAgICAgICAgICB1c2VkVHlwZU5hbWVzLmFkZCggc2Nhbk91dGVyVHlwZS5nZXRTaG9ydEphdmFOYW1lKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIFNjaGVtYVR5cGUgc2Nhbk91dGVyVHlwZSA9IG91dGVyVHlwZSA7CisgICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgIT0gbnVsbCA7CisgICAgICAgICAgICAgIHNjYW5PdXRlclR5cGUgPSBzY2FuT3V0ZXJUeXBlLmdldE91dGVyVHlwZSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoIHNjYW5PdXRlclR5cGUuZ2V0U2hvcnRKYXZhSW1wbE5hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgLy8gYW5kIGJlY2F1c2UgdGhpbmdzIGFyZSBwcm9ibGVtYXRpYyBpZiBhbiBpbm5lciB0eXBlIG5hbWUKKyAgICAgICAgLy8gaXMgdGhlIHNhbWUgYXMgYSB0b3AtbGV2ZWwgcGFja2FnZSBuYW1lLCBhbHNvIGdldCByaWQgb2YgdGhhdAorICAgICAgICAvLyBjb2xsaXNpb24KKyAgICAgICAgdXNlZFR5cGVOYW1lcy5hZGQoZ2V0T3V0ZXJtb3N0UGFja2FnZShvdXRlclR5cGUuZ2V0RnVsbEphdmFOYW1lKCkpKTsKKworICAgICAgICAvLyBhc3NpZ24gbmFtZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbm9ueW1vdXNUeXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgc0ltcGwgPSAoU2NoZW1hVHlwZUltcGwpYW5vbnltb3VzVHlwZXNbaV07CisgICAgICAgICAgICBpZiAoc0ltcGwgPT0gbnVsbCkgLy8gYWxyZWFkeSBoYW5kbGVkIGluIGZpcnN0IHBhc3MKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzSW1wbC5pc1NraXBwZWRBbm9ueW1vdXNUeXBlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBqYXZhbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIFNjaGVtYUZpZWxkIGNvbnRhaW5lckZpZWxkID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXJGaWVsZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gc0ltcGwuZ2V0Q29udGFpbmVyRmllbGQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgbG9jYWxuYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgICAgICAgICAgamF2YW5hbWUgPSBzdGF0ZS5nZXRKYXZhbmFtZShzSW1wbC5nZXRDb250YWluZXJGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90IGRlZmluZWQgaW5zaWRlIGFuIEVsdCBvciBBdHRyOiBtdXN0IGJlIGEgbmVzdGVkIHNpbXBsZSB0eXBlCisgICAgICAgICAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRPdXRlclR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJNZW1iZXIiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJJdGVtIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5BVE9NSUM6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogIldlaXJkIHR5cGUgIiArIHNJbXBsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXZhbmFtZSA9ICJCYXNlIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc0ltcGwuc2V0U2hvcnRKYXZhTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUNsYXNzTmFtZSh1c2VkVHlwZU5hbWVzLCBsb2NhbG5hbWUsIGphdmFuYW1lKSk7CisgICAgICAgICAgICBzSW1wbC5zZXRTaG9ydEphdmFJbXBsTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgcGlja0lubmVySmF2YUltcGxOYW1lKHVzZWRUeXBlTmFtZXMsIGxvY2FsbmFtZSwgamF2YW5hbWUgPT0gbnVsbCA/IG51bGwgOiBqYXZhbmFtZSArICJJbXBsIikpOworICAgICAgICAgICAgc2V0RXh0ZW5zaW9ucyhzSW1wbCwgc3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBjb21wdXRlIHRoZSBzZXR0ZXIgbW9kZWwuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIFFOYW1lcyBvZiBlbGVtZW50cyB0aGF0IGNvdWxkIHBvc3NpYmx5IGJlCisgICAgICogY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb250ZW50TW9kZWwuIFRoZSBzdGF0ZSB2YXJpYWJsZSBpcyB1c2VkCisgICAgICogdG8gcmVjb3JkIHRoZSByZXN1bHRzLCBzbyB0aGF0IGlmIHRoZXkgYXJlIG5lZWRlZCBhZ2FpbiBsYXRlciwKKyAgICAgKiB0aGV5IGRvIG5vdCBuZWVkIHRvIGJlIHJlY29tcHV0ZWQuCisgICAgICovCisgICAgc3RhdGljIFFOYW1lU2V0IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhTY2hlbWFQYXJ0aWNsZSBjb250ZW50TW9kZWwsIE1hcCBzdGF0ZSkKKyAgICB7CisgICAgICAgIC8vIFJlbWVtYmVyIHByZXZpb3VzbHkgY29tcHV0ZWQgcmVzdWx0cyB0byBhdm9pZCBjb21wbGV4aXR5IGV4cGxvc2lvbgorICAgICAgICBRTmFtZVNldCByZXN1bHQgPSAoUU5hbWVTZXQpc3RhdGUuZ2V0KGNvbnRlbnRNb2RlbCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7CisKKyAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5DSE9JQ0U6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlci50b1FOYW1lU2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udGVudE1vZGVsLmdldFdpbGRjYXJkU2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuRUxFTUVOVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBRTmFtZVNldC5zaW5nbGV0b24oY29udGVudE1vZGVsLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUucHV0KGNvbnRlbnRNb2RlbCwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGNvbXB1dGUgc2V0dGVyIG1vZGVsLgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgUU5hbWVTZXQgb2YgYWxsIGVsZW1lbnRzIHRoYXQgY2FuIHBvc3NpYmx5IGNvbWUgYmVmb3JlIGFuCisgICAgICogZWxlbWVudCB3aG9zZSBuYW1lIGlzIGdpdmVuIGJ5IHRoZSB0YXJnZXQgaW4gYSB2YWxpZCBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiBjb250ZW50TW9kZWwuICBXaGVuIGFwcGVuZGluZyBhbiBlbGVtZW50LCBpdCBjb21lcyBiZWZvcmUgdGhlIGZpcnN0CisgICAgICogb25lIHRoYXQgaXMgbm90IGluIHRoaXMgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBRTmFtZVNldCBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKFFOYW1lIHRhcmdldCwgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsLCBNYXAgc3RhdGUpCisgICAgeworICAgICAgICBRTmFtZVNldCBhbGxDb250ZW50cyA9IGNvbXB1dGVBbGxDb250YWluZWRFbGVtZW50cyhjb250ZW50TW9kZWwsIHN0YXRlKTsKKyAgICAgICAgaWYgKCFhbGxDb250ZW50cy5jb250YWlucyh0YXJnZXQpKQorICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LkVNUFRZOworCisgICAgICAgIC8vIElmIGl0ZXJhdGVkLCB0aGVuIGFsbCBjb250ZW50cyBhcmUgZGVsaW1pdGluZy4KKyAgICAgICAgaWYgKGNvbnRlbnRNb2RlbC5nZXRNYXhPY2N1cnMoKSA9PSBudWxsIHx8CisgICAgICAgICAgICBjb250ZW50TW9kZWwuZ2V0TWF4T2NjdXJzKCkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA+IDApCisgICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7CisKKyAgICAgICAgUU5hbWVTZXRCdWlsZGVyIGJ1aWxkZXI7CisKKyAgICAgICAgc3dpdGNoIChjb250ZW50TW9kZWwuZ2V0UGFydGljbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudHM7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuV0lMRENBUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LnNpbmdsZXRvbih0YXJnZXQpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudE1vZGVsLmNvdW50T2ZQYXJ0aWNsZUNoaWxkKCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFFOYW1lU2V0IGNoaWxkQ29udGVudHMgPSBjb21wdXRlQWxsQ29udGFpbmVkRWxlbWVudHMoY29udGVudE1vZGVsLmdldFBhcnRpY2xlQ2hpbGQoaSksIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ29udGVudHMuY29udGFpbnModGFyZ2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVOb25kZWxpbWl0aW5nRWxlbWVudHModGFyZ2V0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9RTmFtZVNldCgpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLlNFUVVFTkNFOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWVuVGFyZ2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvbnRlbnRNb2RlbC5jb3VudE9mUGFydGljbGVDaGlsZCgpOyBpID4gMDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICBRTmFtZVNldCBjaGlsZENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbC5nZXRQYXJ0aWNsZUNoaWxkKGkpLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuVGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbChjaGlsZENvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZENvbnRlbnRzLmNvbnRhaW5zKHRhcmdldCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKGNvbXB1dGVOb25kZWxpbWl0aW5nRWxlbWVudHModGFyZ2V0LCBjb250ZW50TW9kZWwuZ2V0UGFydGljbGVDaGlsZChpKSwgc3RhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5UYXJnZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvUU5hbWVTZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2lnbkphdmFFbGVtZW50U2V0dGVyTW9kZWwoU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wcywgU2NoZW1hUGFydGljbGUgY29udGVudE1vZGVsKQorICAgIHsKKyAgICAgICAgLy8gVG8gY29tcHV0ZSB0aGUgZWxlbWVudCBzZXR0ZXIgbW9kZWwsIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUKKyAgICAgICAgLy8gZGVsaW1pdGluZyBlbGVtZW50cyBmb3IgZWFjaCBlbGVtZW50LgorCisgICAgICAgIE1hcCBzdGF0ZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIFFOYW1lU2V0IGFsbENvbnRlbnRzID0gY29tcHV0ZUFsbENvbnRhaW5lZEVsZW1lbnRzKGNvbnRlbnRNb2RlbCwgc3RhdGUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWx0UHJvcHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5SW1wbCBzSW1wbCA9IChTY2hlbWFQcm9wZXJ0eUltcGwpZWx0UHJvcHNbaV07CisgICAgICAgICAgICBRTmFtZVNldCBuZGUgPSBjb21wdXRlTm9uZGVsaW1pdGluZ0VsZW1lbnRzKHNJbXBsLmdldE5hbWUoKSwgY29udGVudE1vZGVsLCBzdGF0ZSk7CisgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoYWxsQ29udGVudHMpOworICAgICAgICAgICAgYnVpbGRlci5yZW1vdmVBbGwobmRlKTsKKyAgICAgICAgICAgIHNJbXBsLnNldEphdmFTZXR0ZXJEZWxpbWl0ZXIoYnVpbGRlci50b1FOYW1lU2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzaWduSmF2YVByb3BlcnR5TmFtZXMoU2V0IHVzZWROYW1lcywgU2NoZW1hUHJvcGVydHlbXSBwcm9wcywgU2NoZW1hVHlwZSBiYXNlVHlwZSwgYm9vbGVhbiBkb0luaGVyaXRlZCkKKyAgICB7CisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKworICAgICAgICAvLyB0d28gcGFzc2VzOiBmaXJzdCBkZWFsIHdpdGggaW5oZXJpdGVkIHByb3BlcnRpZXMsIHRoZW4gd2l0aCBuZXcgb25lcy4KKyAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgd2UgbWF0Y2ggdXAgd2l0aCBiYXNlIGNsYXNzIGRlZmluaXRpb25zIGNsZWFubHkKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eUltcGwgc0ltcGwgPSAoU2NoZW1hUHJvcGVydHlJbXBsKXByb3BzW2ldOworCisgICAgICAgICAgICBTY2hlbWFQcm9wZXJ0eSBiYXNlUHJvcCA9CisgICAgICAgICAgICAgICAoc0ltcGwuaXNBdHRyaWJ1dGUoKSA/CisgICAgICAgICAgICAgICAgICAgIGJhc2VUeXBlLmdldEF0dHJpYnV0ZVByb3BlcnR5KHNJbXBsLmdldE5hbWUoKSkgOgorICAgICAgICAgICAgICAgICAgICBiYXNlVHlwZS5nZXRFbGVtZW50UHJvcGVydHkoc0ltcGwuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgICAgIGlmICgoYmFzZVByb3AgIT0gbnVsbCkgIT0gZG9Jbmhlcml0ZWQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFFOYW1lIHByb3BRTmFtZSA9IHNJbXBsLmdldE5hbWUoKTsKKworICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWU7CisKKyAgICAgICAgICAgIGlmIChiYXNlUHJvcCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRoZU5hbWUgPSBwaWNrSmF2YVByb3BlcnR5TmFtZSh1c2VkTmFtZXMsIHByb3BRTmFtZS5nZXRMb2NhbFBhcnQoKSwgc3RhdGUuZ2V0SmF2YW5hbWUocHJvcFFOYW1lKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhlTmFtZSA9IGJhc2VQcm9wLmdldEphdmFQcm9wZXJ0eU5hbWUoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIXVzZWROYW1lcy5jb250YWlucyh0aGVOYW1lKSk7CisgICAgICAgICAgICAgICAgdXNlZE5hbWVzLmFkZCh0aGVOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVByb3BlcnR5TmFtZSh0aGVOYW1lKTsKKworICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0gKHNJbXBsLmdldE1heE9jY3VycygpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICBzSW1wbC5nZXRNYXhPY2N1cnMoKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID4gMCk7CisgICAgICAgICAgICBib29sZWFuIGlzU2luZ2xldG9uID0gIWlzQXJyYXkgJiYgKHNJbXBsLmdldE1heE9jY3VycygpLnNpZ251bSgpID4gMCk7CisgICAgICAgICAgICBib29sZWFuIGlzT3B0aW9uID0gaXNTaW5nbGV0b24gJiYgKHNJbXBsLmdldE1pbk9jY3VycygpLnNpZ251bSgpID09IDApOworICAgICAgICAgICAgU2NoZW1hVHlwZSBqYXZhQmFzZWRPblR5cGUgPSBzSW1wbC5nZXRUeXBlKCk7CisKKyAgICAgICAgICAgIGlmIChiYXNlUHJvcCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YUFycmF5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpc09wdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpc0FycmF5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJhc2VQcm9wLmV4dGVuZHNKYXZhU2luZ2xldG9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiYXNlUHJvcC5leHRlbmRzSmF2YU9wdGlvbigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXNPcHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqYXZhQmFzZWRPblR5cGUgPSBiYXNlUHJvcC5qYXZhQmFzZWRPblR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc0ltcGwuc2V0RXh0ZW5kc0phdmEoamF2YUJhc2VkT25UeXBlLmdldFJlZigpLCBpc1NpbmdsZXRvbiwgaXNPcHRpb24sIGlzQXJyYXkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhc3NpZ25KYXZhVHlwZUNvZGVzKFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcykKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlJbXBsIHNJbXBsID0gKFNjaGVtYVByb3BlcnR5SW1wbClwcm9wZXJ0aWVzW2ldOworICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHNJbXBsLmphdmFCYXNlZE9uVHlwZSgpOworICAgICAgICAgICAgc0ltcGwuc2V0SmF2YVR5cGVDb2RlKGphdmFUeXBlQ29kZUZvclR5cGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlSW5Db21tb24oU2NoZW1hVHlwZVtdIHR5cGVzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVzID09IG51bGwgfHwgdHlwZXMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKKworICAgICAgICBpbnQgY29kZSA9IGphdmFUeXBlQ29kZUZvclR5cGUodHlwZXNbMF0pOworICAgICAgICBpZiAoY29kZSA9PSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVCkKKyAgICAgICAgICAgIHJldHVybiBjb2RlOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiBhbnkgdHdvIGFyZSBkaWZmZXJlbnQsIHRoZSBhbnN3ZXIgaXMgamF2YS5sYW5nLk9iamVjdAorICAgICAgICAgICAgaWYgKGNvZGUgIT0gamF2YVR5cGVDb2RlRm9yVHlwZSh0eXBlc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgamF2YVR5cGVDb2RlRm9yVHlwZShTY2hlbWFUeXBlIHNUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOworCisgICAgICAgIGlmIChzVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIGFuIGludGVyZXN0aW5nIGNvbW1vbiBiYXNlIHR5cGUsIGUuZy4sIGZvciBzdHJpbmcgZW51bXMKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgYmFzZVR5cGUgPSBzVHlwZS5nZXRVbmlvbkNvbW1vbkJhc2VUeXBlKCk7CisgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhYmFzZVR5cGUuaXNVUlR5cGUoKSkKKyAgICAgICAgICAgICAgICBzVHlwZSA9IGJhc2VUeXBlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBqYXZhVHlwZUNvZGVJbkNvbW1vbihzVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1R5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0xJU1Q7CisKKyAgICAgICAgaWYgKHNUeXBlLmlzVVJUeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuWE1MX09CSkVDVDsKKworICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5YTUxfT0JKRUNUOworICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NUUklORzsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JPT0xFQU47CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURV9BUlJBWTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JZVEVfQVJSQVk7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9TVFJJTkc7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfRkxPQVQ7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoc1R5cGUuZ2V0RGVjaW1hbFNpemUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9JTlQ7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9MT05HOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19JTlRFR0VSOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0JJR19ERUNJTUFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nVHlwZShzVHlwZS5nZXRCYXNlRW51bVR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0VOVU07CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFQcm9wZXJ0eS5KQVZBX0dEVVJBVElPTjsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIFNjaGVtYVByb3BlcnR5LkpBVkFfREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyCisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9HREFURTsgLy8gY29udmVydGVkIHRvIGNhbGVuZGFyIChKQVgtQikKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHkuSkFWQV9DQUxFTkRBUjsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogInVucmVjb2duaXplZCBjb2RlICIgKyBzVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5yZWNvZ25pemVkIGNvZGUgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSArICIgb2YgIiArIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eU1vZGVsT3JkZXJJbnNlbnNpdGl2ZShTY2hlbWFQcm9wZXJ0eVtdIHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBwcm9wZXJ0aWVzW2ldOworICAgICAgICAgICAgaWYgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHByb3AuaGFzRml4ZWQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAocHJvcC5oYXNEZWZhdWx0KCkgIT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgJiYKKyAgICAgICAgICAgICAgICBwcm9wLmdldERlZmF1bHRUZXh0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIGludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBTdHJpbmcgbGFzdFNlZ21lbnQgPSBuYW1lLnN1YnN0cmluZyhpICsgMSk7CisgICAgICAgIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiRG9jdW1lbnQiKSAmJiAhbGFzdFNlZ21lbnQuZXF1YWxzKCJEb2N1bWVudCIpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRJbm5lckNsYXNzTmFtZXMoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKCJFbnVtIikgfHwgbmFtZS5lcXVhbHMoIkZhY3RvcnkiKSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIFBST1RFQ1RFRF9QUk9QRVJUSUVTID0geworICAgICAgICAiU3RyaW5nVmFsdWUiLAorICAgICAgICAiQm9vbGVhblZhbHVlIiwKKyAgICAgICAgIkJ5dGVWYWx1ZSIsCisgICAgICAgICJTaG9ydFZhbHVlIiwKKyAgICAgICAgIkludFZhbHVlIiwKKyAgICAgICAgIkxvbmdWYWx1ZSIsCisgICAgICAgICJCaWdJbnRlZ2VyVmFsdWUiLAorICAgICAgICAiQmlnRGVjaW1hbFZhbHVlIiwKKyAgICAgICAgIkZsb2F0VmFsdWUiLAorICAgICAgICAiRG91YmxlVmFsdWUiLAorICAgICAgICAiQnl0ZUFycmF5VmFsdWUiLAorICAgICAgICAiRW51bVZhbHVlIiwKKyAgICAgICAgIkNhbGVuZGFyVmFsdWUiLAorICAgICAgICAiRGF0ZVZhbHVlIiwKKyAgICAgICAgIkdEYXRlVmFsdWUiLAorICAgICAgICAiR0R1cmF0aW9uVmFsdWUiLAorICAgICAgICAiUU5hbWVWYWx1ZSIsCisgICAgICAgICJMaXN0VmFsdWUiLAorICAgICAgICAiT2JqZWN0VmFsdWUiLAorICAgICAgICAiQ2xhc3MiLAorICAgIH07CisgICAgc3RhdGljIFNldCBQUk9URUNURURfUFJPUEVSVElFU19TRVQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFBST1RFQ1RFRF9QUk9QRVJUSUVTKSk7CisKKyAgICBzdGF0aWMgYm9vbGVhbiBwcm90ZWN0UmVzZXJ2ZWRQcm9wZXJ0eU5hbWVzKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBST1RFQ1RFRF9QUk9QRVJUSUVTX1NFVC5jb250YWlucyhuYW1lKSB8fAorICAgICAgICAgICAgKG5hbWUuZW5kc1dpdGgoIkFycmF5IikgJiYgIW5hbWUuZXF1YWxzKCJBcnJheSIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHBpY2tGdWxsSmF2YUNsYXNzTmFtZShTZXQgdXNlZE5hbWVzLCBRTmFtZSBxTmFtZSwgU3RyaW5nIGNvbmZpZ25hbWUsIGJvb2xlYW4gaXNEb2N1bWVudCwgYm9vbGVhbiBpc0F0dHJUeXBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGJhc2U7CisgICAgICAgIGJvb2xlYW4gcHJvdGVjdDsKKworICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsICYmIGNvbmZpZ25hbWUuaW5kZXhPZignLicpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGEgY29uZmlnbmFtZSB3aXRoIGRvdHMgZGVmaW5lcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGphdmEgY2xhc3MgbmFtZQorICAgICAgICAgICAgYmFzZSA9IGNvbmZpZ25hbWU7CisgICAgICAgICAgICBwcm90ZWN0ID0gcHJvdGVjdFJlc2VydmVkR2xvYmFsQ2xhc3NOYW1lcyhiYXNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKworICAgICAgICAgICAgYmFzZSA9IE5hbWVVdGlsLmdldENsYXNzTmFtZUZyb21RTmFtZShxTmFtZSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWFwcGluZyBmcm9tIG5hbWVzcGFjZSBVUkkgdG8gSmF2YSBwYWNrYWdlCisgICAgICAgICAgICAvLyBuYW1lLiBJZiBzbywgYXBwbHkgdGhlIG1hcHBlZCBwYWNrYWdlIHByZWZpeCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgICAgICAvLyB0aGUgYmFzZSBuYW1lCisKKyAgICAgICAgICAgIFN0cmluZyBwa2dQcmVmaXggPSBzdGF0ZS5nZXRQYWNrYWdlT3ZlcnJpZGUodXJpKTsKKworICAgICAgICAgICAgaWYgKHBrZ1ByZWZpeCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEZvcm0gdGhlIG5ldyBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmcm9tIHRoZSBuZXcgcGFja2FnZSBuYW1lCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQorICAgICAgICAgICAgICAgIGJhc2UgPSBwa2dQcmVmaXggKyAiLiIgKyBiYXNlLnN1YnN0cmluZyhiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJlZml4Li4uCisgICAgICAgICAgICBTdHJpbmcgamF2YVByZWZpeCA9IHN0YXRlLmdldEphdmFQcmVmaXgodXJpKTsKKyAgICAgICAgICAgIGlmIChqYXZhUHJlZml4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpICsgamF2YVByZWZpeCArIGJhc2Uuc3Vic3RyaW5nKGJhc2UubGFzdEluZGV4T2YoJy4nKSArIDEpOworCisgICAgICAgICAgICAvLyBhIGNvbmZpZ25hbWUgd2l0aG91dCBkb3RzIG1heSBvdmVycmlkZSB0aGUgc2hvcnRuYW1lIHBhcnQuCisgICAgICAgICAgICBpZiAoY29uZmlnbmFtZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnN1YnN0cmluZygwLCBiYXNlLmxhc3RJbmRleE9mKCcuJykgKyAxKSArIGNvbmZpZ25hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3QgPSBwcm90ZWN0UmVzZXJ2ZWRHbG9iYWxDbGFzc05hbWVzKGJhc2UpOworICAgICAgICAgICAgaWYgKGNvbmZpZ25hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgc3BlY2lhbCBzdWZmaXgKKyAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgKyAiRG9jdW1lbnQiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQXR0clR5cGUpCisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlICsgIkF0dHJpYnV0ZSI7CisKKyAgICAgICAgICAgICAgICAvLyBhZGQgY29uZmlndXJlZCBzdWZmaXgKKyAgICAgICAgICAgICAgICBTdHJpbmcgamF2YVN1ZmZpeCA9IHN0YXRlLmdldEphdmFTdWZmaXgodXJpKTsKKyAgICAgICAgICAgICAgICBpZiAoamF2YVN1ZmZpeCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBiYXNlID0gYmFzZSArIGphdmFTdWZmaXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgb3V0ZXJtb3N0UGtnID0gZ2V0T3V0ZXJtb3N0UGFja2FnZShiYXNlKTsKKworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBTdHJpbmcgdW5pcU5hbWU7CisgICAgICAgIGlmIChwcm90ZWN0KQorICAgICAgICAgICAgdW5pcU5hbWUgPSBiYXNlICsgaW5kZXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZTsKKyAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCB1bmlxTmFtZS5lcXVhbHMob3V0ZXJtb3N0UGtnKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHVuaXFOYW1lID0gYmFzZSArIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZS50b0xvd2VyQ2FzZSgpKTsKKworICAgICAgICByZXR1cm4gdW5pcU5hbWU7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRPdXRlcm1vc3RQYWNrYWdlKFN0cmluZyBmcWNuKQorICAgIHsKKyAgICAgICAgaWYgKGZxY24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKworICAgICAgICAvLyByZW1vdmUgY2xhc3MgbmFtZQorICAgICAgICBpbnQgbGFzdGRvdCA9IGZxY24uaW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdGRvdCA8IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgLy8gcmVtb3ZlIG91dGVyIHBhY2thZ2UgbmFtZXMKKyAgICAgICAgcmV0dXJuIGZxY24uc3Vic3RyaW5nKDAsIGxhc3Rkb3QpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcGlja0Z1bGxKYXZhSW1wbE5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGludGZOYW1lKQorICAgIHsKKyAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBwYWNrYWdlIGZyb20gdGhlIGNsYXNzIG5hbWUgc28gd2UgY2FuIHJlcGxhY2UgaXQKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGludGZOYW1lOworICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IG51bGw7CisgICAgICAgIGludCBpbmRleCA9IGludGZOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICAgIHBrZ05hbWUgPSBpbnRmTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9ybSB0aGUgbmV3IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIG5ldyBwYWNrYWdlIG5hbWUKKyAgICAgICAgLy8gYW5kIHRoZSBvbGQgY2xhc3MgbmFtZQorICAgICAgICBTdHJpbmcgYmFzZSA9IHBrZ05hbWUgKyAiLmltcGwuIiArIGNsYXNzTmFtZSArICJJbXBsIjsKKworICAgICAgICBpbmRleCA9IDE7CisgICAgICAgIFN0cmluZyB1bmlxTmFtZSA9IGJhc2U7CisgICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUudG9Mb3dlckNhc2UoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB1bmlxTmFtZSA9IGJhc2UgKyBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUudG9Mb3dlckNhc2UoKSk7CisKKyAgICAgICAgcmV0dXJuIHVuaXFOYW1lOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcGlja0phdmFQcm9wZXJ0eU5hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQorICAgIHsKKyAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCisgICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7CisgICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZFByb3BlcnR5TmFtZXMoamF2YU5hbWUpOworICAgICAgICBTdHJpbmcgdW5pcU5hbWU7CisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChwcm90ZWN0KQorICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OworICAgICAgICBlbHNlCisgICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lOworICAgICAgICB3aGlsZSAodXNlZE5hbWVzLmNvbnRhaW5zKHVuaXFOYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWUgKyBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHVzZWROYW1lcy5hZGQodW5pcU5hbWUpOworCisgICAgICAgIHJldHVybiB1bmlxTmFtZTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHBpY2tJbm5lckphdmFDbGFzc05hbWUoU2V0IHVzZWROYW1lcywgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIGphdmFOYW1lKQorICAgIHsKKyAgICAgICAgaWYgKGphdmFOYW1lID09IG51bGwpCisgICAgICAgICAgICBqYXZhTmFtZSA9IE5hbWVVdGlsLnVwcGVyQ2FtZWxDYXNlKGxvY2FsTmFtZSk7CisgICAgICAgIGJvb2xlYW4gcHJvdGVjdCA9IHByb3RlY3RSZXNlcnZlZElubmVyQ2xhc3NOYW1lcyhqYXZhTmFtZSk7CisgICAgICAgIFN0cmluZyB1bmlxTmFtZTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgaWYgKHByb3RlY3QpCisgICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVuaXFOYW1lID0gamF2YU5hbWU7CisgICAgICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModW5pcU5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgdW5pcU5hbWUgPSBqYXZhTmFtZSArIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgdXNlZE5hbWVzLmFkZCh1bmlxTmFtZSk7CisKKyAgICAgICAgcmV0dXJuIHVuaXFOYW1lOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgcGlja0lubmVySmF2YUltcGxOYW1lKFNldCB1c2VkTmFtZXMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBqYXZhTmFtZSkKKyAgICB7CisgICAgICAgIGlmIChqYXZhTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgamF2YU5hbWUgPSBOYW1lVXRpbC51cHBlckNhbWVsQ2FzZShsb2NhbE5hbWUpICsgIkltcGwiOworICAgICAgICBTdHJpbmcgdW5pcU5hbWUgPSBqYXZhTmFtZTsKKyAgICAgICAgaW50IGluZGV4ID0gMTsKKyAgICAgICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh1bmlxTmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICB1bmlxTmFtZSA9IGphdmFOYW1lICsgaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICB1c2VkTmFtZXMuYWRkKHVuaXFOYW1lKTsKKworICAgICAgICByZXR1cm4gdW5pcU5hbWU7CisgICAgfQorCisgICAgc3RhdGljIFFOYW1lIGZpbmRUb3BOYW1lKFNjaGVtYVR5cGUgc1R5cGUpCisgICAgeworICAgICAgICBpZiAoc1R5cGUuZ2V0TmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gc1R5cGUuZ2V0TmFtZSgpOworCisgICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBIGRvY3VtZW50IHR5cGUgbXVzdCBoYXZlIGEgY29udGVudCBtb2RlbCBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGVsdAorICAgICAgICAgICAgaWYgKHNUeXBlLmdldENvbnRlbnRNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0Q29udGVudE1vZGVsKCkuZ2V0UGFydGljbGVUeXBlKCkgIT0gU2NoZW1hUGFydGljbGUuRUxFTUVOVCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gKHNUeXBlLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1R5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpID09IG51bGwgfHwgc1R5cGUuZ2V0QXR0cmlidXRlTW9kZWwoKS5nZXRBdHRyaWJ1dGVzKCkubGVuZ3RoICE9IDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIHNUeXBlLmdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFGaWVsZCBzRWx0ID0gc1R5cGUuZ2V0Q29udGFpbmVyRmllbGQoKTsKKyAgICAgICAgYXNzZXJ0KHNFbHQgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydChzVHlwZS5nZXRPdXRlclR5cGUoKSA9PSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHNFbHQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1Jlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OGQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsRWxlbWVudDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQXR0cmlidXRlOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5LZXlyZWZEb2N1bWVudC5LZXlyZWY7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGNsYXNzIFN0c2NSZXNvbHZlcgoreworICAgIC8qKgorICAgICAqIERvZXMgYSB0b3BvIHdhbGsgb2YgYWxsIHRoZSB0eXBlcyB0byByZXNvbHZlIHRoZW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVBbGwoKQorICAgIHsKKyAgICAgICAgLy8gcmVzb2x2ZSB0cmVlIG9mIHR5cGVzCisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKworICAgICAgICBTY2hlbWFUeXBlW10gZG9jdW1lbnRUeXBlcyA9IHN0YXRlLmRvY3VtZW50VHlwZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZG9jdW1lbnRUeXBlcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoKFNjaGVtYVR5cGVJbXBsKWRvY3VtZW50VHlwZXNbaV0pOworCisgICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RhdGUuZG9jdW1lbnRUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5hdHRyaWJ1dGVUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5yZWRlZmluZWRHbG9iYWxUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5nbG9iYWxUeXBlcygpKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgZ1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgcmVzb2x2ZVR5cGUoKFNjaGVtYVR5cGVJbXBsKWdUeXBlKTsKKyAgICAgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnVHlwZS5nZXRBbm9ueW1vdXNUeXBlcygpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIGFsbCBrZXlyZWYgcmVmcworICAgICAgICByZXNvbHZlSWRlbnRpdHlDb25zdHJhaW50cygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXNvbHZlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIGlmIChzSW1wbC5pc1Jlc29sdmVkKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKHNJbXBsLmlzUmVzb2x2aW5nKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZXJyb3IiLCBYbWxFcnJvckNvbnRleHQuQ1lDTElDX0RFUEVOREVOQ1ksIHNJbXBsLmdldFBhcnNlT2JqZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjeWNsaWMgZGVwZW5kZW5jeSBlcnJvcgorICAgICAgICB9CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2aW5nICIgKyBzSW1wbCk7CisKKyAgICAgICAgc0ltcGwuc3RhcnRSZXNvbHZpbmcoKTsKKworICAgICAgICBpZiAoc0ltcGwuaXNEb2N1bWVudFR5cGUoKSkKKyAgICAgICAgICAgIHJlc29sdmVEb2N1bWVudFR5cGUoc0ltcGwpOworICAgICAgICBlbHNlIGlmIChzSW1wbC5pc0F0dHJpYnV0ZVR5cGUoKSkKKyAgICAgICAgICAgIHJlc29sdmVBdHRyaWJ1dGVUeXBlKHNJbXBsKTsKKyAgICAgICAgZWxzZSBpZiAoc0ltcGwuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgICAgICBTdHNjU2ltcGxlVHlwZVJlc29sdmVyLnJlc29sdmVTaW1wbGVUeXBlKHNJbXBsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIucmVzb2x2ZUNvbXBsZXhUeXBlKHNJbXBsKTsKKworICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmcoKTsKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCByZXNvbHZpbmcgIiArIHNJbXBsKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIGFzc2VydCBzSW1wbC5pc0RvY3VtZW50VHlwZSgpOworCisgICAgICAgIGlmIChzSW1wbC5pc1NHUmVzb2x2ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoc0ltcGwuaXNTR1Jlc29sdmluZygpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkN5Y2xpYyBkZXBlbmRlbmN5IGVycm9yIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBzSW1wbC5nZXRQYXJzZU9iamVjdCgpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY3ljbGljIGRlcGVuZGVuY3kgZXJyb3IKKyAgICAgICAgfQorCisgICAgICAgIHNJbXBsLnN0YXJ0UmVzb2x2aW5nU0dzKCk7CisKKyAgICAgICAgLy8gUmVzb2x2ZSBzdWJzdGl0dXRpb24gZ3JvdXAKKworICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWx0ID0gKFRvcExldmVsRWxlbWVudClzSW1wbC5nZXRQYXJzZU9iamVjdCgpOworICAgICAgICBTY2hlbWFUeXBlSW1wbCBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7CisgICAgICAgIFFOYW1lIGVsdE5hbWUgPSBuZXcgUU5hbWUoc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGVsdC5nZXROYW1lKCkpOworCisgICAgICAgIC8vIEJVRzogSG93IGRvIEkgdGVsbCBpZiB0aGUgdHlwZSBpcyBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQ/CisgICAgICAgIGlmIChlbHQuaXNTZXRTdWJzdGl0dXRpb25Hcm91cCgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCAKKyAgICAgICAgICAgICAgICBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7CisKKyAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQorICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5ub3RGb3VuZEVycm9yKGVsdC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9SRUZfTk9UX0ZPVU5ELCBlbHQueGdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IC0gaWdub3JlIHN1YnN0aXR1dGlvbiBncm91cAorICAgICAgICAgICAgZWxzZSBpZiAoISByZXNvbHZlU3Vic3RpdHV0aW9uR3JvdXAoc3Vic3RpdHV0aW9uR3JvdXApICkKKyAgICAgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc0ltcGwuc2V0U3Vic3RpdHV0aW9uR3JvdXAoZWx0LmdldFN1YnN0aXR1dGlvbkdyb3VwKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FsayB1cCB0aGUgY2hhaW4gb2Ygc3VidGl0dXRpb24gZ3JvdXBzIGFkZGluZyB0aGlzIHNjaGVtYXR5cGUgdG8gZWFjaCBoZWFkJ3MKKyAgICAgICAgLy8gbWVtYmVyIGxpc3QKKyAgICAgICAgd2hpbGUgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCisgICAgICAgIHsKKworICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoZWx0TmFtZSk7CisKKyAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cC5nZXRTdWJzdGl0dXRpb25Hcm91cCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gU3RzY1N0YXRlLmdldCgpLmZpbmREb2N1bWVudFR5cGUoCisgICAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgc3Vic3RpdHV0aW9uR3JvdXAuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworCisgICAgICAgICAgICBhc3NlcnQgc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBkb2N1bWVudCB0eXBlIGZvcjogIiArIHN1YnN0aXR1dGlvbkdyb3VwLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7CisKKyAgICAgICAgICAgIGlmICghIHJlc29sdmVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCkgKQorICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbnVsbDsgLy8gY3ljbGljIGRlcGVuZGVuY3kgLSBubyBzdWJzdCBncm91cAorCisgICAgICAgIH0KKworICAgICAgICBzSW1wbC5maW5pc2hSZXNvbHZpbmdTR3MoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZURvY3VtZW50VHlwZSAoIFNjaGVtYVR5cGVJbXBsIHNJbXBsICkKKyAgICB7CisgICAgICAgIGFzc2VydCBzSW1wbC5pc1Jlc29sdmluZygpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHNJbXBsLmlzRG9jdW1lbnRUeXBlKCk7CisgICAgICAgIAorCisgICAgICAgIC8vIHRyYW5zbGF0ZSB0aGUgZ2xvYmFsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQgdHlwZQorICAgICAgICAvLyBhbmQgY29uc3RydWN0IGEgY29udGVudCBtb2RlbCB3aGljaCBhbGxvd3MganVzdCB0aGF0IGVsZW1lbnQKKyAgICAgICAgCisgICAgICAgIExpc3QgYW5vblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGVsZW1lbnQgPQorICAgICAgICAgICAgKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKQorICAgICAgICAgICAgICAgIFN0c2NUcmFuc2xhdG9yLnRyYW5zbGF0ZUVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBzSW1wbC5nZXRQYXJzZU9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuaXNDaGFtZWxlb24oKSwKKyAgICAgICAgICAgICAgICAgICAgYW5vblR5cGVzLCBzSW1wbCApOworCisgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgY29udGVudE1vZGVsID0gbnVsbDsKKworICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuYWRkR2xvYmFsRWxlbWVudCggZWxlbWVudCApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnRlbnRNb2RlbCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7CisgICAgICAgIAorICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFBhcnRpY2xlVHlwZSggU2NoZW1hUGFydGljbGUuRUxFTUVOVCApOworICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEVsZW1lbnRUb0xvY2FsRWxlbWVudCggZWxlbWVudCwgY29udGVudE1vZGVsICk7CisgICAgICAgICAgICBjb250ZW50TW9kZWwuc2V0TWluT2NjdXJzKCBCaWdJbnRlZ2VyLk9ORSApOworICAgICAgICAgICAgY29udGVudE1vZGVsLnNldE1heE9jY3VycyggQmlnSW50ZWdlci5PTkUgKTsKKworICAgICAgICAgICAgY29udGVudE1vZGVsLnNldFRyYW5zaXRpb25Ob3RlcyhRTmFtZVNldC5FTVBUWSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBNYXAgZWxlbWVudFByb3BlcnR5TW9kZWwgPQorICAgICAgICAgICAgU3RzY0NvbXBsZXhUeXBlUmVzb2x2ZXIuYnVpbGRDb250ZW50UHJvcGVydHlNb2RlbEJ5UU5hbWUoCisgICAgICAgICAgICAgICAgY29udGVudE1vZGVsLCBzSW1wbCApOworCisgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VUeXBlID0gc0ltcGwuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSA9PSBudWxsID8KKyAgICAgICAgICAgIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9UWVBFIDoKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5maW5kRG9jdW1lbnRUeXBlKHNJbXBsLmdldFN1YnN0aXR1dGlvbkdyb3VwKCksIAorICAgICAgICAgICAgICAgICBzSW1wbC5pc0NoYW1lbGVvbigpID8gc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgOiBudWxsKQorICAgICAgICAgICAgOworCisgICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKCBiYXNlVHlwZS5nZXRSZWYoKSApOworICAgICAgICBzSW1wbC5zZXRCYXNlRGVwdGgoIGJhc2VUeXBlLmdldEJhc2VEZXB0aCgpICsgMSApOworICAgICAgICBzSW1wbC5zZXREZXJpdmF0aW9uVHlwZSggU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTiApOworICAgICAgICBzSW1wbC5zZXRDb21wbGV4VHlwZVZhcmlldHkoIFNjaGVtYVR5cGUuRUxFTUVOVF9DT05URU5UICk7CisKKyAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAorICAgICAgICAgICAgY29udGVudE1vZGVsLCBuZXcgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsKCksCisgICAgICAgICAgICBlbGVtZW50UHJvcGVydHlNb2RlbCwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBmYWxzZSApOworICAgICAgICAKKyAgICAgICAgc0ltcGwuc2V0V2lsZGNhcmRTdW1tYXJ5KAorICAgICAgICAgICAgUU5hbWVTZXQuRU1QVFksIGZhbHNlLCBRTmFtZVNldC5FTVBUWSwgZmFsc2UgKTsKKworICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyggbWFrZVJlZkFycmF5KCBhbm9uVHlwZXMgKSApOworCisKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUF0dHJpYnV0ZVR5cGUgKCBTY2hlbWFUeXBlSW1wbCBzSW1wbCApCisgICAgeworICAgICAgICBhc3NlcnQgc0ltcGwuaXNSZXNvbHZpbmcoKTsKKworICAgICAgICBhc3NlcnQgc0ltcGwuaXNBdHRyaWJ1dGVUeXBlKCk7CisgICAgICAgIAorICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZSA9CisgICAgICAgICAgICAoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCkgU3RzY1RyYW5zbGF0b3IudHJhbnNsYXRlQXR0cmlidXRlKAorICAgICAgICAgICAgICAgIChBdHRyaWJ1dGUpIHNJbXBsLmdldFBhcnNlT2JqZWN0KCksIHNJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpLAorICAgICAgICAgICAgICAgIHNJbXBsLmlzQ2hhbWVsZW9uKCksIGFub25UeXBlcywgc0ltcGwsIG51bGwsIGZhbHNlICk7CisKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWxJbXBsIGF0dHJpYnV0ZU1vZGVsID0gbmV3IFNjaGVtYUF0dHJpYnV0ZU1vZGVsSW1wbCgpOworCisgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmFkZEdsb2JhbEF0dHJpYnV0ZSggYXR0cmlidXRlICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCBhdHRyaWJ1dGVDb3B5ID0gbmV3IFNjaGVtYUxvY2FsQXR0cmlidXRlSW1wbCgpOworICAgICAgICAgICAgU3RzY1RyYW5zbGF0b3IuY29weUdsb2JhbEF0dHJpYnV0ZVRvTG9jYWxBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgYXR0cmlidXRlQ29weSApOworICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwuYWRkQXR0cmlidXRlKCBhdHRyaWJ1dGVDb3B5ICk7CisgICAgICAgIH0KKworICAgICAgICBzSW1wbC5zZXRCYXNlVHlwZVJlZiggQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEUuZ2V0UmVmKCkgKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKCBzSW1wbC5nZXRCYXNlRGVwdGgoKSArIDEgKTsKKyAgICAgICAgc0ltcGwuc2V0RGVyaXZhdGlvblR5cGUoIFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04gKTsKKyAgICAgICAgc0ltcGwuc2V0Q29tcGxleFR5cGVWYXJpZXR5KCBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgKTsKKyAgICAgICAgCisgICAgICAgIE1hcCBhdHRyaWJ1dGVQcm9wZXJ0eU1vZGVsID0KKyAgICAgICAgICAgIFN0c2NDb21wbGV4VHlwZVJlc29sdmVyLmJ1aWxkQXR0cmlidXRlUHJvcGVydHlNb2RlbEJ5UU5hbWUoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlTW9kZWwsIHNJbXBsICk7CisKKyAgICAgICAgc0ltcGwuc2V0Q29udGVudE1vZGVsKAorICAgICAgICAgICAgbnVsbCwgYXR0cmlidXRlTW9kZWwsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgYXR0cmlidXRlUHJvcGVydHlNb2RlbCwgZmFsc2UgKTsKKworICAgICAgICBzSW1wbC5zZXRXaWxkY2FyZFN1bW1hcnkoCisgICAgICAgICAgICBRTmFtZVNldC5FTVBUWSwgZmFsc2UsIFFOYW1lU2V0LkVNUFRZLCBmYWxzZSApOworICAgICAgICAKKyAgICAgICAgc0ltcGwuc2V0QW5vbnltb3VzVHlwZVJlZnMoIG1ha2VSZWZBcnJheSggYW5vblR5cGVzICkgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZUlkZW50aXR5Q29uc3RyYWludHMoKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW10gaWRjcyA9IHN0YXRlLmlkQ29uc3RyYWludHMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpZGNzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpZGNzW2ldLmlzUmVzb2x2ZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLZXlyZWYgeHNka3IgPSAoS2V5cmVmKWlkY3NbaV0uZ2V0UGFyc2VPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBRTmFtZSBrZXlOYW1lID0geHNka3IuZ2V0UmVmZXIoKTsKKyAgICAgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGtleSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBrZXkgPSBzdGF0ZS5maW5kSWRDb25zdHJhaW50KGtleU5hbWUsIGlkY3NbaV0uZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3Ioa2V5TmFtZSwgWG1sRXJyb3JDb250ZXh0LklEQ19OT1RfRk9VTkQsIHhzZGtyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuZ2V0Q29uc3RyYWludENhdGVnb3J5KCkgPT0gU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbC5DQ19LRVlSRUYpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiS2V5cmVmIGNhbm5vdCByZWZlciB0byBhbm90aGVyIGtleXJlZi4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmdldEZpZWxkcygpLmxlbmd0aCAhPSBpZGNzW2ldLmdldEZpZWxkcygpLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJLZXlyZWYgZG9lcyBub3QgaGF2ZSBzYW1lIG51bWJlciBvZiBmaWVsZHMgYXMga2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuSURDX05PVF9GT1VORCwgaWRjc1tpXS5nZXRQYXJzZU9iamVjdCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZGNzW2ldLnNldFJlZmVyZW5jZWRLZXkoa2V5LmdldFJlZigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTaW1wbGVUeXBlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNiM2JhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1NpbXBsZVR5cGVSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTEyMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNob3J0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRCeXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUG9zaXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuKjsKKworcHVibGljIGNsYXNzIFN0c2NTaW1wbGVUeXBlUmVzb2x2ZXIKK3sKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIFNJTVBMRSBUWVBFIFJFU09MVVRJT04gSEVSRQorICAgICAqCisgICAgICogU2ltcGxlIHR5cGVzIGNhbiBiZSBkZWNsYXJlZCBhcyBsaXN0cywgdW5pb25zLCBvciByZXN0cmljdGlvbnMuCisgICAgICogVGhlc2UgdGhyZWUgY2FzZXMgYXJlIHRyZWF0ZWQgc2VwYXJhdGVseSBpbiByZXNvbHZlTGlzdFR5cGUsCisgICAgICogcmVzb2x2ZVVuaW9uVHlwZSwgYW5kIHJlc29sdmVTaW1wbGVSZXN0cmljdGlvblR5cGUuCisgICAgICoKKyAgICAgKiBUaGUgaW50cmljYXRlIHdvcmsgd2l0aCBmYWNldHMgaXMgZG9uZSBpbiB0aGUgcmVzdHJpY3Rpb24gY2FzZSwKKyAgICAgKiB1c2luZyBtZXRob2QgY2FsbGVkIHJlc29sdmVGYWNldHMgKHRoZSB1bmlvbiBhbmQgbGlzdCBjYXNlcyBoYXZlCisgICAgICogdHJpdmlhbCBmYWNldCBydWxlcykuIFRoZW4gYWxsIHNpbXBsZSB0eXBlcyBjYWxsIHJlc29sdmVQcm9wZXJ0aWVzCisgICAgICogaW4gdGhlIGVuZCB0byBoYXZlIHRoZWlyICJmdW5kYW1lbnRhbCBmYWNldHMiIHJlc29sdmVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc29sdmVTaW1wbGVUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsKQorICAgIHsKKyAgICAgICAgU2ltcGxlVHlwZSBwYXJzZVN0ID0gKFNpbXBsZVR5cGUpc0ltcGwuZ2V0UGFyc2VPYmplY3QoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzSW1wbC5pc1NpbXBsZVR5cGUoKTsKKworICAgICAgICAvLyBWZXJpZnk6IGhhdmUgbGlzdCwgdW5pb24sIG9yIHJlc3RyaWN0aW9uLCBidXQgbm90IG1vcmUgdGhhbiBvbmUKKyAgICAgICAgaW50IGNvdW50ID0KKyAgICAgICAgICAgICAgICAocGFyc2VTdC5pc1NldExpc3QoKSA/IDEgOiAwKSArCisgICAgICAgICAgICAgICAgKHBhcnNlU3QuaXNTZXRVbmlvbigpID8gMSA6IDApICsKKyAgICAgICAgICAgICAgICAocGFyc2VTdC5pc1NldFJlc3RyaWN0aW9uKCkgPyAxIDogMCk7CisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkEgc2ltcGxlIHR5cGUgbXVzdCBkZWZpbmUgZWl0aGVyIGEgbGlzdCwgYSB1bmlvbiwgb3IgYSByZXN0cmljdGlvbjogbW9yZSB0aGFuIG9uZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX1NJTVBMRV9UWVBFX0RFRk4sCisgICAgICAgICAgICAgICAgICAgIHBhcnNlU3QpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIHRoZSBmaXJzdCBvZiBsaXN0LCB1bmlvbiwgcmVzdHIKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb3VudCA8IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSBzaW1wbGUgdHlwZSBtdXN0IGRlZmluZSBlaXRoZXIgYSBsaXN0LCBhIHVuaW9uLCBvciBhIHJlc3RyaWN0aW9uOiBub25lIHdhcyBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX1NJTVBMRV9UWVBFX0RFRk4sCisgICAgICAgICAgICAgICAgICAgIHBhcnNlU3QpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIHJlc3RyaWN0aW9uIG9mIGFueVNpbXBsZVR5cGUKKyAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IGZpbmFsIGZsYWdzCisgICAgICAgIGJvb2xlYW4gZmluYWxSZXN0ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZmluYWxMaXN0ID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZmluYWxVbmlvbiA9IGZhbHNlOworCisgICAgICAgIGlmIChwYXJzZVN0LmlzU2V0RmluYWwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyc2VTdC5nZXRGaW5hbCgpOworICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscygiI2FsbCIpKQorICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IGZpbmFsTGlzdCA9IGZpbmFsVW5pb24gPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJyZXN0cmljdGlvbiIpKQorICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoImxpc3QiKSkKKyAgICAgICAgICAgICAgICBmaW5hbExpc3QgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJ1bmlvbiIpKQorICAgICAgICAgICAgICAgIGZpbmFsVW5pb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHNJbXBsLnNldFNpbXBsZUZpbmFsKGZpbmFsUmVzdCwgZmluYWxMaXN0LCBmaW5hbFVuaW9uKTsKKworICAgICAgICBMaXN0IGFub25UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBpZiAocGFyc2VTdC5nZXRMaXN0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc29sdmVMaXN0VHlwZShzSW1wbCwgcGFyc2VTdC5nZXRMaXN0KCksIGFub25UeXBlcyk7CisgICAgICAgIGVsc2UgaWYgKHBhcnNlU3QuZ2V0VW5pb24oKSAhPSBudWxsKQorICAgICAgICAgICAgcmVzb2x2ZVVuaW9uVHlwZShzSW1wbCwgcGFyc2VTdC5nZXRVbmlvbigpLCBhbm9uVHlwZXMpOworICAgICAgICBlbHNlIGlmIChwYXJzZVN0LmdldFJlc3RyaWN0aW9uKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc29sdmVTaW1wbGVSZXN0cmljdGlvblR5cGUoc0ltcGwsIHBhcnNlU3QuZ2V0UmVzdHJpY3Rpb24oKSwgYW5vblR5cGVzKTsKKworICAgICAgICBzSW1wbC5zZXRBbm9ueW1vdXNUeXBlUmVmcyhtYWtlUmVmQXJyYXkoYW5vblR5cGVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZS5SZWZbXSBtYWtlUmVmQXJyYXkoQ29sbGVjdGlvbiB0eXBlTGlzdCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGUuUmVmW10gcmVzdWx0ID0gbmV3IFNjaGVtYVR5cGUuUmVmW3R5cGVMaXN0LnNpemUoKV07CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IGorKykKKyAgICAgICAgICAgIHJlc3VsdFtqXSA9ICgoU2NoZW1hVHlwZSlpLm5leHQoKSkuZ2V0UmVmKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIHNJbXBsLnNldFNpbXBsZVR5cGVWYXJpZXR5KFNjaGVtYVR5cGUuQVRPTUlDKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7CisgICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7CisgICAgICAgIHNJbXBsLnNldFByaW1pdGl2ZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzb2x2ZUxpc3RUeXBlKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkxpc3REb2N1bWVudC5MaXN0IHBhcnNlTGlzdCwgTGlzdCBhbm9uVHlwZXMpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoU2NoZW1hVHlwZS5MSVNUKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7CisgICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7CisgICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOworCisgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VMaXN0KTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBRTmFtZSBpdGVtTmFtZSA9IHBhcnNlTGlzdC5nZXRJdGVtVHlwZSgpOworICAgICAgICBMb2NhbFNpbXBsZVR5cGUgcGFyc2VJbm5lciA9IHBhcnNlTGlzdC5nZXRTaW1wbGVUeXBlKCk7CisKKyAgICAgICAgaWYgKGl0ZW1OYW1lICE9IG51bGwgJiYgcGFyc2VJbm5lciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTGlzdCB0eXBlIGRlZmluaXRpb25zIHByb3ZpZGUgZWl0aGVyIGFuIGl0ZW1UeXBlIGF0dHJpYnV0ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlVHlwZTogYm90aCB3ZXJlIGZvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfTkVTVEVEX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlTGlzdCk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBpbm5lciBzaW1wbGUgdHlwZS4KKyAgICAgICAgICAgIHBhcnNlSW5uZXIgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hVHlwZUltcGwgaXRlbUltcGw7CisgICAgICAgIFhtbE9iamVjdCBlcnJvckxvYzsKKworICAgICAgICBpZiAoaXRlbU5hbWUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlbUltcGwgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShpdGVtTmFtZSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworICAgICAgICAgICAgZXJyb3JMb2MgPSBwYXJzZUxpc3QueGdldEl0ZW1UeXBlKCk7CisgICAgICAgICAgICBpZiAoaXRlbUltcGwgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKGl0ZW1OYW1lLCBYbWxFcnJvckNvbnRleHQuVFlQRV9OT1RfRk9VTkQsIHBhcnNlTGlzdC54Z2V0SXRlbVR5cGUoKSk7CisgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IGl0IGFzIGEgbGlzdCBvZiBhbnlTaW1wbGVUeXBlCisgICAgICAgICAgICAgICAgaXRlbUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcnNlSW5uZXIgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlbUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICAgICAgZXJyb3JMb2MgPSBwYXJzZUlubmVyOworICAgICAgICAgICAgaXRlbUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKKyAgICAgICAgICAgIGl0ZW1JbXBsLnNldFBhcnNlQ29udGV4dChwYXJzZUlubmVyLCBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgaXRlbUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKHNJbXBsLmdldFJlZigpKTsKKyAgICAgICAgICAgIGFub25UeXBlcy5hZGQoaXRlbUltcGwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxpc3QgdHlwZSBkZWZpbml0aW9ucyBwcm92aWRlIGVpdGhlciBhbiBpdGVtVHlwZSBhdHRyaWJ1dGUgIiArCisgICAgICAgICAgICAgICAgICAgICJvciBjb250YWluIGEgbmVzdGVkIHNpbXBsZVR5cGU6IG5laXRoZXIgd2FzIGZvdW5kLiIsCisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5MSVNUX01JU1NJTkdfSVRFTSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VMaXN0KTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQorICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgZmluYWwgcmVzdHJpY3Rpb25zCisgICAgICAgIGlmIChpdGVtSW1wbC5maW5hbExpc3QoKSkKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVyaXZlIGJ5IGxpc3QgYSBmaW5hbCB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfREVSSVZFX0ZJTkFMLCBwYXJzZUxpc3QpOworCisgICAgICAgIC8vIFJlY3Vyc2lvbi4uLgorICAgICAgICBTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUoaXRlbUltcGwpOworCisgICAgICAgIGlmICghaXRlbUltcGwuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJdGVtIHR5cGUgZm9yIHRoaXMgbGlzdCB0eXBlIGlzIG5vdCBzaW1wbGUiLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuTElTVF9JVEVNX05PVF9TSU1QTEUsIGVycm9yTG9jKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCB0aGUgaXRlbSB0eXBlIGFzIGFueVNpbXBsZVR5cGUKKyAgICAgICAgICAgIHNJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoaXRlbUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBpdGVtIHR5cGUgaXMgYW5vdGhlciBsaXN0IHR5cGU7IGxpc3RzIG9mIGxpc3RzIGFyZSBub3QgYWxsb3dlZC4iLCBYbWxFcnJvckNvbnRleHQuTElTVF9PRl9MSVNULCBlcnJvckxvYyk7CisgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHRyZWF0IHRoZSBsaXN0IGFzIGFuIGFueVNpbXBsZVR5cGUKKyAgICAgICAgICAgICAgICByZXNvbHZlRXJyb3JTaW1wbGVUeXBlKHNJbXBsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1JbXBsLmlzVW5pb25PZkxpc3RzKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBpdGVtIHR5cGUgaXMgYSB1bmlvbiBjb250YWluaW5nIGEgbGlzdDsgbGlzdHMgb2YgbGlzdHMgYXJlIG5vdCBhbGxvd2VkLiIsIFhtbEVycm9yQ29udGV4dC5MSVNUX09GX0xJU1QsIGVycm9yTG9jKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUVycm9yU2ltcGxlVHlwZShzSW1wbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2g6IG5vbmxpc3QgdW5pb25zIGFyZSBqdXN0IGxpa2UgYXRvbWljIGl0ZW1zCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgorICAgICAgICAgICAgICAgIHNJbXBsLnNldExpc3RJdGVtVHlwZVJlZihpdGVtSW1wbC5nZXRSZWYoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEUuZ2V0UmVmKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IGRlYWwgd2l0aCBmYWNldHMKKyAgICAgICAgc0ltcGwuc2V0QmFzaWNGYWNldHMoU3RzY1N0YXRlLkZBQ0VUU19MSVNULCBTdHNjU3RhdGUuRklYRURfRkFDRVRTX0xJU1QpOworICAgICAgICBzSW1wbC5zZXRXaGl0ZVNwYWNlUnVsZSggU2NoZW1hVHlwZS5XU19DT0xMQVBTRSApOworCisgICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcworICAgICAgICByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOworICAgIH0KKworCisKKworICAgIHN0YXRpYyB2b2lkIHJlc29sdmVVbmlvblR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwsIFVuaW9uRG9jdW1lbnQuVW5pb24gcGFyc2VVbmlvbiwgTGlzdCBhbm9uVHlwZXMpCisgICAgeworICAgICAgICBzSW1wbC5zZXRTaW1wbGVUeXBlVmFyaWV0eShTY2hlbWFUeXBlLlVOSU9OKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZVR5cGVSZWYoQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRS5nZXRSZWYoKSk7CisgICAgICAgIHNJbXBsLnNldEJhc2VEZXB0aChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFLmdldEJhc2VEZXB0aCgpICsgMSk7CisgICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOworCisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkEgdHlwZSByZWRlZmluaXRpb24gbXVzdCByZXN0cmljdCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VVbmlvbik7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTGlzdCBtZW1iZXJUeXBlcyA9IHBhcnNlVW5pb24uZ2V0TWVtYmVyVHlwZXMoKTsKKyAgICAgICAgU2ltcGxlVHlwZVtdIHNpbXBsZVR5cGVzID0gcGFyc2VVbmlvbi5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKKworICAgICAgICBMaXN0IG1lbWJlckltcGxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAKKyAgICAgICAgaWYgKHNpbXBsZVR5cGVzLmxlbmd0aCA9PSAwICYmIChtZW1iZXJUeXBlcyA9PSBudWxsIHx8IG1lbWJlclR5cGVzLnNpemUoKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkEgdW5pb24gdHlwZSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIG1lbWJlciB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LlVOSU9OX01FTUJFUl9OT1RfU0lNUExFLCBwYXJzZVVuaW9uKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBvaCB3ZWxsLCB6ZXJvIG1lbWJlciB0eXBlcyBpcyBmaW5lLgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbU5hbWVzID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgbU5hbWVzLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFOYW1lIG1OYW1lID0gKFFOYW1lKW1OYW1lcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbWVtYmVySW1wbCA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKG1OYW1lLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1lbWJlckltcGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHNraXAgbWVtYmVyCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IobU5hbWUsIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgcGFyc2VVbmlvbi54Z2V0TWVtYmVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtZW1iZXJJbXBsTGlzdC5hZGQobWVtYmVySW1wbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbXBsZVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCVUdCVUc6IHNlZSBpZiBub248c2ltcGxlVHlwZT4gY2hpbGRyZW4gY2FuIGxlYWsgdGhyb3VnaAorICAgICAgICAgICAgU2NoZW1hVHlwZUltcGwgbUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICAgICAgbUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKKyAgICAgICAgICAgIG1JbXBsLnNldFBhcnNlQ29udGV4dChzaW1wbGVUeXBlc1tpXSwgc0ltcGwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNJbXBsLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpICE9IG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgIG1lbWJlckltcGxMaXN0LmFkZChtSW1wbCk7CisgICAgICAgICAgICBtSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYoc0ltcGwuZ2V0UmVmKCkpOworICAgICAgICAgICAgbUltcGwuc2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKGkgKyAxKTsKKyAgICAgICAgICAgIGFub25UeXBlcy5hZGQobUltcGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzZSBhbmQgcmVzb2x2ZSBhbGwgbWVtYmVyIHR5cGVzCisgICAgICAgIGZvciAoSXRlcmF0b3IgbUltcGxzID0gbWVtYmVySW1wbExpc3QuaXRlcmF0b3IoKTsgbUltcGxzLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltSW1wbHMubmV4dCgpOworICAgICAgICAgICAgaWYgKCFTdHNjUmVzb2x2ZXIucmVzb2x2ZVR5cGUobUltcGwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSW1wbC5nZXRPdXRlclR5cGUoKS5lcXVhbHMoc0ltcGwpKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyIGhhcyBhIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIHRoZSBjb250YWluaW5nIHVuaW9uIiwgIFhtbEVycm9yQ29udGV4dC5DWUNMSUNfREVQRU5ERU5DWSwgbUltcGwuZ2V0UGFyc2VPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobUltcGwuZ2V0TmFtZSgpKSArICIgaGFzIGEgY3ljbGljIGRlcGVuZGVuY3kgb24gdGhlIHVuaW9uIiwgWG1sRXJyb3JDb250ZXh0LkNZQ0xJQ19ERVBFTkRFTkNZLCBwYXJzZVVuaW9uLnhnZXRNZW1iZXJUeXBlcygpKTsKKworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhlIGVycmFudCB1bmlvbiBtZW1iZXIKKyAgICAgICAgICAgICAgICBtSW1wbHMucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgdmVyaWZ5IG1lbWJlcnMKKyAgICAgICAgYm9vbGVhbiBpc1VuaW9uT2ZMaXN0cyA9IGZhbHNlOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgbUltcGxzID0gbWVtYmVySW1wbExpc3QuaXRlcmF0b3IoKTsgbUltcGxzLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltSW1wbHMubmV4dCgpOworCisgICAgICAgICAgICBpZiAoIW1JbXBsLmlzU2ltcGxlVHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSW1wbC5nZXRPdXRlclR5cGUoKSAhPSBudWxsICYmIG1JbXBsLmdldE91dGVyVHlwZSgpLmVxdWFscyhzSW1wbCkpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNZW1iZXIgaXMgbm90IHNpbXBsZSIsIFhtbEVycm9yQ29udGV4dC5VTklPTl9NRU1CRVJfTk9UX1NJTVBMRSwgbUltcGwuZ2V0UGFyc2VPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTWVtYmVyICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobUltcGwuZ2V0TmFtZSgpKSArICIgaXMgbm90IHNpbXBsZSIsIFhtbEVycm9yQ29udGV4dC5VTklPTl9NRU1CRVJfTk9UX1NJTVBMRSwgcGFyc2VVbmlvbi54Z2V0TWVtYmVyVHlwZXMoKSk7CisKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoZSBlcnJhbnQgdW5pb24gbWVtYmVyCisgICAgICAgICAgICAgICAgbUltcGxzLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCB8fAorICAgICAgICAgICAgICAgIG1JbXBsLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLlVOSU9OICYmIG1JbXBsLmlzVW5pb25PZkxpc3RzKCkpCisgICAgICAgICAgICAgICAgaXNVbmlvbk9mTGlzdHMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IGFueSBmaW5hbCByZXN0cmljdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWVtYmVySW1wbExpc3Quc2l6ZSgpIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBtSW1wbCA9IChTY2hlbWFUeXBlSW1wbCltZW1iZXJJbXBsTGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAobUltcGwuZmluYWxVbmlvbigpKQorICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVyaXZlIGJ5IHVuaW9uIGEgZmluYWwgdHlwZS4iLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0RFUklWRV9GSU5BTCwgcGFyc2VVbmlvbik7CisgICAgICAgIH0KKworICAgICAgICBzSW1wbC5zZXRVbmlvbk9mTGlzdHMoaXNVbmlvbk9mTGlzdHMpOworCisgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KG1lbWJlckltcGxMaXN0KSk7CisKKyAgICAgICAgLy8gbm93IGRlYWwgd2l0aCBmYWNldHMKKyAgICAgICAgc0ltcGwuc2V0QmFzaWNGYWNldHMoU3RzY1N0YXRlLkZBQ0VUU19VTklPTiwgU3RzY1N0YXRlLkZJWEVEX0ZBQ0VUU19VTklPTik7CisKKyAgICAgICAgLy8gbm93IGNvbXB1dGUgb3VyIGludHJpbnNpYyBwcm9wZXJ0aWVzCisgICAgICAgIHJlc29sdmVGdW5kYW1lbnRhbEZhY2V0cyhzSW1wbCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzb2x2ZVNpbXBsZVJlc3RyaWN0aW9uVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCwgUmVzdHJpY3Rpb25Eb2N1bWVudC5SZXN0cmljdGlvbiBwYXJzZVJlc3RyLCBMaXN0IGFub25UeXBlcykKKyAgICB7CisgICAgICAgIFFOYW1lIGJhc2VOYW1lID0gcGFyc2VSZXN0ci5nZXRCYXNlKCk7CisgICAgICAgIFNpbXBsZVR5cGUgcGFyc2VJbm5lciA9IHBhcnNlUmVzdHIuZ2V0U2ltcGxlVHlwZSgpOworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgaWYgKGJhc2VOYW1lICE9IG51bGwgJiYgcGFyc2VJbm5lciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2ltcGxlIHR5cGUgcmVzdHJpY3Rpb25zIG11c3QgbmFtZSBhIGJhc2UgdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlIHR5cGU6IGJvdGggd2VyZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVTVFJJQ1RJT05fUkVEVU5EQU5UX0JBU0UsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdHIpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0aGUgaW5uZXIgc2ltcGxlIHR5cGUuCisgICAgICAgICAgICBwYXJzZUlubmVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsOworCisgICAgICAgIGlmIChiYXNlTmFtZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc0ltcGwuaXNSZWRlZmluaXRpb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlSW1wbCA9IHN0YXRlLmZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKHBhcnNlUmVzdHIuZ2V0QmFzZSgpLCBzSW1wbC5nZXRDaGFtZWxlb25OYW1lc3BhY2UoKSwgc0ltcGwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZUltcGwgIT0gbnVsbCAmJiAhYmFzZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhzSW1wbC5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24iLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgcGFyc2VSZXN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFzZUltcGwgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZShiYXNlTmFtZSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJhc2VJbXBsID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihiYXNlTmFtZSwgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5ELCBwYXJzZVJlc3RyLnhnZXRCYXNlKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQorICAgICAgICAgICAgICAgIGJhc2VJbXBsID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJzZUlubmVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzSW1wbC5pc1JlZGVmaW5pdGlvbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiQSB0eXBlIHJlZGVmaW5pdGlvbiBtdXN0IHJlc3RyaWN0IHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlLiIsIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCBwYXJzZUlubmVyKTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogb2ggd2VsbC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgYmFzZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICAgICAgYmFzZUltcGwuc2V0U2ltcGxlVHlwZSh0cnVlKTsKKyAgICAgICAgICAgIGJhc2VJbXBsLnNldFBhcnNlQ29udGV4dChwYXJzZUlubmVyLCBzSW1wbC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc0ltcGwuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkgIT0gbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgLy8gYmFzZUltcGwuc2V0U2tpcHBlZEFub255bW91c1R5cGUodHJ1ZSk7CisgICAgICAgICAgICBiYXNlSW1wbC5zZXRPdXRlclNjaGVtYVR5cGVSZWYoc0ltcGwuZ2V0UmVmKCkpOworICAgICAgICAgICAgYW5vblR5cGVzLmFkZChiYXNlSW1wbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2ltcGxlIHR5cGUgcmVzdHJpY3Rpb25zIG11c3QgbmFtZSBhIGJhc2UgdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgIm9yIGNvbnRhaW4gYSBuZXN0ZWQgc2ltcGxlIHR5cGU6IG5laXRoZXIgd2VyZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgICAgICBYbWxFcnJvckNvbnRleHQuUkVTVFJJQ1RJT05fTUlTU0lOR19CQVNFLAorICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3RyKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQorICAgICAgICAgICAgYmFzZUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVjdXJzaW9uIQorICAgICAgICBpZiAoIVN0c2NSZXNvbHZlci5yZXNvbHZlVHlwZShiYXNlSW1wbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGN5Y2xpYyBkZXBlbmRlbmN5IHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhbiBleHRlbnNpb24gb2YgYW55U2ltcGxlVHlwZQorICAgICAgICAgICAgYmFzZUltcGwgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfU0lNUExFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2VJbXBsLmZpbmFsUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgcmVzdHJpY3QgYSBmaW5hbCB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9ERVJJVkVfRklOQUwsIHBhcnNlUmVzdHIpOworCisgICAgICAgIHNJbXBsLnNldEJhc2VUeXBlUmVmKGJhc2VJbXBsLmdldFJlZigpKTsKKyAgICAgICAgc0ltcGwuc2V0QmFzZURlcHRoKGJhc2VJbXBsLmdldEJhc2VEZXB0aCgpICsgMSk7CisgICAgICAgIHNJbXBsLnNldERlcml2YXRpb25UeXBlKFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pOworCisgICAgICAgIGlmICghYmFzZUltcGwuaXNTaW1wbGVUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJCYXNlIHR5cGUgZm9yIHRoaXMgc2ltcGxlIHR5cGUgcmVzdHJpY3Rpb24gaXMgbm90IHNpbXBsZSIsCisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5TSU1QTEVfUkVTVFJJQ1RJT05fTk9UX1NJTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN0ci54Z2V0QmFzZSgpKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiB0cmVhdCBpdCBhcyBhIHJlc3RyaWN0aW9uIG9mIGFueVNpbXBsZVR5cGUKKyAgICAgICAgICAgIHJlc29sdmVFcnJvclNpbXBsZVR5cGUoc0ltcGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc0ltcGwuc2V0U2ltcGxlVHlwZVZhcmlldHkoYmFzZUltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKTsKKworICAgICAgICAvLyBjb3B5IHZhcmlldHktc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICBzd2l0Y2ggKGJhc2VJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRQcmltaXRpdmVUeXBlUmVmKGJhc2VJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRSZWYoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0VW5pb25PZkxpc3RzKGJhc2VJbXBsLmlzVW5pb25PZkxpc3RzKCkpOworICAgICAgICAgICAgICAgIHNJbXBsLnNldFVuaW9uTWVtYmVyVHlwZVJlZnMobWFrZVJlZkFycmF5KEFycmF5cy5hc0xpc3QoYmFzZUltcGwuZ2V0VW5pb25NZW1iZXJUeXBlcygpKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0TGlzdEl0ZW1UeXBlUmVmKGJhc2VJbXBsLmdldExpc3RJdGVtVHlwZSgpLmdldFJlZigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlYWwgd2l0aCBmYWNldHMKKyAgICAgICAgcmVzb2x2ZUZhY2V0cyhzSW1wbCwgcGFyc2VSZXN0ciwgYmFzZUltcGwpOworCisgICAgICAgIC8vIG5vdyBjb21wdXRlIG91ciBpbnRyaW5zaWMgcHJvcGVydGllcworICAgICAgICByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoc0ltcGwpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgdHJhbnNsYXRlV2hpdGVzcGFjZUNvZGUoWG1sQW55U2ltcGxlVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIEJVR0JVRzogYWRkIHdoaXRlc3BhY2UgcnVsZSB0byB0ZXh0dmFsdWUuCisgICAgICAgIFN0cmluZyB0ZXh0dmFsID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKKworICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoImNvbGxhcHNlIikpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19DT0xMQVBTRTsKKworICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoInByZXNlcnZlIikpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsKKworICAgICAgICBpZiAodGV4dHZhbC5lcXVhbHMoInJlcGxhY2UiKSkKKyAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1JFUExBQ0U7CisKKyAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJVbnJlY29nbml6ZWQgd2hpdGVzcGFjZSB2YWx1ZSBcIiIgKyB0ZXh0dmFsICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgdmFsdWUpOworICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc011bHRpcGxlRmFjZXQoaW50IGZhY2V0Y29kZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoZmFjZXRjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT04gfHwKKyAgICAgICAgICAgICAgICBmYWNldGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBmYWNldEFwcGxpZXNUb1R5cGUoaW50IGZhY2V0Q29kZSwgU2NoZW1hVHlwZUltcGwgYmFzZUltcGwpCisgICAgeworICAgICAgICBzd2l0Y2ggKGJhc2VJbXBsLmdldFNpbXBsZVZhcmlldHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6CisgICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTjoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGF0b21pYyBjYXNlCisKKyAgICAgICAgc3dpdGNoIChiYXNlSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZhY2V0Q29kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgc3dpdGNoIChmYWNldENvZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1dISVRFX1NQQUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9FTlVNRVJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1BBVFRFUk46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFjZXRDb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRU5VTUVSQVRJT046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBvdGhlcl9zaW1pbGFyX2xpbWl0KGludCBmYWNldGNvZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKGZhY2V0Y29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkU7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRToKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCByZXNvbHZlRmFjZXRzKFNjaGVtYVR5cGVJbXBsIHNJbXBsLCBYbWxPYmplY3QgcmVzdHJpY3Rpb24sIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIGJvb2xlYW5bXSBzZWVuRmFjZXQgPSBuZXcgYm9vbGVhbltTY2hlbWFUeXBlLkxBU1RfRkFDRVQgKyAxXTsKKyAgICAgICAgWG1sQW55U2ltcGxlVHlwZVtdIG15RmFjZXRzID0gYmFzZUltcGwuZ2V0QmFzaWNGYWNldHMoKTsgLy8gbWFrZXMgYSBjb3B5CisgICAgICAgIGJvb2xlYW5bXSBmaXhlZEZhY2V0cyA9IGJhc2VJbXBsLmdldEZpeGVkRmFjZXRzKCk7CisgICAgICAgIGludCB3c3IgPSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEOworICAgICAgICBMaXN0IGVudW1lcmF0ZWRWYWx1ZXMgPSBudWxsOworICAgICAgICBMaXN0IHBhdHRlcm5zID0gbnVsbDsKKworICAgICAgICBpZiAocmVzdHJpY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IHJlc3RyaWN0aW9uLm5ld0N1cnNvcigpOworICAgICAgICAgICAgZm9yIChib29sZWFuIG1vcmUgPSBjdXIudG9GaXJzdENoaWxkKCk7IG1vcmU7IG1vcmUgPSBjdXIudG9OZXh0U2libGluZygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb2RlID0gdHJhbnNsYXRlRmFjZXRDb2RlKGN1ci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChjb2RlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIEZhY2V0IGZhY2V0ID0gKEZhY2V0KWN1ci5nZXRPYmplY3QoKTsKKworICAgICAgICAgICAgICAgIGlmICghZmFjZXRBcHBsaWVzVG9UeXBlKGNvZGUsIGJhc2VJbXBsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGUgZmFjZXQgIiArIGZhY2V0Lm5ld0N1cnNvcigpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGJhc2UgdHlwZSAiICsgYmFzZUltcGwsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9ET0VTX05PVF9BUFBMWSwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlZW5GYWNldFtjb2RlXSAmJiAhaXNNdWx0aXBsZUZhY2V0KGNvZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkZhY2V0IHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcyIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9EVVBMSUNBVEVELCBmYWNldCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWVuRmFjZXRbY29kZV0gPSB0cnVlOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEhdICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEhdICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IGxlbmd0aCBpbiBhZGRpdGlvbiB0byBtaW5MZW5ndGggb3IgbWF4TGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEludGVnZXIgbGVuID0gU3RzY1RyYW5zbGF0b3IuYnVpbGRObkludGVnZXIoZmFjZXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEhdICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkNhbm5vdCBzcGVjaWZ5IG1pbkxlbmd0aCBvciBtYXhMZW5ndGggaW4gYWRkaXRpb24gdG8gbGVuZ3RoIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0RVUExJQ0FURUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEludGVnZXIgbWxlbiA9IFN0c2NUcmFuc2xhdG9yLmJ1aWxkTm5JbnRlZ2VyKGZhY2V0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1sZW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRGYWNldHNbY29kZV0gJiYgIW15RmFjZXRzW2NvZGVdLnZhbHVlRXF1YWxzKG1sZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJUaGlzIGZhY2V0IGlzIGZpeGVkIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbiIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9GSVhFRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSF0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWxlbi5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIXSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxhcmdlciB0aGFuIHByaW9yIG1heExlbmd0aCIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15RmFjZXRzW1NjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSF0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWxlbi5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIXSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNtYWxsZXIgdGhhbiBwcmlvciBtaW5MZW5ndGgiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gbWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFM6CisgICAgICAgICAgICAgICAgICAgICAgICBYbWxQb3NpdGl2ZUludGVnZXIgZGlnID0gU3RzY1RyYW5zbGF0b3IuYnVpbGRQb3NJbnRlZ2VyKGZhY2V0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZEZhY2V0c1tjb2RlXSAmJiAhbXlGYWNldHNbY29kZV0udmFsdWVFcXVhbHMoZGlnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUU10gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnLmNvbXBhcmVWYWx1ZShteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUU10pID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkxhcmdlciB0aGFuIHByaW9yIHRvdGFsRGlnaXRzIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBkaWc7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfRlJBQ1RJT05fRElHSVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIGZkaWcgPSBTdHNjVHJhbnNsYXRvci5idWlsZE5uSW50ZWdlcihmYWNldC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZGlnID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIk11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhmZGlnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiVGhpcyBmYWNldCBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRklYRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteUZhY2V0c1tTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUU10gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmRpZy5jb21wYXJlVmFsdWUobXlGYWNldHNbU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFNdKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJMYXJnZXIgdGhhbiBwcmlvciBmcmFjdGlvbkRpZ2l0cyIsIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW2NvZGVdID0gZmRpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOgorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkZhY2V0W290aGVyX3NpbWlsYXJfbGltaXQoY29kZSldKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJDYW5ub3QgZGVmaW5lIGJvdGggaW5jbHVzaXZlIGFuZCBleGNsdXNpdmUgbGltaXQgaW4gdGhlIHNhbWUgcmVzdHJpY2l0b24iLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfRFVQTElDQVRFRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc21pbiA9IChjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUlOX0VYQ0xVU0lWRSB8fCBjb2RlID09IFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzZXhjbHVzaXZlID0gKGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFIHx8IGNvZGUgPT0gU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gYmFzZUltcGwubmV3VmFsdWUoZmFjZXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIGxpbWl0IGlzIGEgdmFsaWQgbnVtYmVyIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgZGF0YSB0eXBlISEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiTXVzdCBiZSB2YWxpZCB2YWx1ZSBpbiBiYXNlIHR5cGUiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCVUdCVUc6IGlmIHRoZXJlIGFyZSBhY3R1YWwgc2NoZW1hcyB0aGF0IHJlZGVmaW5lIG1pbi9tYXhFeGNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhleSB3aWxsIG5lZWQgdGhpcyBydWxlIHJlbGF4ZWQgZm9yIHRoZW0hIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkRmFjZXRzW2NvZGVdICYmICFteUZhY2V0c1tjb2RlXS52YWx1ZUVxdWFscyhsaW1pdCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlRoaXMgZmFjZXQgaXMgZml4ZWQgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX0ZJWEVELCBmYWNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXlGYWNldHNbY29kZV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IGxpbWl0LmNvbXBhcmVWYWx1ZShteUZhY2V0c1tjb2RlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMiB8fCBjb21wYXJpc29uID09IChpc21pbiA/IC0xIDogMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcihpc21pbiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzZXhjbHVzaXZlID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1pbkV4Y2x1c2l2ZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJldmlvdXMgbWluSW5jbHVzaXZlIikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc2V4Y2x1c2l2ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aW91cyBtYXhFeGNsdXNpdmUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzIG1heEluY2x1c2l2ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yQ29udGV4dC5GQUNFVF9WQUxVRV9NQUxGT1JNRUQsIGZhY2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXlGYWNldHNbY29kZV0gPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15RmFjZXRzW290aGVyX3NpbWlsYXJfbGltaXQoY29kZSldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9XSElURV9TUEFDRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzciA9IHRyYW5zbGF0ZVdoaXRlc3BhY2VDb2RlKGZhY2V0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VJbXBsLmdldFdoaXRlU3BhY2VSdWxlKCkgPiB3c3IpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NyID0gU2NoZW1hVHlwZS5XU19VTlNQRUNJRklFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQ2Fubm90IGFwcGx5IHRoaXMgd2hpdGVzcGFjZSBmYWNldCBvdmVyIHRoZSBwcmV2aW91cyBvbmUiLCBYbWxFcnJvckNvbnRleHQuRkFDRVRfVkFMVUVfTUFMRk9STUVELCBmYWNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBteUZhY2V0c1tjb2RlXSA9IFN0c2NTdGF0ZS5idWlsZF93c3N0cmluZyh3c3IpLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGVudW12YWw7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtdmFsID0gYmFzZUltcGwubmV3VmFsdWUoZmFjZXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW51bXZhbC5zZXQoZmFjZXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKChYbWxPYmplY3RCYXNlKWVudW12YWwpLnNldEltbXV0YWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbnVtZXJhdGVkIHZhbHVlIGludmFsaWQgaW4gYmFzZSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1lcmF0ZWRWYWx1ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGVkVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRlZFZhbHVlcy5hZGQoZW51bXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfUEFUVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBwID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKGZhY2V0LmdldFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKSwgIlgiKTsgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5QYXJzZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJNYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uIiwgWG1sRXJyb3JDb250ZXh0LkZBQ0VUX1ZBTFVFX01BTEZPUk1FRCwgZmFjZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5zID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJucy5hZGQocCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmFjZXQuZ2V0Rml4ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZml4ZWRGYWNldHNbY29kZV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIGFycmF5IG9mIGJhc2ljIGZhY2V0cworCisgICAgICAgIHNJbXBsLnNldEJhc2ljRmFjZXRzKG1ha2VWYWx1ZVJlZkFycmF5KG15RmFjZXRzKSwgZml4ZWRGYWNldHMpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgbnVtZXJpYyB3aGl0ZXNwYWNlIHJ1bGUKKyAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgd3NyID0gYmFzZUltcGwuZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKKyAgICAgICAgc0ltcGwuc2V0V2hpdGVTcGFjZVJ1bGUod3NyKTsKKworICAgICAgICAvLyBzdG9yZSBhd2F5IHRoZSBlbnVtZXJhdGVkIHZhbHVlcworICAgICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzSW1wbC5zZXRFbnVtZXJhdGlvblZhbHVlcyhtYWtlVmFsdWVSZWZBcnJheSgoWG1sQW55U2ltcGxlVHlwZVtdKQorICAgICAgICAgICAgICAgIGVudW1lcmF0ZWRWYWx1ZXMudG9BcnJheShuZXcgWG1sQW55U2ltcGxlVHlwZVtlbnVtZXJhdGVkVmFsdWVzLnNpemUoKV0pKSk7CisKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgYmVUeXBlID0gc0ltcGw7CisgICAgICAgICAgICBpZiAoc0ltcGwuZ2V0QmFzZVR5cGUoKS5nZXRCYXNlRW51bVR5cGUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJlVHlwZSA9IHNJbXBsLmdldEJhc2VUeXBlKCkuZ2V0QmFzZUVudW1UeXBlKCk7CisgICAgICAgICAgICBzSW1wbC5zZXRCYXNlRW51bVR5cGVSZWYoYmVUeXBlLmdldFJlZigpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNJbXBsLmNvcHlFbnVtZXJhdGlvblZhbHVlcyhiYXNlSW1wbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdG9yZSB0aGUgcGF0dGVybiBsaXN0CisgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uW10gcGF0dGVybkFycmF5OworICAgICAgICBpZiAocGF0dGVybnMgIT0gbnVsbCAmJiBwYXR0ZXJucy5zaXplKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcGF0dGVybkFycmF5ID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uW3BhdHRlcm5zLnNpemUoKV07CisgICAgICAgICAgICBwYXR0ZXJucy50b0FycmF5KHBhdHRlcm5BcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYXR0ZXJuQXJyYXkgPSBFTVBUWV9SRUdFWF9BUlJBWTsKKyAgICAgICAgfQorICAgICAgICBzSW1wbC5zZXRQYXR0ZXJuRmFjZXQoKHBhdHRlcm5BcnJheS5sZW5ndGggPiAwIHx8IGJhc2VJbXBsLmhhc1BhdHRlcm5GYWNldCgpKSk7CisgICAgICAgIHNJbXBsLnNldFBhdHRlcm5zKHBhdHRlcm5BcnJheSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sVmFsdWVSZWZbXSBtYWtlVmFsdWVSZWZBcnJheShYbWxBbnlTaW1wbGVUeXBlW10gc291cmNlKQorICAgIHsKKyAgICAgICAgWG1sVmFsdWVSZWZbXSByZXN1bHQgPSBuZXcgWG1sVmFsdWVSZWZbc291cmNlLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0W2ldID0gKHNvdXJjZVtpXSA9PSBudWxsID8gbnVsbCA6IG5ldyBYbWxWYWx1ZVJlZihzb3VyY2VbaV0pKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWd1bGFyRXhwcmVzc2lvbltdIEVNUFRZX1JFR0VYX0FSUkFZID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uWzBdOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Rpc2NyZXRlVHlwZShTY2hlbWFUeXBlSW1wbCBzSW1wbCkKKyAgICB7CisgICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUykgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBCVUdCVUc6IHNwZWMgaXMgc2lsZW50IG9uIGVudW1lcmF0aW9uczsgdGhleSdyZSBmaW5pdGUgdG9vLgorICAgICAgICBzd2l0Y2ggKHNJbXBsLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTnVtZXJpY1ByaW1pdGl2ZShTY2hlbWFUeXBlIHNJbXBsKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzSW1wbC5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjaW1hbFNpemVPZlR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICBpbnQgc2l6ZSA9IG1hdGhlbWF0aWNhbFNpemVPZlR5cGUoc0ltcGwpOworICAgICAgICAKKyAgICAgICAgLy8gYnl0ZSBhbmQgc2hvcnQgYXJlIGluY29udmVuaWVudCwgYmVjYXVzZSBzZXRCeXRlKChieXRlKTQpIHJlcXVpcmVzIGEgY2FzdC4KKyAgICAgICAgLy8gU28gdXNlICJpbnQiIHVubGVzcyB5b3UncmUgcmVhbGx5IGEgeHM6Ynl0ZSwgeHM6c2hvcnQsIG9yIGFuIHhzOnVuc2lnbmVkQnl0ZQorICAgICAgICAvLyAodGhlIGxhc3QgY2FzZSBpcyBpbmNsdWRlZCBmb3IgYWxpZ25tZW50IHdpdGggSkFYQikKKyAgICAgICAgCisgICAgICAgIGlmIChzaXplID09IFNjaGVtYVR5cGUuU0laRV9CWVRFICYmICFYbWxCeXRlLnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzSW1wbCkpCisgICAgICAgICAgICBzaXplID0gU2NoZW1hVHlwZS5TSVpFX1NIT1JUOworICAgICAgICBpZiAoc2l6ZSA9PSBTY2hlbWFUeXBlLlNJWkVfU0hPUlQgJiYgIVhtbFNob3J0LnR5cGUuaXNBc3NpZ25hYmxlRnJvbShzSW1wbCkgJiYgIVhtbFVuc2lnbmVkQnl0ZS50eXBlLmlzQXNzaWduYWJsZUZyb20oc0ltcGwpKQorICAgICAgICAgICAgc2l6ZSA9IFNjaGVtYVR5cGUuU0laRV9JTlQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1hdGhlbWF0aWNhbFNpemVPZlR5cGUoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICBpZiAoc0ltcGwuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5OT1RfREVDSU1BTDsKKworICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpID09IG51bGwgfHwKKyAgICAgICAgICAgICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9GUkFDVElPTl9ESUdJVFMpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5zaWdudW0oKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDsKKworICAgICAgICBCaWdJbnRlZ2VyIG1pbiA9IG51bGw7CisgICAgICAgIEJpZ0ludGVnZXIgbWF4ID0gbnVsbDsKKworICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSAhPSBudWxsKQorICAgICAgICAgICAgbWluID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsgLy8gLmFkZChCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgIGlmIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpICE9IG51bGwpCisgICAgICAgICAgICBtaW4gPSAoKFNpbXBsZVZhbHVlKXNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOworICAgICAgICBpZiAoc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSAhPSBudWxsKQorICAgICAgICAgICAgbWF4ID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKS5nZXRCaWdJbnRlZ2VyVmFsdWUoKTsKKyAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkgIT0gbnVsbCkKKyAgICAgICAgICAgIG1heCA9ICgoU2ltcGxlVmFsdWUpc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7IC8vIC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CisKKyAgICAgICAgaWYgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHBlZyA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHRvdGFsRGlnaXRzID0gKChTaW1wbGVWYWx1ZSlzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUykpLmdldEJpZ0ludGVnZXJWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh0b3RhbERpZ2l0cy5pbnRWYWx1ZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZWcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOTlMKTsgLy8gQllURSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OTk5TCk7IC8vIFNIT1JUIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzogY2FzZSA4OiBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgcGVnID0gQmlnSW50ZWdlci52YWx1ZU9mKDk5OTk5OTk5OUwpOyAvLyBJTlQgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiBjYXNlIDExOiBjYXNlIDEyOiBjYXNlIDEzOiBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OiBjYXNlIDE2OiBjYXNlIDE3OiBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyA9IEJpZ0ludGVnZXIudmFsdWVPZig5OTk5OTk5OTk5OTk5OTk5OTlMKTsgLy8gTE9ORyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7fQorICAgICAgICAgICAgaWYgKHBlZyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pbiA9IChtaW4gPT0gbnVsbCA/IHBlZy5uZWdhdGUoKSA6IG1pbi5tYXgocGVnLm5lZ2F0ZSgpKSk7CisgICAgICAgICAgICAgICAgbWF4ID0gKG1heCA9PSBudWxsID8gcGVnIDogbWF4Lm1pbihwZWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmluZCB0aGUgbGFyZ2VzdCAiYWJzb2x1dGUgdmFsdWUiIG51bWJlciB0aGF0IG11c3QgYmUgZGVhbHQgd2l0aAorICAgICAgICAgICAgaWYgKG1pbi5zaWdudW0oKSA8IDApCisgICAgICAgICAgICAgICAgbWluID0gbWluLm5lZ2F0ZSgpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgICAgIGlmIChtYXguc2lnbnVtKCkgPCAwKQorICAgICAgICAgICAgICAgIG1heCA9IG1heC5uZWdhdGUoKS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CisKKyAgICAgICAgICAgIG1heCA9IG1heC5tYXgobWluKTsKKyAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihCeXRlLk1BWF9WQUxVRSkpIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9CWVRFOworICAgICAgICAgICAgaWYgKG1heC5jb21wYXJlVG8oQmlnSW50ZWdlci52YWx1ZU9mKFNob3J0Lk1BWF9WQUxVRSkpIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9TSE9SVDsKKyAgICAgICAgICAgIGlmIChtYXguY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSkpIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuU0laRV9JTlQ7CisgICAgICAgICAgICBpZiAobWF4LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpKSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfTE9ORzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVI7CisgICAgfQorCisKKyAgICBzdGF0aWMgdm9pZCByZXNvbHZlRnVuZGFtZW50YWxGYWNldHMoU2NoZW1hVHlwZUltcGwgc0ltcGwpCisgICAgeworICAgICAgICAvLyBkZWFsIHdpdGgsIGlzT3JkZXJlZCwgaXNCb3VuZGVkLCBpc0Zpbml0ZSwgaXNOdW1lcmljCisgICAgICAgIC8vIGFsc28gZGVhbCB3aXRoCisgICAgICAgIHN3aXRjaCAoc0ltcGwuZ2V0U2ltcGxlVmFyaWV0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQVRPTUlDOgorICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVJbXBsIGJhc2VJbXBsID0gKFNjaGVtYVR5cGVJbXBsKXNJbXBsLmdldEJhc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJlZChiYXNlSW1wbC5vcmRlcmVkKCkpOworICAgICAgICAgICAgICAgIHNJbXBsLnNldEJvdW5kZWQoCisgICAgICAgICAgICAgICAgICAgIChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgIHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSkgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNJbXBsLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgc0ltcGwuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKSAhPSBudWxsKSk7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKGJhc2VJbXBsLmlzRmluaXRlKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0ltcGwuaXNCb3VuZGVkKCkgJiYgaXNEaXNjcmV0ZVR5cGUoc0ltcGwpKTsKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXROdW1lcmljKGJhc2VJbXBsLmlzTnVtZXJpYygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtZXJpY1ByaW1pdGl2ZShzSW1wbC5nZXRQcmltaXRpdmVUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXREZWNpbWFsU2l6ZShkZWNpbWFsU2l6ZU9mVHlwZShzSW1wbCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlVOSU9OOgorICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBtVHlwZXMgPSBzSW1wbC5nZXRVbmlvbk1lbWJlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaW50IG9yZGVyZWQgPSBTY2hlbWFUeXBlLlVOT1JERVJFRDsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzQm91bmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Zpbml0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc051bWVyaWMgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIG9yZGVyZWQgaWYgYW55IGlzIG9yZGVyZWQsIGJvdW5kZWQgaWYgYWxsIGFyZSBib3VuZGVkLgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlc1tpXS5vcmRlcmVkKCkgIT0gU2NoZW1hVHlwZS5VTk9SREVSRUQpCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gU2NoZW1hVHlwZS5QQVJUSUFMX09SREVSOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1UeXBlc1tpXS5pc0JvdW5kZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQm91bmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1UeXBlc1tpXS5pc0Zpbml0ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNGaW5pdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVHlwZXNbaV0uaXNOdW1lcmljKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpc051bWVyaWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0T3JkZXJlZChvcmRlcmVkKTsKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRCb3VuZGVkKGlzQm91bmRlZCk7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKGlzRmluaXRlKTsKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXROdW1lcmljKGlzTnVtZXJpYyk7CisgICAgICAgICAgICAgICAgc0ltcGwuc2V0RGVjaW1hbFNpemUoU2NoZW1hVHlwZS5OT1RfREVDSU1BTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICBzSW1wbC5zZXRPcmRlcmVkKFNjaGVtYVR5cGUuVU5PUkRFUkVEKTsKKyAgICAgICAgICAgICAgICAvLyBCVUdCVUc6IHRoZSBzY2hlbWEgc3BlYyBpcyB3cm9uZyBoZXJlOiBNSU5fTEVOR1RIIGlzIG5vdCBuZWVkZWQsIGJlYXVzZSBsZW4gPj0wCisgICAgICAgICAgICAgICAgc0ltcGwuc2V0Qm91bmRlZChzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICBzSW1wbC5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpICE9IG51bGwpOworICAgICAgICAgICAgICAgIC8vIEJVR0JVRzogdGhlIHNjaGVtYSBzcGVjIGlzIHdyb25nIGhlcmU6IGZpbml0ZSBjYXJkaW5hbGl0eSByZXF1aXJlcyBpdGVtIHR5cGUgaXMgZmluaXRlCisgICAgICAgICAgICAgICAgc0ltcGwuc2V0RmluaXRlKHNJbXBsLmdldExpc3RJdGVtVHlwZSgpLmlzRmluaXRlKCkgJiYgc0ltcGwuaXNCb3VuZGVkKCkpOworICAgICAgICAgICAgICAgIHNJbXBsLnNldE51bWVyaWMoZmFsc2UpOworICAgICAgICAgICAgICAgIHNJbXBsLnNldERlY2ltYWxTaXplKFNjaGVtYVR5cGUuTk9UX0RFQ0lNQUwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29kZUZvck5hbWVFbnRyeQorICAgIHsKKyAgICAgICAgQ29kZUZvck5hbWVFbnRyeShRTmFtZSBuYW1lLCBpbnQgY29kZSkKKyAgICAgICAgICAgIHsgdGhpcy5uYW1lID0gbmFtZTsgdGhpcy5jb2RlID0gY29kZTsgfQorICAgICAgICBwdWJsaWMgUU5hbWUgbmFtZTsKKyAgICAgICAgcHVibGljIGludCBjb2RlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvZGVGb3JOYW1lRW50cnlbXSBmYWNldENvZGVzID0gbmV3IENvZGVGb3JOYW1lRW50cnlbXQorICAgIHsKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJsZW5ndGgiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEgpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkxlbmd0aCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEgpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heExlbmd0aCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoInBhdHRlcm4iLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSwgU2NoZW1hVHlwZS5GQUNFVF9QQVRURVJOKSwKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJlbnVtZXJhdGlvbiIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX0VOVU1FUkFUSU9OKSwKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJ3aGl0ZVNwYWNlIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfV0hJVEVfU1BBQ0UpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heEluY2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1heEV4Y2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkluY2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoIm1pbkV4Y2x1c2l2ZSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpLAorICAgICAgICBuZXcgQ29kZUZvck5hbWVFbnRyeShRTmFtZUhlbHBlci5mb3JMTlMoInRvdGFsRGlnaXRzIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiksIFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKSwKKyAgICAgICAgbmV3IENvZGVGb3JOYW1lRW50cnkoUU5hbWVIZWxwZXIuZm9yTE5TKCJmcmFjdGlvbkRpZ2l0cyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpLCBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyksCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBmYWNldENvZGVNYXAgPSBidWlsZEZhY2V0Q29kZU1hcCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGJ1aWxkRmFjZXRDb2RlTWFwKCkKKyAgICB7CisgICAgICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY2V0Q29kZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHQucHV0KGZhY2V0Q29kZXNbaV0ubmFtZSwgIG5ldyBJbnRlZ2VyKGZhY2V0Q29kZXNbaV0uY29kZSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCB0cmFuc2xhdGVGYWNldENvZGUoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIEludGVnZXIgcmVzdWx0ID0gKChJbnRlZ2VyKWZhY2V0Q29kZU1hcC5nZXQobmFtZSkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiByZXN1bHQuaW50VmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU3RhdGUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTUyZGQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9TdHNjU3RhdGUuamF2YQpAQCAtMCwwICsxLDEwOTAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEVycm9yQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuU2NoZW1hQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuRXh0ZW5zaW9uSG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hR2xvYmFsRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVHcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYU1vZGVsR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxTdHJpbmdJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5pby5GaWxlOworCisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIgYXMgaXQncworICogZ29pbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHNjU3RhdGUKK3sKKyAgICBwcml2YXRlIFN0cmluZyBfZ2l2ZW5TdHNOYW1lOworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBfZXJyb3JMaXN0ZW5lcjsKKyAgICBwcml2YXRlIFNjaGVtYVR5cGVTeXN0ZW1JbXBsIF90YXJnZXQ7CisgICAgcHJpdmF0ZSBTY2hlbWFDb25maWcgX2NvbmZpZzsKKyAgICBwcml2YXRlIE1hcCBfY29tcGF0TWFwOworICAgIHByaXZhdGUgYm9vbGVhbiBfZG9pbmdEb3dubG9hZHM7CisgICAgcHJpdmF0ZSBieXRlW10gX2RpZ2VzdCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ub0RpZ2VzdCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlTG9hZGVyIF9pbXBvcnRpbmdMb2FkZXI7CisKKyAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkR2xvYmFsVHlwZXMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkTW9kZWxHcm91cHMgICAgICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzICAgID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgCisgICAgcHJpdmF0ZSBNYXAgX2dsb2JhbFR5cGVzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEVsZW1lbnRzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX2dsb2JhbEF0dHJpYnV0ZXMgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX21vZGVsR3JvdXBzICAgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZUdyb3VwcyAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX2RvY3VtZW50VHlwZXMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX2F0dHJpYnV0ZVR5cGVzICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3R5cGVzQnlDbGFzc25hbWUgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX21pc3NwZWxsZWROYW1lcyAgICA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBTZXQgX3Byb2Nlc3NpbmdHcm91cHMgICA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBNYXAgX2lkQ29uc3RyYWludHMgICAgICA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBTZXQgX25hbWVzcGFjZXMgICAgICAgICA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ub1VwYTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX25vUHZyOworICAgIHByaXZhdGUgU2V0IF9tZGVmTmFtZXNwYWNlcyAgICAgPSBidWlsZERlZmF1bHRNZGVmTmFtZXNwYWNlcygpOworICAgIHByaXZhdGUgRW50aXR5UmVzb2x2ZXIgX2VudGl0eVJlc29sdmVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGJ1aWxkRGVmYXVsdE1kZWZOYW1lc3BhY2VzKCkKKyAgICB7CisgICAgICAgIC8vIG5hbWVzcGFjZXMgd2hpY2ggYXJlIGtub3duIHRvIGFwcGVhciBpbiBXU0RMcyByZWR1bmRhbnRseQorICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCggbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cub3BlbnVyaS5vcmcvMjAwMi8wNC9zb2FwL2NvbnZlcnNhdGlvbi8iLAorICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBuZXcgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgYSBjaGFtZWxlb24KKyAgICAgKiBpbmNsdWRlZCBzY2hlbWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQ0hBTUVMRU9OX0lOQ0xVREVfVVJJID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogT25seSBjb25zdHJ1Y3RlZCB2aWEgU3RzY1N0YXRlLnN0YXJ0KCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHNjU3RhdGUoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplciBmb3Igc2NoZW1hdHlwZXBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBvcnRpbmdUeXBlTG9hZGVyKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyKQorICAgIHsKKyAgICAgICAgX2ltcG9ydGluZ0xvYWRlciA9IGxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplciBmb3IgZXJyb3IgaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCisgICAgICAgIHsgX2Vycm9yTGlzdGVuZXIgPSBlcnJvckxpc3RlbmVyOyB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzZXMgYW4gZXJyb3Igb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvYykKKyAgICAgICAgeyBhZGRFcnJvcihfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSwgY29kZSwgbG9jKTsgfQorCisgICAgLyoqCisgICAgICogUGFzc2VzIGEgd2FybmluZyBvbiB0byB0aGUgY3VycmVudCBYbWxFcnJvckNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIFhtbE9iamVjdCBsb2MpCisgICAgeworICAgICAgICAvLyBpdCdzIE9LIGZvciBYTUxTY2hlbWEueHNkIGl0c2VsZiB0byBoYXZlIHJlc2VydmVkIHR5cGUgbmFtZXMKKyAgICAgICAgaWYgKGNvZGUgPT0gWG1sRXJyb3JDb250ZXh0LlJFU0VSVkVEX1RZUEVfTkFNRSAmJgorICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGxvYy5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCkuaW5kZXhPZigiWE1MU2NoZW1hLnhzZCIpID4gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBhZGRXYXJuaW5nKF9lcnJvckxpc3RlbmVyLCBtZXNzYWdlLCBjb2RlLCBsb2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3NlcyBhIHdhcm5pbmcgb24gdG8gdGhlIGN1cnJlbnQgWG1sRXJyb3JDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsgYWRkSW5mbyhfZXJyb3JMaXN0ZW5lciwgbWVzc2FnZSk7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFcnJvcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIsIFN0cmluZyBtZXNzYWdlLCBpbnQgY29kZSwgWG1sT2JqZWN0IGxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgWG1sRXJyb3IgZXJyID0KKyAgICAgICAgICAgIFhtbEVycm9yLmZvck9iamVjdCgKKyAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IsCisgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZXJyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRXJyb3IoQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwgaW50IGNvZGUsIEZpbGUgbG9jYXRpb24pCisgICAgeworICAgICAgICBYbWxFcnJvciBlcnIgPQorICAgICAgICAgICAgWG1sRXJyb3IuZm9yTG9jYXRpb24oCisgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SLAorICAgICAgICAgICAgICBsb2NhdGlvbi50b1VSSSgpLnRvU3RyaW5nKCksIDAsIDAsIDApOworICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlcnIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXYXJuaW5nKENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciwgU3RyaW5nIG1lc3NhZ2UsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jYXRpb24pCisgICAgeworICAgICAgICBYbWxFcnJvciBlcnIgPQorICAgICAgICAgICAgWG1sRXJyb3IuZm9yT2JqZWN0KAorICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9XQVJOSU5HLAorICAgICAgICAgICAgICBsb2NhdGlvbik7CisgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEluZm8oQ29sbGVjdGlvbiBlcnJvckxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UobWVzc2FnZSwgWG1sRXJyb3IuU0VWRVJJVFlfSU5GTyk7CisgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGVycik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEdpdmVuVHlwZVN5c3RlbU5hbWUoU3RyaW5nIG5hbWUpCisgICAgICAgIHsgX2dpdmVuU3RzTmFtZSA9IG5hbWU7IH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVyIGZvciByZWZlcmVuY2VzIHRvIHRoZSBTY2hlbWFUeXBlTG9hZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0U2NoZW1hVHlwZVN5c3RlbShTY2hlbWFUeXBlU3lzdGVtSW1wbCB0YXJnZXQpCisgICAgICAgIHsgX3RhcmdldCA9IHRhcmdldDsgfQorICAgIAorICAgIC8qKgorICAgICAqIEFjY3VtdWxhdGVzIGEgc2NoZW1hIGRpZ2VzdC4uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNjaGVtYURpZ2VzdChieXRlW10gZGlnZXN0KQorICAgIHsKKyAgICAgICAgaWYgKF9ub0RpZ2VzdCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmIChkaWdlc3QgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX25vRGlnZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIF9kaWdlc3QgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoX2RpZ2VzdCA9PSBudWxsKQorICAgICAgICAgICAgX2RpZ2VzdCA9IG5ldyBieXRlWzEyOC84XTsgLy8gMTI4IGJpdHMuCisgICAgICAgIGludCBsZW4gPSBfZGlnZXN0Lmxlbmd0aDsKKyAgICAgICAgaWYgKGRpZ2VzdC5sZW5ndGggPCBsZW4pCisgICAgICAgICAgICBsZW4gPSBkaWdlc3QubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgX2RpZ2VzdFtpXSBePSBkaWdlc3RbaV07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBTY2hlbWFUeXBlU3lzdGVtIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHR5cGVzIG9uIGJlaGFsZiBvZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbUltcGwgc3RzKCkKKyAgICB7CisgICAgICAgIGlmIChfdGFyZ2V0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX3RhcmdldDsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBuYW1lID0gX2dpdmVuU3RzTmFtZTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBfZGlnZXN0ICE9IG51bGwpCisgICAgICAgICAgICBuYW1lID0gInMiICsgbmV3IFN0cmluZyhIZXhCaW4uZW5jb2RlKF9kaWdlc3QpKTsKKyAgICAgICAgCisgICAgICAgIF90YXJnZXQgPSBuZXcgU2NoZW1hVHlwZVN5c3RlbUltcGwobmFtZSk7CisgICAgICAgIHJldHVybiBfdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIFVSSSBpcyBhIGxvY2FsIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREb3dubG9hZFVSSShTdHJpbmcgdXJpU3RyaW5nKQorICAgIHsKKyAgICAgICAgaWYgKF9kb2luZ0Rvd25sb2FkcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmICh1cmlTdHJpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiB1cmkuZ2V0U2NoZW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXIgZm9yIGNvbXBhdE1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zKFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gZGVmYXVsdHMgYXJlIGFsbCBmYWxzZS4gCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIF9jb21wYXRNYXAgPSAoTWFwKW9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ09NUElMRV9TVUJTVElUVVRFX05BTUVTKTsKKyAgICAgICAgX25vVXBhID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX05PX1VQQV9SVUxFKSA/IHRydWUgOgorICAgICAgICAgICAgICAgICEidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi51bmlxdWVwYXJ0aWNsZWF0dHJpYnV0aW9uIiwgInRydWUiKSk7CisgICAgICAgIF9ub1B2ciA9IG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ09NUElMRV9OT19QVlJfUlVMRSkgPyB0cnVlIDoKKyAgICAgICAgICAgICAgICAhInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoInhtbGJlYW4ucGFydGljbGVyZXN0cmljdGlvbiIsICJ0cnVlIikpOworICAgICAgICBfZG9pbmdEb3dubG9hZHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkNPTVBJTEVfRE9XTkxPQURfVVJMUykgPyB0cnVlIDoKKyAgICAgICAgICAgICAgICAidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgieG1sYmVhbi5kb3dubG9hZHVybHMiLCAiZmFsc2UiKSk7CisgICAgICAgIF9lbnRpdHlSZXNvbHZlciA9IChFbnRpdHlSZXNvbHZlcilvcHRpb25zLmdldChYbWxPcHRpb25zLkVOVElUWV9SRVNPTFZFUik7CisgICAgICAgIGlmIChfZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIF9kb2luZ0Rvd25sb2FkcyA9IHRydWU7CisgICAgICAgIAorICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5DT01QSUxFX01ERUZfTkFNRVNQQUNFUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9tZGVmTmFtZXNwYWNlcy5hZGRBbGwoKENvbGxlY3Rpb24pb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5DT01QSUxFX01ERUZfTkFNRVNQQUNFUykpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSAiIyNsb2NhbCI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChfbWRlZk5hbWVzcGFjZXMuY29udGFpbnMobG9jYWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9tZGVmTmFtZXNwYWNlcy5yZW1vdmUobG9jYWwpOworICAgICAgICAgICAgICAgIF9tZGVmTmFtZXNwYWNlcy5hZGQoIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBjdXN0b20gZW50aXR5IHJlc29sdmVyLgorICAgICAqLyAKKyAgICBwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9lbnRpdHlSZXNvbHZlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBubyB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gb3B0aW9uIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5vVXBhKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfbm9VcGE7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgbm8gcGFydGljbGUgdmFsaWQgKHJlc3RyaWNpdG9uKSBvcHRpb24gaXMgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbm9QdnIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9ub1B2cjsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRzIFhNTCBuYW1lcyBhbmQgdHJhbnNsYXRlcyB0aGVtCisgICAgICogdGhyb3VnaCB0aGUgY29tcGF0IG1hcCwgaWYgYW55LgorICAgICAqCisgICAgICogQWxzbyBsb29rcyBmb3IgYSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgZ2xvYmFsIGRlZmluaXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgUU5hbWUgY29tcGF0TmFtZShRTmFtZSBuYW1lLCBTdHJpbmcgY2hhbWVsZW9uTmFtZXNwYWNlKQorICAgIHsKKyAgICAgICAgLy8gZmlyc3QgY2hlY2sgZm9yIGEgY2hhbWVsZW9uTmFtZXNwYWNlIG5hbWVzcGFjZQorICAgICAgICBpZiAobmFtZS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICYmIGNoYW1lbGVvbk5hbWVzcGFjZSAhPSBudWxsICYmIGNoYW1lbGVvbk5hbWVzcGFjZS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICBuYW1lID0gbmV3IFFOYW1lKGNoYW1lbGVvbk5hbWVzcGFjZSwgbmFtZS5nZXRMb2NhbFBhcnQoKSk7CisKKyAgICAgICAgaWYgKF9jb21wYXRNYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworCisgICAgICAgIFFOYW1lIHN1YnN0ID0gKFFOYW1lKV9jb21wYXRNYXAuZ2V0KG5hbWUpOworICAgICAgICBpZiAoc3Vic3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICByZXR1cm4gc3Vic3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBzY2hlbWEgY29uZmlnIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFDb25maWcoU2NoZW1hQ29uZmlnIGNvbmZpZykKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgX2NvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyB1cCBwYWNrYWdlIG92ZXJyaWRlIGZvciBhIG5hbWVzcGFjZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VPdmVycmlkZShTdHJpbmcgbmFtZXNwYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9jb25maWcubG9va3VwUGFja2FnZUZvck5hbWVzcGFjZShuYW1lc3BhY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIHVwIHBhY2thZ2Ugb3ZlcnJpZGUgZm9yIGEgbmFtZXNwYWNlIFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVByZWZpeChTdHJpbmcgbmFtZXNwYWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9jb25maWcubG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgdXAgcGFja2FnZSBvdmVycmlkZSBmb3IgYSBuYW1lc3BhY2UgVVJJCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhU3VmZml4KFN0cmluZyBuYW1lc3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBTdWZmaXhGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyB1cCBjb25maWd1cmVkIGphdmEgbmFtZSBmb3IgdGhlIGdpdmVuIHFuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YW5hbWUoUU5hbWUgcW5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gX2NvbmZpZy5sb29rdXBKYXZhbmFtZUZvclFOYW1lKHFuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGNvbmZpZ3VyZWQgZXh0ZW5zaW9uIHNldCwgbnVsbCBpZiBqYXZhTmFtZSBpcyBub3QgY29udGFpbmVkIGluIGFueSBleHRlbnNpb24uCisgICAgICovCisgICAgcHVibGljIEV4dGVuc2lvbkhvbGRlciBnZXRFeHRlbnNpb25Ib2xkZXIoU3RyaW5nIGphdmFOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9jb25maWcuZXh0ZW5zaW9uSG9sZGVyRm9yKGphdmFOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGNvbmZpZ3VyZWQgZXh0ZW5zaW9uIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZW5zaW9uSG9sZGVyIGdldEV4dGVuc2lvbkhvbGRlcigpCisgICAgeworICAgICAgICByZXR1cm4gX2NvbmZpZy5nZXRFeHRlbnNpb25Ib2xkZXIoKTsKKyAgICB9CisKKyAgICAvKiBTUEVMTElOR1MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcnVuY2hOYW1lKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICAvLyBsb3dlcmNhc2UsIGFuZCBkcm9wIG5hbWVzcGFjZS4KKyAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCkudG9Mb3dlckNhc2UoKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFNwZWxsaW5nKFFOYW1lIG5hbWUsIFNjaGVtYUNvbXBvbmVudCBjb21wKQorICAgIHsKKyAgICAgICAgX21pc3NwZWxsZWROYW1lcy5wdXQoY3J1bmNoTmFtZShuYW1lKSwgY29tcCk7CisgICAgfQorCisgICAgU2NoZW1hQ29tcG9uZW50IGZpbmRTcGVsbGluZyhRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTY2hlbWFDb21wb25lbnQpX21pc3NwZWxsZWROYW1lcy5nZXQoY3J1bmNoTmFtZShuYW1lKSk7CisgICAgfQorCisgICAgLyogTkFNRVNQQUNFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkKKyAgICB7CisgICAgICAgIF9uYW1lc3BhY2VzLmFkZCh0YXJnZXROYW1lc3BhY2UpOworICAgIH0KKworICAgIFN0cmluZ1tdIGdldE5hbWVzcGFjZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlfbmFtZXNwYWNlcy50b0FycmF5KG5ldyBTdHJpbmdbX25hbWVzcGFjZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgYm9vbGVhbiBsaW5rZXJEZWZpbmVzTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gX2ltcG9ydGluZ0xvYWRlci5pc05hbWVzcGFjZURlZmluZWQobmFtZXNwYWNlKTsKKyAgICB9CisKKyAgICAvKiBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRHbG9iYWxUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2dsb2JhbFR5cGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZFR5cGUobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRSZWRlZmluZWRHbG9iYWxUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UsIFFOYW1lIHJlZGVmaW5lZE5hbWUpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMocmVkZWZpbmVkTmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUltcGwpX3JlZGVmaW5lZEdsb2JhbFR5cGVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZFR5cGUKKyAgICAgICAgfQorICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2dsb2JhbFR5cGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZFR5cGUobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBhZGRHbG9iYWxUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIGJvb2xlYW4gcmVkZWZpbmVkKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocmVkZWZpbmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkR2xvYmFsVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCB0eXBlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfcmVkZWZpbmVkR2xvYmFsVHlwZXMucHV0KG5hbWUsIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZ2xvYmFsVHlwZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCB0eXBlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2dsb2JhbFR5cGVzLnB1dChuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZU1kZWYoUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBfbWRlZk5hbWVzcGFjZXMuY29udGFpbnMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgfQorCisgICAgU2NoZW1hVHlwZVtdIGdsb2JhbFR5cGVzKCkKKyAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfZ2xvYmFsVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfZ2xvYmFsVHlwZXMuc2l6ZSgpXSk7IH0KKworICAgIFNjaGVtYVR5cGVbXSByZWRlZmluZWRHbG9iYWxUeXBlcygpCisgICAgICAgIHsgcmV0dXJuIChTY2hlbWFUeXBlW10pX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVR5cGVbX3JlZGVmaW5lZEdsb2JhbFR5cGVzLnNpemUoKV0pOyB9CisgICAgCisgICAgLyogRE9DVU1FTlQgVFlQRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICBTY2hlbWFUeXBlSW1wbCBmaW5kRG9jdW1lbnRUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2RvY3VtZW50VHlwZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5hbWUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZvaWQgYWRkRG9jdW1lbnRUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBpZiAoX2RvY3VtZW50VHlwZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaWdub3JlTWRlZihuYW1lKSkKKyAgICAgICAgICAgICAgICBlcnJvcigiRHVwbGljYXRlIGdsb2JhbCBlbGVtZW50OiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9FTEVNRU5ULCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfZG9jdW1lbnRUeXBlcy5wdXQobmFtZSwgdHlwZSk7CisgICAgfQorCisgICAgU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKQorICAgICAgICB7IHJldHVybiAoU2NoZW1hVHlwZVtdKV9kb2N1bWVudFR5cGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYVR5cGVbX2RvY3VtZW50VHlwZXMuc2l6ZSgpXSk7IH0KKworICAgIC8qIEFUVFJJQlVURSBUWVBFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIFNjaGVtYVR5cGVJbXBsIGZpbmRBdHRyaWJ1dGVUeXBlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFUeXBlSW1wbCByZXN1bHQgPSAoU2NoZW1hVHlwZUltcGwpX2F0dHJpYnV0ZVR5cGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVR5cGVJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEF0dHJpYnV0ZVR5cGUobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBhZGRBdHRyaWJ1dGVUeXBlKFNjaGVtYVR5cGVJbXBsIHR5cGUsIFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBpZiAoX2F0dHJpYnV0ZVR5cGVzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlnbm9yZU1kZWYobmFtZSkpCisgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBnbG9iYWwgYXR0cmlidXRlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9BVFRSSUJVVEUsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9hdHRyaWJ1dGVUeXBlcy5wdXQobmFtZSwgdHlwZSk7CisgICAgfQorCisgICAgU2NoZW1hVHlwZVtdIGF0dHJpYnV0ZVR5cGVzKCkKKyAgICAgICAgeyByZXR1cm4gKFNjaGVtYVR5cGVbXSlfYXR0cmlidXRlVHlwZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hVHlwZVtfYXR0cmlidXRlVHlwZXMuc2l6ZSgpXSk7IH0KKworICAgIC8qIEFUVFJJQlVURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisgICAgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCBmaW5kR2xvYmFsQXR0cmlidXRlKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsIHJlc3VsdCA9IChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKV9nbG9iYWxBdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlKG5hbWUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZvaWQgYWRkR2xvYmFsQXR0cmlidXRlKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwgYXR0cmlidXRlKQorICAgIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIF9nbG9iYWxBdHRyaWJ1dGVzLnB1dChuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZVtdIGdsb2JhbEF0dHJpYnV0ZXMoKQorICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsQXR0cmlidXRlW10pX2dsb2JhbEF0dHJpYnV0ZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlW19nbG9iYWxBdHRyaWJ1dGVzLnNpemUoKV0pOyB9CisKKyAgICAvKiBFTEVNRU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGZpbmRHbG9iYWxFbGVtZW50KFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCByZXN1bHQgPSAoU2NoZW1hR2xvYmFsRWxlbWVudEltcGwpX2dsb2JhbEVsZW1lbnRzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZEVsZW1lbnQobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBhZGRHbG9iYWxFbGVtZW50KFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGVsZW1lbnQpCisgICAgeworICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisgICAgICAgICAgICBfZ2xvYmFsRWxlbWVudHMucHV0KG5hbWUsIGVsZW1lbnQpOworICAgICAgICAgICAgYWRkU3BlbGxpbmcobmFtZSwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTY2hlbWFHbG9iYWxFbGVtZW50W10gZ2xvYmFsRWxlbWVudHMoKQorICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsRWxlbWVudFtdKV9nbG9iYWxFbGVtZW50cy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFHbG9iYWxFbGVtZW50W19nbG9iYWxFbGVtZW50cy5zaXplKCldKTsgfQorCisgICAgLyogQVRUUklCVVRFIEdST1VQUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgZmluZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfYXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfaW1wb3J0aW5nTG9hZGVyLmZpbmRBdHRyaWJ1dGVHcm91cChuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UsIFFOYW1lIHJlZGVmaW5pdGlvbkZvcikKKyAgICB7CisgICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7CisgICAgICAgIGlmIChuYW1lLmVxdWFscyhyZWRlZmluaXRpb25Gb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbClfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLmdldChuYW1lKTsKKyAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZEF0dHJpYnV0ZUdyb3VwCisgICAgICAgIH0KKyAgICAgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsIHJlc3VsdCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpX2F0dHJpYnV0ZUdyb3Vwcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJlc3VsdCA9IChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwpX2ltcG9ydGluZ0xvYWRlci5maW5kQXR0cmlidXRlR3JvdXAobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBhZGRBdHRyaWJ1dGVHcm91cChTY2hlbWFBdHRyaWJ1dGVHcm91cEltcGwgYXR0cmlidXRlR3JvdXAsIGJvb2xlYW4gcmVkZWZpbmVkKQorICAgIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAocmVkZWZpbmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBhdHRyaWJ1dGUgZ3JvdXA6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9yZWRlZmluZWRBdHRyaWJ1dGVHcm91cHMucHV0KG5hbWUsIGF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZUdyb3Vwcy5jb250YWluc0tleSggbmFtZSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBhdHRyaWJ1dGUgZ3JvdXA6ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfYXR0cmlidXRlR3JvdXBzLnB1dChhdHRyaWJ1dGVHcm91cC5nZXROYW1lKCksIGF0dHJpYnV0ZUdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3BlbGxpbmcoYXR0cmlidXRlR3JvdXAuZ2V0TmFtZSgpLCBhdHRyaWJ1dGVHcm91cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU2NoZW1hQXR0cmlidXRlR3JvdXBbXSBhdHRyaWJ1dGVHcm91cHMoKQorICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXBbXSlfYXR0cmlidXRlR3JvdXBzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNjaGVtYUF0dHJpYnV0ZUdyb3VwW19hdHRyaWJ1dGVHcm91cHMuc2l6ZSgpXSk7IH0KKworICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10gcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzKCkKKyAgICAgICAgeyByZXR1cm4gKFNjaGVtYUF0dHJpYnV0ZUdyb3VwW10pX3JlZGVmaW5lZEF0dHJpYnV0ZUdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtfcmVkZWZpbmVkQXR0cmlidXRlR3JvdXBzLnNpemUoKV0pOyB9CisKKyAgICAvKiBNT0RFTCBHUk9VUFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIFNjaGVtYU1vZGVsR3JvdXBJbXBsIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUsIFN0cmluZyBjaGFtZWxlb25OYW1lc3BhY2UpCisgICAgeworICAgICAgICBuYW1lID0gY29tcGF0TmFtZShuYW1lLCBjaGFtZWxlb25OYW1lc3BhY2UpOworICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX21vZGVsR3JvdXBzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYU1vZGVsR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZE1vZGVsR3JvdXAobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgZmluZFJlZGVmaW5lZE1vZGVsR3JvdXAoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSwgUU5hbWUgcmVkZWZpbml0aW9uRm9yKQorICAgIHsKKyAgICAgICAgbmFtZSA9IGNvbXBhdE5hbWUobmFtZSwgY2hhbWVsZW9uTmFtZXNwYWNlKTsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZGVmaW5pdGlvbkZvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hTW9kZWxHcm91cEltcGwpX3JlZGVmaW5lZE1vZGVsR3JvdXBzLmdldChuYW1lKTsKKyAgICAgICAgICAgIC8vIEJVR0JVRzogc2hvdWxkIGFsc28gbGluayBhZ2FpbnN0IF9pbXBvcnRpbmdMb2FkZXIuZmluZFJlZGVmaW5lZE1vZGVsR3JvdXAKKyAgICAgICAgfQorICAgICAgICBTY2hlbWFNb2RlbEdyb3VwSW1wbCByZXN1bHQgPSAoU2NoZW1hTW9kZWxHcm91cEltcGwpX21vZGVsR3JvdXBzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYU1vZGVsR3JvdXBJbXBsKV9pbXBvcnRpbmdMb2FkZXIuZmluZE1vZGVsR3JvdXAobmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBhZGRNb2RlbEdyb3VwKFNjaGVtYU1vZGVsR3JvdXBJbXBsIG1vZGVsR3JvdXAsIGJvb2xlYW4gcmVkZWZpbmVkKQorICAgIHsKKyAgICAgICAgaWYgKG1vZGVsR3JvdXAgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG1vZGVsR3JvdXAuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKHJlZGVmaW5lZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3JlZGVmaW5lZE1vZGVsR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBtb2RlbCBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgX3JlZGVmaW5lZE1vZGVsR3JvdXBzLnB1dChuYW1lLCBtb2RlbEdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX21vZGVsR3JvdXBzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVNZGVmKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIkR1cGxpY2F0ZSBtb2RlbCBncm91cDogIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9tb2RlbEdyb3Vwcy5wdXQobW9kZWxHcm91cC5nZXROYW1lKCksIG1vZGVsR3JvdXApOworICAgICAgICAgICAgICAgICAgICBhZGRTcGVsbGluZyhtb2RlbEdyb3VwLmdldE5hbWUoKSwgbW9kZWxHcm91cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgU2NoZW1hTW9kZWxHcm91cFtdIG1vZGVsR3JvdXBzKCkKKyAgICAgICAgeyByZXR1cm4gKFNjaGVtYU1vZGVsR3JvdXBbXSlfbW9kZWxHcm91cHMudmFsdWVzKCkudG9BcnJheShuZXcgU2NoZW1hTW9kZWxHcm91cFtfbW9kZWxHcm91cHMuc2l6ZSgpXSk7IH0KKyAgICAKKyAgICBTY2hlbWFNb2RlbEdyb3VwW10gcmVkZWZpbmVkTW9kZWxHcm91cHMoKQorICAgICAgICB7IHJldHVybiAoU2NoZW1hTW9kZWxHcm91cFtdKV9yZWRlZmluZWRNb2RlbEdyb3Vwcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFNb2RlbEdyb3VwW19yZWRlZmluZWRNb2RlbEdyb3Vwcy5zaXplKCldKTsgfQorCisgICAgLyogSURFTlRJVFkgQ09OU1RSQUlOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGZpbmRJZENvbnN0cmFpbnQoUU5hbWUgbmFtZSwgU3RyaW5nIGNoYW1lbGVvbk5hbWVzcGFjZSkKKyAgICB7CisgICAgICAgIG5hbWUgPSBjb21wYXROYW1lKG5hbWUsIGNoYW1lbGVvbk5hbWVzcGFjZSk7CisgICAgICAgIHJldHVybiAoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbClfaWRDb25zdHJhaW50cy5nZXQobmFtZSk7CisgICAgfQorCisgICAgdm9pZCBhZGRJZENvbnN0cmFpbnQoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50SW1wbCBpZGMpCisgICAgeworICAgICAgICBpZiAoaWRjICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9pZENvbnN0cmFpbnRzLnB1dChpZGMuZ2V0TmFtZSgpLCBpZGMpOworICAgICAgICAgICAgYWRkU3BlbGxpbmcoaWRjLmdldE5hbWUoKSwgaWRjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSBpZENvbnN0cmFpbnRzKCkKKyAgICAgICAgeyByZXR1cm4gKFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSlfaWRDb25zdHJhaW50cy52YWx1ZXMoKS50b0FycmF5KG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW19pZENvbnN0cmFpbnRzLnNpemUoKV0pOyB9CisKKyAgICAvKiBSRUNVUlNJT04gQVZPSURBTkNFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICBib29sZWFuIGlzUHJvY2Vzc2luZyhPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9wcm9jZXNzaW5nR3JvdXBzLmNvbnRhaW5zKG9iaik7CisgICAgfQorCisgICAgdm9pZCBzdGFydFByb2Nlc3NpbmcoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIGFzc2VydCghX3Byb2Nlc3NpbmdHcm91cHMuY29udGFpbnMob2JqKSk7CisgICAgICAgIF9wcm9jZXNzaW5nR3JvdXBzLmFkZChvYmopOworICAgIH0KKworICAgIHZvaWQgZmluaXNoUHJvY2Vzc2luZyhPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KF9wcm9jZXNzaW5nR3JvdXBzLmNvbnRhaW5zKG9iaikpOworICAgICAgICBfcHJvY2Vzc2luZ0dyb3Vwcy5yZW1vdmUob2JqKTsKKyAgICB9CisKKyAgICAvKiBKQVZBSVpBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworICAgIE1hcCB0eXBlc0J5Q2xhc3NuYW1lKCkKKyAgICAgICAgeyByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKF90eXBlc0J5Q2xhc3NuYW1lKTsgfQorCisgICAgdm9pZCBhZGRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSwgU2NoZW1hVHlwZSB0eXBlKQorICAgICAgICB7IF90eXBlc0J5Q2xhc3NuYW1lLnB1dChjbGFzc25hbWUsIHR5cGUpOyB9CisKKworCisgICAgLyoqCisgICAgICogU3RhY2sgbWFuYWdlbWVudCBpZiAoaGVhdmVuIGhlbHAgdXMpIHdlIGV2ZXIgbmVlZCB0byBkbworICAgICAqIG5lc3RlZCBjb21waWxhdGlvbiBvZiBzY2hlbWEgdHlwZSBzeXN0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3RzY1N0YWNrCisgICAgeworICAgICAgICBTdHNjU3RhdGUgY3VycmVudDsKKyAgICAgICAgQXJyYXlMaXN0IHN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBTdHNjU3RhdGUgcHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YWNrLmFkZChjdXJyZW50KTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgU3RzY1N0YXRlKCk7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCB2b2lkIHBvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnQgPSAoU3RzY1N0YXRlKXN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIHN0YWNrLnJlbW92ZShzdGFjay5zaXplKCkgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsIHN0c2NTdGFjayA9IG5ldyBUaHJlYWRMb2NhbCgpCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGluaXRpYWxWYWx1ZSgpIHsgcmV0dXJuIG5ldyBTdHNjU3RhY2soKTsgfQorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIFN0c2NTdGF0ZSBzdGFydCgpCisgICAgeworICAgICAgICByZXR1cm4gKChTdHNjU3RhY2spc3RzY1N0YWNrLmdldCgpKS5wdXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHNjU3RhdGUgZ2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLmN1cnJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuZCgpCisgICAgeworICAgICAgICAoKFN0c2NTdGFjaylzdHNjU3RhY2suZ2V0KCkpLnBvcCgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9QUkVTRVJWRSA9IGJ1aWxkU3RyaW5nKCJwcmVzZXJ2ZSIpOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmIFhNTFNUUl9SRVBMQUNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWYgWE1MU1RSX0NPTExBUFNFID0gYnVpbGRTdHJpbmcoInByZXNlcnZlIik7CisKKyAgICBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZVtdIEVNUFRZX1NUX0FSUkFZID0gbmV3IFNjaGVtYVR5cGVbMF07CisgICAgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUuUmVmW10gRU1QVFlfU1RSRUZfQVJSQVkgPSBuZXcgU2NoZW1hVHlwZS5SZWZbMF07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19OT05FID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgIG51bGwsIG51bGwsIG51bGwgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW5bXSBGSVhFRF9GQUNFVFNfTk9ORSA9IG5ldyBib29sZWFuW10KKyAgICAgICAgeyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFhtbFZhbHVlUmVmW10gRkFDRVRTX1dTX0NPTExBUFNFID0gbmV3IFhtbFZhbHVlUmVmW10KKyAgICAgICAgeyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgIGJ1aWxkX3dzc3RyaW5nKFNjaGVtYVR5cGUuV1NfQ09MTEFQU0UpLCBudWxsLCBudWxsIH07CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX1dTID0gbmV3IGJvb2xlYW5bXQorICAgICAgICB7IGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlIH07CisKKyAgICBmaW5hbCBzdGF0aWMgWG1sVmFsdWVSZWZbXSBGQUNFVFNfVU5JT04gPSBGQUNFVFNfTk9ORTsKKyAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbltdIEZJWEVEX0ZBQ0VUU19VTklPTiA9IEZJWEVEX0ZBQ0VUU19OT05FOworICAgIGZpbmFsIHN0YXRpYyBYbWxWYWx1ZVJlZltdIEZBQ0VUU19MSVNUID0gRkFDRVRTX1dTX0NPTExBUFNFOworICAgIGZpbmFsIHN0YXRpYyBib29sZWFuW10gRklYRURfRkFDRVRTX0xJU1QgPSBGSVhFRF9GQUNFVFNfV1M7CisKKyAgICBzdGF0aWMgWG1sVmFsdWVSZWYgYnVpbGRfd3NzdHJpbmcoaW50IHdzcikKKyAgICB7CisgICAgICAgIHN3aXRjaCAod3NyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFNUUl9QUkVTRVJWRTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19SRVBMQUNFOgorICAgICAgICAgICAgICAgIHJldHVybiBYTUxTVFJfUkVQTEFDRTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRToKKyAgICAgICAgICAgICAgICByZXR1cm4gWE1MU1RSX0NPTExBUFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHN0YXRpYyBYbWxWYWx1ZVJlZiBidWlsZFN0cmluZyhTdHJpbmcgc3RyKQorICAgIHsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbFN0cmluZ0ltcGwgaSA9IG5ldyBYbWxTdHJpbmdJbXBsKCk7CisgICAgICAgICAgICBpLnNldChzdHIpOworICAgICAgICAgICAgaS5zZXRJbW11dGFibGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWG1sVmFsdWVSZWYoaSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdEZvdW5kRXJyb3IoUU5hbWUgaXRlbU5hbWUsIGludCBjb2RlLCBYbWxPYmplY3QgbG9jKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGJhc2ljTWVzc2FnZTsKKworICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LlRZUEVfTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgIGJhc2ljTWVzc2FnZSA9ICJUeXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfUkVGX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiRWxlbWVudCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGl0ZW1OYW1lKSArICIgbm90IGZvdW5kLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfUkVGX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiQXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0Lk1PREVMX0dST1VQX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiTW9kZWwgZ3JvdXAgIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX0dST1VQX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICBiYXNpY01lc3NhZ2UgPSAiQXR0cmlidXRlIGdyb3VwICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIiBub3QgZm91bmQuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgWG1sRXJyb3JDb250ZXh0LklEQ19OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIklkZW50aXR5IGNvbnN0cmFpbnQgJyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoaXRlbU5hbWUpICsgIicgbm90IGZvdW5kLiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICAgICAgYmFzaWNNZXNzYWdlID0gIkRlZmluaXRpb24gIiArIFFOYW1lSGVscGVyLnByZXR0eShpdGVtTmFtZSkgKyAiIG5vdCBmb3VuZC4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhlbHBmdWxNZXNzYWdlID0gIiI7CisgICAgICAgIFNjaGVtYUNvbXBvbmVudCBmb3VuZENvbXBvbmVudCA9IGZpbmRTcGVsbGluZyhpdGVtTmFtZSk7CisgICAgICAgIFFOYW1lIG5hbWU7CisgICAgICAgIGlmIChmb3VuZENvbXBvbmVudCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lID0gZm91bmRDb21wb25lbnQuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmb3VuZENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZSA9ICgoU2NoZW1hVHlwZSlmb3VuZENvbXBvbmVudCkuZ2V0U291cmNlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOYW1lID0gKChTY2hlbWFHbG9iYWxFbGVtZW50KWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTmFtZSA9ICgoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWZvdW5kQ29tcG9uZW50KS5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICIiOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSAiIChpbiAiICsgIHNvdXJjZU5hbWUuc3Vic3RyaW5nKHNvdXJjZU5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEpICsgIikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoaXRlbU5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmb3VuZENvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LlRZUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgdHlwZSB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGF0IG5hbWUiICsgc291cmNlICsgIj8iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGF0dHJpYnV0ZSB3aXRoIHRoYXQgbmFtZSIgKyBzb3VyY2UgKyAiPyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGZ1bE1lc3NhZ2UgPSAiICBEbyB5b3UgbWVhbiB0byByZWZlciB0byB0aGUgYXR0cmlidXRlIGdyb3VwIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIG1vZGVsIGdyb3VwIHdpdGggdGhhdCBuYW1lIiArIHNvdXJjZSArICI/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvdW5kQ29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFDb21wb25lbnQuVFlQRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSB0eXBlIG5hbWVkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyBzb3VyY2UgKyAiPyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYUNvbXBvbmVudC5FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIGVsZW1lbnQgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50LkFUVFJJQlVURV9HUk9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZnVsTWVzc2FnZSA9ICIgIERvIHlvdSBtZWFuIHRvIHJlZmVyIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgbmFtZWQgIiArIFFOYW1lSGVscGVyLnByZXR0eShuYW1lKSArIHNvdXJjZSArICI/IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBmdWxNZXNzYWdlID0gIiAgRG8geW91IG1lYW4gdG8gcmVmZXIgdG8gdGhlIG1vZGVsIGdyb3VwIG5hbWVkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSkgKyBzb3VyY2UgKyAiPyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlcnJvcihiYXNpY01lc3NhZ2UgKyBoZWxwZnVsTWVzc2FnZSwgY29kZSwgbG9jKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyB0aGUgInNvdXJjZU5hbWUiICh0byBiZSB1c2VkIHdpdGhpbiB0aGUgc2NoZW1hIHByb2plY3QKKyAgICAgKiBzb3VyY2UgZmlsZSBjb3BpZXMpIGZyb20gdGhlIFVSSSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLgorICAgICAqCisgICAgICogUmV0dXJucyBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzb3VyY2VOYW1lRm9yVXJpKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gKFN0cmluZylfc291cmNlRm9yVXJpLmdldCh1cmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHdob2xlIHNvdXJjZUNvcHlNYXAsIG1hcHBpbmcgVVJJJ3MgdGhhdCBoYXZlCisgICAgICogYmVlbiByZWFkIHRvICJzb3VyY2VOYW1lIiBsb2NhbCBuYW1lcyB0aGF0IGhhdmUgYmVlbiB1c2VkCisgICAgICogdG8gdGFnIHRoZSB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIHNvdXJjZUNvcHlNYXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChfc291cmNlRm9yVXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBVUkkgdG8gdXNlIGZvciBuaWNlIGZpbGVuYW1lcyB3aGVuIHNhdmluZyBzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoVVJJIHVyaSkKKyAgICB7CisgICAgICAgIF9iYXNlVVJJID0gdXJpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9KRUNUX1VSTF9QUkVGSVggPSAicHJvamVjdDovL2xvY2FsIjsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIHVyaSkKKyAgICB7CisgICAgICAgIHJldHVybiByZWxhdGl2aXplKHVyaSwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVTYXZlZEZpbGVuYW1lKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gcmVsYXRpdml6ZSh1cmksIHRydWUpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyB1cmksIGJvb2xlYW4gZm9yU2F2ZWRGaWxlbmFtZSkKKyAgICB7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGRlYWwgd2l0aCB0aGluZ3MgdGhhdCBkbyBub3QgbG9vayBsaWtlIGFic29sdXRlIHVyaXMKKyAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyaSA9IFBST0pFQ1RfVVJMX1BSRUZJWCArIHVyaS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBsb29rcyBsaWtlIGEgVVJMPworICAgICAgICAgICAgaW50IGNvbG9uID0gdXJpLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgIGlmIChjb2xvbiA8PSAxIHx8ICF1cmkuc3Vic3RyaW5nKDAsIGNvbG9uKS5tYXRjaGVzKCJeXFx3KyQiKSkKKyAgICAgICAgICAgICAgICB1cmkgPSBQUk9KRUNUX1VSTF9QUkVGSVggKyAiLyIgKyB1cmkucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHJlbGF0aXZpemUgYWdhaW5zdCB0aGF0Li4uCisgICAgICAgIGlmIChfYmFzZVVSSSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVUkkgcmVsYXRpdmUgPSBfYmFzZVVSSS5yZWxhdGl2aXplKG5ldyBVUkkodXJpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXJpID0gcmVsYXRpdmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFmb3JTYXZlZEZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHVyaTsKKworICAgICAgICBpbnQgbGFzdHNsYXNoID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIFN0cmluZyBkaXIgPSBRTmFtZUhlbHBlci5oZXhzYWZlKGxhc3RzbGFzaCA9PSAtMSA/ICIiIDogdXJpLnN1YnN0cmluZygwLCBsYXN0c2xhc2gpKTsKKyAgICAgICAgcmV0dXJuIGRpciArICIvIiArIHVyaS5zdWJzdHJpbmcobGFzdHNsYXNoICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZXMgYW5vdGhlciBVUkkgdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBkdXJpbmcgY29tcGlsYXRpb24KKyAgICAgKiAodGhpcyBpcyB0aGUgVVJJIHRoYXQgaXMgaW4gdGhlIGRvY3VtZW50IC5OQU1FIHByb3BlcnR5KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZVVyaShTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZVRvVXNlKQorICAgIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChuYW1lVG9Vc2UgPT0gbnVsbCkKKyAgICAgICAgICAgIG5hbWVUb1VzZSA9IGNvbXB1dGVTYXZlZEZpbGVuYW1lKHVyaSk7CisKKyAgICAgICAgX3NvdXJjZUZvclVyaS5wdXQodXJpLCBuYW1lVG9Vc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVycm9yIGxpc3RlbmVyIGJlaW5nIGZpbGxlZCBpbiBkdXJpbmcgdGhpcyBjb21waWxhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVycm9yTGlzdGVuZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9lcnJvckxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNjaGVtYSB0eXBlIGxvYWRlciB0byB1c2UgZm9yIHByb2Nlc3NpbmcgczRzCisgICAgICovCisgICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0UzRTTG9hZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfczRzbG9hZGVyOworICAgIH0KKworICAgIE1hcCBfc291cmNlRm9yVXJpID0gbmV3IEhhc2hNYXAoKTsKKyAgICBVUkkgX2Jhc2VVUkkgPSBVUkkuY3JlYXRlKFBST0pFQ1RfVVJMX1BSRUZJWCArICIvIik7CisgICAgU2NoZW1hVHlwZUxvYWRlciBfczRzbG9hZGVyID0gWG1sQmVhbnMudHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKFNjaGVtYURvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvU3RzY1RyYW5zbGF0b3IuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiN2Q3MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc2NoZW1hL1N0c2NUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwxMTQ1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5TY2hlbWE7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5SZWRlZmluZURvY3VtZW50LlJlZGVmaW5lOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhNTENoYXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbEludGVnZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFBvc2l0aXZlSW50ZWdlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUGFydGljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUlkZW50aXR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5vbk5lZ2F0aXZlSW50ZWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFBvc2l0aXZlSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBjbGFzcyBTdHNjVHJhbnNsYXRvcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfQVJSQVlUWVBFX05BTUUgPQorICAgICAgICBRTmFtZUhlbHBlci5mb3JMTlMoImFycmF5VHlwZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbERlZmluaXRpb25zKFN0c2NJbXBvcnRlci5TY2hlbWFUb1Byb2Nlc3NbXSBzY2hlbWFzQW5kQ2hhbWVsZW9ucykKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hc0FuZENoYW1lbGVvbnMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZEFsbERlZmluaXRpb25zKAorICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldFNjaGVtYSgpLAorICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldENoYW1lbGVvbk5hbWVzcGFjZSgpLAorICAgICAgICAgICAgICAgIHNjaGVtYXNBbmRDaGFtZWxlb25zW2ldLmdldFJlZGVmaW5lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFsbERlZmluaXRpb25zKFNjaGVtYSBzY2hlbWEsIFN0cmluZyBnaXZlblRhcmdldE5hbWVzcGFjZSwgUmVkZWZpbmUgcmVkZWZpbmUpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgLy8gcXVpY2sgY2hlY2sgZm9yIGEgZmV3IHVuc3VwcG9ydGVkIGZlYXR1cmVzCisKKyAgICAgICAgaWYgKHNjaGVtYS5zaXplT2ZOb3RhdGlvbkFycmF5KCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJTY2hlbWEgPG5vdGF0aW9uPiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgdGhpcyByZWxlYXNlLiIsIFhtbEVycm9yQ29udGV4dC5VTlNVUFBPUlRFRF9GRUFUVVJFLCBzY2hlbWEuZ2V0Tm90YXRpb25BcnJheSgwKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGZpZ3VyZSBuYW1lc3BhY2UgKHRha2luZyBpbnRvIGFjY291bnQgY2hhbWVsZW9ucykKKyAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgYm9vbGVhbiBjaGFtZWxlb24gPSBmYWxzZTsKKyAgICAgICAgaWYgKGdpdmVuVGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9IGdpdmVuVGFyZ2V0TmFtZXNwYWNlOworICAgICAgICAgICAgY2hhbWVsZW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCisgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiIjsKKyAgICAgICAgCisgICAgICAgIHN0YXRlLmFkZE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOworCisgICAgICAgIC8vIG1ha2UgYSBub3RlIG9mIGFsbCByZWRlZmluaXRpb25zCisgICAgICAgIFJlZGVmaW5pdGlvbkhvbGRlciByZWRlZmluaXRpb25zID0gbmV3IFJlZGVmaW5pdGlvbkhvbGRlcihyZWRlZmluZSk7CisKKyAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZVtdIGNvbXBsZXhUeXBlcyA9IHNjaGVtYS5nZXRDb21wbGV4VHlwZUFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxleFR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBUb3BMZXZlbENvbXBsZXhUeXBlIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZUNvbXBsZXhUeXBlKGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShjb21wbGV4VHlwZXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSksIHJlZGVmICE9IG51bGwpOworICAgICAgICAgICAgaWYgKHJlZGVmICE9IG51bGwpCisgICAgICAgICAgICAgICAgc3RhdGUuYWRkR2xvYmFsVHlwZSh0cmFuc2xhdGVHbG9iYWxDb21wbGV4VHlwZShyZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHRydWUpLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBUb3BMZXZlbFNpbXBsZVR5cGVbXSBzaW1wbGVUeXBlcyA9IHNjaGVtYS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaW1wbGVUeXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZVNpbXBsZVR5cGUoc2ltcGxlVHlwZXNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHN0YXRlLmFkZEdsb2JhbFR5cGUodHJhbnNsYXRlR2xvYmFsU2ltcGxlVHlwZShzaW1wbGVUeXBlc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5hZGRHbG9iYWxUeXBlKHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgVG9wTGV2ZWxFbGVtZW50W10gZWxlbWVudHMgPSBzY2hlbWEuZ2V0RWxlbWVudEFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFRvcExldmVsRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07CisgICAgICAgICAgICBzdGF0ZS5hZGREb2N1bWVudFR5cGUodHJhbnNsYXRlRG9jdW1lbnRUeXBlKGVsZW1lbnQsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKSwgUU5hbWVIZWxwZXIuZm9yTE5TKGVsZW1lbnQuZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvcExldmVsQXR0cmlidXRlW10gYXR0cmlidXRlcyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlVHlwZSh0cmFuc2xhdGVBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pLCBRTmFtZUhlbHBlci5mb3JMTlMoYXR0cmlidXRlLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBOYW1lZEdyb3VwW10gbW9kZWxncm91cHMgPSBzY2hlbWEuZ2V0R3JvdXBBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGVsZ3JvdXBzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lZEdyb3VwIHJlZGVmID0gcmVkZWZpbml0aW9ucy5yZWRlZmluZU1vZGVsR3JvdXAobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHN0YXRlLmFkZE1vZGVsR3JvdXAodHJhbnNsYXRlTW9kZWxHcm91cChtb2RlbGdyb3Vwc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5hZGRNb2RlbEdyb3VwKHRyYW5zbGF0ZU1vZGVsR3JvdXAocmVkZWYsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCB0cnVlKSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cFtdIGF0dHJncm91cHMgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJncm91cHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWVkQXR0cmlidXRlR3JvdXAgcmVkZWYgPSByZWRlZmluaXRpb25zLnJlZGVmaW5lQXR0cmlidXRlR3JvdXAoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgc3RhdGUuYWRkQXR0cmlidXRlR3JvdXAodHJhbnNsYXRlQXR0cmlidXRlR3JvdXAoYXR0cmdyb3Vwc1tpXSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKSwgcmVkZWYgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAocmVkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5hZGRBdHRyaWJ1dGVHcm91cCh0cmFuc2xhdGVBdHRyaWJ1dGVHcm91cChyZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIHRydWUpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJlZGVmaW5pdGlvbnMuY29tcGxhaW5BYm91dE1pc3NpbmdEZWZpbml0aW9ucygpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWRlZmluaXRpb25Ib2xkZXIKKyAgICB7CisgICAgICAgIC8vIHJlY29yZCByZWRlZmluaXRpb25zCisgICAgICAgIHByaXZhdGUgTWFwIHN0UmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgcHJpdmF0ZSBNYXAgY3RSZWRlZmluaXRpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgICAgICBwcml2YXRlIE1hcCBhZ1JlZGVmaW5pdGlvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgIHByaXZhdGUgTWFwIG1nUmVkZWZpbml0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKKyAgICAgICAgCisgICAgICAgIC8vIGZpcnN0IGJ1aWxkIHNldCBvZiByZWRlZmluZWQgY29tcG9uZW50cworICAgICAgICBSZWRlZmluaXRpb25Ib2xkZXIoUmVkZWZpbmUgcmVkZWZpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWRlZmluZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0UmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgY3RSZWRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICBhZ1JlZGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIG1nUmVkZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlZGVmaW5lLmdldFNjaGVtYUxvY2F0aW9uKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24gPSByZWRlZmluZS5nZXRTY2hlbWFMb2NhdGlvbigpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFRvcExldmVsQ29tcGxleFR5cGVbXSBjb21wbGV4VHlwZXMgPSByZWRlZmluZS5nZXRDb21wbGV4VHlwZUFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wbGV4VHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGVzW2ldLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBjb21wbGV4VHlwZXNbaV0uZ2V0TmFtZSgpLCBYbWxFcnJvckNvbnRleHQuRFVQTElDQVRFX0dMT0JBTF9UWVBFLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdFJlZGVmaW5pdGlvbnMucHV0KGNvbXBsZXhUeXBlc1tpXS5nZXROYW1lKCksIGNvbXBsZXhUeXBlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlW10gc2ltcGxlVHlwZXMgPSByZWRlZmluZS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpbXBsZVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkR1cGxpY2F0ZSB0eXBlIHJlZGVmaW5pdGlvbjogIiArIHNpbXBsZVR5cGVzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RSZWRlZmluaXRpb25zLnB1dChzaW1wbGVUeXBlc1tpXS5nZXROYW1lKCksIHNpbXBsZVR5cGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBOYW1lZEdyb3VwW10gbW9kZWxncm91cHMgPSByZWRlZmluZS5nZXRHcm91cEFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbGdyb3Vwcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1nUmVkZWZpbml0aW9ucy5jb250YWluc0tleShtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBtb2RlbGdyb3Vwc1tpXS5nZXROYW1lKCksIFhtbEVycm9yQ29udGV4dC5EVVBMSUNBVEVfR0xPQkFMX1RZUEUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nUmVkZWZpbml0aW9ucy5wdXQobW9kZWxncm91cHNbaV0uZ2V0TmFtZSgpLCBtb2RlbGdyb3Vwc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cFtdIGF0dHJncm91cHMgPSByZWRlZmluZS5nZXRBdHRyaWJ1dGVHcm91cEFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyZ3JvdXBzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJncm91cHNbaV0uZ2V0TmFtZSgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoYXR0cmdyb3Vwc1tpXS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJEdXBsaWNhdGUgdHlwZSByZWRlZmluaXRpb246ICIgKyBhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSwgWG1sRXJyb3JDb250ZXh0LkRVUExJQ0FURV9HTE9CQUxfVFlQRSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdSZWRlZmluaXRpb25zLnB1dChhdHRyZ3JvdXBzW2ldLmdldE5hbWUoKSwgYXR0cmdyb3Vwc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUb3BMZXZlbFNpbXBsZVR5cGUgcmVkZWZpbmVTaW1wbGVUeXBlKFN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFzdFJlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKFRvcExldmVsU2ltcGxlVHlwZSlzdFJlZGVmaW5pdGlvbnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVG9wTGV2ZWxDb21wbGV4VHlwZSByZWRlZmluZUNvbXBsZXhUeXBlKFN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFjdFJlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKFRvcExldmVsQ29tcGxleFR5cGUpY3RSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE5hbWVkR3JvdXAgcmVkZWZpbmVNb2RlbEdyb3VwKFN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFtZ1JlZGVmaW5pdGlvbnMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gKE5hbWVkR3JvdXApbWdSZWRlZmluaXRpb25zLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE5hbWVkQXR0cmlidXRlR3JvdXAgcmVkZWZpbmVBdHRyaWJ1dGVHcm91cChTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhYWdSZWRlZmluaXRpb25zLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIChOYW1lZEF0dHJpYnV0ZUdyb3VwKWFnUmVkZWZpbml0aW9ucy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsYWluQWJvdXRNaXNzaW5nRGVmaW5pdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RSZWRlZmluaXRpb25zLmlzRW1wdHkoKSAmJiBjdFJlZGVmaW5pdGlvbnMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICAgIGFnUmVkZWZpbml0aW9ucy5pc0VtcHR5KCkgJiYgbWdSZWRlZmluaXRpb25zLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RSZWRlZmluaXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJSZWRlZmluZWQgc2ltcGxlIHR5cGUgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KXN0UmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdFJlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZGVmaW5lZCBjb21wbGV4IHR5cGUgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KWN0UmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhZ1JlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZGVmaW5lZCBhdHRyaWJ1dGUgZ3JvdXAgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgc2NoZW1hTG9jYXRpb24sIFhtbEVycm9yQ29udGV4dC5HRU5FUklDX0VSUk9SLCAoWG1sT2JqZWN0KWFnUmVkZWZpbml0aW9ucy5nZXQobmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZ1JlZGVmaW5pdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlJlZGVmaW5lZCBtb2RlbCBncm91cCAiICsgbmFtZSArICIgbm90IGZvdW5kIGluICIgKyBzY2hlbWFMb2NhdGlvbiwgWG1sRXJyb3JDb250ZXh0LkdFTkVSSUNfRVJST1IsIChYbWxPYmplY3QpbWdSZWRlZmluaXRpb25zLmdldChuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZEZpbGVuYW1lKFhtbE9iamVjdCB4b2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0c2NTdGF0ZS5nZXQoKS5zb3VyY2VOYW1lRm9yVXJpKHhvYmouZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0U291cmNlTmFtZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlSW1wbCB0cmFuc2xhdGVEb2N1bWVudFR5cGUgKCBUb3BMZXZlbEVsZW1lbnQgeHNkVHlwZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24gKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZUltcGwgc1R5cGUgPSBuZXcgU2NoZW1hVHlwZUltcGwoIFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSApOworICAgICAgICAKKyAgICAgICAgc1R5cGUuc2V0RG9jdW1lbnRUeXBlKHRydWUpOworICAgICAgICBzVHlwZS5zZXRQYXJzZUNvbnRleHQoIHhzZFR5cGUsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uLCBmYWxzZSk7CisgICAgICAgIHNUeXBlLnNldEZpbGVuYW1lKCBmaW5kRmlsZW5hbWUoIHhzZFR5cGUgKSApOworCisgICAgICAgIHJldHVybiBzVHlwZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hVHlwZUltcGwgdHJhbnNsYXRlQXR0cmlidXRlVHlwZSAoIFRvcExldmVsQXR0cmlidXRlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uICkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHNUeXBlID0gbmV3IFNjaGVtYVR5cGVJbXBsKCBTdHNjU3RhdGUuZ2V0KCkuc3RzKCkgKTsKKyAgICAgICAgCisgICAgICAgIHNUeXBlLnNldEF0dHJpYnV0ZVR5cGUodHJ1ZSk7CisgICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCggeHNkVHlwZSwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKKyAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoIGZpbmRGaWxlbmFtZSggeHNkVHlwZSApICk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc1R5cGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUdsb2JhbENvbXBsZXhUeXBlKFRvcExldmVsQ29tcGxleFR5cGUgeHNkVHlwZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIFN0cmluZyBsb2NhbG5hbWUgPSB4c2RUeXBlLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKGxvY2FsbmFtZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiR2xvYmFsIHR5cGUgbWlzc2luZyBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuR0xPQkFMX1RZUEVfTUlTU0lOR19OQU1FLCB4c2RUeXBlKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdW5uYW1lZCB0eXBlcy4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICghWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKGxvY2FsbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIHR5cGUgbmFtZSBcIiIgKyBsb2NhbG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RUeXBlLnhnZXROYW1lKCkpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KKyAgICAgICAgfQorCisgICAgICAgIFFOYW1lIG5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpOworICAgICAgICAKKyAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUeXBlTmFtZShuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2tpcHBpbmcgZGVmaW5pdGlvbiBvZiBidWlsdC1pbiB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5SRVNFUlZFRF9UWVBFX05BTUUsIHhzZFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSZWNvcmRpbmcgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpKTsKKworICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7CisgICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCh4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uKTsKKyAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZFR5cGUpKTsKKyAgICAgICAgc1R5cGUuc2V0TmFtZShRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpKTsKKyAgICAgICAgcmV0dXJuIHNUeXBlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVJbXBsIHRyYW5zbGF0ZUdsb2JhbFNpbXBsZVR5cGUoVG9wTGV2ZWxTaW1wbGVUeXBlIHhzZFR5cGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKKyAgICB7CisgICAgICAgIFN0c2NTdGF0ZSBzdGF0ZSA9IFN0c2NTdGF0ZS5nZXQoKTsKKworICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0geHNkVHlwZS5nZXROYW1lKCk7CisgICAgICAgIGlmIChsb2NhbG5hbWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkdsb2JhbCB0eXBlIG1pc3NpbmcgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkdMT0JBTF9UWVBFX01JU1NJTkdfTkFNRSwgeHNkVHlwZSk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHVubmFtZWQgdHlwZXMuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZE5DTmFtZShsb2NhbG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCB0eXBlIG5hbWUgXCIiICsgbG9jYWxuYW1lICsgIlwiIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkVHlwZS54Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFFOYW1lIG5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobG9jYWxuYW1lLCB0YXJnZXROYW1lc3BhY2UpOworICAgICAgICAKKyAgICAgICAgaWYgKGlzUmVzZXJ2ZWRUeXBlTmFtZShuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUud2FybmluZygiU2tpcHBpbmcgZGVmaW5pdGlvbiBvZiBidWlsdC1pbiB0eXBlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkobmFtZSksIFhtbEVycm9yQ29udGV4dC5SRVNFUlZFRF9UWVBFX05BTUUsIHhzZFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSZWNvcmRpbmcgdHlwZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KG5hbWUpKTsKKworICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZSA9IG5ldyBTY2hlbWFUeXBlSW1wbChzdGF0ZS5zdHMoKSk7CisgICAgICAgIHNUeXBlLnNldFNpbXBsZVR5cGUodHJ1ZSk7CisgICAgICAgIHNUeXBlLnNldFBhcnNlQ29udGV4dCh4c2RUeXBlLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uKTsKKyAgICAgICAgc1R5cGUuc2V0RmlsZW5hbWUoZmluZEZpbGVuYW1lKHhzZFR5cGUpKTsKKyAgICAgICAgc1R5cGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgcmV0dXJuIHNUeXBlOworICAgIH0KKworICAgIHN0YXRpYyBGb3JtQ2hvaWNlIGZpbmRFbGVtZW50Rm9ybURlZmF1bHQoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjdXIgPSBvYmoubmV3Q3Vyc29yKCk7CisgICAgICAgIHdoaWxlIChjdXIuZ2V0T2JqZWN0KCkuc2NoZW1hVHlwZSgpICE9IFNjaGVtYS50eXBlKQorICAgICAgICAgICAgaWYgKCFjdXIudG9QYXJlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuICgoU2NoZW1hKWN1ci5nZXRPYmplY3QoKSkueGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cmlNYXRjaChTdHJpbmcgczEsIFN0cmluZyBzMikKKyAgICB7CisgICAgICAgIGlmIChzMSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHMyID09IG51bGwgfHwgczIuZXF1YWxzKCIiKTsKKyAgICAgICAgaWYgKHMyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gczEuZXF1YWxzKCIiKTsKKyAgICAgICAgcmV0dXJuIHMxLmVxdWFscyhzMik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlHbG9iYWxFbGVtZW50VG9Mb2NhbEVsZW1lbnQoU2NoZW1hR2xvYmFsRWxlbWVudCByZWZlcmVuY2VkLCBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRhcmdldCApCisgICAgeworCisgICAgICAgIHRhcmdldC5zZXROYW1lQW5kVHlwZVJlZihyZWZlcmVuY2VkLmdldE5hbWUoKSwgcmVmZXJlbmNlZC5nZXRUeXBlKCkuZ2V0UmVmKCkpOworICAgICAgICB0YXJnZXQuc2V0TmlsbGFibGUocmVmZXJlbmNlZC5pc05pbGxhYmxlKCkpOworICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdChyZWZlcmVuY2VkLmdldERlZmF1bHRUZXh0KCksIHJlZmVyZW5jZWQuaXNGaXhlZCgpLCAoKFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKXJlZmVyZW5jZWQpLmdldFBhcnNlT2JqZWN0KCkpOworICAgICAgICB0YXJnZXQuc2V0SWRlbnRpdHlDb25zdHJhaW50cygoKFNjaGVtYUxvY2FsRWxlbWVudEltcGwpcmVmZXJlbmNlZCkuZ2V0SWRlbnRpdHlDb25zdHJhaW50UmVmcygpKTsKKyAgICAgICAgdGFyZ2V0LnNldEJsb2NrKHJlZmVyZW5jZWQuYmxvY2tFeHRlbnNpb24oKSwgIHJlZmVyZW5jZWQuYmxvY2tSZXN0cmljdGlvbigpLCAgcmVmZXJlbmNlZC5ibG9ja1N1YnN0aXR1dGlvbigpKTsKKyAgICAgICAgdGFyZ2V0LnNldEFic3RyYWN0KHJlZmVyZW5jZWQuaXNBYnN0cmFjdCgpKTsKKyAgICAgICAgdGFyZ2V0LnNldFRyYW5zaXRpb25SdWxlcygoKFNjaGVtYVBhcnRpY2xlKXJlZmVyZW5jZWQpLmFjY2VwdGVkU3RhcnROYW1lcygpLAorICAgICAgICAgICAgKChTY2hlbWFQYXJ0aWNsZSlyZWZlcmVuY2VkKS5pc1NraXBwYWJsZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUdsb2JhbEF0dHJpYnV0ZVRvTG9jYWxBdHRyaWJ1dGUoU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbCByZWZlcmVuY2VkLCBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgdGFyZ2V0ICkKKyAgICB7CisgICAgICAgIHRhcmdldC5pbml0KAorICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXROYW1lKCksIHJlZmVyZW5jZWQuZ2V0VHlwZVJlZigpLCByZWZlcmVuY2VkLmdldFVzZSgpLAorICAgICAgICAgICAgcmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpLAorICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQuZ2V0UGFyc2VPYmplY3QoKSwgcmVmZXJlbmNlZC5fZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgcmVmZXJlbmNlZC5pc0ZpeGVkKCksCisgICAgICAgICAgICByZWZlcmVuY2VkLmdldFdTRExBcnJheVR5cGUoKSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZXMgYSBsb2NhbCBvciBnbG9iYWwgc2NoZW1hIGVsZW1lbnQuCisgICAgICovCisgICAgLy8gY2hlY2sgcnVsZSAzLjMuMworICAgIC8vIGh0dHA6Ly93d3cudzNjLm9yZy9UUi8jc2VjdGlvbi1Db25zdHJhaW50cy1vbi1YTUwtUmVwcmVzZW50YXRpb25zLW9mLUVsZW1lbnQtRGVjbGFyYXRpb25zCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRyYW5zbGF0ZUVsZW1lbnQoCisgICAgICAgIEVsZW1lbnQgeHNkRWx0LCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBib29sZWFuIGNoYW1lbGVvbiwKKyAgICAgICAgTGlzdCBhbm9ueW1vdXNUeXBlcywgU2NoZW1hVHlwZSBvdXRlclR5cGUpCisgICAgeworICAgICAgICBTdHNjU3RhdGUgc3RhdGUgPSBTdHNjU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgU2NoZW1hVHlwZUltcGwgc2dIZWFkID0gbnVsbDsKKworICAgICAgICAvLyB0cmFuc2xhdGUgc2cgaGVhZAorICAgICAgICBpZiAoeHNkRWx0LmlzU2V0U3Vic3RpdHV0aW9uR3JvdXAoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2dIZWFkID0gc3RhdGUuZmluZERvY3VtZW50VHlwZSh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwKKyAgICAgICAgICAgICAgICAoKFNjaGVtYVR5cGVJbXBsKW91dGVyVHlwZSkuZ2V0Q2hhbWVsZW9uTmFtZXNwYWNlKCkpOworCisgICAgICAgICAgICBpZiAoc2dIZWFkICE9IG51bGwpCisgICAgICAgICAgICAgICAgU3RzY1Jlc29sdmVyLnJlc29sdmVUeXBlKHNnSGVhZCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbmFtZSA9IHhzZEVsdC5nZXROYW1lKCk7CisgICAgICAgIFFOYW1lIHJlZiA9IHhzZEVsdC5nZXRSZWYoKTsKKworCisgICAgICAgIGlmIChyZWYgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIChuYW1lLmVxdWFscyhyZWYuZ2V0TG9jYWxQYXJ0KCkpICYmIHVyaU1hdGNoKHRhcmdldE5hbWVzcGFjZSwgcmVmLmdldE5hbWVzcGFjZVVSSSgpKSkKKyAgICAgICAgICAgIC8vICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50ICIgKyBuYW1lICsgIiBzcGVjaWZpZXMgYm90aCBhIHJlZiBhbmQgYSBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfRVhUUkFfUkVGLCB4c2RFbHQueGdldFJlZigpKTsKKyAgICAgICAgICAgIC8vIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiRWxlbWVudCAiICsgbmFtZSArICIgc3BlY2lmaWVzIGJvdGggYSByZWYgYW5kIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX0VYVFJBX1JFRiwgeHNkRWx0LnhnZXRSZWYoKSk7CisgICAgICAgICAgICAvLyBpZ25vcmUgbmFtZQorICAgICAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZiA9PSBudWxsICYmIG5hbWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgaGFzIG5vIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9NSVNTSU5HX05BTUUsIHhzZEVsdCk7CisgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSW52YWxpZCBlbGVtZW50IG5hbWUgXCIiICsgbmFtZSArICJcIiIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEVsdC54Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4c2RFbHQuZ2V0VHlwZSgpICE9IG51bGwgfHwgeHNkRWx0LmdldFNpbXBsZVR5cGUoKSAhPSBudWxsIHx8IHhzZEVsdC5nZXRDb21wbGV4VHlwZSgpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkVsZW1lbnQgcmVmZXJlbmNlIGNhbm5vdCBhbHNvIHNwZWNpZnkgYSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogbGV0IHRoZSBuYW1lIGdvIHRocm91Z2ggYW55d2F5LgorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoeHNkRWx0LmdldEZvcm0oKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJFbGVtZW50IHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBzcGVjaWZ5IGZvcm0iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RFbHQpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBsZXQgdGhlIG5hbWUgZ28gdGhyb3VnaCBhbnl3YXkuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4c2RFbHQuc2l6ZU9mS2V5QXJyYXkoKSA+IDAgfHwgeHNkRWx0LnNpemVPZktleXJlZkFycmF5KCkgPiAwIHx8IHhzZEVsdC5zaXplT2ZVbmlxdWVBcnJheSgpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHJlZmVyZW5jZSBjYW5ub3QgYWxzbyBjb250YWluIGtleSwga2V5cmVmLCBvciB1bmlxdWUiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RFbHQpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHhzZEVsdC5pc1NldERlZmF1bHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS53YXJuaW5nKCJFbGVtZW50IHdpdGggcmVmZXJlbmNlIHRvICciICsgcmVmLmdldExvY2FsUGFydCgpICsgIicgY2Fubm90IGFsc28gc3BlY2lmeSBkZWZhdWx0IiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4c2RFbHQuaXNTZXRGaXhlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIkVsZW1lbnQgd2l0aCByZWZlcmVuY2UgdG8gJyIgKyByZWYuZ2V0TG9jYWxQYXJ0KCkgKyAiJyBjYW5ub3QgYWxzbyBzcGVjaWZ5IGZpeGVkIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4c2RFbHQuaXNTZXRCbG9jaygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIkVsZW1lbnQgd2l0aCByZWZlcmVuY2UgdG8gJyIgKyByZWYuZ2V0TG9jYWxQYXJ0KCkgKyAiJyBjYW5ub3QgYWxzbyBzcGVjaWZ5IGJsb2NrIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4c2RFbHQuaXNTZXROaWxsYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIkVsZW1lbnQgd2l0aCByZWZlcmVuY2UgdG8gJyIgKyByZWYuZ2V0TG9jYWxQYXJ0KCkgKyAiJyBjYW5ub3QgYWxzbyBzcGVjaWZ5IG5pbGxhYmxlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkRWx0KTsKKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydCh4c2RFbHQgaW5zdGFuY2VvZiBMb2NhbEVsZW1lbnQpOworICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCByZWZlcmVuY2VkID0gc3RhdGUuZmluZEdsb2JhbEVsZW1lbnQocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKKyAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX1JFRl9OT1RfRk9VTkQsIHhzZEVsdC54Z2V0UmVmKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsIHRhcmdldCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7CisgICAgICAgICAgICB0YXJnZXQuc2V0UGFydGljbGVUeXBlKFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQpOworICAgICAgICAgICAgY29weUdsb2JhbEVsZW1lbnRUb0xvY2FsRWxlbWVudCggcmVmZXJlbmNlZCwgdGFyZ2V0ICk7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICB9CisKKyAgICAgICAgUU5hbWUgcW5hbWU7CisgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudEltcGwgaW1wbDsKKyAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IG51bGw7CisKKyAgICAgICAgaWYgKHhzZEVsdCBpbnN0YW5jZW9mIExvY2FsRWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW1wbCA9IG5ldyBTY2hlbWFMb2NhbEVsZW1lbnRJbXBsKCk7CisgICAgICAgICAgICBGb3JtQ2hvaWNlIGZvcm0gPSB4c2RFbHQueGdldEZvcm0oKTsKKyAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwpCisgICAgICAgICAgICAgICAgZm9ybSA9IGZpbmRFbGVtZW50Rm9ybURlZmF1bHQoeHNkRWx0KTsKKyAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwgfHwgZm9ybS5nZXRTdHJpbmdWYWx1ZSgpLmVxdWFscygidW5xdWFsaWZpZWQiKSkKKyAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOKG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50SW1wbCBnZWx0ID0gbmV3IFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsKHN0YXRlLnN0cygpKTsKKyAgICAgICAgICAgIGltcGwgPSBnZWx0OworCisgICAgICAgICAgICAvLyBTZXQgc3Vic3QgZ3JvdXAgaGVhZAorICAgICAgICAgICAgaWYgKHNnSGVhZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYUdsb2JhbEVsZW1lbnRJbXBsIGhlYWQgPSBzdGF0ZS5maW5kR2xvYmFsRWxlbWVudCh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZ2VsdC5zZXRTdWJzdGl0dXRpb25Hcm91cChoZWFkLmdldFJlZigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IHN1YnN0IGdyb3VwIG1lbWJlcnMKKyAgICAgICAgICAgIHFuYW1lID0gUU5hbWVIZWxwZXIuZm9yTE5TKG5hbWUsIHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBkb2NUeXBlID0gKFNjaGVtYVR5cGVJbXBsKW91dGVyVHlwZTsKKworICAgICAgICAgICAgUU5hbWVbXSBzZ01lbWJlcnMgPSBkb2NUeXBlLmdldFN1YnN0aXR1dGlvbkdyb3VwTWVtYmVycygpOworICAgICAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHRyYW5zaXRpb25SdWxlcyA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25SdWxlcy5hZGQocW5hbWUpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzZ01lbWJlcnMubGVuZ3RoIDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlbHQuYWRkU3Vic3RpdHV0aW9uR3JvdXBNZW1iZXIoc2dNZW1iZXJzW2ldKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uUnVsZXMuYWRkKHNnTWVtYmVyc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltcGwuc2V0VHJhbnNpdGlvblJ1bGVzKFFOYW1lU2V0LmZvclNwZWNpZmljYXRpb24odHJhbnNpdGlvblJ1bGVzKSwgZmFsc2UpOworICAgICAgICAgICAgaW1wbC5zZXRUcmFuc2l0aW9uTm90ZXMoUU5hbWVTZXQuRU1QVFksIHRydWUpOworCisgICAgICAgICAgICBib29sZWFuIGZpbmFsRXh0ID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGZpbmFsUmVzdCA9IGZhbHNlOworICAgICAgICAgICAgT2JqZWN0IGRzID0geHNkRWx0LmdldEZpbmFsKCk7CisgICAgICAgICAgICBpZiAoZHMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZHMuZXF1YWxzKCIjYWxsIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGZpbmFsRXh0ID0gZmluYWxSZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHMgaW5zdGFuY2VvZiBMaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoTGlzdClkcykuY29udGFpbnMoImV4dGVuc2lvbiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFeHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWRzKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUmVzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZWx0LnNldEZpbmFsKGZpbmFsRXh0LCBmaW5hbFJlc3QpOworICAgICAgICAgICAgZ2VsdC5zZXRBYnN0cmFjdCh4c2RFbHQuZ2V0QWJzdHJhY3QoKSk7CisgICAgICAgICAgICBnZWx0LnNldEZpbGVuYW1lKGZpbmRGaWxlbmFtZSh4c2RFbHQpKTsKKyAgICAgICAgICAgIGdlbHQuc2V0UGFyc2VDb250ZXh0KHhzZEVsdCwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHhzZEVsdC5nZXRUeXBlKCkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc1R5cGUgPSBzdGF0ZS5maW5kR2xvYmFsVHlwZSh4c2RFbHQuZ2V0VHlwZSgpLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsICk7CisgICAgICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5ub3RGb3VuZEVycm9yKHhzZEVsdC5nZXRUeXBlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgeHNkRWx0LnhnZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzaW1wbGVUeXBlZGVmID0gZmFsc2U7CisgICAgICAgIFhtbE9iamVjdCB0eXBlZGVmID0geHNkRWx0LmdldENvbXBsZXhUeXBlKCk7CisgICAgICAgIGlmICh0eXBlZGVmID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgPSB4c2RFbHQuZ2V0U2ltcGxlVHlwZSgpOworICAgICAgICAgICAgc2ltcGxlVHlwZWRlZiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHNUeXBlICE9IG51bGwpICYmIHR5cGVkZWYgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgdG8gZGVmaW5lIGEgbmVzdGVkIHR5cGUgd2hlbiBhIHR5cGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfTkVTVEVEX1RZUEUsIHR5cGVkZWYpOworICAgICAgICAgICAgdHlwZWRlZiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZWRlZiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICAgICAgc1R5cGUgPSBzVHlwZUltcGw7CisgICAgICAgICAgICBzVHlwZUltcGwuc2V0Q29udGFpbmVyRmllbGQoaW1wbCk7CisgICAgICAgICAgICBzVHlwZUltcGwuc2V0T3V0ZXJTY2hlbWFUeXBlUmVmKG91dGVyVHlwZSA9PSBudWxsID8gbnVsbCA6IG91dGVyVHlwZS5nZXRSZWYoKSk7CisgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgYW5vbnltb3VzIHR5cGUgdW5yZXNvbHZlZDogaXQgd2lsbCBiZSByZXNvbHZlZCBsYXRlci4KKyAgICAgICAgICAgIGFub255bW91c1R5cGVzLmFkZChzVHlwZSk7CisgICAgICAgICAgICBzVHlwZUltcGwuc2V0U2ltcGxlVHlwZShzaW1wbGVUeXBlZGVmKTsKKyAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRQYXJzZUNvbnRleHQodHlwZWRlZiwgdGFyZ2V0TmFtZXNwYWNlLCBjaGFtZWxlb24sIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0eXBlIG1heSBpbmhlcml0IGZyb20gc3Vic3RpdHV0aW9uIGdyb3VwIGhlYWQKKyAgICAgICAgICAgIGlmIChzZ0hlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IGhlYWQgPSBzdGF0ZS5maW5kR2xvYmFsRWxlbWVudCh4c2RFbHQuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSwgY2hhbWVsZW9uID8gdGFyZ2V0TmFtZXNwYWNlIDogbnVsbCk7CisKKyAgICAgICAgICAgICAgICAvLyBCdWcgLSBEbyBJIG5lZWQgdG8gY29weSB0aGUgdHlwZSBpZiBpdCdzIGFub255bW91cz8KKyAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkCisgICAgICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc1R5cGUgPSBoZWFkLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKworCisgICAgICAgIGlmIChzVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgc1R5cGUgPSBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9BTllfVFlQRTsKKworICAgICAgICBTT0FQQXJyYXlUeXBlIHdhdCA9IG51bGw7CisgICAgICAgIFhtbEN1cnNvciBjID0geHNkRWx0Lm5ld0N1cnNvcigpOworICAgICAgICBTdHJpbmcgYXJyYXlUeXBlID0gYy5nZXRBdHRyaWJ1dGVUZXh0KFdTRExfQVJSQVlUWVBFX05BTUUpOworICAgICAgICBjLmRpc3Bvc2UoKTsKKyAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB3YXQgPSBuZXcgU09BUEFycmF5VHlwZShhcnJheVR5cGUsIG5ldyBOYW1lc3BhY2VDb250ZXh0KHhzZEVsdCkpOworICAgICAgICB9CisgICAgICAgIGltcGwuc2V0V3NkbEFycmF5VHlwZSh3YXQpOworCisgICAgICAgIGJvb2xlYW4gaXNGaXhlZCA9IHhzZEVsdC5pc1NldEZpeGVkKCk7CisgICAgICAgIGlmICh4c2RFbHQuaXNTZXREZWZhdWx0KCkgJiYgaXNGaXhlZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIlNob3VsZCBub3Qgc2V0IGJvdGggZGVmYXVsdCBhbmQgZml4ZWQgb24gdGhlIHNhbWUgZWxlbWVudCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfREVGQVVMVF9GSVhFRCwgeHNkRWx0LnhnZXRGaXhlZCgpKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZml4ZWQKKyAgICAgICAgICAgIGlzRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbXBsLnNldFBhcnRpY2xlVHlwZShTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UKTsKKyAgICAgICAgaW1wbC5zZXROYW1lQW5kVHlwZVJlZihxbmFtZSwgc1R5cGUuZ2V0UmVmKCkpOworICAgICAgICBpbXBsLnNldE5pbGxhYmxlKHhzZEVsdC5nZXROaWxsYWJsZSgpKTsKKyAgICAgICAgaW1wbC5zZXREZWZhdWx0KGlzRml4ZWQgPyB4c2RFbHQuZ2V0Rml4ZWQoKSA6IHhzZEVsdC5nZXREZWZhdWx0KCksIGlzRml4ZWQsIHhzZEVsdCk7CisKKyAgICAgICAgT2JqZWN0IGJsb2NrID0geHNkRWx0LmdldEJsb2NrKCk7CisgICAgICAgIGJvb2xlYW4gYmxvY2tFeHQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibG9ja1Jlc3QgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibG9ja1N1YnN0ID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChibG9jayBpbnN0YW5jZW9mIFN0cmluZyAmJiBibG9jay5lcXVhbHMoIiNhbGwiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAjQUxMIHZhbHVlCisgICAgICAgICAgICAgICAgYmxvY2tFeHQgPSBibG9ja1Jlc3QgPSBibG9ja1N1YnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygiZXh0ZW5zaW9uIikpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrRXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygicmVzdHJpY3Rpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoKChMaXN0KWJsb2NrKS5jb250YWlucygic3Vic3RpdHV0aW9uIikpCisgICAgICAgICAgICAgICAgICAgIGJsb2NrU3Vic3QgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbXBsLnNldEJsb2NrKGJsb2NrRXh0LCBibG9ja1Jlc3QsIGJsb2NrU3Vic3QpOworCisgICAgICAgIGJvb2xlYW4gY29uc3RyYWludEZhaWxlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFRyYW5zbGF0ZSBJZGVudGl0eSBjb25zdHJhaW50cworCisgICAgICAgIGludCBsZW5ndGggPSB4c2RFbHQuc2l6ZU9mS2V5QXJyYXkoKSArIHhzZEVsdC5zaXplT2ZLZXlyZWZBcnJheSgpICsgeHNkRWx0LnNpemVPZlVuaXF1ZUFycmF5KCk7CisgICAgICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGxbXSBjb25zdHJhaW50cyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsW2xlbmd0aF07CisgICAgICAgIGludCBjdXIgPSAwOworCisgICAgICAgIC8vIEhhbmRsZSBrZXkgY29uc3RyYWludHMKKyAgICAgICAgS2V5YmFzZVtdIGtleXMgPSB4c2RFbHQuZ2V0S2V5QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwga2V5cy5sZW5ndGggOyBpKyssIGN1cisrKSB7CisgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KGtleXNbaV0sIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50c1tjdXJdICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29uc3RyYWludHNbY3VyXS5zZXRDb25zdHJhaW50Q2F0ZWdvcnkoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LkNDX0tFWSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29uc3RyYWludEZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgdW5pcXVlIGNvbnN0cmFpbnRzCisgICAgICAgIEtleWJhc2VbXSB1YyA9IHhzZEVsdC5nZXRVbmlxdWVBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB1Yy5sZW5ndGggOyBpKyssIGN1cisrKSB7CisgICAgICAgICAgICBjb25zdHJhaW50c1tjdXJdID0gdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KHVjW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7CisgICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19VTklRVUUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGtleXJlZiBjb25zdHJhaW50cworICAgICAgICBLZXlyZWZEb2N1bWVudC5LZXlyZWZbXSBrcnMgPSB4c2RFbHQuZ2V0S2V5cmVmQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwga3JzLmxlbmd0aCA7IGkrKywgY3VyKyspIHsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0gPSB0cmFuc2xhdGVJZGVudGl0eUNvbnN0cmFpbnQoa3JzW2ldLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7CisgICAgICAgICAgICBpZiAoY29uc3RyYWludHNbY3VyXSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2N1cl0uc2V0Q29uc3RyYWludENhdGVnb3J5KFNjaGVtYUlkZW50aXR5Q29uc3RyYWludC5DQ19LRVlSRUYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRGYWlsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb25zdHJhaW50RmFpbGVkKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW10gcmVmcyA9IG5ldyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmW2xlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCByZWZzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgICAgICByZWZzW2ldID0gY29uc3RyYWludHNbaV0uZ2V0UmVmKCk7CisKKyAgICAgICAgICAgIGltcGwuc2V0SWRlbnRpdHlDb25zdHJhaW50cyhyZWZzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbXBsOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgeHBhdGgpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHBhdGgubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHhwYXRoLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzU3BhY2UoY2gpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwucmVnZXguUmVndWxhckV4cHJlc3Npb24gWFBBVEhfUkVHRVhQID0gbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5yZWdleC5SZWd1bGFyRXhwcmVzc2lvbigiKFxcLi8vKT8oKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLikvKSooKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKSkoXFx8KFxcLi8vKT8oKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLikvKSooKCgoY2hpbGQ6Oik/KChcXGlcXGMqOik/KFxcaVxcYyp8XFwqKSkpfFxcLil8KChhdHRyaWJ1dGU6OnxAKSgoXFxpXFxjKjopPyhcXGlcXGMqfFxcKikpKSkpKiIsICJYIik7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1hQYXRoU3ludGF4KFN0cmluZyB4cGF0aCkKKyAgICB7CisgICAgICAgIGlmICh4cGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgLy8gc3RyaXAgd2hpdGVzcGFjZSBmcm9tIHhwYXRoCisgICAgICAgIHhwYXRoID0gcmVtb3ZlV2hpdGVzcGFjZSh4cGF0aCk7CisgICAgICAgIAorICAgICAgICAvLyBhcHBseSByZWdleHAKKyAgICAgICAgc3luY2hyb25pemVkIChYUEFUSF9SRUdFWFApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoWFBBVEhfUkVHRVhQLm1hdGNoZXMoeHBhdGgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwgdHJhbnNsYXRlSWRlbnRpdHlDb25zdHJhaW50KEtleWJhc2UgcGFyc2VJQywgCisgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworICAgICAgICAKKyAgICAgICAgLy8gZmlyc3QgZG8gc29tZSBjaGVja2luZworICAgICAgICBTdHJpbmcgc2VsZWN0b3IgPSBwYXJzZUlDLmdldFNlbGVjdG9yKCkgPT0gbnVsbCA/IG51bGwgOiBwYXJzZUlDLmdldFNlbGVjdG9yKCkuZ2V0WHBhdGgoKTsKKyAgICAgICAgaWYgKCFjaGVja1hQYXRoU3ludGF4KHNlbGVjdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJJbnZhbGlkIHhwYXRoIGluIHNlbGVjdG9yLiIsCisgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIHBhcnNlSUMuZ2V0U2VsZWN0b3IoKS54Z2V0WHBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRmllbGREb2N1bWVudC5GaWVsZFtdIGZpZWxkRWx0cyA9IHBhcnNlSUMuZ2V0RmllbGRBcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpZWxkRWx0cy5sZW5ndGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjaGVja1hQYXRoU3ludGF4KGZpZWxkRWx0c1tqXS5nZXRYcGF0aCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IoIkludmFsaWQgeHBhdGggaW4gZmllbGQuIiwKKyAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIGZpZWxkRWx0c1tqXS54Z2V0WHBhdGgoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHRoZW4gdHJhbnNsYXRlLgorICAgICAgICBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnRJbXBsIGljID0gbmV3IFNjaGVtYUlkZW50aXR5Q29uc3RyYWludEltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICBpYy5zZXROYW1lKFFOYW1lSGVscGVyLmZvckxOUyhwYXJzZUlDLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlKSk7CisgICAgICAgIGljLnNldFNlbGVjdG9yKHBhcnNlSUMuZ2V0U2VsZWN0b3IoKS5nZXRYcGF0aCgpKTsKKyAgICAgICAgaWMuc2V0UGFyc2VDb250ZXh0KHBhcnNlSUMsIHRhcmdldE5hbWVzcGFjZSwgY2hhbWVsZW9uKTsKKworICAgICAgICAvLyBTZXQgdGhlIG5zIG1hcAorICAgICAgICBYbWxDdXJzb3IgYyA9IHBhcnNlSUMubmV3Q3Vyc29yKCk7CisgICAgICAgIE1hcCBuc01hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgYy5nZXRBbGxOYW1lc3BhY2VzKG5zTWFwKTsKKyAgICAgICAgbnNNYXAucmVtb3ZlKCIiKTsgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IG1hcHBpbmcuIFRoaXMgY2Fubm90IGJlIHVzZWQgYnkgdGhlIHhwYXRoIGV4cHJlc3Npb25zLgorICAgICAgICBpYy5zZXROU01hcChuc01hcCk7CisgICAgICAgIGMuZGlzcG9zZSgpOworCisgICAgICAgIFN0cmluZ1tdIGZpZWxkcyA9IG5ldyBTdHJpbmdbZmllbGRFbHRzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IGZpZWxkcy5sZW5ndGggOyBqKyspCisgICAgICAgICAgICBmaWVsZHNbal0gPSBmaWVsZEVsdHNbal0uZ2V0WHBhdGgoKTsKKyAgICAgICAgaWMuc2V0RmllbGRzKGZpZWxkcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGljLmJ1aWxkUGF0aHMoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW52YWxpZCB4cGF0aCBpbiBpZGVudGl0eSBjb25zdHJhaW50OiAiICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgWG1sRXJyb3JDb250ZXh0LlhQQVRIX0NPTVBJTEFUSU9OX0ZBSUxVUkUsIHBhcnNlSUMpOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLmFkZElkQ29uc3RyYWludChpYyk7CisKKyAgICAgICAgcmV0dXJuIGljOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFNb2RlbEdyb3VwSW1wbCB0cmFuc2xhdGVNb2RlbEdyb3VwKE5hbWVkR3JvdXAgbmFtZWRHcm91cCwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgYm9vbGVhbiBjaGFtZWxlb24sIGJvb2xlYW4gcmVkZWZpbml0aW9uKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZEdyb3VwLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNb2RlbCBncm91cHMgbXVzdCBiZSBuYW1lZCIsIFhtbEVycm9yQ29udGV4dC5NT0RFTF9HUk9VUF9NSVNTSU5HX05BTUUsIG5hbWVkR3JvdXApOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU2NoZW1hTW9kZWxHcm91cEltcGwgcmVzdWx0ID0gbmV3IFNjaGVtYU1vZGVsR3JvdXBJbXBsKFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSk7CisgICAgICAgIHJlc3VsdC5pbml0KFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uLCBuYW1lZEdyb3VwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCB0cmFuc2xhdGVBdHRyaWJ1dGVHcm91cChBdHRyaWJ1dGVHcm91cCBhdHRyR3JvdXAsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBib29sZWFuIHJlZGVmaW5pdGlvbikKKyAgICB7CisgICAgICAgIFN0cmluZyBuYW1lID0gYXR0ckdyb3VwLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJBdHRyaWJ1dGUgZ3JvdXBzIG11c3QgYmUgbmFtZWQiLCBYbWxFcnJvckNvbnRleHQuQVRUUklCVVRFX0dST1VQX01JU1NJTkdfTkFNRSwgYXR0ckdyb3VwKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFNjaGVtYUF0dHJpYnV0ZUdyb3VwSW1wbCByZXN1bHQgPSBuZXcgU2NoZW1hQXR0cmlidXRlR3JvdXBJbXBsKFN0c2NTdGF0ZS5nZXQoKS5zdHMoKSk7CisgICAgICAgIHJlc3VsdC5pbml0KFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgcmVkZWZpbml0aW9uLCBhdHRyR3JvdXApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBGb3JtQ2hvaWNlIGZpbmRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG9iai5uZXdDdXJzb3IoKTsKKyAgICAgICAgd2hpbGUgKGN1ci5nZXRPYmplY3QoKS5zY2hlbWFUeXBlKCkgIT0gU2NoZW1hLnR5cGUpCisgICAgICAgICAgICBpZiAoIWN1ci50b1BhcmVudCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKChTY2hlbWEpY3VyLmdldE9iamVjdCgpKS54Z2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsIHRyYW5zbGF0ZUF0dHJpYnV0ZSgKKyAgICAgICAgQXR0cmlidXRlIHhzZEF0dHIsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIGJvb2xlYW4gY2hhbWVsZW9uLCBMaXN0IGFub255bW91c1R5cGVzLAorICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZSwgU2NoZW1hQXR0cmlidXRlTW9kZWwgYmFzZU1vZGVsLCBib29sZWFuIGxvY2FsKQorICAgIHsKKyAgICAgICAgU3RzY1N0YXRlIHN0YXRlID0gU3RzY1N0YXRlLmdldCgpOworCisgICAgICAgIFN0cmluZyBuYW1lID0geHNkQXR0ci5nZXROYW1lKCk7CisgICAgICAgIFFOYW1lIHJlZiA9IHhzZEF0dHIuZ2V0UmVmKCk7CisKKyAgICAgICAgaWYgKHJlZiAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKHJlZi5nZXRMb2NhbFBhcnQoKSkgJiYgdXJpTWF0Y2godGFyZ2V0TmFtZXNwYWNlLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpKQorICAgICAgICAgICAgICAgIHN0YXRlLndhcm5pbmcoIkF0dHJpYnV0ZSAiICsgbmFtZSArICIgc3BlY2lmaWVzIGJvdGggYSByZWYgYW5kIGEgbmFtZSIsIFhtbEVycm9yQ29udGV4dC5FTEVNRU5UX0VYVFJBX1JFRiwgeHNkQXR0ci54Z2V0UmVmKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgIiArIG5hbWUgKyAiIHNwZWNpZmllcyBib3RoIGEgcmVmIGFuZCBhIG5hbWUiLCBYbWxFcnJvckNvbnRleHQuRUxFTUVOVF9FWFRSQV9SRUYsIHhzZEF0dHIueGdldFJlZigpKTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBuYW1lCisgICAgICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmID09IG51bGwgJiYgbmFtZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS5lcnJvcigiQXR0cmlidXRlIGhhcyBubyBuYW1lIiwgWG1sRXJyb3JDb250ZXh0LkVMRU1FTlRfTUlTU0lOR19OQU1FLCB4c2RBdHRyKTsKKyAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lIFwiIiArIG5hbWUgKyAiXCIiLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGxldCB0aGUgbmFtZSBnbyB0aHJvdWdoIGFueXdheS4KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNGaXhlZCA9IGZhbHNlOworICAgICAgICBTdHJpbmcgZGVmdGV4dCA9IG51bGw7CisgICAgICAgIFFOYW1lIHFuYW1lOworICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZUltcGwgc0F0dHI7CisgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSBudWxsOworICAgICAgICBpbnQgdXNlID0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7CisKKyAgICAgICAgaWYgKGxvY2FsKQorICAgICAgICAgICAgc0F0dHIgPSBuZXcgU2NoZW1hTG9jYWxBdHRyaWJ1dGVJbXBsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc0F0dHIgPSBuZXcgU2NoZW1hR2xvYmFsQXR0cmlidXRlSW1wbChzdGF0ZS5zdHMoKSk7CisgICAgICAgICAgICAoKFNjaGVtYUdsb2JhbEF0dHJpYnV0ZUltcGwpc0F0dHIpLnNldFBhcnNlQ29udGV4dCh4c2RBdHRyLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4c2RBdHRyLmdldFR5cGUoKSAhPSBudWxsIHx8IHhzZEF0dHIuZ2V0U2ltcGxlVHlwZSgpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZSByZWZlcmVuY2UgY2Fubm90IGFsc28gc3BlY2lmeSB0eXBlIiwgWG1sRXJyb3JDb250ZXh0LklOVkFMSURfTkFNRSwgeHNkQXR0cik7CisgICAgICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IGlnbm9yZSB0eXBlLCBzaW1wbGVUeXBlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh4c2RBdHRyLmdldEZvcm0oKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBdHRyaWJ1dGUgcmVmZXJlbmNlIGNhbm5vdCBhbHNvIHNwZWNpZnkgZm9ybSIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZm9ybQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTY2hlbWFHbG9iYWxBdHRyaWJ1dGUgcmVmZXJlbmNlZCA9IHN0YXRlLmZpbmRHbG9iYWxBdHRyaWJ1dGUocmVmLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsKTsKKyAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUubm90Rm91bmRFcnJvcihyZWYsIFhtbEVycm9yQ29udGV4dC5BVFRSSUJVVEVfUkVGX05PVF9GT1VORCwgeHNkQXR0ci54Z2V0UmVmKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgdGhpcyBlbGVtZW50CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFuYW1lID0gcmVmOworICAgICAgICAgICAgdXNlID0gcmVmZXJlbmNlZC5nZXRVc2UoKTsKKyAgICAgICAgICAgIHNUeXBlID0gcmVmZXJlbmNlZC5nZXRUeXBlKCk7CisgICAgICAgICAgICBkZWZ0ZXh0ID0gcmVmZXJlbmNlZC5nZXREZWZhdWx0VGV4dCgpOworICAgICAgICAgICAgaWYgKGRlZnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc0ZpeGVkID0gcmVmZXJlbmNlZC5pc0ZpeGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9jYWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRm9ybUNob2ljZSBmb3JtID0geHNkQXR0ci54Z2V0Rm9ybSgpOworICAgICAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZvcm0gPSBmaW5kQXR0cmlidXRlRm9ybURlZmF1bHQoeHNkQXR0cik7CisgICAgICAgICAgICAgICAgaWYgKGZvcm0gPT0gbnVsbCB8fCBmb3JtLmdldFN0cmluZ1ZhbHVlKCkuZXF1YWxzKCJ1bnF1YWxpZmllZCIpKQorICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOKG5hbWUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBRTmFtZUhlbHBlci5mb3JMTlMobmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxbmFtZSA9IFFOYW1lSGVscGVyLmZvckxOUyhuYW1lLCB0YXJnZXROYW1lc3BhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoeHNkQXR0ci5nZXRUeXBlKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzVHlwZSA9IHN0YXRlLmZpbmRHbG9iYWxUeXBlKHhzZEF0dHIuZ2V0VHlwZSgpLCBjaGFtZWxlb24gPyB0YXJnZXROYW1lc3BhY2UgOiBudWxsICk7CisgICAgICAgICAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vdEZvdW5kRXJyb3IoeHNkQXR0ci5nZXRUeXBlKCksIFhtbEVycm9yQ29udGV4dC5UWVBFX05PVF9GT1VORCwgeHNkQXR0ci54Z2V0VHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiSWxsZWdhbCBuYW1lc3BhY2UgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9OQU1FLCB4c2RBdHRyLnhnZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCAmJiBxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoInhtbG5zIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUuZXJyb3IoIklsbGVnYWwgbmFtZSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9uLiIsIFhtbEVycm9yQ29udGV4dC5JTlZBTElEX05BTUUsIHhzZEF0dHIueGdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFhtbE9iamVjdCB0eXBlZGVmID0geHNkQXR0ci5nZXRTaW1wbGVUeXBlKCk7CisKKyAgICAgICAgICAgIGlmICgoc1R5cGUgIT0gbnVsbCkgJiYgdHlwZWRlZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJJbGxlZ2FsIHRvIGRlZmluZSBhIG5lc3RlZCB0eXBlIHdoZW4gYSB0eXBlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX05FU1RFRF9UWVBFLCB0eXBlZGVmKTsKKyAgICAgICAgICAgICAgICB0eXBlZGVmID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGVkZWYgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlSW1wbCBzVHlwZUltcGwgPSBuZXcgU2NoZW1hVHlwZUltcGwoc3RhdGUuc3RzKCkpOworICAgICAgICAgICAgICAgIHNUeXBlID0gc1R5cGVJbXBsOworICAgICAgICAgICAgICAgIHNUeXBlSW1wbC5zZXRDb250YWluZXJGaWVsZChzQXR0cik7CisgICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldE91dGVyU2NoZW1hVHlwZVJlZihvdXRlclR5cGUgPT0gbnVsbCA/IG51bGwgOiBvdXRlclR5cGUuZ2V0UmVmKCkpOworICAgICAgICAgICAgICAgIC8vIGxlYXZlIHRoZSBhbm9ueW1vdXMgdHlwZSB1bnJlc29sdmVkOiBpdCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyLgorICAgICAgICAgICAgICAgIGFub255bW91c1R5cGVzLmFkZChzVHlwZSk7CisgICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldFNpbXBsZVR5cGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgc1R5cGVJbXBsLnNldFBhcnNlQ29udGV4dCh0eXBlZGVmLCB0YXJnZXROYW1lc3BhY2UsIGNoYW1lbGVvbiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCAmJiBiYXNlTW9kZWwgIT0gbnVsbCAmJiBiYXNlTW9kZWwuZ2V0QXR0cmlidXRlKHFuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNUeXBlID0gYmFzZU1vZGVsLmdldEF0dHJpYnV0ZShxbmFtZSkuZ2V0VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNUeXBlID09IG51bGwpCisgICAgICAgICAgICBzVHlwZSA9IEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0FOWV9TSU1QTEU7CisKKyAgICAgICAgaWYgKCFzVHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuZXJyb3IoIkF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgc2ltcGxlIHR5cGUgKG5vdCBjb21wbGV4KS4iLCBYbWxFcnJvckNvbnRleHQuSU5WQUxJRF9TQ0hFTUEsIHhzZEF0dHIpOworICAgICAgICAgICAgLy8gcmVjb3Zlcnk6IHN3aXRjaCB0byB0aGUgYW55LXR5cGUKKyAgICAgICAgICAgIHNUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXRVc2UoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNlID0gdHJhbnNsYXRlVXNlQ29kZSh4c2RBdHRyLnhnZXRVc2UoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGlnbm9yZSByZWZlcmVuY2VkIGRlZmF1bHQgaWYgbm8gbG9uZ2VyIG9wdGlvbmFsCisgICAgICAgICAgICBpZiAodXNlICE9IFNjaGVtYUxvY2FsQXR0cmlidXRlLk9QVElPTkFMICYmICFpc0ZpeGVkKQorICAgICAgICAgICAgICAgIGRlZnRleHQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoeHNkQXR0ci5pc1NldERlZmF1bHQoKSB8fCB4c2RBdHRyLmlzU2V0Rml4ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzRml4ZWQgJiYgIXhzZEF0dHIuaXNTZXRGaXhlZCgpKQorICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yKCJBIHVzZSBvZiBhIGZpeGVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG11c3QgYWxzbyBiZSBmaXhlZCIsIFhtbEVycm9yQ29udGV4dC5SRURVTkRBTlRfREVGQVVMVF9GSVhFRCwgeHNkQXR0ci54Z2V0Rml4ZWQoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlzRml4ZWQgPSB4c2RBdHRyLmlzU2V0Rml4ZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHhzZEF0dHIuaXNTZXREZWZhdWx0KCkgJiYgaXNGaXhlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvcigiU2hvdWxkIG5vdCBzZXQgYm90aCBkZWZhdWx0IGFuZCBmaXhlZCBvbiB0aGUgc2FtZSBhdHRyaWJ1dGUiLCBYbWxFcnJvckNvbnRleHQuUkVEVU5EQU5UX0RFRkFVTFRfRklYRUQsIHhzZEF0dHIueGdldEZpeGVkKCkpOworICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5OiBpZ25vcmUgZml4ZWQKKyAgICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZ0ZXh0ID0gaXNGaXhlZCA/IHhzZEF0dHIuZ2V0Rml4ZWQoKSA6IHhzZEF0dHIuZ2V0RGVmYXVsdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsb2NhbCkKKyAgICAgICAgeworICAgICAgICAgICAgKChTY2hlbWFHbG9iYWxBdHRyaWJ1dGVJbXBsKXNBdHRyKS5zZXRGaWxlbmFtZShmaW5kRmlsZW5hbWUoeHNkQXR0cikpOworICAgICAgICB9CisKKyAgICAgICAgU09BUEFycmF5VHlwZSB3YXQgPSBudWxsOworICAgICAgICBYbWxDdXJzb3IgYyA9IHhzZEF0dHIubmV3Q3Vyc29yKCk7CisgICAgICAgIFN0cmluZyBhcnJheVR5cGUgPSBjLmdldEF0dHJpYnV0ZVRleHQoV1NETF9BUlJBWVRZUEVfTkFNRSk7CisgICAgICAgIGMuZGlzcG9zZSgpOworICAgICAgICBpZiAoYXJyYXlUeXBlICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhdCA9IG5ldyBTT0FQQXJyYXlUeXBlKGFycmF5VHlwZSwgbmV3IE5hbWVzcGFjZUNvbnRleHQoeHNkQXR0cikpOworICAgICAgICB9CisKKyAgICAgICAgc0F0dHIuaW5pdCgKKyAgICAgICAgICAgIHFuYW1lLAorICAgICAgICAgICAgc1R5cGUuZ2V0UmVmKCksCisgICAgICAgICAgICB1c2UsCisgICAgICAgICAgICBkZWZ0ZXh0LCB4c2RBdHRyLCBudWxsLCBpc0ZpeGVkLAorICAgICAgICAgICAgd2F0KTsKKworICAgICAgICByZXR1cm4gc0F0dHI7CisgICAgfQorCisgICAgc3RhdGljIGludCB0cmFuc2xhdGVVc2VDb2RlKEF0dHJpYnV0ZS5Vc2UgYXR0cnVzZSkKKyAgICB7CisgICAgICAgIGlmIChhdHRydXNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7CisKKyAgICAgICAgU3RyaW5nIHZhbCA9IGF0dHJ1c2UuZ2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbC5lcXVhbHMoIm9wdGlvbmFsIikpCisgICAgICAgICAgICByZXR1cm4gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuT1BUSU9OQUw7CisgICAgICAgIGlmICh2YWwuZXF1YWxzKCJyZXF1aXJlZCIpKQorICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEOworICAgICAgICBpZiAodmFsLmVxdWFscygicHJvaGliaXRlZCIpKQorICAgICAgICAgICAgcmV0dXJuIFNjaGVtYUxvY2FsQXR0cmlidXRlLlBST0hJQklURUQ7CisgICAgICAgIHJldHVybiBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTDsKKyAgICB9CisKKyAgICBzdGF0aWMgQmlnSW50ZWdlciBidWlsZEJpZ0ludChYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICBCaWdJbnRlZ2VyIGJpZ0ludDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJpZ0ludCA9IG5ldyBCaWdJbnRlZ2VyKHRleHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNdXN0IGJlIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmlnSW50LnNpZ251bSgpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RzY1N0YXRlLmdldCgpLmVycm9yKCJNdXN0IGJlIG5vbm5lZ2F0aXZlIGludGVnZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmlnSW50OworICAgIH0KKworCisgICAgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBidWlsZE5uSW50ZWdlcihYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciBiaWdJbnQgPSBidWlsZEJpZ0ludCh2YWx1ZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsIGkgPSBuZXcgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpOworICAgICAgICAgICAgaS5zZXQoYmlnSW50KTsKKyAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyBudW1iZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIGJ1aWxkUG9zSW50ZWdlcihYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciBiaWdJbnQgPSBidWlsZEJpZ0ludCh2YWx1ZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxQb3NpdGl2ZUludGVnZXJJbXBsIGkgPSBuZXcgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbCgpOworICAgICAgICAgICAgaS5zZXQoYmlnSW50KTsKKyAgICAgICAgICAgIGkuc2V0SW1tdXRhYmxlKCk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0c2NTdGF0ZS5nZXQoKS5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyBudW1iZXIiLCBYbWxFcnJvckNvbnRleHQuTUFMRk9STUVEX05VTUJFUiwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmVzZXJ2ZWRUeXBlTmFtZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5nZXQoKS5maW5kVHlwZShuYW1lKSAhPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3NjaGVtYS9YbWxWYWx1ZVJlZi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvWG1sVmFsdWVSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM1NWFkCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zY2hlbWEvWG1sVmFsdWVSZWYuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitwdWJsaWMgY2xhc3MgWG1sVmFsdWVSZWYKK3sKKyAgICBYbWxBbnlTaW1wbGVUeXBlIF9vYmo7CisgICAgU2NoZW1hVHlwZS5SZWYgX3R5cGVyZWY7CisgICAgT2JqZWN0IF9pbml0VmFsOworCisgICAgWG1sVmFsdWVSZWYoWG1sQW55U2ltcGxlVHlwZSB4b2JqKQorICAgIHsKKyAgICAgICAgaWYgKHhvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgX29iaiA9IHhvYmo7CisgICAgfQorCisgICAgWG1sVmFsdWVSZWYoU2NoZW1hVHlwZS5SZWYgdHlwZXJlZiwgT2JqZWN0IGluaXRWYWwpCisgICAgeworICAgICAgICBpZiAodHlwZXJlZiA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBfdHlwZXJlZiA9IHR5cGVyZWY7CisgICAgICAgIF9pbml0VmFsID0gaW5pdFZhbDsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgWG1sQW55U2ltcGxlVHlwZSBnZXQoKQorICAgIHsKKyAgICAgICAgaWYgKF9vYmogPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gX3R5cGVyZWYuZ2V0KCk7CisgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICAgICAgICAgIF9vYmogPSB0eXBlLm5ld1ZhbHVlKF9pbml0VmFsKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0IGFjdHVhbFZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChMaXN0KV9pbml0VmFsKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sVmFsdWVSZWYgcmVmID0gKFhtbFZhbHVlUmVmKWkubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWxzLmFkZChyZWYuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfb2JqID0gdHlwZS5uZXdWYWx1ZShhY3R1YWxWYWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX29iajsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvQmFzZTY0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyOWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9CYXNlNjQuamF2YQpAQCAtMCwwICsxLDM2MSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZW5jb2RlL2RlY29kZSBmb3IgUkZDIDIwNDUgQmFzZTY0IGFzCisgKiBkZWZpbmVkIGJ5IFJGQyAyMDQ1LCBOLiBGcmVlZCBhbmQgTi4gQm9yZW5zdGVpbi4KKyAqIFJGQyAyMDQ1OiBNdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKQorICogUGFydCBPbmU6IEZvcm1hdCBvZiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllcy4gUmVmZXJlbmNlCisgKiAxOTk2IEF2YWlsYWJsZSBhdDogaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBYTUwgU2NoZW1hIGJpbmFyeSBmb3JtYXQgdmFsaWRhdGlvbgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgZW5jb2RlL2RlY29kZSBzdHJlYW1pbmcKKyAqIGRhdGEuIFlvdSBuZWVkIHRoZSBkYXRhIHRoYXQgeW91IHdpbGwgZW5jb2RlL2RlY29kZQorICogYWxyZWFkeSBvbiBhIGJ5dGUgYXJycmF5LgorICoKKyAqIEBhdXRob3IgSmVmZnJleSBSb2RyaWd1ZXoKKyAqIEBhdXRob3IgU2FuZHkgR2FvCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyAgQmFzZTY0IHsKKworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgQkFTRUxFTkdUSCAgICAgICAgID0gMjU1OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgTE9PS1VQTEVOR1RIICAgICAgID0gNjQ7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBUV0VOVFlGT1VSQklUR1JPVVAgPSAyNDsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEVJR0hUQklUICAgICAgICAgICA9IDg7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSVhURUVOQklUICAgICAgICAgPSAxNjsKKyAgICAvL3N0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lYQklUICAgICAgICAgICAgID0gNjsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEZPVVJCWVRFICAgICAgICAgICA9IDQ7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSUdOICAgICAgICAgICAgICAgPSAtMTI4OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgUEFEICAgICAgICAgICAgICAgID0gKCBieXRlICkgJz0nOworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZkRlYnVnICAgICAgICAgID0gZmFsc2U7CisgICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBiYXNlNjRBbHBoYWJldCAgICAgICAgPSBuZXcgYnl0ZVtCQVNFTEVOR1RIXTsKKyAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGxvb2tVcEJhc2U2NEFscGhhYmV0ICA9IG5ldyBieXRlW0xPT0tVUExFTkdUSF07CisKKyAgICBzdGF0aWMgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPEJBU0VMRU5HVEg7IGkrKykgeworICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gJ1onOyBpID49ICdBJzsgaS0tKSB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaS0nQScpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAneic7IGk+PSAnYSc7IGktLSkgeworICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCBpLSdhJyArIDI2KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAnOSc7IGkgPj0gJzAnOyBpLS0pIHsKKyAgICAgICAgICAgIGJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpIChpLScwJyArIDUyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2U2NEFscGhhYmV0WycrJ10gID0gNjI7CisgICAgICAgIGJhc2U2NEFscGhhYmV0WycvJ10gID0gNjM7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8PTI1OyBpKyspCisgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJ0EnK2kgKTsKKworICAgICAgICBmb3IgKGludCBpID0gMjYsICBqID0gMDsgaTw9NTE7IGkrKywgaisrKQorICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCdhJysgaiApOworCisgICAgICAgIGZvciAoaW50IGkgPSA1MiwgIGogPSAwOyBpPD02MTsgaSsrLCBqKyspCisgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJzAnICsgaiApOworICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2Ml0gPSAoYnl0ZSkgJysnOworICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFs2M10gPSAoYnl0ZSkgJy8nOworCisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzV2hpdGVTcGFjZShieXRlIG9jdGVjdCkgeworICAgICAgICByZXR1cm4gKG9jdGVjdCA9PSAweDIwIHx8IG9jdGVjdCA9PSAweGQgfHwgb2N0ZWN0ID09IDB4YSB8fCBvY3RlY3QgPT0gMHg5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNQYWQoYnl0ZSBvY3RlY3QpIHsKKyAgICAgICAgcmV0dXJuIChvY3RlY3QgPT0gUEFEKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNEYXRhKGJ5dGUgb2N0ZWN0KSB7CisgICAgICAgIHJldHVybiAoYmFzZTY0QWxwaGFiZXRbb2N0ZWN0XSAhPSAtMSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQmFzZTY0KGJ5dGUgb2N0ZWN0KSB7CisgICAgICAgIHJldHVybiAoaXNXaGl0ZVNwYWNlKG9jdGVjdCkgfHwgaXNQYWQob2N0ZWN0KSB8fCBpc0RhdGEob2N0ZWN0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBoZXggb2N0ZWN0cyBpbnRvIEJhc2U2NAorICAgICAqCisgICAgICogQHBhcmFtIGJpbmFyeURhdGEgQXJyYXkgY29udGFpbmluZyBiaW5hcnlEYXRhCisgICAgICogQHJldHVybiBFbmNvZGVkIEJhc2U2NCBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShieXRlW10gYmluYXJ5RGF0YSkgeworCisgICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgICAgICBsZW5ndGhEYXRhQml0cyAgICA9IGJpbmFyeURhdGEubGVuZ3RoKkVJR0hUQklUOworICAgICAgICBpbnQgICAgICBmZXdlclRoYW4yNGJpdHMgICA9IGxlbmd0aERhdGFCaXRzJVRXRU5UWUZPVVJCSVRHUk9VUDsKKyAgICAgICAgaW50ICAgICAgbnVtYmVyVHJpcGxldHMgICAgPSBsZW5ndGhEYXRhQml0cy9UV0VOVFlGT1VSQklUR1JPVVA7CisgICAgICAgIGJ5dGUgICAgIGVuY29kZWREYXRhW10gICAgID0gbnVsbDsKKworICAgICAgICBpZiAoZmV3ZXJUaGFuMjRiaXRzICE9IDApIC8vZGF0YSBub3QgZGl2aXNpYmxlIGJ5IDI0IGJpdAorICAgICAgICAgICAgZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVsgKG51bWJlclRyaXBsZXRzICsgMSApKjQgIF07CisgICAgICAgIGVsc2UgLy8gMTYgb3IgOCBiaXQKKyAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbIG51bWJlclRyaXBsZXRzKjQgXTsKKworICAgICAgICBieXRlIGs9MCwgbD0wLCBiMT0wLGIyPTAsYjM9MDsKKworICAgICAgICBpbnQgZW5jb2RlZEluZGV4ID0gMDsKKyAgICAgICAgaW50IGRhdGFJbmRleCAgID0gMDsKKyAgICAgICAgaW50IGkgICAgICAgICAgID0gMDsKKyAgICAgICAgaWYgKGZEZWJ1ZykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJudW1iZXIgb2YgdHJpcGxldHMgPSAiICsgbnVtYmVyVHJpcGxldHMgKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpPG51bWJlclRyaXBsZXRzOyBpKyspIHsKKworICAgICAgICAgICAgZGF0YUluZGV4ID0gaSozOworICAgICAgICAgICAgYjEgPSBiaW5hcnlEYXRhW2RhdGFJbmRleF07CisgICAgICAgICAgICBiMiA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMV07CisgICAgICAgICAgICBiMyA9IGJpbmFyeURhdGFbZGF0YUluZGV4ICsgMl07CisKKyAgICAgICAgICAgIGlmIChmRGVidWcpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiMT0gIiArIGIxICsiLCBiMj0gIiArIGIyICsgIiwgYjM9ICIgKyBiMyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsICA9IChieXRlKShiMiAmIDB4MGYpOworICAgICAgICAgICAgayAgPSAoYnl0ZSkoYjEgJiAweDAzKTsKKworICAgICAgICAgICAgZW5jb2RlZEluZGV4ID0gaSo0OworICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pPT0wKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOworCisgICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTik9PTApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7CisgICAgICAgICAgICBieXRlIHZhbDMgPSAoKGIzICYgU0lHTik9PTApPyhieXRlKShiMz4+Nik6KGJ5dGUpKChiMyk+PjZeMHhmYyk7CisKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07CisgICAgICAgICAgICBpZiAoZkRlYnVnKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAidmFsMiA9ICIgKyB2YWwyICk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiazQgICA9ICIgKyAoazw8NCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInZhayAgPSAiICsgKHZhbDIgfCAoazw8NCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4KzFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDIgfCAoIGs8PDQgKV07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrMl0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgKGwgPDwyICkgfCB2YWwzIF07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrM10gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgYjMgJiAweDNmIF07CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JtIGludGVncmFsIG51bWJlciBvZiA2LWJpdCBncm91cHMKKyAgICAgICAgZGF0YUluZGV4ICAgID0gaSozOworICAgICAgICBlbmNvZGVkSW5kZXggPSBpKjQ7CisgICAgICAgIGlmIChmZXdlclRoYW4yNGJpdHMgPT0gRUlHSFRCSVQpIHsKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOworICAgICAgICAgICAgayA9IChieXRlKSAoIGIxICYweDAzICk7CisgICAgICAgICAgICBpZiAoZkRlYnVnKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiMT0iICsgYjEpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYjE8PDIgPSAiICsgKGIxPj4yKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZSB2YWwxID0gKChiMSAmIFNJR04pPT0wKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgICAgPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMSBdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMV0gPSBsb29rVXBCYXNlNjRBbHBoYWJldFsgazw8NCBdOworICAgICAgICAgICAgZW5jb2RlZERhdGFbZW5jb2RlZEluZGV4ICsgMl0gPSBQQUQ7CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAzXSA9IFBBRDsKKyAgICAgICAgfSBlbHNlIGlmIChmZXdlclRoYW4yNGJpdHMgPT0gU0lYVEVFTkJJVCkgeworCisgICAgICAgICAgICBiMSA9IGJpbmFyeURhdGFbZGF0YUluZGV4XTsKKyAgICAgICAgICAgIGIyID0gYmluYXJ5RGF0YVtkYXRhSW5kZXggKzEgXTsKKyAgICAgICAgICAgIGwgPSAoIGJ5dGUgKSAoIGIyICYweDBmICk7CisgICAgICAgICAgICBrID0gKCBieXRlICkgKCBiMSAmMHgwMyApOworCisgICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7CisgICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTik9PTApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7CisKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDIgfCAoIGs8PDQgKV07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAyXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBsPDwyIF07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAzXSA9IFBBRDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbmNvZGVkRGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIEJhc2U2NCBkYXRhIGludG8gb2N0ZWN0cworICAgICAqCisgICAgICogQHBhcmFtIGJhc2U2NERhdGEgQnl0ZSBhcnJheSBjb250YWluaW5nIEJhc2U2NCBkYXRhCisgICAgICogQHJldHVybiBBcnJheSBjb250YWluaW5kIGRlY29kZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIGJhc2U2NERhdGEpIHsKKworICAgICAgICBpZiAoYmFzZTY0RGF0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gcmVtb3ZlIHdoaXRlIHNwYWNlcworICAgICAgICBiYXNlNjREYXRhID0gcmVtb3ZlV2hpdGVTcGFjZShiYXNlNjREYXRhKTsKKworICAgICAgICBpZiAoYmFzZTY0RGF0YS5sZW5ndGglRk9VUkJZVEUgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9zaG91bGQgYmUgZGl2aXNpYmxlIGJ5IGZvdXIKKyAgICAgICAgfQorCisgICAgICAgIGludCAgICAgIG51bWJlclF1YWRydXBsZSAgICA9IChiYXNlNjREYXRhLmxlbmd0aC9GT1VSQllURSApOworCisgICAgICAgIGlmIChudW1iZXJRdWFkcnVwbGUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKworICAgICAgICBieXRlICAgICBkZWNvZGVkRGF0YVtdICAgICAgPSBudWxsOworICAgICAgICBieXRlICAgICBiMT0wLGIyPTAsYjM9MCwgYjQ9MDsvLywgbWFya2VyMD0wLCBtYXJrZXIxPTA7CisgICAgICAgIGJ5dGUgICAgIGQxPTAsZDI9MCxkMz0wLGQ0PTA7CisKKyAgICAgICAgLy8gVGhyb3cgYXdheSBhbnl0aGluZyBub3QgaW4gbm9ybWFsaXplZEJhc2U2NERhdGEKKyAgICAgICAgLy8gQWRqdXN0IHNpemUKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgZW5jb2RlZEluZGV4ID0gMDsKKyAgICAgICAgaW50IGRhdGFJbmRleCAgICA9IDA7CisgICAgICAgIGRlY29kZWREYXRhICAgICAgPSBuZXcgYnl0ZVsgKG51bWJlclF1YWRydXBsZSkqM107CisKKyAgICAgICAgZm9yICg7IGk8bnVtYmVyUXVhZHJ1cGxlLTE7IGkrKykgeworCisgICAgICAgICAgICBpZiAoIWlzRGF0YSggKGQxID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICl8fAorICAgICAgICAgICAgICAgICFpc0RhdGEoIChkMiA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApfHwKKyAgICAgICAgICAgICAgICAhaXNEYXRhKCAoZDMgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXSkgKXx8CisgICAgICAgICAgICAgICAgIWlzRGF0YSggKGQ0ID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9pZiBmb3VuZCAibm8gZGF0YSIganVzdCByZXR1cm4gbnVsbAorCisgICAgICAgICAgICBiMSA9IGJhc2U2NEFscGhhYmV0W2QxXTsKKyAgICAgICAgICAgIGIyID0gYmFzZTY0QWxwaGFiZXRbZDJdOworICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFtkM107CisgICAgICAgICAgICBiNCA9IGJhc2U2NEFscGhhYmV0W2Q0XTsKKworICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKSA7CisgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApOworICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCBiMzw8NiB8IGI0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRGF0YSggKGQxID0gYmFzZTY0RGF0YVtkYXRhSW5kZXgrK10pICkgfHwKKyAgICAgICAgICAgICFpc0RhdGEoIChkMiA9IGJhc2U2NERhdGFbZGF0YUluZGV4KytdKSApKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsvL2lmIGZvdW5kICJubyBkYXRhIiBqdXN0IHJldHVybiBudWxsCisgICAgICAgIH0KKworICAgICAgICBiMSA9IGJhc2U2NEFscGhhYmV0W2QxXTsKKyAgICAgICAgYjIgPSBiYXNlNjRBbHBoYWJldFtkMl07CisKKyAgICAgICAgZDMgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXTsKKyAgICAgICAgZDQgPSBiYXNlNjREYXRhW2RhdGFJbmRleCsrXTsKKyAgICAgICAgaWYgKCFpc0RhdGEoIChkMyApICkgfHwKKyAgICAgICAgICAgICFpc0RhdGEoIChkNCApICkpIHsvL0NoZWNrIGlmIHRoZXkgYXJlIFBBRCBjaGFyYWN0ZXJzCisgICAgICAgICAgICBpZiAoaXNQYWQoIGQzICkgJiYgaXNQYWQoIGQ0KSkgeyAgICAgICAgICAgICAgIC8vVHdvIFBBRCBlLmcuIDNjW1BhZF1bUGFkXQorICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweGYpICE9IDApLy9sYXN0IDQgYml0cyBzaG91bGQgYmUgemVybworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbIGkqMyArIDEgXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBkZWNvZGVkRGF0YSwgMCwgdG1wLCAwLCBpKjMgKTsKKyAgICAgICAgICAgICAgICB0bXBbZW5jb2RlZEluZGV4XSAgID0gKGJ5dGUpKCAgYjEgPDwyIHwgYjI+PjQgKSA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGFkKCBkMykgJiYgaXNQYWQoZDQpKSB7ICAgICAgICAgICAgICAgLy9PbmUgUEFEICBlLmcuIDNjUVtQYWRdCisgICAgICAgICAgICAgICAgYjMgPSBiYXNlNjRBbHBoYWJldFsgZDMgXTsKKyAgICAgICAgICAgICAgICBpZiAoKGIzICYgMHgzICkgIT0gMCkvL2xhc3QgMiBiaXRzIHNob3VsZCBiZSB6ZXJvCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVsgaSozICsgMiBdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGRlY29kZWREYXRhLCAwLCB0bXAsIDAsIGkqMyApOworICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXgrK10gPSAoYnl0ZSkoICBiMSA8PDIgfCBiMj4+NCApOworICAgICAgICAgICAgICAgIHRtcFtlbmNvZGVkSW5kZXhdICAgPSAoYnl0ZSkoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApOworICAgICAgICAgICAgICAgIHJldHVybiB0bXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOy8vYW4gZXJyb3IgIGxpa2UgIjNjW1BhZF1yIiwgIjNjZFgiLCAiM2NYZCIsICIzY1hYIiB3aGVyZSBYIGlzIG5vbiBkYXRhCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vTm8gUEFEIGUuZyAzY1FsCisgICAgICAgICAgICBiMyA9IGJhc2U2NEFscGhhYmV0WyBkMyBdOworICAgICAgICAgICAgYjQgPSBiYXNlNjRBbHBoYWJldFsgZDQgXTsKKyAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggIGIxIDw8MiB8IGIyPj40ICkgOworICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4KytdID0gKGJ5dGUpKCgoYjIgJiAweGYpPDw0ICkgfCggKGIzPj4yKSAmIDB4ZikgKTsKKyAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCsrXSA9IChieXRlKSggYjM8PDYgfCBiNCApOworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBCYXNlNjQgZGF0YSBpbnRvIG9jdGVjdHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlNjREYXRhIFN0cmluZyBjb250YWluaW5nIEJhc2U2NCBkYXRhCisgICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBiYXNlNjREYXRhKSB7CisgICAgICAgIGlmIChiYXNlNjREYXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBieXRlW10gZGVjb2RlZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWNvZGVkID0gZGVjb2RlKGJhc2U2NERhdGEuZ2V0Qnl0ZXMoInV0Zi04IikpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGRlY29kZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBvY3RlY3RzICh1c2luZyB1dGYtOCkgaW50byBCYXNlNjQgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIGJpbmFyeURhdGEgU3RyaW5nIGNvbnRhaW5pbmcgSGV4IGRhdGEKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIGJpbmFyeURhdGEpIHsKKyAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gbnVsbDsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZShiaW5hcnlEYXRhLmdldEJ5dGVzKCJ1dGYtOCIpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcmV0dXJuIGVuY29kZWQgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGVuY29kZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogcmVtb3ZlIFdoaXRlU3BhY2UgZnJvbSBNSU1FIGNvbnRhaW5pbmcgZW5jb2RlZCBCYXNlNjQgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhICB0aGUgYnl0ZSBhcnJheSBvZiBiYXNlNjQgZGF0YSAod2l0aCBXUykKKyAgICAgKiBAcmV0dXJuICAgICAgdGhlIGJ5dGUgYXJyYXkgb2YgYmFzZTY0IGRhdGEgKHdpdGhvdXQgV1MpCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gcmVtb3ZlV2hpdGVTcGFjZShieXRlW10gZGF0YSkgeworICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gY291bnQgY2hhcmFjdGVycyB0aGF0J3Mgbm90IHdoaXRlc3BhY2UKKyAgICAgICAgaW50IG5ld1NpemUgPSAwOworICAgICAgICBpbnQgbGVuID0gZGF0YS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGRhdGFbaV0pKQorICAgICAgICAgICAgICAgIG5ld1NpemUrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIG5vIHdoaXRlc3BhY2UsIGp1c3QgcmV0dXJuIHRoZSBpbnB1dCBhcnJheQorICAgICAgICBpZiAobmV3U2l6ZSA9PSBsZW4pCisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKworICAgICAgICAvLyBjcmVhdGUgdGhlIGFycmF5IHRvIHJldHVybgorICAgICAgICBieXRlW10gbmV3QXJyYXkgPSBuZXcgYnl0ZVtuZXdTaXplXTsKKworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGRhdGFbaV0pKQorICAgICAgICAgICAgICAgIG5ld0FycmF5W2orK10gPSBkYXRhW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdBcnJheTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvSGV4QmluLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3V0aWwvSGV4QmluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdXRpbC9IZXhCaW4uamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisvKioKKyAqIGZvcm1hdCB2YWxpZGF0aW9uCisgKgorICogVGhpcyBjbGFzcyBlbmNvZGVzL2RlY29kZXMgaGV4YWRlY2ltYWwgZGF0YQorICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgIEhleEJpbiB7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBCQVNFTEVOR1RIICAgPSAyNTU7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBMT09LVVBMRU5HVEggPSAxNjsKKyAgICBzdGF0aWMgcHJpdmF0ZSBieXRlIFtdIGhleE51bWJlclRhYmxlICAgID0gbmV3IGJ5dGVbQkFTRUxFTkdUSF07CisgICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBsb29rVXBIZXhBbHBoYWJldCA9IG5ldyBieXRlW0xPT0tVUExFTkdUSF07CisKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPEJBU0VMRU5HVEg7IGkrKyApIHsKKyAgICAgICAgICAgIGhleE51bWJlclRhYmxlW2ldID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaW50IGkgPSAnOSc7IGkgPj0gJzAnOyBpLS0pIHsKKyAgICAgICAgICAgIGhleE51bWJlclRhYmxlW2ldID0gKGJ5dGUpIChpLScwJyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaW50IGkgPSAnRic7IGk+PSAnQSc7IGktLSkgeworICAgICAgICAgICAgaGV4TnVtYmVyVGFibGVbaV0gPSAoYnl0ZSkgKCBpLSdBJyArIDEwICk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaW50IGkgPSAnZic7IGk+PSAnYSc7IGktLSkgeworICAgICAgICAgICBoZXhOdW1iZXJUYWJsZVtpXSA9IChieXRlKSAoIGktJ2EnICsgMTAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGk8MTA7IGkrKyApCisgICAgICAgICAgICBsb29rVXBIZXhBbHBoYWJldFtpXSA9IChieXRlKSAoJzAnK2kgKTsKKyAgICAgICAgZm9yKGludCBpID0gMTA7IGk8PTE1OyBpKysgKQorICAgICAgICAgICAgbG9va1VwSGV4QWxwaGFiZXRbaV0gPSAoYnl0ZSkgKCdBJytpIC0xMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYnl0ZSB0byBiZSB0ZXN0ZWQgaWYgaXQgaXMgQmFzZTY0IGFscGhhYmV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2N0ZWN0CisgICAgICogQHJldHVybgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGlzSGV4KGJ5dGUgb2N0ZWN0KSB7CisgICAgICAgIHJldHVybiAoaGV4TnVtYmVyVGFibGVbb2N0ZWN0XSAhPSAtMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYnl0ZXMgdG8gYSBoZXggc3RyaW5nCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgYnl0ZXNUb1N0cmluZyhieXRlW10gYmluYXJ5RGF0YSkKKyAgICB7CisgICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZW5jb2RlKGJpbmFyeURhdGEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYSBieXRlIGFycmF5LgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgYnl0ZVtdIHN0cmluZ1RvQnl0ZXMoU3RyaW5nIGhleEVuY29kZWQpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb2RlKGhleEVuY29kZWQuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXJyYXkgb2YgYnl0ZSB0byBlbmNvZGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhCisgICAgICogQHJldHVybiByZXR1cm4gZW5jb2RlIGJpbmFyeSBhcnJheQorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgYnl0ZVtdIGVuY29kZShieXRlW10gYmluYXJ5RGF0YSkgeworICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGludCBsZW5ndGhEYXRhICAgPSBiaW5hcnlEYXRhLmxlbmd0aDsKKyAgICAgICAgaW50IGxlbmd0aEVuY29kZSA9IGxlbmd0aERhdGEgKiAyOworICAgICAgICBieXRlW10gZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVtsZW5ndGhFbmNvZGVdOworICAgICAgICBmb3IoIGludCBpID0gMDsgaTxsZW5ndGhEYXRhOyBpKysgKXsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2kqMl0gPSBsb29rVXBIZXhBbHBoYWJldFsoYmluYXJ5RGF0YVtpXSA+PiA0KSAmIDB4Zl07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtpKjIrMV0gPSBsb29rVXBIZXhBbHBoYWJldFsgYmluYXJ5RGF0YVtpXSAmIDB4Zl07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVuY29kZWREYXRhOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgYnl0ZVtdIGRlY29kZShieXRlW10gYmluYXJ5RGF0YSkgeworICAgICAgICBpZiAoYmluYXJ5RGF0YSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGludCBsZW5ndGhEYXRhICAgPSBiaW5hcnlEYXRhLmxlbmd0aDsKKyAgICAgICAgaWYgKGxlbmd0aERhdGEgJSAyICE9IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgbGVuZ3RoRGVjb2RlID0gbGVuZ3RoRGF0YSAvIDI7CisgICAgICAgIGJ5dGVbXSBkZWNvZGVkRGF0YSA9IG5ldyBieXRlW2xlbmd0aERlY29kZV07CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpPGxlbmd0aERlY29kZTsgaSsrICl7CisgICAgICAgICAgICBpZiAoIWlzSGV4KGJpbmFyeURhdGFbaSoyXSkgfHwgIWlzSGV4KGJpbmFyeURhdGFbaSoyKzFdKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVjb2RlZERhdGFbaV0gPSAoYnl0ZSkoKGhleE51bWJlclRhYmxlW2JpbmFyeURhdGFbaSoyXV0gPDwgNCkgfCBoZXhOdW1iZXJUYWJsZVtiaW5hcnlEYXRhW2kqMisxXV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWNvZGVkRGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIEhleCBkYXRhIGludG8gb2N0ZWN0cworICAgICAqCisgICAgICogQHBhcmFtIGJpbmFyeURhdGEgU3RyaW5nIGNvbnRhaW5pbmcgSGV4IGRhdGEKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIGJpbmFyeURhdGEpIHsKKyAgICAgICAgaWYgKGJpbmFyeURhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSBkZWNvZGVkID0gbnVsbDsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgZGVjb2RlZCA9IGRlY29kZShiaW5hcnlEYXRhLmdldEJ5dGVzKCJ1dGYtOCIpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIHJldHVybiBkZWNvZGVkID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhkZWNvZGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgb2N0ZWN0cyAodXNpbmcgdXRmLTgpIGludG8gSGV4IGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIFN0cmluZyBjb250YWluaW5nIEhleCBkYXRhCisgICAgICogQHJldHVybiBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBiaW5hcnlEYXRhKSB7CisgICAgICAgIGlmIChiaW5hcnlEYXRhID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBieXRlW10gZW5jb2RlZCA9IG51bGw7CisgICAgICAgICB0cnkgeworICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGUoYmluYXJ5RGF0YS5nZXRCeXRlcygidXRmLTgiKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7fQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVkID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZyhlbmNvZGVkKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbGlkYXRvci9WYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlhYzNhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWxpZGF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkNoYXJzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdlbmVyaWNYbWxJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyLkV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxXaGl0ZXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitwdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtCisgICAgZXh0ZW5kcyBHZW5lcmljWG1sSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBFdmVudAoreworICAgIHB1YmxpYyBWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKAorICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMsCisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgdHlwZUxvYWRlciwgU2NoZW1hVHlwZSBzVHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIF9zb3VyY2UgPSB4aXM7CisKKyAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgcm9vdCB0eXBlCisKKyAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKKyAgICAgICAgCisgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IChTY2hlbWFUeXBlKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5ET0NVTUVOVF9UWVBFICk7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHR5cGUgPSBzVHlwZTsKKworICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1RZUEU7CisKKyAgICAgICAgICAgIHhpcyA9IHhpcy5nZXRTdWJTdHJlYW0oKTsKKworICAgICAgICAgICAgaWYgKHhpcy5za2lwKCBYTUxFdmVudC5TVEFSVF9FTEVNRU5UICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBkb2NUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgdHlwZUxvYWRlci5maW5kRG9jdW1lbnRUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggeGlzLm5leHQoKS5nZXROYW1lKCkgKSApOworCisgICAgICAgICAgICAgICAgaWYgKGRvY1R5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGRvY1R5cGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHhpcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSB2YWxpZGF0b3IKKworICAgICAgICBfdmFsaWRhdG9yID0KKyAgICAgICAgICAgIG5ldyBWYWxpZGF0b3IoCisgICAgICAgICAgICAgICAgdHlwZSwgbnVsbCwgdHlwZUxvYWRlciwgb3B0aW9ucywgbmV3IEV4Y2VwdGlvblhtbEVycm9yTGlzdGVuZXIoKSApOworCisgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4gKTsKKyAgICB9CisKKyAgICAvLyBUT0RPIC0gdGhpcyBpcyB0aGUgcXVpY2sgYW5kIGRpcnR5IGltcGwgb2Ygc3RyZWFtaW5nIHZhbGlkYXRpb24sCisgICAgLy8gbWF5IG9iamVjdHMgYXJlIGNyZWF0ZWQgKGxpa2Ugc3RyaW5ncykgd2hpY2ggY2FuIGJlIG9wdGltaXplZAorICAgIAorICAgIHByb3RlY3RlZCBYTUxFdmVudCBuZXh0RXZlbnQgKCApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhNTEV2ZW50IGUgPSBfc291cmNlLm5leHQoKTsKKworICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9maW5pc2hlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbHVzaFRleHQoKTsKKyAgICAgICAgICAgICAgICBuZXh0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCApOworICAgICAgICAgICAgICAgIF9maW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCBlLmdldFR5cGUoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBIDoKKyAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1BBQ0UgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoYXJhY3RlckRhdGEgY2QgPSAoQ2hhcmFjdGVyRGF0YSkgZTsKKworICAgICAgICAgICAgICAgIGlmIChjZC5oYXNDb250ZW50KCkpCisgICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggY2QuZ2V0Q29udGVudCgpICk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhcnRFbGVtZW50IHNlID0gKFN0YXJ0RWxlbWVudCkgZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmbHVzaFRleHQoKTsKKworICAgICAgICAgICAgICAgIC8vIFVzZWQgZm9yIHByZWZpeCB0byBuYW1lc3BhY2UgbWFwcGluZworICAgICAgICAgICAgICAgIF9zdGFydEVsZW1lbnQgPSBzZTsKKworICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHhzaToqIHZhbHVlcworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yIGF0dHJzID0gc2UuZ2V0QXR0cmlidXRlcygpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCBhdHRycy5oYXNOZXh0KCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhdHRycy5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgWE1MTmFtZSBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhdHRyTmFtZS5nZXRMb2NhbE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaVR5cGUgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJuaWwiICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5pbCA9IGF0dHIuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lMb2MgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94c2lOb0xvYyA9IGF0dHIuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIFNUQVJUCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGRlbGF5IHRoZSBhcXVpc2l0aW9uIG9mIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgX25hbWUgPSBlLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQkVHSU4gKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbWl0IHRoZSBhdHRycworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF0dHJzID0gc2UuZ2V0QXR0cmlidXRlcygpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCBhdHRycy5oYXNOZXh0KCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhdHRycy5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgWE1MTmFtZSBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZS5nZXROYW1lc3BhY2VVcmkoKSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBhdHRyTmFtZS5nZXRMb2NhbE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJuaWwiICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbC5lcXVhbHMoICJzY2hlbWFMb2NhdGlvbiIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gR29kLCB0aGlzIGlzIGxhbWUgOi0pCisKKyAgICAgICAgICAgICAgICAgICAgX3RleHQuYXBwZW5kKCBhdHRyLmdldFZhbHVlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBhdHRyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsZWFyVGV4dCgpOworCisgICAgICAgICAgICAgICAgX3N0YXJ0RWxlbWVudCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmx1c2hUZXh0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQgKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dCAoICkKKyAgICB7CisgICAgICAgIF90ZXh0LmRlbGV0ZSggMCwgX3RleHQubGVuZ3RoKCkgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGZsdXNoVGV4dCAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5URVhUICk7CisgICAgICAgICAgICBjbGVhclRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZUZvclByZWZpeCAoIFN0cmluZyBwcmVmaXggKQorICAgIHsKKyAgICAgICAgaWYgKF9zdGFydEVsZW1lbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIE1hcCBtYXAgPSBfc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpOworCisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiAoU3RyaW5nKSBtYXAuZ2V0KCBwcmVmaXggKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldExvY2F0aW9uQXNDdXJzb3IgKCApCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpVHlwZSAoIENoYXJzIGNoYXJzICkKKyAgICB7CisgICAgICAgIGlmIChfeHNpVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lUeXBlOworICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lOaWwgKCBDaGFycyBjaGFycyApCisgICAgeworICAgICAgICBpZiAoX3hzaU5pbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lOaWw7CisgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTG9jICggQ2hhcnMgY2hhcnMgKQorICAgIHsKKyAgICAgICAgaWYgKF94c2lMb2MgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjaGFycy5zdHJpbmcgPSBfeHNpTG9jOworICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKQorICAgIHsKKyAgICAgICAgaWYgKF94c2lOb0xvYyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNoYXJzLnN0cmluZyA9IF94c2lOb0xvYzsKKyAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCBfbmFtZSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycyApCisgICAgeworICAgICAgICBjaGFycy5zdHJpbmcgPSBfdGV4dC50b1N0cmluZygpOworICAgICAgICBjaGFycy5idWZmZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycywgaW50IHdzciApCisgICAgeworICAgICAgICBjaGFycy5zdHJpbmcgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKCBfdGV4dC50b1N0cmluZygpLCB3c3IgKTsKKyAgICAgICAgY2hhcnMuYnVmZmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBUT0RPIC0gdmVyeSBleHBlbnNpdmUgdG8gZ2V0IGEgc3RyaW5nIGhlcmUKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZXh0SXNXaGl0ZXNwYWNlICggKQorICAgIHsKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IF90ZXh0Lmxlbmd0aCgpIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggX3RleHQuY2hhckF0KCBpICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEV4Y2VwdGlvblhtbEVycm9yTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IFZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbS50aGlzLl9leGNlcHRpb24gPT0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVmFsaWRhdGluZ1hNTElucHV0U3RyZWFtLnRoaXMuX2V4Y2VwdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uKCAoWG1sRXJyb3IpbyApOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV4dEV2ZW50ICggaW50IGtpbmQgKQorICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgX2V4Y2VwdGlvbiA9PSBudWxsOworICAgICAgICAKKyAgICAgICAgX3ZhbGlkYXRvci5uZXh0RXZlbnQoIGtpbmQsIHRoaXMgKTsKKworICAgICAgICBpZiAoX2V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgX2V4Y2VwdGlvbjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uIF9leGNlcHRpb247CisKKyAgICBwcml2YXRlIFhNTElucHV0U3RyZWFtIF9zb3VyY2U7CisgICAgcHJpdmF0ZSBWYWxpZGF0b3IgICAgICBfdmFsaWRhdG9yOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyICAgX3RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICBfZmluaXNoZWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpVHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgICAgIF94c2lOaWw7CisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICBfeHNpTG9jOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgX3hzaU5vTG9jOworICAgIHByaXZhdGUgWE1MTmFtZSAgICAgICAgX25hbWU7CisgICAgcHJpdmF0ZSBTdGFydEVsZW1lbnQgICBfc3RhcnRFbGVtZW50OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWxpZGF0b3IvVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ZGY0OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTczMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uQ2hhcnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JZGVudGl0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdG9yTGlzdGVuZXIuRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbFdoaXRlc3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhVXJpSG9sZGVyRXg7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQmFzZTY0SG9sZGVyRXg7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlckV4OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRGF0ZUltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhRGVjaW1hbEhvbGRlckV4OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YURvdWJsZUhvbGRlckV4OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sRHVyYXRpb25JbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YUZsb2F0SG9sZGVyRXg7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhSGV4QmluYXJ5SG9sZGVyRXg7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5KYXZhQm9vbGVhbkhvbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFFOYW1lSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLkphdmFRTmFtZUhvbGRlckV4OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXg7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxMaXN0SW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUF0dHJpYnV0ZU1vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFMb2NhbEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUxvY2FsRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUdsb2JhbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0b3IKKyAgICBpbXBsZW1lbnRzIFZhbGlkYXRvckxpc3RlbmVyCit7CisgICAgcHVibGljIFZhbGlkYXRvciAoCisgICAgICAgIFNjaGVtYVR5cGUgdHlwZSwgU2NoZW1hRmllbGQgZmllbGQsIFNjaGVtYVR5cGVMb2FkZXIgZ2xvYmFsTG9hZGVyLAorICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMsIENvbGxlY3Rpb24gZGVmYXVsdEVycm9yTGlzdGVuZXIgKQorICAgIHsKKyAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwob3B0aW9ucyk7CisgICAgICAgIF9lcnJvckxpc3RlbmVyID0gKENvbGxlY3Rpb24pIG9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuRVJST1JfTElTVEVORVIpOworCisgICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciA9PSBudWxsKQorICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIgPSBkZWZhdWx0RXJyb3JMaXN0ZW5lcjsKKworICAgICAgICBfY29uc3RyYWludEVuZ2luZSA9IG5ldyBJZGVudGl0eUNvbnN0cmFpbnQoX2Vycm9yTGlzdGVuZXIsIHR5cGUuaXNEb2N1bWVudFR5cGUoKSk7CisKKyAgICAgICAgX2dsb2JhbFR5cGVzID0gZ2xvYmFsTG9hZGVyOworICAgICAgICBfY2hhcnMgPSBuZXcgQ2hhcnMoKTsKKyAgICAgICAgX3Jvb3RUeXBlID0gdHlwZTsKKyAgICAgICAgX3Jvb3RGaWVsZCA9IGZpZWxkOworCisgICAgICAgIF92YyA9IG5ldyBWYWxpZGF0b3JWQygpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVmFsaWRhdG9yVkMgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dAorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZCAoIFN0cmluZyBtZXNzYWdlICkKKyAgICAgICAgeworICAgICAgICAgICAgVmFsaWRhdG9yLnRoaXMuZW1pdEVycm9yKCBfZXZlbnQsIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50IF9ldmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFfaW52YWxpZCAmJiBfY29uc3RyYWludEVuZ2luZS5pc1ZhbGlkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnICkKKyAgICB7CisgICAgICAgIGVtaXRFcnJvcihldmVudCwgbXNnLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkgKQorICAgIHsKKyAgICAgICAgX2Vycm9yU3RhdGUrKzsKKworICAgICAgICBpZiAoX3N1c3BlbmRFcnJvcnMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNldmVyaXR5ID09IFhtbEVycm9yLlNFVkVSSVRZX0VSUk9SKQorICAgICAgICAgICAgICAgIF9pbnZhbGlkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGV2ZW50ICE9IG51bGw7CisKKyAgICAgICAgICAgICAgICBfZXJyb3JMaXN0ZW5lci5hZGQoCisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckN1cnNvciggbXNnLCBzZXZlcml0eSwgZXZlbnQuZ2V0TG9jYXRpb25Bc0N1cnNvcigpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbWl0RmllbGRFcnJvciAoIEV2ZW50IGV2ZW50LCBTdHJpbmcgbXNnLCBRTmFtZSBuYW1lICkKKyAgICB7CisgICAgICAgIGVtaXRGaWVsZEVycm9yKCBldmVudCwgbXNnICsgIiAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBuYW1lICkgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW1pdEZpZWxkRXJyb3IgKCBFdmVudCBldmVudCwgU3RyaW5nIG1zZyApCisgICAgeworICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgbXNnLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRGaWVsZEVycm9yICggRXZlbnQgZXZlbnQsIFN0cmluZyBtc2csIGludCBzZXZlcml0eSApCisgICAgeworICAgICAgICBpZiAoX3N0YXRlU3RhY2sgIT0gbnVsbCAmJiBfc3RhdGVTdGFjay5fZmllbGQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnICs9CisgICAgICAgICAgICAgICAgIiBpbiBlbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoIF9zdGF0ZVN0YWNrLl9maWVsZC5nZXROYW1lKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFZhbGlkYXRvci50aGlzLmVtaXRFcnJvciggZXZlbnQsIG1zZywgc2V2ZXJpdHkgKTsKKyAgICB9CisKKyAgICAvLyBGb3IgWG1sRXZlbnRMaXN0ZW5lci5lcnJvcgorCisgICAgcHVibGljIHZvaWQgZXJyb3IgKCBYbWxFcnJvciBlcnJvciApCisgICAgeworICAgICAgICBfZXJyb3JTdGF0ZSsrOworCisgICAgICAgIGlmIChfc3VzcGVuZEVycm9ycyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfaW52YWxpZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmFkZCggZXJyb3IgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5leHRFdmVudCAoIGludCBraW5kLCBFdmVudCBldmVudCApCisgICAgeworICAgICAgICByZXNldFZhbHVlcygpOworCisgICAgICAgIGlmIChfZWF0Q29udGVudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBFTkQgICA6IF9lYXRDb250ZW50LS07IGJyZWFrOworICAgICAgICAgICAgY2FzZSBCRUdJTiA6IF9lYXRDb250ZW50Kys7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICAgICAga2luZCA9PSBCRUdJTiB8fCBraW5kID09IEFUVFIgfHwKKyAgICAgICAgICAgICAgICAgICAga2luZCA9PSBFTkQgfHwga2luZCA9PSBURVhUIHx8IGtpbmQgPT0gRU5EQVRUUlM7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCRUdJTiAgICA6IGJlZ2luRXZlbnQoICAgIGV2ZW50ICk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVFRSICAgICA6IGF0dHJFdmVudCggICAgIGV2ZW50ICk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTkRBVFRSUyA6IGVuZEF0dHJzRXZlbnQoIGV2ZW50ICk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBURVhUICAgICA6IHRleHRFdmVudCggICAgIGV2ZW50ICk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTkQgICAgICA6IGVuZEV2ZW50KCAgICAgIGV2ZW50ICk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJlZ2luRXZlbnQgKCBFdmVudCBldmVudCApCisgICAgeworICAgICAgICBfbG9jYWxFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgX3dpbGRjYXJkRWxlbWVudCA9IG51bGw7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOworCisgICAgICAgIFNjaGVtYVR5cGUgIGVsZW1lbnRUeXBlICA9IG51bGw7CisgICAgICAgIFNjaGVtYUZpZWxkIGVsZW1lbnRGaWVsZCA9IG51bGw7CisKKyAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gX3Jvb3RUeXBlOworICAgICAgICAgICAgZWxlbWVudEZpZWxkID0gX3Jvb3RGaWVsZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGV2ZW50LmdldE5hbWUoKTsKKworICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKworICAgICAgICAgICAgc3RhdGUuX2lzRW1wdHkgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHN0YXRlLl9pc05pbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgICJOaWwgZWxlbWVudCBjYW5ub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQiKTsKKyAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXN0YXRlLl9pc05pbCAmJiBzdGF0ZS5fZmllbGQgIT0gbnVsbCAmJiBzdGF0ZS5fZmllbGQuaXNGaXhlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAiRWxlbWVudCAnIiArIFFOYW1lSGVscGVyLnByZXR0eShzdGF0ZS5fZmllbGQuZ2V0TmFtZSgpKSArICInIGlzIGZpeGVkIGFuZCBub3QgbmlsIHNvIGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgZWxlbWVudCBjaGlsZHJlbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzdGF0ZS52aXNpdCggbmFtZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBmaW5kRGV0YWlsZWRFcnJvckJlZ2luKHN0YXRlICwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAiRWxlbWVudCBub3QgYWxsb3dlZDoiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjdXJyZW50UGFydGljbGUgPSBzdGF0ZS5jdXJyZW50UGFydGljbGUoKTsKKyAgICAgICAgICAgIF93aWxkY2FyZEVsZW1lbnQgPSBjdXJyZW50UGFydGljbGU7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50UGFydGljbGUuZ2V0UGFydGljbGVUeXBlKCkgPT0gU2NoZW1hUGFydGljbGUuV0lMRENBUkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9fd2lsZGNhcmRFbGVtZW50ID0gY3VycmVudFBhcnRpY2xlOworICAgICAgICAgICAgICAgIFFOYW1lU2V0IGVsZW1XaWxkY2FyZFNldCA9IGN1cnJlbnRQYXJ0aWNsZS5nZXRXaWxkY2FyZFNldCgpOworCisgICAgICAgICAgICAgICAgaWYgKCFlbGVtV2lsZGNhcmRTZXQuY29udGFpbnMoIG5hbWUgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgcHJvY2Vzc2luZyBtYXkgYmUgbmVlZGVkIHRvIGdlbmVyYXRlIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpdmUgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoIGV2ZW50LCAiRWxlbWVudCBub3QgYWxsb3dlZDoiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHdpbGRjYXJkUHJvY2VzcyA9IGN1cnJlbnRQYXJ0aWNsZS5nZXRXaWxkY2FyZFByb2Nlc3MoKTsKKworICAgICAgICAgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hUGFydGljbGUuU0tJUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9sb2NhbEVsZW1lbnQgPSBfZ2xvYmFsVHlwZXMuZmluZEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSBfbG9jYWxFbGVtZW50OworCisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRGaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAiRWxlbWVudCBub3QgYWxsb3dlZCAoc3RyaWN0IHdpbGRjYXJkLCBhbmQgbm8gZGVmaW5pdGlvbiBmb3VuZCk6IiwgbmFtZSApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZS5nZXRQYXJ0aWNsZVR5cGUoKSA9PSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBwYXJ0aWNsZSBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGV2ZW50LCB0aGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBzdWJzdGl0dXRlIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHBhcnRpY2xlLiBSZXBsYWNlIHRoZSBmaWVsZCB3aXRoIHRoZSBnbG9iYWwKKyAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGZvciB0aGUgcmVwbGFjZW1lbnQKKworICAgICAgICAgICAgICAgIGlmICghIGN1cnJlbnRQYXJ0aWNsZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoU2NoZW1hTG9jYWxFbGVtZW50KWN1cnJlbnRQYXJ0aWNsZSkuYmxvY2tTdWJzdGl0dXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoZXZlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbGVtZW50IHN1YnN0aXR1dGlvbiBub3QgYWxsb3dlZCB3aGVuIGdyb3VwIGhlYWQgaGFzIGJsb2NrPSdzdWJzdGl0dXRpb24nIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTY2hlbWFHbG9iYWxFbGVtZW50IG5ld0ZpZWxkID0gX2dsb2JhbFR5cGVzLmZpbmRFbGVtZW50KG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBuZXdGaWVsZCAhPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGaWVsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSBuZXdGaWVsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2NhbEVsZW1lbnQgPSBuZXdGaWVsZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSAoU2NoZW1hRmllbGQpIGN1cnJlbnRQYXJ0aWNsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW1lbnRUeXBlID0gZWxlbWVudEZpZWxkLmdldFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBlbGVtZW50VHlwZSAhPSBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHRoZSBuby10eXBlIGlzIGFsd2F5cyBpbnZhbGlkIChldmVuIGlmIHRoZXJlIGlzIGFuIHhzaTp0eXBlKQorICAgICAgICAvLworCisgICAgICAgIGlmIChlbGVtZW50VHlwZS5pc05vVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0RmllbGRFcnJvcihldmVudCwgIkludmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFNlZSBpZiB0aGUgZWxlbWVudCBoYXMgYW4geHNpOnR5cGUgb24gaXQKKyAgICAgICAgLy8KKworICAgICAgICBTY2hlbWFUeXBlIHhzaVR5cGUgPSBudWxsOworCisgICAgICAgIGlmIChldmVudC5nZXRYc2lUeXBlKCBfY2hhcnMgKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gX2NoYXJzLmFzU3RyaW5nKCk7CisKKyAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHRoZSBsaXN0ZW5lciBzbyBhIHB1YmxpYyBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAvLyBkb2VzIG5vdCBnZXQgZ2VuZXJhdGVkLCBidXQgSSBjYW4gc2VlIGlmIHRoZXJlIHdhcworICAgICAgICAgICAgLy8gYW4gZXJyb3IgdGhyb3VnaCB0aGUgZXJyb3Igc3RhdGUKKworICAgICAgICAgICAgaW50IG9yaWdpbmFsRXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOworCisgICAgICAgICAgICBfc3VzcGVuZEVycm9ycysrOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmMuX2V2ZW50ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHhzaVR5cGUgPQorICAgICAgICAgICAgICAgICAgICBfZ2xvYmFsVHlwZXMuZmluZFR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBYbWxRTmFtZUltcGwudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgX3ZjLCBldmVudCApICk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9lcnJvclN0YXRlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JTdGF0ZSAhPSBfZXJyb3JTdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQsICJJbnZhbGlkIHhzaTp0eXBlIHFuYW1lOiAnIiArIHZhbHVlICsgIiciICk7CisKKyAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh4c2lUeXBlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAgIkNvdWxkIG5vdCBmaW5kIHhzaTp0eXBlOiAnIiArIHZhbHVlICsgIiciKTsKKworICAgICAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh4c2lUeXBlICE9IG51bGwgJiYgIXhzaVR5cGUuZXF1YWxzKGVsZW1lbnRUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5pc0Fzc2lnbmFibGVGcm9tKHhzaVR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAorICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgIlR5cGUgJyIgKyB4c2lUeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCBkZXJpdmVkIGZyb20gJyIgKyBlbGVtZW50VHlwZSArICInIiApOworCisgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUuYmxvY2tFeHRlbnNpb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHQgPSB4c2lUeXBlIDsgISB0LmVxdWFscyggZWxlbWVudFR5cGUgKSA7CisgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0QmFzZVR5cGUoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIHR5cGU6ICciICsgeHNpVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1heSBub3QgYmUgc3Vic3RpdHV0ZWQgZm9yOiAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSArICInIiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLmJsb2NrUmVzdHJpY3Rpb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHQgPSB4c2lUeXBlIDsgISB0LmVxdWFscyggZWxlbWVudFR5cGUgKSA7CisgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0QmFzZVR5cGUoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXREZXJpdmF0aW9uVHlwZSgpID09IFNjaGVtYVR5cGUuRFRfUkVTVFJJQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXN0cmljdGlvbiB0eXBlOiAnIiArIHhzaVR5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBtYXkgbm90IGJlIHN1YnN0aXR1dGVkIGZvcjogJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgKyAiJyIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVtZW50RmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IHNsZSAgPSAoU2NoZW1hTG9jYWxFbGVtZW50KWVsZW1lbnRGaWVsZDsKKyAgICAgICAgICAgICAgICBfbG9jYWxFbGVtZW50ID0gc2xlOworCisgICAgICAgICAgICAgICAgaWYgKHNsZS5ibG9ja0V4dGVuc2lvbigpIHx8IHNsZS5ibG9ja1Jlc3RyaWN0aW9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBTY2hlbWFUeXBlIHQgPSB4c2lUeXBlIDsgISB0LmVxdWFscyggZWxlbWVudFR5cGUgKSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmdldEJhc2VUeXBlKCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX1JFU1RSSUNUSU9OICYmIHNsZS5ibG9ja1Jlc3RyaWN0aW9uKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQuZ2V0RGVyaXZhdGlvblR5cGUoKSA9PSBTY2hlbWFUeXBlLkRUX0VYVEVOU0lPTiAmJiBzbGUuYmxvY2tFeHRlbnNpb24oKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcml2ZWQgdHlwZTogJyIgKyB4c2lUeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIG1heSBub3QgYmUgc3Vic3RpdHV0ZWQgZm9yIGVsZW1lbnQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWVIZWxwZXIucHJldHR5KHNsZS5nZXROYW1lKCkpICsgIiciICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZWF0Q29udGVudCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxlbWVudFR5cGUgPSB4c2lUeXBlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVsZW1lbnRGaWVsZCBpbnN0YW5jZW9mIFNjaGVtYUxvY2FsRWxlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hTG9jYWxFbGVtZW50IHNsZSA9IChTY2hlbWFMb2NhbEVsZW1lbnQpZWxlbWVudEZpZWxkOworICAgICAgICAgICAgX2xvY2FsRWxlbWVudCA9IHNsZTsKKworICAgICAgICAgICAgaWYgKHNsZS5pc0Fic3RyYWN0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEVycm9yKGV2ZW50LCAgIkVsZW1lbnQgJyIgKyBRTmFtZUhlbHBlci5wcmV0dHkoc2xlLmdldE5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAiJyBpcyBhYnN0cmFjdCBhbmQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UuIik7CisgICAgICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbGVtZW50VHlwZSAhPSBudWxsICYmIGVsZW1lbnRUeXBlLmlzQWJzdHJhY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCisgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgIkFic3RyYWN0IHR5cGU6ICIgKyBlbGVtZW50VHlwZSArCisgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UiICk7CisKKyAgICAgICAgICAgIF9lYXRDb250ZW50ID0gMTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc05pbCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGhhc05pbCA9IGZhbHNlOworCisgICAgICAgIGlmIChldmVudC5nZXRYc2lOaWwoX2NoYXJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgX3ZjLl9ldmVudCA9IGV2ZW50OworICAgICAgICAgICAgaXNOaWwgPSBKYXZhQm9vbGVhbkhvbGRlci52YWxpZGF0ZUxleGljYWwoX2NoYXJzLmFzU3RyaW5nKCksIF92Yyk7CisgICAgICAgICAgICBoYXNOaWwgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBub3RlIGluIHNjaGVtYSBzcGVjIDMuMy40LCB5b3UncmUgbm90IGV2ZW4gYWxsb3dlZCB0byBzYXkgeHNpOm5pbD0iZmFsc2UiIGlmIHlvdSdyZSBub3QgbmlsbGFibGUhCisgICAgICAgIGlmIChoYXNOaWwgJiYgIWVsZW1lbnRGaWVsZC5pc05pbGxhYmxlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAgIkVsZW1lbnQgaGFzIHhzaTpuaWwgYXR0cmlidXRlIGJ1dCBpcyBub3QgbmlsbGFibGUiKTsKKworICAgICAgICAgICAgX2VhdENvbnRlbnQgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbmV3U3RhdGUoIGVsZW1lbnRUeXBlLCBlbGVtZW50RmllbGQsIGlzTmlsICk7CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggdGhpcyBlbGVtZW50IGV2ZW50IHRvIGFueSBpZGVudGl0eSBjb25zdHJhaW50cworICAgICAgICAvLyBBcyB3ZWxsIGFzIGFkZGluZyBhbnkgbmV3IGlkZW50aXR5IGNvbnN0cmFpbnRzIHRoYXQgZXhpc3QKKworICAgICAgICBfY29uc3RyYWludEVuZ2luZS5lbGVtZW50KAorICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICBlbGVtZW50VHlwZSwKKyAgICAgICAgICAgIGVsZW1lbnRGaWVsZCBpbnN0YW5jZW9mIFNjaGVtYUxvY2FsRWxlbWVudAorICAgICAgICAgICAgICAgID8gKChTY2hlbWFMb2NhbEVsZW1lbnQpIGVsZW1lbnRGaWVsZCkuZ2V0SWRlbnRpdHlDb25zdHJhaW50cygpCisgICAgICAgICAgICAgICAgOiBudWxsICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGF0dHJFdmVudCAoIEV2ZW50IGV2ZW50ICkKKyAgICB7CisgICAgICAgIFFOYW1lIGF0dHJOYW1lID0gZXZlbnQuZ2V0TmFtZSgpOworCisgICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKKworICAgICAgICBpZiAoc3RhdGUuX2F0dHJzID09IG51bGwpCisgICAgICAgICAgICBzdGF0ZS5fYXR0cnMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIGlmIChzdGF0ZS5fYXR0cnMuY29udGFpbnMoIGF0dHJOYW1lICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAorICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgYXR0cmlidXRlOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLl9hdHRycy5hZGQoIGF0dHJOYW1lICk7CisKKyAgICAgICAgaWYgKCFzdGF0ZS5fY2FuSGF2ZUF0dHJzKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0RmllbGRFcnJvciggZXZlbnQsICJDYW4ndCBoYXZlIGF0dHJpYnV0ZXMiICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBhdHRyU2NoZW1hID0KKyAgICAgICAgICAgIHN0YXRlLl9hdHRyTW9kZWwgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgIDogc3RhdGUuX2F0dHJNb2RlbC5nZXRBdHRyaWJ1dGUoIGF0dHJOYW1lICk7CisKKyAgICAgICAgaWYgKGF0dHJTY2hlbWEgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2xvY2FsQXR0cmlidXRlID0gYXR0clNjaGVtYTsKKworICAgICAgICAgICAgaWYgKGF0dHJTY2hlbWEuZ2V0VXNlKCkgPT0gU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0RmllbGRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgaXMgcHJvaGliaXRlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCisgICAgICAgICAgICAgICAgICAgIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCBhdHRyU2NoZW1hLCBldmVudCwgZmFsc2UsIGZhbHNlICk7CisKKyAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLmF0dHIoIGV2ZW50LCBhdHRyTmFtZSwgYXR0clNjaGVtYS5nZXRUeXBlKCksIHZhbHVlICk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCB3aWxkY2FyZFByb2Nlc3MgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldFdpbGRjYXJkUHJvY2VzcygpOworICAgICAgICBfd2lsZGNhcmRBdHRyaWJ1dGUgPSBzdGF0ZS5fYXR0ck1vZGVsOworCisgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCisgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgYWxsb3dlZCAobm8gd2lsZGNhcmRzIGFsbG93ZWQpOiAiCisgICAgICAgICAgICAgICAgICAgICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFFOYW1lU2V0IGF0dHJXaWxkY2FyZFNldCA9IHN0YXRlLl9hdHRyTW9kZWwuZ2V0V2lsZGNhcmRTZXQoKTsKKworICAgICAgICBpZiAoIWF0dHJXaWxkY2FyZFNldC5jb250YWlucyggYXR0ck5hbWUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCisgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgYWxsb3dlZDogIiArIFFOYW1lSGVscGVyLnByZXR0eSggYXR0ck5hbWUgKSApOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lsZGNhcmRQcm9jZXNzID09IFNjaGVtYUF0dHJpYnV0ZU1vZGVsLlNLSVApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYXR0clNjaGVtYSA9IF9nbG9iYWxUeXBlcy5maW5kQXR0cmlidXRlKCBhdHRyTmFtZSApOworICAgICAgICBfbG9jYWxBdHRyaWJ1dGUgPSBhdHRyU2NoZW1hOworCisgICAgICAgIGlmIChhdHRyU2NoZW1hID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3aWxkY2FyZFByb2Nlc3MgPT0gU2NoZW1hQXR0cmlidXRlTW9kZWwuTEFYKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgYXNzZXJ0IHdpbGRjYXJkUHJvY2VzcyA9PSBTY2hlbWFBdHRyaWJ1dGVNb2RlbC5TVFJJQ1Q7CisKKyAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKAorICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgbm90IGFsbG93ZWQgKHN0cmljdCB3aWxkY2FyZCwgYW5kIG5vIGRlZmluaXRpb24gZm91bmQpOiAiICsgUU5hbWVIZWxwZXIucHJldHR5KCBhdHRyTmFtZSApICk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB2YWx1ZSA9CisgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCisgICAgICAgICAgICAgICAgYXR0clNjaGVtYS5nZXRUeXBlKCksIGF0dHJTY2hlbWEsIGV2ZW50LCBmYWxzZSwgZmFsc2UgKTsKKworICAgICAgICBfY29uc3RyYWludEVuZ2luZS5hdHRyKCBldmVudCwgYXR0ck5hbWUsIGF0dHJTY2hlbWEuZ2V0VHlwZSgpLCB2YWx1ZSApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRBdHRyc0V2ZW50ICggRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgU3RhdGUgc3RhdGUgPSB0b3BTdGF0ZSgpOworCisgICAgICAgIGlmIChzdGF0ZS5fYXR0ck1vZGVsICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gYXR0cnMgPSBzdGF0ZS5fYXR0ck1vZGVsLmdldEF0dHJpYnV0ZXMoKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGF0dHJzLmxlbmd0aCA7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc2xhID0gYXR0cnNbIGkgXTsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fYXR0cnMgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0YXRlLl9hdHRycy5jb250YWlucyggc2xhLmdldE5hbWUoKSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsYS5nZXRVc2UoKSA9PSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5SRVFVSVJFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsICJFeHBlY3RlZCBhdHRyaWJ1dGU6ICIsIHNsYS5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzbGEuaXNEZWZhdWx0KCkgfHwgc2xhLmlzRml4ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0cihldmVudCwgc2xhLmdldE5hbWUoKSwgc2xhLmdldFR5cGUoKSwgc2xhLmdldERlZmF1bHRUZXh0KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHZhbGlkYXRlIGF0dHJpYnV0ZSBkZWZhdWx0cyBiZWNhdXNlIHRoaXMgaXMgZG9uZSBhdCBjb21waWxldGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzbGEuZ2V0RGVmYXVsdFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9IHNsYS5nZXRUeXBlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYbWxRTmFtZS50eXBlLmlzQXNzaWduYWJsZUZyb20odHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEZpZWxkRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQgUU5hbWUgdmFsdWVzIGFyZSB1bnN1cHBvcnRlZCBmb3IgYXR0cmlidXRlOiAiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZUhlbHBlci5wcmV0dHkoc2xhLmdldE5hbWUoKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpbXBsZVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNsYS5nZXREZWZhdWx0VGV4dCgpLCBldmVudCApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnN0cmFpbnRFbmdpbmUuYXR0ciggZXZlbnQsIHR5cGUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZEV2ZW50ICggRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgX2xvY2FsRWxlbWVudCA9IG51bGw7CisgICAgICAgIF93aWxkY2FyZEVsZW1lbnQgPSBudWxsOworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKKworICAgICAgICBpZiAoIXN0YXRlLl9pc05pbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdGF0ZS5lbmQoKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBmaW5kRGV0YWlsZWRFcnJvckVuZChzdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAiRXhwZWN0ZWQgZWxlbWVudChzKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBlbmQgZXZlbnQgaGFzIG5vIHRleHQsIHVzZSB0aGlzIGZhY3QgdG8gcGFzcyBubyB0ZXh0IHRvCisgICAgICAgICAgICAvLyBoYW5kbGVUZXh0CisKKyAgICAgICAgICAgIGlmIChzdGF0ZS5faXNFbXB0eSkKKyAgICAgICAgICAgICAgICBoYW5kbGVUZXh0KCBldmVudCwgdHJ1ZSwgc3RhdGUuX2ZpZWxkICk7CisgICAgICAgIH0KKworICAgICAgICBwb3BTdGF0ZSggZXZlbnQgKTsKKworICAgICAgICBfY29uc3RyYWludEVuZ2luZS5lbmRFbGVtZW50KCBldmVudCApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXh0RXZlbnQgKCBFdmVudCBldmVudCApCisgICAgeworICAgICAgICBTdGF0ZSBzdGF0ZSA9IHRvcFN0YXRlKCk7CisKKyAgICAgICAgaWYgKHN0YXRlLl9pc05pbCkKKyAgICAgICAgICAgIGVtaXRGaWVsZEVycm9yKGV2ZW50LCAiTmlsIGVsZW1lbnQgY2Fubm90IGhhdmUgc2ltcGxlIGNvbnRlbnQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGFuZGxlVGV4dCggZXZlbnQsIGZhbHNlLCBzdGF0ZS5fZmllbGQgKTsKKworICAgICAgICBzdGF0ZS5faXNFbXB0eSA9IGZhbHNlOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRleHQgKAorICAgICAgICBFdmVudCBldmVudCwgYm9vbGVhbiBlbXB0eUNvbnRlbnQsIFNjaGVtYUZpZWxkIGZpZWxkICkKKyAgICB7CisgICAgICAgIFN0YXRlIHN0YXRlID0gdG9wU3RhdGUoKTsKKworICAgICAgICBpZiAoIXN0YXRlLl9zYXdUZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RhdGUuX2hhc1NpbXBsZUNvbnRlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX3R5cGUsIGZpZWxkLCBldmVudCwgZW1wdHlDb250ZW50LCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgc3RhdGUuX3R5cGUsIHZhbHVlLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuX2NhbkhhdmVNaXhlZENvbnRlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaGFuZGxlcyBjdmMtZWx0LjUuMi4yLjIuMSwgY2hlY2tpbmcgbWl4ZWQgY29udGVudCBhZ2FpbnN0IGZpeGVkLgorICAgICAgICAgICAgICAgIC8vIGlmIHdlIHNlZSA8bWl4ZWRUeXBlPmE8L2I+YzwvbWl4ZWRUeXBlPiwgd2UgdmFsaWRhdGUgYWdhaW5zdAorICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCAnYScgdGV4dCBhbmQgd2UgY2hlY2sgdGhlIGNvbnRlbnQgb2YgbWl4ZWRUeXBlIHRvCisgICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkgaW4gYmVnaW5FbGVtKCkuICB3ZSBkb24ndCBjYXJlIGFib3V0IGNoZWNraW5nIGFnYWluc3QKKyAgICAgICAgICAgICAgICAvLyB0aGUgJ2MnIHRleHQgc2luY2UgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIGVycm9yIGZvciA8Yi8+CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyaW5nLnR5cGUsIGZpZWxkLCBldmVudCwgZW1wdHlDb250ZW50LCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICBfY29uc3RyYWludEVuZ2luZS50ZXh0KCBldmVudCwgWG1sU3RyaW5nLnR5cGUsIHZhbHVlLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZW1wdHlDb250ZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLnRleHQoIGV2ZW50LCBzdGF0ZS5fdHlwZSwgbnVsbCwgdHJ1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9jb25zdHJhaW50RW5naW5lLnRleHQoIGV2ZW50LCBzdGF0ZS5fdHlwZSwgIiIsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZW1wdHlDb250ZW50ICYmICFzdGF0ZS5fY2FuSGF2ZU1peGVkQ29udGVudCAmJiAKKyAgICAgICAgICAgICFldmVudC50ZXh0SXNXaGl0ZXNwYWNlKCkgJiYgIXN0YXRlLl9oYXNTaW1wbGVDb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYUxvY2FsRWxlbWVudCBlID0gKFNjaGVtYUxvY2FsRWxlbWVudClmaWVsZDsKKyAgICAgICAgICAgICAgICBlbWl0RXJyb3IoZXZlbnQsICJFbGVtZW50OiAnIiArIFFOYW1lSGVscGVyLnByZXR0eShlLmdldE5hbWUoKSkgKyAiJyBjYW5ub3QgaGF2ZSBtaXhlZCBjb250ZW50LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVtaXRFcnJvciggZXZlbnQsICJDYW4ndCBoYXZlIG1peGVkIGNvbnRlbnQiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVtcHR5Q29udGVudCkKKyAgICAgICAgICAgIHN0YXRlLl9zYXdUZXh0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmaW5kRGV0YWlsZWRFcnJvckJlZ2luKFN0YXRlIHN0YXRlLCBRTmFtZSBxTmFtZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wZXJ0aWVzID0gc3RhdGUuX3R5cGUuZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKKworICAgICAgICBBcnJheUxpc3QgZXhwZWN0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IG9wdGlvbmFsTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGVsdFByb3BlcnRpZXMubGVuZ3RoOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL0dldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBzY2hlbWEKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHNQcm9wID0gZWx0UHJvcGVydGllc1tpaV07CisKKyAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQKKyAgICAgICAgICAgIGlmIChzdGF0ZS50ZXN0KHNQcm9wLmdldE5hbWUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKDAgPT0gQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhzUHJvcC5nZXRNaW5PY2N1cnMoKSkpCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsTmFtZXMuYWRkKHNQcm9wLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5hbWVzLmFkZChzUHJvcC5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdCBuYW1lcyA9IChleHBlY3RlZE5hbWVzLnNpemUoKSA+IDAgPyBleHBlY3RlZE5hbWVzIDogb3B0aW9uYWxOYW1lcyk7CisKKyAgICAgICAgaWYgKG5hbWVzLnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoUU5hbWVIZWxwZXIucHJldHR5KChRTmFtZSlpdGVyLm5leHQoKSkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBlbGVtZW50IiArIChuYW1lcy5zaXplKCk+MSA/ICJzICIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICBidWYudG9TdHJpbmcoKSArICJhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGZpbmREZXRhaWxlZEVycm9yRW5kKFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbHRQcm9wZXJ0aWVzICA9IHN0YXRlLl90eXBlLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbnVsbDsKKworICAgICAgICBBcnJheUxpc3QgZXhwZWN0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IG9wdGlvbmFsTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGVsdFByb3BlcnRpZXMubGVuZ3RoOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL0dldCB0aGUgZWxlbWVudCBmcm9tIHRoZSBzY2hlbWEKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IHNQcm9wID0gZWx0UHJvcGVydGllc1tpaV07CisKKyAgICAgICAgICAgIC8vIHRlc3QgaWYgdGhlIGVsZW1lbnQgaXMgdmFsaWQKKyAgICAgICAgICAgIGlmIChzdGF0ZS50ZXN0KHNQcm9wLmdldE5hbWUoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKDAgPT0gQmlnSW50ZWdlci5aRVJPLmNvbXBhcmVUbyhzUHJvcC5nZXRNaW5PY2N1cnMoKSkpCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsTmFtZXMuYWRkKHNQcm9wLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE5hbWVzLmFkZChzUHJvcC5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdCBuYW1lcyA9IChleHBlY3RlZE5hbWVzLnNpemUoKSA+IDAgPyBleHBlY3RlZE5hbWVzIDogb3B0aW9uYWxOYW1lcyk7CisKKyAgICAgICAgaWYgKG5hbWVzLnNpemUoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoUU5hbWVIZWxwZXIucHJldHR5KChRTmFtZSlpdGVyLm5leHQoKSkpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBlbGVtZW50IiArIChuYW1lcy5zaXplKCk+MSA/ICJzICIgOiAiICIpICsKKyAgICAgICAgICAgICAgICAgICAgICBidWYudG9TdHJpbmcoKSArICJhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgYm9vbGVhbiB2aXNpdCAoIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NhbkhhdmVFbGVtZW50cyAmJiBfdmlzaXRvci52aXNpdCggbmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiB0ZXN0KCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jYW5IYXZlRWxlbWVudHMgJiYgX3Zpc2l0b3IudGVzdFZhbGlkKCBuYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGVuZCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFfY2FuSGF2ZUVsZW1lbnRzIHx8IF92aXNpdG9yLnZpc2l0KCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFQYXJ0aWNsZSBjdXJyZW50UGFydGljbGUgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBfdmlzaXRvciAhPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIF92aXNpdG9yLmN1cnJlbnRQYXJ0aWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hVHlwZSAgX3R5cGU7CisgICAgICAgIFNjaGVtYUZpZWxkIF9maWVsZDsKKworICAgICAgICBib29sZWFuIF9jYW5IYXZlQXR0cnM7CisgICAgICAgIGJvb2xlYW4gX2NhbkhhdmVNaXhlZENvbnRlbnQ7CisgICAgICAgIGJvb2xlYW4gX2hhc1NpbXBsZUNvbnRlbnQ7CisKKyAgICAgICAgYm9vbGVhbiBfc2F3VGV4dDsKKyAgICAgICAgYm9vbGVhbiBfaXNFbXB0eTsKKyAgICAgICAgYm9vbGVhbiBfaXNOaWw7CisKKyAgICAgICAgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIF92aXNpdG9yOworICAgICAgICBib29sZWFuIF9jYW5IYXZlRWxlbWVudHM7CisKKyAgICAgICAgU2NoZW1hQXR0cmlidXRlTW9kZWwgX2F0dHJNb2RlbDsKKworICAgICAgICBIYXNoU2V0IF9hdHRyczsKKworICAgICAgICBTdGF0ZSBfbmV4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV3U3RhdGUgKCBTY2hlbWFUeXBlIHR5cGUsIFNjaGVtYUZpZWxkIGZpZWxkLCBib29sZWFuIGlzTmlsICkKKyAgICB7CisgICAgICAgIFN0YXRlIHN0YXRlID0gbmV3IFN0YXRlKCk7CisKKyAgICAgICAgc3RhdGUuX3R5cGUgPSB0eXBlOworICAgICAgICBzdGF0ZS5fZmllbGQgPSBmaWVsZDsKKyAgICAgICAgc3RhdGUuX2lzRW1wdHkgPSB0cnVlOworICAgICAgICBzdGF0ZS5faXNOaWwgPSBpc05pbDsKKworICAgICAgICBpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuX2hhc1NpbXBsZUNvbnRlbnQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUuX2NhbkhhdmVBdHRycyA9IHRydWU7CisgICAgICAgICAgICBzdGF0ZS5fYXR0ck1vZGVsID0gdHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOworCisgICAgICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldENvbnRlbnRUeXBlKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVNUFRZX0NPTlRFTlQgOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQgOgorICAgICAgICAgICAgICAgIHN0YXRlLl9oYXNTaW1wbGVDb250ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgOgorICAgICAgICAgICAgICAgIHN0YXRlLl9jYW5IYXZlTWl4ZWRDb250ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkVMRU1FTlRfQ09OVEVOVCA6CisKKyAgICAgICAgICAgICAgICBTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IHR5cGUuZ2V0Q29udGVudE1vZGVsKCk7CisKKyAgICAgICAgICAgICAgICBzdGF0ZS5fY2FuSGF2ZUVsZW1lbnRzID0gcGFydGljbGUgIT0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5fY2FuSGF2ZUVsZW1lbnRzKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fdmlzaXRvciA9IGluaXRWaXNpdG9yKCBwYXJ0aWNsZSApOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5leHBlY3RlZCBjb250ZW50IHR5cGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdXNoU3RhdGUoIHN0YXRlICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvcFN0YXRlICggRXZlbnQgZSApCisgICAgeworICAgICAgICBpZiAoX3N0YXRlU3RhY2suX3Zpc2l0b3IgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcG9vbFZpc2l0b3IoIF9zdGF0ZVN0YWNrLl92aXNpdG9yICk7CisgICAgICAgICAgICBfc3RhdGVTdGFjay5fdmlzaXRvciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBfc3RhdGVTdGFjayA9IF9zdGF0ZVN0YWNrLl9uZXh0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXNoU3RhdGUgKCBTdGF0ZSBzdGF0ZSApCisgICAgeworICAgICAgICBzdGF0ZS5fbmV4dCA9IF9zdGF0ZVN0YWNrOworICAgICAgICBfc3RhdGVTdGFjayA9IHN0YXRlOworICAgIH0KKworICAgIHByaXZhdGUgTGlua2VkTGlzdCBfdmlzaXRvclBvb2wgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgcHJpdmF0ZSB2b2lkIHBvb2xWaXNpdG9yKCBTY2hlbWFUeXBlVmlzaXRvckltcGwgdmlzaXRvciApCisgICAgeworICAgICAgICBfdmlzaXRvclBvb2wuYWRkKCB2aXNpdG9yICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlVmlzaXRvckltcGwgaW5pdFZpc2l0b3IoIFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlICkKKyAgICB7CisgICAgICAgIGlmIChfdmlzaXRvclBvb2wuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoIHBhcnRpY2xlICk7CisKKyAgICAgICAgU2NoZW1hVHlwZVZpc2l0b3JJbXBsIHJlc3VsdCA9CisgICAgICAgICAgICAoU2NoZW1hVHlwZVZpc2l0b3JJbXBsKSBfdmlzaXRvclBvb2wucmVtb3ZlTGFzdCgpOworCisgICAgICAgIHJlc3VsdC5pbml0KCBwYXJ0aWNsZSApOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdGF0ZSB0b3BTdGF0ZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfc3RhdGVTdGFjazsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNpbXBsZSBUeXBlIFZhbGlkYXRpb24KKyAgICAvLworICAgIC8vIGVtcHR5Q29udGVudCBtZWFucyB0aGF0IHlvdSBjYW4ndCB1c2UgdGhlIGV2ZW50IHRvIGdldCB0ZXh0OiB0aGVyZSBpcworICAgIC8vIG5vIHRleHQsIGJ1dCB5b3UgY2FuIHVzZSB0aGUgZXZlbnQgdG8gZG8gcHJlZml4IHJlc29sdXRpb24gKGluIHRoZSBjYXNlCisgICAgLy8gd2hlcmUgdGhlIGRlZmF1bHQgaXMgYSBxbmFtZSkKKyAgICAvLworCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVTaW1wbGVUeXBlICgKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTY2hlbWFGaWVsZCBmaWVsZCwgRXZlbnQgZXZlbnQsCisgICAgICAgIGJvb2xlYW4gZW1wdHlDb250ZW50LCBib29sZWFuIGNhbkFwcGx5RGVmYXVsdCApCisgICAgeworICAgICAgICBpZiAoIXR5cGUuaXNTaW1wbGVUeXBlKCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgLy8gdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJOb3QgYSBzaW1wbGUgdHlwZSIgKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyB0aGUgbm8tdHlwZSBpcyBhbHdheXMgaW52YWxpZAorICAgICAgICAvLworCisgICAgICAgIGlmICh0eXBlLmlzTm9UeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihldmVudCwgIkludmFsaWQgdHlwZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBhcyBhIHN0cmluZyAoYXMgbm9ybWFsaXplZCBieSB0aGUgd2hpdGUgc3BhY2UgcnVsZQorICAgICAgICAvLyBUT0RPIC0gd2lsbCB3YW50IHRvIG9wdGltaXplIHRoaXMgbGF0ZXIKKworICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKKworICAgICAgICBpZiAoIWVtcHR5Q29udGVudCkKKyAgICAgICAgeworICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCggX2NoYXJzLCB0eXBlLmdldFdoaXRlU3BhY2VSdWxlKCkgKTsKKyAgICAgICAgICAgIHZhbHVlID0gX2NoYXJzLmFzU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgSSBjYW4gYXBwbHkgYSBkZWZhdWx0L2ZpeGVkIHZhbHVlCisKKyAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDAgJiYgY2FuQXBwbHlEZWZhdWx0ICYmIGZpZWxkICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAoZmllbGQuaXNEZWZhdWx0KCkgfHwgZmllbGQuaXNGaXhlZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFhtbFFOYW1lLnR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdCBRTmFtZSB2YWx1ZXMgYXJlIHVuc3VwcG9ydGVkIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICsgIiAtIGlnbm9yaW5nLiIsCisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLlNFVkVSSVRZX0lORk8pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VmFsdWUgPQorICAgICAgICAgICAgICAgIFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldERlZmF1bHRUZXh0KCksIHR5cGUuZ2V0V2hpdGVTcGFjZVJ1bGUoKSApOworCisvLyBCVUdCVUcgLSBzaG91bGQgdmFsaWRhdGUgZGVmYXVsdFZhbHVlIGF0IGNvbXBpbGUgdGltZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlLCBkZWZhdWx0VmFsdWUsIGV2ZW50ICkKKyAgICAgICAgICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWxpZGF0ZVNpbXBsZVR5cGUoIHR5cGUsIHZhbHVlLCBldmVudCApKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuaXNGaXhlZCgpKQorICAgICAgICB7CisvLyBUT0RPIC0gZml4ZWQgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiBjb29rZWQgYXQgY29tcGlsZSB0aW1lCisgICAgICAgICAgICBTdHJpbmcgZml4ZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSgKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVmYXVsdFRleHQoKSwgdHlwZS5nZXRXaGl0ZVNwYWNlUnVsZSgpICk7CisKKyAgICAgICAgICAgIGlmICghdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlLCBmaXhlZFZhbHVlLCBldmVudCApKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBYbWxPYmplY3QgdmFsID0gdHlwZS5uZXdWYWx1ZSggdmFsdWUgKTsKKyAgICAgICAgICAgIFhtbE9iamVjdCBkZWYgPSB0eXBlLm5ld1ZhbHVlKCBmaXhlZFZhbHVlICk7CisKKyAgICAgICAgICAgIGlmICghdmFsLnZhbHVlRXF1YWxzKCBkZWYgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBCVUdCVUcgLSBtYWtlIHRoaXMgbW9yZSB2ZXJib3NlCisKKyAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAiVmFsdWUgbm90IGVxdWFsIHRvIGZpeGVkIHZhbHVlLiAiICsgdmFsdWUgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVNpbXBsZVR5cGUgKAorICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgaWYgKCF0eXBlLmlzU2ltcGxlVHlwZSgpICYmCisgICAgICAgICAgICAgICAgdHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuU0lNUExFX0NPTlRFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiTm90IGEgc2ltcGxlIHR5cGUiICk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmV0U3RhdGUgPSBfZXJyb3JTdGF0ZTsKKworICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldFNpbXBsZVZhcmlldHkoKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQyA6IHZhbGlkYXRlQXRvbWljVHlwZSggdHlwZSwgdmFsdWUsIGV2ZW50ICk7YnJlYWs7CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5VTklPTiAgOiB2YWxpZGF0ZVVuaW9uVHlwZSggIHR5cGUsIHZhbHVlLCBldmVudCApO2JyZWFrOworICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVCAgIDogdmFsaWRhdGVMaXN0VHlwZSggICB0eXBlLCB2YWx1ZSwgZXZlbnQgKTticmVhazsKKworICAgICAgICBkZWZhdWx0IDogdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJVbmV4cGVjdGVkIHNpbXBsZSB2YXJpZXR5IiApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldFN0YXRlID09IF9lcnJvclN0YXRlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUF0b21pY1R5cGUgKAorICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgLy8gTm93IHdlIHNob3VsZCBoYXZlIG9ubHkgYW4gYXRvbWljIHR5cGUgdG8gdmFsaWRhdGUKKworICAgICAgICBhc3NlcnQgdHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5BVE9NSUM7CisKKyAgICAgICAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IGVycm9yIHN0YXRlIHRvIHNlZSBpZiBhbnkgbmV3IGVycm9ycyBhcmUgbWFkZQorICAgICAgICBpbnQgZXJyb3JTdGF0ZSA9IF9lcnJvclN0YXRlOworICAgICAgICBfdmMuX2V2ZW50ID0gZXZlbnQ7CisKKyAgICAgICAgc3dpdGNoICggdHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFsd2F5cyB2YWxpZCEKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HIDoKKyAgICAgICAgeworICAgICAgICAgICAgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7CisgICAgICAgICAgICBfc3RyaW5nVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyRXgudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kZWNpbWFsVmFsdWUgPSBuZXcgQmlnRGVjaW1hbCggdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBKYXZhRGVjaW1hbEhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIF9kZWNpbWFsVmFsdWUsIHR5cGUsIF92YyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4gOgorICAgICAgICB7CisgICAgICAgICAgICBfYm9vbGVhblZhbHVlID0gSmF2YUJvb2xlYW5Ib2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQgOgorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBmID0KKyAgICAgICAgICAgICAgICBKYXZhRmxvYXRIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKworICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCisgICAgICAgICAgICAgICAgSmF2YUZsb2F0SG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggZiwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIF9mbG9hdFZhbHVlID0gZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFIDoKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGQgPQorICAgICAgICAgICAgICAgIEphdmFEb3VibGVIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKworICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCisgICAgICAgICAgICAgICAgSmF2YURvdWJsZUhvbGRlckV4LnZhbGlkYXRlVmFsdWUoIGQsIHR5cGUsIF92YyApOworCisgICAgICAgICAgICBfZG91YmxlVmFsdWUgPSBkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRSA6CisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG4gPQorICAgICAgICAgICAgICAgIEphdmFRTmFtZUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCgKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHR5cGUsIF92YywgZXZlbnQgKTsKKworICAgICAgICAgICAgaWYgKGVycm9yU3RhdGUgPT0gX2Vycm9yU3RhdGUpCisgICAgICAgICAgICAgICAgSmF2YVFOYW1lSG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggbiwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIF9xbmFtZVZhbHVlID0gbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSA6CisgICAgICAgIHsKKyAgICAgICAgICAgIEphdmFVcmlIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKyAgICAgICAgICAgIF9zdHJpbmdWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgOgorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUUgOgorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEUgOgorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USCA6CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSIDoKKyAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWSA6CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVkgOgorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggOgorICAgICAgICB7CisgICAgICAgICAgICBHRGF0ZSBkID0gWG1sRGF0ZUltcGwudmFsaWRhdGVMZXhpY2FsKCB2YWx1ZSwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIGlmIChkICE9IG51bGwpCisgICAgICAgICAgICAgICAgWG1sRGF0ZUltcGwudmFsaWRhdGVWYWx1ZSggZCwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIF9nZGF0ZVZhbHVlID0gZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRFVSQVRJT04gOgorICAgICAgICB7CisgICAgICAgICAgICBHRHVyYXRpb24gZCA9IFhtbER1cmF0aW9uSW1wbC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKworICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBYbWxEdXJhdGlvbkltcGwudmFsaWRhdGVWYWx1ZSggZCwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIF9nZHVyYXRpb25WYWx1ZSA9IGQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZIDoKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIHYgPQorICAgICAgICAgICAgICAgIEphdmFCYXNlNjRIb2xkZXJFeC52YWxpZGF0ZUxleGljYWwoIHZhbHVlLCB0eXBlLCBfdmMgKTsKKworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBKYXZhQmFzZTY0SG9sZGVyRXgudmFsaWRhdGVWYWx1ZSggdiwgdHlwZSwgX3ZjICk7CisKKyAgICAgICAgICAgIF9ieXRlQXJyYXlWYWx1ZSA9IHY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlkgOgorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gdiA9CisgICAgICAgICAgICAgICAgSmF2YUhleEJpbmFyeUhvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCggdmFsdWUsIHR5cGUsIF92YyApOworCisgICAgICAgICAgICBpZiAodiAhPSBudWxsKQorICAgICAgICAgICAgICAgIEphdmFIZXhCaW5hcnlIb2xkZXJFeC52YWxpZGF0ZVZhbHVlKCB2LCB0eXBlLCBfdmMgKTsKKworICAgICAgICAgICAgX2J5dGVBcnJheVZhbHVlID0gdjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT04gOgorICAgICAgICAgICAgLy8gVW5pbXBsZW1lbnRlZC4gCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiVW5leHBlY3RlZCBwcmltaXRpdmUgdHlwZSBjb2RlIiApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTGlzdFR5cGUgKAorICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFN0cmluZyB2YWx1ZSwgRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgaW50IGVycm9yU3RhdGUgPSBfZXJyb3JTdGF0ZTsKKworICAgICAgICBpZiAoIXR5cGUubWF0Y2hQYXR0ZXJuRmFjZXQoIHZhbHVlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcigKKyAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAiTGlzdCAnIiArIHZhbHVlICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBpdGVtcyA9IFhtbExpc3RJbXBsLnNwbGl0X2xpc3QodmFsdWUpOworCisgICAgICAgIAorICAgICAgICBpbnQgaTsKKyAgICAgICAgWG1sT2JqZWN0IG87CisKKyAgICAgICAgaWYgKChvID0gdHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEggKSkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSAhPSBpdGVtcy5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEVycm9yKAorICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyB2YWx1ZSArICIpIGRvZXMgbm90IGhhdmUgIiArIGkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcyBwZXIgbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvID0gdHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIICkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgPiBpdGVtcy5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEVycm9yKAorICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyB2YWx1ZSArICIpIGhhcyBvbmx5ICIgKyBpdGVtcy5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChvID0gdHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIICkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgPCBpdGVtcy5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEVycm9yKAorICAgICAgICAgICAgICAgICAgICBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyB2YWx1ZSArICIpIGhhcyAiICsgaXRlbXMubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaXRlbXMsIG1vcmUgdGhhbiBtYXggbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVR5cGUgaXRlbVR5cGUgPSB0eXBlLmdldExpc3RJdGVtVHlwZSgpOworICAgICAgICBfbGlzdFZhbHVlID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBfbGlzdFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGl0ZW1zLmxlbmd0aCA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlU2ltcGxlVHlwZSgKKyAgICAgICAgICAgICAgICBpdGVtVHlwZSwgaXRlbXNbaV0sIGV2ZW50ICk7CisgICAgICAgICAgICBhZGRUb0xpc3QoaXRlbVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbm8gZXJyb3JzIHVwIHRvIHRoaXMgcG9pbnQsIHRoZW4gSSBjYW4gY3JlYXRlIGFuCisgICAgICAgIC8vIFhtbExpc3QgZnJvbSB0aGlzIHZhbHVlIGFuZCBjYW1wYXJlIGl0IGFnYWluIGVudW1zLgorCisgICAgICAgIGlmIChlcnJvclN0YXRlID09IF9lcnJvclN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTGlzdHMgd2hpY2ggY29udGFpbiBRTmFtZXMgd2lsbCBuZWVkIGEgcmVzb2x2ZXIKKworICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVzcGFjZUNvbnRleHQoIGV2ZW50ICkgKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGxpc3RWYWx1ZSA9ICggKFNjaGVtYVR5cGVJbXBsKSB0eXBlKS5uZXdWYWxpZGF0aW5nVmFsdWUoIHZhbHVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIkxpc3QgdmFsdWUgKCIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVW5pb25UeXBlICgKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUsIEV2ZW50IGV2ZW50ICkKKyAgICB7CisgICAgICAgIC8vIFRPRE8gLSBpZiB4c2k6dHlwZSBpcyBzcGVjaWZpZWQgb24gYSB1bmlvbiwgaXQgc2VsZWN0cworICAgICAgICAvLyB0aGF0IHVuaW9uIG1lbWJlciB0eXBlCisKKyAgICAgICAgaWYgKCF0eXBlLm1hdGNoUGF0dGVybkZhY2V0KCB2YWx1ZSApKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0RXJyb3IoCisgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGN1cnJlbnRXc3IgPSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOworICAgICAgICBTdHJpbmcgY3VycmVudFZhbHVlID0gdmFsdWU7CisKKyAgICAgICAgU2NoZW1hVHlwZVtdIHR5cGVzID0gdHlwZS5nZXRVbmlvbk1lbWJlclR5cGVzKCk7CisKKyAgICAgICAgaW50IG9yaWdpbmFsU3RhdGUgPSBfZXJyb3JTdGF0ZTsKKworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgdHlwZXMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1lbWJlcldzciA9IHR5cGVzWyBpIF0uZ2V0V2hpdGVTcGFjZVJ1bGUoKTsKKworICAgICAgICAgICAgaWYgKG1lbWJlcldzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgICAgIG1lbWJlcldzciA9IFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7CisKKyAgICAgICAgICAgIGlmIChtZW1iZXJXc3IgIT0gY3VycmVudFdzcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50V3NyID0gbWVtYmVyV3NyOworICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoIHZhbHVlLCBjdXJyZW50V3NyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBvcmlnaW5hbEVycm9yU3RhdGUgPSBfZXJyb3JTdGF0ZTsKKworICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMrKzsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVTaW1wbGVUeXBlKCB0eXBlc1sgaSBdLCBjdXJyZW50VmFsdWUsIGV2ZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N1c3BlbmRFcnJvcnMtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JTdGF0ZSA9PSBfZXJyb3JTdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdW5pb25UeXBlID0gdHlwZXNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfZXJyb3JTdGF0ZSA9IG9yaWdpbmFsU3RhdGU7CisKKyAgICAgICAgaWYgKGkgPj0gdHlwZXMubGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0RXJyb3IoCisgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKyAiJyBkb2VzIG5vdCBtYXRjaCBhbnkgbWVtYmVycyBvZiAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUodHlwZSkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdFtdIHVuaW9uRW51bXZhbHMgPSB0eXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisKKyAgICAgICAgICAgIGlmICh1bmlvbkVudW12YWxzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVW5pb25zIHdoaWNoIGNvbnRhaW4gUU5hbWVzIHdpbGwgbmVlZCBhIHJlc29sdmVyCisKKyAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2goIG5ldyBOYW1lc3BhY2VDb250ZXh0KCBldmVudCApICk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCB1bmlvblZhbHVlID0gdHlwZS5uZXdWYWx1ZSggdmFsdWUgKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCB1bmlvbkVudW12YWxzLmxlbmd0aCA7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlvblZhbHVlLnZhbHVlRXF1YWxzKCB1bmlvbkVudW12YWxzWyBpIF0gKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHVuaW9uRW51bXZhbHMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaW9uICciICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGlvbiB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHR5cGUpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHksIHRoZSBjdXJyZW50IHVuaW9uIGNvZGUgYWx3YXlzIGVuZHMgdXAgaGVyZSB3aGVuIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgZW1pdEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5pb24gJyIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZSh0eXBlKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRUb0xpc3QoU2NoZW1hVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuQVRPTUlDKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICh0eXBlLmdldFVuaW9uTWVtYmVyVHlwZXMoKS5sZW5ndGg+MCAmJiBnZXRVbmlvblR5cGUoKSE9bnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZSA9IGdldFVuaW9uVHlwZSgpOworICAgICAgICAgICAgX3VuaW9uVHlwZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBfbGlzdFR5cGVzLmFkZCh0eXBlKTsKKworICAgICAgICBzd2l0Y2ggKCB0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChfc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORyA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChfc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBfc3RyaW5nVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUwgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoIF9kZWNpbWFsVmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgX2RlY2ltYWxWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTiA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChfYm9vbGVhblZhbHVlID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIF9ib29sZWFuVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVCA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChuZXcgRmxvYXQoX2Zsb2F0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgX2Zsb2F0VmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGlzdFZhbHVlLmFkZChuZXcgRG91YmxlKF9kb3VibGVWYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBfZG91YmxlVmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9xbmFtZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgX3FuYW1lVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RUeXBlcy5hZGQoX3N0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19USU1FIDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURSA6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USCA6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUiA6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZIDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVkgOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9nZGF0ZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgX2dkYXRlVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9nZHVyYXRpb25WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIF9nZHVyYXRpb25WYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX2J5dGVBcnJheVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVBcnJheVZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9saXN0VmFsdWUuYWRkKF9ieXRlQXJyYXlWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIF9ieXRlQXJyYXlWYWx1ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT04gOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RWYWx1ZS5hZGQoX3N0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgX3N0cmluZ1ZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgcHJpbWl0aXZlIHR5cGUgY29kZSIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gTWVtYmVycyBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzCisgICAgLy8KKworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgIF9pbnZhbGlkOworICAgIHByaXZhdGUgU2NoZW1hVHlwZSAgICAgICAgIF9yb290VHlwZTsKKyAgICBwcml2YXRlIFNjaGVtYUZpZWxkICAgICAgICBfcm9vdEZpZWxkOworICAgIHByaXZhdGUgU2NoZW1hVHlwZUxvYWRlciAgIF9nbG9iYWxUeXBlczsKKyAgICBwcml2YXRlIENoYXJzICAgICAgICAgICAgICBfY2hhcnM7CisgICAgcHJpdmF0ZSBTdGF0ZSAgICAgICAgICAgICAgX3N0YXRlU3RhY2s7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgX2Vycm9yU3RhdGU7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uICAgICAgICAgX2Vycm9yTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBWYWxpZGF0b3JWQyAgICAgICAgX3ZjOworICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgIF9zdXNwZW5kRXJyb3JzOworICAgIHByaXZhdGUgSWRlbnRpdHlDb25zdHJhaW50IF9jb25zdHJhaW50RW5naW5lOworICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgIF9lYXRDb250ZW50OworCisgICAgcHJpdmF0ZSBTY2hlbWFMb2NhbEVsZW1lbnQgICBfbG9jYWxFbGVtZW50OworICAgIHByaXZhdGUgU2NoZW1hUGFydGljbGUgICAgICAgX3dpbGRjYXJkRWxlbWVudDsKKyAgICBwcml2YXRlIFNjaGVtYUxvY2FsQXR0cmlidXRlIF9sb2NhbEF0dHJpYnV0ZTsKKyAgICBwcml2YXRlIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIF93aWxkY2FyZEF0dHJpYnV0ZTsKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgICAgICAgICAgIF91bmlvblR5cGU7CisKKyAgICAvLyBTdHJvbmdseSB0eXBlZCB2YWx1ZXMKKyAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nVmFsdWU7CisgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9kZWNpbWFsVmFsdWU7CisgICAgcHJpdmF0ZSBib29sZWFuIF9ib29sZWFuVmFsdWU7CisgICAgcHJpdmF0ZSBmbG9hdCBfZmxvYXRWYWx1ZTsKKyAgICBwcml2YXRlIGRvdWJsZSBfZG91YmxlVmFsdWU7CisgICAgcHJpdmF0ZSBRTmFtZSBfcW5hbWVWYWx1ZTsKKyAgICBwcml2YXRlIEdEYXRlIF9nZGF0ZVZhbHVlOworICAgIHByaXZhdGUgR0R1cmF0aW9uIF9nZHVyYXRpb25WYWx1ZTsKKyAgICBwcml2YXRlIGJ5dGVbXSBfYnl0ZUFycmF5VmFsdWU7CisgICAgcHJpdmF0ZSBMaXN0IF9saXN0VmFsdWU7CisgICAgcHJpdmF0ZSBMaXN0IF9saXN0VHlwZXM7CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgX2xvY2FsQXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgX3dpbGRjYXJkQXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgX3N0cmluZ1ZhbHVlID0gbnVsbDsKKyAgICAgICAgX2RlY2ltYWxWYWx1ZSA9IG51bGw7CisgICAgICAgIF9ib29sZWFuVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgX2Zsb2F0VmFsdWUgPSAwOworICAgICAgICBfZG91YmxlVmFsdWUgPSAwOworICAgICAgICBfcW5hbWVWYWx1ZSA9IG51bGw7CisgICAgICAgIF9nZGF0ZVZhbHVlID0gbnVsbDsKKyAgICAgICAgX2dkdXJhdGlvblZhbHVlID0gbnVsbDsKKyAgICAgICAgX2J5dGVBcnJheVZhbHVlID0gbnVsbDsKKyAgICAgICAgX2xpc3RWYWx1ZSA9IG51bGw7CisgICAgICAgIF9saXN0VHlwZXMgPSBudWxsOworICAgICAgICBfdW5pb25UeXBlID0gbnVsbDsKKyAgICAgICAgX2xvY2FsQXR0cmlidXRlID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hTG9jYWxFbGVtZW50IGdldEN1cnJlbnRFbGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmIChfbG9jYWxFbGVtZW50ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2xvY2FsRWxlbWVudDsKKworICAgICAgICAvLyBpdCBtZWFucyB0aGUgZWxlbWVudCBpcyB0byBiZSBza2lwZWQgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhIGtub3duIFNjaGVtYUxvY2FsRWxlbWVudAorICAgICAgICBpZiAoX2VhdENvbnRlbnQ+MCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vdHJ5IGdldHRpbmcgaXQgZnJvbSB0aGUgc3RhY2sgKHRoaXMgc2hvdWxkIGhhcHBlbiBhZnRlciBFTkQpCisgICAgICAgIGlmIChfc3RhdGVTdGFjayE9bnVsbCAmJiBfc3RhdGVTdGFjay5fZmllbGQgaW5zdGFuY2VvZiBTY2hlbWFMb2NhbEVsZW1lbnQgKQorICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFMb2NhbEVsZW1lbnQpX3N0YXRlU3RhY2suX2ZpZWxkOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFQYXJ0aWNsZSBnZXRDdXJyZW50V2lsZGNhcmRFbGVtZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBfd2lsZGNhcmRFbGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFMb2NhbEF0dHJpYnV0ZSBnZXRDdXJyZW50QXR0cmlidXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfbG9jYWxBdHRyaWJ1dGU7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIGdldEN1cnJlbnRXaWxkY2FyZEF0dHJpYnV0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gX3dpbGRjYXJkQXR0cmlidXRlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9zdHJpbmdWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXREZWNpbWFsVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9kZWNpbWFsVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfYm9vbGVhblZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZmxvYXRWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZG91YmxlVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFFOYW1lVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9xbmFtZVZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZ2RhdGVWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgR0R1cmF0aW9uIGdldEdEdXJhdGlvblZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZ2R1cmF0aW9uVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gX2J5dGVBcnJheVZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldExpc3RWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gX2xpc3RWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VHlwZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9saXN0VHlwZXM7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgZ2V0VW5pb25UeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdW5pb25UeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCYXNlNjRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDNkNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkJhc2U2NDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJhc2U2NEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQkFTRV82NF9CSU5BUlk7IH0KKworICAgIHByb3RlY3RlZCBieXRlW10gX3ZhbHVlOworCisgICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKF92YWx1ZSkpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIF9oYXNoY2FjaGVkID0gZmFsc2U7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgX3ZhbHVlID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF92YWx1ZSA9IGxleChzLCBfdm9vclZjKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOworICAgICAgICBfdmFsdWUgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGxleChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgYykKKyAgICB7CisgICAgICAgIGJ5dGVbXSB2Qnl0ZXMgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdkJ5dGVzID0gdi5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiAtIFVURi04IGlzIGFsd2F5cyBzdXBwb3J0ZWQKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHZCeXRlcyk7CisKKyAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBnZXQgYSBkZWNlbnQgZXJyb3Igd2l0aCBsaW5lIG51bWJlcnMgYW5kIHN1Y2ggaGVyZQorICAgICAgICAgICAgYy5pbnZhbGlkKCJCYXNlIDY0IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKKyAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiQmFzZSA2NCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2RhdGVkKCk7CisgICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtfdmFsdWUubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfdmFsdWUsIDAsIHJlc3VsdCwgMCwgX3ZhbHVlLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gc2V0dGVycworICAgIHByb3RlY3RlZCB2b2lkIHNldF9CeXRlQXJyYXkoYnl0ZVtdIGJhKQorICAgIHsKKyAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgX3ZhbHVlID0gbmV3IGJ5dGVbYmEubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShiYSwgMCwgX3ZhbHVlLCAwLCBiYS5sZW5ndGgpOworICAgIH0KKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IGkpCisgICAgeworICAgICAgICBieXRlW10gaXZhbCA9ICgoWG1sQmFzZTY0QmluYXJ5KSBpKS5nZXRCeXRlQXJyYXlWYWx1ZSgpOworICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhfdmFsdWUsIGl2YWwpOworICAgIH0KKworICAgIC8vYmVjYXVzZSBjb21wdXRpbmcgaGFzaGNvZGUgaXMgZXhwZW5zaXZlIHdlJ2xsIGNhY2hlIGl0CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX2hhc2hjYWNoZWQgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgaW50IGhhc2hjb2RlID0gMDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbWQ1OworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBmaW5kIE1ENSBoYXNoIEFsZ29yaXRobSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgaWYoIF9oYXNoY2FjaGVkICkKKyAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKKworICAgICAgICBfaGFzaGNhY2hlZCA9IHRydWU7CisKKyAgICAgICAgaWYoIF92YWx1ZSA9PSBudWxsICkKKyAgICAgICAgICAgIHJldHVybiBoYXNoY29kZSA9IDA7CisKKyAgICAgICAgYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3QoX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gcmVzWzBdPDwyNCArIHJlc1sxXTw8MTYgKyByZXNbMl08PDggKyByZXNbM107CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQmFzZTY0SG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZmM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJhc2U2NEhvbGRlckV4LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFCYXNlNjRIb2xkZXJFeCBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXIKK3sKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHB1YmxpYyBKYXZhQmFzZTY0SG9sZGVyRXgoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5nZXRXaGl0ZVNwYWNlUnVsZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIHY7CisKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2ID0gdmFsaWRhdGVMZXhpY2FsKHMsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBsZXgocywgX3Zvb3JWYyk7CisKKyAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiBfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIFhtbE9iamVjdEJhc2UuX3Zvb3JWYyk7CisgICAgICAgIAorICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOworICAgIH0KKworICAgIC8vIHNldHRlcnMKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSB2KQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIHNjaGVtYVR5cGUoKSwgX3Zvb3JWYyk7CisgICAgICAgIAorICAgICAgICBzdXBlci5zZXRfQnl0ZUFycmF5KHYpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGJ5dGVbXSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIFhtbE9iamVjdCBvOworCisgICAgICAgIGlmICgobyA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKSkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChpID0gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpICE9IHYubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkJhc2UgNjQgZW5jb2RlZCBkYXRhIGRvZXMgbm90IGhhdmUgIiArIGkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBwZXIgbGVuZ3RoIGZhY2V0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBoYXMgb25seSAiICsgdi5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCApKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPCB2Lmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJCYXNlIDY0IGVuY29kZWQgZGF0YSBoYXMgIiArIHYubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsIG1vcmUgdGhhbiBtYXggbGVuZ3RoIGZhY2V0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKKworICAgICAgICBpZiAodmFscyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBlbnVtTG9vcDogZm9yICggaSA9IDAgOyBpIDwgdmFscy5sZW5ndGggOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBlbnVtQnl0ZXMgPSAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuYnl0ZUFycmF5VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXMubGVuZ3RoICE9IHYubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGZvciAoIGludCBqID0gMCA7IGogPCBlbnVtQnl0ZXMubGVuZ3RoIDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1CeXRlc1tqXSAhPSB2W2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgZW51bUxvb3A7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IHZhbHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiQmFzZSA2NCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUoYnl0ZUFycmF5VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2ZDUwZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFCb29sZWFuSG9sZGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJvb2xlYW5Ib2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0JPT0xFQU47IH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBfdmFsdWU7CisKKyAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3ZhbHVlID8gInRydWUiIDogImZhbHNlIjsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgX3ZhbHVlID0gdmFsaWRhdGVMZXhpY2FsKHMsIF92b29yVmMpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKHYuZXF1YWxzKCJ0cnVlIikgfHwgdi5lcXVhbHMoIjEiKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKHYuZXF1YWxzKCJmYWxzZSIpIHx8IHYuZXF1YWxzKCIwIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnZhbGlkIHZhbHVlIGZvciBib29sZWFuOiAiICsgdik7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKKyAgICB7CisgICAgICAgIF92YWx1ZSA9IGZhbHNlOworICAgIH0KKyAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAorICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgLy8gc2V0dGVycworICAgIHByb3RlY3RlZCB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gZikKKyAgICB7CisgICAgICAgIF92YWx1ZSA9IGY7CisgICAgfQorCisgICAgLy8gY29tcGFyYXRvcnMKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGkpCisgICAgeworICAgICAgICAvLyBubyBvcmRlcmluZyBkZWZpbmVkIGJldHdlZW4gdHJ1ZSBhbmQgZmFsc2UKKyAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbEJvb2xlYW4paSkuZ2V0Qm9vbGVhblZhbHVlKCkgPyAwIDogMjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxCb29sZWFuKWkpLmdldEJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUgPyA5NTczNzk1NTQgOiA2NzYzMzU5NzU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUJvb2xlYW5Ib2xkZXJFeC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjY5N2MKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhQm9vbGVhbkhvbGRlckV4LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CisKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUJvb2xlYW5Ib2xkZXJFeCBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyCit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOworCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBiID0gSmF2YUJvb2xlYW5Ib2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOworICAgICAgICB2YWxpZGF0ZVBhdHRlcm4odiwgc1R5cGUsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGF0dGVybihTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIC8vIHRoZSBvbmx5IG5ldyBmYWNldCB0aGF0IGNhbiBhcHBseSB0byBib29sZWFucyBpcyBwYXR0ZXJuIQorICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJCb29sZWFuICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSmF2YUJvb2xlYW5Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVBhdHRlcm4ocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMDlkMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CisKK3B1YmxpYyBjbGFzcyBKYXZhRGVjaW1hbEhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfREVDSU1BTDsgfQorCisgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF92YWx1ZTsKKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gc2V0cy9nZXRzIHJhdyB0ZXh0IHZhbHVlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZS50b1N0cmluZygpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0X0JpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwocykpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Zvb3JWYy5pbnZhbGlkKCJJbnZhbGlkIERlY2ltYWwiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKKyAgICB7CisgICAgICAgIF92YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgbGV4aWNhbCB2YWxpZGF0aW9uIG9ubHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgLy8gVE9ETyAtIHdpbGwgd2FudCB0byB2YWxpZGF0ZSBDaGFycyB3aXRoIGJ1aWx0IGluIHdoaXRlIHNwYWNlIGhhbmRsaW5nCisgICAgICAgIC8vICAgICAgICBIb3dldmVyLCB0aGlzIGZjbiBzb21ldGltZXMgdGFrZXMgYSB2YWx1ZSB3aXRoIHdzciBhcHBsaWVkCisgICAgICAgIC8vICAgICAgICBhbHJlYWR5CisgICAgICAgIGludCBsID0gdi5sZW5ndGgoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICAKKyAgICAgICAgaWYgKGkgPCBsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2ggPSB2LmNoYXJBdChpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIHNhd0RvdCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNhd0RpZ2l0ID0gZmFsc2U7CisKKyAgICAgICAgZm9yICggOyBpIDwgbCA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaCA9IHYuY2hhckF0KGkpOworCisgICAgICAgICAgICBpZiAoY2ggPT0gJy4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzYXdEb3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIklsbGVnYWwgZGVjaW1hbCwgc2F3ICcuJyBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2F3RG90ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2F3RGlnaXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBtYXkgbmVlZCB0byBlc2NhcGUgZXJyb3IgY2hhcgorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSWxsZWdhbCBkZWNpbWFsLCB1bmV4cGVjdGVkIGNoYXI6ICIgKyBjaCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzYXdEaWdpdCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbGxlZ2FsIGRlY2ltYWwsIGV4cGVjdGVkIGF0IGxlYXN0IG9uZSBkaWdpdCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KKworICAgIC8vIHNldHRlcnMKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgX3ZhbHVlID0gdjsgfQorCisgICAgLy8gY29tcGFyYXRvcnMKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGRlY2ltYWwpCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUbygoKFhtbE9iamVjdEJhc2UpZGVjaW1hbCkuYmlnRGVjaW1hbFZhbHVlKCkpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZGVjaW1hbCkKKyAgICB7CisgICAgICAgIHJldHVybiAoX3ZhbHVlLmNvbXBhcmVUbygoKFhtbE9iamVjdEJhc2UpZGVjaW1hbCkuYmlnRGVjaW1hbFZhbHVlKCkpKSA9PSAwOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21heGxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOworICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21pbmxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpOworCisgICAgLyoqCisgICAgICogTm90ZSwgdGhpcyBpcyBjYXJlZnVsbHkgYWxpZ25lZCB3aXRoIGhhc2ggY29kZXMgZm9yIGFsbCB4c2Q6ZGVjaW1hbAorICAgICAqIHByaW1pdGl2ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKF92YWx1ZS5zY2FsZSgpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF92YWx1ZS5zZXRTY2FsZSgwLCBCaWdEZWNpbWFsLlJPVU5EX0RPV04pLmNvbXBhcmVUbyhfdmFsdWUpICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY2ltYWxIYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQmlnSW50ZWdlciBpbnR2YWwgPSBfdmFsdWUudG9CaWdJbnRlZ2VyKCk7CisKKyAgICAgICAgaWYgKGludHZhbC5jb21wYXJlVG8oX21heGxvbmcpID4gMCB8fAorICAgICAgICAgICAgaW50dmFsLmNvbXBhcmVUbyhfbWlubG9uZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGludHZhbC5oYXNoQ29kZSgpOworCisgICAgICAgIGxvbmcgbG9uZ3ZhbCA9IGludHZhbC5sb25nVmFsdWUoKTsKKworICAgICAgICByZXR1cm4gKGludCkoKGxvbmd2YWwgPj4gMzIpICogMTkgKyBsb25ndmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhcyBCaWdEZWNpbWFscyB3aXRoIHRoZSBzYW1lIGFyaXRobWV0aWMgdmFsdWUgdG8KKyAgICAgKiB0aGUgc2FtZSBoYXNoIGNvZGUgKGVnLCAyLjMgJiAyLjMwIHdpbGwgaGF2ZSB0aGUgc2FtZSBoYXNoLikKKyAgICAgKiBUaGlzIGRpZmZlcnMgZnJvbSBCaWdEZWNpbWFsLmhhc2hDb2RlKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGRlY2ltYWxIYXNoQ29kZSgpIHsKKyAgICAgICAgYXNzZXJ0IF92YWx1ZS5zY2FsZSgpID4gMDsKKworICAgICAgICAvLyBHZXQgZGVjaW1hbCB2YWx1ZSBhcyBzdHJpbmcsIGFuZCBzdHJpcCBvZmYgemVyb2VzIG9uIHRoZSByaWdodAorICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBfdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IHN0clZhbHVlLmxlbmd0aCgpIC0gMSA7IGkgPj0gMCA7IGkgLS0pCisgICAgICAgICAgICBpZiAoc3RyVmFsdWUuY2hhckF0KGkpICE9ICcwJykgYnJlYWs7CisKKyAgICAgICAgYXNzZXJ0IHN0clZhbHVlLmluZGV4T2YoJy4nKSA8IGk7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW5vbmljYWxpemVkIHN0cmluZyBoYXNoY29kZQorICAgICAgICByZXR1cm4gc3RyVmFsdWUuc3Vic3RyaW5nKDAsIGkgKyAxKS5oYXNoQ29kZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFEZWNpbWFsSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWVhYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURlY2ltYWxIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKKworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRGVjaW1hbEhvbGRlckV4IGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXIKK3sKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHB1YmxpYyBKYXZhRGVjaW1hbEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisKKyAgICAgICAgQmlnRGVjaW1hbCB2ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHYgPSBuZXcgQmlnRGVjaW1hbChzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF92b29yVmMuaW52YWxpZCgiSW52YWxpZCBEZWNpbWFsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOworCisgICAgICAgIHN1cGVyLnNldF9CaWdEZWNpbWFsKHYpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodiwgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICBzdXBlci5zZXRfQmlnRGVjaW1hbCh2KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKKyAgICAgICAgCisgICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KKyAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZXNjcmliZSBzdHJpbmcgYW5kIHBhdHRlcm4gaGVyZSBpbiBlcnJvcgorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGVjaW1hbCAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBmYWNldCB2YWxpZGF0aW9uIG9ubHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShCaWdEZWNpbWFsIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICAvLyBmcmFjdGlvbmFsIGRpZ2l0cworICAgICAgICBYbWxPYmplY3QgZmQgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUyk7CisgICAgICAgIGlmIChmZCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2NhbGUgPSAoKFhtbE9iamVjdEJhc2UpZmQpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodi5zY2FsZSgpID4gc2NhbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCBmcmFjdGlvbmFsIGRpZ2l0cyAoIiArIHYuc2NhbGUoKSArICIpIGRvZXMgbm90IG1hdGNoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImZyYWN0aW9uYWwgZGlnaXRzIGZhY2V0ICgiICsgc2NhbGUgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdG90YWwgZGlnaXRzCisgICAgICAgIFhtbE9iamVjdCB0ZCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfVE9UQUxfRElHSVRTKTsKKyAgICAgICAgaWYgKHRkICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gdi51bnNjYWxlZFZhbHVlKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCB0ZGYgPSAoKFhtbE9iamVjdEJhc2UpdGQpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gdGVtcC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIHRlbXAuY2hhckF0KDApID09ICctJykKKyAgICAgICAgICAgICAgICBsZW4gLT0gMTsKKyAgICAgICAgICAgIGlmIChsZW4gPiB0ZGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCB0b3RhbCBkaWdpdHMgKCIgKyB0ZW1wICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGRpZ2l0cyBmYWNldCAoIiArIHRkZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtaW4gZXgKKyAgICAgICAgWG1sT2JqZWN0IG1pbmUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpOworICAgICAgICBpZiAobWluZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWluZSkuYmlnRGVjaW1hbFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJEZWNpbWFsICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtaW4gaW4KKyAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOworICAgICAgICBpZiAobWluaSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdEZWNpbWFsIG0gPSAoKFhtbE9iamVjdEJhc2UpbWluaSkuYmlnRGVjaW1hbFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodi5jb21wYXJlVG8obSkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heCBpbgorICAgICAgICBYbWxPYmplY3QgbWF4aSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSk7CisgICAgICAgIGlmIChtYXhpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXhpKS5iaWdEZWNpbWFsVmFsdWUoKTsKKyAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUbyhtKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWF4IGV4CisgICAgICAgIFhtbE9iamVjdCBtYXhlID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFKTsKKyAgICAgICAgaWYgKG1heGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQmlnRGVjaW1hbCBtID0gKChYbWxPYmplY3RCYXNlKW1heGUpLmJpZ0RlY2ltYWxWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvKG0pID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZW51bWVyYXRpb24KKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJpZ0RlY2ltYWxWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEZWNpbWFsICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIGFueSBlbnVtZXJhdGlvbiB2YWx1ZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICAgICAgdmFsaWRhdGVWYWx1ZShiaWdEZWNpbWFsVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2Y0NTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRG91YmxlSG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQoreworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9ET1VCTEU7IH0KKworICAgIGRvdWJsZSBfdmFsdWU7CisKKyAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGdldHMvc2V0cyByYXcgdGV4dCB2YWx1ZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBzZXJpYWxpemUoX3ZhbHVlKTsgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKGRvdWJsZSBkKQorICAgIHsKKyAgICAgICAgaWYgKGQgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKQorICAgICAgICAgICAgcmV0dXJuICJJTkYiOworICAgICAgICBlbHNlIGlmIChkID09IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkKKyAgICAgICAgICAgIHJldHVybiAiLUlORiI7CisgICAgICAgIGVsc2UgaWYgKGQgPT0gRG91YmxlLk5hTikKKyAgICAgICAgICAgIHJldHVybiAiTmFOIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERvdWJsZS50b1N0cmluZyhkKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzZXRfZG91YmxlKHZhbGlkYXRlTGV4aWNhbChzLF92b29yVmMpKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2LmVxdWFscygiSU5GIikpICByZXR1cm4gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCItSU5GIikpIHJldHVybiBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICBpZiAodi5lcXVhbHMoIk5hTiIpKSAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW52YWxpZCBkb3VibGUgdmFsdWUiKTsKKworICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47CisgICAgICAgIH0KKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdmFsdWUgPSAwLjA7CisgICAgfQorCisgICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9CisgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQorICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gKGZsb2F0KV92YWx1ZTsgfQorCisgICAgLy8gc2V0dGVycworICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpIHsgX3ZhbHVlID0gdjsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KSB7IHNldF9kb3VibGUoKGRvdWJsZSl2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikgeyBzZXRfZG91YmxlKChkb3VibGUpdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X2RvdWJsZSh2LmRvdWJsZVZhbHVlKCkpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KSB7IHNldF9kb3VibGUodi5kb3VibGVWYWx1ZSgpKTsgfQorCisgICAgLy8gY29tcGFyYXRvcnMKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGQpCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyZShfdmFsdWUsKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICBzdGF0aWMgaW50IGNvbXBhcmUoZG91YmxlIHRoaXNWYWx1ZSwgZG91YmxlIHRoYXRWYWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh0aGlzVmFsdWUgPCB0aGF0VmFsdWUpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHRoaXNWYWx1ZSA+IHRoYXRWYWx1ZSkgcmV0dXJuICAxOworCisgICAgICAgIGxvbmcgdGhpc0JpdHMgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzVmFsdWUpOworICAgICAgICBsb25nIHRoYXRCaXRzID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhhdFZhbHVlKTsKKworICAgICAgICByZXR1cm4gdGhpc0JpdHMgPT0gdGhhdEJpdHMgPyAwIDogdGhpc0JpdHMgPCB0aGF0Qml0cyA/IC0xIDogMTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgZCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKWQpLmRvdWJsZVZhbHVlKCkpID09IDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgbG9uZyB2ID0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIChpbnQpKCh2ID4+IDMyKSAqIDE5ICsgdik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRG91YmxlSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYyNDBiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YURvdWJsZUhvbGRlckV4LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFEb3VibGVIb2xkZXJFeCBleHRlbmRzIEphdmFEb3VibGVIb2xkZXIKK3sKKyAgICBwdWJsaWMgSmF2YURvdWJsZUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorICAgIAorICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdikKKyAgICB7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgICAgIHN1cGVyLnNldF9kb3VibGUodik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgZG91YmxlIGQgPSBKYXZhRG91YmxlSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKKworICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEb3VibGUgKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoZG91YmxlIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgZG91YmxlIGQ7CisKKyAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZCA9ICgoWG1sT2JqZWN0QmFzZSl4KS5kb3VibGVWYWx1ZSgpKSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGQgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJEb3VibGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBkICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBkID0gKChYbWxPYmplY3RCYXNlKXgpLmRvdWJsZVZhbHVlKCkpID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiRG91YmxlICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZCArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZG91YmxlVmFsdWUoKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEb3VibGUgKCIgKyB2ICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUoZG91YmxlVmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUZsb2F0SG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyNTg1NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUZsb2F0SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQoreworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9GTE9BVDsgfQorCisgICAgcHJpdmF0ZSBmbG9hdCBfdmFsdWU7CisKKyAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGdldHMrc2V0cyByYXcgdGV4dCB2YWx1ZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7CisgICAgICAgIHJldHVybiBzZXJpYWxpemUoX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoZmxvYXQgZikKKyAgICB7CisgICAgICAgIGlmIChmID09IEZsb2F0LlBPU0lUSVZFX0lORklOSVRZKQorICAgICAgICAgICAgcmV0dXJuICJJTkYiOworICAgICAgICBlbHNlIGlmIChmID09IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZKQorICAgICAgICAgICAgcmV0dXJuICItSU5GIjsKKyAgICAgICAgZWxzZSBpZiAoZiA9PSBGbG9hdC5OYU4pCisgICAgICAgICAgICByZXR1cm4gIk5hTiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC50b1N0cmluZyhmKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzZXRfZmxvYXQodmFsaWRhdGVMZXhpY2FsKHMsX3Zvb3JWYykpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdCh2KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJJTkYiKSkgIHJldHVybiBGbG9hdC5QT1NJVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIGlmICh2LmVxdWFscygiLUlORiIpKSByZXR1cm4gRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFk7CisgICAgICAgICAgICBpZiAodi5lcXVhbHMoIk5hTiIpKSAgcmV0dXJuIEZsb2F0Lk5hTjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnZhbGlkIGZsb2F0IHZhbHVlIik7CisKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC5OYU47CisgICAgICAgIH0KKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdmFsdWUgPSAwLjBmOworICAgIH0KKyAgICAvLyBudW1lcmljczogZnJhY3Rpb25hbAorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKF92YWx1ZSk7IH0KKyAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9CisgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KKworICAgIC8vIHNldHRlcnMKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2KSB7IHNldF9mbG9hdCgoZmxvYXQpdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikgeyBfdmFsdWUgPSB2OyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KSB7IHNldF9mbG9hdCgoZmxvYXQpdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X2Zsb2F0KHYuZmxvYXRWYWx1ZSgpKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikgeyBzZXRfZmxvYXQodi5mbG9hdFZhbHVlKCkpOyB9CisKKyAgICAvLyBjb21wYXJhdG9ycworICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgZikKKyAgICB7CisgICAgICAgIHJldHVybiBjb21wYXJlKF92YWx1ZSwoKFhtbE9iamVjdEJhc2UpZikuZmxvYXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGNvbXBhcmUoZmxvYXQgdGhpc1ZhbHVlLCBmbG9hdCB0aGF0VmFsdWUpCisgICAgeworICAgICAgICBpZiAodGhpc1ZhbHVlIDwgdGhhdFZhbHVlKSByZXR1cm4gLTE7CisgICAgICAgIGlmICh0aGlzVmFsdWUgPiB0aGF0VmFsdWUpIHJldHVybiAgMTsKKworICAgICAgICBpbnQgdGhpc0JpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyh0aGlzVmFsdWUpOworICAgICAgICBpbnQgdGhhdEJpdHMgPSBGbG9hdC5mbG9hdFRvSW50Qml0cyh0aGF0VmFsdWUpOworCisgICAgICAgIHJldHVybiB0aGlzQml0cyA9PSB0aGF0Qml0cyA/IDAgOiB0aGlzQml0cyA8IHRoYXRCaXRzID8gLTEgOiAxOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUoX3ZhbHVlLCAoKFhtbE9iamVjdEJhc2UpZikuZmxvYXRWYWx1ZSgpKSA9PSAwOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBGbG9hdC5mbG9hdFRvSW50Qml0cyhfdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFGbG9hdEhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXJFeC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhRmxvYXRIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKKworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhRmxvYXRIb2xkZXJFeCBleHRlbmRzIEphdmFGbG9hdEhvbGRlcgoreworICAgIHB1YmxpYyBKYXZhRmxvYXRIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKyAgICAKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgc3VwZXIuc2V0X2Zsb2F0KHYpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0IHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIGZsb2F0IGYgPSBKYXZhRmxvYXRIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOworCisgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGY7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVZhbHVlKGZsb2F0IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgZmxvYXQgZjsKKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCBmID0gKChYbWxPYmplY3RCYXNlKXgpLmZsb2F0VmFsdWUoKSkgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKSkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBhcmUodiwgZiA9ICgoWG1sT2JqZWN0QmFzZSl4KS5mbG9hdFZhbHVlKCkpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJGbG9hdCAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGYgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlKHYsIGYgPSAoKFhtbE9iamVjdEJhc2UpeCkuZmxvYXRWYWx1ZSgpKSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkZsb2F0ICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZiArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZSh2LCAoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZmxvYXRWYWx1ZSgpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkZsb2F0ICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICAgICAgdmFsaWRhdGVWYWx1ZShmbG9hdFZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFHRGF0ZUhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODA0M2MKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0RhdGVIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUdEYXRlSG9sZGVyRXggZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIEphdmFHRGF0ZUhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgIHsKKyAgICAgICAgX3NjaGVtYVR5cGUgPSB0eXBlOworICAgICAgICBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOworICAgIHByaXZhdGUgR0RhdGUgX3ZhbHVlOworCisgICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBzZXRzL2dldHMgcmF3IHRleHQgdmFsdWUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKKyAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZS50b1N0cmluZygpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIEdEYXRlIG5ld1ZhbDsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICBuZXdWYWwgPSB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuZXdWYWwgPSBsZXgocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOworCisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpICYmIG5ld1ZhbCAhPSBudWxsKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuZXdWYWwsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBfdmFsdWUgPSBuZXdWYWw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBHRGF0ZSBsZXgoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBHRGF0ZSBkYXRlID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBkYXRlID0gbmV3IEdEYXRlKHYpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlIHZhbHVlIGlzIG1hbGZvcm1lZDogIit2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRlICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRlLmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgdmFsdWUgaXMgb2Ygd3JvbmcgdHlwZTogIiArIHYpOworICAgICAgICAgICAgICAgIGRhdGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGUuaXNWYWxpZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSB2YWx1ZSBpcyBpbnZhbGlkOiAiICsgdik7CisgICAgICAgICAgICAgICAgZGF0ZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdEYXRlIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisKKyAgICAgICAgR0RhdGUgZGF0ZSA9IGxleCh2LCBzVHlwZSwgY29udGV4dCk7CisKKyAgICAgICAgaWYgKGRhdGUgIT0gbnVsbCAmJiBzVHlwZS5oYXNQYXR0ZXJuRmFjZXQoKSkKKyAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgnICsgdiArICcpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGRhdGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoR0RhdGVTcGVjaWZpY2F0aW9uIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgR0RhdGUgZzsKKyAgICAgICAgCisgICAgICAgIGlmICh2LmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBkb2VzIG5vdCBoYXZlIHRoZSBzZXQgb2YgZmllbGRzIHJlcXVpcmVkIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9FWENMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpIDw9IDApCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEYXRlICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0RhdGUoZyA9ICgoWG1sT2JqZWN0QmFzZSl4KS5nRGF0ZVZhbHVlKCkpIDwgMCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG1pbiBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKKyAgICAgICAgCisgICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0VYQ0xVU0lWRSkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZShnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEYXRlVmFsdWUoKSkgPj0gMCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKKyAgICAgICAgCisgICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRSkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZShnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEYXRlVmFsdWUoKSkgPiAwKQorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRGF0ZSAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gbWF4IGluY2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOworICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAodi5jb21wYXJlVG9HRGF0ZSgoKFhtbE9iamVjdEJhc2UpdmFsc1tpXSkuZ0RhdGVWYWx1ZSgpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkRhdGUgKCIgKyB2ICsgIikgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRpb24gdmFsdWUgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdmFsdWUgPSBudWxsOworICAgIH0KKworICAgIC8vIG51bWVyaWNzOiBnWWVhciwgZ01vbnRoLCBnRGF5IGFjY2VwdCBhbiBpbnRlZ2VyCisgICAgcHVibGljIGludCBpbnRWYWx1ZSgpCisgICAgeworICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisKKyAgICAgICAgaWYgKGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfR19EQVkgJiYKKyAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggJiYKKyAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfWUVBUikKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICBjaGVja19kYXRlZCgpOworCisgICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlLmdldERheSgpOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIOgorICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWUuZ2V0TW9udGgoKTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWUuZ2V0WWVhcigpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBHRGF0ZSBnRGF0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2RhdGVkKCk7CisKKyAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIF92YWx1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQorICAgIHsKKyAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKworICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gX3ZhbHVlLmdldENhbGVuZGFyKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZGF0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2RhdGVkKCk7CisKKyAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5nZXREYXRlKCk7CisgICAgfQorCisgICAgLy8gc2V0dGVycworICAgIHByb3RlY3RlZCB2b2lkIHNldF9pbnQoaW50IHYpCisgICAgeworICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisKKyAgICAgICAgaWYgKGNvZGUgIT0gU2NoZW1hVHlwZS5CVENfR19EQVkgJiYKKyAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfTU9OVEggJiYKKyAgICAgICAgICAgICAgICBjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0dfWUVBUikKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICBHRGF0ZUJ1aWxkZXIgdmFsdWUgPSBuZXcgR0RhdGVCdWlsZGVyKCk7CisKKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfREFZOgorICAgICAgICAgICAgICAgIHZhbHVlLnNldERheSh2KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0TW9udGgodik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0WWVhcih2KTsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodmFsdWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBfdmFsdWUgPSB2YWx1ZS50b0dEYXRlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiB2KQorICAgIHsKKyAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOworCisgICAgICAgIEdEYXRlIGNhbmRpZGF0ZTsKKworICAgICAgICBpZiAodi5pc0ltbXV0YWJsZSgpICYmICh2IGluc3RhbmNlb2YgR0RhdGUpICYmIHYuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gY29kZSkKKyAgICAgICAgICAgIGNhbmRpZGF0ZSA9IChHRGF0ZSl2OworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRydW5jYXRlIGV4dHJhIGZpZWxkcyBmcm9tIHRoZSBkYXRlIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIGlmICh2LmdldEJ1aWx0aW5UeXBlQ29kZSgpICE9IGNvZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodik7CisgICAgICAgICAgICAgICAgZ0RhdGVCdWlsZGVyLnNldEJ1aWx0aW5UeXBlQ29kZShjb2RlKTsKKyAgICAgICAgICAgICAgICB2ID0gZ0RhdGVCdWlsZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FuZGlkYXRlID0gbmV3IEdEYXRlKHYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKGNhbmRpZGF0ZSwgX3NjaGVtYVR5cGUsIF92b29yVmMpOworCisgICAgICAgIF92YWx1ZSA9IGNhbmRpZGF0ZTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NhbGVuZGFyKENhbGVuZGFyIGMpCisgICAgeworICAgICAgICBpbnQgY29kZSA9IHNjaGVtYVR5cGUoKS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisKKyAgICAgICAgR0RhdGVCdWlsZGVyIGdEYXRlQnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIoYyk7CisgICAgICAgIGdEYXRlQnVpbGRlci5zZXRCdWlsdGluVHlwZUNvZGUoY29kZSk7CisgICAgICAgIEdEYXRlIHZhbHVlID0gZ0RhdGVCdWlsZGVyLnRvR0RhdGUoKTsKKyAKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHZhbHVlLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisKKyAgICAgICAgX3ZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0RhdGUoRGF0ZSB2KQorICAgIHsKKyAgICAgICAgaW50IGNvZGUgPSBzY2hlbWFUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpOworCisgICAgICAgIGlmIChjb2RlICE9IFNjaGVtYVR5cGUuQlRDX0RBVEUgJiYgY29kZSAhPSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgfHwKKyAgICAgICAgICAgIHYgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICBHRGF0ZUJ1aWxkZXIgZ0RhdGVCdWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih2KTsKKyAgICAgICAgZ0RhdGVCdWlsZGVyLnNldEJ1aWx0aW5UeXBlQ29kZShjb2RlKTsKKyAgICAgICAgR0RhdGUgdmFsdWUgPSBnRGF0ZUJ1aWxkZXIudG9HRGF0ZSgpOworIAorICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlVmFsdWUodmFsdWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBvYmopCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUb0dEYXRlKCgoWG1sT2JqZWN0QmFzZSlvYmopLmdEYXRlVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlvYmopLmdEYXRlVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUoZ0RhdGVWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhR0R1cmF0aW9uSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVkN2YzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUdEdXJhdGlvbkhvbGRlckV4LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblNwZWNpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFHRHVyYXRpb25Ib2xkZXJFeCBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgSmF2YUdEdXJhdGlvbkhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorCisgICAgR0R1cmF0aW9uIF92YWx1ZTsKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgR0R1cmF0aW9uIG5ld1ZhbDsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICBuZXdWYWwgPSB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuZXdWYWwgPSBsZXgocywgX3Zvb3JWYyk7CisKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgbmV3VmFsICE9IG51bGwpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKG5ld1ZhbCwgX3NjaGVtYVR5cGUsIF92b29yVmMpOworCisgICAgICAgIF92YWx1ZSA9IG5ld1ZhbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gdikKKyAgICB7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgICAgIAorICAgICAgICBpZiAodi5pc0ltbXV0YWJsZSgpICYmICh2IGluc3RhbmNlb2YgR0R1cmF0aW9uKSkKKyAgICAgICAgICAgIF92YWx1ZSA9IChHRHVyYXRpb24pdjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3ZhbHVlID0gbmV3IEdEdXJhdGlvbih2KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKKyAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAiIiA6IF92YWx1ZS50b1N0cmluZygpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKKyAgICB7CisgICAgICAgIF92YWx1ZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpCisgICAgeworICAgICAgICBjaGVja19kYXRlZCgpOworCisgICAgICAgIHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBHRHVyYXRpb24gbGV4KFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgR0R1cmF0aW9uIGR1cmF0aW9uID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IG5ldyBHRHVyYXRpb24odik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uIHZhbHVlIGlzIG1hbGZvcm1lZDogIit2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkdXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdEdXJhdGlvbiB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBHRHVyYXRpb24gZHVyYXRpb24gPSBsZXgodiwgY29udGV4dCk7CisKKyAgICAgICAgaWYgKGR1cmF0aW9uICE9IG51bGwgJiYgc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCisgICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZHVyYXRpb247CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHg7CisgICAgICAgIEdEdXJhdGlvbiBnOworICAgICAgICAKKyAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpIDw9IDApCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJEdXJhdGlvbiAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIGcgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSApOworICAgICAgICAKKyAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fSU5DTFVTSVZFKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmICh2LmNvbXBhcmVUb0dEdXJhdGlvbihnID0gKChYbWxPYmplY3RCYXNlKXgpLmdEdXJhdGlvblZhbHVlKCkpIDwgMCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPj0gMCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtYXggZXhjbHVzaXZlIGZhY2V0ICgiICsgZyArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpKSAhPSBudWxsKQorICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKGcgPSAoKFhtbE9iamVjdEJhc2UpeCkuZ0R1cmF0aW9uVmFsdWUoKSkgPiAwKQorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiRHVyYXRpb24gKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG1heCBpbmNsdXNpdmUgZmFjZXQgKCIgKyBnICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKKyAgICAgICAgCisgICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOworICAgICAgICBpZiAodmFscyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHYuY29tcGFyZVRvR0R1cmF0aW9uKCgoWG1sT2JqZWN0QmFzZSl2YWxzW2ldKS5nRHVyYXRpb25WYWx1ZSgpKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkR1cmF0aW9uICgiICsgdiArICIpIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0aW9uIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVfdG8oWG1sT2JqZWN0IGQpCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlLmNvbXBhcmVUb0dEdXJhdGlvbigoKFhtbE9iamVjdEJhc2UpIGQpLmdEdXJhdGlvblZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKSBkKS5nRHVyYXRpb25WYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICAgICAgdmFsaWRhdGVWYWx1ZShnRHVyYXRpb25WYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGE3OWQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSGV4QmluYXJ5SG9sZGVyLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnV0aWwuSGV4QmluOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSGV4QmluYXJ5SG9sZGVyIGV4dGVuZHMgWG1sT2JqZWN0QmFzZQoreworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9IRVhfQklOQVJZOyB9CisKKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIF92YWx1ZTsKKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShfdmFsdWUpKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIF92YWx1ZSA9IHZhbGlkYXRlTGV4aWNhbChzLCBzY2hlbWFUeXBlKCksIF92b29yVmMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfdmFsdWUgPSBsZXgocywgX3Zvb3JWYyk7CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQorICAgIHsKKyAgICAgICAgX2hhc2hjYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgX3ZhbHVlID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBsZXgoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICBieXRlW10gdkJ5dGVzID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZCeXRlcyA9IHYuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4gLSBVVEYtOCBpcyBhbHdheXMgc3VwcG9ydGVkCisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gSGV4QmluLmRlY29kZSh2Qnl0ZXMpOworCisgICAgICAgIGlmIChieXRlcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIC0gZ2V0IGEgZGVjZW50IGVycm9yIHdpdGggbGluZSBudW1iZXJzIGFuZCBzdWNoIGhlcmUKKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSGV4IGVuY29kZWQgZGF0YSBub3QgZW5jb2RlZCBwcm9wZXJseSIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IGxleCh2LCBjb250ZXh0KTsKKworICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKCFzVHlwZS5tYXRjaFBhdHRlcm5GYWNldCh2KSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCAiSGV4IGVuY29kZWQgZGF0YSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQorICAgIHsKKyAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKyAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW192YWx1ZS5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF92YWx1ZSwgMCwgcmVzdWx0LCAwLCBfdmFsdWUubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBzZXR0ZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYmEpCisgICAgeworICAgICAgICBfaGFzaGNhY2hlZCA9IGZhbHNlOworICAgICAgICBfdmFsdWUgPSBuZXcgYnl0ZVtiYS5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJhLCAwLCBfdmFsdWUsIDAsIGJhLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gY29tcGFyYXRvcnMKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBpdmFsID0gKChYbWxIZXhCaW5hcnkpIGkpLmdldEJ5dGVBcnJheVZhbHVlKCk7CisgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKF92YWx1ZSwgaXZhbCk7CisgICAgfQorCisgICAgLy9iZWNhdXNlIGNvbXB1dGluZyBoYXNoY29kZSBpcyBleHBlbnNpdmUgd2UnbGwgY2FjaGUgaXQKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaGFzaGNhY2hlZCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBpbnQgaGFzaGNvZGUgPSAwOworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDU7CisgICAgc3RhdGljCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgTUQ1IGhhc2ggQWxnb3JpdGhtIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCisgICAgeworICAgICAgICBpZiggX2hhc2hjYWNoZWQgKQorICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworCisgICAgICAgIF9oYXNoY2FjaGVkID0gdHJ1ZTsKKworICAgICAgICBpZiggX3ZhbHVlID09IG51bGwgKQorICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlID0gMDsKKworICAgICAgICBieXRlW10gcmVzID0gbWQ1LmRpZ2VzdChfdmFsdWUpOworICAgICAgICByZXR1cm4gaGFzaGNvZGUgPSByZXNbMF08PDI0ICsgcmVzWzFdPDwxNiArIHJlc1syXTw8OCArIHJlc1szXTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUhleEJpbmFyeUhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiMzA3YgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFIZXhCaW5hcnlIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFIZXhCaW5hcnlIb2xkZXJFeCBleHRlbmRzIEphdmFIZXhCaW5hcnlIb2xkZXIKK3sKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHVibGljIEphdmFIZXhCaW5hcnlIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBieXRlW10gdjsKKworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHYgPSB2YWxpZGF0ZUxleGljYWwocywgc2NoZW1hVHlwZSgpLCBfdm9vclZjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IGxleChzLCBfdm9vclZjKTsKKworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSAmJiB2ICE9IG51bGwpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIHNjaGVtYVR5cGUoKSwgWG1sT2JqZWN0QmFzZS5fdm9vclZjKTsKKyAgICAgICAgCisgICAgICAgIHN1cGVyLnNldF9CeXRlQXJyYXkodik7CisKKyAgICAgICAgX3ZhbHVlID0gdjsKKyAgICB9CisKKyAgICAvLyBzZXR0ZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gdikKKyAgICB7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBzY2hlbWFUeXBlKCksIF92b29yVmMpOworICAgICAgICAKKyAgICAgICAgc3VwZXIuc2V0X0J5dGVBcnJheSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShieXRlW10gdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBYbWxPYmplY3QgbzsKKworICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGRvZXMgbm90IGhhdmUgIiArIGkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBwZXIgbGVuZ3RoIGZhY2V0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGkgPSAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgPiB2Lmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJIZXggZW5jb2RlZCBkYXRhIGhhcyBvbmx5ICIgKyB2Lmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBmZXdlciB0aGFuIG1pbiBsZW5ndGggZmFjZXQiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIICkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaSA9ICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA8IHYubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkhleCBlbmNvZGVkIGRhdGEgaGFzICIgKyB2Lmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCBtb3JlIHRoYW4gbWF4IGxlbmd0aCBmYWNldCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisKKyAgICAgICAgaWYgKHZhbHMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZW51bUxvb3A6IGZvciAoIGkgPSAwIDsgaSA8IHZhbHMubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZW51bUJ5dGVzID0gKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLmJ5dGVBcnJheVZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZW51bUJ5dGVzLmxlbmd0aCAhPSB2Lmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgZW51bUJ5dGVzLmxlbmd0aCA7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtQnl0ZXNbal0gIT0gdltqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGVudW1Mb29wOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIkhleCBlbmNvZGVkIGRhdGEgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMZXhpY2FsKGxleGljYWwsIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICAgICAgdmFsaWRhdGVWYWx1ZShieXRlQXJyYXlWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Mjc4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50SG9sZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlBhcnNlVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX0lOVDsgfQorCisgICAgcHJpdmF0ZSBpbnQgX3ZhbHVlOworCisgICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCisgICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIExvbmcudG9TdHJpbmcoX3ZhbHVlKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgdHJ5IHsgc2V0X2ludChJbnRlZ2VyLnBhcnNlSW50KFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpKTsgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQorICAgIHsKKyAgICAgICAgX3ZhbHVlID0gMDsKKyAgICB9CisgICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBuZXcgQmlnRGVjaW1hbChfdmFsdWUpOyB9CisgICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKF92YWx1ZSk7IH0KKyAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWU7IH0KKyAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWF4ID0gQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBfbWluID0gQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUlOX1ZBTFVFKTsKKworICAgIC8vIHNldHRlcnMKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnRGVjaW1hbChCaWdEZWNpbWFsIHYpIHsgc2V0X0JpZ0ludGVnZXIodi50b0JpZ0ludGVnZXIoKSk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHYpCisgICAgeworICAgICAgICBpZiAodi5jb21wYXJlVG8oX21heCkgPiAwIHx8IHYuY29tcGFyZVRvKF9taW4pIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgc2V0X2ludCh2LmludFZhbHVlKCkpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbG9uZyhsb25nIGwpCisgICAgeworICAgICAgICBpZiAobCA+IEludGVnZXIuTUFYX1ZBTFVFIHx8IGwgPCBJbnRlZ2VyLk1JTl9WQUxVRSkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgc2V0X2ludCgoaW50KWwpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCBpKQorICAgIHsKKyAgICAgICAgX3ZhbHVlID0gaTsKKyAgICB9CisKKyAgICAvLyBjb21wYXJhdG9ycworICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfSU5UKQorICAgICAgICAgICAgcmV0dXJuIC1pLmNvbXBhcmVUbyh0aGlzKTsKKworICAgICAgICByZXR1cm4gX3ZhbHVlID09ICgoWG1sT2JqZWN0QmFzZSlpKS5pbnRWYWx1ZSgpID8gMCA6CisgICAgICAgICAgICAgICBfdmFsdWUgPCAoKFhtbE9iamVjdEJhc2UpaSkuaW50VmFsdWUoKSA/IC0xIDogMTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfSU5UKQorICAgICAgICAgICAgcmV0dXJuIGkudmFsdWVFcXVhbHModGhpcyk7CisKKyAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpaSkuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlLCB0aGlzIGlzIGNhcmVmdWxseSBhbGlnbmVkIHdpdGggaGFzaCBjb2RlcyBmb3IgYWxsIHhzZDpkZWNpbWFsCisgICAgICogcHJpbWl0aXZlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludEhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlMmU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlBhcnNlVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFJbnRIb2xkZXJFeCBleHRlbmRzIEphdmFJbnRIb2xkZXIKK3sKKyAgICBwdWJsaWMgSmF2YUludEhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorICAgICAgICAKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpbnQgdjsKKworICAgICAgICB0cnkgeyB2ID0gSW50ZWdlci5wYXJzZUludChQYXJzZVV0aWwudHJpbUluaXRpYWxQbHVzKHMpKTsgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgICAgIAorICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgICAgICAgICB2YWxpZGF0ZUxleGljYWwocywgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2ludChpbnQgdikKKyAgICB7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisKKyAgICAgICAgc3VwZXIuc2V0X2ludCh2KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKKyAgICAgICAgCisgICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KKyAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoaW50IHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICAvLyB0b3RhbCBkaWdpdHMKKyAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOworICAgICAgICBpZiAodGQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKHYpOworICAgICAgICAgICAgaW50IGxlbiA9IHRlbXAubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0ZW1wLmNoYXJBdCgwKSA9PSAnLScpCisgICAgICAgICAgICAgICAgbGVuIC09IDE7CisgICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKHRkKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiBtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgdG90YWwgZGlnaXRzICgiICsgdGVtcCArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBkaWdpdHMgZmFjZXQgKCIgKyBnZXRJbnRWYWx1ZSh0ZCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWluIGV4CisgICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKKyAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSBnZXRJbnRWYWx1ZShtaW5lKTsKKyAgICAgICAgICAgIGlmICghKHYgPiBtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtaW4gaW4KKyAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOworICAgICAgICBpZiAobWluaSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1pbmkpOworICAgICAgICAgICAgaWYgKCEodiA+PSBtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggaW4KKyAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOworICAgICAgICBpZiAobWF4aSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGkpOworICAgICAgICAgICAgaWYgKCEodiA8PSBtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZXgKKyAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOworICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9IGdldEludFZhbHVlKG1heGUpOworICAgICAgICAgICAgaWYgKCEodiA8IG0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVudW1lcmF0aW9uCisgICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOworICAgICAgICBpZiAodmFscyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gZ2V0SW50VmFsdWUodmFsc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRJbnRWYWx1ZShYbWxPYmplY3QgbykgeworICAgICAgICBTY2hlbWFUeXBlIHMgPSBvLnNjaGVtYVR5cGUoKTsKKyAgICAgICAgc3dpdGNoIChzLmdldERlY2ltYWxTaXplKCkpIAorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0RlY2ltYWxWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSgoWG1sT2JqZWN0QmFzZSlvKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUoaW50VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUludGVnZXJIb2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmYmU1OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNpbXBsZVZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSW50ZWdlckhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfSU5URUdFUjsgfQorCisgICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIF92YWx1ZTsKKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gZ2V0cy9zZXRzIHJhdyB0ZXh0IHZhbHVlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZS50b1N0cmluZygpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzZXRfQmlnSW50ZWdlcihsZXgocywgX3Zvb3JWYykpOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgbGV4KFN0cmluZyBzLCBWYWxpZGF0aW9uQ29udGV4dCB2YykgCisgICAgeworICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDAgJiYgcy5jaGFyQXQoIDAgKSA9PSAnKycgKQorICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOworCisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQmlnSW50ZWdlcihzKTsgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdmMuaW52YWxpZCgiTm90IGEgdmFsaWQgaW50ZWdlcjogIiArIHMpOyByZXR1cm4gbnVsbDsgfQorICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkKKyAgICB7CisgICAgICAgIF92YWx1ZSA9IG51bGw7CisgICAgfQorICAgIC8vIG51bWVyaWNzOiBmcmFjdGlvbmFsCisgICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogbmV3IEJpZ0RlY2ltYWwoX3ZhbHVlKTsgfQorICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgLy8gc2V0dGVycworICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdEZWNpbWFsKEJpZ0RlY2ltYWwgdikgeyBfdmFsdWUgPSB2LnRvQmlnSW50ZWdlcigpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KSB7IF92YWx1ZSA9IHY7IH0KKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBpKQorICAgIHsKKyAgICAgICAgaWYgKCgoU2ltcGxlVmFsdWUpaSkuaW5zdGFuY2VUeXBlKCkuZ2V0RGVjaW1hbFNpemUoKSA+IFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUikKKyAgICAgICAgICAgIHJldHVybiAtaS5jb21wYXJlVG8odGhpcyk7CisKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5jb21wYXJlVG8oKChYbWxPYmplY3RCYXNlKWkpLmJpZ0ludGVnZXJWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWkpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfQklHX0lOVEVHRVIpCisgICAgICAgICAgICByZXR1cm4gaS52YWx1ZUVxdWFscyh0aGlzKTsKKworICAgICAgICByZXR1cm4gX3ZhbHVlLmVxdWFscygoKFhtbE9iamVjdEJhc2UpaSkuYmlnSW50ZWdlclZhbHVlKCkpOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21heGxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOworICAgIHN0YXRpYyBwcml2YXRlIEJpZ0ludGVnZXIgX21pbmxvbmcgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpOworCisgICAgLyoqCisgICAgICogTm90ZSwgdGhpcyBpcyBjYXJlZnVsbHkgYWxpZ25lZCB3aXRoIGhhc2ggY29kZXMgZm9yIGFsbCB4c2Q6ZGVjaW1hbAorICAgICAqIHByaW1pdGl2ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKF92YWx1ZS5jb21wYXJlVG8oX21heGxvbmcpID4gMCB8fAorICAgICAgICAgICAgX3ZhbHVlLmNvbXBhcmVUbyhfbWlubG9uZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOworCisgICAgICAgIGxvbmcgbG9uZ3ZhbCA9IF92YWx1ZS5sb25nVmFsdWUoKTsKKworICAgICAgICByZXR1cm4gKGludCkoKGxvbmd2YWwgPj4gMzIpICogMTkgKyBsb25ndmFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50ZWdlckhvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhSW50ZWdlckhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjMjU0NQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFJbnRlZ2VySG9sZGVyRXguamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUG9zaXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKKworcHVibGljIGNsYXNzIEphdmFJbnRlZ2VySG9sZGVyRXggZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlcgoreworICAgIHB1YmxpYyBKYXZhSW50ZWdlckhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorICAgIAorICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKworCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIEJpZ0ludGVnZXIgdiA9IGxleChzLCBfdm9vclZjKTsKKyAgICAgICAgCisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh2LCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgCisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHMsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBzdXBlci5zZXRfQmlnSW50ZWdlcih2KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBzdXBlci5zZXRfQmlnSW50ZWdlcih2KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIEphdmFEZWNpbWFsSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2LCBjb250ZXh0KTsKKyAgICAgICAgCisgICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KKyAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShCaWdJbnRlZ2VyIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICAvLyB0b3RhbCBkaWdpdHMKKyAgICAgICAgWG1sUG9zaXRpdmVJbnRlZ2VyIHRkID0gKFhtbFBvc2l0aXZlSW50ZWdlcilzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUyk7CisgICAgICAgIGlmICh0ZCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVtcCA9IHYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZW1wLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgdGVtcC5jaGFyQXQoMCkgPT0gJy0nKQorICAgICAgICAgICAgICAgIGxlbiAtPSAxOworICAgICAgICAgICAgaWYgKGxlbiA+IHRkLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciB0b3RhbCBkaWdpdHMgKCIgKyB0ZW1wICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGRpZ2l0cyBmYWNldCAoIiArIHRkLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWluIGV4CisgICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKKyAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciBtID0gZ2V0QmlnSW50ZWdlclZhbHVlKG1pbmUpOworICAgICAgICAgICAgaWYgKCEodi5jb21wYXJlVG8obSkgPiAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gZXhjbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtaW4gaW4KKyAgICAgICAgWG1sT2JqZWN0IG1pbmkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkUpOworICAgICAgICBpZiAobWluaSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIG0gPSBnZXRCaWdJbnRlZ2VyVmFsdWUobWluaSk7CisgICAgICAgICAgICBpZiAoISh2LmNvbXBhcmVUbyhtKSA+PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggaW4KKyAgICAgICAgWG1sT2JqZWN0IG1heGkgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9JTkNMVVNJVkUpOworICAgICAgICBpZiAobWF4aSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIG0gPSBnZXRCaWdJbnRlZ2VyVmFsdWUobWF4aSk7CisgICAgICAgICAgICBpZiAoISh2LmNvbXBhcmVUbyhtKSA8PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGdyZWF0ZXIgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZXgKKyAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOworICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIG0gPSBnZXRCaWdJbnRlZ2VyVmFsdWUobWF4ZSk7CisgICAgICAgICAgICBpZiAoISh2LmNvbXBhcmVUbyhtKSA8IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVudW1lcmF0aW9uCisgICAgICAgIFhtbE9iamVjdFtdIHZhbHMgPSBzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpOworICAgICAgICBpZiAodmFscyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKGdldEJpZ0ludGVnZXJWYWx1ZSh2YWxzW2ldKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKFhtbE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSBzID0gby5zY2hlbWFUeXBlKCk7CisgICAgICAgIHN3aXRjaCAocy5nZXREZWNpbWFsU2l6ZSgpKSAKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoWG1sT2JqZWN0QmFzZSlvKS5iaWdEZWNpbWFsVmFsdWUoKS50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOgorICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuYmlnSW50ZWdlclZhbHVlKCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhZCBmYWNldCB0eXBlIGZvciBCaWcgSW50OiAiICsgcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUoYmlnSW50ZWdlclZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTG9uZ0hvbGRlci5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJmYjBiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QYXJzZVV0aWw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTG9uZ0hvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfTE9ORzsgfQorCisgICAgcHJpdmF0ZSBsb25nIF92YWx1ZTsKKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKSB7IHJldHVybiBMb25nLnRvU3RyaW5nKF92YWx1ZSk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIHRyeSB7IHNldF9sb25nKExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpKTsgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQorICAgIHsKKyAgICAgICAgX3ZhbHVlID0gMEw7CisgICAgfQorCisgICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKSB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBCaWdEZWNpbWFsLnZhbHVlT2YoX3ZhbHVlKTsgfQorICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihfdmFsdWUpOyB9CisgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7CisKKyAgICAvLyBzZXR0ZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KSB7IHNldF9CaWdJbnRlZ2VyKHYudG9CaWdJbnRlZ2VyKCkpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQorICAgIHsKKyAgICAgICAgaWYgKHYuY29tcGFyZVRvKF9tYXgpID4gMCB8fCB2LmNvbXBhcmVUbyhfbWluKSA8IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgIF92YWx1ZSA9IHYubG9uZ1ZhbHVlKCk7CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgbCkgeyBfdmFsdWUgPSBsOyB9CisKKyAgICAvLyBjb21wYXJhdG9ycworICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgbCkKKyAgICB7CisgICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKKyAgICAgICAgICAgIHJldHVybiAtbC5jb21wYXJlVG8odGhpcyk7CisKKyAgICAgICAgcmV0dXJuIF92YWx1ZSA9PSAoKFhtbE9iamVjdEJhc2UpbCkubG9uZ1ZhbHVlKCkgPyAwIDoKKyAgICAgICAgICAgICAgIF92YWx1ZSA8ICgoWG1sT2JqZWN0QmFzZSlsKS5sb25nVmFsdWUoKSA/IC0xIDogMTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgbCkKKyAgICB7CisgICAgICAgIGlmICgoKFNpbXBsZVZhbHVlKWwpLmluc3RhbmNlVHlwZSgpLmdldERlY2ltYWxTaXplKCkgPiBTY2hlbWFUeXBlLlNJWkVfTE9ORykKKyAgICAgICAgICAgIHJldHVybiBsLnZhbHVlRXF1YWxzKHRoaXMpOworCisgICAgICAgIHJldHVybiBfdmFsdWUgPT0gKChYbWxPYmplY3RCYXNlKWwpLmxvbmdWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGUsIHRoaXMgaXMgY2FyZWZ1bGx5IGFsaWduZWQgd2l0aCBoYXNoIGNvZGVzIGZvciBhbGwgeHNkOmRlY2ltYWwKKyAgICAgKiBwcmltaXRpdmVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50KSgoX3ZhbHVlID4+IDMyKSAqIDE5ICsgX3ZhbHVlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFMb25nSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQwNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YUxvbmdIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5RTmFtZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlBhcnNlVXRpbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFMb25nSG9sZGVyRXggZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlcgoreworICAgIHB1YmxpYyBKYXZhTG9uZ0hvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorICAgICAgICAKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBsb25nIHY7CisKKyAgICAgICAgdHJ5IHsgdiA9IExvbmcucGFyc2VMb25nKFBhcnNlVXRpbC50cmltSW5pdGlhbFBsdXMocykpOyB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgCisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zZXRfbG9uZyh2KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xvbmcobG9uZyB2KQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICBzdXBlci5zZXRfbG9uZyh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgSmF2YURlY2ltYWxIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQpOworICAgICAgICAKKyAgICAgICAgLy8gY2hlY2sgcGF0dGVybgorICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJJbnRlZ2VyICgiICsgdiArICIpIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShsb25nIHYsIFNjaGVtYVR5cGUgc1R5cGUsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICAvLyB0b3RhbCBkaWdpdHMKKyAgICAgICAgWG1sT2JqZWN0IHRkID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9UT1RBTF9ESUdJVFMpOworICAgICAgICBpZiAodGQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKHRkKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gTG9uZy50b1N0cmluZyh2KTsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZW1wLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgdGVtcC5jaGFyQXQoMCkgPT0gJy0nKQorICAgICAgICAgICAgICAgIGxlbiAtPSAxOworICAgICAgICAgICAgaWYgKGxlbiA+IG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciB0b3RhbCBkaWdpdHMgKCIgKyB0ZW1wICsgIikgaXMgZ3JlYXRlciB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGRpZ2l0cyBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWluIGV4CisgICAgICAgIFhtbE9iamVjdCBtaW5lID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFKTsKKyAgICAgICAgaWYgKG1pbmUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1pbmUpOworICAgICAgICAgICAgaWYgKCEodiA+IG0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkludGVnZXIgKCIgKyB2ICsgIikgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBleGNsdXNpdmUgZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1pbiBpbgorICAgICAgICBYbWxPYmplY3QgbWluaSA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0lOQ0xVU0lWRSk7CisgICAgICAgIGlmIChtaW5pICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbSA9IGdldExvbmdWYWx1ZShtaW5pKTsKKyAgICAgICAgICAgIGlmICghKHYgPj0gbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWluIGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWF4IGluCisgICAgICAgIFhtbE9iamVjdCBtYXhpID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfSU5DTFVTSVZFKTsKKyAgICAgICAgaWYgKG1heGkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBtID0gZ2V0TG9uZ1ZhbHVlKG1heGkpOworICAgICAgICAgICAgaWYgKCEodiA8PSBtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoCisgICAgICAgICAgICAgICAgICAgICJJbnRlZ2VyICgiICsgdiArICIpIGlzIGxlc3MgdGhhbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW4gaW5jbHVzaXZlIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZXgKKyAgICAgICAgWG1sT2JqZWN0IG1heGUgPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9FWENMVVNJVkUpOworICAgICAgICBpZiAobWF4ZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG0gPSBnZXRMb25nVmFsdWUobWF4ZSk7CisgICAgICAgICAgICBpZiAoISh2IDwgbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiSW50ZWdlciAoIiArIHYgKyAiKSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGV4Y2x1c2l2ZSBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZW51bWVyYXRpb24KKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBnZXRMb25nVmFsdWUodmFsc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiSW50ZWdlciAoIiArIHYgKyAiKSBkb2VzIG5vdCBtYXRjaCBhbnkgZW51bWVyYXRpb24gdmFsdWVzIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKFhtbE9iamVjdCBvKSB7CisgICAgICAgIFNjaGVtYVR5cGUgcyA9IG8uc2NoZW1hVHlwZSgpOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGVjaW1hbFNpemUoKSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19ERUNJTUFMOgorICAgICAgICAgICAgICAgIHJldHVybiAoKFhtbE9iamVjdEJhc2UpbykuYmlnRGVjaW1hbFZhbHVlKCkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmJpZ0ludGVnZXJWYWx1ZSgpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gKChYbWxPYmplY3RCYXNlKW8pLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCYWQgZmFjZXQgdHlwZTogIiArIHMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChsZXhpY2FsLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgICAgIHZhbGlkYXRlVmFsdWUobG9uZ1ZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXIuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzI5YzEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhTm90YXRpb25Ib2xkZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFOb3RhdGlvbkhvbGRlciBleHRlbmRzIFhtbFFOYW1lSW1wbAoreworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbS5TVF9OT1RBVElPTjsgfQorCisvLyAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKQorLy8gICAgICAgIHsgcmV0dXJuIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU7IH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YU5vdGF0aW9uSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0ODQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFOb3RhdGlvbkhvbGRlckV4LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFOb3RhdGlvbkhvbGRlckV4IGV4dGVuZHMgSmF2YU5vdGF0aW9uSG9sZGVyCit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOworCisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHB1YmxpYyBKYXZhTm90YXRpb25Ib2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjaGVjayhzLCBfc2NoZW1hVHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9ub3RhdGlvbihTdHJpbmcgdikKKyAgICB7IHNldF90ZXh0KHYpOyB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlKQorICAgIHsKKyAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKKyAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKKyAgICAgICAgaWYgKGxlbiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSlsZW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpICE9IG0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAorICAgICAgICBYbWxPYmplY3QgbWluID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKTsKKyAgICAgICAgaWYgKG1pbiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltaW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpID49IG0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAorICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKKyAgICAgICAgaWYgKG1heCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoISh2Lmxlbmd0aCgpIDw9IG0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhUU5hbWVIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRlZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZUNvbnRleHQ7CisgICAKK3B1YmxpYyBjbGFzcyBKYXZhUU5hbWVIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIEphdmFRTmFtZUhvbGRlcigpIHt9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfUU5BTUU7IH0KKworICAgIHByaXZhdGUgUU5hbWUgX3ZhbHVlOworCisgICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKKyAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQorICAgIAorICAgIC8vIGFuIGVyZ29ub21pYyBwcmVmaXhlciBzbyB0aGF0IHlvdSBjYW4gc2F5IHN0cmluZ1ZhbHVlKCkgb24gYSBmcmVlLWZsb2F0aW5nIFFOYW1lLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5hbWVzcGFjZU1hbmFnZXIgUFJFVFRZX1BSRUZJWEVSID0gbmV3IFByZXR0eU5hbWVzcGFjZU1hbmFnZXIoKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmV0dHlOYW1lc3BhY2VNYW5hZ2VyIGltcGxlbWVudHMgTmFtZXNwYWNlTWFuYWdlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgobnN1cmkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiU2hvdWxkIG5vdCBiZSBjYWxsZWQiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKKyAgICB7CisgICAgICAgIGlmIChuc20gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgdXNlZCB0bzogdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBRTmFtZSBwcmVmaXggb3V0c2lkZSBvZiBhIGRvY3VtZW50Iik7CisgICAgICAgICAgICAvLyBidXQgaXQncyBub3QgbmljZSB0byB0aHJvdyBvbiBzdHJpbmdWYWx1ZSgpCisgICAgICAgICAgICBuc20gPSBQUkVUVFlfUFJFRklYRVI7CisgICAgICAgIH0KKworLy8gVE9ETyAtIHdoYXQgSSByZWFsbHkgbmVlZCB0byBkbyBoZXJlIGlzIHRoYXQgaWYgdGhlcmUgaXMgbm8KKy8vIG5hbWVzcGFjZSBmb3IgdGhpcyBxbmFtZSwgdGhlbiBpbnN0ZWFkIG9mIGZpbmRpbmcgdGhlIHByZWZpeCBmb3IgdGhlCisvLyB1cmksIEkgc2hvdWxkIG1ha2UgYSBjYWxsIHRvIHNldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZQorLy8gaW1tZWRpYXRlIGNvbnRleHQgZm9yIHRoaXMgcW5hbWUgdG8gYmUgIiIuICAKKyAgIAorICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gX3ZhbHVlLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gX3ZhbHVlLmdldExvY2FsUGFydCgpOworCisgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsb2NhbFBhcnQ7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNtLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZXNwYWNlLCBudWxsICk7CisKKyAgICAgICAgYXNzZXJ0IHByZWZpeCAhPSBudWxsOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGxvY2FsUGFydDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lIHZhbGlkYXRlTGV4aWNhbCgKKyAgICAgICAgU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQorICAgIHsKKyAgICAgICAgUU5hbWUgbmFtZTsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lID0gcGFyc2UodiwgcmVzb2x2ZXIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgcGFyc2UoU3RyaW5nIHYsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHByZWZpeCwgbG9jYWxuYW1lOworICAgICAgICBpbnQgc3RhcnQ7CisgICAgICAgIGludCBlbmQ7CisgICAgICAgIGZvciAoZW5kID0gdi5sZW5ndGgoKTsgZW5kID4gMDsgZW5kIC09IDEpCisgICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChlbmQtMSkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IDEpCisgICAgICAgICAgICBpZiAoIVhNTENoYXIuaXNTcGFjZSh2LmNoYXJBdChzdGFydCkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGludCBmaXJzdGNvbG9uID0gdi5pbmRleE9mKCc6Jywgc3RhcnQpOworICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVmaXggPSB2LnN1YnN0cmluZyhzdGFydCwgZmlyc3Rjb2xvbik7CisgICAgICAgICAgICBsb2NhbG5hbWUgPSB2LnN1YnN0cmluZyhmaXJzdGNvbG9uICsgMSwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICAgICAgbG9jYWxuYW1lID0gdi5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyB1cmkgPQorICAgICAgICAgICAgcmVzb2x2ZXIgPT0gbnVsbCA/IG51bGwgOiByZXNvbHZlci5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKKyAgICAgICAgCisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiQ2FuJ3QgcmVzb2x2ZSBwcmVmaXg6ICIgKyBwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB1cmkgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIHVyaSwgbG9jYWxuYW1lICk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgUHJlZml4UmVzb2x2ZXIgcmVzb2x2ZXIgPSBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKTsKKworICAgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCAmJiBoYXNfc3RvcmUoKSkKKyAgICAgICAgICAgIHJlc29sdmVyID0gZ2V0X3N0b3JlKCk7CisgICAgICAgIAorICAgICAgICBfdmFsdWUgPSBwYXJzZShzLCByZXNvbHZlcik7CisgICAgfQorCisgICAgLy8gQlVHQlVHIC0gaGF2aW5nIHByZWZpeCBoZXJlIG1heSBub3Qgd29yaworICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIFN5bmMgZm9yY2Ugb2YgY3JlYXRpb24gb2YgbmFtZXNhcGNlIG1hcHBpbmcgLi4KKyAgICAgICAgCisgICAgICAgIGlmIChoYXNfc3RvcmUoKSkKKyAgICAgICAgICAgIGdldF9zdG9yZSgpLmZpbmRfcHJlZml4X2Zvcl9uc3VyaSggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbnVsbCApOworICAgICAgICAKKyAgICAgICAgX3ZhbHVlID0gbmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdmFsdWUpCisgICAgeworICAgICAgICBfdmFsdWUgPSBwYXJzZSh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpIHsgX3ZhbHVlID0gbnVsbDsgfQorCisgICAgLy8gc2V0dGVycywgZ2V0dGVycyAoc2V0dGVyIGFscmVhZHkgaGFuZGxlZCB2aWEgc2V0X3RleHQpCisKKyAgICBwdWJsaWMgUU5hbWUgcU5hbWVWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgLy8gY29tcGFyYXRvcnMKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5lcXVhbHMoKChYbWxPYmplY3RCYXNlKW9iaikucU5hbWVWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gX3ZhbHVlLmhhc2hDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVFOYW1lSG9sZGVyRXguamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1YjljYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFRTmFtZUhvbGRlckV4LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5QcmVmaXhSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFRTmFtZUhvbGRlckV4IGV4dGVuZHMgSmF2YVFOYW1lSG9sZGVyCit7CisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOworCisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gX3NjaGVtYVR5cGU7IH0KKworICAgIHB1YmxpYyBKYXZhUU5hbWVIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBQcmVmaXhSZXNvbHZlciByZXNvbHZlciA9IE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpOworCisgICAgICAgIGlmIChyZXNvbHZlciA9PSBudWxsICYmIGhhc19zdG9yZSgpKQorICAgICAgICAgICAgcmVzb2x2ZXIgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBRTmFtZSB2OworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdiA9IHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYywgcmVzb2x2ZXIpOworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbChzLCBfdm9vclZjLCByZXNvbHZlcik7CisKKyAgICAgICAgc3VwZXIuc2V0X1FOYW1lKHYpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9RTmFtZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKG5hbWUsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgc3VwZXIuc2V0X1FOYW1lKCBuYW1lICk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGFueXNpbXBsZShYbWxBbnlTaW1wbGVUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgUU5hbWUgdjsKKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSB2YWxpZGF0ZUxleGljYWwodmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSwgX3NjaGVtYVR5cGUsIF92b29yVmMsIE5hbWVzcGFjZUNvbnRleHQuZ2V0Q3VycmVudCgpKTsKKworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVZhbHVlKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gSmF2YVFOYW1lSG9sZGVyLnZhbGlkYXRlTGV4aWNhbCh2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpLCBfdm9vclZjLCBOYW1lc3BhY2VDb250ZXh0LmdldEN1cnJlbnQoKSk7CisKKyAgICAgICAgc3VwZXIuc2V0X1FOYW1lKHYpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKKyAgICB7CisgICAgICAgIFFOYW1lIG5hbWUgPSBKYXZhUU5hbWVIb2xkZXIudmFsaWRhdGVMZXhpY2FsKHYsIGNvbnRleHQsIHJlc29sdmVyKTsKKyAgICAgICAgCisgICAgICAgIC8vIGNoZWNrIHBhdHRlcm4KKyAgICAgICAgaWYgKHNUeXBlLmhhc1BhdHRlcm5GYWNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZXNjcmliZSBzdHJpbmcgYW5kIHBhdHRlcm4gaGVyZSBpbiBlcnJvcgorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYbWxPYmplY3QgeDsKKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSAhPSB2Lmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgCisgICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA+IHYubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtaW4gbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgCisgICAgICAgIGlmICgoeCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAoKCgoWG1sT2JqZWN0QmFzZSl4KS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA8IHYubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJRTmFtZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtYXggbGVuZ3RoIGZhY2V0IGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShRTmFtZSB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAodi5lcXVhbHMoKChYbWxPYmplY3RCYXNlKXZhbHNbaV0pLnFOYW1lVmFsdWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiUU5hbWUgJyIgKyB2ICsgIicgaXMgbm90IGEgdmFsaWQgZW51ZW1yYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlVmFsdWUocU5hbWVWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nRW51bWVyYXRpb25Ib2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ4OWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXguamF2YQpAQCAtMCwwICsxLDgyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4IGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4Cit7CisgICAgcHVibGljIEphdmFTdHJpbmdFbnVtZXJhdGlvbkhvbGRlckV4KFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSwgY29tcGxleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIF92YWw7CisKKyAgICAvLyB1cGRhdGUgdGhlIGludHZhbCB3aGVuIHNldHRpbmcgdmlhIHRleHQsIG5pbC4KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlID0gc2NoZW1hVHlwZSgpLmVudW1Gb3JTdHJpbmcocyk7CisgICAgICAgIGlmIChlbnVtVmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oIlN0cmluZyAnIiArIHMgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgc2NoZW1hVHlwZSgpKTsKKworICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKKyAgICAgICAgX3ZhbCA9IGVudW1WYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgSmF2YVN0cmluZ0hvbGRlckV4LnZhbGlkYXRlTGV4aWNhbCh2LCBzVHlwZSwgY29udGV4dCk7CisKKyAgICAgICAgaWYgKHNUeXBlLmhhc1N0cmluZ0VudW1WYWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNUeXBlLmVudW1Gb3JTdHJpbmcodikgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJTdHJpbmcgJyIgKyB2ICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRlZCB2YWx1ZSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdmFsID0gbnVsbDsKKyAgICAgICAgc3VwZXIuc2V0X25pbCgpOworICAgIH0KKworICAgIC8vIHNldC9nZXQgdGhlIGVudW1WYWx1ZQorICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSgpCisgICAgeworICAgICAgICBjaGVja19kYXRlZCgpOworICAgICAgICByZXR1cm4gX3ZhbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1WYWx1ZSkKKyAgICB7CisgICAgICAgIENsYXNzIGVqYyA9IHNjaGVtYVR5cGUoKS5nZXRFbnVtSmF2YUNsYXNzKCk7CisgICAgICAgIGlmIChlamMgIT0gbnVsbCAmJiAhZW51bVZhbHVlLmdldENsYXNzKCkuZXF1YWxzKGVqYykpCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgc3VwZXIuc2V0X3RleHQoZW51bVZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICBfdmFsID0gZW51bVZhbHVlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0NzI3MAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFTdHJpbmdIb2xkZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5CdWlsdGluU2NoZW1hVHlwZVN5c3RlbTsKKworcHVibGljIGNsYXNzIEphdmFTdHJpbmdIb2xkZXIgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIEphdmFTdHJpbmdIb2xkZXIoKSB7fQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtLlNUX1NUUklORzsgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOworCisgICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKKyAgICAgICAgeyByZXR1cm4gU2NoZW1hVHlwZS5XU19QUkVTRVJWRTsgfQorCisgICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKSB7IF92YWx1ZSA9IHM7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkgeyBfdmFsdWUgPSBudWxsOyB9CisKKyAgICAvLyBzdHJpbmcgc2V0dGVyIGFuZCBnZXR0ZXIgYWxyZWFkeSBoYW5kbGVkIGJ5IFhtbE9iamVjdEJhc2UKKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sT2JqZWN0QmFzZSlvYmopLnN0cmluZ1ZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhU3RyaW5nSG9sZGVyRXguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE3M2ViCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVN0cmluZ0hvbGRlckV4LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVN0cmluZ0hvbGRlckV4IGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlcgoreworICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHVibGljIEphdmFTdHJpbmdIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzLCBfc2NoZW1hVHlwZSwgX3Zvb3JWYyk7CisgICAgICAgICAgICAgICAgIAorICAgICAgICBzdXBlci5zZXRfdGV4dChzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHYsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgcGF0dGVybgorICAgICAgICBpZiAoIXNUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHYpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoICJTdHJpbmc6ICciICsgdiArICInIGRvZXMgbm90IG1hdGNoIHBhdHRlcm4gZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgYWdhaW5zdCBsZW5ndGgKKyAgICAgICAgWG1sT2JqZWN0IGxlbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTEVOR1RIKTsKKyAgICAgICAgaWYgKGxlbiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSlsZW4pLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodi5sZW5ndGgoKSAhPSBtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgZG9lcyBub3QgbWF0Y2ggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoIGZhY2V0ICgiICsgbSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKKyAgICAgICAgWG1sT2JqZWN0IG1pbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCk7CisgICAgICAgIGlmIChtaW4gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSAoKFhtbE9iamVjdEJhc2UpbWluKS5iaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHYubGVuZ3RoKCkgPCBtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBsZW5ndGggKCIgKyB2Lmxlbmd0aCgpICsgIikgaXMgbGVzcyB0aGFuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBsZW5ndGggZmFjZXQgKCIgKyBtICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbWluIGxlbmd0aAorICAgICAgICBYbWxPYmplY3QgbWF4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIKTsKKyAgICAgICAgaWYgKG1heCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbSA9ICgoWG1sT2JqZWN0QmFzZSltYXgpLmJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodi5sZW5ndGgoKSA+IG0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGxlbmd0aCAoIiArIHYubGVuZ3RoKCkgKyAiKSBpcyBncmVhdGVyIHRoYW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGxlbmd0aCBmYWNldCAoIiArIG0gKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlX3NpbXBsZXZhbChTdHJpbmcgbGV4aWNhbCwgVmFsaWRhdGlvbkNvbnRleHQgY3R4KQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHN0cmluZ1ZhbHVlKCksIHNjaGVtYVR5cGUoKSwgY3R4KTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9KYXZhVXJpSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5ZGJjNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55VVJJOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVVyaUhvbGRlciBleHRlbmRzIFhtbE9iamVjdEJhc2UKK3sKKyAgICBwdWJsaWMgSmF2YVVyaUhvbGRlcigpIHt9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICAgICAgeyByZXR1cm4gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1VSSTsgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgX3ZhbHVlOworCisgICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pIHsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gIiIgOiBfdmFsdWU7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVMZXhpY2FsKHMsIF92b29yVmMpOworICAgICAgICBfdmFsdWUgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxleGljYWwoU3RyaW5nIHYsIFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpCisgICAgeworICAgICAgICAvLyBFbm91Z2ggdmFsaWRhdGlvbiB0byBnZXQgc2NoZW1hIGZvciBzY2hlbWEgd29ya2luZworCisgICAgICAgIGlmICh2LnN0YXJ0c1dpdGgoICIjIyIgKSkKKyAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgiWG1sQW55VVJJIGlzIG1hbGZvcm1lZDogIiArIHYgKTsKKworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbmlsKCkgeyBfdmFsdWUgPSBudWxsOyB9CisKKyAgICAvLyBzdHJpbmcgc2V0dGVyIGFuZCBnZXR0ZXIgYWxyZWFkeSBoYW5kbGVkIGJ5IFhtbE9iamVjdEJhc2UKKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUuZXF1YWxzKCgoWG1sQW55VVJJKW9iaikuZ2V0U3RyaW5nVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZS5oYXNoQ29kZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXJFeC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvSmF2YVVyaUhvbGRlckV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3MTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL0phdmFVcmlIb2xkZXJFeC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitwdWJsaWMgY2xhc3MgSmF2YVVyaUhvbGRlckV4IGV4dGVuZHMgSmF2YVVyaUhvbGRlcgoreworICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHVibGljIEphdmFVcmlIb2xkZXJFeChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0X3dzY2Fub25fcnVsZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldFdoaXRlU3BhY2VSdWxlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3RleHQoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjaGVjayhzLCBfc2NoZW1hVHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBpZiAoIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnNldF90ZXh0KHMpOworICAgIH0KKworLy8gICAgLy8gc2V0dGVycworLy8gICAgcHJvdGVjdGVkIHZvaWQgc2V0X3VyaShVUkkgdXJpKQorLy8gICAgeworLy8gICAgICAgIGlmICghY2hlY2sodXJpLnRvU3RyaW5nKCksIF9zY2hlbWFUeXBlKSkKKy8vICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworLy8KKy8vICAgICAgICBzdXBlci5zZXRfdXJpKHVyaSk7CisvLyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBTY2hlbWFUeXBlIHNUeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgWG1sQW55VXJpSW1wbC52YWxpZGF0ZUxleGljYWwodiwgY29udGV4dCk7CisgICAgICAgIAorICAgICAgICBYbWxPYmplY3RbXSB2YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKKworICAgICAgICBpZiAodmFscyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgdmFscy5sZW5ndGggOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBlID0gKChTaW1wbGVWYWx1ZSl2YWxzW2ldKS5nZXRTdHJpbmdWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGUuZXF1YWxzKCB2ICkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSB2YWxzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSAnIiArIHYgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY2hlY2sgcGF0dGVybgorICAgICAgICBpZiAoc1R5cGUuaGFzUGF0dGVybkZhY2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc1R5cGUubWF0Y2hQYXR0ZXJuRmFjZXQodikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGRlc2NyaWJlIHN0cmluZyBhbmQgcGF0dGVybiBoZXJlIGluIGVycm9yCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYbWxPYmplY3QgeDsKKworICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCkpICE9IG51bGwpCisgICAgICAgICAgICBpZiAoKCgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKSkgIT0gdi5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBsZW5ndGggZmFjZXQgKCIgKyAoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAKKyAgICAgICAgaWYgKCh4ID0gc1R5cGUuZ2V0RmFjZXQoU2NoZW1hVHlwZS5GQUNFVF9NSU5fTEVOR1RIKSkgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmICgoKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKS5pbnRWYWx1ZSgpKSA+IHYubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJhbnlVUkkgdmFsdWUgJyIgKyB2ICsgIicgZG9lcyBub3QgbWF0Y2ggbWluIGxlbmd0aCBmYWNldCAoIiArICgoU2ltcGxlVmFsdWUpeCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkgKyAiKSBmb3IgIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlKSk7CisgICAgICAgIAorICAgICAgICBpZiAoKHggPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX01BWF9MRU5HVEgpKSAhPSBudWxsKQorICAgICAgICAgICAgaWYgKCgoKFNpbXBsZVZhbHVlKXgpLmdldEJpZ0ludGVnZXJWYWx1ZSgpLmludFZhbHVlKCkpIDwgdi5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoImFueVVSSSB2YWx1ZSAnIiArIHYgKyAiJyBkb2VzIG5vdCBtYXRjaCBtYXggbGVuZ3RoIGZhY2V0ICgiICsgKChTaW1wbGVWYWx1ZSl4KS5nZXRCaWdJbnRlZ2VyVmFsdWUoKSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVjayhTdHJpbmcgdiwgU2NoZW1hVHlwZSBzVHlwZSkKKyAgICB7CisgICAgICAgIGludCBsZW5ndGggPSB2PT1udWxsID8gMCA6IHYubGVuZ3RoKCk7CisgICAgICAgIC8vIGNoZWNrIGFnYWluc3QgbGVuZ3RoCisgICAgICAgIFhtbE9iamVjdCBsZW4gPSBzVHlwZS5nZXRGYWNldChTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSCk7CisgICAgICAgIGlmIChsZW4gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKWxlbikuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghKGxlbmd0aCAhPSBtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKKyAgICAgICAgWG1sT2JqZWN0IG1pbiA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCk7CisgICAgICAgIGlmIChtaW4gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKW1pbikuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghKGxlbmd0aCA+PSBtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBhZ2FpbnN0IG1pbiBsZW5ndGgKKyAgICAgICAgWG1sT2JqZWN0IG1heCA9IHNUeXBlLmdldEZhY2V0KFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSCk7CisgICAgICAgIGlmIChtYXggIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG0gPSAoKFNpbXBsZVZhbHVlKW1heCkuZ2V0QmlnSW50ZWdlclZhbHVlKCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghKGxlbmd0aCA8PSBtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZV9zaW1wbGV2YWwoU3RyaW5nIGxleGljYWwsIFZhbGlkYXRpb25Db250ZXh0IGN0eCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTGV4aWNhbChzdHJpbmdWYWx1ZSgpLCBzY2hlbWFUeXBlKCksIGN0eCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjU2MDgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OworCitwdWJsaWMgY2xhc3MgTmFtZXNwYWNlQ29udGV4dCBpbXBsZW1lbnRzIFByZWZpeFJlc29sdmVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RPUkUgICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBYTUxfT0JKRUNUICAgID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFQICAgICAgICAgICA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFUiAgICAgID0gNTsKKworICAgIHByaXZhdGUgT2JqZWN0IF9vYmo7CisgICAgcHJpdmF0ZSBpbnQgX2NvZGU7CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChNYXAgcHJlZml4VG9VcmlNYXApCisgICAgeworICAgICAgICBfY29kZSA9IE1BUDsKKyAgICAgICAgX29iaiA9IHByZWZpeFRvVXJpTWFwOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0KFR5cGVTdG9yZSB0eXBlU3RvcmUpCisgICAgeworICAgICAgICBfY29kZSA9IFRZUEVfU1RPUkU7CisgICAgICAgIF9vYmogPSB0eXBlU3RvcmU7CisgICAgfQorCisgICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQoWG1sT2JqZWN0IHhtbE9iamVjdCkKKyAgICB7CisgICAgICAgIF9jb2RlID0gWE1MX09CSkVDVDsKKyAgICAgICAgX29iaiA9IHhtbE9iamVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChTdGFydEVsZW1lbnQgc3RhcnQpCisgICAgeworICAgICAgICBfY29kZSA9IFNUQVJUX0VMRU1FTlQ7CisgICAgICAgIF9vYmogPSBzdGFydDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dChQcmVmaXhSZXNvbHZlciByZXNvbHZlcikKKyAgICB7CisgICAgICAgIF9jb2RlID0gUkVTT0xWRVI7CisgICAgICAgIF9vYmogPSByZXNvbHZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFjayBtYW5hZ2VtZW50IGlmIChoZWF2ZW4gaGVscCB1cykgd2UgZXZlciBuZWVkIHRvIGRvCisgICAgICogbmVzdGVkIGNvbXBpbGF0aW9uIG9mIHNjaGVtYSB0eXBlIHN5c3RlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOYW1lc3BhY2VDb250ZXh0U3RhY2sKKyAgICB7CisgICAgICAgIE5hbWVzcGFjZUNvbnRleHQgY3VycmVudDsKKyAgICAgICAgQXJyYXlMaXN0IHN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCB2b2lkIHB1c2goTmFtZXNwYWNlQ29udGV4dCBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzdGFjay5hZGQoY3VycmVudCk7CisgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCB2b2lkIHBvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnQgPSAoTmFtZXNwYWNlQ29udGV4dClzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCBOYW1lc3BhY2VDb250ZXh0U3RhY2sgPSBuZXcgVGhyZWFkTG9jYWwoKQorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7IHJldHVybiBuZXcgTmFtZXNwYWNlQ29udGV4dFN0YWNrKCk7IH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1c2goTmFtZXNwYWNlQ29udGV4dCBuZXh0KQorICAgIHsKKyAgICAgICAgKChOYW1lc3BhY2VDb250ZXh0U3RhY2spTmFtZXNwYWNlQ29udGV4dFN0YWNrLmdldCgpKS5wdXNoKG5leHQpOworICAgIH0KKyAgICAgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCisgICAgeworICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygieG1sIikpCisgICAgICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI7CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKF9jb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFhNTF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZVN0b3JlVXNlciBpbXBsOworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBfb2JqOworICAgICAgICAgICAgICAgIGlmIChQcm94eS5pc1Byb3h5Q2xhc3Mob2JqLmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgICAgICBvYmogPSBQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihvYmopOworCisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFR5cGVTdG9yZVVzZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFR5cGVTdG9yZVVzZXIpb2JqKS5nZXRfc3RvcmUoKS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKKworICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSAoKFhtbE9iamVjdClfb2JqKS5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBYbWxDdXJzb3IuVG9rZW5UeXBlLkFUVFIpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIudG9QYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIGN1ci5uYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBNQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpKChNYXApX29iaikuZ2V0KHByZWZpeCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFRZUEVfU1RPUkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoVHlwZVN0b3JlKV9vYmopLmdldE5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAoKFN0YXJ0RWxlbWVudClfb2JqKS5nZXROYW1lc3BhY2VVcmkocHJlZml4KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgUkVTT0xWRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJlZml4UmVzb2x2ZXIpX29iaikuZ2V0TmFtZXNwYWNlRm9yUHJlZml4KHByZWZpeCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJJbXByb3Blcmx5IGluaXRpYWxpemVkIE5hbWVzcGFjZUNvbnRleHQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJlZml4UmVzb2x2ZXIgZ2V0Q3VycmVudCgpCisgICAgeworICAgICAgICByZXR1cm4gKChOYW1lc3BhY2VDb250ZXh0U3RhY2spTmFtZXNwYWNlQ29udGV4dFN0YWNrLmdldCgpKS5jdXJyZW50OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wKCkKKyAgICB7CisgICAgICAgICgoTmFtZXNwYWNlQ29udGV4dFN0YWNrKU5hbWVzcGFjZUNvbnRleHRTdGFjay5nZXQoKSkucG9wKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9TdHJpbmdFbnVtVmFsdWUuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1N0cmluZ0VudW1WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzdmYzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9TdHJpbmdFbnVtVmFsdWUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TdHJpbmdFbnVtQWJzdHJhY3RCYXNlOworCitwdWJsaWMgY2xhc3MgU3RyaW5nRW51bVZhbHVlIGV4dGVuZHMgU3RyaW5nRW51bUFic3RyYWN0QmFzZQoreworICAgIHB1YmxpYyBTdHJpbmdFbnVtVmFsdWUoU3RyaW5nIHMsIGludCBpKQorICAgICAgICB7IHN1cGVyKHMsIGkpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZlN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDczIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55U2ltcGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYW55U2ltcGxlVHlwZSBmb3IgWE1MLgorICoKKyAqLworcHVibGljIGNsYXNzIFhtbEFueVNpbXBsZVR5cGVJbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgX3NjaGVtYVR5cGUgPSB0eXBlOyBpbml0Q29tcGxleFR5cGUoY29tcGxleCwgZmFsc2UpOyB9CisKKyAgICBwdWJsaWMgWG1sQW55U2ltcGxlVHlwZUltcGwoKQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uU1RfQU5ZX1NJTVBMRTsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9CisKKyAgICBwcml2YXRlIFNjaGVtYVR5cGUgX3NjaGVtYVR5cGU7CisKKyAgICBTdHJpbmcgX3RleHR2YWx1ZSA9ICIiOworCisgICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOworICAgIH0KKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGdldHMgcmF3IHRleHQgdmFsdWUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkgeyByZXR1cm4gX3RleHR2YWx1ZTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgX3RleHR2YWx1ZSA9IHM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdGV4dHZhbHVlID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyBjb21wYXJhdG9ycworICAgIHByb3RlY3RlZCBib29sZWFuIGVxdWFsX3RvKFhtbE9iamVjdCBvYmopCisgICAgeworICAgICAgICAvLyBjb21wYXJlcyBhZ2FpbnN0IGFub3RoZXIgYW55U2ltcGxlVHlwZQorICAgICAgICAvLyBydWxlIGlzOiBsZXhpY2FsIHZhbHVlcyBtdXN0IG1hdGNoLgorICAgICAgICByZXR1cm4gX3RleHR2YWx1ZS5lcXVhbHMoKChYbWxBbnlTaW1wbGVUeXBlKW9iaikuZ2V0U3RyaW5nVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgLy8gbWF0Y2hlcyBKYXZhU3RyaW5nSG9sZGVyJ3MgdmFsdWVfaGFzaF9jb2RlLCBzbyB3ZSBjYW4gYmUgaGFzZWQgYWdhaW5zdCBzdHJpbmdzCisgICAgICAgIHJldHVybiAoX3RleHR2YWx1ZSA9PSBudWxsID8gMCA6IF90ZXh0dmFsdWUuaGFzaENvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlTaW1wbGVUeXBlUmVzdHJpY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI5Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55U2ltcGxlVHlwZVJlc3RyaWN0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworcHVibGljIGNsYXNzIFhtbEFueVNpbXBsZVR5cGVSZXN0cmljdGlvbiBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGVJbXBsCit7CisgICAgcHVibGljIFhtbEFueVNpbXBsZVR5cGVSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VHlwZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlYTliYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGFueVR5cGUgZm9yIFhNTC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxBbnlUeXBlSW1wbCBleHRlbmRzIFhtbENvbXBsZXhDb250ZW50SW1wbCBpbXBsZW1lbnRzIFhtbE9iamVjdAoreworICAgIHB1YmxpYyBYbWxBbnlUeXBlSW1wbCgpCisgICAgICAgIHsgc3VwZXIodHlwZSk7IH0KKworICAgIHB1YmxpYyBYbWxBbnlUeXBlSW1wbChTY2hlbWFUeXBlIHR5cGUpCisgICAgICAgIHsgc3VwZXIodHlwZSk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEFueVVyaUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK3B1YmxpYyBjbGFzcyBYbWxBbnlVcmlJbXBsIGV4dGVuZHMgSmF2YVVyaUhvbGRlciBpbXBsZW1lbnRzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQW55VVJJCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxBbnlVcmlSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGY5ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQW55VXJpUmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sQW55VXJpUmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhVXJpSG9sZGVyRXggaW1wbGVtZW50cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVVSSQoreworICAgIHB1YmxpYyBYbWxBbnlVcmlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQmFzZTY0QmluYXJ5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGUzNDQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlJbXBsLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJhc2U2NEJpbmFyeTsKKworCitwdWJsaWMgY2xhc3MgWG1sQmFzZTY0QmluYXJ5SW1wbCBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXIgaW1wbGVtZW50cyBYbWxCYXNlNjRCaW5hcnkKK3sKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJhc2U2NEJpbmFyeVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzY2MWUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCYXNlNjRCaW5hcnk7CisKK3B1YmxpYyBjbGFzcyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbiBleHRlbmRzIEphdmFCYXNlNjRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEJhc2U2NEJpbmFyeQoreworICAgIHB1YmxpYyBYbWxCYXNlNjRCaW5hcnlSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQm9vbGVhbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwMmVjMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5JbXBsLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQm9vbGVhbjsKKworcHVibGljIGNsYXNzIFhtbEJvb2xlYW5JbXBsIGV4dGVuZHMgSmF2YUJvb2xlYW5Ib2xkZXIgaW1wbGVtZW50cyBYbWxCb29sZWFuCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJvb2xlYW5SZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZGE0YmEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxCb29sZWFuUmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCb29sZWFuOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworcHVibGljIGNsYXNzIFhtbEJvb2xlYW5SZXN0cmljdGlvbiBleHRlbmRzIEphdmFCb29sZWFuSG9sZGVyRXggaW1wbGVtZW50cyBYbWxCb29sZWFuCit7CisgICAgcHVibGljIFhtbEJvb2xlYW5SZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQnl0ZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJ5dGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOGFhYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEJ5dGVJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQnl0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CisKKworcHVibGljIGNsYXNzIFhtbEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sQnl0ZQoreworICAgIHB1YmxpYyBYbWxCeXRlSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sQnl0ZS50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sQnl0ZUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sQ29tcGxleENvbnRlbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzYTU5MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbENvbXBsZXhDb250ZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA4MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKKworaW1wb3J0IGphdmEubGFuZy5TdHJpbmc7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlVmlzaXRvckltcGw7CisKK3B1YmxpYyBjbGFzcyBYbWxDb21wbGV4Q29udGVudEltcGwgZXh0ZW5kcyBYbWxPYmplY3RCYXNlCit7CisgICAgcHVibGljIFhtbENvbXBsZXhDb250ZW50SW1wbChTY2hlbWFUeXBlIHR5cGUpCisgICAgeworICAgICAgICBfc2NoZW1hVHlwZSA9IChTY2hlbWFUeXBlSW1wbCl0eXBlOworICAgICAgICBpbml0Q29tcGxleFR5cGUodHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9CisKKyAgICBwcml2YXRlIFNjaGVtYVR5cGVJbXBsIF9zY2hlbWFUeXBlOworCisgICAgcHVibGljIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCisgICAgICAgIHsgcmV0dXJuIG51bGw7IH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldF9TdHJpbmcoU3RyaW5nIHYpCisgICAgeworICAgICAgICBhc3NlcnQgX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOworCisgICAgICAgIGlmIChfc2NoZW1hVHlwZS5nZXRDb250ZW50VHlwZSgpICE9IFNjaGVtYVR5cGUuTUlYRURfQ09OVEVOVCAmJgorICAgICAgICAgICAgICAgICFfc2NoZW1hVHlwZS5pc05vVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUeXBlIGRvZXMgbm90IGFsbG93IGZvciB0ZXh0dWFsIGNvbnRlbnQ6ICIgKyBfc2NoZW1hVHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuc2V0X1N0cmluZyh2KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0X3RleHQoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIGFzc2VydAorICAgICAgICAgICAgX3NjaGVtYVR5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLk1JWEVEX0NPTlRFTlQgfHwKKyAgICAgICAgICAgICAgICBfc2NoZW1hVHlwZS5pc05vVHlwZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZV9mcm9tX2NvbXBsZXhfY29udGVudCgpCisgICAgeworICAgICAgICAvLyBObyBjb21wbGV4IGNhY2hpbmcgeWV0IC4uLgorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRfbmlsKCkKKyAgICAgICAgeyAvKiBCVUdCVUc6IHdoYXQgdG8gZG8/ICovIH0KKworICAgIC8vIExFRlQKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgY29tcGxleE9iamVjdCkKKyAgICB7CisgICAgICAgIGlmICghX3NjaGVtYVR5cGUuZXF1YWxzKGNvbXBsZXhPYmplY3Quc2NoZW1hVHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBCVUdCVUc6IGJ5LXZhbHVlIHN0cnVjdHVyZSBjb21wYXJpc29uIHVuZG9uZQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBMRUZUCisgICAgcHJvdGVjdGVkIGludCB2YWx1ZV9oYXNoX2NvZGUoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tcGxleCB0eXBlcyBjYW5ub3QgYmUgdXNlZCBhcyBoYXNoIGtleXMiKTsKKyAgICB9CisKKyAgICAvLyBET05FCisgICAgcHVibGljIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoX3NjaGVtYVR5cGUuZ2V0Q29udGVudE1vZGVsKCkpOworICAgIH0KKworICAgIC8vIERPTkUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmlzT3JkZXJTZW5zaXRpdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldF9lbGVtZW50ZmxhZ3MoUU5hbWUgZWx0TmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOworICAgICAgICBpZiAocHJvcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAorICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8CisgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5IQVNERUZBVUxUKSB8CisgICAgICAgICAgICAocHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5GSVhFRCkgfAorICAgICAgICAgICAgKHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5ORVZFUiA/IDAgOiBUeXBlU3RvcmUuTklMTEFCTEUpOworICAgIH0KKworICAgIC8vIERPTkUKKyAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KGF0dHJOYW1lKTsKKyAgICB9CisKKyAgICAvLyBET05FCisgICAgcHVibGljIFN0cmluZyBnZXRfZGVmYXVsdF9lbGVtZW50X3RleHQoUU5hbWUgZWx0TmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYVByb3BlcnR5IHByb3AgPSBzY2hlbWFUeXBlKCkuZ2V0RWxlbWVudFByb3BlcnR5KGVsdE5hbWUpOworICAgICAgICBpZiAocHJvcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gcHJvcC5nZXREZWZhdWx0VGV4dCgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29kZSBnZW4gaGVscGVycworICAgIC8vCisgICAgLy8gU28gbXVjaCByZWR1bmRhbnQgY29kZSAuLi4uLiB3aGF0IEknZCBnaXZlIGZvciBnZW5lcmljcyEKKyAgICAvLworCisgICAgcHJvdGVjdGVkIHZvaWQgdW5pb25BcnJheVNldHRlckhlbHBlciAoIE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLm9iamVjdFNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJvb2xlYW5bXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBmbG9hdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGRvdWJsZVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIHNob3J0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBpbnRbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBsb25nW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQmlnRGVjaW1hbFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEJpZ0ludGVnZXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFN0cmluZ1tdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworICAgICAgICAKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggR0R1cmF0aW9uW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQ2FsZW5kYXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBEYXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggUU5hbWVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBlbGVtTmFtZSApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIGVsZW1OYW1lLCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggZWxlbU5hbWUsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggZWxlbU5hbWUgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBlbGVtTmFtZSwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKworICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lLCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggTGlzdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIGVsZW1OYW1lICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggZWxlbU5hbWUsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmlvbkFycmF5U2V0dGVySGVscGVyICggT2JqZWN0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5vYmplY3RTZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBib29sZWFuW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBmbG9hdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggZG91YmxlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBieXRlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBzaG9ydFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggaW50W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBsb25nW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBCaWdEZWNpbWFsW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBCaWdJbnRlZ2VyW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKworICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKworICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIGJ5dGVbXVtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggR0RhdGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKworICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIEdEdXJhdGlvbltdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgVHlwZVN0b3JlIHN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgaW50IG0gPSBzdG9yZS5jb3VudF9lbGVtZW50cyggc2V0ICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG0tLSApCisgICAgICAgICAgICBzdG9yZS5yZW1vdmVfZWxlbWVudCggc2V0LCBtIC0gMSApOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBuIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVXNlciB1c2VyOworCisgICAgICAgICAgICBpZiAoaSA+PSBtKQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5hZGRfZWxlbWVudF91c2VyKCBlbGVtTmFtZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVzZXIgPSBzdG9yZS5maW5kX2VsZW1lbnRfdXNlciggc2V0LCBpICk7CisKKyAgICAgICAgICAgICgoWG1sT2JqZWN0QmFzZSkgdXNlcikuc2V0KCBzb3VyY2VzWyBpIF0gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFycmF5U2V0dGVySGVscGVyICggQ2FsZW5kYXJbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKworICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIERhdGVbXSBzb3VyY2VzLCBRTmFtZSBlbGVtTmFtZSwgUU5hbWVTZXQgc2V0ICkKKyAgICB7CisgICAgICAgIGludCBuID0gc291cmNlcyA9PSBudWxsID8gMCA6IHNvdXJjZXMubGVuZ3RoOworCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKworICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFFOYW1lW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYXJyYXlTZXR0ZXJIZWxwZXIgKCBMaXN0W10gc291cmNlcywgUU5hbWUgZWxlbU5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBpbnQgbiA9IHNvdXJjZXMgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZSBzdG9yZSA9IGdldF9zdG9yZSgpOworCisgICAgICAgIGludCBtID0gc3RvcmUuY291bnRfZWxlbWVudHMoIHNldCApOworCisgICAgICAgIGZvciAoIDsgbSA+IG4gOyBtLS0gKQorICAgICAgICAgICAgc3RvcmUucmVtb3ZlX2VsZW1lbnQoIHNldCwgbSAtIDEgKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbiA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGVTdG9yZVVzZXIgdXNlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPj0gbSkKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuYWRkX2VsZW1lbnRfdXNlciggZWxlbU5hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1c2VyID0gc3RvcmUuZmluZF9lbGVtZW50X3VzZXIoIHNldCwgaSApOworCisgICAgICAgICAgICAoKFhtbE9iamVjdEJhc2UpIHVzZXIpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lICkKKyAgICB7CisgICAgICAgIGdldF9zdG9yZSgpLmFycmF5X3NldHRlciggc291cmNlcywgZWxlbU5hbWUgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcnJheVNldHRlckhlbHBlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1OYW1lLCBRTmFtZVNldCBzZXQgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBzb3VyY2VzID09IG51bGwgPyAwIDogc291cmNlcy5sZW5ndGg7CisgICAgICAgIAorICAgICAgICBUeXBlU3RvcmUgc3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICBpbnQgbSA9IHN0b3JlLmNvdW50X2VsZW1lbnRzKCBzZXQgKTsKKworICAgICAgICBmb3IgKCA7IG0gPiBuIDsgbS0tICkKKyAgICAgICAgICAgIHN0b3JlLnJlbW92ZV9lbGVtZW50KCBzZXQsIG0gLSAxICk7CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIHVzZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpID49IG0pCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmFkZF9lbGVtZW50X3VzZXIoIGVsZW1OYW1lICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXNlciA9IHN0b3JlLmZpbmRfZWxlbWVudF91c2VyKCBzZXQsIGkgKTsKKworICAgICAgICAgICAgKChYbWxPYmplY3RCYXNlKSB1c2VyKS5zZXQoIHNvdXJjZXNbIGkgXSApOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2MyMTdlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGF0ZUltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworCitwdWJsaWMgY2xhc3MgWG1sRGF0ZUltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERhdGUKK3sKKyAgICBwdWJsaWMgWG1sRGF0ZUltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbERhdGUudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbERhdGVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlVGltZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERhdGVUaW1lSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmRiNmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEYXRlVGltZUltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZVRpbWU7CisKKworcHVibGljIGNsYXNzIFhtbERhdGVUaW1lSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRGF0ZVRpbWUKK3sKKyAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxEYXRlVGltZS50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sRGF0ZVRpbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEZWNpbWFsSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2IzZWEzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbEltcGwuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEZWNpbWFsOworCitwdWJsaWMgY2xhc3MgWG1sRGVjaW1hbEltcGwgZXh0ZW5kcyBKYXZhRGVjaW1hbEhvbGRlciBpbXBsZW1lbnRzIFhtbERlY2ltYWwKK3sKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRGVjaW1hbFJlc3RyaWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMjBjNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERlY2ltYWxSZXN0cmljdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERlY2ltYWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sRGVjaW1hbFJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YURlY2ltYWxIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbERlY2ltYWwKK3sKKyAgICBwdWJsaWMgWG1sRGVjaW1hbFJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEb3VibGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MjZmMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZUltcGwuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb3VibGU7CisKK3B1YmxpYyBjbGFzcyBYbWxEb3VibGVJbXBsIGV4dGVuZHMgSmF2YURvdWJsZUhvbGRlciBpbXBsZW1lbnRzIFhtbERvdWJsZQoreworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRG91YmxlUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZTg5MAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbERvdWJsZVJlc3RyaWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG91YmxlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworcHVibGljIGNsYXNzIFhtbERvdWJsZVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YURvdWJsZUhvbGRlckV4IGltcGxlbWVudHMgWG1sRG91YmxlCit7CisgICAgcHVibGljIFhtbERvdWJsZVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbER1cmF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjEzMWYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxEdXJhdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CisKKworcHVibGljIGNsYXNzIFhtbER1cmF0aW9uSW1wbCBleHRlbmRzIEphdmFHRHVyYXRpb25Ib2xkZXJFeCBpbXBsZW1lbnRzIFhtbER1cmF0aW9uCit7CisgICAgcHVibGljIFhtbER1cmF0aW9uSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sRHVyYXRpb24udHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbER1cmF0aW9uSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXRpZXNJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdGllc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYyMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXRpZXNJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVOVElUSUVTOworCisKK3B1YmxpYyBjbGFzcyBYbWxFbnRpdGllc0ltcGwgZXh0ZW5kcyBYbWxMaXN0SW1wbCBpbXBsZW1lbnRzIFhtbEVOVElUSUVTCit7CisgICAgcHVibGljIFhtbEVudGl0aWVzSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sRU5USVRJRVMudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbEVudGl0aWVzSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRW50aXR5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzdmNGIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxFbnRpdHlJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRU5USVRZOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworCitwdWJsaWMgY2xhc3MgWG1sRW50aXR5SW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEVOVElUWQoreworICAgIHB1YmxpYyBYbWxFbnRpdHlJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxFTlRJVFkudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbEVudGl0eUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0MzQzZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEZsb2F0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEZsb2F0OworCisKK3B1YmxpYyBjbGFzcyBYbWxGbG9hdEltcGwgZXh0ZW5kcyBKYXZhRmxvYXRIb2xkZXIgaW1wbGVtZW50cyBYbWxGbG9hdAoreworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sRmxvYXRSZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmI2YTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxGbG9hdFJlc3RyaWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRmxvYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sRmxvYXRSZXN0cmljdGlvbiBleHRlbmRzIEphdmFGbG9hdEhvbGRlckV4IGltcGxlbWVudHMgWG1sRmxvYXQKK3sKKyAgICBwdWJsaWMgWG1sRmxvYXRSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR0RheUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2NjU0NQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdEYXlJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sR0RheTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CisKKworcHVibGljIGNsYXNzIFhtbEdEYXlJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHRGF5Cit7CisgICAgcHVibGljIFhtbEdEYXlJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxHRGF5LnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxHRGF5SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoRGF5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoRGF5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Yjc2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHTW9udGhEYXlJbXBsLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdNb250aERheTsKKworcHVibGljIGNsYXNzIFhtbEdNb250aERheUltcGwgZXh0ZW5kcyBKYXZhR0RhdGVIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbEdNb250aERheQoreworICAgIHB1YmxpYyBYbWxHTW9udGhEYXlJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxHTW9udGhEYXkudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbEdNb250aERheUltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdNb250aEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ2YjUxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR01vbnRoSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHTW9udGg7IAorCitwdWJsaWMgY2xhc3MgWG1sR01vbnRoSW1wbCBleHRlbmRzIEphdmFHRGF0ZUhvbGRlckV4IGltcGxlbWVudHMgWG1sR01vbnRoCit7CisgICAgcHVibGljIFhtbEdNb250aEltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbEdNb250aC50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sR01vbnRoSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBmODM0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sR1llYXJJbXBsLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEdZZWFyOworCitwdWJsaWMgY2xhc3MgWG1sR1llYXJJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHWWVhcgoreworICAgIHB1YmxpYyBYbWxHWWVhckltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbEdZZWFyLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxHWWVhckltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEdZZWFyTW9udGhJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODk3YzcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxHWWVhck1vbnRoSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxHWWVhck1vbnRoOyAKKworcHVibGljIGNsYXNzIFhtbEdZZWFyTW9udGhJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxHWWVhck1vbnRoCit7CisgICAgcHVibGljIFhtbEdZZWFyTW9udGhJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxHWWVhck1vbnRoLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxHWWVhck1vbnRoSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODllMzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxIZXhCaW5hcnlJbXBsLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSGV4QmluYXJ5OworCisKK3B1YmxpYyBjbGFzcyBYbWxIZXhCaW5hcnlJbXBsIGV4dGVuZHMgSmF2YUhleEJpbmFyeUhvbGRlciBpbXBsZW1lbnRzIFhtbEhleEJpbmFyeQoreworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSGV4QmluYXJ5UmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MjAyNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEhleEJpbmFyeVJlc3RyaWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEhleEJpbmFyeTsKKworcHVibGljIGNsYXNzIFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YUhleEJpbmFyeUhvbGRlckV4IGltcGxlbWVudHMgWG1sSGV4QmluYXJ5Cit7CisgICAgcHVibGljIFhtbEhleEJpbmFyeVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjBiMTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZEltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSUQ7CisKKworcHVibGljIGNsYXNzIFhtbElkSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbElECit7CisgICAgcHVibGljIFhtbElkSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sSUQudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbElkSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJZFJlZkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZlYTYyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbElEUkVGOworCisKK3B1YmxpYyBjbGFzcyBYbWxJZFJlZkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxJRFJFRgoreworICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbElEUkVGLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxJZFJlZkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbElkUmVmc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlmYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSWRSZWZzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJRFJFRlM7CisKK3B1YmxpYyBjbGFzcyBYbWxJZFJlZnNJbXBsIGV4dGVuZHMgWG1sTGlzdEltcGwgaW1wbGVtZW50cyBYbWxJRFJFRlMKK3sKKyAgICBwdWJsaWMgWG1sSWRSZWZzSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sSURSRUZTLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxJZFJlZnNJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4NjE4MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludEltcGwuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnQ7CisKKworcHVibGljIGNsYXNzIFhtbEludEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyIGltcGxlbWVudHMgWG1sSW50Cit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRSZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50UmVzdHJpY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA4NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sSW50UmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50OworCitwdWJsaWMgY2xhc3MgWG1sSW50UmVzdHJpY3Rpb24gZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxJbnQKK3sKKyAgICBwdWJsaWMgWG1sSW50UmVzdHJpY3Rpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWY2MTkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7CisKKworcHVibGljIGNsYXNzIFhtbEludGVnZXJJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXIgaW1wbGVtZW50cyBYbWxJbnRlZ2VyCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbEludGVnZXJSZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ODc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxJbnRlZ2VyUmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50ZWdlcjsKKworcHVibGljIGNsYXNzIFhtbEludGVnZXJSZXN0cmljdGlvbiBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxJbnRlZ2VyCit7CisgICAgcHVibGljIFhtbEludGVnZXJSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGFuZ3VhZ2VJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMYW5ndWFnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmM1MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGFuZ3VhZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGFuZ3VhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sTGFuZ3VhZ2VJbXBsIGV4dGVuZHMgSmF2YVN0cmluZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sTGFuZ3VhZ2UKK3sKKyAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxMYW5ndWFnZS50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sTGFuZ3VhZ2VJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMaXN0SW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjAzYzIxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTGlzdEltcGwuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNpbXBsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxDaGFyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgWG1sTGlzdEltcGwgZXh0ZW5kcyBYbWxPYmplY3RCYXNlIGltcGxlbWVudHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIHB1YmxpYyBYbWxMaXN0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBfc2NoZW1hVHlwZSA9IHR5cGU7IGluaXRDb21wbGV4VHlwZShjb21wbGV4LCBmYWxzZSk7IH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKQorICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZTsgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFUeXBlIF9zY2hlbWFUeXBlOworICAgIHByaXZhdGUgWG1sU2ltcGxlTGlzdCBfdmFsdWU7CisgICAgcHJpdmF0ZSBYbWxTaW1wbGVMaXN0IF9qdmFsdWU7CisKKworCisgICAgLy8gU0lNUExFIFZBTFVFIEFDQ0VTU09SUyBCRUxPVyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZ2V0cyByYXcgdGV4dCB2YWx1ZQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG51bGxBc0VtcHR5KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVfbGlzdF90ZXh0KExpc3QgeExpc3QpCisgICAgeworICAgICAgICBpZiAoeExpc3Quc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQobnVsbEFzRW1wdHkoKChTaW1wbGVWYWx1ZSl4TGlzdC5nZXQoMCkpLmdldFN0cmluZ1ZhbHVlKCkpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHhMaXN0LnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChudWxsQXNFbXB0eSgoKFNpbXBsZVZhbHVlKXhMaXN0LmdldChpKSkuZ2V0U3RyaW5nVmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlX3RleHQoTmFtZXNwYWNlTWFuYWdlciBuc20pCisgICAgeworICAgICAgICByZXR1cm4gY29tcHV0ZV9saXN0X3RleHQoX3ZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sU2ltcGxlTGlzdCBzYXZlZFZhbHVlID0gX3ZhbHVlOworICAgICAgICAgICAgc2V0X3RleHQodik7CisKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHNhdmVkIHZhbHVlCisgICAgICAgICAgICBfdmFsdWUgPSBzYXZlZFZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF90ZXh0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgLy8gZmlyc3QgY2hlY2sgYWdhaW5zdCBhbnkgcGF0dGVybnMuLi4KKyAgICAgICAgaWYgKF92YWxpZGF0ZU9uU2V0KCkgJiYgIV9zY2hlbWFUeXBlLm1hdGNoUGF0dGVybkZhY2V0KHMpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgIFNjaGVtYVR5cGUgaXRlbVR5cGUgPSBfc2NoZW1hVHlwZS5nZXRMaXN0SXRlbVR5cGUoKTsKKworICAgICAgICBYbWxTaW1wbGVMaXN0IG5ld3ZhbCA9IGxleChzLCBpdGVtVHlwZSwgX3Zvb3JWYywgaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwpOworCisgICAgICAgIC8vIGNoZWNrIGVudW1lcmF0aW9uCisgICAgICAgIGlmIChfdmFsaWRhdGVPblNldCgpKQorICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZShuZXd2YWwsIF9zY2hlbWFUeXBlLCBfdm9vclZjKTsKKworICAgICAgICAvLyB3ZSBtYWRlIGl0IGFsbCB0aGUgd2F5IHRocm91Z2g7IHNvIHdlJ3JlIE9LLgorICAgICAgICBfdmFsdWUgPSBuZXd2YWw7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0X2xpc3QoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOworICAgICAgICAgICAgICAgIAorICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgWE1MQ2hhci5pc1NwYWNlKHMuY2hhckF0KGkpKSkKKyAgICAgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgICBpZiAoaSA+PSBzLmxlbmd0aCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWV9TVFJJTkdBUlJBWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSBpOworICAgICAgICAgICAgd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmICFYTUxDaGFyLmlzU3BhY2Uocy5jaGFyQXQoaSkpKQorICAgICAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQocy5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFhtbFNpbXBsZUxpc3QgbGV4KFN0cmluZyBzLCBTY2hlbWFUeXBlIGl0ZW1UeXBlLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgsIFByZWZpeFJlc29sdmVyIHJlc29sdmVyKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gcGFydHMgPSBzcGxpdF9saXN0KHMpOworCisgICAgICAgIFhtbEFueVNpbXBsZVR5cGVbXSBuZXdBcnJheSA9IG5ldyBYbWxBbnlTaW1wbGVUeXBlW3BhcnRzLmxlbmd0aF07CisgICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7CisgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQocmVzb2x2ZXIpKTsKKyAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXlbaV0gPSBpdGVtVHlwZS5uZXdWYWx1ZShwYXJ0c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJMaXN0IGl0ZW0gJyIgKyBwYXJ0c1tpXSArICInIGlzIG5vdCBhIHZhbGlkIHZhbHVlIG9mICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShpdGVtVHlwZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwdXNoZWQpCisgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFhtbFNpbXBsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXdBcnJheSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9uaWwoKQorICAgIHsKKyAgICAgICAgX3ZhbHVlID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2RhdGVkKCk7CisgICAgICAgIHJldHVybiBfdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2RhdGVkKCk7CisgICAgICAgIGlmIChfdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoX2p2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIF9qdmFsdWU7CisgICAgICAgIExpc3QgamF2YVJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfdmFsdWUuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBqYXZhUmVzdWx0LmFkZChqYXZhX3ZhbHVlKChYbWxPYmplY3QpX3ZhbHVlLmdldChpKSkpOworICAgICAgICBfanZhbHVlID0gbmV3IFhtbFNpbXBsZUxpc3QoamF2YVJlc3VsdCk7CisgICAgICAgIHJldHVybiBfanZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGVybWl0c19pbm5lcl9zcGFjZShYbWxPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgoKFNpbXBsZVZhbHVlKW9iaikuaW5zdGFuY2VUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1NUUklORzoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1NJTVBMRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1RZUEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfd2hpdGVfc3BhY2UoU3RyaW5nIHMpCisgICAgeworICAgICAgICByZXR1cm4gcy5pbmRleE9mKCcgJykgPj0gMCB8fAorICAgICAgICAgICAgICAgIHMuaW5kZXhPZignXHQnKSA+PSAwIHx8CisgICAgICAgICAgICAgICAgcy5pbmRleE9mKCdcbicpID49IDAgfHwKKyAgICAgICAgICAgICAgICBzLmluZGV4T2YoJ1xyJykgPj0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfbGlzdChMaXN0IGxpc3QpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIGl0ZW1UeXBlID0gX3NjaGVtYVR5cGUuZ2V0TGlzdEl0ZW1UeXBlKCk7CisgICAgICAgIFhtbFNpbXBsZUxpc3QgeExpc3Q7CisKKyAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGhhc19zdG9yZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKKyAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlW10gbmV3dmFsID0gbmV3IFhtbEFueVNpbXBsZVR5cGVbbGlzdC5zaXplKCldOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9iamVjdCBlbnRyeSA9IGxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICgoZW50cnkgaW5zdGFuY2VvZiBYbWxPYmplY3QpICYmIHBlcm1pdHNfaW5uZXJfc3BhY2UoKFhtbE9iamVjdClsaXN0LmdldChpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5ncmVwID0gbGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zX3doaXRlX3NwYWNlKHN0cmluZ3JlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld3ZhbFtpXSA9IGl0ZW1UeXBlLm5ld1ZhbHVlKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhMaXN0ID0gbmV3IFhtbFNpbXBsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXd2YWwpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwdXNoZWQpCisgICAgICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICBpZiAoX3ZhbGlkYXRlT25TZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2hlY2sgZW51bWVyYXRpb24gKyBtaW4vbWF4L2V0YworICAgICAgICAgICAgdmFsaWRhdGVWYWx1ZSh4TGlzdCwgX3NjaGVtYVR5cGUsIF92b29yVmMpOworICAgICAgICB9CisKKyAgICAgICAgX3ZhbHVlID0geExpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmFsdWUoWG1sU2ltcGxlTGlzdCBpdGVtcywgU2NoZW1hVHlwZSBzVHlwZSwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIFhtbE9iamVjdFtdIGVudW12YWxzID0gc1R5cGUuZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKKyAgICAgICAgY2hlY2tFbnVtOiBpZiAoZW51bXZhbHMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXF1YWxfeG1sTGlzdHMoaXRlbXMsICgoWG1sT2JqZWN0QmFzZSllbnVtdmFsc1tpXSkueGxpc3RWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2hlY2tFbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJMaXN0ICgiICsgaXRlbXMgKyAiKSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdGVkIHZhbHVlIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbE9iamVjdCBvOworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9MRU5HVEggKSkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChpID0gKChTaW1wbGVWYWx1ZSlvKS5nZXRJbnRWYWx1ZSgpKSAhPSBpdGVtcy5zaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIGl0ZW1zICsgIikgZG9lcyBub3QgaGF2ZSAiICsgaSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zIHBlciBsZW5ndGggZmFjZXQgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvID0gc1R5cGUuZ2V0RmFjZXQoIFNjaGVtYVR5cGUuRkFDRVRfTUlOX0xFTkdUSCApKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGkgPSAoKFNpbXBsZVZhbHVlKW8pLmdldEludFZhbHVlKCkpID4gaXRlbXMuc2l6ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgIkxpc3QgKCIgKyBpdGVtcyArICIpIGhhcyBvbmx5ICIgKyBpdGVtcy5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgZmV3ZXIgdGhhbiBtaW4gbGVuZ3RoIGZhY2V0ICgiICsgaSArICIpIGZvciAiICsgUU5hbWVIZWxwZXIucmVhZGFibGUoc1R5cGUpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG8gPSBzVHlwZS5nZXRGYWNldCggU2NoZW1hVHlwZS5GQUNFVF9NQVhfTEVOR1RIICkpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoaSA9ICgoU2ltcGxlVmFsdWUpbykuZ2V0SW50VmFsdWUoKSkgPCBpdGVtcy5zaXplKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKAorICAgICAgICAgICAgICAgICAgICAiTGlzdCAoIiArIGl0ZW1zICsgIikgaGFzICIgKyBpdGVtcy5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpdGVtcywgbW9yZSB0aGFuIG1heCBsZW5ndGggZmFjZXQgKCIgKyBpICsgIikgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzVHlwZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbXBhcmF0b3JzCisgICAgLy8gcHJvdGVjdGVkIGludCBjb21wYXJlX3RvKFhtbE9iamVjdCBpKSAtIG5vIHNvcnRpbmcgb3JkZXI7IGluaGVyaXQgZnJvbSBiYXNlCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVxdWFsX3htbExpc3RzKF92YWx1ZSwgKChYbWxPYmplY3RCYXNlKW9iaikueGxpc3RWYWx1ZSgpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxfeG1sTGlzdHMoTGlzdCBhLCBMaXN0IGIpCisgICAgeworICAgICAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhLmdldChpKS5lcXVhbHMoYi5nZXQoaSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IHZhbHVlX2hhc2hfY29kZSgpCisgICAgeworICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvLyBoYXNoIGNvZGUgcHJvYmVzIDkgZGlzdHJpYnV0ZWQgdmFsdWVzLCBwbHVzIHRoZSBsYXN0CisgICAgICAgIGludCBoYXNoID0gX3ZhbHVlLnNpemUoKTsKKyAgICAgICAgaW50IGluY3IgPSBfdmFsdWUuc2l6ZSgpIC8gOTsKKyAgICAgICAgaWYgKGluY3IgPCAxKQorICAgICAgICAgICAgaW5jciA9IDE7CisKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBfdmFsdWUuc2l6ZSgpOyBpICs9IGluY3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc2ggKj0gMTk7CisgICAgICAgICAgICBoYXNoICs9IF92YWx1ZS5nZXQoaSkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgX3ZhbHVlLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzaCAqPSAxOTsKKyAgICAgICAgICAgIGhhc2ggKz0gX3ZhbHVlLmdldChpKS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCisgICAgeworICAgICAgICB2YWxpZGF0ZVZhbHVlKChYbWxTaW1wbGVMaXN0KXhsaXN0VmFsdWUoKSwgc2NoZW1hVHlwZSgpLCBjdHgpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NWIwYmMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbExvbmc7CisKKworcHVibGljIGNsYXNzIFhtbExvbmdJbXBsIGV4dGVuZHMgSmF2YUxvbmdIb2xkZXIgaW1wbGVtZW50cyBYbWxMb25nCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nUmVzdHJpY3Rpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbExvbmdSZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTM2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxMb25nUmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTG9uZzsKKworcHVibGljIGNsYXNzIFhtbExvbmdSZXN0cmljdGlvbiBleHRlbmRzIEphdmFMb25nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxMb25nCit7CisgICAgcHVibGljIFhtbExvbmdSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTkNOYW1lSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWJjMmYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOQ05hbWVJbXBsLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTkNOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKKworcHVibGljIGNsYXNzIFhtbE5DTmFtZUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOQ05hbWUKK3sKKyAgICBwdWJsaWMgWG1sTkNOYW1lSW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sTkNOYW1lLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxOQ05hbWVJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVMZXhpY2FsKFN0cmluZyB2LCBWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHYpICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5pbnZhbGlkKCJWYWx1ZSAnIiArIHYgKyAiJyBpdCdzIG5vdCBhIHZhbGlkIE5DTmFtZS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOYW1lSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNhMDgxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmFtZUltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTmFtZTsKKworCitwdWJsaWMgY2xhc3MgWG1sTmFtZUltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOYW1lCit7CisgICAgcHVibGljIFhtbE5hbWVJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxOYW1lLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxOYW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZGZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE5lZ2F0aXZlSW50ZWdlcjsKKworCitwdWJsaWMgY2xhc3MgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOZWdhdGl2ZUludGVnZXIKK3sKKyAgICBwdWJsaWMgWG1sTmVnYXRpdmVJbnRlZ2VySW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxOZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxObVRva2VuSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ2MmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbkltcGwuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKKworCitwdWJsaWMgY2xhc3MgWG1sTm1Ub2tlbkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOTVRPS0VOCit7CisgICAgcHVibGljIFhtbE5tVG9rZW5JbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxOTVRPS0VOLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxObVRva2VuSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTGV4aWNhbChTdHJpbmcgdiwgVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICggIVhNTENoYXIuaXNWYWxpZE5tdG9rZW4odikgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LmludmFsaWQoIlZhbHVlICciICsgdiArICInIGl0J3Mgbm90IGEgdmFsaWQgTk1UT0tFTi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm1Ub2tlbnNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4Y2Q0YgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5tVG9rZW5zSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOTVRPS0VOUzsKKworCitwdWJsaWMgY2xhc3MgWG1sTm1Ub2tlbnNJbXBsIGV4dGVuZHMgWG1sTGlzdEltcGwgaW1wbGVtZW50cyBYbWxOTVRPS0VOUworeworICAgIHB1YmxpYyBYbWxObVRva2Vuc0ltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbE5NVE9LRU5TLnR5cGUsIGZhbHNlKTt9CisgICAgcHVibGljIFhtbE5tVG9rZW5zSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjZiOTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uTmVnYXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworCitwdWJsaWMgY2xhc3MgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCBleHRlbmRzIEphdmFJbnRlZ2VySG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb25OZWdhdGl2ZUludGVnZXIKK3sKKyAgICBwdWJsaWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VySW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxOb25OZWdhdGl2ZUludGVnZXJJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZTVlZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vblBvc2l0aXZlSW50ZWdlckltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTm9uUG9zaXRpdmVJbnRlZ2VyOworCisKK3B1YmxpYyBjbGFzcyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbE5vblBvc2l0aXZlSW50ZWdlcgoreworICAgIHB1YmxpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXJJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxOb25Qb3NpdGl2ZUludGVnZXIudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbE5vblBvc2l0aXZlSW50ZWdlckltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbE5vcm1hbGl6ZWRTdHJpbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGU0NjMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3JtYWxpemVkU3RyaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb3JtYWxpemVkU3RyaW5nOworCitwdWJsaWMgY2xhc3MgWG1sTm9ybWFsaXplZFN0cmluZ0ltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxOb3JtYWxpemVkU3RyaW5nCit7CisgICAgcHVibGljIFhtbE5vcm1hbGl6ZWRTdHJpbmdJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxOb3JtYWxpemVkU3RyaW5nLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxOb3JtYWxpemVkU3RyaW5nSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjYzMmIwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT047CisKK3B1YmxpYyBjbGFzcyBYbWxOb3RhdGlvbkltcGwgZXh0ZW5kcyBKYXZhTm90YXRpb25Ib2xkZXIgaW1wbGVtZW50cyBYbWxOT1RBVElPTgoreworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sTm90YXRpb25SZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjMwNTcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxOb3RhdGlvblJlc3RyaWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTk9UQVRJT047CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sTm90YXRpb25SZXN0cmljdGlvbiBleHRlbmRzIEphdmFOb3RhdGlvbkhvbGRlckV4IGltcGxlbWVudHMgWG1sTk9UQVRJT04KK3sKKyAgICBwdWJsaWMgWG1sTm90YXRpb25SZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sT2JqZWN0QmFzZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sT2JqZWN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTdhNmMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxPYmplY3RCYXNlLmphdmEKQEAgLTAsMCArMSwyNjM5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxXaGl0ZXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uVmFsaWRhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5HbG9iYWxMb2NrOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5TY2hlbWFUeXBlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVWaXNpdG9ySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsaWRhdG9yLlZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFBdHRyaWJ1dGVNb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEFueVNpbXBsZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQcm9wZXJ0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0RhdGVTcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9uU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlN0cmluZ0VudW1BYnN0cmFjdEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5GaWx0ZXJYbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5EZWxlZ2F0ZVhtbE9iamVjdDsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFR5cGVTdG9yZVVzZXIsIFNlcmlhbGl6YWJsZSwgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZQoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgTUFKT1JfVkVSU0lPTl9OVU1CRVIgPSAoc2hvcnQpIDE7IC8vIGZvciBzZXJpYWxpemF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBNSU5PUl9WRVJTSU9OX05VTUJFUiA9IChzaG9ydCkgMTsgLy8gZm9yIHNlcmlhbGl6YXRpb24KKworICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbW9uaXRvcigpCisgICAgeworICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCisgICAgICAgICAgICByZXR1cm4gZ2V0X3N0b3JlKCkuZ2V0X3Jvb3Rfb2JqZWN0KCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBYbWxPYmplY3RCYXNlIHVuZGVybHlpbmcoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sT2JqZWN0QmFzZSkKKyAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0QmFzZSlvYmo7CisgICAgICAgIHdoaWxlIChvYmogaW5zdGFuY2VvZiBEZWxlZ2F0ZVhtbE9iamVjdCkKKyAgICAgICAgICAgIG9iaiA9ICgoRGVsZWdhdGVYbWxPYmplY3Qpb2JqKS51bmRlcmx5aW5nWG1sT2JqZWN0KCk7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYbWxPYmplY3RCYXNlKQorICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3RCYXNlKW9iajsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm9uLW5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgb2YgWG1sT2JqZWN0IHNob3VsZCBleHRlbmQgRmlsdGVyWG1sT2JqZWN0IG9yIGltcGxlbWVudCBEZWxlZ2F0ZVhtbE9iamVjdCIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBYbWxPYmplY3QgY29weSgpCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW1tdXRhYmxlIG9iamVjdHMgZG9uJ3QgZ2V0IGNvcGllZC4gVGhleSdyZSBpbW11dGFibGUKKyAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOworCisgICAgICAgICAgICAvLyBjb3B5IHRoZSB0eXBlCisgICAgICAgICAgICBYbWxPYmplY3QgcmVzdWx0ID0gZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKS5uZXdJbnN0YW5jZShzY2hlbWFUeXBlKCksIG51bGwpOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgIFhtbE9iamVjdEJhc2UgdGFyZ2V0ID0gdW5kZXJseWluZyhyZXN1bHQpOworICAgICAgICAgICAgdGFyZ2V0LmdldF9zdG9yZSgpLmNvcHlfY29udGVudHNfZnJvbShnZXRfc3RvcmUoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpCisgICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQorCisgICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCkKKyAgICAgICAgeyByZXR1cm4gbmV3WE1MSW5wdXRTdHJlYW0obnVsbCk7IH0KKworICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3WE1MSW5wdXRTdHJlYW0obWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKCkKKyAgICAgICAgeyByZXR1cm4gbmV3SW5wdXRTdHJlYW0obnVsbCk7IH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IHJldHVybiBjdXIubmV3SW5wdXRTdHJlYW0obWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQorCisgICAgcHVibGljIFJlYWRlciBuZXdSZWFkZXIoKQorICAgICAgICB7IHJldHVybiBuZXdSZWFkZXIobnVsbCk7IH0KKworICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgcmV0dXJuIGN1ci5uZXdSZWFkZXIobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQorCisgICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZSgpCisgICAgICAgIHsgcmV0dXJuIG5ld0RvbU5vZGUobnVsbCk7IH0KKworICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKQorICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyByZXR1cm4gY3VyLm5ld0RvbU5vZGUobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7IH0gZmluYWxseSB7IGN1ci5kaXNwb3NlKCk7IH0gfQorCisgICAgcHVibGljIHZvaWQgc2F2ZShDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZShjaCwgbGgsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7IFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOyB0cnkgeyBjdXIuc2F2ZShmaWxlLCBtYWtlSW5uZXJPcHRpb25zKG9wdGlvbnMpKTsgfSBmaW5hbGx5IHsgY3VyLmRpc3Bvc2UoKTsgfSB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcywgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeyBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yRm9yY2UoKTsgdHJ5IHsgY3VyLnNhdmUob3MsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoV3JpdGVyIHcsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsgWG1sQ3Vyc29yIGN1ciA9IG5ld0N1cnNvckZvcmNlKCk7IHRyeSB7IGN1ci5zYXZlKHcsIG1ha2VJbm5lck9wdGlvbnMob3B0aW9ucykpOyB9IGZpbmFsbHkgeyBjdXIuZGlzcG9zZSgpOyB9IH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsgc2F2ZSggY2gsIGxoLCBudWxsICk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeyBzYXZlKCBmaWxlLCBudWxsICk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeyBzYXZlKCBvcywgbnVsbCApOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeyBzYXZlKCB3LCBudWxsICk7IH0KKworICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3Q3Vyc29yRm9yY2UoKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVTdG9yZSgpLm5ld0N1cnNvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBYbWxPYmplY3QgZW5zdXJlU3RvcmUoKQorICAgIHsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKworICAgICAgICBTdHJpbmcgdmFsdWUgPQorICAgICAgICAgICAgKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwCisgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgIDogY29tcHV0ZV90ZXh0KCBoYXNfc3RvcmUoKSA/IGdldF9zdG9yZSgpIDogbnVsbCApOworCisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKHNjaGVtYVR5cGUoKSk7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSggb3B0aW9ucyApOworCisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLmluc2VydENoYXJzKCB2YWx1ZSApOworCisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbE9wdGlvbnMgbWFrZUlubmVyT3B0aW9ucyhYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBYbWxPcHRpb25zIGlubmVyT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCBvcHRpb25zICk7CisgICAgICAgIGlubmVyT3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9JTk5FUiApOworICAgICAgICByZXR1cm4gaW5uZXJPcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3Q3Vyc29yKCkKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlhNTCBWYWx1ZSBPYmplY3RzIGNhbm5vdCBjcmVhdGUgY3Vyc29ycyIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOworICAgICAgICAgICAgcmV0dXJuIGdldF9zdG9yZSgpLm5ld19jdXJzb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIHNjaGVtYVR5cGUoKTsKKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSgpCisgICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgcmV0dXJuIGlzTmlsKCkgPyBudWxsIDogc2NoZW1hVHlwZSgpOyB9IH0KKworICAgIHByaXZhdGUgU2NoZW1hRmllbGQgc2NoZW1hRmllbGQoKSB7CisgICAgICAgIFNjaGVtYVR5cGUgc3QgPSBzY2hlbWFUeXBlKCk7CisgICAgICAgIFNjaGVtYUZpZWxkIGZpZWxkOworCisgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgZmllbGQgaGFzIGFuIGFub255bW91cyB0eXBlCisgICAgICAgIGZpZWxkID0gc3QuZ2V0Q29udGFpbmVyRmllbGQoKTsKKworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIGZpZWxkID0gZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYV9maWVsZCgpOworCisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgX3Zvb3JWYyB3aGVuIHlvdSB3YW50IHRvIHRocm93IGEgVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIHdoZW4KKyAgICAgKiB2YWxpZGF0aW5nIGEgc2ltcGxlIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVmFsdWVPdXRPZlJhbmdlVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dAorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZChTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiggbWVzc2FnZSApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBzdXBwbHkgdmFsaWRhdGlvbiBjb250ZXh0IGZvciB0aGUgdmFsaWRhdGVfdmFsdWUgbWV0aG9kcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEltbXV0YWJsZVZhbHVlVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQ29udGV4dAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3QgX2xvYzsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIF9jb2xsOworICAgICAgICBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0KENvbGxlY3Rpb24gY29sbCwgWG1sT2JqZWN0IGxvYykKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbGwgPSBjb2xsOworICAgICAgICAgICAgX2xvYyA9IGxvYzsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkKFN0cmluZyBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgIF9jb2xsLmFkZChYbWxFcnJvci5mb3JPYmplY3QobWVzc2FnZSwgX2xvYykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWxpZGF0aW9uQ29udGV4dCBfdm9vclZjID0gbmV3IFZhbHVlT3V0T2ZSYW5nZVZhbGlkYXRpb25Db250ZXh0KCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZSgpCisgICAgICAgIHsgcmV0dXJuIHZhbGlkYXRlKG51bGwpOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2ltbXV0YWJsZShvcHRpb25zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlhNTCBvYmplY3RzIHdpdGggbm8gdW5kZXJseWluZyBzdG9yZSBjYW5ub3QgYmUgdmFsaWRhdGVkIik7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX09SUEhBTkVEKSAhPSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICBTY2hlbWFGaWVsZCBmaWVsZCA9IHNjaGVtYUZpZWxkKCk7CisgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBzY2hlbWFUeXBlKCk7CisKKyAgICAgICAgICAgIFR5cGVTdG9yZSB0eXBlU3RvcmUgPSBnZXRfc3RvcmUoKTsKKworICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9CisgICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICAgICAgdHlwZSwgZmllbGQsIHR5cGVTdG9yZS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpLCBvcHRpb25zLCBudWxsKTsKKworICAgICAgICAgICAgdHlwZVN0b3JlLnZhbGlkYXRlKCB2YWxpZGF0b3IgKTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVfaW1tdXRhYmxlKFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIENvbGxlY3Rpb24gZXJyb3JMaXN0ZW5lciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiAoQ29sbGVjdGlvbilvcHRpb25zLmdldChYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSKTsKKyAgICAgICAgWG1sRXJyb3JXYXRjaGVyIHdhdGNoZXIgPSBuZXcgWG1sRXJyb3JXYXRjaGVyKGVycm9yTGlzdGVuZXIpOworICAgICAgICBpZiAoIXNjaGVtYVR5cGUoKS5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2Fubm90IGhhdmUgYW55IHJlcXVpcmVkIGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMKKyAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcyA9IHNjaGVtYVR5cGUoKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbaV0uZ2V0TWluT2NjdXJzKCkuc2lnbnVtKCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNbaV0uaXNBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgIiArIFFOYW1lSGVscGVyLnByZXR0eShwcm9wZXJ0aWVzW2ldLmdldE5hbWUoKSksIHRoaXMpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNaXNzaW5nIHJlcXVpcmVkIGVsZW1lbnQgIiArIFFOYW1lSGVscGVyLnByZXR0eShwcm9wZXJ0aWVzW2ldLmdldE5hbWUoKSksIHRoaXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlKCkuZ2V0Q29udGVudFR5cGUoKSAhPSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UKQorICAgICAgICAgICAgICAgIHJldHVybiAhd2F0Y2hlci5oYXNFcnJvcigpOyAvLyBkb24ndCB2YWxpZGF0ZSBub24tc2ltcGxlLWNvbnRlbnQKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylfdGV4dHNvdXJjZTsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgdmFsaWRhdGVfc2ltcGxldmFsKHRleHQsIG5ldyBJbW11dGFibGVWYWx1ZVZhbGlkYXRpb25Db250ZXh0KHdhdGNoZXIsIHRoaXMpKTsKKyAgICAgICAgcmV0dXJuICF3YXRjaGVyLmhhc0Vycm9yKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgWG1sT2JqZWN0W10gX3R5cGVkQXJyYXkoWG1sT2JqZWN0W10gaW5wdXQpCisgICAgeworICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIFNjaGVtYVR5cGUgY29tbW9uVHlwZSA9IGlucHV0WzBdLnNjaGVtYVR5cGUoKTsKKyAgICAgICAgaWYgKGNvbW1vblR5cGUuZXF1YWxzKFhtbE9iamVjdC50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29tbW9uVHlwZSA9IGNvbW1vblR5cGUuZ2V0Q29tbW9uQmFzZVR5cGUoaW5wdXRbaV0uc2NoZW1hVHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChjb21tb25UeXBlLmVxdWFscyhYbWxPYmplY3QudHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICB9CisgICAgICAgIENsYXNzIGRlc2lyZWRDbGFzcyA9IGNvbW1vblR5cGUuZ2V0SmF2YUNsYXNzKCk7CisgICAgICAgIHdoaWxlIChkZXNpcmVkQ2xhc3MgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgY29tbW9uVHlwZSA9IGNvbW1vblR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgICAgIGlmIChYbWxPYmplY3QudHlwZS5lcXVhbHMoY29tbW9uVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICAgICAgZGVzaXJlZENsYXNzID0gY29tbW9uVHlwZS5nZXRKYXZhQ2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbE9iamVjdFtdIHJlc3VsdCA9IChYbWxPYmplY3RbXSlBcnJheS5uZXdJbnN0YW5jZShkZXNpcmVkQ2xhc3MsIGlucHV0Lmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaW5wdXQsIDAsIHJlc3VsdCwgMCwgaW5wdXQubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0W10gc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoICkKKyAgICB7CisgICAgICAgIHJldHVybiBzZWxlY3RQYXRoKCBwYXRoLCBudWxsICk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdFtdIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIFhtbE9iamVjdCBbXSBzZWxlY3Rpb25zOworCisgICAgICAgIC8vIGFsbCB1c2VyLWxldmVsIGNvZGU7IGRvZXNuJ3QgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQKKworICAgICAgICBYbWxDdXJzb3IgYyA9IG5ld0N1cnNvcigpOworCisgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYy5zZWxlY3RQYXRoKCBwYXRoLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIGlmICghYy5oYXNOZXh0U2VsZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgc2VsZWN0aW9ucyA9IG5ldyBYbWxPYmplY3RbIDAgXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25zID0gbmV3IFhtbE9iamVjdCBbIGMuZ2V0U2VsZWN0aW9uQ291bnQoKSBdOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBjLnRvTmV4dFNlbGVjdGlvbigpIDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzZWxlY3Rpb25zWyBpIF0gPSBjLmdldE9iamVjdCgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0aCBtdXN0IHNlbGVjdCBvbmx5IGVsZW1lbnRzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhdHRyaWJ1dGVzIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX3R5cGVkQXJyYXkoc2VsZWN0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeSAoIFN0cmluZyBwYXRoICkKKyAgICB7CisgICAgICAgIHJldHVybiBleGVjUXVlcnkoIHBhdGgsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlU3RvcmUgdHlwZVN0b3JlID0gZ2V0X3N0b3JlKCk7CisKKyAgICAgICAgICAgIGlmICh0eXBlU3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgICAgICBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZG8gWFF1ZXJ5IG9uIFhNTCBWYWx1ZSBPYmplY3RzIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3R5cGVkQXJyYXkodHlwZVN0b3JlLmV4ZWNfcXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBjaGFuZ2VUeXBlKFNjaGVtYVR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCB0eXBlIChudWxsKSIgKTsKKworICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlhNTCBWYWx1ZSBPYmplY3RzIGNhbm5vdCBoYXZlIHRoaWVyIHR5cGUgY2hhbmdlZCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja19vcnBoYW5lZCgpOworICAgICAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIGdldF9zdG9yZSgpLmNoYW5nZV90eXBlKCB0eXBlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBfZmxhZ3M7CisgICAgcHJpdmF0ZSBPYmplY3QgX3RleHRzb3VyY2U7CisKKyAgICBwcm90ZWN0ZWQgWG1sT2JqZWN0QmFzZSgpCisgICAgeworICAgICAgICBfZmxhZ3MgPSBGTEFHX05JTExBQkxFIHwgRkxBR19OSUw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdF9mbGFncyhTY2hlbWFQcm9wZXJ0eSBwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIGlmIChwcm9wLmhhc0RlZmF1bHQoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSB8fAorICAgICAgICAgICAgcHJvcC5oYXNGaXhlZCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8CisgICAgICAgICAgICBwcm9wLmhhc05pbGxhYmxlKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgX2ZsYWdzIHw9CisgICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKKyAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKSB8CisgICAgICAgICAgICAocHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5OSUxMQUJMRSkgfAorICAgICAgICAgICAgKEZMQUdfTk9UX1ZBUklBQkxFKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGFzc2VydCBUeXBlU3RvcmUuTklMTEFCTEUgICA9PSAxOworICAgICAgICBhc3NlcnQgVHlwZVN0b3JlLkhBU0RFRkFVTFQgPT0gMjsKKyAgICAgICAgYXNzZXJ0IFR5cGVTdG9yZS5GSVhFRCAgICAgID09IDQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfTklMTEFCTEUgICAgICAgID0gVHlwZVN0b3JlLk5JTExBQkxFOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU0RFRkFVTFQgICAgICA9IFR5cGVTdG9yZS5IQVNERUZBVUxUOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJWEVEICAgICAgICAgICA9IFR5cGVTdG9yZS5GSVhFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BVFRSSUJVVEUgICAgICAgPSAgICAgODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVE9SRSAgICAgICAgICAgPSAgICAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WQUxVRV9EQVRFRCAgICAgPSAgICAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OSUwgICAgICAgICAgICAgPSAgICA2NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OSUxfREFURUQgICAgICAgPSAgIDEyODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JU0RFRkFVTFQgICAgICAgPSAgIDI1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19FTEVNRU5UX0RBVEVEICAgPSAgIDUxMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TRVRUSU5HREVGQVVMVCAgPSAgMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUlBIQU5FRCAgICAgICAgPSAgMjA0ODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1VVEFCTEUgICAgICAgPSAgNDA5NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QTEVYVFlQRSAgICAgPSAgODE5MjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19DT01QTEVYQ09OVEVOVCAgPSAxNjM4NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19OT1RfVkFSSUFCTEUgICAgPSAzMjc2ODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19WQUxJREFURV9PTl9TRVQgPSA2NTUzNjsKKworCisgICAgLyoqCisgICAgICogVGhlIHRocmVlIGRhdGVkIGZsYWdzIGFyZSBhbHdheXMgc3RhY2tlZDoKKyAgICAgKiAgICAgRkxBR19FTEVNRU5UX0RBVEVEIGltcGxpZXMgRkxBR19OSUxfREFURUQgaXMgc2V0CisgICAgICogICAgIEZMQUdfTklMX0RBVEVEIGltcGxpZXMgRkxBR19URVhUX0RBVEVEIGlzIHNldC4KKyAgICAgKiBjaGVja2VycyB3b3JrIG9uIHRoZSBmbGFncyBmcm9tIHRvcCB0byBib3R0b20uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdTX0RBVEVEID0KKyAgICAgICAgICAgIEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlZSBlbGVtZW50IHN0YXR1cyBmbGFncyBoYXZlIG9uZSBpbnRlcnJsYXRpb25zaGlvcDoKKyAgICAgKiAgICAgRkxBR19GSVhFRCBpbXBsaWVzIEZMQUdfSEFTREVGQVVMVCBpcyBzZXQuCisgICAgICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgd2hlbiBzZXR0aW5nIG5pbHMsIGRlZmF1bHRzLCBzdHJpbmdzLgorICAgICAqIFNpbmNlIGFuIGluaXRpYWwgZ2V0IGltcGxpZXMgc2V0dGluZyBmcm9tIHRleHQsIHRoZXkncmUKKyAgICAgKiBhbHNvIHVzZWQgZHVyaW5nIGdldHRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdTX0VMRU1FTlQgPQorICAgICAgICAgICAgRkxBR19OSUxMQUJMRSB8IEZMQUdfRklYRUQgfCBGTEFHX0hBU0RFRkFVTFQ7CisKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSByZXN0cmljdGlvbiBzdWJjbGFzc2VzIHdpdGhpbiB0aGVpciBjb25zdHJ1Y3RvcnMgdG8gZW5hYmxlCisgICAgICogY29tcGxleCB0eXBlIHN1cHBvcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBsZXhUeXBlKGJvb2xlYW4gY29tcGxleFR5cGUsIGJvb2xlYW4gY29tcGxleENvbnRlbnQpCisgICAgeworICAgICAgICBfZmxhZ3MgfD0gKGNvbXBsZXhUeXBlID8gRkxBR19DT01QTEVYVFlQRSA6IDApIHwKKyAgICAgICAgICAgICAgICAgIChjb21wbGV4Q29udGVudCA/IEZMQUdfQ09NUExFWENPTlRFTlQgOiAwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNDb21wbGV4VHlwZSgpCisgICAgICAgIHsgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhUWVBFKSAhPSAwOyB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNDb21wbGV4Q29udGVudCgpCisgICAgICAgIHsgcmV0dXJuIChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhDT05URU5UKSAhPSAwOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZU9uU2V0KCkgeworICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxJREFURV9PTl9TRVQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX3ZhbGlkYXRlT25TZXQoKQorICAgICAgICB7IHJldHVybiAoX2ZsYWdzICYgRkxBR19WQUxJREFURV9PTl9TRVQpICE9IDA7IH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5pbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05pbCgpCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKyAgICAgICAgICAgIHJldHVybiAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGZpeGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRml4ZWQoKQorICAgIHsKKyAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOworICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX0ZJWEVEKSAhPSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbGxvd2VkIHRvIGJlIG5pbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05pbGxhYmxlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKKyAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19OSUxMQUJMRSkgIT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgY3VycmVudGx5IGRlZmF1bHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRhYmxlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKKyAgICAgICAgcmV0dXJuICgoX2ZsYWdzICYgRkxBR19IQVNERUZBVUxUKSAhPSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBjdXJyZW50bHkgZGVmYXVsdGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdCgpCisgICAgeworICAgICAgICBjaGVja19kYXRlZCgpOworICAgICAgICByZXR1cm4gKChfZmxhZ3MgJiBGTEFHX0lTREVGQVVMVCkgIT0gMCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOaWxzIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXROaWwoKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBuaWxsYWJsZSwgdGhyb3cgZXhjZXB0aW9uIG9uIHNldE5pbCh0cnVlKQorICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTExBQkxFKSA9PSAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgemVybyB0aGUgdmFsdWUgdG8gcmVmbGVjdCBuaWwKKyAgICAgICAgICAgIHNldF9uaWwoKTsKKworICAgICAgICAgICAgLy8gc2V0IHRoZSBuaWwgZmxhZworICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfTklMOworCisgICAgICAgICAgICAvLyBvcmRpbmFyeSBjb21taXQgZXhjZXB0IG5vIGNsZWFyaW5nIG9mIG5pbCBmbGFnCisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHU19EQVRFRDsKKyAgICAgICAgICAgICAgICBnZXRfc3RvcmUoKS5pbnZhbGlkYXRlX25pbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90ZXh0c291cmNlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUgdGhlc2UgZmxhZ3MgbXVzdCBiZSBwYXNzZWQgb24gdG8KKyAgICAgKiBjaGFpbmVkIHZhbHVlcy4gKFNlZSBYbWxBbnlTaW1wbGVUeXBlIChhbGxTaW1wbGVWYWx1ZSksIHVuaW9uCisgICAgICogaW1wbGVtZW50YXRpb25zKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGVsZW1lbnRGbGFncygpCisgICAgeworICAgICAgICBjaGVja19lbGVtZW50X2RhdGVkKCk7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR1NfRUxFTUVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBtYWtlIGEgZnJlZS1zdGFuZGluZyB4bWwgc2ltcGxlIHZhbHVlIGluc3RhbmNlIGltbXV0YWJsZS4KKyAgICAgKiBUaGlzIGlzIGEgb25lLXdheSBzdHJlZXQsIGFuZCBpdCBpcyBpbGxlZ2FsIHRvIGF0dGVtcHQgdG8gbWFrZSBhCisgICAgICogdmFsdWUgdGhhdCBpcyBlbWJlZGRlZCBpbiBhbiB4bWwgZG9jdW1lbnQgaW1tdXRhYmxlLgorICAgICAqCisgICAgICogT25jZSBhIHZhbHVlIGlzIG1hcmtlZCBhcyBpbW11dGFibGUsIGl0IGlzIGlsbGVnYWwgdG8gY2FsbCBzZXR0ZXJzCisgICAgICogb2YgYW55IGtpbmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1tdXRhYmxlKCkKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgKEZMQUdfSU1NVVRBQkxFIHwgRkxBR19TVE9SRSkpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgX2ZsYWdzIHw9IEZMQUdfSU1NVVRBQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgaW5zdGFuY2UgYW4gaW1tdXRhYmxlIHZhbHVlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDA7CisgICAgfQorCisKKworCisgICAgLy8gVEVYVFVTRVIgaW1wbGVtZW50YXRpb24KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBUeXBlU3RvcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgWG1sT2JqZWN0CisgICAgICogaW1wbGVtZW50YXRpb24uIElmIG5vdCBjYWxsZWQsIHRoaXMgaXMgYSBmcmVlLWZsb2F0aW5nIHZhbHVlIGhvbGRlci4KKyAgICAgKgorICAgICAqIFdoZW4gYSB2YWx1ZSBpcyBmaXJzdCBhdHRhY2hlZCwgaXQgaXMgcHV0IGluIGEgY29tcGxldGVseSBpbnZhbGlkYXRlZAorICAgICAqIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGF0dGFjaF9zdG9yZShUeXBlU3RvcmUgc3RvcmUpCisgICAgeworICAgICAgICBfdGV4dHNvdXJjZSA9IHN0b3JlOworICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfSU1NVVRBQkxFKSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICBfZmxhZ3MgfD0gRkxBR19TVE9SRSB8IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKKworICAgICAgICBpZiAoc3RvcmUuaXNfYXR0cmlidXRlKCkpCisgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19BVFRSSUJVVEU7CisKKyAgICAgICAgaWYgKHN0b3JlLnZhbGlkYXRlX29uX3NldCgpKQorICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMSURBVEVfT05fU0VUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhIFR5cGVTdG9yZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0ZXh0IGhhcyBiZWVuCisgICAgICogaW52YWxpZGF0ZWQgYW5kIHNob3VsZCBiZSBmZXRjaGVkIG5leHQgdGltZSB0aGUgdmFsdWUgaXMKKyAgICAgKiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgaW52YWxpZGF0ZV92YWx1ZSgpCisgICAgeworICAgICAgICBhc3NlcnQoKF9mbGFncyAmIEZMQUdfU1RPUkUpICE9IDApOworICAgICAgICBfZmxhZ3MgfD0gRkxBR19WQUxVRV9EQVRFRDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB1c2VzX2ludmFsaWRhdGVfdmFsdWUoKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gc2NoZW1hVHlwZSgpOworICAgICAgICByZXR1cm4gdHlwZS5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlLmdldENvbnRlbnRUeXBlKCkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgeHNpOm5pbCBhdHRyaWJ1dGUKKyAgICAgKiBvbiB0aGUgY29udGFpbmluZyBlbGVtZW50IChhbmQgcG9zc2libHkgdGhlIHRleHQpIGhhcyBiZWVuCisgICAgICogaW52YWxpZGF0ZWQgYW5kIGJvdGggc2hvdWxkIGJlIGNvbnN1bHRlZCBuZXh0IHRpbWUgdGhlIHZhbHVlCisgICAgICogaXMgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludmFsaWRhdGVfbmlsdmFsdWUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZWxlbWVudCdzIGRlZmF1bHQKKyAgICAgKiB2YWx1ZSwgbmlsbGFiaWxpdHksIGZpeGVkbmVzcywgZXRjLCBtYXkgaGF2ZSBjaGFuZ2VkIGJ5CisgICAgICogdmlydHVlIG9mIHRoZSBlbGVtZW50IG9yZGVyIGNoYW5naW5nIChhbmQgeHNpOm5pbCBhbmQgdGhlCisgICAgICogdGV4dCBtYXkgaGF2ZSBjaGFuZ2VkIHRvbyk7IHNvIHRoZSBzdG9yZSBzaG91bGQgYmUgY29uc3VsdGVkCisgICAgICogbmV4dCB0aW1lIGFueSBzZXR0ZXIgb3IgZ2V0dGVyIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgX2ZsYWdzIHw9IEZMQUdfVkFMVUVfREFURUQgfCBGTEFHX05JTF9EQVRFRCB8IEZMQUdfRUxFTUVOVF9EQVRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IHRoZSBDb21wbGV4VHlwZUltcGwgc3ViY2xhc3MgdG8gZ2V0IGRpcmVjdCBhY2Nlc3MKKyAgICAgKiB0byB0aGUgc3RvcmUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFR5cGVTdG9yZSBnZXRfc3RvcmUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIChUeXBlU3RvcmUpX3RleHRzb3VyY2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzX3N0b3JlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBUeXBlU3RvcmUgdG8gcHVsbCBvdXQgdGhlIG1vc3QgcmVhc29uYWJsZQorICAgICAqIHRleHQgdmFsdWUgZnJvbSB1cy4gVGhpcyBpcyBkb25lIGFmdGVyIHdlIGhhdmUgaW52YWxpZGF0ZWQKKyAgICAgKiB0aGUgc3RvcmUgKHR5cGljYWxseSB3aGVuIG91ciB2YWx1ZSBoYXMgYmVlbiBzZXQpLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgYnVpbGRfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKKyAgICB7CisgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7CisgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7CisgICAgICAgIGlmICgoX2ZsYWdzICYgKEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gY29tcHV0ZV90ZXh0KAorICAgICAgICAgICAgICAgICAgICBuc20gPT0gbnVsbCA/IGhhc19zdG9yZSgpID8gZ2V0X3N0b3JlKCkgOiBudWxsIDogbnNtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIGJ1aWxkX25pbCBhZnRlciB3ZSd2ZSBjYWxsZWQgaW52YWxpZGF0ZV9uaWwKKyAgICAgKiBhbmQgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBuaWwgdmFsdWUgaXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYnVpbGRfbmlsKCkKKyAgICB7CisgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCk7CisgICAgICAgIGFzc2VydCgoX2ZsYWdzICYgRkxBR19WQUxVRV9EQVRFRCkgPT0gMCk7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19OSUwpICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiB2YWxpZGF0ZV9ub3cgdG8gZm9yY2UgdXMgdG8gbG9vayBhdAorICAgICAqIHRoZSB0ZXh0IGlmIHdlJ3JlIGluIGFuIGludmFsaWQgc3RhdGUuIFdlJ3JlIGFsbG93ZWQgdG8gdGhyb3cKKyAgICAgKiBhbiBleGNlcHRpb24gaWYgdGhlIHRleHQgaXNuJ3QgdmFsaWQgZm9yIG91ciB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlX25vdygpCisgICAgeworICAgICAgICBjaGVja19kYXRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBoZXJlIGluIG9yZGVyIHRvIGZvcmNlIGEgZGlzY29ubmVjdC4KKyAgICAgKiBBZnRlciB0aGlzIGlzIGRvbmUsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52YWxpZC4KKyAgICAgKiBBbnkgYXR0ZW1wdCB0byBhY2Nlc3Mgb3Igc2V0IGEgdmFsdWUgc2hvdWxkIHJlc3VsdCBpbiBhbgorICAgICAqIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGhvdyB3ZSBoYW5kbGUgZGVsZXRpb25zIGFuZCB4c2k6dHlwZSBjaGFuZ2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3Rfc3RvcmUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKyAgICAgICAgX2ZsYWdzIHw9IEZMQUdTX0RBVEVEIHwgRkxBR19PUlBIQU5FRDsKKyAgICAgICAgLy8gZG8gTk9UIG51bGwgb3V0IF90ZXh0c291cmNlLCBiZWNhdXNlIHdlIG5lZWQgaXQgbm9uLW51bGwgZm9yIHN5bmNocm9uaXphdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdHlwZXN0b3JlIHVzZXIgY2FuIGNyZWF0ZSBhIG5ldyBUeXBlU3RvcmVVc2VyIGluc3RhbmNlIGZvcgorICAgICAqIGEgZ2l2ZW4gZWxlbWVudCBjaGlsZCBuYW1lIGFzIGxvbmcgYXMgeW91IGFsc28gcGFzcyB0aGUKKyAgICAgKiBxbmFtZSBjb250YWluZWQgYnkgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZSwgaWYgYW55LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHdlIHdpbGwgaWdub3JlIHRoZSB4c2lUeXBlIGlmIGl0IHR1cm5zIG91dCB0byBiZSBpbnZhbGlkLgorICAgICAqCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN0cm9uZ2x5IHR5cGVkIGluZm9ybWF0aW9uIGZvciB0aGF0CisgICAgICogZ2l2ZW4gZWxlbWVudCAod2hpY2ggaW1wbGllcywgcmVjdXNpdmVseSwgbm8gc3Ryb25nbHkgdHlwZWQgaW5mb3JtYXRpb24KKyAgICAgKiBkb3dud2FyZHMpLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9lbGVtZW50X3VzZXIoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgKFR5cGVTdG9yZVVzZXIpCisgICAgICAgICAgICAgICAgKChTY2hlbWFUeXBlSW1wbCkgc2NoZW1hVHlwZSgpKS5jcmVhdGVFbGVtZW50VHlwZSgKKyAgICAgICAgICAgICAgICAgICAgZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOworCisgICAgICAgIC8qCisgICAgICAgIFNjaGVtYVR5cGVJbXBsIHN0eXBlID0gKFNjaGVtYVR5cGVJbXBsKXNjaGVtYVR5cGUoKS5nZXRFbGVtZW50VHlwZShlbHROYW1lLCB4c2lUeXBlLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpKTsKKyAgICAgICAgaWYgKHN0eXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKXN0eXBlLmNyZWF0ZVVuYXR0YWNoZWROb2RlKCk7CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gY3JlYXRlIGEgbmV3IFR5cGVTdG9yZVVzZXIgaW5zdGFuY2UgZm9yCisgICAgICogYSBnaXZlbiBhdHRyaWJ1dGUgY2hpbGQsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBzdHJvbmdseSB0eXBlZCBpbmZvcm1hdGlvbiBmb3IgdGhhdAorICAgICAqIGdpdmVuIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKFFOYW1lIGF0dHJOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChUeXBlU3RvcmVVc2VyKSgoU2NoZW1hVHlwZUltcGwpc2NoZW1hVHlwZSgpKS5jcmVhdGVBdHRyaWJ1dGVUeXBlKGF0dHJOYW1lLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfc2NoZW1hX3R5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRUeXBlKAorICAgICAgICAgICAgZWx0TmFtZSwgeHNpVHlwZSwgZ2V0X3N0b3JlKCkuZ2V0X3NjaGVtYXR5cGVsb2FkZXIoKSApOworICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGdldF9hdHRyaWJ1dGVfdHlwZShRTmFtZSBhdHRyTmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzY2hlbWFUeXBlKCkuZ2V0QXR0cmlidXRlVHlwZSgKKyAgICAgICAgICAgIGF0dHJOYW1lLCBnZXRfc3RvcmUoKS5nZXRfc2NoZW1hdHlwZWxvYWRlcigpICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlbGVtZW50IHRleHQsIGlmIGl0J3MgY29uc2lzdGVudC4gSWYgaXQncworICAgICAqIG5vdCBjb25zaXN0ZW50LCByZXR1cm5zIG51bGwsIGFuZCByZXF1aXJlcyBhIHZpc2l0b3Igd2Fsay4KKyAgICAgKgorICAgICAqIEFsc28gcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgYXQgYWxsIChhbHRob3VnaAorICAgICAqIHRoYXQgY2FuIGFsc28gYmUgZGlzY292ZXJlZCB2aWEgZ2V0X2VsZW1lbnRmbGFncyB3aXRob3V0CisgICAgICogZG9pbmcgYSB3YWxrKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChRTmFtZSBlbHROYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KF9pc0NvbXBsZXhDb250ZW50KCkpOworICAgICAgICBpZiAoIV9pc0NvbXBsZXhDb250ZW50KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0TmFtZSk7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBwcm9wLmdldERlZmF1bHRUZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm8gZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KF9pc0NvbXBsZXhUeXBlKCkpOworICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShhdHRyTmFtZSk7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBwcm9wLmdldERlZmF1bHRUZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudGZsYWdzLCBpZiB0aGV5J3JlIGNvbnNpc3RlbnQuIElmIHRoZXkncmUKKyAgICAgKiBub3QsIHJldHVybnMgLTEsIGFuZCByZXF1aXJlcyBhIHZpc3RvciB3YWxrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0X2VsZW1lbnRmbGFncyhRTmFtZSBlbHROYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFfaXNDb21wbGV4Q29udGVudCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRFbGVtZW50UHJvcGVydHkoZWx0TmFtZSk7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHByb3AuaGFzRGVmYXVsdCgpID09IFNjaGVtYVByb3BlcnR5LlZBUklBQkxFIHx8CisgICAgICAgICAgICBwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuVkFSSUFCTEUgfHwKKyAgICAgICAgICAgIHByb3AuaGFzTmlsbGFibGUoKSA9PSBTY2hlbWFQcm9wZXJ0eS5WQVJJQUJMRSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKKyAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKSB8CisgICAgICAgICAgICAocHJvcC5oYXNOaWxsYWJsZSgpID09IFNjaGVtYVByb3BlcnR5Lk5FVkVSID8gMCA6IFR5cGVTdG9yZS5OSUxMQUJMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmxhZ3MgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRfYXR0cmlidXRlZmxhZ3MoUU5hbWUgYXR0ck5hbWUpCisgICAgeworICAgICAgICBpZiAoIV9pc0NvbXBsZXhUeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgU2NoZW1hUHJvcGVydHkgcHJvcCA9IHNjaGVtYVR5cGUoKS5nZXRBdHRyaWJ1dGVQcm9wZXJ0eShhdHRyTmFtZSk7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAocHJvcC5oYXNEZWZhdWx0KCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkhBU0RFRkFVTFQpIHwKKyAgICAgICAgICAgIChwcm9wLmhhc0ZpeGVkKCkgPT0gU2NoZW1hUHJvcGVydHkuTkVWRVIgPyAwIDogVHlwZVN0b3JlLkZJWEVEKTsKKyAgICAgICAgLy8gQlVHQlVHOiB0b2RvOiBob29rIHVwIHJlcXVpcmVkPworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgY2hpbGQgZWxlbWVudHMgYXJlIGluc2Vuc2l0aXZlIHRvIG9yZGVyOworICAgICAqIGlmIGl0IHJldHVybnMgdHJ1ZSwgeW91J3JlIHJlcXVpcmVkIHRvIGNhbGwgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyCisgICAgICogb24gY2hpbGRyZW4gdG8gdGhlIHJpZ2h0IG9mIGFueSBjaGlsZCBvcmRlciByZWFycmFuZ2VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkKKyAgICB7CisgICAgICAgIGlmICghX2lzQ29tcGxleFR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGUoKS5pc09yZGVyU2Vuc2l0aXZlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0aW5nIGEgbmV3IGVsZW1lbnQgaXMgYWx3YXlzIHVuYW1iaWd1b3VzIGV4Y2VwdCBpbiBvbmUKKyAgICAgKiBzaXR1YXRpb246IHdoZW4gYWRkaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3Qgb25lIHdpdGgKKyAgICAgKiB0aGF0IG5hbWUgKG9yIHRoZSBmaXJzdCBvbmUgaWYgdGhlcmUgYXJlIG5vbmUpLgorICAgICAqCisgICAgICogSW4gdGhhdCBjYXNlLCBhZGQgdGhlIGVsZW1lbnQgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIHNsb3QKKyAgICAgKiBCRUZPUkUgYW55IGVsZW1lbnQgd2hvc2UgcW5hbWUgaXMgY29udGFpbmVkIGluIHRoZSBRTmFtZVNldAorICAgICAqIGdpdmVuLiAoSWYgdGhlIFFOYW1lU2V0IGlzIGVtcHR5LCB0aGF0IG1lYW5zIGFkZCB0aGUgbmV3CisgICAgICogZWxlbWVudCBhdCB0aGUgdmVyeSBlbmQuKQorICAgICAqCisgICAgICogSWYgdGhlIHJldHVybmVkIFFOYW1lU2V0IGlzIG51bGwsIHRyZWF0IGl0IGFzIGlmIHRoZSBRTmFtZVNldAorICAgICAqIGNvbnRhaW5lZCBhbGwgUU5hbWVzLCBpLmUuLCBhZGQgdGhlIG5ldyBlbGVtZW50IGF0IHRoZSB2ZXJ5CisgICAgICogZmlyc3QgcG9zaXRpb24gcG9zc2libGUgKGFkamFjZW50IHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCisgICAgICogc2FtZSBuYW1lLCBvciBhdCB0aGUgdmVyeSBmaXJzdCBzbG90IGlmIGl0IGlzIHRoZSBmaXJzdCBlbHQKKyAgICAgKiB3aXRoIHRoYXQgbmFtZSkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFFOYW1lU2V0IGdldF9lbGVtZW50X2VuZGluZ19kZWxpbWl0ZXJzKFFOYW1lIGVsdG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFQcm9wZXJ0eSBwcm9wID0gc2NoZW1hVHlwZSgpLmdldEVsZW1lbnRQcm9wZXJ0eShlbHRuYW1lKTsKKyAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gcHJvcC5nZXRKYXZhU2V0dGVyRGVsaW1pdGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIGEgdmlzaXRvciB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZQorICAgICAqIGRlZmF1bHQgdGV4dCBhbmQgZWxlbWVudGZsYWdzIGZvciBhbiBhcmJpdHJhcnkgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZVN0b3JlVmlzaXRvciBuZXdfdmlzaXRvcigpCisgICAgeworICAgICAgICBpZiAoIV9pc0NvbXBsZXhDb250ZW50KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFUeXBlVmlzaXRvckltcGwoc2NoZW1hVHlwZSgpLmdldENvbnRlbnRNb2RlbCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hRmllbGQgZ2V0X2F0dHJpYnV0ZV9maWVsZChRTmFtZSBhdHRyTmFtZSkKKyAgICB7CisgICAgICAgIFNjaGVtYUF0dHJpYnV0ZU1vZGVsIG1vZGVsID0gc2NoZW1hVHlwZSgpLmdldEF0dHJpYnV0ZU1vZGVsKCk7CisgICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBtb2RlbC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0dGluZyBhIHN0cmluZyBwcmVzZXJ2ZXMgYW55IG5vbmNhbm9uaWNhbCBsaXRlcmFsCisgICAgICogcmVwcmVzZW50YXRpb24uIFRoaXMgaXMgZG9uZSBieSBzdG9yaW5nIHRoZSBhY3R1YWwKKyAgICAgKiBzdHJpbmcgaW4gdGhlIHVuZGVybHlpbmcgc3RvcmUgYWZ0ZXIgY2hlY2tpbmcgaXQKKyAgICAgKiBhZ2FpbnN0IHRoZSBwcmltaXRpdmUgdHlwZSBmb3IgdmFsaWRpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X1N0cmluZyhTdHJpbmcgdikKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19JTU1VVEFCTEUpICE9IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgYm9vbGVhbiB3YXNOaWxsZWQgPSAoKF9mbGFncyAmIEZMQUdfTklMKSAhPSAwKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdmFsdWUgZnJvbSB0aGUgc3RyaW5nCisgICAgICAgIFN0cmluZyB3c2Nhbm9uID0gYXBwbHlfd3NjYW5vbih2KTsKKyAgICAgICAgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KHdzY2Fub24pOworCisgICAgICAgIC8vIE5vdyBzdG9yZSB0aGUgbGl0ZXJhbCB0ZXh0IGltbWVkaWF0ZWx5IGluIHRoZSB1bmRlcmx5aW5nCisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX2ZsYWdzICY9IH5GTEFHX1ZBTFVFX0RBVEVEOworICAgICAgICAgICAgZ2V0X3N0b3JlKCkuc3RvcmVfdGV4dCh2KTsKKyAgICAgICAgICAgIGlmICh3YXNOaWxsZWQpCisgICAgICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV9uaWwoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfdGV4dHNvdXJjZSA9IHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSB2YWx1ZSBiYXNlZCBvbiBjb21wbGV4IGNvbnRlbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlX2Zyb21fY29tcGxleF9jb250ZW50KCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IHRvIHVwZGF0ZSB0aGUgdmFsdWUgYmFzZWQgb24gYSBzdHJpbmcgdGhhdAorICAgICAqIHdhcyBwYXNzZWQgZWl0aGVyIGZyb20gdGhlIHRleHQgc3RvcmUgb3IgZnJvbSB0aGUgdXNlci4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNhc2VzIHdoZXJlIHRoZXJlIGlzIGEgZGVmYXVsdAorICAgICAqIHRoYXQgbXVzdCBiZSBhcHBsaWVkLCBhbmQgd2hlcmUgdGhlIHZhbHVlIG11c3QgbWF0Y2gKKyAgICAgKiBhIGZpeGVkIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVfZnJvbV93c2Nhbm9uX3RleHQoU3RyaW5nIHYpCisgICAgeworICAgICAgICAvLyBXaGl0ZXNwYWNlIGlzIGRlZmF1bHQgaWYgdGhpcyB0eXBlIHRyZWF0cyB0aGlzIHNwYWNlIGFzIGRlZmF1bHRhYmxlCisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19IQVNERUZBVUxUKSAhPSAwICYmICAoX2ZsYWdzICYgRkxBR19TRVRUSU5HREVGQVVMVCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBxdWl0ZSBjb3JyZWN0IHNpbmNlIHRoZSAuZXF1YWxzKCIiKSB0ZXN0IHNob3VsZCBiZQorICAgICAgICAgICAgLy8gZG9uZSBvbiB0aGUgYWN0dWFsIHRleHQsIG5vdCB0aGUgd3NjYW5vbiB0ZXh0CisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfQVRUUklCVVRFKSA9PSAwICYmIHYuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVmID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9kZWZhdWx0X3RleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVmID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpb24gd2l0aCB0aGlzIGZsYWcKKyAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19TRVRUSU5HREVGQVVMVDsKKyAgICAgICAgICAgICAgICB0cnkgeyB0aGlzLnNldChkZWYpOyB9CisgICAgICAgICAgICAgICAgZmluYWxseSB7IF9mbGFncyAmPSB+RkxBR19TRVRUSU5HREVGQVVMVDsgfQorICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUw7CisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IEZMQUdfSVNERUZBVUxUOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHJldHVybmVkIHlldCwgdGhlIGRlZmF1bHQgZG9lc24ndCBhcHBseS4KKworICAgICAgICAvLyBBc2sgdW5kZXJseWluZyBpbXBsIHRvIHBhcnNlIG9yZGluYXJ5IG5vbi1kZWZhdWx0IHRleHQKKyAgICAgICAgc2V0X3RleHQodik7CisgICAgICAgIF9mbGFncyAmPSB+KEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR5cGVzIHNob3VsZCByZXR1cm4gZmFsc2UgaWYgdGhleSBkb24ndCB0cmVhdCB0aGUgZ2l2ZW4KKyAgICAgKiB3aGl0ZXNwYWNlIGFzIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc19kZWZhdWx0YWJsZV93cyhTdHJpbmcgdikKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHdoaXRlc3BhY2UgcnVsZSB0aGF0IHdpbGwgYmUgYXBwbGllZCBiZWZvcmUKKyAgICAgKiBidWlsZGluZyBhIHN0cmluZyB0byBwYXNzIHRvIGdldF90ZXh0KCkuCisgICAgICoKKyAgICAgKiBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBkb24ndCBuZWVkIHRoZWlyIHRleHQKKyAgICAgKiBmb3Igc2V0X3RleHQgY2Fub25pY2FsaXplZDsgcGVyaGFwcyB0aGV5IGFscmVhZHkgaW1wbGVtZW50CisgICAgICogc2Nhbm5lcnMgdGhhdCBjYW4gZGVhbCB3aXRoIHdoaXRlc3BhY2UsIGFuZCB0aGV5IGtub3cKKyAgICAgKiB0aGV5IGhhdmUgbm8gcmVnZXggcGF0dGVybiByZXN0cmljdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRfd3NjYW5vbl9ydWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLldTX0NPTExBUFNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBjYW5vbmljYWxpemUgd2hpdGVzcGFjZSBiZWZvcmUgY2FsbGluZyBzZXRfdGV4dC4KKyAgICAgKgorICAgICAqIFRyaWVzIHRvIGF2b2lkIGFsbG9jYXRpb24gd2hlbiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgY2Fub25pY2FsLCBidXQKKyAgICAgKiBvdGhlcndpc2UgdGhpcyBpcyBub3QgcGFydGljdWxhcmx5IGVmZmljaWVudC4gSG9wZWZ1bGx5IHRoZSBjb21tb24KKyAgICAgKiBjYXNlIGlzIHRoYXQgd2UgcGFzcyBvdXIgd3NjYW5vbiBydWxlIHRvIHRoZSBzdG9yZSB2aWEgZmV0Y2hfdGV4dAorICAgICAqIGFuZCBpdCdzIGNhbm9uaWNhbGl6ZWQgYmVmb3JlIHdlIGV2ZW4gc2VlIGl0IGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFwcGx5X3dzY2Fub24oU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZSh2LCBnZXRfd3NjYW5vbl9ydWxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiZWZvcmUgZXZlcnkgc2V0IGFuZCBnZXQsIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUKKyAgICAgKiBhIGNvcnJlY3QgcGljdHVyZSBvZiB3aGV0aGVyIHdlJ3JlIG5pbGxhYmxlLCBmaXhlZCwgb3IKKyAgICAgKiBpZiB3ZSBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBhcHBsaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja19lbGVtZW50X2RhdGVkKCkKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19FTEVNRU5UX0RBVEVEKSAhPSAwICYmCisgICAgICAgICAgICAoX2ZsYWdzICYgRkxBR19OT1RfVkFSSUFCTEUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgaW50IGVsdGZsYWdzID0gZ2V0X3N0b3JlKCkuY29tcHV0ZV9mbGFncygpOworICAgICAgICAgICAgLy8gaW50IGVsdGZsYWdzID0gMDsKKyAgICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdTX0VMRU1FTlQgfCBGTEFHX0VMRU1FTlRfREFURUQpOworICAgICAgICAgICAgX2ZsYWdzIHw9IGVsdGZsYWdzOworICAgICAgICB9CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19OT1RfVkFSSUFCTEUpICE9IDApCisgICAgICAgICAgICBfZmxhZ3MgJj0gfihGTEFHX0VMRU1FTlRfREFURUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc2NyaWJlcyB0aGUgb3JwaGFuZWQgc3RhdHVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzX29ycGhhbmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IGdldHRlciBhbmQgc2V0dGVyIG9uIHRoZSBzdHJvbmdseQorICAgICAqIHR5cGVkIGNsYXNzZXMgdG8gZW5zdXJlIHRoYXQgdGhlIG9iamVjdCBoYXMgbm90IGJlZW4KKyAgICAgKiBvcnBoYW5lZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja19vcnBoYW5lZCgpCisgICAgeworICAgICAgICBpZiAoaXNfb3JwaGFuZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBwcmlvciB0byBldmVyeSBnZXQgb3BlcmF0aW9uLCB0byBlbnN1cmUKKyAgICAgKiB0aGF0IHRoZSB2YWx1ZSBiZWluZyByZWFkIGlzIHZhbGlkLiBJZiB0aGUgdmFsdWUKKyAgICAgKiBoYXMgYmVlbiBpbnZhbGlkYXRlZCwgaXQgaXMgcmUtcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nCisgICAgICogdGV4dCBzdG9yZSwgYW5kIHRoaXMgbWF5IGNhdXNlIGFuIG91dCBvZiByYW5nZSBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkZWFscyB3aXRoIG5pbHMsIG5pbGxhYmlsaXR5LCBkZWZhdWx0cywgZXRjLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNoZWNrX2RhdGVkKCkKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR1NfREFURUQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19PUlBIQU5FRCkgIT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgYXNzZXJ0KChfZmxhZ3MgJiBGTEFHX1NUT1JFKSAhPSAwKTsKKworICAgICAgICAgICAgY2hlY2tfZWxlbWVudF9kYXRlZCgpOworCisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfRUxFTUVOVF9EQVRFRCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZWx0ZmxhZ3MgPSBnZXRfc3RvcmUoKS5jb21wdXRlX2ZsYWdzKCk7CisgICAgICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR1NfRUxFTUVOVCB8IEZMQUdfRUxFTUVOVF9EQVRFRCk7CisgICAgICAgICAgICAgICAgX2ZsYWdzIHw9IGVsdGZsYWdzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIG5pbGxlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoKF9mbGFncyAmIEZMQUdfTklMX0RBVEVEKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChnZXRfc3RvcmUoKS5maW5kX25pbCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTExBQkxFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyAvLyBuaWwgbm90IGFsbG93ZWQKKworICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGltcGxlbWVudGF0aW9uIGtub3cgdGhhdCB3ZSdyZSBuaWwgbm93CisgICAgICAgICAgICAgICAgICAgIHNldF9uaWwoKTsKKworICAgICAgICAgICAgICAgICAgICBfZmxhZ3MgfD0gRkxBR19OSUw7CisgICAgICAgICAgICAgICAgICAgIG5pbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9mbGFncyAmPSB+RkxBR19OSUxfREFURUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbmlsbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0OworCisgICAgICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0NPTVBMRVhDT05URU5UKSAhPSAwIHx8ICh0ZXh0ID0gZ2V0X3dzY2Fub25fdGV4dCgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfZnJvbV9jb21wbGV4X2NvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnB1c2gobmV3IE5hbWVzcGFjZUNvbnRleHQoZ2V0X3N0b3JlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsgdXBkYXRlX2Zyb21fd3NjYW5vbl90ZXh0KHRleHQpOyB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfZmxhZ3MgJj0gfkZMQUdfVkFMVUVfREFURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IHNldCBvcGVyYXRpb24gKGV4Y2VwdCBmb3IgdGhlCisgICAgICogc3BlY2lhbCBjYXNlIG9mIHNldHRpbmcgYSBzdHJpbmcpIHRvOgorICAgICAqICgxKSBnZXQgdGhlIG5pbGxhYmxlLCBmaXhlZCwgZXRjIGZsYWdzCisgICAgICogKDIpIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCdzIGZpeGVkIChub3QgZm9yIHN0cmluZ3MpCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldF9wcmVwYXJlKCkKKyAgICB7CisgICAgICAgIGNoZWNrX2VsZW1lbnRfZGF0ZWQoKTsKKyAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX0lNTVVUQUJMRSkgIT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgc2V0IG9wZXJhdGlvbiB0byBpbnZhbGlkYXRlCisgICAgICogdGhlIGF0dGFjaGVkIHJhdyB0ZXh0LiBBbHNvLCBpZiB3ZSB3ZXJlIGRhdGVkLAorICAgICAqIHdlIG1ha2UgYSBub3RlIHRoYXQgd2UncmUgbm93IGN1cnJlbnQsIHNpbmNlIHRoZQorICAgICAqIGxhdGVzdCBzZXQgYmVhdHMgdGhlIHByZXZpb3VzIGludmFsaWRhdGUuIEFsc28sCisgICAgICogaWYgd2Ugd2VyZSBuaWwsIHdlJ3JlIG5vIGxvbmdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0X2NvbW1pdCgpCisgICAgeworICAgICAgICBib29sZWFuIHdhc05pbGxlZCA9ICgoX2ZsYWdzICYgRkxBR19OSUwpICE9IDApOworICAgICAgICAgIF9mbGFncyAmPSB+KEZMQUdfTklMIHwgRkxBR19JU0RFRkFVTFQpOworCisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX2ZsYWdzICY9IH4oRkxBR1NfREFURUQpOworICAgICAgICAgICAgZ2V0X3N0b3JlKCkuaW52YWxpZGF0ZV90ZXh0KCk7CisgICAgICAgICAgICBpZiAod2FzTmlsbGVkKQorICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmludmFsaWRhdGVfbmlsKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfdGV4dHNvdXJjZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcmFicyB0aGUgdW5kZWx5aW5nIGxpdHJhbCByZXByZXNlbnRhdGlvbiwgYXBwbHlpbmcgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24ncyB3c2Nhbm9uIHJ1bGUuCisgICAgICogTnVsbCBpZiBub3Qgc2ltcGxlIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRfd3NjYW5vbl90ZXh0KCkKKyAgICB7CisgICAgICAgIGlmICgoX2ZsYWdzICYgRkxBR19TVE9SRSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcGx5X3dzY2Fub24oKFN0cmluZylfdGV4dHNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSByZXR1cm4gZ2V0X3N0b3JlKCkuZmV0Y2hfdGV4dChnZXRfd3NjYW5vbl9ydWxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIHNldCB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZnJvbSB0ZXh0LAorICAgICAqIG9yIHRocm93IGFuIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiBpZiBpdCBjYW4ndC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgdGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBjbGVhciB0aGUgdmFsdWUsIGFuZCBzZXQgaXQgdG8gd2hhdGV2ZXIKKyAgICAgKiBpcyBzdXBwb3NlZCB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSB2YWx1ZSBpcyBuaWxsZWQuCisgICAgICovCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpOworCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCisgICAgICogT25seSBjYWxsZWQgd2hlbiBub24tbmlsLgorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZV90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKTsKKworICAgIC8vIFNJTVBMRSBWQUxVRSBBQ0NFU1NPUlMgQkVMT1cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gbnVtZXJpY3M6IGZyYWN0aW9uYWwKKyAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpCisgICAgICAgIHsgQmlnRGVjaW1hbCBiZCA9IGJpZ0RlY2ltYWxWYWx1ZSgpOyByZXR1cm4gYmQgPT0gbnVsbCA/IDAuMGYgOiBiZC5mbG9hdFZhbHVlKCk7IH0KKyAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKKyAgICAgICAgeyBCaWdEZWNpbWFsIGJkID0gYmlnRGVjaW1hbFZhbHVlKCk7IHJldHVybiBiZCA9PSBudWxsID8gMC4wIDogYmQuZG91YmxlVmFsdWUoKTsgfQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxWYWx1ZSgpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisKKyAgICAvLyBudW1lcmljczogaW50ZWdyYWwKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQorICAgICAgICB7IEJpZ0RlY2ltYWwgYmQgPSBiaWdEZWNpbWFsVmFsdWUoKTsgcmV0dXJuIGJkID09IG51bGwgPyBudWxsIDogYmQudG9CaWdJbnRlZ2VyKCk7IH0KKworICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCisgICAgeworICAgICAgICBsb25nIGwgPSBpbnRWYWx1ZSgpOworICAgICAgICBpZiAobCA+IEJ5dGUuTUFYX1ZBTFVFKSB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChsIDwgQnl0ZS5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIChieXRlKWw7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQorICAgIHsKKyAgICAgICAgbG9uZyBsID0gaW50VmFsdWUoKTsKKyAgICAgICAgaWYgKGwgPiBTaG9ydC5NQVhfVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGwgPCBTaG9ydC5NSU5fVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIChzaG9ydClsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKQorICAgIHsKKyAgICAgICAgbG9uZyBsID0gbG9uZ1ZhbHVlKCk7CisgICAgICAgIGlmIChsID4gSW50ZWdlci5NQVhfVkFMVUUpIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGwgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gKGludClsOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIF9tYXggPSBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgX21pbiA9IEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1JTl9WQUxVRSk7CisKKyAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciBiID0gYmlnSW50ZWdlclZhbHVlKCk7CisgICAgICAgIGlmIChiID09IG51bGwpIHJldHVybiAwTDsKKyAgICAgICAgaWYgKGIuY29tcGFyZVRvKF9tYXgpID49IDApIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGIuY29tcGFyZVRvKF9taW4pIDw9IDApIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIGIubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBfdG9TdHJpbmdPcHRpb25zID0KKyAgICAgICAgYnVpbGRJbm5lclByZXR0eU9wdGlvbnMoKTsKKworICAgIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIGJ1aWxkSW5uZXJQcmV0dHlPcHRpb25zKCkKKyAgICB7CisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU5ORVIgKTsKKyAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlQgKTsKKyAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMgKTsKKyAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgKTsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXBTdGFjayAoIFN0cmluZyBtc2cgKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKCAiQzpcXGVlLnR4dCIsIHRydWUgKTsKKyAgICAgICAgICAgIGphdmEuaW8uUHJpbnRTdHJlYW0gcHMgPSBuZXcgamF2YS5pby5QcmludFN0cmVhbSggZm9zICk7CisgICAgICAgICAgICBwcy5wcmludGxuKCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iICk7CisgICAgICAgICAgICBwcy5wcmludGxuKCBtc2cgKTsKKyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoIHBzICk7CisgICAgICAgICAgICBwcy5jbG9zZSgpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgfQorICAgICovCisKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZVN0b3JlKCkueG1sVGV4dChfdG9TdHJpbmdPcHRpb25zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4geG1sVGV4dChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQgKFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3JGb3JjZSgpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3VyLnhtbFRleHQobWFrZUlubmVyT3B0aW9ucyhvcHRpb25zKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZW51bXMKKyAgICBwdWJsaWMgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorCisgICAgLy8gdmFyaW91cworICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nVmFsdWUoKQorICAgIHsKKyAgICAgICAgLy8gU2luY2UgY29tcGxleC1jb250ZW50IHR5cGVzIGRvbid0IGhhdmUgYSAibmF0dXJhbCIgc3RyaW5nIHZhbHVlLCB3ZQorICAgICAgICAvLyBlbWl0IHRoZSBkZWVwbHkgY29uY2F0ZW5hdGVkLCB0YWctcmVtb3ZlZCBjb250ZW50IG9mIHRoZSB0YWcuCisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2lzQ29tcGxleENvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0X3N0b3JlKCkuZmV0Y2hfdGV4dChUeXBlU3RvcmUuV1NfUFJFU0VSVkUpOworCisgICAgICAgICAgICBjaGVja19kYXRlZCgpOworICAgICAgICAgICAgaWYgKChfZmxhZ3MgJiBGTEFHX05JTCkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjb21wdXRlX3RleHQoaGFzX3N0b3JlKCkgPyBnZXRfc3RvcmUoKSA6IG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIHN0cmluZ1ZhbHVlKCk7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKQorICAgICAgICB7IHJldHVybiBib29sZWFuVmFsdWUoKTsgfQorICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIGJ5dGVWYWx1ZSgpOyB9CisgICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKQorICAgICAgICB7IHJldHVybiBzaG9ydFZhbHVlKCk7IH0KKyAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCkKKyAgICAgICAgeyByZXR1cm4gaW50VmFsdWUoKTsgfQorICAgIHB1YmxpYyBsb25nIGdldExvbmdWYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIGxvbmdWYWx1ZSgpOyB9CisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCkKKyAgICAgICAgeyByZXR1cm4gYmlnSW50ZWdlclZhbHVlKCk7IH0KKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsVmFsdWUoKQorICAgICAgICB7IHJldHVybiBiaWdEZWNpbWFsVmFsdWUoKTsgfQorICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKCkKKyAgICAgICAgeyByZXR1cm4gZmxvYXRWYWx1ZSgpOyB9CisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIGRvdWJsZVZhbHVlKCk7IH0KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCkKKyAgICAgICAgeyByZXR1cm4gYnl0ZUFycmF5VmFsdWUoKTsgfQorICAgIHB1YmxpYyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGdldEVudW1WYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIGVudW1WYWx1ZSgpOyB9CisgICAgcHVibGljIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKQorICAgICAgICB7IHJldHVybiBjYWxlbmRhclZhbHVlKCk7IH0KKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlVmFsdWUoKQorICAgICAgICB7IHJldHVybiBkYXRlVmFsdWUoKTsgfQorICAgIHB1YmxpYyBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCkKKyAgICAgICAgeyByZXR1cm4gZ0RhdGVWYWx1ZSgpOyB9CisgICAgcHVibGljIEdEdXJhdGlvbiBnZXRHRHVyYXRpb25WYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIGdEdXJhdGlvblZhbHVlKCk7IH0KKyAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpCisgICAgICAgIHsgcmV0dXJuIHFOYW1lVmFsdWUoKTsgfQorICAgIHB1YmxpYyBMaXN0IHhnZXRMaXN0VmFsdWUoKQorICAgICAgICB7IHJldHVybiB4bGlzdFZhbHVlKCk7IH0KKyAgICBwdWJsaWMgTGlzdCBnZXRMaXN0VmFsdWUoKQorICAgICAgICB7IHJldHVybiBsaXN0VmFsdWUoKTsgfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKQorICAgICAgICB7IHJldHVybiBvYmplY3RWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgb2JqKQorICAgICAgICB7IHNldChvYmopOyB9CisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdikKKyAgICAgICAgeyBzZXQodik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlVmFsdWUoYnl0ZSB2KQorICAgICAgICB7IHNldCh2KTsgfQorICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgdikKKyAgICAgICAgeyBzZXQodik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdikKKyAgICAgICAgeyBzZXQodik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KQorICAgICAgICB7IHNldCh2KTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIG9iaikKKyAgICAgICAgeyBzZXQob2JqKTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWxWYWx1ZShCaWdEZWNpbWFsIG9iaikKKyAgICAgICAgeyBzZXQob2JqKTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdikKKyAgICAgICAgeyBzZXQodik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgdikKKyAgICAgICAgeyBzZXQodik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gb2JqKQorICAgICAgICB7IHNldChvYmopOyB9CisgICAgcHVibGljIHZvaWQgc2V0RW51bVZhbHVlKFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQorICAgICAgICB7IHNldChvYmopOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBvYmopCisgICAgICAgIHsgc2V0KG9iaik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBvYmopCisgICAgICAgIHsgc2V0KG9iaik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIG9iaikKKyAgICAgICAgeyBzZXQob2JqKTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEdEdXJhdGlvblZhbHVlKEdEdXJhdGlvbiBvYmopCisgICAgICAgIHsgc2V0KG9iaik7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIG9iaikKKyAgICAgICAgeyBzZXQob2JqKTsgfQorICAgIHB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZShMaXN0IG9iaikKKyAgICAgICAgeyBzZXQob2JqKTsgfQorICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKE9iamVjdCBvYmopCisgICAgICAgIHsgb2JqZWN0U2V0KG9iaik7IH0KKworICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5VmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBib29sZWFuIGJvb2xlYW5WYWx1ZSgpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgcHVibGljIEdEYXRlIGdEYXRlVmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBHRHVyYXRpb24gZ0R1cmF0aW9uVmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBRTmFtZSBxTmFtZVZhbHVlKCkKKyAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KKyAgICBwdWJsaWMgTGlzdCBsaXN0VmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBMaXN0IHhsaXN0VmFsdWUoKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0VmFsdWUoKQorICAgICAgICB7IHJldHVybiBqYXZhX3ZhbHVlKHRoaXMpOyB9CisKKyAgICAvLyBzZXQgdGhpcyB2YWx1ZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChib29sZWFuIHYpCisgICAgICAgIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2Jvb2xlYW4odik7IHNldF9jb21taXQoKTsgfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGJ5dGUgdikKKyAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfYnl0ZSh2KTsgc2V0X2NvbW1pdCgpOyB9IH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoc2hvcnQgdikKKyAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfc2hvcnQodik7IHNldF9jb21taXQoKTsgfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGludCB2KQorICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9pbnQodik7IHNldF9jb21taXQoKTsgfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGxvbmcgdikKKyAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfbG9uZyh2KTsgc2V0X2NvbW1pdCgpOyB9IH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoZmxvYXQgdikKKyAgICAgICAgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfZmxvYXQodik7IHNldF9jb21taXQoKTsgfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGRvdWJsZSB2KQorICAgICAgICB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9kb3VibGUodik7IHNldF9jb21taXQoKTsgfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KGJ5dGVbXSBvYmopCisgICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9CeXRlQXJyYXkob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaikKKyAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2VudW0ob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChCaWdJbnRlZ2VyIG9iaikKKyAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0JpZ0ludGVnZXIob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChCaWdEZWNpbWFsIG9iaikKKyAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X0JpZ0RlY2ltYWwob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChDYWxlbmRhciBvYmopCisgICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9DYWxlbmRhcihvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KERhdGUgb2JqKQorICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfRGF0ZShvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBvYmopCisgICAgICAgIHsgaWYgKG9iaiA9PSBudWxsKSBzZXROaWwoKTsgZWxzZSB7IHN5bmNocm9uaXplZCAobW9uaXRvcigpKSB7IHNldF9wcmVwYXJlKCk7IHNldF9HRGF0ZShvYmopOyBzZXRfY29tbWl0KCk7IH0gfSB9CisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gb2JqKQorICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfR0R1cmF0aW9uKG9iaik7IHNldF9jb21taXQoKTsgfSB9IH0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoUU5hbWUgb2JqKQorICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfUU5hbWUob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChMaXN0IG9iaikKKyAgICAgICAgeyBpZiAob2JqID09IG51bGwpIHNldE5pbCgpOyBlbHNlIHsgc3luY2hyb25pemVkIChtb25pdG9yKCkpIHsgc2V0X3ByZXBhcmUoKTsgc2V0X2xpc3Qob2JqKTsgc2V0X2NvbW1pdCgpOyB9IH0gfQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldChTdHJpbmcgb2JqKQorICAgICAgICB7IGlmIChvYmogPT0gbnVsbCkgc2V0TmlsKCk7IGVsc2UgeyBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkgeyBzZXRfcHJlcGFyZSgpOyBzZXRfU3RyaW5nKG9iaik7IC8qIHN0cmluZ3MgYXJlIHNwZWNpYWwsIHNvIHNldF9TdHJpbmcgZG9lcyBpdHMgb3duIGNvbW1pdC4qLyB9IH0gfQorCisgICAgcHVibGljIHZvaWQgb2JqZWN0U2V0KE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0TmlsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhtbE9iamVjdCkKKyAgICAgICAgICAgIHNldCggKFhtbE9iamVjdCkgbyApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgc2V0KCAoU3RyaW5nKSBvICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlKQorICAgICAgICAgICAgc2V0KCAoU3RyaW5nRW51bUFic3RyYWN0QmFzZSkgbyApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQmlnSW50ZWdlcikKKyAgICAgICAgICAgIHNldCggKEJpZ0ludGVnZXIpIG8gKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpCisgICAgICAgICAgICBzZXQoIChCaWdEZWNpbWFsKSBvICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCeXRlKQorICAgICAgICAgICAgc2V0KCAoKEJ5dGUpbykuYnl0ZVZhbHVlKCkgKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNob3J0KQorICAgICAgICAgICAgc2V0KCAoKFNob3J0KW8pLnNob3J0VmFsdWUoKSApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikKKyAgICAgICAgICAgIHNldCggKChJbnRlZ2VyKW8pLmludFZhbHVlKCkgKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIExvbmcpCisgICAgICAgICAgICBzZXQoICgoTG9uZylvKS5sb25nVmFsdWUoKSApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQm9vbGVhbikKKyAgICAgICAgICAgIHNldCggKChCb29sZWFuKW8pLmJvb2xlYW5WYWx1ZSgpICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCkKKyAgICAgICAgICAgIHNldCggKChGbG9hdClvKS5mbG9hdFZhbHVlKCkgKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkKKyAgICAgICAgICAgIHNldCggKChEb3VibGUpbykuZG91YmxlVmFsdWUoKSApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ2FsZW5kYXIpCisgICAgICAgICAgICBzZXQoICgoQ2FsZW5kYXIpbykgKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIERhdGUpCisgICAgICAgICAgICBzZXQoIChEYXRlKSBvICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHRGF0ZVNwZWNpZmljYXRpb24pCisgICAgICAgICAgICBzZXQoIChHRGF0ZVNwZWNpZmljYXRpb24pIG8gKTsKKyAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEdEdXJhdGlvblNwZWNpZmljYXRpb24pCisgICAgICAgICAgICBzZXQoIChHRHVyYXRpb25TcGVjaWZpY2F0aW9uKSBvICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBRTmFtZSkKKyAgICAgICAgICAgIHNldCggKFFOYW1lKSBvICk7CisgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KQorICAgICAgICAgICAgc2V0KCAoTGlzdCkgbyApOworICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgYnl0ZVtdKQorICAgICAgICAgICAgc2V0KCAoYnl0ZVtdKSBvICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cKKyAgICAgICAgICAgICAgICBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHVuaW9uIG9iamVjdCBvZiBjbGFzcyA6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgby5nZXRDbGFzcygpLmdldE5hbWUoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0X25ld1ZhbHVlKFhtbE9iamVjdCBvYmopCisgICAgeworICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqLmlzTmlsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldE5pbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpbWl0aXZlOgorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWG1sQW55U2ltcGxlVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSB2ID0gKFhtbEFueVNpbXBsZVR5cGUpb2JqOworICAgICAgICAgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUgPSAoKFNpbXBsZVZhbHVlKXYpLmluc3RhbmNlVHlwZSgpOworICAgICAgICAgICAgYXNzZXJ0KGluc3RhbmNlVHlwZSAhPSBudWxsKSA6ICJOaWwgY2FzZSBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeSI7CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsaXN0cworICAgICAgICAgICAgaWYgKGluc3RhbmNlVHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0X2xpc3QoKChTaW1wbGVWYWx1ZSl2KS54Z2V0TGlzdFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRfY29tbWl0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhhbmRsZSBhdG9taWMgdHlwZXMKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydChpbnN0YW5jZVR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJlbmNvdW50ZXJlZCBub25wcmltaXRpdmUgdHlwZS4iOworICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6ICBUaGlzIGlzIGhhbmRsZWQgYmVsb3cuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIGV2ZW50dWFsbHkgd2FudCB0byBoYW5kbGUgaXQgd2l0aCBhIHRyZWVjb3B5LCBzbworICAgICAgICAgICAgICAgICAgICAvLyBldmVudHVhbGx5IHdlIHNob3VsZCBicmVhayBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcHJpbWl0aXZlOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBib29sID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCb29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYm9vbGVhbihib29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlQXJyYXlWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9iNjQoYnl0ZUFycik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlQXJyID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRCeXRlQXJyYXlWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9oZXgoYnl0ZUFycik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRRTmFtZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X1FOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0RmxvYXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9mbG9hdChmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZG91YmxlKGQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGluc3RhbmNlVHlwZS5nZXREZWNpbWFsU2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JZVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGIgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJ5dGVWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYnl0ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcyA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0U2hvcnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfc2hvcnQocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0SW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2ludChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGwgPSAoKFNpbXBsZVZhbHVlKXYpLmdldExvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbG9uZyhsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX0JJR19JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9ICgoU2ltcGxlVmFsdWUpdikuZ2V0QmlnSW50ZWdlclZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9CaWdJbnRlZ2VyKGJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogImludmFsaWQgbnVtZXJpYyBiaXQgY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmQgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEJpZ0RlY2ltYWxWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfQmlnRGVjaW1hbChiZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQU5ZX1VSSToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHYuZ2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdGV4dCh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSB2LmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJlcGFyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X25vdGF0aW9uKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR0R1cmF0aW9uIGdkID0gKChTaW1wbGVWYWx1ZSl2KS5nZXRHRHVyYXRpb25WYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9HRHVyYXRpb24oZ2QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR0RhdGUgZ2QgPSAoKFNpbXBsZVZhbHVlKXYpLmdldEdEYXRlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfR0RhdGUoZ2QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdi5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9TdHJpbmcocyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEU6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuaXNJbW11dGFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dCh2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3ByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3htbGFueXNpbXBsZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1c2hlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRfY29tbWl0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBwcmltaXRpdmUgbm9kZSB0cmVlIGNvcHkgaGFuZGxlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbXBsZXggdHlwZSB1bmV4cGVjdGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBUeXBlU3RvcmVVc2VyIHNldHRlckhlbHBlciAoIFhtbE9iamVjdEJhc2Ugc3JjICkKKyAgICB7CisgICAgICAgIGNoZWNrX29ycGhhbmVkKCk7CisKKyAgICAgICAgc3JjLmNoZWNrX29ycGhhbmVkKCk7CisKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBnZXRfc3RvcmUoKS5jb3B5X2NvbnRlbnRzX2Zyb20oIHNyYy5nZXRfc3RvcmUoKSApLgorICAgICAgICAgICAgICAgIGdldF9zdG9yZSgpLmNoYW5nZV90eXBlKCBzcmMuc2NoZW1hVHlwZSgpICk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFhtbE9iamVjdCBzZXQoWG1sT2JqZWN0IHNyYykKKyAgICB7CisgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHNldCB0aGUgdmFsdWUgb2YgYW4gaW1tdXRhYmxlIFhtbE9iamVjdCIpOworCisgICAgICAgIFhtbE9iamVjdEJhc2Ugb2JqID0gdW5kZXJseWluZyhzcmMpOworCisgICAgICAgIFR5cGVTdG9yZVVzZXIgbmV3T2JqID0gdGhpczsKKworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldE5pbCgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2JqLmlzSW1tdXRhYmxlKCkpCisgICAgICAgICAgICBzZXQob2JqLnN0cmluZ1ZhbHVlKCkpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtb25pdG9yKCkgPT0gb2JqLm1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmogPSBzZXR0ZXJIZWxwZXIoIG9iaiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IHRvIGdyYWIgdHdvIGxvY2tzOiBkb24ndCBkZWFkbG9jayBvdXJzZWx2ZXMKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChvYmoubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmogPSBzZXR0ZXJIZWxwZXIoIG9iaiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KSBuZXdPYmo7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2xpc3QoTGlzdCBsaXN0KQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gdikKKyAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYnl0ZShieXRlIHYpCisgICAgICAgIHsgc2V0X2ludCgoaW50KSB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9zaG9ydChzaG9ydCB2KQorICAgICAgICB7IHNldF9pbnQoKGludCkgdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQorICAgICAgICB7IHNldF9sb25nKChsb25nKSB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikKKyAgICAgICAgeyBzZXRfQmlnSW50ZWdlcihCaWdJbnRlZ2VyLnZhbHVlT2YodikpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2NoYXIoY2hhciB2KQorICAgICAgICB7IHNldF9TdHJpbmcoQ2hhcmFjdGVyLnRvU3RyaW5nKHYpKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9mbG9hdChmbG9hdCB2KQorICAgICAgICB7IHNldF9CaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKHYpKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9kb3VibGUoZG91YmxlIHYpCisgICAgICAgIHsgc2V0X0JpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwodikpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGUpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQnl0ZUFycmF5KGJ5dGVbXSBiKQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9iNjQoYnl0ZVtdIGIpCisgICAgICAgIHsgc2V0X0J5dGVBcnJheShiKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9oZXgoYnl0ZVtdIGIpCisgICAgICAgIHsgc2V0X0J5dGVBcnJheShiKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9CaWdJbnRlZ2VyKEJpZ0ludGVnZXIgdikKKyAgICAgICAgeyBzZXQobmV3IEJpZ0RlY2ltYWwodikpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KQorICAgICAgICB7IHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9EYXRlKERhdGUgdikKKyAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfQ2FsZW5kYXIoQ2FsZW5kYXIgdikKKyAgICAgICAgeyB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHYpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIHYpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0NvbXBsZXhYbWwoWG1sT2JqZWN0IHYpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIHYpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbm90YXRpb24oU3RyaW5nIHYpCisgICAgICAgIHsgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sYW55c2ltcGxlKFhtbEFueVNpbXBsZVR5cGUgdikKKyAgICAgICAgeyBzZXRfU3RyaW5nKHYuZ2V0U3RyaW5nVmFsdWUoKSk7IH0KKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wYXJhYmxlX3ZhbHVlX3NwYWNlcyhTY2hlbWFUeXBlIHQxLCBTY2hlbWFUeXBlIHQyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KHQxLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OICYmIHQyLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLlVOSU9OKTsKKworICAgICAgICBpZiAoIXQxLmlzU2ltcGxlVHlwZSgpICYmICF0Mi5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiAodDEuZ2V0Q29udGVudFR5cGUoKSA9PSB0Mi5nZXRDb250ZW50VHlwZSgpKTsKKworICAgICAgICBpZiAoIXQxLmlzU2ltcGxlVHlwZSgpIHx8ICF0Mi5pc1NpbXBsZVR5cGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAodDEuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCAmJiB0Mi5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKHQxLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QgfHwgdDIuZ2V0U2ltcGxlVmFyaWV0eSgpID09IFNjaGVtYVR5cGUuTElTVCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gKHQxLmdldFByaW1pdGl2ZVR5cGUoKS5lcXVhbHModDIuZ2V0UHJpbWl0aXZlVHlwZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHZhbHVlRXF1YWxzSW1wbChYbWxPYmplY3QgeG1sb2JqKQorICAgIHsKKyAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKworICAgICAgICBTY2hlbWFUeXBlIHR5cGV0aGlzID0gaW5zdGFuY2VUeXBlKCk7CisgICAgICAgIFNjaGVtYVR5cGUgdHlwZW90aGVyID0gKChTaW1wbGVWYWx1ZSl4bWxvYmopLmluc3RhbmNlVHlwZSgpOworCisgICAgICAgIGlmICh0eXBldGhpcyA9PSBudWxsICYmIHR5cGVvdGhlciA9PSBudWxsKSAvLyBkZXRlY3RzIG5pbAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKHR5cGV0aGlzID09IG51bGwgfHwgdHlwZW90aGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFjb21wYXJhYmxlX3ZhbHVlX3NwYWNlcyh0eXBldGhpcywgdHlwZW90aGVyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoeG1sb2JqLnNjaGVtYVR5cGUoKS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5VTklPTikKKyAgICAgICAgICAgIHJldHVybiAodW5kZXJseWluZyh4bWxvYmopKS5lcXVhbF90byh0aGlzKTsKKworICAgICAgICByZXR1cm4gZXF1YWxfdG8oeG1sb2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3QgeG1sb2JqKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzSW1tdXRhYmxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHhtbG9iai5pc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZUVxdWFsc0ltcGwoeG1sb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkgfHwgbW9uaXRvcigpID09IHhtbG9iai5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlRXF1YWxzSW1wbCh4bWxvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHhtbG9iai5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVFcXVhbHNJbXBsKHhtbG9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCisgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIENvbXBhcmFibGUuIFRoaXMgY29tcGFyZVRvIGlzIGluY29uc2lzdGVudCB3aXRoCisgICAgICogZXF1YWxzIHVubGVzcyBpc0ltbXV0YWJsZSgpIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlVmFsdWUoKFhtbE9iamVjdClvYmopOyAvLyBjYW4gdGhyb3cgQ2xhc3NDYXN0CisgICAgICAgIGlmIChyZXN1bHQgPT0gMikKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd2VkIHRvIHJldHVybiAyIGZvciBpbmNvbXBhcmFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29tcGFyZVZhbHVlSW1wbChYbWxPYmplY3QgeG1sb2JqKQorICAgIHsKKyAgICAgICAgU2NoZW1hVHlwZSB0eXBlMSwgdHlwZTI7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGUxID0gaW5zdGFuY2VUeXBlKCk7CisgICAgICAgICAgICB0eXBlMiA9ICgoU2ltcGxlVmFsdWUpeG1sb2JqKS5pbnN0YW5jZVR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUxID09IG51bGwgJiYgdHlwZTIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAodHlwZTEgPT0gbnVsbCB8fCB0eXBlMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgaWYgKCF0eXBlMS5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlMS5pc1VSVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgaWYgKCF0eXBlMi5pc1NpbXBsZVR5cGUoKSB8fCB0eXBlMi5pc1VSVHlwZSgpKQorICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgdHlwZTEgPSB0eXBlMS5nZXRQcmltaXRpdmVUeXBlKCk7CisgICAgICAgIHR5cGUyID0gdHlwZTIuZ2V0UHJpbWl0aXZlVHlwZSgpOworCisgICAgICAgIC8vIERpZmZlcmVudCB2YWx1ZSBzcGFjZXM6IGRpZmZlcmVudAorICAgICAgICBpZiAodHlwZTEuZ2V0QnVpbHRpblR5cGVDb2RlKCkgIT0gdHlwZTIuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCisgICAgICAgICAgICByZXR1cm4gMjsKKworICAgICAgICAvLyBub3cgd2UnbGwgZGVwZW5kIG9uIG91ciBpbXBsIGNsYXNzIHRvIGRvIHRoZSB3b3JrCisgICAgICAgIHJldHVybiBjb21wYXJlX3RvKHhtbG9iaik7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVmFsdWUoWG1sT2JqZWN0IHhtbG9iaikKKyAgICB7CisgICAgICAgIGlmICh4bWxvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAyOworCisgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh4bWxvYmouaXNJbW11dGFibGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVmFsdWVJbXBsKHhtbG9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoeG1sb2JqLm1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoeG1sb2JqLmlzSW1tdXRhYmxlKCkgfHwgbW9uaXRvcigpID09IHhtbG9iai5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh4bWxvYmoubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZUltcGwoeG1sb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKKyAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNvbXBhcmVfdG8gaXMgYWxsb3dlZCB0byBkbyB0d28KKyAgICAgKiB1bnVzdWFsIHRoaW5nczoKKyAgICAgKiAoMSkgaXQgY2FuIGFzc3VtZSB0aGF0IHRoZSB4bWxvYmogcGFzc2VkIGhhcyBhIHByaW1pdGl2ZQorICAgICAqICAgICB0eXBlIHVuZGVybHlpbmcgdGhlIGluc3RhbmNlIHR5cGUgdGhhdCBtYXRjaGVzIHRoZQorICAgICAqICAgICBjdXJyZW50IGluc3RhbmNlLCBhbmQgdGhhdCBuZWl0aGVyIGlzIG5pbC4KKyAgICAgKiAoMikgaXQgaXMgYWxsb3dlZCB0byByZXR1cm4gMiBmb3IgImluY29tcGFyYWJsZSI7CisgICAgICogICAgIGl0IHNob3VsZCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZV90byhYbWxPYmplY3QgeG1sb2JqKQorICAgIHsKKyAgICAgICAgaWYgKGVxdWFsX3RvKHhtbG9iaikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxfdG8oWG1sT2JqZWN0IHhtbG9iaik7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHZhbHVlX2hhc2hfY29kZSgpOworCisgICAgcHVibGljIGludCB2YWx1ZUhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVfaGFzaF9jb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5zdGFuY2VPZihTY2hlbWFUeXBlIHR5cGUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIG15VHlwZTsKKworICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5VTklPTikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChteVR5cGUgPSBpbnN0YW5jZVR5cGUoKTsgbXlUeXBlICE9IG51bGw7IG15VHlwZSA9IG15VHlwZS5nZXRCYXNlVHlwZSgpKQorICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG15VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTZXQgY3R5cGVzID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh0eXBlLmdldFVuaW9uQ29uc3RpdHVlbnRUeXBlcygpKSk7CisgICAgICAgICAgICBmb3IgKG15VHlwZSA9IGluc3RhbmNlVHlwZSgpOyBteVR5cGUgIT0gbnVsbDsgbXlUeXBlID0gbXlUeXBlLmdldEJhc2VUeXBlKCkpCisgICAgICAgICAgICAgICAgaWYgKGN0eXBlcy5jb250YWlucyhteVR5cGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgaWYgKCFpc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOworCisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhtbE9iamVjdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgWG1sT2JqZWN0IHhtbG9iaiA9IChYbWxPYmplY3Qpb2JqOworICAgICAgICBpZiAoIXhtbG9iai5pc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB2YWx1ZUVxdWFscyh4bWxvYmopOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFpc0ltbXV0YWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc05pbCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gdmFsdWVfaGFzaF9jb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gd3JpdGVSZXBsYWNlIGVpdGhlciBhbiB1bndyYXBwZWQgWG1sT2JqZWN0QmFzZQorICAgICAqIG9yIGFuIFhCZWFuIHByb3h5LiAgQSAidHJ1ZSIgYXJndW1lbnQgbWVhbnMgdW53cmFwcGVkLgorICAgICAqCisgICAgICogVGhlIHNlcmlhbGl6YXRpb24gc3RyYXRlZ3kgZm9yIFhtbE9iamVjdHMgaXMgdGhpczoKKyAgICAgKgorICAgICAqICgxKSBPbmx5IHRoZSByb290IFhtbE9iamVjdCBmb3IgYSBkb2N1bWVudCBhY3R1YWxseSBnZXRzCisgICAgICogICAgIGZ1bGx5IHNlcmlhbGl6ZWQ7IGl0IGlzIHNlcmlhbGl6ZWQgYXMgYSBTZXJpYWxpemVkUm9vdE9iamVjdCwKKyAgICAgKiAgICAgd2hpY2ggc2ltcGx5IHNhdmVzIGl0c2VsZiBhcyBYTUwgdGV4dC4KKyAgICAgKgorICAgICAqICgyKSBJbnRlcmlvciBYbWxPYmplY3RzIGdldCBzZXJpYWxpemVkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQorICAgICAqICAgICByb290IFhtbE9iamVjdCBmb3IgdGhlaXIgZG9jdW1lbnQsIHBsdXMgYW4gaW50ZWdlciB3aGljaAorICAgICAqICAgICBpbmRpY2F0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBYbWxPYmplY3Qgd2l0aGluIHRoZSBvd25lcgorICAgICAqICAgICBkb2N1bWVudC4gVGhpcyBwYWlyIGlzIHN0b3JlZCBhcyBhIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdC4KKyAgICAgKgorICAgICAqIEJvdGggb2JqZWN0cyBjYW4gYmUgbWFrZWQgYXMgd3JhcHBlZCBvciB1bndyYXBwZWQuIElmIHdyYXBwZWQsCisgICAgICogdGhlbiB0aGUgcHJveHkgaXMgcmV0dXJuZWQgd2hlbiBkZXNlcmlhbGl6aW5nOyBpZiB1bndyYXBwZWQsIHRoZW4KKyAgICAgKiB0aGUgcHJveHkgaXMgc3RyaXBwZWQgd2hlbiBkZXNlcmlhbGl6aW5nLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNSb290WG1sT2JqZWN0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVkUm9vdE9iamVjdCh0aGlzKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QodGhpcywgZ2V0Um9vdFhtbE9iamVjdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhdCB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUm9vdFhtbE9iamVjdCgpCisgICAgeworICAgICAgICBYbWxDdXJzb3IgY3VyID0gbmV3Q3Vyc29yKCk7CisgICAgICAgIGlmIChjdXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBib29sZWFuIHJlc3VsdCA9ICFjdXIudG9QYXJlbnQoKTsKKyAgICAgICAgY3VyLmRpc3Bvc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IFhtbE9iamVjdCBmb3IgdGhpcyBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFhtbE9iamVjdCBnZXRSb290WG1sT2JqZWN0KCkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjdXIgPSBuZXdDdXJzb3IoKTsKKyAgICAgICAgaWYgKGN1ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIGN1ci50b1N0YXJ0RG9jKCk7CisgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7CisgICAgICAgIGN1ci5kaXNwb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VyaWFsaXphYmxlIHJld3JpdGUgb2JqZWN0IHRoYXQga25vd3MgaG93IHRvIHJlc29sdmUKKyAgICAgKiB0byBhbiBYbWxPYmplY3RCYXNlIG9yIGEgcHJveHkgZm9yIHRoZSByb290IG9iamVjdCBvZgorICAgICAqIGEgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VyaWFsaXplZFJvb3RPYmplY3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7CisKKyAgICAgICAgdHJhbnNpZW50IENsYXNzIF94YmVhbkNsYXNzOworICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9pbXBsOworCisgICAgICAgIHByaXZhdGUgU2VyaWFsaXplZFJvb3RPYmplY3QoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNlcmlhbGl6ZWRSb290T2JqZWN0KFhtbE9iamVjdCBpbXBsKQorICAgICAgICB7CisgICAgICAgICAgICBfeGJlYW5DbGFzcyA9IGltcGwuc2NoZW1hVHlwZSgpLmdldEphdmFDbGFzcygpOworICAgICAgICAgICAgX2ltcGwgPSBpbXBsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoX3hiZWFuQ2xhc3MpOworICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHNob3J0IGlzIHdyaXR0ZW4gb3V0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgLy8gaXQgd2lsbCBhbHdheXMgYmUgemVybyBmb3Igb2JqZWN0cyB3cml0dGVuIHdpdGgKKyAgICAgICAgICAgIC8vIHRoaXMgY29kZSwgYnV0IGl0IHVzZWQgdG8gYmUgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdGhlCisgICAgICAgICAgICAvLyB3cml0ZVVURigpIG1ldGhvZAorICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoKHNob3J0KTApOworICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoTUFKT1JfVkVSU0lPTl9OVU1CRVIpOworICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQoTUlOT1JfVkVSU0lPTl9OVU1CRVIpOworICAgICAgICAgICAgLy8gQ1IxMjI0MDEgLSBuZWVkIHRvIHVzZSB3cml0ZU9iamVjdCBpbnN0ZWFkIG9mIHdyaXRlVVRGCisgICAgICAgICAgICAvLyBmb3IgeG1sVGV4dCBhcyB3cml0ZVVURiBoYXMgYSBsZW5ndGggbGltaXRhdGlvbiBvZgorICAgICAgICAgICAgLy8gNjU1MzUgYnl0ZXMKKyAgICAgICAgICAgIFN0cmluZyB4bWxUZXh0ID0gX2ltcGwueG1sVGV4dCgpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHhtbFRleHQpOworICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHJlYWQgY2xhc3Mgb2JqZWN0IGZpcnN0IC0gdGhpcyBpcworICAgICAgICAgICAgICAgIC8vIGZpcnN0IGp1c3QgZm9yIGhpc3RvcmljYWwgcmVhc29ucyAtIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlcnMKKyAgICAgICAgICAgICAgICAvLyBmaXJzdAorICAgICAgICAgICAgICAgIF94YmVhbkNsYXNzID0gKENsYXNzKWluLnJlYWRPYmplY3QoKTsKKworICAgICAgICAgICAgICAgIGludCB1dGZCeXRlcyA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdmVyc2lvbiBudW1iZXJzCisgICAgICAgICAgICAgICAgLy8gaWYgdXRmQnl0ZXMgaXMgbm9uLXplcm8gdGhlbiB3ZSBkZWZhdWx0IHRvIDAuMAorICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBleHBlY3QgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycworICAgICAgICAgICAgICAgIC8vIHRvIGJlIG5leHQgZW50cmllcyBpbiBzdHJlYW0KKyAgICAgICAgICAgICAgICBpbnQgbWFqb3JWZXJzaW9uTnVtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbWlub3JWZXJzaW9uTnVtID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodXRmQnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1ham9yVmVyc2lvbk51bSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgICAgICAgICAgICAgIG1pbm9yVmVyc2lvbk51bSA9IGluLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIHhtbFRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHN3aXRjaCAobWFqb3JWZXJzaW9uTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBvcmlnaW5hbCwgdW5udW1iZXJlZCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlub3JWZXJzaW9uTnVtIGlzIGFsd2F5cyB6ZXJvCisgICAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0ID0gcmVhZE9iamVjdFYwKGluLCB1dGZCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbi5yZWFkQm9vbGVhbigpOyAvLyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1pbm9yVmVyc2lvbk51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFRleHQgPSAoU3RyaW5nKWluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4ucmVhZEJvb2xlYW4oKTsgLy8gaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGVzZXJpYWxpemF0aW9uIGVycm9yOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBudW1iZXIgIiArIG1ham9yVmVyc2lvbk51bSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlub3JWZXJzaW9uTnVtICsgIiBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGVzZXJpYWxpemF0aW9uIGVycm9yOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gbnVtYmVyICIgKyBtYWpvclZlcnNpb25OdW0gKyAiLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb25OdW0gKyAiIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRzID0gbmV3IFhtbE9wdGlvbnMoKS5zZXREb2N1bWVudFR5cGUoWG1sQmVhbnMudHlwZUZvckNsYXNzKF94YmVhbkNsYXNzKSk7CisgICAgICAgICAgICAgICAgX2ltcGwgPSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKHhtbFRleHQsIG51bGwsIG9wdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikobmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKS5pbml0Q2F1c2UoZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgZm9yIHJlYWRpbmcgdGhlIFVURi04IFN0cmluZyB0aGF0IHVzZWQgdG8gYmUKKyAgICAgICAgLy8gd3JpdHRlbiBvdXQgZm9yIGEgc2VyaWFsaXplZCBYbWxPYmplY3QgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICAvLyBvcmlnaW5hbCBmb3JtYXQgYmVmb3JlIHRoaXMgZml4LCBpLmUuIGl0IGV4cGVjdHMgaXQKKyAgICAgICAgLy8gdG8gaGF2ZSBiZWVuIHdyaXR0ZW4gdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisgICAgICAgIC8vCisgICAgICAgIC8vIHdyaXRlT2JqZWN0KENsYXNzIG9iamVjdCkKKyAgICAgICAgLy8gd3JpdGVVVEYoeG1sVGV4dCBvZiBvYmplY3QgYXMgU3RyaW5nKQorICAgICAgICAvLyB3cml0ZUJvb2xlYW4oKQorICAgICAgICAvLworICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBwYXNzZWQgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbSBwb3NpdGlvbmVkIGFzIHRob3VnaAorICAgICAgICAvLyBpdCBoYWQganVzdCByZWFkIHRoZSBjbGFzcyBvYmplY3QgcGx1cyB0aGUgbmV4dCAyIGJ5dGVzLiBUaG9zZSAyCisgICAgICAgIC8vIGJ5dGVzIGFyZSBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCBzaG9ydCBzYXlpbmcgaG93IG1hbnkgbW9yZQorICAgICAgICAvLyBieXRlcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHRoZSBieXRlcyBvZiB0aGUgVVRGLTgtZm9ybWF0dGVkIFN0cmluZzsKKyAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBwYXNzZWQgaW4gYXMgdGhlIGFyZ3VtZW50IHV0ZkJ5dGVzCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlYWRPYmplY3RWMChPYmplY3RJbnB1dFN0cmVhbSBpbiwgaW50IHV0ZkJ5dGVzKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBhbGxvdyBhbiBleHRyYSAyIGJ5dGVzIHVwIGZyb250IGZvciB0aGUgdW5zaWduZWQgc2hvcnQKKyAgICAgICAgICAgIGJ5dGVbXSBiQXJyYXkgPSBuZXcgYnl0ZVt1dGZCeXRlcysyXTsKKworICAgICAgICAgICAgLy8gZm9yIGZvcm1hdCBvZiB0aGVzZSBmaXJzdCAyIGJ5dGVzIHNlZQorICAgICAgICAgICAgLy8gSmF2YSBBUEkgZG9jcyAtIERhdGFPdXRwdXRTdHJlYW0ud3JpdGVTaG9ydCgpCisgICAgICAgICAgICBiQXJyYXlbMF0gPSAoYnl0ZSkoIDB4ZmYgJiAodXRmQnl0ZXMgPj4gOCkgKTsKKyAgICAgICAgICAgIGJBcnJheVsxXSA9IChieXRlKSggMHhmZiAmIHV0ZkJ5dGVzICk7CisKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIG5leHQgbnVtQnl0ZXMgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAvLyBpbnRvIHRoZSBieXRlIGFycmF5IHN0YXJ0aW5nIGF0IG9mZnNldCAyOyB0aGlzIG1heQorICAgICAgICAgICAgLy8gdGFrZSBtdWx0aXBsZSBjYWxscyB0byByZWFkKCkKKyAgICAgICAgICAgIGludCB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IHV0ZkJ5dGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bVJlYWQgPQorICAgICAgICAgICAgICAgICAgICBpbi5yZWFkKGJBcnJheSwgMit0b3RhbEJ5dGVzUmVhZCwgdXRmQnl0ZXMtdG90YWxCeXRlc1JlYWQpOworICAgICAgICAgICAgICAgIGlmIChudW1SZWFkID09IC0xKSAvLyByZWFjaGVkIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSBudW1SZWFkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodG90YWxCeXRlc1JlYWQgIT0gdXRmQnl0ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGJhY2t3YXJkcyBjb21wYXRpYmxlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIlhtbE9iamVjdDogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKCIgKyB0b3RhbEJ5dGVzUmVhZCArCisgICAgICAgICAgICAgICAgICAgICAgICAiKSAhPSBudW1iZXIgZXhwZWN0ZWQgKCIgKyB1dGZCeXRlcyArICIpIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgc2V0IHVwIGEgRGF0YUlucHV0U3RyZWFtIHRvIHJlYWQgdGhvc2UKKyAgICAgICAgICAgIC8vIGJ5dGVzIGFzIGEgVVRGLTggU3RyaW5nIGkuZS4gYXMgdGhvdWdoIHdlJ2QgbmV2ZXIKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIGZpcnN0IDIgYnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc3RyZWFtCisgICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYkFycmF5KSk7CisgICAgICAgICAgICAgICAgc3RyID0gZGlzLnJlYWRVVEYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGRpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaW1wbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6YWJsZSByZXdyaXRlIG9iamVjdCB0aGF0IGtub3dzIGhvdyB0byByZXNvbHZlCisgICAgICogdG8gYW4gWG1sT2JqZWN0QmFzZSBvciBhIHByb3h5IGZvciBhbiBpbnRlcmlvciBwb3NpdGlvbgorICAgICAqIHdpdGhpbiBhIGRvY3VtZW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZWRJbnRlcmlvck9iamVjdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKKworICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9pbXBsOworICAgICAgICB0cmFuc2llbnQgWG1sT2JqZWN0IF9yb290OworCisgICAgICAgIHByaXZhdGUgU2VyaWFsaXplZEludGVyaW9yT2JqZWN0KCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXJpYWxpemVkSW50ZXJpb3JPYmplY3QoWG1sT2JqZWN0IGltcGwsIFhtbE9iamVjdCByb290KQorICAgICAgICB7CisgICAgICAgICAgICBfaW1wbCA9IGltcGw7CisgICAgICAgICAgICBfcm9vdCA9IHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChfcm9vdCk7CisgICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChkaXN0YW5jZVRvUm9vdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgX3Jvb3QgPSAoWG1sT2JqZWN0KWluLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGluLnJlYWRCb29sZWFuKCk7CisgICAgICAgICAgICBfaW1wbCA9IG9iamVjdEF0RGlzdGFuY2UoaW4ucmVhZEludCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2ltcGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBkaXN0YW5jZVRvUm9vdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBfaW1wbC5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoIWN1ci50b1ByZXZUb2tlbigpLmlzTm9uZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY3VyLmN1cnJlbnRUb2tlblR5cGUoKS5pc05hbWVzcGFjZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJDb3VudDogIiArIGNvdW50ICsgIiAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKS50b1N0cmluZygpICsgIiAiICsgUU5hbWUucHJldHR5KGN1ci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBYbWxPYmplY3Qgb2JqZWN0QXREaXN0YW5jZShpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEN1cnNvciBjdXIgPSBfcm9vdC5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyLnRvTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaWYgKCFjdXIuY3VycmVudFRva2VuVHlwZSgpLmlzTmFtZXNwYWNlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCAtPSAxOworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdW50OiAiICsgY291bnQgKyAiICIgKyBjdXIuY3VycmVudFRva2VuVHlwZSgpLnRvU3RyaW5nKCkgKyAiICIgKyBRTmFtZS5wcmV0dHkoY3VyLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGphdmFfdmFsdWUoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIGlmIChvYmouaXNOaWwoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhtbEFueVNpbXBsZVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIG9iajsKKworICAgICAgICBTY2hlbWFUeXBlIGluc3RhbmNlVHlwZSA9ICgoU2ltcGxlVmFsdWUpb2JqKS5pbnN0YW5jZVR5cGUoKTsKKyAgICAgICAgYXNzZXJ0KGluc3RhbmNlVHlwZSAhPSBudWxsKSA6ICJOaWwgY2FzZSBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWJvdmUiOworCisgICAgICAgIC8vIGhhbmRsZSBsaXN0cworICAgICAgICBpZiAoaW5zdGFuY2VUeXBlLmdldFNpbXBsZVZhcmlldHkoKSA9PSBTY2hlbWFUeXBlLkxJU1QpCisgICAgICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSlvYmopLmdldExpc3RWYWx1ZSgpOworCisgICAgICAgIFNpbXBsZVZhbHVlIGJhc2UgPSAoU2ltcGxlVmFsdWUpb2JqOworCisgICAgICAgIHN3aXRjaCAoaW5zdGFuY2VUeXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldEJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCeXRlQXJyYXlWYWx1ZSgpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldFFOYW1lVmFsdWUoKTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KGJhc2UuZ2V0RmxvYXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYmFzZS5nZXREb3VibGVWYWx1ZSgpKTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5zdGFuY2VUeXBlLmdldERlY2ltYWxTaXplKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CWVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGJhc2UuZ2V0Qnl0ZVZhbHVlKCkpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5TSVpFX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChiYXNlLmdldFNob3J0VmFsdWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGJhc2UuZ2V0SW50VmFsdWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhiYXNlLmdldExvbmdWYWx1ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuU0laRV9CSUdfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLmdldEJpZ0ludGVnZXJWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpIDogImludmFsaWQgbnVtZXJpYyBiaXQgY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJWkVfQklHX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRCaWdEZWNpbWFsVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0FOWV9VUkk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZ2V0U3RyaW5nVmFsdWUoKTsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRHRHVyYXRpb25WYWx1ZSgpOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRDYWxlbmRhclZhbHVlKCk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJlbmNvdW50ZXJlZCBub25wcmltaXRpdmUgdHlwZS4iOworICAgICAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisKKyAgICAgICAgICAgIC8vIE5COiBmb3Igc3RyaW5nIGVudW1zIHdlIGp1c3QgZG8gamF2YS5sYW5nLlN0cmluZworICAgICAgICAgICAgLy8gd2hlbiBpbiB0aGUgY29udGV4dCBvZiB1bmlvbnMuIEl0J3MgZWFzaWVyIG9uIHVzZXJzLgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBiYXNlLmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gYmFzZS5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGNvZGUgZ2VuZXJhdGVkIGNvZGUgdG8gZ2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqIGZvciBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbEFueVNpbXBsZVR5cGUgZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3ZhbHVlKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gc2NoZW1hVHlwZSgpOworICAgICAgICBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBhTW9kZWwgPSBzVHlwZS5nZXRBdHRyaWJ1dGVNb2RlbCgpOworICAgICAgICBpZiAoYU1vZGVsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgc0F0dHIgPSBhTW9kZWwuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICBpZiAoc0F0dHIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gc0F0dHIuZ2V0RGVmYXVsdFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUG9zaXRpdmVJbnRlZ2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjdmMzUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxQb3NpdGl2ZUludGVnZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUG9zaXRpdmVJbnRlZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKKworcHVibGljIGNsYXNzIFhtbFBvc2l0aXZlSW50ZWdlckltcGwgZXh0ZW5kcyBKYXZhSW50ZWdlckhvbGRlckV4IGltcGxlbWVudHMgWG1sUG9zaXRpdmVJbnRlZ2VyCit7CisgICAgcHVibGljIFhtbFBvc2l0aXZlSW50ZWdlckltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbFBvc2l0aXZlSW50ZWdlci50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sUG9zaXRpdmVJbnRlZ2VySW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA2MmViCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sUU5hbWVJbXBsLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7CisKKworcHVibGljIGNsYXNzIFhtbFFOYW1lSW1wbCBleHRlbmRzIEphdmFRTmFtZUhvbGRlciBpbXBsZW1lbnRzIFhtbFFOYW1lCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxRTmFtZVJlc3RyaWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyNTBlNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFFOYW1lUmVzdHJpY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUU5hbWU7CisKK3B1YmxpYyBjbGFzcyBYbWxRTmFtZVJlc3RyaWN0aW9uIGV4dGVuZHMgSmF2YVFOYW1lSG9sZGVyRXggaW1wbGVtZW50cyBYbWxRTmFtZQoreworICAgIHB1YmxpYyBYbWxRTmFtZVJlc3RyaWN0aW9uKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFNob3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTJiN2YKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTaG9ydEltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTaG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CisKKworcHVibGljIGNsYXNzIFhtbFNob3J0SW1wbCBleHRlbmRzIEphdmFJbnRIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFNob3J0Cit7CisgICAgcHVibGljIFhtbFNob3J0SW1wbCgpCisgICAgICAgIHsgc3VwZXIoWG1sU2hvcnQudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbFNob3J0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nRW51bWVyYXRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0VudW1lcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NmE5OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0VudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKKworcHVibGljIGNsYXNzIFhtbFN0cmluZ0VudW1lcmF0aW9uIGV4dGVuZHMgSmF2YVN0cmluZ0VudW1lcmF0aW9uSG9sZGVyRXggaW1wbGVtZW50cyBYbWxTdHJpbmcKK3sKKyAgICBwdWJsaWMgWG1sU3RyaW5nRW51bWVyYXRpb24oU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBhNzgyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RyaW5nSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFN0cmluZzsKKworCitwdWJsaWMgY2xhc3MgWG1sU3RyaW5nSW1wbCBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXIgaW1wbGVtZW50cyBYbWxTdHJpbmcKK3sKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0cmluZ1Jlc3RyaWN0aW9uLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NGY2NzAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxTdHJpbmdSZXN0cmljdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTdHJpbmc7CisKK3B1YmxpYyBjbGFzcyBYbWxTdHJpbmdSZXN0cmljdGlvbiBleHRlbmRzIEphdmFTdHJpbmdIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFN0cmluZworeworICAgIHB1YmxpYyBYbWxTdHJpbmdSZXN0cmljdGlvbihTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVGltZUltcGwuamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRpbWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExYzNkYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFRpbWVJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CisKKworcHVibGljIGNsYXNzIFhtbFRpbWVJbXBsIGV4dGVuZHMgSmF2YUdEYXRlSG9sZGVyRXggaW1wbGVtZW50cyBYbWxUaW1lCit7CisgICAgcHVibGljIFhtbFRpbWVJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxUaW1lLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxUaW1lSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxUb2tlbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU3OGM4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVG9rZW5JbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFRva2VuOworCisKK3B1YmxpYyBjbGFzcyBYbWxUb2tlbkltcGwgZXh0ZW5kcyBKYXZhU3RyaW5nSG9sZGVyRXggaW1wbGVtZW50cyBYbWxUb2tlbgoreworICAgIHB1YmxpYyBYbWxUb2tlbkltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbFRva2VuLnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxUb2tlbkltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5pb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NDgwOAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuaW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjQ3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU3RyaW5nRW51bUFic3RyYWN0QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEdXJhdGlvblNwZWNpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TaW1wbGVWYWx1ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBzaW1wbGUgdW5pb24gdHlwZXMuCisgKgorICovCitwdWJsaWMgY2xhc3MgWG1sVW5pb25JbXBsIGV4dGVuZHMgWG1sT2JqZWN0QmFzZSBpbXBsZW1lbnRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICBwdWJsaWMgWG1sVW5pb25JbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IF9zY2hlbWFUeXBlID0gdHlwZTsgaW5pdENvbXBsZXhUeXBlKGNvbXBsZXgsIGZhbHNlKTsgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgc2NoZW1hVHlwZSgpCisgICAgICAgIHsgcmV0dXJuIF9zY2hlbWFUeXBlOyB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuaW5zdGFuY2VUeXBlKCk7IH0KKworICAgIHByaXZhdGUgU2NoZW1hVHlwZSBfc2NoZW1hVHlwZTsKKyAgICBwcml2YXRlIFhtbEFueVNpbXBsZVR5cGUgX3ZhbHVlOyAvLyB1bmRlcmx5aW5nIHZhbHVlCisgICAgcHJpdmF0ZSBTdHJpbmcgX3RleHR2YWx1ZSA9ICIiOyAvLyB0ZXh0dWFsIHZhbHVlCisKKworCisKKyAgICAvLyBTSU1QTEUgVkFMVUUgQUNDRVNTT1JTIEJFTE9XIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBnZXRzIHJhdyB0ZXh0IHZhbHVlCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVfdGV4dChOYW1lc3BhY2VNYW5hZ2VyIG5zbSkKKyAgICAgICAgeyByZXR1cm4gX3RleHR2YWx1ZTsgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNfZGVmYXVsdGFibGVfd3MoU3RyaW5nIHYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbEFueVNpbXBsZVR5cGUgc2F2ZWRWYWx1ZSA9IF92YWx1ZTsKKyAgICAgICAgICAgIHNldF90ZXh0KHYpOworCisgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBzYXZlZCB2YWx1ZQorICAgICAgICAgICAgX3ZhbHVlID0gc2F2ZWRWYWx1ZTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfdGV4dChTdHJpbmcgcykKKyAgICB7CisgICAgICAgIC8vIGZpcnN0IGNoZWNrIGFnYWluc3QgYW55IHBhdHRlcm5zLi4uCisgICAgICAgIGlmICghX3NjaGVtYVR5cGUubWF0Y2hQYXR0ZXJuRmFjZXQocykpCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgLy8gc2F2ZSBzdGF0ZSBmb3Igcm9sbGJhY2sKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsID0gX3RleHR2YWx1ZTsKKyAgICAgICAgX3RleHR2YWx1ZSA9IHM7CisKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSB0eXBlcywgdHJ5aW5nIHRvIGNyZWF0ZSBhIHR5cGUKKyAgICAgICAgU2NoZW1hVHlwZVtdIG1lbWJlcnMgPSBfc2NoZW1hVHlwZS5nZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMoKTsKKyAgICAgICAgYXNzZXJ0KG1lbWJlcnMgIT0gbnVsbCk7CisKKyAgICAgICAgYm9vbGVhbiBwdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gYm9vbGVhbiB3YXNzdHJpY3QgPSBzZXRfc3RyaWN0KHRydWUpOyAvLyB0ZWxsIHR5cGVzIHRvIGNvbXBsYWluIGZlcnZlcmVudGx5IGFib3V0IGVycm9ycworICAgICAgICBpZiAoaGFzX3N0b3JlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucHVzaChuZXcgTmFtZXNwYWNlQ29udGV4dChnZXRfc3RvcmUoKSkpOworICAgICAgICAgICAgcHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGZvbGxvd2luZyBjYWxsLCAidGhpcyIgaXMgYSBnZW5lcmljCisgICAgICAgICAgICAgICAgLy8gWG1sQW55U2ltcGxlVHlwZSBpbXBsZW1lbnRhdGlvbiwgZm9yIHdoaWNoIG9ubHkgZ2V0VGV4dCBjYW4gYmUgY2FsbGVkLgorICAgICAgICAgICAgICAgIC8vIChOb3RlIHRoYXQgInRoaXMiIGlzIG5vdCB3cmFwcGVkIGluIHRoZSBwcm94eSBvYmplY3QuKQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQW55U2ltcGxlVHlwZSBuZXd2YWwgPSAoKFNjaGVtYVR5cGVJbXBsKW1lbWJlcnNbaV0pLm5ld1ZhbGlkYXRpbmdWYWx1ZShzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBjaGVjayBhZ2FpbnN0IChlbnVlbXJhdGlvbikgcmVzdHJpY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2sobmV3dmFsLCBfc2NoZW1hVHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgdGhhdCB3b3JrcyEKKyAgICAgICAgICAgICAgICAgICAgX3ZhbHVlID0gbmV3dmFsOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVHJvdWJsZXNvbWUgdW5pb24gZXhjZXB0aW9uIGNhdXNlZCBieSB1bmV4cGVjdGVkICIgKyBlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0KGZhbHNlKSA6ICJVbmV4cGVjdGVkICIgKyBlOworICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHVzaGVkKQorICAgICAgICAgICAgICAgIE5hbWVzcGFjZUNvbnRleHQucG9wKCk7CisgICAgICAgICAgICAvLyBzZXRfc3RyaWN0KHdhc3N0cmljdCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXJzOyByb2xsYmFjayBhbmQgdGhyb3cKKyAgICAgICAgX3RleHR2YWx1ZSA9IG9yaWdpbmFsOworICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X25pbCgpCisgICAgeworICAgICAgICBfdmFsdWUgPSBudWxsOworICAgICAgICBfdGV4dHZhbHVlID0gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldF93c2Nhbm9uX3J1bGUoKSB7IHJldHVybiBTY2hlbWFUeXBlLldTX1BSRVNFUlZFOyB9CisKKworICAgIC8vIG51bWVyaWNzCisgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAuMGYgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZmxvYXRWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwLjAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZG91YmxlVmFsdWUoKTsgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJpZ0RlY2ltYWxWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuYmlnSW50ZWdlclZhbHVlKCk7IH0KKworICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5ieXRlVmFsdWUoKTsgfQorCisgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IDAgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuc2hvcnRWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgaW50IGludFZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmludFZhbHVlKCk7IH0KKworICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gMCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5sb25nVmFsdWUoKTsgfQorCisKKyAgICAvLyB2YXJpb3VzCisgICAgcHVibGljIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5ieXRlQXJyYXlWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5jYWxlbmRhclZhbHVlKCk7IH0KKworICAgIHB1YmxpYyBEYXRlIGRhdGVWYWx1ZSgpCisgICAgICAgIHsgY2hlY2tfZGF0ZWQoKTsgcmV0dXJuIF92YWx1ZSA9PSBudWxsID8gbnVsbCA6ICgoU2ltcGxlVmFsdWUpX3ZhbHVlKS5kYXRlVmFsdWUoKTsgfQorCisgICAgcHVibGljIEdEYXRlIGdEYXRlVmFsdWUoKQorICAgICAgICB7IGNoZWNrX2RhdGVkKCk7IHJldHVybiBfdmFsdWUgPT0gbnVsbCA/IG51bGwgOiAoKFNpbXBsZVZhbHVlKV92YWx1ZSkuZ0RhdGVWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmdEdXJhdGlvblZhbHVlKCk7IH0KKworICAgIHB1YmxpYyBRTmFtZSBxTmFtZVZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLnFOYW1lVmFsdWUoKTsgfQorCisgICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmxpc3RWYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgTGlzdCB4bGlzdFZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLnhsaXN0VmFsdWUoKTsgfQorCisgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogKChTaW1wbGVWYWx1ZSlfdmFsdWUpLmVudW1WYWx1ZSgpOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZhbHVlKCkKKyAgICAgICAgeyBjaGVja19kYXRlZCgpOyByZXR1cm4gX3ZhbHVlID09IG51bGwgPyBudWxsIDogX3ZhbHVlLnN0cmluZ1ZhbHVlKCk7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BhY2Ugb2YgY2Fub25pY2FsIGxleGljYWwgZm9ybXMKKyAgICAgKiBvZiB0aGUgZmlyc3QgKHNvdXJjZSkgdHlwZSBvdmVybGFwcyB3aXRoIHRoZSBmdWxsIGxleGljYWwgc3BhY2UKKyAgICAgKiBvZiB0aGUgc2Vjb25kICh0YXJnZXQpIHR5cGUuIEJvdGggdHlwZXMgbXVzdCBiZSBwcmltaXRpdmVzLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGxleGljYWxfb3ZlcmxhcChpbnQgc291cmNlLCBpbnQgdGFyZ2V0KQorICAgIHsKKyAgICAgICAgLy8gdHlwZXMgYXJlIHRoZSBzYW1lCisgICAgICAgIGlmIChzb3VyY2UgPT0gdGFyZ2V0KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gb25lIG9mIHRoZSB0eXBlcyBoYXMgdGhlIGZ1bGwgbGV4aWNhbCBzcGFjZQorICAgICAgICBpZiAoc291cmNlID09IFNjaGVtYVR5cGUuQlRDX0FOWV9TSU1QTEUgfHwKKyAgICAgICAgICAgIHRhcmdldCA9PSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFIHx8CisgICAgICAgICAgICBzb3VyY2UgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HIHx8CisgICAgICAgICAgICB0YXJnZXQgPT0gU2NoZW1hVHlwZS5CVENfU1RSSU5HIHx8CisgICAgICAgICAgICBzb3VyY2UgPT0gU2NoZW1hVHlwZS5CVENfQU5ZX1VSSSB8fAorICAgICAgICAgICAgdGFyZ2V0ID09IFNjaGVtYVR5cGUuQlRDX0FOWV9VUkkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBzd2l0Y2ggKHNvdXJjZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CT09MRUFOOiBzd2l0Y2godGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6ICAgICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBOY05hbWUgYW5kIHRoZXJlZm9yZSBRTmFtZQorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfTk9UQVRJT046ICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBOQ05hbWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogc3dpdGNoKHRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46ICAgICAvLyAiMCIgaXMgdmFsaWQgYm9vbGVhbgorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBoZXgKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAiYSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAiYSIgaXMgdmFsaWQgTmNOYW1lCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDogICAgICAgLy8gIjAiIGlzIHZhbGlkIGZsb2F0CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6ICAgICAgLy8gIjAiIGlzIHZhbGlkIGRvdWJsZQorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDogICAgIC8vICIwIiBpcyB2YWxpZCBkZWNpbWFsCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjogICAgLy8gIlAxWTJNM0RUMTBIMzBNIiBpcyBib3RoIGI2NCBhbmQgZHVyYXRpb24KKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogICAgICAvLyAiMTk5OSIgaXMgdmFsaWQgeWVhcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAvLyAiLSIgYW5kICI6IiBjYW5ub3QgY29tZSBmcm9tIGI2NAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19IRVhfQklOQVJZOiBzd2l0Y2godGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogICAgIC8vICIwIiBpcyB2YWxpZCBib29sZWFuCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBiNjQKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1FOQU1FOiAgICAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lIGFuZCB0aGVyZWZvcmUgUU5hbWUKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiAgICAvLyAiQSIgaXMgdmFsaWQgTmNOYW1lCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDogICAgICAgLy8gIjAiIGlzIHZhbGlkIGZsb2F0CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ET1VCTEU6ICAgICAgLy8gIjAiIGlzIHZhbGlkIGRvdWJsZQorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREVDSU1BTDogICAgIC8vICIwIiBpcyB2YWxpZCBkZWNpbWFsCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6ICAgICAgLy8gIjE5OTkiIGlzIHZhbGlkIHllYXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgLy8gIi0iIGFuZCAiOiIgY2Fubm90IGNvbWUgZnJvbSBiNjQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOiBzd2l0Y2godGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQk9PTEVBTjogICAgIC8vICJ0cnVlIiBpcyB2YWxpZCBib29sZWFuCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogIC8vICJhIiBpcyB2YWxpZCBiNjQKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6ICAvLyAiYSIgaXMgdmFsaWQgaGV4CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19RTkFNRTogICAgICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjogICAgLy8gIkEiIGlzIHZhbGlkIE5jTmFtZSBhbmQgdGhlcmVmb3JlIFFOYW1lCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EVVJBVElPTjogICAgLy8gIlAxWTJNM0RUMTBIMzBNIiBpcyBib3RoIE5jTmFtZSBhbmQgZHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVI6IHN3aXRjaCh0YXJnZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19CQVNFXzY0X0JJTkFSWTogLy8gIjAiIGlzIHZhbGlkIGI2NAorICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWTogIC8vICIwIiBpcyB2YWxpZCBoZXgKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0ZMT0FUOiAgICAgICAvLyAiMCIgaXMgdmFsaWQgZmxvYXQKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RPVUJMRTogICAgICAvLyAiMCIgaXMgdmFsaWQgZG91YmxlCisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19ERUNJTUFMOiAgICAgLy8gIjAiIGlzIHZhbGlkIGRlY2ltYWwKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUjogICAgICAvLyAiMTk5OSIgaXMgdmFsaWQgeWVhcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOiBzd2l0Y2godGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19OT1RBVElPTjoKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JBU0VfNjRfQklOQVJZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNjaGVtYSB0eXBlJ3MgbG9naWNhbCB0eXBlIGlzIGEgbWF0Y2ggZm9yCisgICAgICogdGhlIGdpdmVuIGNhdGVnb3J5IG9mIGphdmEgY29uY2VwdHMuCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OVU1CRVIgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0RBVEUgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0NBTEVOREFSID0gU2NoZW1hVHlwZS5CVENfTEFTVF9CVUlMVElOICsgMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CWVRFQVJSQVkgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKQVZBX0xJU1QgPSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4gKyA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2dpY2FsX292ZXJsYXAoU2NoZW1hVHlwZSB0eXBlLCBpbnQgamF2YWNvZGUpCisgICAgeworICAgICAgICAvLyBub24tdW5pb24gdHlwZXMgYmVjYXVzZSBpdCdzIGJlaW5nIGFwcGxpZWQgb24gaXJyZWR1Y2libGUgdW5pb24gbWVtYmVycyEKKyAgICAgICAgYXNzZXJ0KHR5cGUuZ2V0U2ltcGxlVmFyaWV0eSgpICE9IFNjaGVtYVR5cGUuVU5JT04pOworCisgICAgICAgIGlmIChqYXZhY29kZSA8PSBTY2hlbWFUeXBlLkJUQ19MQVNUX0JVSUxUSU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkgPT0gamF2YWNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChqYXZhY29kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEpBVkFfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEpBVkFfREFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgIT0gU2NoZW1hVHlwZS5BVE9NSUMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0QnVpbHRpblR5cGVDb2RlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBKQVZBX0NBTEVOREFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfREFURV9USU1FOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX1lFQVJfTU9OVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIEpBVkFfQllURUFSUkFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFNpbXBsZVZhcmlldHkoKSAhPSBTY2hlbWFUeXBlLkFUT01JQykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfSEVYX0JJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgSkFWQV9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAodHlwZS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChmYWxzZSkgOiAibWlzc2luZyBjYXNlIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWJzIGEgY2hhaW5lZCB2YWx1ZSBvZiB0eXBlIHN0LCBjcmVhdGluZyBhbmQgYXR0YWNoaW5nCisgICAgICogb25lIGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRfcHJpbWl0aXZlKGludCB0eXBlY29kZSwgT2JqZWN0IHZhbCkKKyAgICB7CisgICAgICAgIFNjaGVtYVR5cGVbXSBtZW1iZXJzID0gX3NjaGVtYVR5cGUuZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCk7CisgICAgICAgIGFzc2VydChtZW1iZXJzICE9IG51bGwpOworCisgICAgICAgIGJvb2xlYW4gcHVzaGVkID0gZmFsc2U7CisgICAgICAgIGlmIChoYXNfc3RvcmUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZXNwYWNlQ29udGV4dC5wdXNoKG5ldyBOYW1lc3BhY2VDb250ZXh0KGdldF9zdG9yZSgpKSk7CisgICAgICAgICAgICBwdXNoZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBvdXRlcjogZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNhbmRpZGF0ZXMgbXVzdCBiZSBhIGxvZ2ljYWwgbWF0Y2ggZm9yIHRoZSBkZXNpcmVkIHR5cGVjb2RlCisgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxfb3ZlcmxhcChtZW1iZXJzW2ldLCB0eXBlY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxBbnlTaW1wbGVUeXBlIG5ld3ZhbDsKKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsID0gbWVtYmVyc1tpXS5uZXdWYWx1ZSh2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXRjaCB0aGlzIHR5cGUgZXZlbiB0aG91Z2ggbG9naWNhbCBjYXRlZ29yaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIHVwIChwcm9iYWJseSBiZWNhdXNlIG9mIHJlc3RyaWNpdG9uKTsgdHJ5IHRoZSBuZXh0IHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSkgOiAiVW5leHBlY3RlZCAiICsgZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogcmV0aGluayB0aGlzIC0gZGlzYWJsaW5nIGZvciBub3cuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gT0ssIG5vdyB3ZSd2ZSBnb3QgYSBuZXd2YWwuLi4gV2UgaGF2ZSB0byB2ZXJpZnkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBsZXhpY2FsbHkgaXQgZG9lc24ndCBvdmVybGFwIHdpdGggcHJldmlvdXMgdHlwZXMKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3dmFsdGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaW5uZXI6IGZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyc1tqXS5nZXRTaW1wbGVWYXJpZXR5KCkgPT0gU2NoZW1hVHlwZS5MSVNUIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4aWNhbF9vdmVybGFwKG1lbWJlcnNbal0uZ2V0UHJpbWl0aXZlVHlwZSgpLmdldEJ1aWx0aW5UeXBlQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWwuc2NoZW1hVHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKS5nZXRCdWlsdGluVHlwZUNvZGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVjZWRpbmcgdHlwZSB0aGF0IG1heSBsZXhpY2FsbHkgb3ZlcmxhcCB3aXRoIG91cnMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBsZXhpY2FsbHkgY29udGFpbnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvdXIgbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcG9zZWQgdmFsdWUsIHRoZW4gaXQncyBpbXBvc3NpYmxlIGZvciB0aGUgdW5pb24gdG8gaGF2ZSBvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHZhbHVlIChiZWNhdXNlIGl0IHdvdWxkIGhhdmUgYmVlbiBtYXNrZWQpIGFuZCB0aHJvdyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXd2YWx0ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHRleHQgPSBuZXd2YWwuc3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNbaV0ubmV3VmFsdWUobmV3dmFsdGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ggYmFkLCB3ZSBzdWNjZWVkZWQuIE91ciBpbnN0YW5jZSBsZXhpY2FsbHkgbG9va3MgbGlrZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHR5cGUsIGFuZCB0aGlzIGlzbid0IGEgdmFsaWQgdmFsdWUuIEtlZXAgb24gaHVudGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZ29vZDogdGhpcyBlcnJvciBtZWFucyB0aGF0IG91ciB2YWx1ZSBkb2Vzbid0IGxvb2sgbGlrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3RoZXIgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgaW5uZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAvLyBObyBsZXhpY2FsIG1hc2tpbmc6IHdlJ3JlIE9LCisgICAgICAgICAgICAgICAgICAgIF92YWx1ZSA9IG5ld3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgX3RleHR2YWx1ZSA9IF92YWx1ZS5zdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHB1c2hlZCkKKyAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0LnBvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVyZSBhcmUgdGhlIHNldHRlcnMKKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9ib29sZWFuKGJvb2xlYW4gdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0JPT0xFQU4sIG5ldyBCb29sZWFuKHYpKTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2J5dGUoYnl0ZSB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBCeXRlKHYpKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9zaG9ydChzaG9ydCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBTaG9ydCh2KSk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfaW50KGludCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIG5ldyBJbnRlZ2VyKHYpKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9sb25nKGxvbmcgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgTG9uZyh2KSk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZmxvYXQoZmxvYXQgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgRmxvYXQodikpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfTlVNQkVSLCBuZXcgRG91YmxlKHYpKTsgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0J5dGVBcnJheShieXRlW10gYikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKEpBVkFfQllURUFSUkFZLCBiKTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF9oZXgoYnl0ZVtdIGIpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0JZVEVBUlJBWSwgYik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfYjY0KGJ5dGVbXSBiKQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9CWVRFQVJSQVksIGIpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0ludGVnZXIoQmlnSW50ZWdlciB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIHYpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0JpZ0RlY2ltYWwoQmlnRGVjaW1hbCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9OVU1CRVIsIHYpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X1FOYW1lKFFOYW1lIHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19RTkFNRSwgdik7IH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9DYWxlbmRhcihDYWxlbmRhciBjKQorICAgICAgICB7IHNldF9wcmltaXRpdmUoSkFWQV9DQUxFTkRBUiwgYyk7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfRGF0ZShEYXRlIGQpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0RBVEUsIGQpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkKQorICAgIHsKKyAgICAgICAgaW50IGJ0YyA9IGQuZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisgICAgICAgIGlmIChidGMgPD0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgc2V0X3ByaW1pdGl2ZShidGMsIGQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldF9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkKQorICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfRFVSQVRJT04sIGQpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfZW51bShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGUpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19TVFJJTkcsIGUpOyB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfbGlzdChMaXN0IHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShKQVZBX0xJU1QsIHYpOyB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxmbG9hdChYbWxPYmplY3QgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0ZMT0FULCB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkb3VibGUoWG1sT2JqZWN0IHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19ET1VCTEUsIHYpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRlY2ltYWwoWG1sT2JqZWN0IHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19ERUNJTUFMLCB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkdXJhdGlvbihYbWxPYmplY3QgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OLCB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxkYXRldGltZShYbWxPYmplY3QgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0RBVEVfVElNRSwgdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sdGltZShYbWxPYmplY3QgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX1RJTUUsIHYpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGRhdGUoWG1sT2JqZWN0IHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19EQVRFLCB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxneWVhcm1vbnRoKFhtbE9iamVjdCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRILCB2KTsgfQorICAgIHByb3RlY3RlZCB2b2lkIHNldF94bWxneWVhcihYbWxPYmplY3QgdikKKyAgICAgICAgeyBzZXRfcHJpbWl0aXZlKFNjaGVtYVR5cGUuQlRDX0dfWUVBUiwgdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ21vbnRoZGF5KFhtbE9iamVjdCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVksIHYpOyB9CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0X3htbGdkYXkoWG1sT2JqZWN0IHYpCisgICAgICAgIHsgc2V0X3ByaW1pdGl2ZShTY2hlbWFUeXBlLkJUQ19HX0RBWSwgdik7IH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRfeG1sZ21vbnRoKFhtbE9iamVjdCB2KQorICAgICAgICB7IHNldF9wcmltaXRpdmUoU2NoZW1hVHlwZS5CVENfR19NT05USCwgdik7IH0KKworCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrKFhtbE9iamVjdCB2LCBTY2hlbWFUeXBlIHNUeXBlKQorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0W10gdmFscyA9IHNUeXBlLmdldEVudW1lcmF0aW9uVmFsdWVzKCk7CisgICAgICAgIGlmICh2YWxzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsc1tpXS52YWx1ZUVxdWFscyh2KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbF90byhYbWxPYmplY3QgeG1sb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF92YWx1ZS52YWx1ZUVxdWFscyh4bWxvYmopOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVfaGFzaF9jb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdmFsdWUuaGFzaENvZGUoKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVfc2ltcGxldmFsKFN0cmluZyBsZXhpY2FsLCBWYWxpZGF0aW9uQ29udGV4dCBjdHgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tfZGF0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJVbmlvbiB2YWx1ZSAiICsgbGV4aWNhbCArICIgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXIgdHlwZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzY2hlbWFUeXBlKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoX3ZhbHVlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0eC5pbnZhbGlkKCJVbmlvbiB2YWx1ZSAiICsgbGV4aWNhbCArICIgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSBtZW1iZXIgdHlwZXMgZm9yICIgKyBRTmFtZUhlbHBlci5yZWFkYWJsZShzY2hlbWFUeXBlKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgKChYbWxPYmplY3RCYXNlKV92YWx1ZSkudmFsaWRhdGVfc2ltcGxldmFsKGxleGljYWwsICBjdHgpOworICAgIH0KKyAgICAKKworfQorCmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEJ5dGVJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEJ5dGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1ODk1YQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkQnl0ZUltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZEJ5dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCisKK3B1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZEJ5dGVJbXBsIGV4dGVuZHMgSmF2YUludEhvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRCeXRlCit7CisgICAgcHVibGljIFhtbFVuc2lnbmVkQnl0ZUltcGwoKQorICAgICAgICB7IHN1cGVyKFhtbFVuc2lnbmVkQnl0ZS50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sVW5zaWduZWRCeXRlSW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZEludEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTEyN2QxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVW5zaWduZWRJbnRJbXBsLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVW5zaWduZWRJbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCisKK3B1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZEludEltcGwgZXh0ZW5kcyBKYXZhTG9uZ0hvbGRlckV4IGltcGxlbWVudHMgWG1sVW5zaWduZWRJbnQKK3sKKyAgICBwdWJsaWMgWG1sVW5zaWduZWRJbnRJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZEludC50eXBlLCBmYWxzZSk7IH0KKyAgICBwdWJsaWMgWG1sVW5zaWduZWRJbnRJbXBsKFNjaGVtYVR5cGUgdHlwZSwgYm9vbGVhbiBjb21wbGV4KQorICAgICAgICB7IHN1cGVyKHR5cGUsIGNvbXBsZXgpOyB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZExvbmdJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZExvbmdJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3ODY3OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkTG9uZ0ltcGwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxVbnNpZ25lZExvbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCisKK3B1YmxpYyBjbGFzcyBYbWxVbnNpZ25lZExvbmdJbXBsIGV4dGVuZHMgSmF2YUludGVnZXJIb2xkZXJFeCBpbXBsZW1lbnRzIFhtbFVuc2lnbmVkTG9uZworeworICAgIHB1YmxpYyBYbWxVbnNpZ25lZExvbmdJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZExvbmcudHlwZSwgZmFsc2UpOyB9CisgICAgcHVibGljIFhtbFVuc2lnbmVkTG9uZ0ltcGwoU2NoZW1hVHlwZSB0eXBlLCBib29sZWFuIGNvbXBsZXgpCisgICAgICAgIHsgc3VwZXIodHlwZSwgY29tcGxleCk7IH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFVuc2lnbmVkU2hvcnRJbXBsLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZFNob3J0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTZiNDMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxVbnNpZ25lZFNob3J0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFVuc2lnbmVkU2hvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworCitwdWJsaWMgY2xhc3MgWG1sVW5zaWduZWRTaG9ydEltcGwgZXh0ZW5kcyBKYXZhSW50SG9sZGVyRXggaW1wbGVtZW50cyBYbWxVbnNpZ25lZFNob3J0Cit7CisgICAgcHVibGljIFhtbFVuc2lnbmVkU2hvcnRJbXBsKCkKKyAgICAgICAgeyBzdXBlcihYbWxVbnNpZ25lZFNob3J0LnR5cGUsIGZhbHNlKTsgfQorICAgIHB1YmxpYyBYbWxVbnNpZ25lZFNob3J0SW1wbChTY2hlbWFUeXBlIHR5cGUsIGJvb2xlYW4gY29tcGxleCkKKyAgICAgICAgeyBzdXBlcih0eXBlLCBjb21wbGV4KTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhNGIzZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworcHVibGljIGNsYXNzIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgoreworICAgIFhtbFZhbHVlRGlzY29ubmVjdGVkRXhjZXB0aW9uICggKQorICAgIHsKKyAgICB9CisgICAgCisgICAgWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb24gKCBTdHJpbmcgbWVzc2FnZSApCisgICAgeworICAgICAgICBzdXBlciggbWVzc2FnZSApOworICAgIH0KKyAgICAKKyAgICBYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiAoIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UgKQorICAgIHsKKyAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGNhdXNlICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sVmFsdWVOb3ROaWxsYWJsZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWUyZWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU5vdE5pbGxhYmxlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworcHVibGljIGNsYXNzIFhtbFZhbHVlTm90TmlsbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCit7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24uamF2YSBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZjFlZTUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitwdWJsaWMgY2xhc3MgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCit7CisgICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpIHt9CisgICAgcHVibGljIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeyBzdXBlcihtZXNzYWdlKTsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEgYi92MS9zcmMvdHlwZWltcGwvb3JnL2FwYWNoZS94bWxiZWFucy9zb2FwL1NPQVBBcnJheVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjY4M2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TT0FQQXJyYXlUeXBlLmphdmEKQEAgLTAsMCArMSw0NTcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcDsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sV2hpdGVzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUHJlZml4UmVzb2x2ZXI7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTT0FQQXJyYXlUeXBlCit7CisgICAgLy8gRXhhbXBsZSBmb286YmFyWyxdW11bLCxdWzcsOV0KKyAgICAvLyAtPiBfdHlwZSA9IFFOYW1lKGZvbzpiYXIpCisgICAgLy8gLT4gX3JhbmtzID0gezIsMSwzfQorICAgIC8vIC0+IF9kaW1lbnNpb25zID0gezcsOX0KKyAgICBwcml2YXRlIFFOYW1lIF90eXBlOworICAgIHByaXZhdGUgaW50W10gX3JhbmtzOyAvLyBpZiByYW5rcyBpcyBlbXB0eSwgaXQgbWVhbnMgdGhlcmUgYXJlIG5vIG5lc3RlZCBhcnJheXMKKyAgICBwcml2YXRlIGludFtdIF9kaW1lbnNpb25zOyAvLyBBbnkgZGltZW5zaW9uIGNhbiBiZSAtMSB0byBpbmRpY2F0ZSAiYW55Ii4KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHJhbmtzIGZvciB0aGUgcGFzc2VkIFNPQVBBcnJheVR5cGUKKyAgICAgKiBhcmUgZXF1YWwgdG8gdGhpcyBvbmUuCisgICAgICoKKyAgICAgKiBEb2VzIE5PVCBjb21wYXJlIHRoZSBfdHlwZSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTYW1lUmFua0FzKFNPQVBBcnJheVR5cGUgb3RoZXJUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKF9yYW5rcy5sZW5ndGggIT0gb3RoZXJUeXBlLl9yYW5rcy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3JhbmtzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3JhbmtzW2ldICE9IG90aGVyVHlwZS5fcmFua3NbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChfZGltZW5zaW9ucy5sZW5ndGggIT0gb3RoZXJUeXBlLl9kaW1lbnNpb25zLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gU09BUCAxLjEtZm9ybWF0dGVkIGluZGV4IHN0cmluZywgcmV0dXJucyBhbiBhcnJheQorICAgICAqIGluZGV4LiAgRm9yIGV4YW1wbGUsIGdpdmVuICJbNCwzLDVdIiwgcmV0dXJucyBhbiBpbnQgYXJyYXkKKyAgICAgKiBjb250YWluaW5nIDQsIDMsIGFuZCA1LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50W10gcGFyc2VTb2FwMTFJbmRleChTdHJpbmcgaW5icmFjZXMpCisgICAgeworICAgICAgICBpbmJyYWNlcyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoaW5icmFjZXMsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOworICAgICAgICBpZiAoIWluYnJhY2VzLnN0YXJ0c1dpdGgoIlsiKSB8fCAhaW5icmFjZXMuZW5kc1dpdGgoIl0iKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc2Zvcm1lZCBTT0FQIDEuMSBpbmRleDogbXVzdCBiZSBjb250YWluZWQgaW4gYnJhY2VzIFtdIik7CisgICAgICAgIHJldHVybiBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoaW5icmFjZXMuc3Vic3RyaW5nKDEsIGluYnJhY2VzLmxlbmd0aCgpIC0gMSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGludGVybmFsUGFyc2VDb21tYUludFN0cmluZyhTdHJpbmcgY3NsKQorICAgIHsKKyAgICAgICAgTGlzdCBkaW1TdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqID0gY3NsLmluZGV4T2YoJywnLCBpKTsKKyAgICAgICAgICAgIGlmIChqIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaW1TdHJpbmdzLmFkZChjc2wuc3Vic3RyaW5nKGkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpbVN0cmluZ3MuYWRkKGNzbC5zdWJzdHJpbmcoaSwgaikpOworICAgICAgICAgICAgaSA9IGogKyAxOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtkaW1TdHJpbmdzLnNpemUoKV07CisgICAgICAgIGkgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZGltU3RyaW5ncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGRpbVN0cmluZyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoKFN0cmluZylpdC5uZXh0KCksIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOworICAgICAgICAgICAgaWYgKGRpbVN0cmluZy5lcXVhbHMoIioiKSB8fCBkaW1TdHJpbmcuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigiTWFsZm9ybWVkIGludGVnZXIgaW4gU09BUCBhcnJheSBpbmRleCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIFNPQVAgMS4xIGFycmF5IHR5cGUgc3RyaW5nLgorICAgICAqCisgICAgICogU2luY2UgYW4gYXJyYXkgdHlwZSBzdHJpbmcgY29udGFpbnMgYSBRTmFtZSwgYSBwcmVmaXggcmVzb2x2ZXIKKyAgICAgKiBtdXN0IGJlIHBhc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUEFycmF5VHlwZShTdHJpbmcgcywgUHJlZml4UmVzb2x2ZXIgbSkKKyAgICB7CisgICAgICAgIGludCBmaXJzdGJyYWNlID0gcy5pbmRleE9mKCdbJyk7CisgICAgICAgIGlmIChmaXJzdGJyYWNlIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAvLyBncmFiIHRoZSBRTmFtZQorICAgICAgICBTdHJpbmcgZmlyc3RwYXJ0ID0gWG1sV2hpdGVzcGFjZS5jb2xsYXBzZShzLnN1YnN0cmluZygwLCBmaXJzdGJyYWNlKSwgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7CisgICAgICAgIGludCBmaXJzdGNvbG9uID0gZmlyc3RwYXJ0LmluZGV4T2YoJzonKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQorICAgICAgICAgICAgcHJlZml4ID0gZmlyc3RwYXJ0LnN1YnN0cmluZygwLCBmaXJzdGNvbG9uKTsKKworICAgICAgICBTdHJpbmcgdXJpID0gbS5nZXROYW1lc3BhY2VGb3JQcmVmaXgocHJlZml4KTsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbigpOworCisgICAgICAgIF90eXBlID0gUU5hbWVIZWxwZXIuZm9yTE5TKGZpcnN0cGFydC5zdWJzdHJpbmcoZmlyc3Rjb2xvbiArIDEpLCB1cmkpOworCisgICAgICAgIGluaXREaW1lbnNpb25zKHMsIGZpcnN0YnJhY2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIEVNUFRZX0lOVF9BUlJBWSA9IG5ldyBpbnRbMF07CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgU09BUCAxLjEoYWR2YW5jZWQpIGFycmF5IHR5cGUgc3RyaW5ncy4KKyAgICAgKgorICAgICAqIFNpbmNlIGluIFNPQVAgMS4xKGFkdmFuY2VkKSB0aGUgZGltZW5zaW9uIHNwZWNpZmljYXRpb24gaXMgc2VwYXJhdGVkIGZyb20gdGhlCisgICAgICogUU5hbWUgZm9yIHRoZSB1bmRlcmx5aW5nIHR5cGUsIHRoZXNlIGFyZSBwYXNzZWQgaW4gc2VwYXJhdGUKKyAgICAgKiBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIFNPQVBBcnJheVR5cGUoUU5hbWUgbmFtZSwgU3RyaW5nIGRpbWVuc2lvbnMpCisgICAgeworICAgICAgICBpbnQgZmlyc3RicmFjZSA9IGRpbWVuc2lvbnMuaW5kZXhPZignWycpOworICAgICAgICBpZiAoZmlyc3RicmFjZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF90eXBlID0gbmFtZTsKKyAgICAgICAgICAgIF9yYW5rcyA9IEVNUFRZX0lOVF9BUlJBWTsKKyAgICAgICAgICAgIGRpbWVuc2lvbnMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGRpbWVuc2lvbnMsIFhtbFdoaXRlc3BhY2UuV1NfQ09MTEFQU0UpOworICAgICAgICAgICAgU3RyaW5nW10gZGltU3RyaW5ncyA9IGRpbWVuc2lvbnMuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGltU3RyaW5ncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGltU3RyaW5nID0gZGltU3RyaW5nc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZGltU3RyaW5nLmVxdWFscygiKiIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2RpbWVuc2lvbnNbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gX2hhc0luZGV0ZXJtaW5hdGVEaW1lbnNpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kaW1lbnNpb25zW2ldID0gSW50ZWdlci5wYXJzZUludChkaW1TdHJpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF90eXBlID0gbmFtZTsKKyAgICAgICAgICAgIGluaXREaW1lbnNpb25zKGRpbWVuc2lvbnMsIGZpcnN0YnJhY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBuZXN0ZWQgU09BUEFycmF5VHlwZSBhbmQgYSBzZXQgb2YgZGltZW5zaW9ucyBmb3IgdGhlIG91dGVybW9zdAorICAgICAqIGFycmF5LCBjb21lcyB1cCB3aXRoIHRoZSByaWdodCBTT0FQQXJyYXlUeXBlIGZvciB0aGUgd2hvbGUgdGhpbmcuCisgICAgICoKKyAgICAgKiBFLmcuLAorICAgICAqIE5lc3RlZCBmb286YmFyWyxdW11bLCxdWzEsMl0KKyAgICAgKiBEaW1lbnNpb25zIFs2LDcsOF0KKyAgICAgKiBSZXN1bHQgLT4gZm9vOmJhclssXVtdWywsXVssXVs2LDcsOF0KKyAgICAgKi8KKyAgICBwdWJsaWMgU09BUEFycmF5VHlwZShTT0FQQXJyYXlUeXBlIG5lc3RlZCwgaW50W10gZGltZW5zaW9ucykKKyAgICB7CisgICAgICAgIF90eXBlID0gbmVzdGVkLl90eXBlOworCisgICAgICAgIF9yYW5rcyA9IG5ldyBpbnRbbmVzdGVkLl9yYW5rcy5sZW5ndGggKyAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfcmFua3MsIDAsIG5lc3RlZC5fcmFua3MsIDAsIG5lc3RlZC5fcmFua3MubGVuZ3RoKTsKKyAgICAgICAgX3JhbmtzW19yYW5rcy5sZW5ndGggLSAxXSA9IG5lc3RlZC5fZGltZW5zaW9ucy5sZW5ndGg7CisKKyAgICAgICAgX2RpbWVuc2lvbnMgPSBuZXcgaW50W2RpbWVuc2lvbnMubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkaW1lbnNpb25zLCAwLCBfZGltZW5zaW9ucywgMCwgZGltZW5zaW9ucy5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgZGltZW5zaW9ucyBiYXNlZCBvbiBTT0FQMTEgcGFyc2VkIGRpbWVuc2lvbiBzdWJzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdERpbWVuc2lvbnMoU3RyaW5nIHMsIGludCBmaXJzdGJyYWNlKQorICAgIHsKKyAgICAgICAgTGlzdCBicmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBsYXN0YnJhY2UgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0YnJhY2U7IGkgPj0gMDsgKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0YnJhY2UgPSBzLmluZGV4T2YoJ10nLCBpKTsKKyAgICAgICAgICAgIGlmIChsYXN0YnJhY2UgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGJyYWNlcy5hZGQocy5zdWJzdHJpbmcoaSArIDEsIGxhc3RicmFjZSkpOworICAgICAgICAgICAgaSA9IHMuaW5kZXhPZignWycsIGxhc3RicmFjZSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdHJhaWxlciA9IHMuc3Vic3RyaW5nKGxhc3RicmFjZSArIDEpOworICAgICAgICBpZiAoIVhtbFdoaXRlc3BhY2UuaXNBbGxTcGFjZSh0cmFpbGVyKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKworICAgICAgICAvLyBub3cgZmlsbCBpbiByYW5rIGFycmF5CisgICAgICAgIF9yYW5rcyA9IG5ldyBpbnRbYnJhY2VzLnNpemUoKSAtIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGNvbW1hcyA9IChTdHJpbmcpYnJhY2VzLmdldChpKTsKKyAgICAgICAgICAgIGludCBjb21tYWNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29tbWFzLmxlbmd0aCgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IGNvbW1hcy5jaGFyQXQoaik7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICcsJykKKyAgICAgICAgICAgICAgICAgICAgY29tbWFjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFYbWxXaGl0ZXNwYWNlLmlzU3BhY2UoY2gpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfcmFua3NbaV0gPSBjb21tYWNvdW50ICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmFsbHkgZmlsbCBpbiBkaW1lbnNpb24gYXJyYXkKKyAgICAgICAgX2RpbWVuc2lvbnMgPSBpbnRlcm5hbFBhcnNlQ29tbWFJbnRTdHJpbmcoKFN0cmluZylicmFjZXMuZ2V0KGJyYWNlcy5zaXplKCkgLSAxKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kaW1lbnNpb25zW2ldIDwgMCkKKyAgICAgICAgICAgICAgICBfaGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgUU5hbWUgZm9yIHRoZSByZWZlcmVuY2VkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiByYW5rcyBmb3IgaW5uZXIgbmVzdGVkIGFycmF5cy4KKyAgICAgKiBJbiBTT0FQIDEuMS1hZHZhbmNlZCwgdGhpcyBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHplcm8uCisgICAgICogSW4gU09BUCAxLjEsIHRoaXMgYXJyYXkgcmVmbGVjdHMgdGhlIHJhbmtzIG9mIG5lc3RlZAorICAgICAqIGFycmF5cy4gRm9yIGV4YW1wbGUgZm9vOmJhclssXVssLF1bXVs1LDZdIHdpbGwgcHJvZHVjZQorICAgICAqIGEgcmFua3MgcmVzdWx0IG9mIDIsIDMsIDEuCisgICAgICovCisgICAgcHVibGljIGludFtdIGdldFJhbmtzKCkKKyAgICB7CisgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbX3JhbmtzLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoX3JhbmtzLCAwLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIGRpbWVuc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGludFtdIGdldERpbWVuc2lvbnMoKQorICAgIHsKKyAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtfZGltZW5zaW9ucy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9kaW1lbnNpb25zLCAwLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBhcnJheSBjb250YWlucyBuZXN0ZWQgYXJyYXlzLiBFcXVpdmFsZW50CisgICAgICogdG8gKGdldFJhbmtzKCkubGVuZ3RoID4gMCkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNOZXN0ZWRBcnJheXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChfcmFua3MubGVuZ3RoID4gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBhcyBhIHN0cmluZywgZS5nLiwgWyxdWzIsMyw0XQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc29hcDExRGltZW5zaW9uU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzb2FwMTFEaW1lbnNpb25TdHJpbmcoX2RpbWVuc2lvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGFuIGFjdHVhbCBzZXQgb2YgZGltZW5zaW9ucyB0aGF0IG1heSBkaWZmZXIgZnJvbQorICAgICAqIHRoZSBkZWZhdWx0IHRoYXQgaXMgc3RvcmVkLCBvdXRwdXRzIHRoZSBzb2FwIGFycmF5VHlwZQorICAgICAqIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNvYXAxMURpbWVuc2lvblN0cmluZyhpbnRbXSBhY3R1YWxEaW1lbnNpb25zKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IF9yYW5rc1tpXTsgaisrKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoJ1snKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxEaW1lbnNpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBpZiAoYWN0dWFsRGltZW5zaW9uc1tpXSA+PSAwKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhY3R1YWxEaW1lbnNpb25zW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ10nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTT0FQQXJyYXlUeXBlKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU09BUCAxLjIKKyAgICAgKiBDb25zdHJ1Y3RzIGEgU09BUEFycmF5VHlwZSBmcm9tIHNvYXAtZW5jOml0ZW1UeXBlIGFuZAorICAgICAqIHNvYXAtZW5jOmFycmF5U2l6ZSBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGl0ZW1UeXBlIHRoZSBpdGVtIHR5cGUgUU5hbWUKKyAgICAgKiBAcGFyYW0gYXJyYXlTaXplIGEgc3RyaW5nIHdpdGggZGltZW50aW9ucyBsaWtlOiAqIDMgNAorICAgICAqIEByZXR1cm4gYSBTT0FQQXJyYXlUeXBlIHRvIHJlcHJlc2VudCB0aGlzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTT0FQQXJyYXlUeXBlIG5ld1NvYXAxMkFycmF5KFFOYW1lIGl0ZW1UeXBlLCBTdHJpbmcgYXJyYXlTaXplKQorICAgIHsKKyAgICAgICAgaW50IFtdIHJhbmtzID0gRU1QVFlfSU5UX0FSUkFZOworICAgICAgICBhcnJheVNpemUgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKGFycmF5U2l6ZSwgWG1sV2hpdGVzcGFjZS5XU19DT0xMQVBTRSk7CisgICAgICAgIFN0cmluZ1tdIGRpbVN0cmluZ3MgPSBhcnJheVNpemUuc3BsaXQoIiAiKTsKKyAgICAgICAgaW50W10gZGltZW5zaW9ucyA9IG5ldyBpbnRbZGltU3RyaW5ncy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbVN0cmluZ3MubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBkaW1TdHJpbmcgPSBkaW1TdHJpbmdzW2ldOworICAgICAgICAgICAgaWYgKGk9PTAgJiYgZGltU3RyaW5nLmVxdWFscygiKiIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpbWVuc2lvbnNbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICAvLyBfaGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uc1tpXSA9IEludGVnZXIucGFyc2VJbnQoZGltU3RyaW5nc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU09BUEFycmF5VHlwZSBzb3QgPSBuZXcgU09BUEFycmF5VHlwZSgpOworICAgICAgICBzb3QuX3JhbmtzID0gcmFua3M7CisgICAgICAgIHNvdC5fdHlwZSA9IGl0ZW1UeXBlOworICAgICAgICBzb3QuX2RpbWVuc2lvbnMgPSBkaW1lbnNpb25zOworICAgICAgICByZXR1cm4gc290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNPQVAgMS4yCisgICAgICogR2l2ZW4gYW4gYWN0dWFsIHNldCBvZiBkaW1lbnNpb25zIHRoYXQgbWF5IGRpZmZlciBmcm9tCisgICAgICogdGhlIGRlZmF1bHQgdGhhdCBpcyBzdG9yZWQsIG91dHB1dHMgdGhlIHNvYXAgYXJyYXlTaXplCisgICAgICogc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc29hcDEyRGltZW5zaW9uU3RyaW5nKGludFtdIGFjdHVhbERpbWVuc2lvbnMpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWxEaW1lbnNpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICBpZiAoYWN0dWFsRGltZW5zaW9uc1tpXSA+PSAwKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhY3R1YWxEaW1lbnNpb25zW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgU09BUEFycmF5VHlwZSByZWZsZWN0aW5nIHRoZSBkaW1lbnNpb25zCisgICAgICogb2YgdGhlIG5leHQgbmVzdGVkIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBTT0FQQXJyYXlUeXBlIG5lc3RlZEFycmF5VHlwZSgpCisgICAgeworICAgICAgICBpZiAoIWNvbnRhaW5zTmVzdGVkQXJyYXlzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU09BUEFycmF5VHlwZSByZXN1bHQgPSBuZXcgU09BUEFycmF5VHlwZSgpOworCisgICAgICAgIHJlc3VsdC5fdHlwZSA9IF90eXBlOworCisgICAgICAgIHJlc3VsdC5fcmFua3MgPSBuZXcgaW50W19yYW5rcy5sZW5ndGggLSAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShfcmFua3MsIDAsIHJlc3VsdC5fcmFua3MsIDAsIHJlc3VsdC5fcmFua3MubGVuZ3RoKTsKKworICAgICAgICByZXN1bHQuX2RpbWVuc2lvbnMgPSBuZXcgaW50W19yYW5rc1tfcmFua3MubGVuZ3RoIC0gMV1dOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5fZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdC5fZGltZW5zaW9uc1tpXSA9IC0xOworCisgICAgICAgIC8vIHJlc3VsdC5faGFzSW5kZXRlcm1pbmF0ZURpbWVuc2lvbnMgPSAocmVzdWx0Ll9kaW1lbnNpb25zLmxlbmd0aCA+IDApOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gKF90eXBlLmhhc2hDb2RlKCkgKyBfZGltZW5zaW9ucy5sZW5ndGggKyBfcmFua3MubGVuZ3RoICsgKF9kaW1lbnNpb25zLmxlbmd0aCA9PSAwID8gMCA6IF9kaW1lbnNpb25zWzBdKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCisgICAgeworICAgICAgICBpZiAob2JqID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoIW9iai5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTT0FQQXJyYXlUeXBlIHNhdCA9IChTT0FQQXJyYXlUeXBlKW9iajsKKworICAgICAgICBpZiAoIV90eXBlLmVxdWFscyhzYXQuX3R5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChfcmFua3MubGVuZ3RoICE9IHNhdC5fcmFua3MubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChfZGltZW5zaW9ucy5sZW5ndGggIT0gc2F0Ll9kaW1lbnNpb25zLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9yYW5rcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChfcmFua3NbaV0gIT0gc2F0Ll9yYW5rc1tpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfZGltZW5zaW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChfZGltZW5zaW9uc1tpXSAhPSBzYXQuX2RpbWVuc2lvbnNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhIGIvdjEvc3JjL3R5cGVpbXBsL29yZy9hcGFjaGUveG1sYmVhbnMvc29hcC9TY2hlbWFXU0RMQXJyYXlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2NjI0MwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlaW1wbC9vcmcvYXBhY2hlL3htbGJlYW5zL3NvYXAvU2NoZW1hV1NETEFycmF5VHlwZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuc29hcDsKKworLyoqCisgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgc2NoZW1hIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCisgKiBjYW4gYmUgY29lcmNlZCB0byB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgdmFsdWUKKyAqIG9mIHRoZSB3c2RsOmFycmF5VHlwZSBhdHRyaWJ1dGVzIG9uIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVdTRExBcnJheVR5cGUKK3sKKyAgICBTT0FQQXJyYXlUeXBlIGdldFdTRExBcnJheVR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9OYW1lc3BhY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTlmM2QKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvTmFtZXNwYWNlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlByZWZpeFJlc29sdmVyOworCitwdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZU1hbmFnZXIgZXh0ZW5kcyBQcmVmaXhSZXNvbHZlcgoreworICAgIC8qKgorICAgICAqIENhbGVkIHdoZW4gdGhlIHVzZXIgbmVlZHMgYSBwcmVmaXggYnkgd2hpY2ggdG8gcmVmZXJlbmNlIGEgZ2l2ZW4KKyAgICAgKiBYbWwgbmFtZXNwYWNlLiBBIHN1Z2dlc3RlZCBwcmVmaXggaXMgcGFzc2VkLCB3aGljaCBtYXkgYmUgbnVsbDsKKyAgICAgKiB0aGUgc3VnZ2VzdGlvbiBtYXkgYmUgaWdub3JlZC4KKyAgICAgKi8KKyAgICAKKyAgICBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApOworfQorICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxY2FiZTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlLmphdmEKQEAgLTAsMCArMSwzMzcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlZhbGlkYXRvckxpc3RlbmVyOworCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZSBleHRlbmRzIE5hbWVzcGFjZU1hbmFnZXIKK3sKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGN1cnNvciBwb3NpdGlvbmVkIGp1c3QgYmVmb3JlIHRoZSBwYXJ0IG9mIHRoZSB0cmVlCisgICAgICogd2hlcmUgdGhpcyBUeXBlU3RvcmUgaXMgbG9jYXRlZC4KKyAgICAgKi8KKyAgICBYbWxDdXJzb3IgbmV3X2N1cnNvcigpOworCisgICAgLyoqCisgICAgICovCisgICAgdm9pZCB2YWxpZGF0ZSAoIFZhbGlkYXRvckxpc3RlbmVyIHZFdmVudFNpbmsgKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2NoZW1hVHlwZUxvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHN0b3JlIGNvbnRpYW5pbmcgdGhpcworICAgICAqIFR5cGVTdG9yZS4KKyAgICAgKi8KKyAgICBTY2hlbWFUeXBlTG9hZGVyIGdldF9zY2hlbWF0eXBlbG9hZGVyICggKTsKKworICAgIC8qKgorICAgICAqIENoYW5nZSB0aGUgdHlwZSBvZiB0aGlzIHN0b3JlIChwZXJoYXBzIGJ5IGFwcGx5aW5nIHhzaTp0eXBlKSBhbmQKKyAgICAgKiByZXR1cm4gdGhlIG5ldyBUeXBlU3RvcmVVc2VyIChvciBvbGQgb25lIGlmIHRoZSBuZXcgdHlwZSBpcyBub3QKKyAgICAgKiBkaWZmZXJlbnQpLgorICAgICAqLworICAgIFR5cGVTdG9yZVVzZXIgY2hhbmdlX3R5cGUgKCBTY2hlbWFUeXBlIHNUeXBlICk7CisKKyAgICAvKioKKyAgICAgKiBUZWxscyBpZiB0aGlzIHN0b3JlIGlzIGFuIGF0dHJpYnV0ZSBvciBub3QKKyAgICAgKi8KKyAgICBib29sZWFuIGlzX2F0dHJpYnV0ZSAoICk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHhzaTp0eXBlLiAgUmV0dXJuIG51bGwgaWYgbm9uZSBvciB0aGlzIGlzIGFuIGF0dHJpYnV0ZQorICAgICAqIHN0b3JlLgorICAgICAqLworICAgIFFOYW1lIGdldF94c2lfdHlwZSAoICk7CisKKyAgICAvKioKKyAgICAgKiBBIHVzZXIgb2YgYSBUeXBlU3RvcmUgY2FsbHMgaW52YWxpZGF0ZV90ZXh0IHdoZW4gdGhlIHVuZGVybHlpbmcKKyAgICAgKiB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgaGUgd2FudHMgdGhlIHRleHRzdG9yZSB0byBjYWxsIGhpbSBiYWNrIHdpdGgKKyAgICAgKiBhIGZldGNoX3RleHQgKFR5cGVTdG9yZS9UeXBlU3RvcmVVc2VycyB3b3JrIGluIHBhaXJzKS4KKyAgICAgKi8KKyAgICB2b2lkIGludmFsaWRhdGVfdGV4dCgpOworCisgICAgLyoqCisgICAgICogQSB1c2VyIG9mIGEgVHlwZVN0b3JlIGNhbGxzIGZldGNoX3RleHQgd2hlbiBoZSBrbm93cyBoaXMgdmlldworICAgICAqIG9mIHRoZSB0ZXh0IGlzIGludmFsaWQgYW5kIGhlIHdhbnRzIHRvIHNlZSB3aGF0IHRoZSBhY3R1YWwgdGV4dAorICAgICAqIHZhbHVlIGlzLgorICAgICAqLworICAgIC8vIEJVR0JVRyAoZXJpY3ZhcykgMTIxMTEKKyAgICBTdHJpbmcgZmV0Y2hfdGV4dChpbnQgd2hpdGVzcGFjZVJ1bGUpOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgV1NfVU5TUEVDSUZJRUQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW50IFdTX1BSRVNFUlZFID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGludCBXU19SRVBMQUNFID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGludCBXU19DT0xMQVBTRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBIHVzZXIgb2YgYSBUeXBlU3RvcmUgY2FsbHMgc3RvcmVfdGV4dCB3aGVuIGhlIHdhbnRzIHRoZSBUeXBlU3RvcmUKKyAgICAgKiB0byByZW1lbWJlciB0aGUgZ2l2ZW4gdGV4dCBpbW1lZGlhdGVseS4gVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuCisgICAgICogdGhlIHVzZXIgaGFzIGEgbm9uY2Fub25pY2FsIChidXQgdmFsaWQpIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBzYXZlLAorICAgICAqIGJ1dCBkb2Vzbid0IGhhdmUgdGhlIHN0b3JhZ2UgaW4gd2hpY2ggdG8gc2F2ZSBpdC4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3JlX3RleHQoU3RyaW5nIHRleHQpOworCisgICAgLyoqCisgICAgICogSGVyZSB0aGUgVHlwZVN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NhdGluZyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBUaGlzIGlzIGRvbmUgYXMgZm9sbG93cworICAgICAqICgxKSBnbyB0byB0aGUgcGFyZW50IFR5cGVTdG9yZVVzZXIKKyAgICAgKiAoMikgYXNrIGl0IHRvIGdldF9kZWZhdWx0X2VsZW1lbnRfdGV4dChxbmFtZSkgKG9yIF9hdHRyaWJ1dGVfKSwgYW5kIHJldHVybiBpdCBpZiBub3QgbnVsbC4KKyAgICAgKiAoMikgb3RoZXJ3aXNlLCBncmFiIGEgbmV3IFR5cGVTdG9yZVVzZXJWaXNpdG9yIHZpYSB2ID0gcGFyZW50dXNlci5uZXdfdmlzaXRvcigpOworICAgICAqICgzKSBjYWxsIHYudmlzaXQobmFtZSkgb24gX2V2ZXJ5XyBlbGVtZW50IHFuYW1lIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBvbmUgaW4gb3JkZXIKKyAgICAgKiAoNCkgcmV0dXJuIHRoZSByZXN1bHQgb2Ygdi5nZXRfZGVmYXVsdF90ZXh0KCkuCisgICAgICovCisgICAgU3RyaW5nIGNvbXB1dGVfZGVmYXVsdF90ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBIZXJlIHRoZSBUeXBlU3RvcmUgaXMgcmVzcG9uc2libGUgZm9yIGZpZ3VyaW5nIGlmIHRoaXMgdmFsdWUgaXMKKyAgICAgKiBuaWxsYWJsZSBhbmQvb3IgZml4ZWQuIFRoaXMgaXMgZG9uZSBieQorICAgICAqICgxKSBnbyB0byB0aGUgcGFyZW50IFR5cGVTdG9yZVVzZXIKKyAgICAgKiAoMikgYXNrIGl0IHRvIGdldF9lbGVtZW50ZmxhZ3MocW5hbWUpLCBhbmQgcmV0dXJuIGl0IGlmIG5vdCAtMS4KKyAgICAgKiAoMikgb3RoZXJ3aXNlLCBncmFiIGEgbmV3IFR5cGVTdG9yZVVzZXJWaXNpdG9yIHZpYSB2ID0gcGFyZW50dXNlci5uZXdfdmlzaXRvcigpOworICAgICAqICgzKSBjYWxsIHYudmlzaXQobmFtZSkgb24gX2V2ZXJ5XyBlbGVtZW50IHFuYW1lIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBvbmUgaW4gb3JkZXIKKyAgICAgKiAoNCkgcmV0dXJuIHRoZSByZXN1bHQgb2Ygdi5nZXRfZWxlbWVudGZsYWdzKCkuCisgICAgICovCisgICAgaW50IGNvbXB1dGVfZmxhZ3MoKTsKKworCisgICAgLyoqCisgICAgICogVGVsbHMgaWYgdGhpcyBzdG9yZSB3YXMgY3JlYXRlZCB3aXRoIHRoaXMgb3B0aW9uIHdoaWNoIHRlbGxzIHRoZSBzdHJvbmdseSB0eXBlZAorICAgICAqIG9iamVjdHMgdG8gcGVyZm9ybSBsZXhpY2FsIGFuZCB2YWx1ZSB2YWxpZGF0aW9uIGFmdGVyIGEgc2V0dGVyIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHZhbGlkYXRlX29uX3NldCgpOworCisgICAgLyoqCisgICAgICogSGVyZSB0aGUgdHlwZXN0b3JlIGlzIHJlc3Bvc2libGUgZm9yIGZpbmRpbmcgdGhlIHNjaGVtYSBmaWVsZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdC4gVGhpcyBpcyBkb25lIGJ5CisgICAgICogKDEpIG90aGVyd2lzZSwgZ3JhYiBhIG5ldyBUeXBlU3RvcmVVc2VyVmlzaXRvciB2aWEgdiA9IHBhcmVudHVzZXIubmV3X3Zpc2l0b3IoKTsKKyAgICAgKiAoMikgY2FsbCB2LnZpc2l0KG5hbWUpIG9uIF9ldmVyeV8gZWxlbWVudCBxbmFtZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgb25lIGluIG9yZGVyCisgICAgICogKDMpIHJldHVybiB0aGUgcmVzdWx0IG9mIHYuZ2V0X3NjaGVtYV9maWVsZCgpLgorICAgICAqLworICAgIFNjaGVtYUZpZWxkIGdldF9zY2hlbWFfZmllbGQoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5JTExBQkxFID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQVNERUZBVUxUID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCA9IDQ7IC8vIGFsd2F5cyBzZXQgd2l0aCBIQVNERUZBVUxUCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGFzIGJlZW4gbmlsbGVkIG9yIHVubmlsbGVkLCBzbyB0aGUgdGV4dHN0b3JlCisgICAgICoga25vd3MgaXQgbmVlZHMgdG8gdXBkYXRlIHRoZSB4c2k6bmlsIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGludmFsaWRhdGVfbmlsKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVHlwZVN0b3JlIGlzIHJlcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGlmIHRoaXMgdmFsdWUgaXMgbmlsLgorICAgICAqIFRoaXMgaXMgZG9uZSBieSAoMSkgZ29pbmcgdG8gdGhlIGVsZW1lbnQgYW5kICgyKSBmaW5kaW5nIHRoZQorICAgICAqIHhzaTpuaWwgYXR0cmlidXRlIGlmIHByZXNlbnQgYW5kICgzKSByZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGFwc2VkCisgICAgICogdGV4dHVhbCB2YWx1ZSBpcyBlaXRoZXIgZXhhY3RseSB0aGUgc3RyaW5nICJ0cnVlIiBvciAiMSIuCisgICAgICovCisgICAgYm9vbGVhbiBmaW5kX25pbCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvd25lZCBieSB0aGlzCisgICAgICogdGV4dHN0b3JlLgorICAgICAqLworICAgIGludCBjb3VudF9lbGVtZW50cyhRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHRoYXQgbWF0Y2ggb2YgdGhlIG5hbWVzLgorICAgICAqLworICAgIGludCBjb3VudF9lbGVtZW50cyhRTmFtZVNldCBuYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBUeXBlU3RvcmVVc2VyIHVuZGVybmVhdGggdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuCisgICAgICogbmFtZSBvd25lZCBieSB0aGlzIHRleHRzdG9yZSwgb3IgbnVsbCBpZiBub25lIHdhcyBmb3VuZC4KKyAgICAgKgorICAgICAqIERvIG5vdCB0aHJvdyBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGkgaXMgYmFkIC0KKyAgICAgKiByZXR1cm4gbnVsbCBpbnN0ZWFkLiBUaGUgcmVhc29uIGlzIHRvIGFsbG93IHVzIHRvIGZhaWwKKyAgICAgKiBhbmQgdGhlbiBmb2xsb3cgd2l0aCBhbiBhZGRfZWxlbWVudF9ldGMgaWYgd2UgY2hvb3NlIHRvLAorICAgICAqIHdpdGhvdXQgcmFuZG9tbHkgY2F0Y2hpbmcgZXhjZXB0aW9ucy4KKyAgICAgKi8KKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2VsZW1lbnQKKyAgICBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyKFFOYW1lIG5hbWUsIGludCBpKTsKKworICAgIC8qKgorICAgICAqIExpa2UgZmluZF9lbGVtZW50X3VzZXIgYnV0IGFjY2VwdHMgYSBzZXQgb2YgbmFtZXMgdG8gc2VhcmNoIGZvci4KKyAgICAgKi8KKyAgICBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyKFFOYW1lU2V0IG5hbWVzLCBpbnQgaSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCB0aGUgVHlwZVN0b3JlVXNlcnMgY29ycmVzcG9uZGluZyB0byBlbGVtZW50cyB3aXRoIHRoZQorICAgICAqIGdpdmVuIG5hbWUgb3duZWQgYnkgdGhpcyB0eXBlc3RvcmUsIG9yIHRoZSBlbXB0eSBhcnJheSBvZgorICAgICAqIFR5cGVTdG9yZVVzZXJzIGlmIG5vbmUgd2FzIGZvdW5kLgorICAgICAqLworLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2FsbF9lbGVtZW50CisvLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hbGxfZWxlbWVudAorLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYWxsX2VsZW1lbnQKKyAgICB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMoUU5hbWUgbmFtZSwgTGlzdCBmaWxsTWVVcCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIFR5cGVTdG9yZVVzZXJzIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMgd2l0aCBvbmUKKyAgICAgKiBvZiB0aGUgbmFtZXMgaXMgdGhlIFFOYW1lU2V0LgorICAgICAqLworICAgIHZvaWQgZmluZF9hbGxfZWxlbWVudF91c2VycyhRTmFtZVNldCBuYW1lLCBMaXN0IGZpbGxNZVVwKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgcG9zaXRpb24gdGhhdCB3aWxsIG1ha2UgaXQKKyAgICAgKiB0aGUgaXRoIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvd25lZCBieSB0aGlzIHRleHRzdG9yZSwKKyAgICAgKiBhbmQgcmV0dXJucyBhIFR5cGVTdG9yZVVzZXIgZm9yIHRoYXQgZWxlbWVudC4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgZWxlbWVudHMgb2YgdGhlIGdpdmVuCisgICAgICogbmFtZSwgeW91IG1heSBuZWVkIHRvIGNhbGwgYmFjayB0byBkaXNjb3ZlciB0aGUgcHJvcGVyCisgICAgICogb3JkZXJpbmcgdG8gdXNlIHRvIGluc2VydCB0aGUgZmlyc3Qgb25lLiBPdGhlcndpc2UsCisgICAgICogaXQgc2hvdWxkIGJlIGluc2VydGVkIGFkamFjZW50IHRvIGV4aXN0aW5nIGVsZW1lbnRzIHdpdGgKKyAgICAgKiB0aGUgc2FtZSBuYW1lLgorICAgICAqCisgICAgICogU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgaSA8IDAKKyAgICAgKiBvciBpZiBpID4gIyBvZiBlbHRzCisgICAgICovCisKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNlcnRfZWxlbWVudAorLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2VydF9lbGVtZW50CisvLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgaW5zZXJ0X2VsZW1lbnQKKyAgICBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoUU5hbWUgbmFtZSwgaW50IGkpOworCisgICAgLyoqCisgICAgICogTGlrZSB0aGUgYWJvdmUgbWV0aG9kLCBleGNlcHQgdGhhdCBpdCBpbnNlcnRzIGFuIGVsZW1lbnQgbmFtZWQKKyAgICAgKiBuYW1lLCBhZnRlciB0aGUgaXRoIG1lbWJlciBvZiBzZXQuCisgICAgICovCisgICAgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyKFFOYW1lU2V0IHNldCwgUU5hbWUgbmFtZSwgaW50IGkpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBlbGVtZW50IGF0IHRoZSBsYXN0IHBvc2l0aW9uIGFkamFjZW50IHRvIGV4aXN0aW5nCisgICAgICogZWxlbWVudHMgb2YgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgZWxlbWVudHMgb2YgdGhlIGdpdmVuCisgICAgICogbmFtZSwgdGhlIHNhbWUgY29tbWVudCBhcHBsaWVzIGFzIHdpdGggaW5zZXJ0X2VsZW1lbnRfdXNlci4KKyAgICAgKi8KKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAorLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9lbGVtZW50CisvLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2VsZW1lbnQKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfZWxlbWVudAorICAgIFR5cGVTdG9yZVVzZXIgYWRkX2VsZW1lbnRfdXNlcihRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGl0aCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICoKKyAgICAgKiBTaG91bGQgdGhyb3cgYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBpIDwgMAorICAgICAqIG9yIGlmIGkgPiAjIG9mIGVsdHMtMS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lIG5hbWUsIGludCBpKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGl0aCBlbGVtZW50IHRoYXQgbWF0Y2hlcyBuYW1lcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lU2V0IG5hbWVzLCBpbnQgaSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFR5cGVTdG9yZVVzZXIgdW5kZXJuZWF0aCB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuCisgICAgICogbmFtZSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGF0dHJpYnV0ZS4KKyAgICAgKi8KKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQorLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGZpbmRfYXR0cmlidXRlCisvLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgZmluZF9hdHRyaWJ1dGUKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaW5kX2F0dHJpYnV0ZQorICAgIFR5cGVTdG9yZVVzZXIgZmluZF9hdHRyaWJ1dGVfdXNlcihRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHJldHVybnMgYSBUeXBlU3RvcmVVc2VyCisgICAgICogdW5kZXJuZWF0aCBpdC4gU2hvdWxkIHRocm93IGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlcmUKKyAgICAgKiBpcyBhbHJlYWR5IGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqLworLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKKy8vIEJVR0JVRyAtIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZGRfYXR0cmlidXRlCisvLyBCVUdCVUcgLSB0aGlzIHNob3VsZCBiZSBjYWxsZWQgYWRkX2F0dHJpYnV0ZQorLy8gQlVHQlVHIC0gdGhpcyBzaG91bGQgYmUgY2FsbGVkIGFkZF9hdHRyaWJ1dGUKKyAgICBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlcihRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlX2F0dHJpYnV0ZShRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFR5cGVTdG9yZSAoaW5jbHVkaW5nIGF0dHJpYnV0ZXMsCisgICAgICogZWxlbWVudHMsIGFuZCBtaXhlZCBjb250ZW50KSwgdG8gdGhlIHRhcmdldCB0eXBlIHN0b3JlLgorICAgICAqCisgICAgICogU1BFQ0lBTCBOT1RFOiBUaGUgeHNpOnR5cGUgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tCisgICAgICogdGhlIHRhcmdldCBvciBjb3BpZWQgZnJvbSB0aGUgc29ydWNlLCBhbmQgdGhlIFR5cGVTdG9yZVVzZXIgYXR0YWNoZWQKKyAgICAgKiB0byB0aGlzIFR5cGVTdG9yZSBzaG91bGQgbm90IGJlIGRpc2Nvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyBvYmouc2V0KGZvbykuCisgICAgICovCisgICAgVHlwZVN0b3JlVXNlciBjb3B5X2NvbnRlbnRzX2Zyb20oVHlwZVN0b3JlIHNvdXJjZSk7CisgICAgCisvLyBCVUdCVUcgLSBOZWVkIHRvIHVzZSB0aGlzIGluIHRoZSBmdXR1cmUKKy8vICAgIC8qKgorLy8gICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gVHlwZVN0b3JlIChpbmNsdWRpbmcgYXR0cmlidXRlcywKKy8vICAgICAqIGVsZW1ldHMsIG1peGVkIGNvbnRlbnQpLCB0byB0aGUgY2hpbGQgZWxlbWVudCBnaXZlbiBieSB0aGUgZ2l2ZW4KKy8vICAgICAqIG5hbWUgYW5kIGluZGV4LiBBbnkgVHlwZVN0b3JlVXNlciB0aGF0IG1pZ2h0IGJlIGN1cnJlbnRseSBhdHRhY2hlZAorLy8gICAgICogdG8gdGhhdCBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZC4gIFRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUgb2YgdGhlCisvLyAgICAgKiBlbGVtZW50IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBRTmFtZSAob3IgZGVsZXRlZCBpZgorLy8gICAgICogdGhlIHhzaXR5cGUgYXJndW1lbnQgaXMgbnVsbCkKKy8vICAgICAqLworLy8gICAgdm9pZCBjb3B5X3RvX2VsZW1lbnQoCisvLyAgICAgICAgVHlwZVN0b3JlIHNvdXJjZSwgUU5hbWUgeHNpdHlwZSwgUU5hbWUgbmFtZSwgaW50IGkpOworCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gYXJyYXkgb2YgWG1sT2JqZWN0IChpbmNsdWRpbmcKKyAgICAgKiBhdHRyaWJ1dGVzLCBlbGVtZW50cywgbWl4ZWQgY29udGVudCksIG92ZXIgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUKKyAgICAgKiBnaXZlbiBuYW1lIHVuZGVyIHRoZSBjdXJyZW50IHR5cGVzdG9yZS4KKyAgICAgKgorICAgICAqIFRoZSBsZW5ndGhzIG9mIHRoZSB0d28gYXJyYXlzIHRoYXQgYXJlIHBhc3NlZCBzaG91bGQgYmUgdGhlIHNhbWUuCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgbiBjdXJyZW50IGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBuYW1lIGFuZCBtIGVsZW1lbnRzCisgICAgICogaW4gdGhlIHNvdXJjZSBhcnJheSwgdGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgZm9yIGluZGl2aWR1YWwgZWxlbWVudHM6CisgICAgICoKKyAgICAgKiAxLiBJZiBpIDwgbiBhbmQgaSA8IG0sIHRoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBpdGggc291cmNlIGFyZSBjb3BpZWQKKyAgICAgKiAgICB1bmRlcm5lYXRoIHRoZSBpdGggZWxlbWVudDsgdGhlIGl0aCBlbGVtZW50IGlzIG5vdCBtb3ZlZCwgYnV0IGl0cworICAgICAqICAgIFR5cGVTdG9yZVVzZXIgaXMgZGlzY29ubmVjdGVkLgorICAgICAqIDIuIGlmIGkgPj0gbiBhbmQgaSA8IG0sIHRoZW4gZmlyc3QgZW5vdWdoIG5ldyBlbGVtZW50cyBhcmUgYXBwZW5kZWQKKyAgICAgKiAgICBzbyB0aGF0IHRoZXJlIGlzIGFuIGVsZW1lbnQgd2l0aCB0aGUgbmFtZSBpLCB0aGVuIHJ1bGUgIzEgaXMgZm9sbG93ZWQuCisgICAgICogMy4gaWYgaSA+PSBtIGFuZCBpIDwgbiwgdGhlbiB0aGUgZWxlbWVudCAjaSBhbmQgYWxsIGl0cyBjb250ZW50cworICAgICAqICAgIGFyZSByZW1vdmVkLgorICAgICAqLworICAgIAorICAgIHZvaWQgYXJyYXlfc2V0dGVyICggWG1sT2JqZWN0W10gc291cmNlcywgUU5hbWUgZWxlbWVudE5hbWUgKTsKKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbGwgdGhlIGVsZW1lbnRzIGltbWVkaWF0ZWx5LCB1c2luZyB0aGUgZ2l2ZW4gdmlzaXRvci4KKyAgICAgKiBBIFR5cGVTdG9yZVVzZXIgY2FsbHMgdGhpcyB3aGVuIHNvbWVib2R5IGhhcyByZXF1ZXN0ZWQgdmFsaWRhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0X2VsZW1lbnRzKFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvcik7CisKKyAgICBYbWxPYmplY3RbXSBleGVjX3F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1vbml0b3Igb2JqZWN0LCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZG9jLgorICAgICAqLyAKKyAgICBPYmplY3QgZ2V0X3Jvb3Rfb2JqZWN0KCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlRmFjdG9yeS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E3ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogVGhpcyBnaXZlcyB0aGUgbm9uIGRlZmF1bHQgYmluZGluZ3MgdG8gdGFrZSBjb250cm9sIG9mIFR5cGVTdG9yZVVzZXIKKyAqIGNyZWF0aW9uLiBJdCBpcyBzZXQgb25jZSBwZXIgZG9jdW1lbnQgYW5kIGNhbGxlZCBlYWNoIHRpbWUgaW5zdGVhZCBvZgorICogVHlwZVN0b3JlVXNlci5jcmVhdGVFbGVtZW50VXNlcigpIGFuZCBjcmVhdGVBdHRyaWJ1dGVVc2VyKCkKKyAqLworcHVibGljIGludGVyZmFjZSBUeXBlU3RvcmVGYWN0b3J5Cit7CisgICAgLyoqIEEga2V5IHRvIHBhc3MgaW4gZm9yIHRoZSBYbWxPcHRpb25zIHRvIHNldCB0aGUgZmFjdG9yeSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJUeXBlU3RvcmVGYWN0b3J5IjsKKworICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlRWxlbWVudFVzZXIoU2NoZW1hVHlwZSBwYXJlbnRUeXBlLCBRTmFtZSBuYW1lLCBRTmFtZSB4c2lUeXBlKTsKKworICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlQXR0cmlidXRlVXNlcihTY2hlbWFUeXBlIHBhcmVudFR5cGUsIFFOYW1lIG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXIuamF2YSBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyODRiNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgc3Ryb25nbHktdHlwZWQgdXNlciBvZiBhIHR5cGVzdG9yZS4KKyAqIEEgdHlwZXN0b3JlIGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgdGhlIGxleGljYWwgYXNwZWN0cyBvZiBYTUwsIGFuZAorICogYSB0eXBlc3RvcmUgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsIHN0cm9uZ2x5LXR5cGVkIGFzcGVjdHMuCisgKiBXaGVyZSB0aGVyZSBpcyBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSB0d28gbW9kZWxzLCBpdCBpcyByZXByZXNlbnRlZAorICogYnkgdGhlIFR5cGVTdG9yZSBhbmQgVHlwZVN0b3JlVXNlciBpbnRlcmZhY2VzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVVzZXIKK3sKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gYXR0YWNoIHRvIHRoZSBnaXZlbiB0ZXh0U3RvcmUuIFdoZW4gYSBUeXBlU3RvcmVVc2VyIGlzCisgICAgICogYXR0YWNoZWQsIGl0IGlzIHB1dCBpbnRvIGEgY29tcGxldGVseSBpbnZhbGlkYXRlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGF0dGFjaF9zdG9yZShUeXBlU3RvcmUgc3RvcmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2NoZW1hIHR5cGUgb2YgdGhpcyB1c2VyCisgICAgICovCisgICAgU2NoZW1hVHlwZSBnZXRfc2NoZW1hX3R5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0b3JlIHRvIHdoaWNoIHRoaXMgdHlwZXN0b3JldXNlciBpcyBhdHRhY2hlZCwgb3IKKyAgICAgKiBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgVHlwZVN0b3JlIGdldF9zdG9yZSgpOworCisgICAgLyoqCisgICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBpbnZhbGlkYXRlX3ZhbHVlIHdoZW4gaXRzIHRleHQgaGFzCisgICAgICogY2hhbmdlZCBhbmQgaXQgdGhlcmVmb3JlIGtub3dzIHRoYXQgYW55IGNhY2hlZCB0eXBlIHZhbHVlIGlzCisgICAgICogaW52YWxpZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsdHkgb2YgdGhlIHR5cGUgdG8gY2FsbCBmZXRjaF90ZXh0CisgICAgICogYW5kIHJlcGFyc2UgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSBzdHJvbmdseS10eXBlZCBnZXQuCisgICAgICovCisgICAgdm9pZCBpbnZhbGlkYXRlX3ZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHN0b3JlIGNhbiBjYWxsIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSB0byBrbm93IGlmIGNhbGxzIHRvCisgICAgICogaW52YWxpZGF0ZV92YWx1ZSB3aWxsIGJlIGZydWl0ZnVsLiAgSWYgdXNlc19pbnZhbGlkYXRlX3ZhbHVlCisgICAgICogcmV0dXJucyBmYWxzZSwgaW52YWxpZGF0ZV92YWx1ZSBuZWVkIG5ldmVyIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOworCisgICAgLyoqCisgICAgICogQSBzdG9yZSB3aWxsIGNhbGwgYmFjayBvbiBidWlsZF90ZXh0IHdoZW4gaXQga25vd3MgaXRzIG93biB0ZXh0CisgICAgICogaXMgaW52YWxpZCBhbmQgbmVlZHMgdG8gZmlsbCBpdCBpbi4gIElmIGZvckV4dGVybmFsIGlzIHRydWUsIHRoZW4KKyAgICAgKiB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSB1c2VkIHRvIHJlcGxlbmlzaCB0aGUgc3RvcmUncyBjYWNoZSBvZgorICAgICAqIHRoZSB2YWx1ZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIGlzIGJlaW5nIGNvbXB1dGVkIGZvciBwdXJwb3NlcworICAgICAqIG90aGVyIHRoYW4gdmFsaWRhdGlvbiwgbGlrZSBwZXJzaXN0ZW5jZS4KKyAgICAgKgorICAgICAqIEFsc28sIHRoZSBvbmx5IG1lbWJlciBvbiBUeXBlU3RvcmUgd2hpY2ggbWF5IGJlIGNhbGxlZCB3aGlsZSBidWlsZF90ZXh0CisgICAgICogaXMgb24gdGhlIHN0YWNrIGlzIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSB3aGljaCBtdXN0IGhhdmUgdGhlCisgICAgICogZm9yRXh0ZXJuYWwgc3RhdGUgcGFzc2VkIHRvIGl0IGFzIGl0IGlzIHBhc3NlZCBoZXJlLgorICAgICAqLworICAgIFN0cmluZyBidWlsZF90ZXh0KE5hbWVzcGFjZU1hbmFnZXIgbnNtKTsKKworICAgIC8qKgorICAgICAqIEEgc3RvcmUgd2lsbCBjYWxsIGJhY2sgb24gYnVpbGRfbmlsIGFmdGVyIHlvdSd2ZSBjYWxsZWQgaW52YWxpZGF0ZV9uaWwKKyAgICAgKiBhbmQgaXQgbmVlZHMgdG8ga25vdyB3aGF0IHRoZSBuaWwgdmFsdWUgaXMuCisgICAgICovCisgICAgYm9vbGVhbiBidWlsZF9uaWwoKTsKKworICAgIC8qKgorICAgICAqIEEgc3RvcmUgY2FsbHMgYmFjayBvbiBpbnZhbGlkYXRlX25pbHZhbHVlIHdoZW4gdGhlIHZhbHVlIG9mCisgICAgICogdGhlIHhzaTpuaWwgdGFnIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHZvaWQgaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOworCisgICAgLyoqCisgICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIGludmFsaWRhdGVfZWxlbWVudF9vcmRlciB3aGVuIGEgcmVhcnJhbmdtZW50CisgICAgICogb2Ygc2libGluZyBlbGVtZW50cyB0byB0aGUgbGVmdCBvZiB0aGlzIGVsZW1lbnQgbWVhbnMgdGhhdCB0aGUKKyAgICAgKiBuaWxsYWJsZSB2YWx1ZSBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkLgorICAgICAqLworICAgIHZvaWQgaW52YWxpZGF0ZV9lbGVtZW50X29yZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHN0b3JlIHdpbGwgY2FsbCBiYWNrIG9uIHZhbGlkYXRlX25vdyB0byBmb3JjZSB1cyB0byBsb29rIGF0CisgICAgICogdGhlIHRleHQgaWYgd2UncmUgaW4gYW4gaW52YWxpZCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiBpcyBhbGxvd2VkCisgICAgICogYW5kIGV4cGVjdGVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdGV4dCBpc24ndCB2YWxpZCBmb3IKKyAgICAgKiBvdXIgdHlwZS4KKyAgICAgKi8KKyAgICB2b2lkIHZhbGlkYXRlX25vdygpOworCisgICAgLyoqCisgICAgICogQSBzdG9yZSBjYWxscyBiYWNrIG9uIHRoaXMgY2FsbCBpbiBvcmRlciB0byBmb3JjZSBhIGRpc2Nvbm5lY3QuCisgICAgICogQWZ0ZXIgdGhpcyBpcyBkb25lLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludmFsaWQuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0X3N0b3JlKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKKyAgICAgKiBhIGdpdmVuIGVsZW1lbnQgY2hpbGQgbmFtZSBhcyBsb25nIGFzIHlvdSBhbHNvIHBhc3MgdGhlCisgICAgICogcW5hbWUgY29udGFpbmVkIGJ5IHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIGlmIGFueS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIGlnbm9yZSB0aGUgeHNpVHlwZSBpZiBpdCB0dXJucyBvdXQgdG8gYmUgaW52YWxpZC4KKyAgICAgKi8KKyAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZV9lbGVtZW50X3VzZXIoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiBjcmVhdGUgYSBuZXcgVHlwZVN0b3JlVXNlciBpbnN0YW5jZSBmb3IKKyAgICAgKiBhIGdpdmVuIGF0dHJpYnV0ZSBjaGlsZCwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqLworICAgIFR5cGVTdG9yZVVzZXIgY3JlYXRlX2F0dHJpYnV0ZV91c2VyKFFOYW1lIGF0dHJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBuYW1lIGFuZCB4c2k6dHlwZQorICAgICAqIHdvdWxkIGJlLgorICAgICAqLworCisgICAgU2NoZW1hVHlwZSBnZXRfZWxlbWVudF90eXBlKFFOYW1lIGVsdE5hbWUsIFFOYW1lIHhzaVR5cGUpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2NoZW1hVHlwZSB3aGljaCBhbiBhdHRyaWJ1dGUgb2YgdGhpcyBuYW1lIHdvdWxkIGJlLgorICAgICAqLworCisgICAgU2NoZW1hVHlwZSBnZXRfYXR0cmlidXRlX3R5cGUoUU5hbWUgYXR0ck5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlbGVtZW50IHRleHQsIGlmIGl0J3MgY29uc2lzdGVudC4gSWYgaXQncworICAgICAqIG5vdCBjb25zaXN0ZW50LCByZXR1cm5zIG51bGwsIGFuZCByZXF1aXJlcyBhIHZpc2l0b3Igd2Fsay4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KFFOYW1lIGVsdE5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGF0dHJpYnV0ZSB3aXRoCisgICAgICogdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgU3RyaW5nIGdldF9kZWZhdWx0X2F0dHJpYnV0ZV90ZXh0KFFOYW1lIGF0dHJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRmbGFncywgaWYgdGhleSdyZSBjb25zaXN0ZW50LiBJZiB0aGV5J3JlCisgICAgICogbm90LCByZXR1cm5zIC0xLCBhbmQgcmVxdWlyZXMgYSB2aXN0b3Igd2Fsay4KKyAgICAgKi8KKyAgICBpbnQgZ2V0X2VsZW1lbnRmbGFncyhRTmFtZSBlbHROYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZsYWdzIGZvciBhbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGdldF9hdHRyaWJ1dGVmbGFncyhRTmFtZSBhdHRyTmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIGFuIGF0dHJpYnV0ZQorICAgICAqLworICAgIFNjaGVtYUZpZWxkIGdldF9hdHRyaWJ1dGVfZmllbGQoUU5hbWUgYXR0ck5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBjaGlsZCBlbGVtZW50cyBhcmUgaW5zZW5zaXRpdmUgdG8gb3JkZXI7CisgICAgICogaWYgaXQgcmV0dXJucyB0cnVlLCB5b3UncmUgcmVxdWlyZWQgdG8gY2FsbCBpbnZhbGlkYXRlX2VsZW1lbnRfb3JkZXIKKyAgICAgKiBvbiBjaGlsZHJlbiB0byB0aGUgcmlnaHQgb2YgYW55IGNoaWxkIG9yZGVyIHJlYXJyYW5nZW1lbnQuCisgICAgICovCisgICAgYm9vbGVhbiBpc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpOworCisgICAgLyoqCisgICAgICogQSB0eXBlc3RvcmUgdXNlciBjYW4gcmV0dXJuIHRoZSBlbGVtZW50IHNvcnQgb3JkZXIgdG8gdXNlIGZvcgorICAgICAqIGluc2VydGlvbiBvcGVyYXRpb25zIGlmIG5lZWRlZC4gU2V0dGFibGUgZWxlbWVudHMgc2hvdWxkCisgICAgICogYmUgc3RvcmVkIGluIHRoaXMgb3JkZXIgaWYgcG9zc2libGUuCisgICAgICovCisgICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoUU5hbWUgZWx0bmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBIHR5cGVzdG9yZSB1c2VyIGNhbiByZXR1cm4gYSB2aXNpdG9yIHRoYXQgaXMgdXNlZCB0byBjb21wdXRlCisgICAgICogZGVmYXVsdCB0ZXh0IGFuZCBlbGVtZW50ZmxhZ3MgZm9yIGFuIGFyYml0cmFyeSBlbGVtZW50LgorICAgICAqLworICAgIFR5cGVTdG9yZVZpc2l0b3IgbmV3X3Zpc2l0b3IoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1R5cGVTdG9yZVVzZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NTgyMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVVc2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKKy8qKgorICogRXZlcnkgU2NoZW1hVHlwZUxvYWRlciBpcyBhY3R1YWxseSBhIFR5cGVTdG9yZVVzZXJGYWN0b3J5LgorICoKKyAqIFRvIGdldCBhbmQgdXNlIHRoZSBkZWZhdWx0IFR5cGVTdG9yZVVzZXJGYWN0b3J5LCBkbyB0aGUgZm9sbG93aW5nOgorICoKKyAqIFR5cGVTdG9yZVVzZXIgdXNlciA9ICgoVHlwZVN0b3JlVXNlckZhY3RvcnkpU2NoZW1hVHlwZUxvYWRlci5nbG9iYWwoKSkuY3JlYXRlVHlwZVN0b3JlVXNlcihzdG9yZSk7CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVHlwZVN0b3JlVXNlckZhY3RvcnkKK3sKKyAgICBUeXBlU3RvcmVVc2VyIGNyZWF0ZVR5cGVTdG9yZVVzZXIoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy90eXBlc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3ZhbHVlcy9UeXBlU3RvcmVWaXNpdG9yLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGI3YmEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvVHlwZVN0b3JlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hRmllbGQ7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgVHlwZVN0b3JlIHRvIHZpc2l0IGV2ZXJ5IGVsZW1lbnQgaW4gb3JkZXIKKyAqIHRvIGNvbXB1dGUgbmlsbGFibGUgZmxhZ3MgYW5kIGRlZmF1bHQgdmFsdWVzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVTdG9yZVZpc2l0b3IKK3sKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIGEgdmlzaXRvciwgeW91IG11c3QgY2FsbCAidmlzaXQiIG9uIGV2ZXJ5IHFuYW1lIG9mCisgICAgICogZXZlcnkgZWxlbWVudCBpbiBvcmRlciB1cCB0byB0aGUgb25lIHlvdSdyZSBpbnRlcmVzdGVkIGluLgorICAgICAqCisgICAgICogSWYgeW91J3JlIHVzaW5nIGl0IGZvciB2YWxpZGF0aW9uLCBjYWxsIHZpc2l0KG51bGwpIGF0IHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGRyZW4uIElmIHlvdSdyZSBub3QgdmFsaWRhdGluZywgeW91IGNhbgorICAgICAqIGp1c3Qgd2FsayBhd2F5IG9uY2UgeW91IGdldCB0aGUgaW5mbyB5b3UgbmVlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHZpc2l0KFFOYW1lIGVsdE5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudGZsYWdzIGZvciB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgaW50IGdldF9lbGVtZW50ZmxhZ3MoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhpcyBlbGVtZW50LgorICAgICAqLworICAgIFN0cmluZyBnZXRfZGVmYXVsdF90ZXh0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzY2hlbWEgZmllbGQgZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgU2NoZW1hRmllbGQgZ2V0X3NjaGVtYV9maWVsZCgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0b3JlLmphdmEgYi92MS9zcmMvdHlwZXN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC92YWx1ZXMvWG1sU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FlNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3R5cGVzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdmFsdWVzL1htbFN0b3JlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlczsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIFhtbFN0b3JlCit7CisgICAgLy8KKyAgICAvLworICAgIC8vCisKKyAgICBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOworICAgIFhtbE9iamVjdCBsb2FkWG1sICggSW5wdXRTdHJlYW0gaW4sICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIFhtbE9iamVjdCBsb2FkWG1sICggUmVhZGVyIHIsICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIFhtbE9iamVjdCBsb2FkWG1sICggWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKyAgICBYbWxPYmplY3QgbG9hZFhtbCAoIE5vZGUgbm9kZSwgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOworICAgIAorICAgIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7CisKKyAgICBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9CYXNlU2NoZW1hUmVzb3VyY2VNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3MWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0Jhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDcxNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudXRpbC5IZXhCaW47CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5JT1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54bWxiZWFuLnhzZG93bmxvYWQuRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi54c2Rvd25sb2FkLkRvd25sb2FkZWRTY2hlbWFzRG9jdW1lbnQuRG93bmxvYWRlZFNjaGVtYXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhtbGJlYW4ueHNkb3dubG9hZC5Eb3dubG9hZGVkU2NoZW1hRW50cnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlciBleHRlbmRzIFNjaGVtYUltcG9ydFJlc29sdmVyCit7CisgICAgcHJpdmF0ZSBTdHJpbmcgX2RlZmF1bHRDb3B5RGlyZWN0b3J5OworICAgIHByaXZhdGUgRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudCBfaW1wb3J0c0RvYzsKKyAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JGaWxlbmFtZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yVVJMID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBfcmVzb3VyY2VGb3JOYW1lc3BhY2UgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIF9yZXNvdXJjZUZvckRpZ2VzdCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXAgX3Jlc291cmNlRm9yQ2FjaGVFbnRyeSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBTZXQgX3JlZG93bmxvYWRTZXQgPSBuZXcgSGFzaFNldCgpOworCisgICAgcHJvdGVjdGVkIEJhc2VTY2hlbWFSZXNvdXJjZU1hbmFnZXIoKQorICAgIHsKKyAgICAgICAgLy8gY29uY3JldGUgc3ViY2xhc3NlcyBzaG91bGQgY2FsbCBpbml0IGluIHRoZWlyIGNvbnN0cnVjdG9ycworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoKQorICAgIHsKKyAgICAgICAgaWYgKGZpbGVFeGlzdHMoZ2V0SW5kZXhGaWxlbmFtZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2ltcG9ydHNEb2MgPSBEb3dubG9hZGVkU2NoZW1hc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoIGlucHV0U3RyZWFtRm9yRmlsZSggZ2V0SW5kZXhGaWxlbmFtZSgpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbXBvcnRzRG9jID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKShuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgeHNkb3dubG9hZC54bWw6IHBsZWFzZSBmaXggb3IgZGVsZXRlIHRoaXMgZmlsZSIpKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9pbXBvcnRzRG9jID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9pbXBvcnRzRG9jID0gRG93bmxvYWRlZFNjaGVtYXNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICAgICAiPGRsczpkb3dubG9hZGVkLXNjaGVtYXMgeG1sbnM6ZGxzPSdodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL3hzZG93bmxvYWQnIGRlZmF1bHREaXJlY3Rvcnk9JyIgKyBnZXREZWZhdWx0U2NoZW1hRGlyKCkgKyAiJy8+IgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVmYXVsdERpciA9IF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCkuZ2V0RGVmYXVsdERpcmVjdG9yeSgpOworICAgICAgICBpZiAoZGVmYXVsdERpciA9PSBudWxsKQorICAgICAgICAgICAgZGVmYXVsdERpciA9IGdldERlZmF1bHRTY2hlbWFEaXIoKTs7CisgICAgICAgIF9kZWZhdWx0Q29weURpcmVjdG9yeSA9IGRlZmF1bHREaXI7CisKKyAgICAgICAgLy8gbm93IGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeVtdIGVudHJpZXMgPSBfaW1wb3J0c0RvYy5nZXREb3dubG9hZGVkU2NoZW1hcygpLmdldEVudHJ5QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGVSZXNvdXJjZShlbnRyaWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gX2ltcG9ydHNEb2MubmV3SW5wdXRTdHJlYW0obmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKSk7CisgICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoaW5wdXQsIGdldEluZGV4RmlsZW5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0FsbChib29sZWFuIHN5bmMsIGJvb2xlYW4gcmVmcmVzaCwgYm9vbGVhbiBpbXBvcnRzKQorICAgIHsKKyAgICAgICAgaWYgKHJlZnJlc2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZWRvd25sb2FkU2V0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGFsbEZpbGVuYW1lcyA9IGdldEFsbFhTREZpbGVuYW1lcygpOworCisgICAgICAgIGlmIChzeW5jKQorICAgICAgICAgICAgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoYWxsRmlsZW5hbWVzLCBmYWxzZSk7CisKKyAgICAgICAgU2NoZW1hUmVzb3VyY2VbXSBzdGFydGVycyA9IChTY2hlbWFSZXNvdXJjZVtdKQorICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnZhbHVlcygpLnRvQXJyYXkoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTY2hlbWFSZXNvdXJjZVtfcmVzb3VyY2VGb3JGaWxlbmFtZS52YWx1ZXMoKS5zaXplKCldKTsKKworICAgICAgICBpZiAocmVmcmVzaCkKKyAgICAgICAgICAgIHJlZG93bmxvYWRFbnRyaWVzKHN0YXJ0ZXJzKTsKKworICAgICAgICBpZiAoaW1wb3J0cykKKyAgICAgICAgICAgIHJlc29sdmVJbXBvcnRzKHN0YXJ0ZXJzKTsKKworICAgICAgICBfcmVkb3dubG9hZFNldCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2VzcyhTdHJpbmdbXSB1cmlzLCBTdHJpbmdbXSBmaWxlbmFtZXMsIGJvb2xlYW4gc3luYywgYm9vbGVhbiByZWZyZXNoLCBib29sZWFuIGltcG9ydHMpCisgICAgeworICAgICAgICBpZiAocmVmcmVzaCkKKyAgICAgICAgeworICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGVuYW1lcy5sZW5ndGggPiAwKQorICAgICAgICAgICAgc3luY0NhY2hlV2l0aExvY2FsWHNkRmlsZXMoZmlsZW5hbWVzLCB0cnVlKTsKKyAgICAgICAgZWxzZSBpZiAoc3luYykKKyAgICAgICAgICAgIHN5bmNDYWNoZVdpdGhMb2NhbFhzZEZpbGVzKGdldEFsbFhTREZpbGVuYW1lcygpLCBmYWxzZSk7CisKKyAgICAgICAgU2V0IHN0YXJ0ZXJzZXQgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpbG9va3VwUmVzb3VyY2UobnVsbCwgdXJpc1tpXSk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGFydGVyc2V0LmFkZChyZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yRmlsZW5hbWUuZ2V0KGZpbGVuYW1lcyk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzdGFydGVyc2V0LmFkZChyZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBTY2hlbWFSZXNvdXJjZVtdIHN0YXJ0ZXJzID0gKFNjaGVtYVJlc291cmNlW10pCisgICAgICAgICAgICAgICBzdGFydGVyc2V0LnRvQXJyYXkobmV3IFNjaGVtYVJlc291cmNlW3N0YXJ0ZXJzZXQuc2l6ZSgpXSk7CisKKyAgICAgICAgaWYgKHJlZnJlc2gpCisgICAgICAgICAgICByZWRvd25sb2FkRW50cmllcyhzdGFydGVycyk7CisKKyAgICAgICAgaWYgKGltcG9ydHMpCisgICAgICAgICAgICByZXNvbHZlSW1wb3J0cyhzdGFydGVycyk7CisKKyAgICAgICAgX3JlZG93bmxvYWRTZXQgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgaXRlbXMgdG8gdGhlIGNhY2hlIHRoYXQgcG9pbnQgdG8gbmV3IGZpbGVzIHRoYXQgYXJlbid0CisgICAgICogZGVzY3JpYmVkIGluIHRoZSBjYWNoZSwgYW5kIG9wdGlvbmFsbHkgZGVsZXRlcyBvbGQgZW50cmllcy4KKyAgICAgKgorICAgICAqIElmIGFuIG9sZCBmaWxlIGlzIGdvbmUgYW5kIGEgbmV3IGZpbGUgaXMKKyAgICAgKiBmb3VuZCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgY29udGVudHMsIHRoZSBjYWNoZSBlbnRyeSBpcyBtb3ZlZAorICAgICAqIHRvIHBvaW50IHRvIHRoZSBuZXcgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzeW5jQ2FjaGVXaXRoTG9jYWxYc2RGaWxlcyhTdHJpbmdbXSBmaWxlbmFtZXMsIGJvb2xlYW4gZGVsZXRlT25seU1lbnRpb25lZCkKKyAgICB7CisgICAgICAgIFNldCBzZWVuUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IHZhbmlzaGVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVzW2ldOworCisgICAgICAgICAgICAvLyBmaXJzdCwgaWYgdGhlIGZpbGVuYW1lIG1hdGNoZXMgZXhhY3RseSwgdHJ1c3QgdGhlIGZpbGVuYW1lCisgICAgICAgICAgICBTY2hlbWFSZXNvdXJjZSByZXNvdXJjZSA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JGaWxlbmFtZS5nZXQoZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdHMoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgICBzZWVuUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2YW5pc2hlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBuZXcgZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUgaW5kZXg/CisgICAgICAgICAgICAvLyBub3QgaWYgdGhlIGRpZ2VzdCBpcyBrbm93biB0byB0aGUgaW5kZXggYW5kIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGdvbmUgLSB0aGF0J3MgYSByZW5hbWUhCisgICAgICAgICAgICBTdHJpbmcgZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpZ2VzdCA9IHNoYURpZ2VzdEZvckZpbGUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvckRpZ2VzdC5nZXQoZGlnZXN0KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbGRGaWxlbmFtZSA9IHJlc291cmNlLmdldEZpbGVuYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0cyhvbGRGaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoIkZpbGUgIiArIGZpbGVuYW1lICsgIiBpcyBhIHJlbmFtZSBvZiAiICsgb2xkRmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0RmlsZW5hbWUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VlblJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChvbGRGaWxlbmFtZSkgPT0gcmVzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucmVtb3ZlKG9sZEZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzb3VyY2VGb3JGaWxlbmFtZS5jb250YWluc0tleShmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucHV0KGZpbGVuYW1lLCByZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byByZWFkIGRpZ2VzdC4uLiBubyBwcm9ibGVtLCBpZ25vcmUgdGhlbgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvaywgdGhpcyByZWFsbHkgaXMgYSBuZXcgWFNEIGZpbGUgdGhlbiwgb2YgdW5rbm93biBVUkwgb3JpZ2luCisgICAgICAgICAgICBEb3dubG9hZGVkU2NoZW1hRW50cnkgbmV3RW50cnkgPSBhZGROZXdFbnRyeSgpOworICAgICAgICAgICAgbmV3RW50cnkuc2V0RmlsZW5hbWUoZmlsZW5hbWUpOworICAgICAgICAgICAgd2FybmluZygiQ2FjaGluZyBpbmZvcm1hdGlvbiBvbiBuZXcgbG9jYWwgZmlsZSAiICsgZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKGRpZ2VzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIG5ld0VudHJ5LnNldFNoYTEoZGlnZXN0KTsKKworICAgICAgICAgICAgc2VlblJlc291cmNlcy5hZGQodXBkYXRlUmVzb3VyY2UobmV3RW50cnkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWxldGVPbmx5TWVudGlvbmVkKQorICAgICAgICAgICAgZGVsZXRlUmVzb3VyY2VzSW5TZXQodmFuaXNoZWRSZXNvdXJjZXMsIHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZWxldGVSZXNvdXJjZXNJblNldChzZWVuUmVzb3VyY2VzLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCBldmVyeSBlbnRyeSBhbmQgcmVmZXRjaGVzIGl0IGZyb20gaXRzIHByaW1hcnkgVVJMLAorICAgICAqIGlmIGtub3duLiAgUmVwbGFjZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGlmIHRoZSBkYXRhIGlzIGRpZmZlcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVkb3dubG9hZEVudHJpZXMoU2NoZW1hUmVzb3VyY2VbXSByZXNvdXJjZXMpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVkb3dubG9hZFJlc291cmNlKHJlc291cmNlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3VyY2VzSW5TZXQoU2V0IHNlZW5SZXNvdXJjZXMsIGJvb2xlYW4gc2V0VG9EZWxldGUpCisgICAgeworICAgICAgICBTZXQgc2VlbkNhY2hlRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlZW5SZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpaS5uZXh0KCk7CisgICAgICAgICAgICBzZWVuQ2FjaGVFbnRyaWVzLmFkZChyZXNvdXJjZS5fY2FjaGVFbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBEb3dubG9hZGVkU2NoZW1hcyBkb3dubG9hZGVkU2NoZW1hcyA9IF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG93bmxvYWRlZFNjaGVtYXMuc2l6ZU9mRW50cnlBcnJheSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBjYWNoZUVudHJ5ID0gZG93bmxvYWRlZFNjaGVtYXMuZ2V0RW50cnlBcnJheShpKTsKKworICAgICAgICAgICAgaWYgKHNlZW5DYWNoZUVudHJpZXMuY29udGFpbnMoY2FjaGVFbnRyeSkgPT0gc2V0VG9EZWxldGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpX3Jlc291cmNlRm9yQ2FjaGVFbnRyeS5nZXQoY2FjaGVFbnRyeSk7CisgICAgICAgICAgICAgICAgd2FybmluZygiUmVtb3Zpbmcgb2Jzb2xldGUgY2FjaGUgZW50cnkgZm9yICIgKyByZXNvdXJjZS5nZXRGaWxlbmFtZSgpKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yQ2FjaGVFbnRyeS5yZW1vdmUoY2FjaGVFbnRyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IF9yZXNvdXJjZUZvckZpbGVuYW1lLmdldChyZXNvdXJjZS5nZXRGaWxlbmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvckZpbGVuYW1lLnJlbW92ZShyZXNvdXJjZS5nZXRGaWxlbmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgPT0gX3Jlc291cmNlRm9yRGlnZXN0LmdldChyZXNvdXJjZS5nZXRTaGExKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRGlnZXN0LnJlbW92ZShyZXNvdXJjZS5nZXRTaGExKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KHJlc291cmNlLmdldE5hbWVzcGFjZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvck5hbWVzcGFjZS5yZW1vdmUocmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGFueSBvciBhbGwgVVJJcworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB1cmxzID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHVybHMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBfcmVzb3VyY2VGb3JVUkwuZ2V0KHVybHNbal0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5yZW1vdmUodXJsc1tqXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkb3dubG9hZGVkU2NoZW1hcy5yZW1vdmVFbnRyeShpKTsKKyAgICAgICAgICAgICAgICBpIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIHVwZGF0ZVJlc291cmNlKERvd25sb2FkZWRTY2hlbWFFbnRyeSBlbnRyeSkKKyAgICB7CisgICAgICAgIC8vIFRoZSBmaWxlCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGVudHJ5LmdldEZpbGVuYW1lKCk7CisgICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgU2NoZW1hUmVzb3VyY2UoZW50cnkpOworICAgICAgICBfcmVzb3VyY2VGb3JDYWNoZUVudHJ5LnB1dChlbnRyeSwgcmVzb3VyY2UpOworCisgICAgICAgIGlmICghX3Jlc291cmNlRm9yRmlsZW5hbWUuY29udGFpbnNLZXkoZmlsZW5hbWUpKQorICAgICAgICAgICAgX3Jlc291cmNlRm9yRmlsZW5hbWUucHV0KGZpbGVuYW1lLCByZXNvdXJjZSk7CisKKyAgICAgICAgLy8gVGhlIGRpZ2VzdAorICAgICAgICBTdHJpbmcgZGlnZXN0ID0gcmVzb3VyY2UuZ2V0U2hhMSgpOworICAgICAgICBpZiAoZGlnZXN0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yRGlnZXN0LmNvbnRhaW5zS2V5KGRpZ2VzdCkpCisgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yRGlnZXN0LnB1dChkaWdlc3QsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5leHQsIHRoZSBuYW1lc3BhY2UKKyAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOworICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yTmFtZXNwYWNlLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSkpCisgICAgICAgICAgICAgICAgX3Jlc291cmNlRm9yTmFtZXNwYWNlLnB1dChuYW1lc3BhY2UsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmFsbHksIGFueSBvciBhbGwgVVJJcworICAgICAgICBTdHJpbmdbXSB1cmxzID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHVybHMubGVuZ3RoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3Jlc291cmNlRm9yVVJMLmNvbnRhaW5zS2V5KHVybHNbal0pKQorICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5wdXQodXJsc1tqXSwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERpZ2VzdElucHV0U3RyZWFtIGRpZ2VzdElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KQorICAgIHsKKyAgICAgICAgTWVzc2FnZURpZ2VzdCBzaGE7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzaGEgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOworICAgICAgICB9CisKKyAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gc3RyID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGlucHV0LCBzaGEpOworCisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgcHJpdmF0ZSBEb3dubG9hZGVkU2NoZW1hRW50cnkgYWRkTmV3RW50cnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9pbXBvcnRzRG9jLmdldERvd25sb2FkZWRTY2hlbWFzKCkuYWRkTmV3RW50cnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNjaGVtYVJlc291cmNlIGltcGxlbWVudHMgU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UKKyAgICB7CisgICAgICAgIFNjaGVtYVJlc291cmNlKERvd25sb2FkZWRTY2hlbWFFbnRyeSBlbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgX2NhY2hlRW50cnkgPSBlbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIERvd25sb2FkZWRTY2hlbWFFbnRyeSBfY2FjaGVFbnRyeTsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jYWNoZUVudHJ5LnNldEZpbGVuYW1lKGZpbGVuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NhY2hlRW50cnkuZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKGdldEZpbGVuYW1lKCkpKQorICAgICAgICAgICAgICAgIHJlZG93bmxvYWRSZXNvdXJjZSh0aGlzKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoaW5wdXRTdHJlYW1Gb3JGaWxlKGdldEZpbGVuYW1lKCkpKS5nZXRTY2hlbWEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gcmV0dXJuIG51bGwgaWYgX2FueV8gcHJvYmxlbXMgcmVhZGluZyBzY2hlbWEgZmlsZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaGExKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldFNoYTEoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUVudHJ5LmdldE5hbWVzcGFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jYWNoZUVudHJ5LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY2FjaGVFbnRyeS5zaXplT2ZTY2hlbWFMb2NhdGlvbkFycmF5KCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KDApOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2NoZW1hTG9jYXRpb25BcnJheSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfY2FjaGVFbnRyeS5nZXRTY2hlbWFMb2NhdGlvbkFycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldEZpbGVuYW1lKCkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBvYmogfHwgZ2V0RmlsZW5hbWUoKS5lcXVhbHMoKChTY2hlbWFSZXNvdXJjZSlvYmopLmdldEZpbGVuYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkU2NoZW1hTG9jYXRpb24oU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBfY2FjaGVFbnRyeS5hZGRTY2hlbWFMb2NhdGlvbihzY2hlbWFMb2NhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgSW1wb3J0TG9hZGVyIHdpc2hlcyB0byByZXNvbHZlIHRoZQorICAgICAqIGdpdmVuIGltcG9ydC4gIFNob3VsZCByZXR1cm4gYSBTY2hlbWFSZXNvdXJjZSB3aG9zZQorICAgICAqICJlcXVhbHMiIHJlbGF0aW9uc2hpcCByZXZlYWxzIHdoZW4gYSBTY2hlbWFSZXNvdXJjZSBpcworICAgICAqIGR1cGxpY2F0ZWQgYW5kIHNob3VsZG4ndCBiZSBleGFtaW5lZCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFJbXBvcnRSZXNvbHZlci5TY2hlbWFSZXNvdXJjZSBsb29rdXBSZXNvdXJjZShTdHJpbmcgbnNVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKKyAgICB7CisgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc3VsdCA9IGZldGNoRnJvbUNhY2hlKG5zVVJJLCBzY2hlbWFMb2NhdGlvbik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVkb3dubG9hZFJlc291cmNlKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIk5vIGNhY2hlZCBzY2hlbWEgZm9yIG5hbWVzcGFjZSAnIiArIG5zVVJJICsgIicsIGFuZCBubyB1cmwgc3BlY2lmaWVkIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IGNvcHlPcklkZW50aWZ5RHVwbGljYXRlVVJMKHNjaGVtYUxvY2F0aW9uLCBuc1VSSSk7CisgICAgICAgIGlmIChfcmVkb3dubG9hZFNldCAhPSBudWxsKQorICAgICAgICAgICAgX3JlZG93bmxvYWRTZXQuYWRkKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTY2hlbWFSZXNvdXJjZSBmZXRjaEZyb21DYWNoZShTdHJpbmcgbnNVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKKyAgICB7CisgICAgICAgIFNjaGVtYVJlc291cmNlIHJlc3VsdDsKKworICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvclVSTC5nZXQoc2NoZW1hTG9jYXRpb24pOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnNVUkkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gKFNjaGVtYVJlc291cmNlKV9yZXNvdXJjZUZvck5hbWVzcGFjZS5nZXQobnNVUkkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVGaWxlbmFtZUZvclVSSShTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgbG9jYWxGaWxlbmFtZSA9IG5ldyBVUkkoIHNjaGVtYUxvY2F0aW9uICkuZ2V0UmF3UGF0aCgpOworICAgICAgICBpbnQgaSA9IGxvY2FsRmlsZW5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgIGxvY2FsRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lLnN1YnN0cmluZyhpICsgMSk7CisgICAgICAgIGlmIChsb2NhbEZpbGVuYW1lLmVuZHNXaXRoKCIueHNkIikpCisgICAgICAgICAgICBsb2NhbEZpbGVuYW1lID0gbG9jYWxGaWxlbmFtZS5zdWJzdHJpbmcoMCwgbG9jYWxGaWxlbmFtZS5sZW5ndGgoKSAtIDQpOworICAgICAgICBpZiAobG9jYWxGaWxlbmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgbG9jYWxGaWxlbmFtZSA9ICJzY2hlbWEiOworCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSBvdGhlciB1bnNhZmUgY2hhcmFjdGVycyBmb3IgZmlsZW5hbWVzPworCisgICAgICAgIFN0cmluZyBjYW5kaWRhdGVGaWxlbmFtZSA9IGxvY2FsRmlsZW5hbWU7CisgICAgICAgIGludCBzdWZmaXggPSAxOworICAgICAgICB3aGlsZSAoc3VmZml4IDwgMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IF9kZWZhdWx0Q29weURpcmVjdG9yeSArICIvIiArIGNhbmRpZGF0ZUZpbGVuYW1lICsgIi54c2QiOworICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKGNhbmRpZGF0ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIHN1ZmZpeCArPSAxOworICAgICAgICAgICAgY2FuZGlkYXRlRmlsZW5hbWUgPSBsb2NhbEZpbGVuYW1lICsgc3VmZml4OworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggZmlsZW5hbWUgIiArIGxvY2FsRmlsZW5hbWUgKyAiLnhzZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWRvd25sb2FkUmVzb3VyY2UoU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UpCisgICAgeworICAgICAgICBpZiAoX3JlZG93bmxvYWRTZXQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9yZWRvd25sb2FkU2V0LmNvbnRhaW5zKHJlc291cmNlKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBfcmVkb3dubG9hZFNldC5hZGQocmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gcmVzb3VyY2UuZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0U2NoZW1hTG9jYXRpb24oKTsKKyAgICAgICAgU3RyaW5nIGRpZ2VzdCA9IG51bGw7CisKKyAgICAgICAgLy8gbm90aGluZyB0byBkbz8KKyAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwgfHwgZmlsZW5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCggc2NoZW1hTG9jYXRpb24gKTsKKyAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiQXBhY2hlIFhNTEJlYW5zLzEuMC4zIik7CisgICAgICAgICAgICBjb25uLmFkZFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsICovKiIpOworICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gaW5wdXQgPSBkaWdlc3RJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGlucHV0LCBidWZmZXIpOworICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlnZXN0LmVxdWFscyhyZXNvdXJjZS5nZXRTaGExKCkpICYmIGZpbGVFeGlzdHMoZmlsZW5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICB3YXJuaW5nKCJSZXNvdXJjZSAiICsgZmlsZW5hbWUgKyAiIGlzIHVuY2hhbmdlZCBmcm9tICIgKyBzY2hlbWFMb2NhdGlvbiArICIuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc291cmNlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIHdyaXRlSW5wdXRTdHJlYW1Ub0ZpbGUoc291cmNlLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICIgKyBmaWxlbmFtZSArICIgZm9yICIgKyBzY2hlbWFMb2NhdGlvbiArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdhcm5pbmcoIlJlZnJlc2hlZCAiICsgZmlsZW5hbWUgKyAiIGZyb20gIiArIHNjaGVtYUxvY2F0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNjaGVtYVJlc291cmNlIGNvcHlPcklkZW50aWZ5RHVwbGljYXRlVVJMKFN0cmluZyBzY2hlbWFMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkKKyAgICB7CisgICAgICAgIFN0cmluZyB0YXJnZXRGaWxlbmFtZTsKKyAgICAgICAgU3RyaW5nIGRpZ2VzdDsKKyAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzdWx0OworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXRGaWxlbmFtZSA9IHVuaXF1ZUZpbGVuYW1lRm9yVVJJKHNjaGVtYUxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIkludmFsaWQgVVJJICciICsgc2NoZW1hTG9jYXRpb24gKyAiJzoiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgbG9jYWwgZmlsZSBmb3IgIiArIHNjaGVtYUxvY2F0aW9uICsgIjoiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoIHNjaGVtYUxvY2F0aW9uICk7CisgICAgICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBpbnB1dCA9IGRpZ2VzdElucHV0U3RyZWFtKHVybC5vcGVuU3RyZWFtKCkpOworICAgICAgICAgICAgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShpbnB1dCwgdGFyZ2V0RmlsZW5hbWUpOworICAgICAgICAgICAgZGlnZXN0ID0gSGV4QmluLmJ5dGVzVG9TdHJpbmcoaW5wdXQuZ2V0TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcoIkNvdWxkIG5vdCBjb3B5IHJlbW90ZSByZXNvdXJjZSAiICsgc2NoZW1hTG9jYXRpb24gKyAiOiIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IChTY2hlbWFSZXNvdXJjZSlfcmVzb3VyY2VGb3JEaWdlc3QuZ2V0KGRpZ2VzdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlRmlsZSh0YXJnZXRGaWxlbmFtZSk7CisgICAgICAgICAgICByZXN1bHQuYWRkU2NoZW1hTG9jYXRpb24oc2NoZW1hTG9jYXRpb24pOworICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VGb3JVUkwuY29udGFpbnNLZXkoc2NoZW1hTG9jYXRpb24pKQorICAgICAgICAgICAgICAgIF9yZXNvdXJjZUZvclVSTC5wdXQoc2NoZW1hTG9jYXRpb24sIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgd2FybmluZygiRG93bmxvYWRlZCAiICsgc2NoZW1hTG9jYXRpb24gKyAiIHRvICIgKyB0YXJnZXRGaWxlbmFtZSk7CisKKyAgICAgICAgRG93bmxvYWRlZFNjaGVtYUVudHJ5IG5ld0VudHJ5ID0gYWRkTmV3RW50cnkoKTsKKyAgICAgICAgbmV3RW50cnkuc2V0RmlsZW5hbWUodGFyZ2V0RmlsZW5hbWUpOworICAgICAgICBuZXdFbnRyeS5zZXRTaGExKGRpZ2VzdCk7CisgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKKyAgICAgICAgICAgIG5ld0VudHJ5LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOworICAgICAgICBuZXdFbnRyeS5hZGRTY2hlbWFMb2NhdGlvbihzY2hlbWFMb2NhdGlvbik7CisgICAgICAgIHJldHVybiB1cGRhdGVSZXNvdXJjZShuZXdFbnRyeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyBhY3R1YWwgbmFtZXNwYWNlIGluIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBvcnRBY3R1YWxOYW1lc3BhY2UoU2NoZW1hSW1wb3J0UmVzb2x2ZXIuU2NoZW1hUmVzb3VyY2UgcnJlc291cmNlLCBTdHJpbmcgYWN0dWFsTmFtZXNwYWNlKQorICAgIHsKKyAgICAgICAgU2NoZW1hUmVzb3VyY2UgcmVzb3VyY2UgPSAoU2NoZW1hUmVzb3VyY2UpcnJlc291cmNlOworICAgICAgICBTdHJpbmcgb2xkTmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgIGlmIChvbGROYW1lc3BhY2UgIT0gbnVsbCAmJiBfcmVzb3VyY2VGb3JOYW1lc3BhY2UuZ2V0KG9sZE5hbWVzcGFjZSkgPT0gcmVzb3VyY2UpCisgICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucmVtb3ZlKG9sZE5hbWVzcGFjZSk7CisgICAgICAgIGlmICghX3Jlc291cmNlRm9yTmFtZXNwYWNlLmNvbnRhaW5zS2V5KGFjdHVhbE5hbWVzcGFjZSkpCisgICAgICAgICAgICBfcmVzb3VyY2VGb3JOYW1lc3BhY2UucHV0KGFjdHVhbE5hbWVzcGFjZSwgcmVzb3VyY2UpOworICAgICAgICByZXNvdXJjZS5zZXROYW1lc3BhY2UoYWN0dWFsTmFtZXNwYWNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBzaGFEaWdlc3RGb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEaWdlc3RJbnB1dFN0cmVhbSBzdHIgPSBkaWdlc3RJbnB1dFN0cmVhbShpbnB1dFN0cmVhbUZvckZpbGUoZmlsZW5hbWUpKTsKKworICAgICAgICBieXRlW10gZHVtbXkgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPiAwOyBpID0gc3RyLnJlYWQoZHVtbXkpKTsKKworICAgICAgICBzdHIuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gSGV4QmluLmJ5dGVzVG9TdHJpbmcoc3RyLmdldE1lc3NhZ2VEaWdlc3QoKS5kaWdlc3QoKSk7CisgICAgfQorCisgICAgLy8gU09NRSBNRVRIT0RTIFRPIE9WRVJSSURFID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gIi4veHNkb3dubG9hZC54bWwiOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYURpcigpCisgICAgeworICAgICAgICByZXR1cm4gIi4vc2NoZW1hIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyBkaWFnbm9zdGljIG1lc3NhZ2VzIHN1Y2ggYXMgImRvd25sb2FkaW5nIFggdG8gZmlsZSBZIi4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2cpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuICBUaGUgZmlsZW5hbWVzCisgICAgICogYXJlIG9mIHRoZSBmb3JtICIvZm9vL2Jhci96ZWUueHNkIiBhbmQgc2hvdWxkIGJlIGNvbnN0cnVlZAorICAgICAqIGFzIHJvb3RlZCBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBmaWxlbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBmaWxlbmFtZSBhcyBhbiBJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGVudGlyZSBmaWxlIGluIG9uZSBzdGVwLiAgQW4gSW5wdXRTdHJlYW0gaXMgcGFzc2VkIGFuZAorICAgICAqIGNvcGllZCB0byB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3cml0ZUlucHV0U3RyZWFtVG9GaWxlKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYSBmaWxlLiAgU29tZXRpbWVzIGltbWVkaWF0ZWx5IGFmdGVyIHdyaXRpbmcgYSBuZXcgZmlsZQorICAgICAqIHdlIG5vdGljZSB0aGF0IGl0J3MgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiBleGlzdGluZyBmaWxlIGFuZAorICAgICAqIHdlIGRlbGV0ZSBpdC4gV2UgbmV2ZXIgZGVsZXRlIGEgZmlsZSB0aGF0IHdhcyBnaXZlbiB0byB1cworICAgICAqIGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgWFNEIGZpbGVzbmFtZXMgaW4gdGhlIHByb2plY3QuCisgICAgICovCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFsbFhTREZpbGVuYW1lcygpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvQ29kZUdlblV0aWwuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZGE4OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvZGVHZW5VdGlsLmphdmEKQEAgLTAsMCArMSw0MDggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBDb2RlR2VuVXRpbAoreworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUVNX1NUQVJUID0gIjhtIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX01FTV9NQVggPSAiMjU2bSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT01QSUxFUiA9ICJqYXZhYyI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9KQVIgPSAiamFyIjsKKworICAgIC8vd29ya2Fyb3VuZCBmb3IgU3VuIGJ1ZyAjIDQ3MjM3MjYKKyAgICBwdWJsaWMgc3RhdGljIFVSSSByZXNvbHZlKFVSSSBiYXNlLCBVUkkgY2hpbGQpCisgICAgeworICAgICAgICBVUkkgcnVyaSA9IGJhc2UucmVzb2x2ZShjaGlsZCk7CisgICAgICAgIAorICAgICAgICAvL2ZpeCB1cCBub3JtYWxpemF0aW9uIGJ1ZworICAgICAgICBpZiAoImZpbGUiLmVxdWFscyhydXJpLmdldFNjaGVtZSgpKSAmJiAhIGNoaWxkLmVxdWFscyhydXJpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhc2UuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikgJiYgIXJ1cmkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8vIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiLy8vIi5jb25jYXQocnVyaS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnVyaSA9IG5ldyBVUkkoImZpbGUiLCBudWxsLCBwYXRoLCBydXJpLmdldFF1ZXJ5KCksIHJ1cmkuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiB1cmlzKQorICAgICAgICAgICAgICAgIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJ1cmk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyB2b2lkIGFkZEFsbEphdmFGaWxlcyhMaXN0IHNyY0ZpbGVzLCBMaXN0IGFyZ3MpCisgICAgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzcmNGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGYgPSAoRmlsZSlpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFyZ3MuYWRkKHF1b3RlQW5kRXNjYXBlRmlsZW5hbWUoZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpc3QgaW5zaWRlID0gKEFycmF5cy5hc0xpc3QoZi5saXN0RmlsZXMoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlRmlsdGVyKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSkgfHwgZmlsZS5pc0RpcmVjdG9yeSgpOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApKSk7CisgICAgICAgICAgICAgICAgYWRkQWxsSmF2YUZpbGVzKGluc2lkZSwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgcXVvdGVBbmRFc2NhcGVGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICAvLyBkb24ndCBxdW90ZSBpZiB0aGVyZSdzIG5vIHNwYWNlCisgICAgICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKCIgIikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworCisgICAgICAgIC8vIGJpemFycmUuICBqYXZhYyBleHBlY3RzIGJhY2tzbGFzaCBlc2NhcGluZyBpZiB3ZSBxdW90ZSB0aGUgY2xhc3NwYXRoCisgICAgICAgIC8vIGJpemFycmUgYWxzby4gIHJlcGxhY2VBbGwgZXhwZWN0cyByZXBsYWNlbWVudCBiYWNrc2xhc2hlcyB0byBiZSBkb3VibGUgZXNjYXBlZC4KKyAgICAgICAgcmV0dXJuICJcIiIgKyBmaWxlbmFtZS5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIikgKyAiXCIiOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBxdW90ZU5vRXNjYXBlRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKQorICAgIHsKKyAgICAgICAgLy8gZG9uJ3QgcXVvdGUgaWYgdGhlcmUncyBubyBzcGFjZSwgYW5kIGRvbid0IHF1b3RlIG9uIGxpbnV4CisgICAgICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKCIgIikgPCAwIHx8IEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLycpCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWU7CisKKyAgICAgICAgcmV0dXJuICJcIiIgKyBmaWxlbmFtZSArICJcIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyBqYXZhYyBvbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBpbiBvcmRlciB0byB0dXJuIHRoZW0KKyAgICAgKiBpbnRvIGJpbmFyeSBmaWxlcyBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCByZXR1cm4gYSBsaXN0IG9mCisgICAgICogPGNvZGU+R2VuRmlsZTwvY29kZT5zIGZvciBhbGwgb2YgdGhlIGNsYXNzZXMgcHJvZHVjZWQgb3IgbnVsbCBpZiBhbgorICAgICAqIGVycm9yIG9jY3VycmVkLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIGJvb2xlYW4gZXh0ZXJuYWxDb21waWxlKExpc3Qgc3JjRmlsZXMsIEZpbGUgb3V0ZGlyLCBGaWxlW10gY3AsIGJvb2xlYW4gZGVidWcpCisgICAgeworICAgICAgICByZXR1cm4gZXh0ZXJuYWxDb21waWxlKHNyY0ZpbGVzLCBvdXRkaXIsIGNwLCBkZWJ1ZywgREVGQVVMVF9DT01QSUxFUiwgREVGQVVMVF9NRU1fU1RBUlQsIERFRkFVTFRfTUVNX01BWCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIGphdmFjIG9uIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGluIG9yZGVyIHRvIHR1cm4gdGhlbQorICAgICAqIGludG8gYmluYXJ5IGZpbGVzIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGhpcyB3aWxsIHJldHVybiBhIGxpc3Qgb2YKKyAgICAgKiA8Y29kZT5HZW5GaWxlPC9jb2RlPnMgZm9yIGFsbCBvZiB0aGUgY2xhc3NlcyBwcm9kdWNlZCBvciBudWxsIGlmIGFuCisgICAgICogZXJyb3Igb2NjdXJyZWQuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGV4dGVybmFsQ29tcGlsZShMaXN0IHNyY0ZpbGVzLCBGaWxlIG91dGRpciwgRmlsZVtdIGNwLCBib29sZWFuIGRlYnVnLCBTdHJpbmcgamF2YWNQYXRoLCBTdHJpbmcgbWVtU3RhcnQsIFN0cmluZyBtZW1NYXgsICBib29sZWFuIHF1aWV0LCBib29sZWFuIHZlcmJvc2UpCisgICAgeworICAgICAgICBMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgRmlsZSBqYXZhYyA9IGZpbmRKYXZhVG9vbChqYXZhY1BhdGggPT0gbnVsbCA/IERFRkFVTFRfQ09NUElMRVIgOiBqYXZhY1BhdGgpOworICAgICAgICBhc3NlcnQgKGphdmFjLmV4aXN0cygpKSA6ICJjb21waWxlciBub3QgZm91bmQgIiArIGphdmFjOworICAgICAgICBhcmdzLmFkZChqYXZhYy5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgaWYgKG91dGRpciA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRkaXIgPSBuZXcgRmlsZSgiLiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXJncy5hZGQoIi1kIik7CisgICAgICAgICAgICBhcmdzLmFkZChxdW90ZUFuZEVzY2FwZUZpbGVuYW1lKG91dGRpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNwID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNwID0gc3lzdGVtQ2xhc3NwYXRoKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3AubGVuZ3RoID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNsYXNzUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY2xhc3NwYXRoLiAgV2UgZG8gdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAvLyBqYXZhYyB3aWxsIGJlIGFibGUgdG8gZmluZCBjbGFzc2VzIHRoYXQgd2VyZSBjb21waWxlZAorICAgICAgICAgICAgLy8gcHJldmlvdXNseSBidXQgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiBzb3VyY2VzIHRoaXMgdGltZS4KKyAgICAgICAgICAgIGNsYXNzUGF0aC5hcHBlbmQob3V0ZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgLy8gQWRkIGV2ZXJ5dGhpbmcgb24gb3VyIGNsYXNzcGF0aC4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xhc3NQYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNsYXNzUGF0aC5hcHBlbmQoY3BbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmdzLmFkZCgiLWNsYXNzcGF0aCIpOworCisgICAgICAgICAgICAvLyBiaXphcnJlLiAgamF2YWMgZXhwZWN0cyBiYWNrc2xhc2ggZXNjYXBpbmcgaWYgd2UgcXVvdGUgdGhlIGNsYXNzcGF0aAorICAgICAgICAgICAgYXJncy5hZGQocXVvdGVBbmRFc2NhcGVGaWxlbmFtZShjbGFzc1BhdGgudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgYXJncy5hZGQoIi1zb3VyY2UiKTsKKyAgICAgICAgYXJncy5hZGQoIjEuNCIpOworCisgICAgICAgIGFyZ3MuYWRkKGRlYnVnID8gIi1nIiA6ICItZzpub25lIik7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBhcmdzLmFkZCgiLXZlcmJvc2UiKTsKKworICAgICAgICBhZGRBbGxKYXZhRmlsZXMoc3JjRmlsZXMsIGFyZ3MpOworCisgICAgICAgIEZpbGUgY2xGaWxlID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNsRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImphdmFjIiwgIiIpOworICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKGNsRmlsZSk7CisgICAgICAgICAgICBJdGVyYXRvciBpID0gYXJncy5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yIChpLm5leHQoKTsgaS5oYXNOZXh0KCk7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSAoU3RyaW5nKWkubmV4dCgpOworICAgICAgICAgICAgICAgIGZ3LndyaXRlKGFyZyk7CisgICAgICAgICAgICAgICAgZncud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdy5jbG9zZSgpOworICAgICAgICAgICAgTGlzdCBuZXdhcmdzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgbmV3YXJncy5hZGQoYXJncy5nZXQoMCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobWVtU3RhcnQgIT0gbnVsbCAmJiBtZW1TdGFydC5sZW5ndGgoKSAhPSAwKQorICAgICAgICAgICAgICAgIG5ld2FyZ3MuYWRkKCItSi1YbXMiICsgbWVtU3RhcnQpOworICAgICAgICAgICAgaWYgKG1lbU1heCAhPSBudWxsICYmIG1lbU1heC5sZW5ndGgoKSAhPSAwKQorICAgICAgICAgICAgICAgIG5ld2FyZ3MuYWRkKCItSi1YbXgiICsgbWVtTWF4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbmV3YXJncy5hZGQoIkAiICsgY2xGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGFyZ3MgPSBuZXdhcmdzOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgY3JlYXRlIGNvbW1hbmQtbGluZSBmaWxlIGZvciBqYXZhYyIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFyZ3MgPSAoU3RyaW5nW10pIGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2FyZ3Muc2l6ZSgpXSk7CisKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImNvbXBpbGUgY29tbWFuZDoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ckFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgc3RyQXJnc1tpXSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoc3RyQXJncyk7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvckJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIFRocmVhZGVkUmVhZGVyIG91dCA9IG5ldyBUaHJlYWRlZFJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCksIG91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICBUaHJlYWRlZFJlYWRlciBlcnIgPSBuZXcgVGhyZWFkZWRSZWFkZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpLCBlcnJvckJ1ZmZlcik7CisKKyAgICAgICAgICAgIHByb2Mud2FpdEZvcigpOworCisgICAgICAgICAgICBpZiAodmVyYm9zZSB8fCBwcm9jLmV4aXRWYWx1ZSgpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG91dHB1dEJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyb3JCdWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnJvckJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocHJvYy5leGl0VmFsdWUoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbiApCisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCInamF2YWMnIGlzIHJlcXVpcmVkIG9uIHRoZSBwYXRoLiIpOworCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldENhdXNlKCkpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xGaWxlICE9IG51bGwpCisgICAgICAgICAgICBjbEZpbGUuZGVsZXRlKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlW10gc3lzdGVtQ2xhc3NwYXRoKCkKKyAgICB7CisgICAgICAgIExpc3QgY3AgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZ1tdIHN5c3RlbWNwID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKS5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN5c3RlbWNwLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjcC5hZGQobmV3IEZpbGUoc3lzdGVtY3BbaV0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEZpbGVbXSljcC50b0FycmF5KG5ldyBGaWxlW2NwLnNpemUoKV0pOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHRlcm5hbEphcihGaWxlIHNyY2RpciwgRmlsZSBvdXRmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4dGVybmFsSmFyKHNyY2Rpciwgb3V0ZmlsZSwgREVGQVVMVF9KQVIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGV4dGVybmFsSmFyKEZpbGUgc3JjZGlyLCBGaWxlIG91dGZpbGUsIFN0cmluZyBqYXJQYXRoLCBib29sZWFuIHF1aWV0LCBib29sZWFuIHZlcmJvc2UpCisgICAgeworICAgICAgICBMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgRmlsZSBqYXIgPSBmaW5kSmF2YVRvb2woamFyUGF0aCA9PSBudWxsID8gREVGQVVMVF9KQVIgOiBqYXJQYXRoKTsKKyAgICAgICAgYXNzZXJ0IChqYXIuZXhpc3RzKCkpIDogImphciBub3QgZm91bmQgIiArIGphcjsKKyAgICAgICAgYXJncy5hZGQoamFyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBhcmdzLmFkZCgiY2YiICsgKHZlcmJvc2UgPyAidiIgOiAiIikpOworICAgICAgICBhcmdzLmFkZChxdW90ZU5vRXNjYXBlRmlsZW5hbWUob3V0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIGFyZ3MuYWRkKCItQyIpOworICAgICAgICBhcmdzLmFkZChxdW90ZU5vRXNjYXBlRmlsZW5hbWUoc3JjZGlyLmdldEFic29sdXRlUGF0aCgpKSk7CisKKyAgICAgICAgYXJncy5hZGQoIi4iKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJncyA9IChTdHJpbmdbXSkgYXJncy50b0FycmF5KG5ldyBTdHJpbmdbYXJncy5zaXplKCldKTsKKworICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiamFyIGNvbW1hbmQ6Iik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIHN0ckFyZ3NbaV0pOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHN0ckFyZ3MpOworCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3JCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICBUaHJlYWRlZFJlYWRlciBvdXQgPSBuZXcgVGhyZWFkZWRSZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgVGhyZWFkZWRSZWFkZXIgZXJyID0gbmV3IFRocmVhZGVkUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyb3JCdWZmZXIpOworCisgICAgICAgICAgICBwcm9jLndhaXRGb3IoKTsKKworICAgICAgICAgICAgaWYgKHZlcmJvc2UgfHwgcHJvYy5leGl0VmFsdWUoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvdXRwdXRCdWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVycm9yQnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JCdWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYy5leGl0VmFsdWUoKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rIGZvciB0b29sIGluIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCAke0pBVkFfSE9NRX0vLi4vYmluIGFuZAorICAgICAqIHRyeSB3aXRoIC5leGUgZmlsZSBleHRlbnNpb24uCisgICAgICovIAorICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZmluZEphdmFUb29sKFN0cmluZyB0b29sKQorICAgIHsKKyAgICAgICAgRmlsZSB0b29sRmlsZSA9IG5ldyBGaWxlKHRvb2wpOworICAgICAgICBpZiAodG9vbEZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0b29sRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUodG9vbCArICIuZXhlIik7CisgICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBob21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKKworICAgICAgICBTdHJpbmcgc2VwICA9IEZpbGUuc2VwYXJhdG9yOworICAgICAgICByZXN1bHQgPSBuZXcgRmlsZShob21lICsgc2VwICsgIi4uIiArIHNlcCArICJiaW4iLCB0b29sKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKHJlc3VsdC5nZXRQYXRoKCkgKyAiLmV4ZSIpOworICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGUoaG9tZSArIHNlcCArICJiaW4iLCB0b29sKTsKKyAgICAgICAgaWYgKHJlc3VsdC5pc0ZpbGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IG5ldyBGaWxlKHJlc3VsdC5nZXRQYXRoKCkgKyAiLmV4ZSIpOworICAgICAgICBpZiAocmVzdWx0LmlzRmlsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8ganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHRvb2xGaWxlIGFuZCBob3BlIHRoYXQgaXQgaXMgb24gdGhlIFBBVEguCisgICAgICAgIHJldHVybiB0b29sRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIGludG8gdGhlIGdpdmVuIGJ1ZmZlciB1bnRpbCB0aGVyZSBpcworICAgICAqIG5vdGhpbmcgbGVmdCB0byByZWFkLgorICAgICAqLworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFRocmVhZGVkUmVhZGVyCisgICAgeworICAgICAgICBwdWJsaWMgVGhyZWFkZWRSZWFkZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBmaW5hbCBTdHJpbmdCdWZmZXIgb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7CisKKyAgICAgICAgICAgIFRocmVhZCByZWFkZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHM7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHMgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHMgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZWFkZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL0NvbW1hbmRMaW5lLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNWM1NzIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Db21tYW5kTGluZS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK3B1YmxpYyBjbGFzcyBDb21tYW5kTGluZQoreworICAgIHB1YmxpYyBDb21tYW5kTGluZShTdHJpbmdbXSBhcmdzLCBDb2xsZWN0aW9uIHNjaGVtZSkKKyAgICB7CisgICAgICAgIF9vcHRpb25zID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgQXJyYXlMaXN0IGVuZGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5pbmRleE9mKCctJykgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3B0ID0gYXJnc1tpXS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5jb250YWlucyhvcHQpICYmIGkgPCBhcmdzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gIiI7CisKKyAgICAgICAgICAgICAgICBfb3B0aW9ucy5wdXQob3B0LCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuZGFyZ3MuYWRkKGFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX2FyZ3MgPSAoU3RyaW5nW10pZW5kYXJncy50b0FycmF5KG5ldyBTdHJpbmdbZW5kYXJncy5zaXplKCldKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TGljZW5zZSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KENvbW1hbmRMaW5lLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibGljZW5zZS50eHQiKSwgU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpY2Vuc2UgYXZhaWxhYmxlIGluIHRoaXMgSkFSIGluIGxpY2Vuc2UudHh0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1hcCBfb3B0aW9uczsKKyAgICBwcml2YXRlIFN0cmluZ1tdIF9hcmdzOworCisgICAgcHVibGljIFN0cmluZ1tdIGFyZ3MoKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tfYXJncy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9hcmdzLCAwLCByZXN1bHQsIDAsIF9hcmdzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPcHQoU3RyaW5nIG9wdCkKKyAgICB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKV9vcHRpb25zLmdldChvcHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3QgY29sbGVjdEZpbGVzKEZpbGVbXSBkaXJzKQorICAgIHsKKyAgICAgICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGYgPSBkaXJzW2ldOworICAgICAgICAgICAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVzLmFkZEFsbChjb2xsZWN0RmlsZXMoZi5saXN0RmlsZXMoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgX2ZpbGVzOworICAgIHByaXZhdGUgRmlsZSBfYmFzZURpcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlW10gRU1QVFlfRklMRUFSUkFZID0gbmV3IEZpbGVbMF07CisKKyAgICBwcml2YXRlIExpc3QgZ2V0RmlsZUxpc3QoKQorICAgIHsKKyAgICAgICAgaWYgKF9maWxlcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gYXJncygpOworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbYXJncy5sZW5ndGhdOworICAgICAgICAgICAgYm9vbGVhbiBub0Jhc2VEaXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxlc1tpXSA9IG5ldyBGaWxlKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIGlmICghbm9CYXNlRGlyICYmIChfYmFzZURpciA9PSBudWxsKSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9iYXNlRGlyID0gZmlsZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9iYXNlRGlyID0gZmlsZXNbaV0uZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVUkkgY3VyclVyaSA9IGZpbGVzW2ldLnRvVVJJKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBHaXZlIHVwIG9uIHRoZSBiYXNlZGlyLiBUaGVyZSBtYXkgYmUgbm9uZQorICAgICAgICAgICAgICAgICAgICBpZiAoX2Jhc2VEaXIgIT0gbnVsbCAmJiBfYmFzZURpci50b1VSSSgpLnJlbGF0aXZpemUoY3VyclVyaSkuZXF1YWxzKGN1cnJVcmkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfYmFzZURpciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBub0Jhc2VEaXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2ZpbGVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChjb2xsZWN0RmlsZXMoZmlsZXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2ZpbGVzOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlW10gZ2V0RmlsZXMoKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBnZXRGaWxlTGlzdCgpLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9GSUxFQVJSQVk7CisgICAgICAgIHJldHVybiAoRmlsZVtdKWdldEZpbGVMaXN0KCkudG9BcnJheShuZXcgRmlsZVtzaXplXSk7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpCisgICAgeworICAgICAgICByZXR1cm4gX2Jhc2VEaXI7CisgICAgfQorCisgICAgcHVibGljIEZpbGVbXSBmaWxlc0VuZGluZ1dpdGgoU3RyaW5nIGV4dCkKKyAgICB7CisgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRGaWxlTGlzdCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IChGaWxlKWkubmV4dCgpOworICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEZpbGVbXSlyZXN1bHQudG9BcnJheShuZXcgRmlsZVtyZXN1bHQuc2l6ZSgpXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRXh0ZW5zaW9uLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ3YjhkCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisKKyAvKioKKyAgKiBBbiBleHRlbnNpb24gaXMgYSBqYXZhYmVhbiB0aGF0IHJlcHJlc2VudHMgYSBTY2hlbWFDb21waWxlckV4dGVuc2lvbiB0byBiZSBwYXNzZWQgZm9yIGNhbGxiYWNrIGludG8gdGhlCisgICogIFhtbEJlYW5zIFNjaGVtYSBDb21waWxlci4KKyAgKi8KK3B1YmxpYyBjbGFzcyBFeHRlbnNpb24geworICAgICAgICBwcml2YXRlIENsYXNzIGNsYXNzTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0IHBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShDbGFzcyBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0oKSB7CisgICAgICAgICAgICBQYXJhbSBwID0gbmV3IFBhcmFtKCk7CisgICAgICAgICAgICBwYXJhbXMuYWRkKHApOworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQSBQYXJhbSBpcyBqdXN0IGEgbmFtZSB2YWx1ZSBwYWlyIGFwcGxpY2FibGUgdG8gdGhlIGV4dGVuc2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjbGFzcyBQYXJhbSB7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRmFjdG9ySW1wb3J0cy5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvRmFjdG9ySW1wb3J0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDkwNTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9GYWN0b3JJbXBvcnRzLmphdmEKQEAgLTAsMCArMSw0MzUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlRvcExldmVsQ29tcGxleFR5cGU7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbFNpbXBsZVR5cGU7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbEVsZW1lbnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5Ub3BMZXZlbEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLk5hbWVkR3JvdXA7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5OYW1lZEF0dHJpYnV0ZUdyb3VwOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuRm9ybUNob2ljZTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBUaGlzIHByb2dyYW0gdGFrZXMgYSBjb2xsZWN0aW9uIG9mIC54c2QgZmlsZXMgYXMgaW5wdXQsIGZpbmRzIGFsbCBkdXBsaWNhdGUKKyAqIG5hbWUgZGVmaW5pdGlvbnMsIGFuZCBmYWN0b3JzIG91dCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aG9zZSBpbnRvCisgKiBhIGNvbW1vbi54c2QgZmlsZSwgYWRkaW5nIGFuIGFwcHJvcHJpYXRlIDxpbXBvcnQ+IHN0YXRlbWVudCBpbiB0aGUgb3JpZ2luYWwKKyAqIHhzZCBmaWxlLgorICovIAorcHVibGljIGNsYXNzIEZhY3RvckltcG9ydHMKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImltcG9ydCIsICJvdXQifSkpOworICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3MgPSBjbC5hcmdzKCk7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmFjdG9ycyBhIGRpcmVjdG9yeSBvZiAueHNkIGZpbGVzIHRvIHJlbW92ZSBuYW1lIGNvbmZsaWN0cyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2ZhY3RvciBbLWltcG9ydCBjb21tb24ueHNkXSBbLW91dCBvdXRwdXRkaXJdIGlucHV0ZGlyIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiB3aGVyZSBpbnB1dGRpciBpcyBhIGRpcmVjdG9yeSBjb250YWluaW5nIC54c2QgZmlsZXMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIGFuZCBvdXRwdXRkaXIgaXMgYSBkaXJlY3RvcnkgaW50byB3aGljaCBuZXcgeHNkIGZpbGVzLCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgcGx1cyBhIGNvbW1vbmx5IGltcG9ydGVkIGNvbW1vbi54c2QsIGlzIHBsYWNlZC4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGNvbW1vbk5hbWUgPSBjbC5nZXRPcHQoImltcG9ydCIpOworICAgICAgICBpZiAoY29tbW9uTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgY29tbW9uTmFtZSA9ICJjb21tb24ueHNkIjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBvdXQgPSBjbC5nZXRPcHQoIm91dCIpOworICAgICAgICBpZiAob3V0ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgb3V0cHV0IGRpcmVjdG9yeSAnb3V0JyIpOworICAgICAgICAgICAgb3V0ID0gIm91dCI7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBvdXRkaXIgPSBuZXcgRmlsZShvdXQpOworICAgICAgICBGaWxlIGJhc2VkaXIgPSBuZXcgRmlsZShhcmdzWzBdKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZpcnN0LCBwYXJzZSBhbGwgdGhlIHNjaGVtYSBmaWxlcworICAgICAgICBGaWxlW10gZmlsZXMgPSBjbC5nZXRGaWxlcygpOworICAgICAgICBNYXAgc2NoZW1hRG9jcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIFNldCBlbGVtZW50TmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQgYXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQgdHlwZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IG1vZGVsR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldCBhdHRyR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIAorICAgICAgICBTZXQgZHVwZUVsZW1lbnROYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldCBkdXBlQXR0cmlidXRlTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQgZHVwZVR5cGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldCBkdXBlTW9kZWxHcm91cE5hbWVzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IGR1cGVBdHRyR3JvdXBOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldCBkdXBlTmFtZXNwYWNlcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHNjaGVtYQorICAgICAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIHNjaGVtYURvY3MucHV0KGRvYywgZmlsZXNbaV0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHdhcm4gYWJvdXQgZm9yIGltcG9ydHMsIGluY2x1ZGVzCisgICAgICAgICAgICAgICAgaWYgKGRvYy5nZXRTY2hlbWEoKS5zaXplT2ZJbXBvcnRBcnJheSgpID4gMCB8fCBkb2MuZ2V0U2NoZW1hKCkuc2l6ZU9mSW5jbHVkZUFycmF5KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndhcm5pbmc6ICIgKyBmaWxlc1tpXSArICIgY29udGFpbnMgaW1wb3J0cyBvciBpbmNsdWRlcyB0aGF0IGFyZSBiZWluZyBpZ25vcmVkLiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdG9nZXRoZXIgbmFtZXMKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZG9jLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgVG9wTGV2ZWxDb21wbGV4VHlwZSBjdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldENvbXBsZXhUeXBlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGN0Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShjdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7CisKKyAgICAgICAgICAgICAgICBUb3BMZXZlbFNpbXBsZVR5cGUgc3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRTaW1wbGVUeXBlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShzdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7CisKKyAgICAgICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVsLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgICAgICAgICBub3RlTmFtZShlbFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZWxlbWVudE5hbWVzLCBkdXBlRWxlbWVudE5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7CisKKyAgICAgICAgICAgICAgICBUb3BMZXZlbEF0dHJpYnV0ZSBhdFtdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdC5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgbm90ZU5hbWUoYXRbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWVzLCBkdXBlQXR0cmlidXRlTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBOYW1lZEdyb3VwIGdyW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0R3JvdXBBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3IubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGdyW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBtb2RlbEdyb3VwTmFtZXMsIGR1cGVNb2RlbEdyb3VwTmFtZXMsIGR1cGVOYW1lc3BhY2VzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBOYW1lZEF0dHJpYnV0ZUdyb3VwIGFnW10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWcubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgIG5vdGVOYW1lKGFnW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBhdHRyR3JvdXBOYW1lcywgZHVwZUF0dHJHcm91cE5hbWVzLCBkdXBlTmFtZXNwYWNlcyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3YXJuaW5nOiAiICsgZmlsZXNbaV0gKyAiIGlzIG5vdCBhIHNjaGVtYSBmaWxlIC0gIiArIGUuZ2V0RXJyb3IoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIGxvYWQgIiArIGZpbGVzW2ldICsgIiAtICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc2NoZW1hRG9jcy5zaXplKCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJObyBzY2hlbWEgZmlsZXMgZm91bmQuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGR1cGVUeXBlTmFtZXMuc2l6ZSgpICsgZHVwZUVsZW1lbnROYW1lcy5zaXplKCkgKyBkdXBlQXR0cmlidXRlTmFtZXMuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBkdXBlTW9kZWxHcm91cE5hbWVzLnNpemUoKSArIGR1cGVBdHRyR3JvdXBOYW1lcy5zaXplKCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJObyBkdXBsaWNhdGUgbmFtZXMgZm91bmQuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY3JlYXRlIGEgc2NoZW1hIGRvYyBmb3IgZWFjaCBuYW1lc3BhY2UgdG8gYmUgaW1wb3J0ZWQKKyAgICAgICAgTWFwIGNvbW1vbkRvY3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXAgY29tbW9uRmlsZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBpbnQgY291bnQgPSBkdXBlTmFtZXNwYWNlcy5zaXplKCkgPT0gMSA/IDAgOiAxOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkdXBlTmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGNvbW1vbkRvYyA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScvPiIKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7CisgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEZvcm1DaG9pY2UuUVVBTElGSUVEKTsKKyAgICAgICAgICAgIGNvbW1vbkRvY3MucHV0KG5hbWVzcGFjZSwgY29tbW9uRG9jKTsKKyAgICAgICAgICAgIGNvbW1vbkZpbGVzLnB1dChjb21tb25Eb2MsIGNvbW1vbkZpbGVGb3IoY29tbW9uTmFtZSwgbmFtZXNwYWNlLCBjb3VudCsrLCBvdXRkaXIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gcHVsbCBvdXQgYWxsIHRoZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgYW5kIGRyb3AgdGhlbSBpbnRvIHRoZSBmaWxlCisgICAgICAgIC8vIHdlIHJldXNlIHRoZSBlbGVtZW50TmFtZXMgKGV0Yykgc2V0cyB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGRlZmluaXRpb25zCisgICAgICAgIC8vIHdlIGhhdmUgYWxyZWFkeSBpbnNlcnRlZC4KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRG9jcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBkb2MgPSAoU2NoZW1hRG9jdW1lbnQpaS5uZXh0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNvbGxlY3QgdG9nZXRoZXIgbmFtZXMKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCisgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gIiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGNvbW1vbkRvYyA9IChTY2hlbWFEb2N1bWVudCljb21tb25Eb2NzLmdldCh0YXJnZXROYW1lc3BhY2UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBib29sZWFuIG5lZWRJbXBvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFRvcExldmVsQ29tcGxleFR5cGUgY3RbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRDb21wbGV4VHlwZUFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gY3QubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShjdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZVR5cGVOYW1lcykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGN0W2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCB0eXBlTmFtZXMsIGR1cGVUeXBlTmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3Q29tcGxleFR5cGUoKS5zZXQoY3Rbal0pOworICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVDb21wbGV4VHlwZShqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVG9wTGV2ZWxTaW1wbGVUeXBlIHN0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0U2ltcGxlVHlwZUFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoc3Rbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVUeXBlTmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShzdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgdHlwZU5hbWVzLCBkdXBlVHlwZU5hbWVzKSkKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld1NpbXBsZVR5cGUoKS5zZXQoc3Rbal0pOworICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVTaW1wbGVUeXBlKGopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUb3BMZXZlbEVsZW1lbnQgZWxbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWwubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShlbFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUVsZW1lbnROYW1lcykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0RHVwbGljYXRlKGVsW2pdLmdldE5hbWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBlbGVtZW50TmFtZXMsIGR1cGVFbGVtZW50TmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChlbFtqXSk7CisgICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7CisgICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRvcExldmVsQXR0cmlidXRlIGF0W10gPSBkb2MuZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXQubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShhdFtqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUF0dHJpYnV0ZU5hbWVzKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoYXRbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWVzLCBkdXBlQXR0cmlidXRlTmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChhdFtqXSk7CisgICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7CisgICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE5hbWVkR3JvdXAgZ3JbXSA9IGRvYy5nZXRTY2hlbWEoKS5nZXRHcm91cEFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaXNEdXBsaWNhdGUoZ3Jbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGR1cGVNb2RlbEdyb3VwTmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdER1cGxpY2F0ZShncltqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgbW9kZWxHcm91cE5hbWVzLCBkdXBlTW9kZWxHcm91cE5hbWVzKSkKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRG9jLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoZ3Jbal0pOworICAgICAgICAgICAgICAgIG5lZWRJbXBvcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGRvYy5nZXRTY2hlbWEoKS5yZW1vdmVFbGVtZW50KGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGVHcm91cCBhZ1tdID0gZG9jLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWcubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0R1cGxpY2F0ZShhZ1tqXS5nZXROYW1lKCksIHRhcmdldE5hbWVzcGFjZSwgZHVwZUF0dHJHcm91cE5hbWVzKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3REdXBsaWNhdGUoYWdbal0uZ2V0TmFtZSgpLCB0YXJnZXROYW1lc3BhY2UsIGF0dHJHcm91cE5hbWVzLCBkdXBlQXR0ckdyb3VwTmFtZXMpKQorICAgICAgICAgICAgICAgICAgICBjb21tb25Eb2MuZ2V0U2NoZW1hKCkuYWRkTmV3RWxlbWVudCgpLnNldChhZ1tqXSk7CisgICAgICAgICAgICAgICAgbmVlZEltcG9ydCA9IHRydWU7CisgICAgICAgICAgICAgICAgZG9jLmdldFNjaGVtYSgpLnJlbW92ZUVsZW1lbnQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChuZWVkSW1wb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluY2x1ZGVEb2N1bWVudC5JbmNsdWRlIG5ld0luY2x1ZGUgPSBkb2MuZ2V0U2NoZW1hKCkuYWRkTmV3SW5jbHVkZSgpOworICAgICAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gKEZpbGUpc2NoZW1hRG9jcy5nZXQoZG9jKTsKKyAgICAgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBvdXRwdXRGaWxlRm9yKGlucHV0RmlsZSwgYmFzZWRpciwgb3V0ZGlyKTsKKyAgICAgICAgICAgICAgICBGaWxlIGNvbW1vbkZpbGUgPSAoRmlsZSljb21tb25GaWxlcy5nZXQoY29tbW9uRG9jKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG5ld0luY2x1ZGUuc2V0U2NoZW1hTG9jYXRpb24ocmVsYXRpdmVVUklGb3Iob3V0cHV0RmlsZSwgY29tbW9uRmlsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBtYWtlIHRoZSBkaXJlY3RvcnkgZm9yIG91dHB1dAorICAgICAgICBpZiAoIW91dGRpci5pc0RpcmVjdG9yeSgpICYmICFvdXRkaXIubWtkaXJzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIG1ha2VkaXIgIiArIG91dGRpcik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gbm93IHdyaXRlIGFsbCB0aG9zZSBkb2NzIGJhY2sgb3V0LgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFEb2NzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IChTY2hlbWFEb2N1bWVudClpLm5leHQoKTsKKyAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gKEZpbGUpc2NoZW1hRG9jcy5nZXQoZG9jKTsKKyAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG91dHB1dEZpbGVGb3IoaW5wdXRGaWxlLCBiYXNlZGlyLCBvdXRkaXIpOworICAgICAgICAgICAgaWYgKG91dHB1dEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjb3B5ICIgKyBpbnB1dEZpbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRvYy5zYXZlKG91dHB1dEZpbGUsIG5ldyBYbWxPcHRpb25zKCkuc2V0U2F2ZVByZXR0eVByaW50KCkuc2V0U2F2ZUFnZ3Jlc2l2ZU5hbWVzcGFjZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbW1vbkZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYURvY3VtZW50IGRvYyA9IChTY2hlbWFEb2N1bWVudClpLm5leHQoKTsKKyAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IChGaWxlKWNvbW1vbkZpbGVzLmdldChkb2MpOworICAgICAgICAgICAgZG9jLnNhdmUob3V0cHV0RmlsZSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRTYXZlUHJldHR5UHJpbnQoKS5zZXRTYXZlQWdncmVzaXZlTmFtZXNwYWNlcygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBvdXRwdXRGaWxlRm9yKEZpbGUgZmlsZSwgRmlsZSBiYXNlRGlyLCBGaWxlIG91dGRpcikKKyAgICB7CisgICAgICAgIFVSSSBiYXNlID0gYmFzZURpci5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOworICAgICAgICBVUkkgYWJzID0gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOworICAgICAgICBVUkkgcmVsID0gYmFzZS5yZWxhdGl2aXplKGFicyk7CisgICAgICAgIGlmIChyZWwuaXNBYnNvbHV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZWxhdGl2aXplICIgKyBmaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBVUkkgb3V0YmFzZSA9IG91dGRpci50b1VSSSgpOworICAgICAgICBVUkkgb3V0ID0gQ29kZUdlblV0aWwucmVzb2x2ZShvdXRiYXNlLCByZWwpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGNvbW1vbkFuY2VzdG9yKFVSSSBmaXJzdCwgVVJJIHNlY29uZCkKKyAgICB7CisgICAgICAgIFN0cmluZyBmaXJzdFN0ciA9IGZpcnN0LnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBzZWNvbmRTdHIgPSBzZWNvbmQudG9TdHJpbmcoKTsKKyAgICAgICAgaW50IGxlbiA9IGZpcnN0U3RyLmxlbmd0aCgpOworICAgICAgICBpZiAoc2Vjb25kU3RyLmxlbmd0aCgpIDwgbGVuKQorICAgICAgICAgICAgbGVuID0gc2Vjb25kU3RyLmxlbmd0aCgpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlyc3RTdHIuY2hhckF0KGkpICE9IHNlY29uZFN0ci5jaGFyQXQoaSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaSAtPSAxOworICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgaSA9IGZpcnN0U3RyLmxhc3RJbmRleE9mKCcvJywgaSk7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoZmlyc3RTdHIuc3Vic3RyaW5nKDAsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWxhdGl2ZVVSSUZvcihGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpCisgICAgeworICAgICAgICBVUkkgYmFzZSA9IHNvdXJjZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOworICAgICAgICBVUkkgYWJzID0gdGFyZ2V0LmdldEFic29sdXRlRmlsZSgpLnRvVVJJKCk7CisgICAgICAgIC8vIGZpbmQgY29tbW9uIHN1YnN0cmluZy4uLgorICAgICAgICBVUkkgY29tbW9uQmFzZSA9IGNvbW1vbkFuY2VzdG9yKGJhc2UsIGFicyk7CisgICAgICAgIGlmIChjb21tb25CYXNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWJzLnRvU3RyaW5nKCk7CisgICAgICAgIAorICAgICAgICBVUkkgYmFzZXJlbCA9IGNvbW1vbkJhc2UucmVsYXRpdml6ZShiYXNlKTsKKyAgICAgICAgVVJJIHRhcmdldHJlbCA9IGNvbW1vbkJhc2UucmVsYXRpdml6ZShhYnMpOworICAgICAgICBpZiAoYmFzZXJlbC5pc0Fic29sdXRlKCkgfHwgdGFyZ2V0cmVsLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIHJldHVybiBhYnMudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworICAgICAgICBTdHJpbmcgc291cmNlUmVsID0gYmFzZXJlbC50b1N0cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZVJlbC5sZW5ndGgoKTspCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBzb3VyY2VSZWwuaW5kZXhPZignLycsIGkpOworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcHJlZml4ICs9ICIuLi8iOworICAgICAgICAgICAgaSArPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmVmaXggKyB0YXJnZXRyZWwudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjb21tb25GaWxlRm9yKFN0cmluZyBjb21tb25OYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBpbnQgaSwgRmlsZSBvdXRkaXIpCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbW1vbk5hbWU7CisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGluZGV4ID0gY29tbW9uTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBpbmRleCA9IGNvbW1vbk5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICBuYW1lID0gY29tbW9uTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgaSArIGNvbW1vbk5hbWUuc3Vic3RyaW5nKGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEZpbGUob3V0ZGlyLCBuYW1lKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub3RlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IHNlZW4sIFNldCBkdXBlcywgU2V0IGR1cGVOYW1lc3BhY2VzKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKKyAgICAgICAgaWYgKHNlZW4uY29udGFpbnMocU5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBkdXBlcy5hZGQocU5hbWUpOworICAgICAgICAgICAgZHVwZU5hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Vlbi5hZGQocU5hbWUpOworICAgICAgICAKKyAgICB9CisgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGaXJzdER1cGxpY2F0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IG5vdHNlZW4sIFNldCBkdXBlcykKKyAgICB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSk7CisgICAgICAgIGlmIChkdXBlcy5jb250YWlucyhxTmFtZSkgJiYgbm90c2Vlbi5jb250YWlucyhxTmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdHNlZW4ucmVtb3ZlKHFOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0R1cGxpY2F0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU2V0IGR1cGVzKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIChkdXBlcy5jb250YWlucyhxTmFtZSkpOworICAgIH0KKyAgICAgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9JbnN0YW5jZVZhbGlkYXRvci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvSW5zdGFuY2VWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjNkOGJmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvSW5zdGFuY2VWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VWYWxpZGF0b3IKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKKyAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsLmFyZ3MoKS5sZW5ndGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWxpZGF0ZXMgYSBzY2hlbWEgZGVmaW50aW9uIGFuZCBpbnN0YW5jZXMgd2l0aGluIHRoZSBzY2hlbWEuIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB2YWxpZGF0ZSBbc3dpdGNoZXNdIHNjaGVtYS54c2QgaW5zdGFuY2UueG1sIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaGVzOiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWRsICAgIGVuYWJsZSBuZXR3b3JrIGRvd25sb2FkcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1ub3B2ciBkaXNhYmxlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljdGlvbikgcnVsZSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vdXBhIGRpYWJsZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRlaW9uIHJ1bGUiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gZGwgPSAoY2wuZ2V0T3B0KCJkbCIpICE9IG51bGwpOworICAgICAgICBib29sZWFuIG5vcHZyID0gKGNsLmdldE9wdCgibm9wdnIiKSAhPSBudWxsKTsKKyAgICAgICAgYm9vbGVhbiBub3VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7CisgICAgICAgIAorICAgICAgICBGaWxlW10gc2NoZW1hRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54c2QiKTsKKyAgICAgICAgRmlsZVtdIGluc3RhbmNlRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi54bWwiKTsKKyAgICAgICAgCisgICAgICAgIExpc3Qgc2RvY3MgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFGaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2RvY3MuYWRkKAorICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggc2NoZW1hRmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYXMgPSAoWG1sT2JqZWN0W10pc2RvY3MudG9BcnJheShuZXcgWG1sT2JqZWN0WzBdKTsKKworICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHNMb2FkZXI7CisgICAgICAgIENvbGxlY3Rpb24gY29tcEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgWG1sT3B0aW9ucyBzY2hlbWFPcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRFcnJvckxpc3RlbmVyKGNvbXBFcnJvcnMpOworICAgICAgICBpZiAoZGwpCisgICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKKyAgICAgICAgaWYgKG5vcHZyKQorICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9QdnJSdWxlKCk7CisgICAgICAgIGlmIChub3VwYSkKKyAgICAgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZU5vVXBhUnVsZSgpOworICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNMb2FkZXIgPSBYbWxCZWFucy5sb2FkWHNkKHNjaGVtYXMsIHNjaGVtYU9wdGlvbnMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBFcnJvcnMuaXNFbXB0eSgpIHx8ICEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNjaGVtYSBpbnZhbGlkIik7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb21wRXJyb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkubmV4dCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxPYmplY3QgeG9iajsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeG9iaiA9CisgICAgICAgICAgICAgICAgICAgIHNMb2FkZXIucGFyc2UoIGluc3RhbmNlRmlsZXNbaV0sIG51bGwsIChuZXcgWG1sT3B0aW9ucygpKS5zZXRMb2FkTGluZU51bWJlcnMoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiBub3QgbG9hZGFibGU6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgICAgIGlmICh4b2JqLnNjaGVtYVR5cGUoKSA9PSBYbWxPYmplY3QudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiAgIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIERvY3VtZW50IHR5cGUgbm90IGZvdW5kLiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHhvYmoudmFsaWRhdGUobmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykpKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbnN0YW5jZUZpbGVzW2ldICsgIiB2YWxpZC4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5zdGFuY2VGaWxlc1tpXSArICIgTk9UIHZhbGlkLiIpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXQubmV4dCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9QcmV0dHlQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjYzhkMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1ByZXR0eVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFByZXR0eVByaW50ZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJpbmRlbnQiKSk7CisgICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2wuYXJncygpLmxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByZXR0eSBwcmludHMgWE1MIGZpbGVzLiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogeHByZXR0eSBbc3dpdGNoZXNdIGZpbGUueG1sIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaGVzOiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWluZGVudCAjICAgdXNlIHRoZSBnaXZlbiBpbmRlbnQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1saWNlbnNlIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBpbmRlbnRTdHIgPSBjbC5nZXRPcHQoImluZGVudCIpOworICAgICAgICBpbnQgaW5kZW50OworICAgICAgICBpZiAoaW5kZW50U3RyID09IG51bGwpCisgICAgICAgICAgICBpbmRlbnQgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmRlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGVudFN0cik7CisgICAgICAgIAorICAgICAgICBGaWxlW10gZmlsZXMgPSBjbC5nZXRGaWxlcygpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYzsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGVzW2ldLCAobmV3IFhtbE9wdGlvbnMoKSkuc2V0TG9hZExpbmVOdW1iZXJzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihmaWxlc1tpXSArICIgbm90IGxvYWRhYmxlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb2Muc2F2ZShTeXN0ZW0ub3V0LCBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpLnNldFNhdmVQcmV0dHlQcmludEluZGVudChpbmRlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVW5hYmxlIHRvIHByZXR0eSBwcmludCAiICsgZmlsZXNbaV0gKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9SdW5YUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvUnVuWFF1ZXJ5LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuKjsKKworcHVibGljIGNsYXNzIFJ1blhRdWVyeQoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbW1hbmRMaW5lIGNsID0KKyAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZSgKKyAgICAgICAgICAgICAgICBhcmdzLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIG5ldyBTdHJpbmdbXSB7ICJxIiwgInFmIiB9ICkgKTsKKyAgICAgICAgCisgICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1biBhbiBYUXVlcnkgYWdhaW5zdCBhbiBYTUwgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhxdWVyeSBbLXZlcmJvc2VdIFstcHJldHR5XSBbLXEgPHF1ZXJ5PiB8IC1xZiBxdWVyeS54cV0gW2ZpbGUueG1sXSoiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1xIDxxdWVyeT4gdG8gc3BlY2lmeSBhIHF1ZXJ5IG9uIHRoZSBjb21tYW5kLWxpbmUiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIC1xZiA8cXVlcnk+IHRvIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBxdWVyeSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgLXByZXR0eSBwcmV0dHktcHJpbnRzIHRoZSByZXN1bHRzIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAtbGljZW5zZSBwcmludHMgbGljZW5zZSBpbmZvcm1hdGlvbiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgdGhlIHF1ZXJ5IGlzIHJ1biBvbiBlYWNoIFhNTCBmaWxlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiB2ZXJib3NlID0gY2wuZ2V0T3B0KCAidmVyYm9zZSIgKSAhPSBudWxsOworICAgICAgICBib29sZWFuIHByZXR0eSA9IGNsLmdldE9wdCggInByZXR0eSIgKSAhPSBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCBhbmQgY29tcGlsZSB0aGUgcXVlcnkKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGNsLmdldE9wdCggInEiICk7CisgICAgICAgIFN0cmluZyBxdWVyeWZpbGUgPSBjbC5nZXRPcHQoICJxZiIgKTsKKworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCAmJiBxdWVyeWZpbGUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiTm8gcXVlcnkgc3BlY2lmaWVkIiApOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChxdWVyeSAhPSBudWxsICYmIHF1ZXJ5ZmlsZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJTcGVjaWZ5IC1xZiBvciAtcSwgbm90IGJvdGguIiApOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocXVlcnlmaWxlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBxdWVyeUZpbGUgPSBuZXcgRmlsZSggcXVlcnlmaWxlICk7CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggcXVlcnlGaWxlICk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaXMgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gci5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggKGNoYXIpIGNoICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgci5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICBxdWVyeSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkNhbm5vdCByZWFkIHF1ZXJ5IGZpbGU6ICIgKyBlLmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ29tcGlsZSBRdWVyeToiICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIHF1ZXJ5ICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBxdWVyeT0gWG1sQmVhbnMuY29tcGlsZVF1ZXJ5KCBxdWVyeSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBjb21waWxpbmcgcXVlcnk6ICIgKyBlLmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBHZXQgdGhlIGluc3RhbmNlCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBGaWxlW10gZmlsZXMgPSBjbC5nZXRGaWxlcygpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IHg7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSggZmlsZXNbaV0gKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBpcy5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoIGNoICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggZmlsZXNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIHBhcnNpbmcgaW5zdGFuY2U6ICIgKyBlLmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXhlY3V0aW5nIFF1ZXJ5Li4uIiApOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgWG1sT2JqZWN0W10gcmVzdWx0ID0gbnVsbDsKKyAgICAKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHguZXhlY1F1ZXJ5KCBxdWVyeSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3IgZXhlY3V0aW5nIHF1ZXJ5OiAiICsgZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJRdWVyeSBSZXN1bHQ6IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBYbWxPcHRpb25zIG9wdHMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgb3B0cy5zZXRTYXZlT3V0ZXIoKTsKKyAgICAgICAgICAgIGlmIChwcmV0dHkpCisgICAgICAgICAgICAgICAgb3B0cy5zZXRTYXZlUHJldHR5UHJpbnQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2pdLnNhdmUoIFN5c3RlbS5vdXQsIG9wdHMgKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb2RlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2Mzc0YQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYUNvZGVHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWG1sRXJyb3JXYXRjaGVyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUNvZGVQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOworCitpbXBvcnQgcmVwYWNrYWdlLlJlcGFja2FnZXI7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFDb2RlR2VuZXJhdG9yCit7CisgICAgLy8gaW5wdXQgZGlyZWN0b3J5LCBvdXRwdXQgZGlyIGZpbGVuYW1lCisgICAgLy8gdG9kbzogb3V0cHV0IGphcgorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21waWxlVHlwZVN5c3RlbShTY2hlbWFUeXBlU3lzdGVtIHNhdmVyLCBGaWxlIHNvdXJjZWRpciwgRmlsZVtdIGphdmFzcmMsIE1hcCBzb3VyY2VzVG9Db3B5TWFwLCBGaWxlW10gY2xhc3NwYXRoLCBGaWxlIGNsYXNzZXNkaXIsIEZpbGUgb3V0cHV0SmFyLCBib29sZWFuIG5vamF2YWMsIGJvb2xlYW4gamF4YiwgWG1sRXJyb3JXYXRjaGVyIGVycm9ycywgU3RyaW5nIHJlcGFja2FnZSwgYm9vbGVhbiB2ZXJib3NlLCBMaXN0IHNvdXJjZWZpbGVzICkKKyAgICB7CisKKyAgICAgICAgaWYgKHNvdXJjZWRpciA9PSBudWxsIHx8IGNsYXNzZXNkaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNvdXJjZSBhbmQgY2xhc3MgZ2VuIGRpciBtdXN0IG5vdCBiZSBudWxsLiIpOworCisgICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9IGZhbHNlOworCisgICAgICAgIHNhdmVyLnNhdmVUb0RpcmVjdG9yeShjbGFzc2VzZGlyKTsKKworICAgICAgICAvLyBTYXZlIHRoZSBzY2hlbWEgc291cmNlcyB0byB0aGUgY2xhc3NlcyBkaXJlY3RvcnkKKyAgICAgICAgaWYgKChzb3VyY2VzVG9Db3B5TWFwICE9IG51bGwpICYmIChzb3VyY2VzVG9Db3B5TWFwLnNpemUoKSA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIHNjaGVtYXNkaXIgPSBjcmVhdGVEaXIoY2xhc3Nlc2RpciwgInNjaGVtYS9zcmMiKTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc291cmNlc1RvQ29weU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaXRlci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGtleSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFsb2NhdGlvbiA9IChTdHJpbmcpc291cmNlc1RvQ29weU1hcC5nZXQoa2V5KTsKKworICAgICAgICAgICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShzY2hlbWFzZGlyLCBzY2hlbWFsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUodGFyZ2V0RmlsZS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURpcihwYXJlbnREaXIsIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIGZpbGUgZnJvbSBmaWxlcGF0aCB0byBzY2hlbWEvc3JjLzxzY2hlbWFGaWxlPgorICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoc2NoZW1hc2Rpciwgc2NoZW1hbG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgSU9VdGlsLmNvcHlDb21wbGV0ZWx5KGluLCBvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOworICAgICAgICAgICAgICAgICAgICAvLyBmYWlsdXJlID0gdHJ1ZTsgLSBub3QgY2F1c2UgZm9yIGZhaWx1cmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBSZXBhY2thZ2VyIHJlcGFja2FnZXIgPSByZXBhY2thZ2UgPT0gbnVsbCA/IG51bGwgOiBuZXcgUmVwYWNrYWdlciggcmVwYWNrYWdlICk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFNjaGVtYVR5cGVDb2RlUHJpbnRlci5pbmRleENsYXNzRm9yU3lzdGVtKHNhdmVyKS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSI7CisgICAgICAgICAgICBGaWxlIHNvdXJjZWZpbGUgPSBuZXcgRmlsZShzb3VyY2VkaXIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0KKyAgICAgICAgICAgICAgICByZXBhY2thZ2VyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyAoV3JpdGVyKSBuZXcgRmlsZVdyaXRlciggc291cmNlZmlsZSApCisgICAgICAgICAgICAgICAgICAgIDogKFdyaXRlcikgbmV3IFJlcGFja2FnaW5nV3JpdGVyKCBzb3VyY2VmaWxlLCByZXBhY2thZ2VyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTY2hlbWFUeXBlQ29kZVByaW50ZXIucHJpbnRMb2FkZXIod3JpdGVyLCBzYXZlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGQoc291cmNlZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOworICAgICAgICAgICAgZmFpbHVyZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBqYXhiKQorICAgICAgICAgICAgZmFpbHVyZSAmPSBnZW5UeXBlcyhzYXZlciwgc291cmNlZmlsZXMsIHNvdXJjZWRpciwgcmVwYWNrYWdlciwgdmVyYm9zZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhaWx1cmUgJj0gamF4YkNvZGVHZW5lcmF0b3Ioc2F2ZXIsIHNvdXJjZWZpbGVzLCBzb3VyY2VkaXIsIGNsYXNzZXNkaXIsIGVycm9ycyk7CisKKyAgICAgICAgaWYgKGZhaWx1cmUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZW5UeXBlcyhTY2hlbWFUeXBlU3lzdGVtIHNhdmVyLCBMaXN0IHNvdXJjZWZpbGVzLCBGaWxlIHNvdXJjZWRpciwgUmVwYWNrYWdlciByZXBhY2thZ2VyLCBib29sZWFuIHZlcmJvc2UpCisgICAgeworICAgICAgICBib29sZWFuIGZhaWx1cmUgPSBmYWxzZTsKKworICAgICAgICBMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzYXZlci5nbG9iYWxUeXBlcygpKSk7CisgICAgICAgIHR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNhdmVyLmRvY3VtZW50VHlwZXMoKSkpOworICAgICAgICB0eXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzYXZlci5hdHRyaWJ1dGVUeXBlcygpKSk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gdHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gKFNjaGVtYVR5cGUpaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvbXBpbGluZyB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzQnVpbHRpblR5cGUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh0eXBlLmdldEZ1bGxKYXZhTmFtZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBmam4gPSB0eXBlLmdldEZ1bGxKYXZhTmFtZSgpOworCisgICAgICAgICAgICBpZiAoZmpuLmluZGV4T2YoJyQnKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmpuID0KKyAgICAgICAgICAgICAgICAgICAgZmpuLnN1YnN0cmluZyggMCwgZmpuLmxhc3RJbmRleE9mKCAnLicgKSApICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZqbi5zdWJzdHJpbmcoIGZqbi5pbmRleE9mKCAnJCcgKSArIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmpuLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgc291cmNlZmlsZSA9IG5ldyBGaWxlKHNvdXJjZWRpciwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHNvdXJjZWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZWQgIiArIHNvdXJjZWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIHdyaXRlciA9CisgICAgICAgICAgICAgICAgICAgIHJlcGFja2FnZXIgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyAoV3JpdGVyKSBuZXcgRmlsZVdyaXRlciggc291cmNlZmlsZSApCisgICAgICAgICAgICAgICAgICAgICAgICA6IChXcml0ZXIpIG5ldyBSZXBhY2thZ2luZ1dyaXRlciggc291cmNlZmlsZSwgcmVwYWNrYWdlciApOworICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgU2NoZW1hVHlwZUNvZGVQcmludGVyLnByaW50VHlwZSh3cml0ZXIsIHR5cGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVzLmFkZChzb3VyY2VmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOworICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgSW1wbGVtZW50YXRpb24gY2xhc3MKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHR5cGUuZ2V0RnVsbEphdmFJbXBsTmFtZSgpLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIjsKKyAgICAgICAgICAgICAgICBGaWxlIGltcGxGaWxlID0gbmV3IEZpbGUoc291cmNlZGlyLCAgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNyZWF0ZWQgIiArIGltcGxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBpbXBsRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB3cml0ZXIgPQorICAgICAgICAgICAgICAgICAgICByZXBhY2thZ2VyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gKFdyaXRlcikgbmV3IEZpbGVXcml0ZXIoIGltcGxGaWxlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKFdyaXRlcikgbmV3IFJlcGFja2FnaW5nV3JpdGVyKCBpbXBsRmlsZSwgcmVwYWNrYWdlciApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludFR5cGVJbXBsKHdyaXRlciwgdHlwZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc291cmNlZmlsZXMuYWRkKGltcGxGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiSU8gRXJyb3IgIiArIGUpOworICAgICAgICAgICAgICAgIGZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsgaWYgKHdyaXRlciAhPSBudWxsKSB3cml0ZXIuY2xvc2UoKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWlsdXJlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpheGJDb2RlR2VuZXJhdG9ySG9sZGVyCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2pheGJDb2RlR2VuZXJhdG9yTWV0aG9kID0gYnVpbGRKYXhiQ29kZUdlbmVyYXRvck1ldGhvZCgpOworICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgYnVpbGRKYXhiQ29kZUdlbmVyYXRvck1ldGhvZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuamF4Yi5jb21waWxlci5KYXhiQ29kZUdlbmVyYXRvciIsIGZhbHNlLCBTY2hlbWFDb2RlR2VuZXJhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImNvbXBpbGUiLCBuZXcgQ2xhc3NbXSB7U2NoZW1hVHlwZVN5c3RlbS5jbGFzcywgTGlzdC5jbGFzcywgRmlsZS5jbGFzcywgRmlsZS5jbGFzcywgWG1sRXJyb3JXYXRjaGVyLmNsYXNzIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9ICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBKYXhiQ29kZUdlbmVyYXRvcjogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGpheGJDb2RlR2VuZXJhdG9yKFNjaGVtYVR5cGVTeXN0ZW0gc2F2ZXIsIExpc3Qgc291cmNlZmlsZXMsIEZpbGUgc291cmNlZGlyLCBGaWxlIGNsYXNzZXNkaXIsIFhtbEVycm9yV2F0Y2hlciBlcnJvcnMpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbilKYXhiQ29kZUdlbmVyYXRvckhvbGRlci5famF4YkNvZGVHZW5lcmF0b3JNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHNhdmVyLCBzb3VyY2VmaWxlcywgc291cmNlZGlyLCBjbGFzc2VzZGlyLCBlcnJvcnMgfSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgZTIuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgZTI7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlMi5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB0aHJvdyBlMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgRmlsZSBjcmVhdGVEaXIoRmlsZSByb290ZGlyLCBTdHJpbmcgc3ViZGlyKQorICAgIHsKKyAgICAgICAgRmlsZSBuZXdkaXIgPSAoc3ViZGlyID09IG51bGwpID8gcm9vdGRpciA6IG5ldyBGaWxlKHJvb3RkaXIsIHN1YmRpcik7CisgICAgICAgIGJvb2xlYW4gY3JlYXRlZCA9IChuZXdkaXIuZXhpc3RzKCkgJiYgbmV3ZGlyLmlzRGlyZWN0b3J5KCkpIHx8IG5ld2Rpci5ta2RpcnMoKTsKKyAgICAgICAgYXNzZXJ0KGNyZWF0ZWQpIDogIkNvdWxkIG5vdCBjcmVhdGUgIiArIG5ld2Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgcmV0dXJuIG5ld2RpcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEZpbGUgY3JlYXRlVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSB0bXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgieGJlYW4iLCBudWxsKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSB0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi50bXAiKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3I6IGNyZWF0ZVRlbXBGaWxlIGRpZCBub3QgY3JlYXRlIGEgZmlsZSBlbmRpbmcgd2l0aCAudG1wIik7CisgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gNCk7CisgICAgICAgIEZpbGUgdG1wU3JjRGlyID0gbnVsbDsKKworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhdGggKyAiLmQiICsgKGNvdW50ID09IDAgPyAiIiA6IEludGVnZXIudG9TdHJpbmcoY291bnQrKykpOworCisgICAgICAgICAgICB0bXBTcmNEaXIgPSBuZXcgRmlsZShuYW1lKTsKKworICAgICAgICAgICAgaWYgKCF0bXBTcmNEaXIuZXhpc3RzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gdG1wU3JjRGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgIGFzc2VydCBjcmVhdGVkIDogIkNvdWxkIG5vdCBjcmVhdGUgIiArIHRtcFNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0bXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworCisgICAgICAgIHJldHVybiB0bXBTcmNEaXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRyeUhhcmRUb0RlbGV0ZShGaWxlIGRpcikKKyAgICB7CisgICAgICAgIHRyeVRvRGVsZXRlKGRpcik7CisgICAgICAgIGlmIChkaXIuZXhpc3RzKCkpCisgICAgICAgICAgICB0cnlUb0RlbGV0ZUxhdGVyKGRpcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0cnlUb0RlbGV0ZShGaWxlIGRpcikKKyAgICB7CisgICAgICAgIGlmIChkaXIuZXhpc3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBsaXN0ID0gZGlyLmxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHRyeVRvRGVsZXRlKG5ldyBGaWxlKGRpciwgbGlzdFtpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkaXIuZGVsZXRlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBkb24ndCB0cnkgdmVyeSBoYXJkLCBiZWNhdXNlIHdlJ3JlIGp1c3QgZGVsZXRpbmcgdG1wCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGRlbGV0ZUZpbGVRdWV1ZSA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRyaWVzUmVtYWluaW5nID0gMDsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeU5vd1RoYXRJdHNMYXRlcigpCisgICAgeworICAgICAgICBMaXN0IGZpbGVzOworICAgICAgICAKKyAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVzID0gbmV3IEFycmF5TGlzdChkZWxldGVGaWxlUXVldWUpOworICAgICAgICAgICAgZGVsZXRlRmlsZVF1ZXVlLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIExpc3QgcmV0cnkgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSlpLm5leHQoKTsKKyAgICAgICAgICAgIHRyeVRvRGVsZXRlKGZpbGUpOworICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgcmV0cnkuYWRkKGZpbGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzeW5jaHJvbml6ZWQgKGRlbGV0ZUZpbGVRdWV1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nID4gMCkKKyAgICAgICAgICAgICAgICB0cmllc1JlbWFpbmluZyAtPSAxOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHRyaWVzUmVtYWluaW5nIDw9IDAgfHwgcmV0cnkuc2l6ZSgpID09IDApIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5hZGRBbGwocmV0cnkpOyAvLyB0cnkgYWdhaW4/CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiAodHJpZXNSZW1haW5pbmcgPD0gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnaXZlVXAoKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChkZWxldGVGaWxlUXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGV0ZUZpbGVRdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgdHJpZXNSZW1haW5pbmcgPSAwOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJ5VG9EZWxldGVMYXRlcihGaWxlIGRpcikKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoZGVsZXRlRmlsZVF1ZXVlKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGVGaWxlUXVldWUuYWRkKGRpcik7CisgICAgICAgICAgICBpZiAodHJpZXNSZW1haW5pbmcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGVhdHMgdHJ5Tm93IHVudGlsIHRyaWVzUmVtYWluaW5nID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5Tm93VGhhdEl0c0xhdGVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2NlZWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCAqIDMpOyAvLyB3YWl0IHRocmVlIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlVXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0cmllc1JlbWFpbmluZyA8IDEwKQorICAgICAgICAgICAgICAgIHRyaWVzUmVtYWluaW5nID0gMTA7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgc3RhdGljIGNsYXNzIFJlcGFja2FnaW5nV3JpdGVyIGV4dGVuZHMgU3RyaW5nV3JpdGVyCisgICAgeworICAgICAgICBwdWJsaWMgUmVwYWNrYWdpbmdXcml0ZXIgKCBGaWxlIGZpbGUsIFJlcGFja2FnZXIgcmVwYWNrYWdlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9maWxlID0gZmlsZTsKKyAgICAgICAgICAgIF9yZXBhY2thZ2VyID0gcmVwYWNrYWdlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gZ2V0QnVmZmVyKCk7CisKKyAgICAgICAgICAgIF9yZXBhY2thZ2VyLnJlcGFja2FnZSggc2IgKTsKKworICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKCBfZmlsZSApOworICAgICAgICAgICAgZncud3JpdGUoIHNiLnRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZpbGUgX2ZpbGU7CisgICAgICAgIHByaXZhdGUgUmVwYWNrYWdlciBfcmVwYWNrYWdlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEwYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDkzMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVTeXN0ZW1Db21waWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlBhdGhSZXNvdXJjZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlJlc291cmNlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU3RzY1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZUxvYWRlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvclByaW50ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvcldhdGNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxFcnJvckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxMaXN0SW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OworCitwdWJsaWMgY2xhc3MgU2NoZW1hQ29tcGlsZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGlsZXMgYSBzY2hlbWEgaW50byBYTUwgQmVhbiBjbGFzc2VzIGFuZCBtZXRhZGF0YS4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHNjb21wIFtvcHRzXSBbZGlyc10qIFtzY2hlbWEueHNkXSogW3NlcnZpY2Uud3NkbF0qIFtjb25maWcueHNkY29uZmlnXSoiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3B0aW9ucyBpbmNsdWRlOiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWNwIFthO2I7Y10gLSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kIFtkaXJdIC0gdGFyZ2V0IGJpbmFyeSBkaXJlY3RvcnkgZm9yIC5jbGFzcyBhbmQgLnhzYiBmaWxlcyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXNyYyBbZGlyXSAtIHRhcmdldCBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCAuamF2YSBmaWxlcyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXNyY29ubHkgLSBkbyBub3QgY29tcGlsZSAuamF2YSBmaWxlcyBvciBqYXIgdGhlIG91dHB1dC4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1vdXQgW3Jlc3VsdC5qYXJdIC0gdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBqYXIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1kbCAtIHBlcm1pdCBuZXR3b3JrIGRvd25sb2FkcyBmb3IgaW1wb3J0cyBhbmQgaW5jbHVkZXMgKGRlZmF1bHQgaXMgb2ZmKSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLW5vdXBhIC0gZG8gbm90IGVuZm9yY2UgdGhlIHVuaXF1ZSBwYXJ0aWNsZSBhdHRyaWJ1dGlvbiBydWxlIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbm9wdnIgLSBkbyBub3QgZW5mb3JjZSB0aGUgcGFydGljbGUgdmFsaWQgKHJlc3RyaWN0aW9uKSBydWxlIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtY29tcGlsZXIgLSBwYXRoIHRvIGV4dGVybmFsIGphdmEgY29tcGlsZXIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1qYXIgLSBwYXRoIHRvIGphciB1dGlsaXR5Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbXMgLSBpbml0aWFsIG1lbW9yeSBmb3IgZXh0ZXJuYWwgamF2YSBjb21waWxlciAoZGVmYXVsdCAnIiArIENvZGVHZW5VdGlsLkRFRkFVTFRfTUVNX1NUQVJUICsgIicpIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbXggLSBtYXhpbXVtIG1lbW9yeSBmb3IgZXh0ZXJuYWwgamF2YSBjb21waWxlciAoZGVmYXVsdCAnIiArIENvZGVHZW5VdGlsLkRFRkFVTFRfTUVNX01BWCArICInKSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWRlYnVnIC0gY29tcGlsZSB3aXRoIGRlYnVnIHN5bWJvbHMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC1xdWlldCAtIHByaW50IGZld2VyIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC12ZXJib3NlIC0gcHJpbnQgbW9yZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtbGljZW5zZSAtIHByaW50cyBsaWNlbnNlIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtYWxsb3dtZGVmIFwiW25zXSBbbnNdIFtuc11cIiAtIGlnbm9yZXMgbXVsdGlwbGUgZGVmcyBpbiBnaXZlbiBuYW1lc3BhY2VzIik7CisgICAgICAgICAgICAvKiBVbmRvY3VtZW50ZWQgZmVhdHVyZSAtIHBhc3MgaW4gb25lIHNjaGVtYSBjb21waWxlciBleHRlbnNpb24gYW5kIHJlbGF0ZWQgcGFyYW1ldGVycworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLXJlcGFja2FnZSAtIHJlcGFja2FnZSBzcGVjaWZpY2F0aW9uIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtZXh0ZW5zaW9uIC0gcmVnaXN0ZXJzIGEgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLWV4dGVuc2lvblBhcm1zIC0gc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcGlsZXIgZXh0ZW5zaW9uIik7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklmIHlvdSByZXF1aXJlIGEgZGlmZmVyZW50IGphdmEgY29tcGlsZXIsIHVzZSB0aGUgWE1MQmVhbiBBbnQgdGFzayBpbnN0ZWFkLiIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXQgb3B0cyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIG9wdHMuYWRkKCJvdXQiKTsKKyAgICAgICAgb3B0cy5hZGQoIm5hbWUiKTsKKyAgICAgICAgb3B0cy5hZGQoInNyYyIpOworICAgICAgICBvcHRzLmFkZCgiZCIpOworICAgICAgICBvcHRzLmFkZCgiY3AiKTsKKyAgICAgICAgb3B0cy5hZGQoImNvbXBpbGVyIik7CisgICAgICAgIG9wdHMuYWRkKCJqYXIiKTsKKyAgICAgICAgb3B0cy5hZGQoIm1zIik7CisgICAgICAgIG9wdHMuYWRkKCJteCIpOworICAgICAgICBvcHRzLmFkZCgicmVwYWNrYWdlIik7CisgICAgICAgIG9wdHMuYWRkKCJleHRlbnNpb24iKTsKKyAgICAgICAgb3B0cy5hZGQoImV4dGVuc2lvblBhcm1zIik7CisgICAgICAgIG9wdHMuYWRkKCJhbGxvd21kZWYiKTsKKyAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgb3B0cyk7CisKKyAgICAgICAgaWYgKGNsLmdldE9wdCgibGljZW5zZSIpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbW1hbmRMaW5lLnByaW50TGljZW5zZSgpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhcmdzID0gY2wuYXJncygpOworICAgICAgICBib29sZWFuIHZlcmJvc2UgPSAoY2wuZ2V0T3B0KCJ2ZXJib3NlIikgIT0gbnVsbCk7CisgICAgICAgIGJvb2xlYW4gcXVpZXQgPSAoY2wuZ2V0T3B0KCJxdWlldCIpICE9IG51bGwpOworICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgIHF1aWV0ID0gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dGZpbGVuYW1lID0gY2wuZ2V0T3B0KCJvdXQiKTsKKworICAgICAgICBTdHJpbmcgcmVwYWNrYWdlID0gY2wuZ2V0T3B0KCJyZXBhY2thZ2UiKTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGNsLmdldE9wdCgibmFtZSIpOworCisgICAgICAgIGJvb2xlYW4gZG93bmxvYWQgPSAoY2wuZ2V0T3B0KCJkbCIpICE9IG51bGwpOworICAgICAgICBib29sZWFuIG5vVXBhID0gKGNsLmdldE9wdCgibm91cGEiKSAhPSBudWxsKTsKKyAgICAgICAgYm9vbGVhbiBub1B2ciA9IChjbC5nZXRPcHQoIm5vcHZyIikgIT0gbnVsbCk7CisgICAgICAgIGJvb2xlYW4gbm9qYXZhYyA9IChjbC5nZXRPcHQoInNyY29ubHkiKSAhPSBudWxsKTsKKyAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IChjbC5nZXRPcHQoImRlYnVnIikgIT0gbnVsbCk7CisgICAgICAgIGJvb2xlYW4gamF4YiA9IChjbC5nZXRPcHQoImpheGIiKSAhPSBudWxsKTsKKworICAgICAgICBTdHJpbmcgYWxsb3dtZGVmID0gY2wuZ2V0T3B0KCJhbGxvd21kZWYiKTsKKyAgICAgICAgU2V0IG1kZWZOYW1lc3BhY2VzID0gKGFsbG93bWRlZiA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUIDoKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFhtbExpc3RJbXBsLnNwbGl0X2xpc3QoYWxsb3dtZGVmKSkpKTsKKworICAgICAgICBMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChjbC5nZXRPcHQoImV4dGVuc2lvbiIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7CisgICAgICAgICAgICAgICAgZS5zZXRDbGFzc05hbWUoQ2xhc3MuZm9yTmFtZShjbC5nZXRPcHQoImV4dGVuc2lvbiIpLCBmYWxzZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSkpOworICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgZmluZCBleHRlbnNpb24gY2xhc3M6ICIgKyBjbC5nZXRPcHQoImV4dGVuc2lvbiIpICsgIiAgSXMgaXQgb24geW91ciBjbGFzc3BhdGg/Iik7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBleGFtcGxlOiAtZXh0ZW5zaW9uUGFybXMgdHlwZU1hcHBpbmdGaWxlTG9jYXRpb249ZDpcdHlwZXMKKyAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImV4dGVuc2lvblBhcm1zIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlID0gKEV4dGVuc2lvbikgZXh0ZW5zaW9ucy5nZXQoMCk7CisgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uUGFybXMgYXJlIGRlbGltaXRlZCBieSAnOycKKyAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFybVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2wuZ2V0T3B0KCJleHRlbnNpb25QYXJtcyIpLCAiOyIpOworICAgICAgICAgICAgICAgIHdoaWxlIChwYXJtVG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbmFtZSB2YWx1ZSBwYWlyIGZvciBlYWNoIGV4dGVuc2lvbiBwYXJtcyBhbmQgc3RpY2sgaW50byBleHRlbnNpb24gcGFybXMKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG52UGFpciA9IHBhcm1Ub2tlbnMubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG52UGFpci5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXh0ZW5zaW9uUGFybXMgc2hvdWxkIGJlIG5hbWU9dmFsdWU7bmFtZT12YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG4gPSBudlBhaXIuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBudlBhaXIuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbi5QYXJhbSBwYXJhbSA9IGUuY3JlYXRlUGFyYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0TmFtZShuKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGNsYXNzZXNkaXIgPSBjbC5nZXRPcHQoImQiKTsKKyAgICAgICAgRmlsZSBjbGFzc2VzID0gbnVsbDsKKyAgICAgICAgaWYgKGNsYXNzZXNkaXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsYXNzZXMgPSBuZXcgRmlsZShjbGFzc2VzZGlyKTsKKworICAgICAgICBTdHJpbmcgc3JjZGlyID0gY2wuZ2V0T3B0KCJzcmMiKTsKKyAgICAgICAgRmlsZSBzcmMgPSBudWxsOworICAgICAgICBpZiAoc3JjZGlyICE9IG51bGwpCisgICAgICAgICAgICBzcmMgPSBuZXcgRmlsZShzcmNkaXIpOworICAgICAgICBpZiAobm9qYXZhYyAmJiBzcmNkaXIgPT0gbnVsbCAmJiBjbGFzc2VzICE9IG51bGwpCisgICAgICAgICAgICBzcmMgPSBjbGFzc2VzOworCisgICAgICAgIC8vIGNyZWF0ZSB0ZW1wIGRpcmVjdG9yeQorICAgICAgICBGaWxlIHRlbXBkaXIgPSBudWxsOworICAgICAgICBpZiAoc3JjID09IG51bGwgfHwgY2xhc3NlcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVUZW1wRGlyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgY3JlYXRpbmcgdGVtcCBkaXIgIiArIGUpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRmlsZSBqYXJmaWxlID0gbnVsbDsKKyAgICAgICAgaWYgKG91dHB1dGZpbGVuYW1lID09IG51bGwgJiYgY2xhc3NlcyA9PSBudWxsICYmICFub2phdmFjKQorICAgICAgICAgICAgb3V0cHV0ZmlsZW5hbWUgPSAieG1sdHlwZXMuamFyIjsKKyAgICAgICAgaWYgKG91dHB1dGZpbGVuYW1lICE9IG51bGwpCisgICAgICAgICAgICBqYXJmaWxlID0gbmV3IEZpbGUob3V0cHV0ZmlsZW5hbWUpOworCisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHNyYyA9IFNjaGVtYUNvZGVHZW5lcmF0b3IuY3JlYXRlRGlyKHRlbXBkaXIsICJzcmMiKTsKKyAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGNsYXNzZXMgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0ZW1wZGlyLCAiY2xhc3NlcyIpOworCisgICAgICAgIEZpbGVbXSBjbGFzc3BhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgY3BTdHJpbmcgPSBjbC5nZXRPcHQoImNwIik7CisgICAgICAgIGlmIChjcFN0cmluZyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdbXSBjcHBhcnRzID0gY3BTdHJpbmcuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgIExpc3QgY3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcHBhcnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGNwTGlzdC5hZGQobmV3IEZpbGUoY3BwYXJ0c1tpXSkpOworICAgICAgICAgICAgY2xhc3NwYXRoID0gKEZpbGVbXSljcExpc3QudG9BcnJheShuZXcgRmlsZVtjcExpc3Quc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBDb2RlR2VuVXRpbC5zeXN0ZW1DbGFzc3BhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb21waWxlciA9IGNsLmdldE9wdCgiY29tcGlsZXIiKTsKKyAgICAgICAgU3RyaW5nIGphciA9IGNsLmdldE9wdCgiamFyIik7CisKKyAgICAgICAgU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplID0gY2wuZ2V0T3B0KCJtcyIpOworICAgICAgICBTdHJpbmcgbWVtb3J5TWF4aW11bVNpemUgPSBjbC5nZXRPcHQoIm14Iik7CisKKyAgICAgICAgRmlsZVtdIHhzZEZpbGVzID0gY2wuZmlsZXNFbmRpbmdXaXRoKCIueHNkIik7CisgICAgICAgIEZpbGVbXSB3c2RsRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi53c2RsIik7CisgICAgICAgIEZpbGVbXSBqYXZhRmlsZXMgPSBjbC5maWxlc0VuZGluZ1dpdGgoIi5qYXZhIik7CisgICAgICAgIEZpbGVbXSBjb25maWdGaWxlcyA9IGNsLmZpbGVzRW5kaW5nV2l0aCgiLnhzZGNvbmZpZyIpOworCisgICAgICAgIGlmICh4c2RGaWxlcy5sZW5ndGggKyB3c2RsRmlsZXMubGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGZpbmQgYW55IHhzZCBvciB3c2RsIGZpbGVzIHRvIHByb2Nlc3MuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGJhc2VEaXIgPSBjbC5nZXRCYXNlRGlyKCk7CisgICAgICAgIFVSSSBiYXNlVVJJID0gYmFzZURpciA9PSBudWxsID8gbnVsbCA6IGJhc2VEaXIudG9VUkkoKTsKKworICAgICAgICBYbWxFcnJvclByaW50ZXIgZXJyID0gbmV3IFhtbEVycm9yUHJpbnRlcih2ZXJib3NlLCBiYXNlVVJJKTsKKworICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRCYXNlRGlyKGJhc2VEaXIpOworICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMoeHNkRmlsZXMpOworICAgICAgICBwYXJhbXMuc2V0V3NkbEZpbGVzKHdzZGxGaWxlcyk7CisgICAgICAgIHBhcmFtcy5zZXRKYXZhRmlsZXMoamF2YUZpbGVzKTsKKyAgICAgICAgcGFyYW1zLnNldENvbmZpZ0ZpbGVzKGNvbmZpZ0ZpbGVzKTsKKyAgICAgICAgcGFyYW1zLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKGphcmZpbGUpOworICAgICAgICBwYXJhbXMuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgcGFyYW1zLnNldFNyY0RpcihzcmMpOworICAgICAgICBwYXJhbXMuc2V0Q2xhc3Nlc0RpcihjbGFzc2VzKTsKKyAgICAgICAgcGFyYW1zLnNldENvbXBpbGVyKGNvbXBpbGVyKTsKKyAgICAgICAgcGFyYW1zLnNldEphcihqYXIpOworICAgICAgICBwYXJhbXMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOworICAgICAgICBwYXJhbXMuc2V0TWVtb3J5TWF4aW11bVNpemUobWVtb3J5TWF4aW11bVNpemUpOworICAgICAgICBwYXJhbXMuc2V0Tm9qYXZhYyhub2phdmFjKTsKKyAgICAgICAgcGFyYW1zLnNldFF1aWV0KHF1aWV0KTsKKyAgICAgICAgcGFyYW1zLnNldFZlcmJvc2UodmVyYm9zZSk7CisgICAgICAgIHBhcmFtcy5zZXREb3dubG9hZChkb3dubG9hZCk7CisgICAgICAgIHBhcmFtcy5zZXROb1VwYShub1VwYSk7CisgICAgICAgIHBhcmFtcy5zZXROb1B2cihub1B2cik7CisgICAgICAgIHBhcmFtcy5zZXREZWJ1ZyhkZWJ1Zyk7CisgICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycik7CisgICAgICAgIHBhcmFtcy5zZXRSZXBhY2thZ2UocmVwYWNrYWdlKTsKKyAgICAgICAgcGFyYW1zLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7CisgICAgICAgIHBhcmFtcy5zZXRKYXhiKGpheGIpOworICAgICAgICBwYXJhbXMuc2V0TWRlZk5hbWVzcGFjZXMobWRlZk5hbWVzcGFjZXMpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY29tcGlsZShwYXJhbXMpOworCisgICAgICAgIGlmICh0ZW1wZGlyICE9IG51bGwpCisgICAgICAgICAgICBTY2hlbWFDb2RlR2VuZXJhdG9yLnRyeUhhcmRUb0RlbGV0ZSh0ZW1wZGlyKTsKKworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworCisgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVycworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7CisgICAgICAgIHByaXZhdGUgRmlsZVtdIHhzZEZpbGVzOworICAgICAgICBwcml2YXRlIEZpbGVbXSB3c2RsRmlsZXM7CisgICAgICAgIHByaXZhdGUgRmlsZVtdIGphdmFGaWxlczsKKyAgICAgICAgcHJpdmF0ZSBGaWxlW10gY29uZmlnRmlsZXM7CisgICAgICAgIHByaXZhdGUgRmlsZVtdIGNsYXNzcGF0aDsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIG91dHB1dEphcjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIHNyY0RpcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIGNsYXNzZXNEaXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplOworICAgICAgICBwcml2YXRlIFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGphcjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5vamF2YWM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBxdWlldDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkb3dubG9hZDsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBub1VwYTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5vUHZyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlcGFja2FnZTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0IGV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gamF4YjsKKyAgICAgICAgcHJpdmF0ZSBTZXQgbWRlZk5hbWVzcGFjZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisKKyAgICAgICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlRGlyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZURpcihGaWxlIGJhc2VEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZURpciA9IGJhc2VEaXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVtdIGdldFhzZEZpbGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHhzZEZpbGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WHNkRmlsZXMoRmlsZVtdIHhzZEZpbGVzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnhzZEZpbGVzID0geHNkRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVtdIGdldFdzZGxGaWxlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3c2RsRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZXMoRmlsZVtdIHdzZGxGaWxlcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy53c2RsRmlsZXMgPSB3c2RsRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVtdIGdldEphdmFGaWxlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXZhRmlsZXMoRmlsZVtdIGphdmFGaWxlcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5qYXZhRmlsZXMgPSBqYXZhRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVtdIGdldENvbmZpZ0ZpbGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0ZpbGVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZXMoRmlsZVtdIGNvbmZpZ0ZpbGVzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmNvbmZpZ0ZpbGVzID0gY29uZmlnRmlsZXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZVtdIGdldENsYXNzcGF0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoRmlsZVtdIGNsYXNzcGF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRKYXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0SmFyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0SmFyKEZpbGUgb3V0cHV0SmFyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm91dHB1dEphciA9IG91dHB1dEphcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFNyY0RpcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzcmNEaXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTcmNEaXIoRmlsZSBzcmNEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbGUgZ2V0Q2xhc3Nlc0RpcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc2VzRGlyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3Nlc0RpcihGaWxlIGNsYXNzZXNEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3Nlc0RpciA9IGNsYXNzZXNEaXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vamF2YWMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbm9qYXZhYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vamF2YWMoYm9vbGVhbiBub2phdmFjKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5vamF2YWMgPSBub2phdmFjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBxdWlldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucXVpZXQgPSBxdWlldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2ZXJib3NlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRvd25sb2FkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG93bmxvYWQoYm9vbGVhbiBkb3dubG9hZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOb1VwYSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBub1VwYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vVXBhKGJvb2xlYW4gbm9VcGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubm9VcGEgPSBub1VwYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm9QdnIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbm9QdnI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROb1B2cihib29sZWFuIG5vUHZyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5vUHZyID0gbm9QdnI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlYnVnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlJbml0aWFsU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZW1vcnlJbml0aWFsU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeUluaXRpYWxTaXplKFN0cmluZyBtZW1vcnlJbml0aWFsU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tZW1vcnlJbml0aWFsU2l6ZSA9IG1lbW9yeUluaXRpYWxTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlNYXhpbXVtU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZW1vcnlNYXhpbXVtU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeU1heGltdW1TaXplKFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tZW1vcnlNYXhpbXVtU2l6ZSA9IG1lbW9yeU1heGltdW1TaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKFN0cmluZyBjb21waWxlcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRKYXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gamFyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SmFyKFN0cmluZyBqYXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuamFyID0gamFyOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRKYXhiKGJvb2xlYW4gamF4YikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5qYXhiID0gamF4YjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEpheGIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5qYXhiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0RXJyb3JMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvckxpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihDb2xsZWN0aW9uIGVycm9yTGlzdGVuZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JMaXN0ZW5lciA9IGVycm9yTGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGFja2FnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXBhY2thZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhY2thZ2UoU3RyaW5nIG5ld1JlcGFja2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwYWNrYWdlID0gbmV3UmVwYWNrYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9ucyhMaXN0IGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0IGdldE1kZWZOYW1lc3BhY2VzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1kZWZOYW1lc3BhY2VzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWRlZk5hbWVzcGFjZXMoU2V0IG1kZWZOYW1lc3BhY2VzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1kZWZOYW1lc3BhY2VzID0gbWRlZk5hbWVzcGFjZXM7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gbG9hZFR5cGVTeXN0ZW0oCisgICAgICAgIFN0cmluZyBuYW1lLCBGaWxlW10geHNkRmlsZXMsCisgICAgICAgIEZpbGVbXSB3c2RsRmlsZXMsIEZpbGVbXSBjb25maWdGaWxlcywgUmVzb3VyY2VMb2FkZXIgY3BSZXNvdXJjZUxvYWRlciwKKyAgICAgICAgYm9vbGVhbiBkb3dubG9hZCwgYm9vbGVhbiBub1VwYSwgYm9vbGVhbiBub1B2ciwgU2V0IG1kZWZOYW1lc3BhY2VzLAorICAgICAgICBGaWxlIGJhc2VEaXIsIE1hcCBzb3VyY2VzVG9Db3B5TWFwLCBDb2xsZWN0aW9uIG91dGVyRXJyb3JMaXN0ZW5lcikKKyAgICB7CisgICAgICAgIFhtbEVycm9yV2F0Y2hlciBlcnJvckxpc3RlbmVyID0gbmV3IFhtbEVycm9yV2F0Y2hlcihvdXRlckVycm9yTGlzdGVuZXIpOworCisgICAgICAgIC8vIEZvciBwYXJzaW5nIFhTRCBhbmQgV1NETCBmaWxlcywgd2Ugc2hvdWxkIHVzZSB0aGUgU2NoZW1hRG9jdW1lbnQKKyAgICAgICAgLy8gY2xhc3Nsb2FkZXIgcmF0aGVyIHRoYW4gdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzbG9hZGVyLiAgVGhpcyBpcworICAgICAgICAvLyBiZWNhdXNlIGluIHNvbWUgc2l0dWF0aW9ucyAoc3VjaCBhcyB3aGVuIGJlaW5nIGludm9rZWQgYnkgYW50CisgICAgICAgIC8vIHVuZGVybmVhdGggdGhlIGlkZSkgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgaXMgcG90ZW50aWFsbHkgd2VpcmQKKyAgICAgICAgLy8gKGJlY2F1c2Ugb2YgdGhlIGRlc2lnbiBvZiBhbnQpLgorCisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMudHlwZUxvYWRlckZvckNsYXNzTG9hZGVyKFNjaGVtYURvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgIC8vIHN0ZXAgMSwgcGFyc2UgYWxsIHRoZSBYU0QgZmlsZXMuCisgICAgICAgIEFycmF5TGlzdCBzY29udGVudGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmICh4c2RGaWxlcyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzZEZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTWVzc2FnZURpZ2VzdCgpOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhNQVBfQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJUyk7CisKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHNjaGVtYWRvYyA9IGxvYWRlci5wYXJzZSh4c2RGaWxlc1tpXSwgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHNjaGVtYWRvYyBpbnN0YW5jZW9mIFNjaGVtYURvY3VtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJEb2N1bWVudCAiICsgeHNkRmlsZXNbaV0gKyAiIGlzIG5vdCBhIHNjaGVtYSBmaWxlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCBzY2hlbWFkb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIkxvYWRpbmcgc2NoZW1hIGZpbGUgIiArIHhzZEZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFkb2MudmFsaWRhdGUob3B0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvbnRlbnRsaXN0LmFkZCgoKFNjaGVtYURvY3VtZW50KXNjaGVtYWRvYykuZ2V0U2NoZW1hKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKGUuZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiQ2Fubm90IGxvYWQgZmlsZSAiICsgeHNkRmlsZXNbaV0gKyAiOiAiICsgZSwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCB4c2RGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RlcCAyLCBwYXJzZSBhbGwgV1NETCBmaWxlcworICAgICAgICBpZiAod3NkbEZpbGVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbEZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW50ZXJuYWwveG1sYmVhbnMvd3NkbHN1YnN0IgorICAgICAgICAgICAgICAgICAgICApKTsKKworCisgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCB3c2RsZG9jID0gbG9hZGVyLnBhcnNlKHdzZGxGaWxlc1tpXSwgbnVsbCwgb3B0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEod3NkbGRvYyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuaW50ZXJuYWwueG1sYmVhbnMud3NkbHN1YnN0LkRlZmluaXRpb25zRG9jdW1lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJEb2N1bWVudCAiICsgd3NkbEZpbGVzW2ldICsgIiBpcyBub3QgYSB3c2RsIGZpbGUiLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHdzZGxkb2MpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c2RsQ29udGFpbnNFbmNvZGVkKHdzZGxkb2MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRXYXJuaW5nKGVycm9yTGlzdGVuZXIsICJUaGUgV1NETCAiICsgd3NkbEZpbGVzW2ldICsgIiB1c2VzIFNPQVAgZW5jb2RpbmcuIFNPQVAgZW5jb2RpbmcgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBsaXRlcmFsIFhNTCBTY2hlbWEuIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCB3c2RsZG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJMb2FkaW5nIHdzZGwgZmlsZSAiICsgd3NkbEZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdFtdIHR5cGVzID0gKChvcmcuYXBhY2hlLmludGVybmFsLnhtbGJlYW5zLndzZGxzdWJzdC5EZWZpbml0aW9uc0RvY3VtZW50KXdzZGxkb2MpLmdldERlZmluaXRpb25zKCkuZ2V0VHlwZXNBcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdHlwZXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hcyA9IHR5cGVzW2pdLnNlbGVjdFBhdGgoImRlY2xhcmUgbmFtZXNwYWNlIHhzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB4czpzY2hlbWEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRXYXJuaW5nKGVycm9yTGlzdGVuZXIsICJUaGUgV1NETCAiICsgd3NkbEZpbGVzW2ldICsgIiBkaWQgbm90IGhhdmUgYW55IHNjaGVtYSBkb2N1bWVudHMgaW4gbmFtZXNwYWNlICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSciLCBYbWxFcnJvckNvbnRleHQuR0VORVJJQ19FUlJPUiwgd3NkbGRvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2NoZW1hcy5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFzW2tdIGluc3RhbmNlb2YgU2NoZW1hRG9jdW1lbnQuU2NoZW1hICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFzW2tdLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29udGVudGxpc3QuYWRkKHNjaGVtYXNba10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEluZm8oZXJyb3JMaXN0ZW5lciwgIlByb2Nlc3NpbmcgIiArIGNvdW50ICsgIiBzY2hlbWEocykgaW4gIiArIHdzZGxGaWxlc1tpXS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3RlbmVyLmFkZChlLmdldEVycm9yKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHNjU3RhdGUuYWRkRXJyb3IoZXJyb3JMaXN0ZW5lciwgIkNhbm5vdCBsb2FkIGZpbGUgIiArIHdzZGxGaWxlc1tpXSArICI6ICIgKyBlLCBYbWxFcnJvckNvbnRleHQuQ0FOTk9UX0xPQURfWFNEX0ZJTEUsIHdzZGxGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gc2RvY3MgPSAoU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10pc2NvbnRlbnRsaXN0LnRvQXJyYXkobmV3IFNjaGVtYURvY3VtZW50LlNjaGVtYVtzY29udGVudGxpc3Quc2l6ZSgpXSk7CisKKyAgICAgICAgLy8gbm93IHRoZSBjb25maWcgZmlsZXMuCisgICAgICAgIEFycmF5TGlzdCBjZG9jbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRmlsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX0xJTkVfTlVNQkVSUyApOworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhNQVBfQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJUyk7CisKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0IGNvbmZpZ2RvYyA9IGxvYWRlci5wYXJzZShjb25maWdGaWxlc1tpXSwgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZ2RvYyBpbnN0YW5jZW9mIENvbmZpZ0RvY3VtZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRFcnJvcihlcnJvckxpc3RlbmVyLCAiRG9jdW1lbnQgIiArIGNvbmZpZ0ZpbGVzW2ldICsgIiBpcyBub3QgYW4geHNkIGNvbmZpZyBmaWxlIiwgWG1sRXJyb3JDb250ZXh0LkNBTk5PVF9MT0FEX1hTRF9GSUxFLCBjb25maWdkb2MpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0c2NTdGF0ZS5hZGRJbmZvKGVycm9yTGlzdGVuZXIsICJMb2FkaW5nIGNvbmZpZyBmaWxlICIgKyBjb25maWdGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnZG9jLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3RlbmVyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RvY2xpc3QuYWRkKCgoQ29uZmlnRG9jdW1lbnQpY29uZmlnZG9jKS5nZXRDb25maWcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZS5nZXRFcnJvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RzY1N0YXRlLmFkZEVycm9yKGVycm9yTGlzdGVuZXIsICJDYW5ub3QgbG9hZCB4c2QgY29uZmlnIGZpbGUgIiArIGNvbmZpZ0ZpbGVzW2ldICsgIjogIiArIGUsIFhtbEVycm9yQ29udGV4dC5DQU5OT1RfTE9BRF9YU0RfQ09ORklHX0ZJTEUsIGNvbmZpZ0ZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10gY2RvY3MgPSAoQ29uZmlnRG9jdW1lbnQuQ29uZmlnW10pY2RvY2xpc3QudG9BcnJheShuZXcgQ29uZmlnRG9jdW1lbnQuQ29uZmlnW2Nkb2NsaXN0LnNpemUoKV0pOworCisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbGlua1RvID0gU2NoZW1hVHlwZUxvYWRlckltcGwuYnVpbGQobnVsbCwgY3BSZXNvdXJjZUxvYWRlciwgbnVsbCk7CisKKyAgICAgICAgVVJJIGJhc2VVUkkgPSBudWxsOworICAgICAgICBpZiAoYmFzZURpciAhPSBudWxsKQorICAgICAgICAgICAgYmFzZVVSSSA9IGJhc2VEaXIudG9VUkkoKTsKKworICAgICAgICBYbWxPcHRpb25zIG9wdHMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICBpZiAoZG93bmxvYWQpCisgICAgICAgICAgICBvcHRzLnNldENvbXBpbGVEb3dubG9hZFVybHMoKTsKKyAgICAgICAgaWYgKG5vVXBhKQorICAgICAgICAgICAgb3B0cy5zZXRDb21waWxlTm9VcGFSdWxlKCk7CisgICAgICAgIGlmIChub1B2cikKKyAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZU5vUHZyUnVsZSgpOworICAgICAgICBpZiAobWRlZk5hbWVzcGFjZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIG9wdHMuc2V0Q29tcGlsZU1kZWZOYW1lc3BhY2VzKG1kZWZOYW1lc3BhY2VzKTsKKyAgICAgICAgb3B0cy5zZXRDb21waWxlTm9WYWxpZGF0aW9uKCk7IC8vIGFscmVhZHkgdmFsaWRhdGVkIGhlcmUKKworICAgICAgICAvLyBub3cgcGFzcyBpdCB0byB0aGUgbWFpbiBjb21waWxlIGZ1bmN0aW9uCisgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW1Db21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFUeXBlU3lzdGVtQ29tcGlsZXIuUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgcGFyYW1zLnNldFNjaGVtYXMoc2RvY3MpOworICAgICAgICBwYXJhbXMuc2V0Q29uZmlncyhjZG9jcyk7CisgICAgICAgIHBhcmFtcy5zZXRMaW5rVG8obGlua1RvKTsKKyAgICAgICAgcGFyYW1zLnNldE9wdGlvbnMob3B0cyk7CisgICAgICAgIHBhcmFtcy5zZXRFcnJvckxpc3RlbmVyKGVycm9yTGlzdGVuZXIpOworICAgICAgICBwYXJhbXMuc2V0SmF2YWl6ZSh0cnVlKTsKKyAgICAgICAgcGFyYW1zLnNldEJhc2VVUkkoYmFzZVVSSSk7CisgICAgICAgIHBhcmFtcy5zZXRTb3VyY2VzVG9Db3B5TWFwKHNvdXJjZXNUb0NvcHlNYXApOworICAgICAgICByZXR1cm4gU2NoZW1hVHlwZVN5c3RlbUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGlsZShQYXJhbWV0ZXJzIHBhcmFtcykKKyAgICB7CisgICAgICAgIEZpbGUgYmFzZURpciA9IHBhcmFtcy5nZXRCYXNlRGlyKCk7CisgICAgICAgIEZpbGVbXSB4c2RGaWxlcyA9IHBhcmFtcy5nZXRYc2RGaWxlcygpOworICAgICAgICBGaWxlW10gd3NkbEZpbGVzID0gcGFyYW1zLmdldFdzZGxGaWxlcygpOworICAgICAgICBGaWxlW10gamF2YUZpbGVzID0gcGFyYW1zLmdldEphdmFGaWxlcygpOworICAgICAgICBGaWxlW10gY29uZmlnRmlsZXMgPSBwYXJhbXMuZ2V0Q29uZmlnRmlsZXMoKTsKKyAgICAgICAgRmlsZVtdIGNsYXNzcGF0aCA9IHBhcmFtcy5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgRmlsZSBvdXRwdXRKYXIgPSBwYXJhbXMuZ2V0T3V0cHV0SmFyKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1zLmdldE5hbWUoKTsKKyAgICAgICAgRmlsZSBzcmNEaXIgPSBwYXJhbXMuZ2V0U3JjRGlyKCk7CisgICAgICAgIEZpbGUgY2xhc3Nlc0RpciA9IHBhcmFtcy5nZXRDbGFzc2VzRGlyKCk7CisgICAgICAgIFN0cmluZyBjb21waWxlciA9IHBhcmFtcy5nZXRDb21waWxlcigpOworICAgICAgICBTdHJpbmcgamFyID0gcGFyYW1zLmdldEphcigpOworICAgICAgICBTdHJpbmcgbWVtb3J5SW5pdGlhbFNpemUgPSBwYXJhbXMuZ2V0TWVtb3J5SW5pdGlhbFNpemUoKTsKKyAgICAgICAgU3RyaW5nIG1lbW9yeU1heGltdW1TaXplID0gcGFyYW1zLmdldE1lbW9yeU1heGltdW1TaXplKCk7CisgICAgICAgIGJvb2xlYW4gbm9qYXZhYyA9IHBhcmFtcy5pc05vamF2YWMoKTsKKyAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IHBhcmFtcy5pc0RlYnVnKCk7CisgICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IHBhcmFtcy5pc1ZlcmJvc2UoKTsKKyAgICAgICAgYm9vbGVhbiBxdWlldCA9IHBhcmFtcy5pc1F1aWV0KCk7CisgICAgICAgIGJvb2xlYW4gZG93bmxvYWQgPSBwYXJhbXMuaXNEb3dubG9hZCgpOworICAgICAgICBib29sZWFuIG5vVXBhID0gcGFyYW1zLmlzTm9VcGEoKTsKKyAgICAgICAgYm9vbGVhbiBub1B2ciA9IHBhcmFtcy5pc05vUHZyKCk7CisgICAgICAgIENvbGxlY3Rpb24gb3V0ZXJFcnJvckxpc3RlbmVyID0gcGFyYW1zLmdldEVycm9yTGlzdGVuZXIoKTsKKyAgICAgICAgU3RyaW5nIHJlcGFja2FnZSA9IHBhcmFtcy5nZXRSZXBhY2thZ2UoKTsKKyAgICAgICAgTGlzdCBleHRlbnNpb25zID0gcGFyYW1zLmdldEV4dGVuc2lvbnMoKTsKKyAgICAgICAgYm9vbGVhbiBqYXhiID0gcGFyYW1zLmdldEpheGIoKTsKKyAgICAgICAgU2V0IG1kZWZOYW1lc3BhY2VzID0gcGFyYW1zLmdldE1kZWZOYW1lc3BhY2VzKCk7CisKKyAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsIHx8IGNsYXNzZXNEaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNyYyBhbmQgY2xhc3MgZ2VuIGRpcmVjdG9yaWVzIG1heSBub3QgYmUgbnVsbC4iKTsKKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB1c2VuYW1lcyBiYXNlZCBvbiB0aGUgcmVsYXRpdml6ZWQgZmlsZW5hbWVzIG9uIHRoZSBmaWxlc3lzdGVtCisgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwpCisgICAgICAgICAgICBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKKworICAgICAgICBSZXNvdXJjZUxvYWRlciBjcFJlc291cmNlTG9hZGVyID0gbnVsbDsKKworICAgICAgICBNYXAgc291cmNlc1RvQ29weU1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKQorICAgICAgICAgICAgY3BSZXNvdXJjZUxvYWRlciA9IG5ldyBQYXRoUmVzb3VyY2VMb2FkZXIoY2xhc3NwYXRoKTsKKworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIGluLW1lbW9yeSB0eXBlIHN5c3RlbQorICAgICAgICBYbWxFcnJvcldhdGNoZXIgZXJyb3JMaXN0ZW5lciA9IG5ldyBYbWxFcnJvcldhdGNoZXIob3V0ZXJFcnJvckxpc3RlbmVyKTsKKyAgICAgICAgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0gPSBsb2FkVHlwZVN5c3RlbShuYW1lLCB4c2RGaWxlcywgd3NkbEZpbGVzLCBjb25maWdGaWxlcywgY3BSZXNvdXJjZUxvYWRlciwgZG93bmxvYWQsIG5vVXBhLCBub1B2ciwgbWRlZk5hbWVzcGFjZXMsIGJhc2VEaXIsIHNvdXJjZXNUb0NvcHlNYXAsIGVycm9yTGlzdGVuZXIpOworICAgICAgICBpZiAoZXJyb3JMaXN0ZW5lci5oYXNFcnJvcigpKQorICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIGxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmICghcXVpZXQpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gYnVpbGQgc2NoZW1hIHR5cGUgc3lzdGVtOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7CisKKyAgICAgICAgLy8gbm93IGNvZGUgZ2VuZXJhdGUgYW5kIGNvbXBpbGUgdGhlIEpBUgorICAgICAgICBpZiAocmVzdWx0ICYmIHN5c3RlbSAhPSBudWxsKSAvLyB0b2RvOiBkb24ndCBjaGVjayAicmVzdWx0IiBoZXJlIGlmIHdlIHdhbnQgdG8gY29tcGlsZSBhbnl3YXksIGlnbm9yaW5nIGludmFsaWQgc2NoZW1hcworICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBzb3VyY2UgYW5kIC54c2IKKyAgICAgICAgICAgIExpc3Qgc291cmNlZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICByZXN1bHQgJj0gU2NoZW1hQ29kZUdlbmVyYXRvci5jb21waWxlVHlwZVN5c3RlbShzeXN0ZW0sIHNyY0RpciwgamF2YUZpbGVzLCBzb3VyY2VzVG9Db3B5TWFwLCBjbGFzc3BhdGgsIGNsYXNzZXNEaXIsIG91dHB1dEphciwgbm9qYXZhYywgamF4YiwgZXJyb3JMaXN0ZW5lciwgcmVwYWNrYWdlLCB2ZXJib3NlLCBzb3VyY2VmaWxlcyk7CisgICAgICAgICAgICByZXN1bHQgJj0gIWVycm9yTGlzdGVuZXIuaGFzRXJyb3IoKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gZ2VuZXJhdGUgY29kZTogIiArICgoZG91YmxlKShmaW5pc2ggLSBzdGFydCkgLyAxMDAwLjApICsgIiBzZWNvbmRzIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21waWxlIHNvdXJjZQorICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhbm9qYXZhYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgaWYgKGphdmFGaWxlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzb3VyY2VmaWxlcy5hZGRBbGwoamF2YS51dGlsLkFycmF5cy5hc0xpc3QoamF2YUZpbGVzKSk7CisgICAgICAgICAgICAgICAgaWYgKCFDb2RlR2VuVXRpbC5leHRlcm5hbENvbXBpbGUoc291cmNlZmlsZXMsIGNsYXNzZXNEaXIsIGNsYXNzcGF0aCwgZGVidWcsIGNvbXBpbGVyLCBtZW1vcnlJbml0aWFsU2l6ZSwgbWVtb3J5TWF4aW11bVNpemUsIHF1aWV0LCB2ZXJib3NlKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFwYXJhbXMuaXNRdWlldCgpKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiICk7CisKKyAgICAgICAgICAgICAgICAvLyBqYXIgY2xhc3NlcyBhbmQgLnhzYgorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgb3V0cHV0SmFyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIUNvZGVHZW5VdGlsLmV4dGVybmFsSmFyKGNsYXNzZXNEaXIsIG91dHB1dEphciwgamFyLCBxdWlldCwgdmVyYm9zZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFwYXJhbXMuaXNRdWlldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21waWxlZCB0eXBlcyB0bzogIiArIG91dHB1dEphcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgIXF1aWV0KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJVSUxEIEZBSUxFRCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gY2FsbCBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uIGlmIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIHJ1bkV4dGVuc2lvbnMoZXh0ZW5zaW9ucywgc3lzdGVtLCBjbGFzc2VzRGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjcFJlc291cmNlTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICBjcFJlc291cmNlTG9hZGVyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5FeHRlbnNpb25zKExpc3QgZXh0ZW5zaW9ucywgU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIEZpbGUgY2xhc3Nlc0RpcikKKyAgICB7CisgICAgICAgIGlmIChleHRlbnNpb25zICE9IG51bGwgJiYgZXh0ZW5zaW9ucy5zaXplKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFDb21waWxlckV4dGVuc2lvbiBzY2UgPSBudWxsOworICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIE1hcCBleHRlbnNpb25QYXJtcyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3Nlc0Rpck5hbWUgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xhc3Nlc0Rpck5hbWUgPSBjbGFzc2VzRGlyLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldBUk5JTkc6IFVuYWJsZSB0byBnZXQgdGhlIHBhdGggZm9yIHNjaGVtYSBqYXIgZmlsZSIpOworICAgICAgICAgICAgICAgIGNsYXNzZXNEaXJOYW1lID0gY2xhc3Nlc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSAoRXh0ZW5zaW9uKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNjZSA9IChTY2hlbWFDb21waWxlckV4dGVuc2lvbikgZXh0ZW5zaW9uLmdldENsYXNzTmFtZSgpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVOQUJMRSB0byBpbnN0YW50aWF0ZSBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uOiIgKyBleHRlbnNpb24uZ2V0Q2xhc3NOYW1lKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFWFRFTlNJT04gQ2xhc3Mgd2FzIG5vdCBydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklMTEVHQUwgQUNDRVNTIEV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgc2NoZW1hIGNvbXBpbGVyIGV4dGVuc2lvbjogIiArIGV4dGVuc2lvbi5nZXRDbGFzc05hbWUoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYVEVOU0lPTiBDbGFzcyB3YXMgbm90IHJ1biIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgRXh0ZW5zaW9uOiAiICsgc2NlLmdldEV4dGVuc2lvbk5hbWUoKSk7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUGFybXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcm1zaSA9IGV4dGVuc2lvbi5nZXRQYXJhbXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChwYXJtc2kuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uLlBhcmFtIHAgPSAoRXh0ZW5zaW9uLlBhcmFtKSBwYXJtc2kubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25QYXJtcy5wdXQocC5nZXROYW1lKCksIHAuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4dGVuc2lvblBhcm1zLnB1dCgiY2xhc3Nlc0RpciIsIGNsYXNzZXNEaXJOYW1lKTsKKyAgICAgICAgICAgICAgICBzY2Uuc2NoZW1hQ29tcGlsZXJFeHRlbnNpb24oc3lzdGVtLCBleHRlbnNpb25QYXJtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gd3NkbENvbnRhaW5zRW5jb2RlZChYbWxPYmplY3Qgd3NkbGRvYykKKyAgICB7CisgICAgICAgIC8vIHNlYXJjaCBmb3IgYW55IDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIi8+IGV0Yy4KKyAgICAgICAgWG1sT2JqZWN0W10gdXNlQXR0cnMgPSB3c2RsZG9jLnNlbGVjdFBhdGgoCisgICAgICAgICAgICAgICAgImRlY2xhcmUgbmFtZXNwYWNlIHNvYXA9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8nICIgKworICAgICAgICAgICAgICAgICIuLy9zb2FwOmJvZHkvQHVzZXwuLy9zb2FwOmhlYWRlci9AdXNlfC4vL3NvYXA6ZmF1bHQvQHVzZSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVzZUF0dHJzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoImVuY29kZWQiLmVxdWFscygoKFNpbXBsZVZhbHVlKXVzZUF0dHJzW2ldKS5nZXRTdHJpbmdWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19VUkkgPSAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJID0gImh0dHA6Ly93d3cuYmVhLmNvbS8yMDAyLzA5L3hiZWFuL2NvbmZpZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1BUF9DT01QQVRJQklMSVRZX0NPTkZJR19VUklTOworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgTUFQX0NPTVBBVElCSUxJVFlfQ09ORklHX1VSSVMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNQVBfQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJUy5wdXQoQ09NUEFUSUJJTElUWV9DT05GSUdfVVJJLCBDT05GSUdfVVJJKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb21waWxlckV4dGVuc2lvbi5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjQxNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBTY2hlbWEgQ29tcGlsZXIgRXh0ZW5zaW9ucy4gIEJ5IGltcGxlbWVudGluZyB0aGlzIGNsYXNzCisgKiAgeW91IGNhbiB0aGVuIHBhc3MgdGhpcyBjbGFzcyB2aWEgdGhlIGNvbW1hbmQgbGluZSBwYXJhbSA8aT5leHRlbnNpb248L2k+IHRvIHRoZSBTY2hlbWFDb21waWxlciBjbGFzcworICogIHdoaWNoIHdpbGwgdGhlbiBpbiB0dXJuIGNhbGwgdGhpcyBjbGFzcyBiYWNrIG9uY2UgdGhlIGNvbXBpbGF0aW9uIGlzIGNvbXBsZXRlIHdpdGggdGhlIHJlc3VsdGluZworICogIFNjaGVtYVR5cGVTeXN0ZW0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24geworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIGJ5IHRoZSBYbWxCZWFucyBTY2hlbWEgQ29tcGlsZXIgd2l0aAorICAgICAqICB0aGUgU2NoZW1hIFR5cGUgU3lzdGVtIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY29tcGlsZS4KKyAgICAgKiBAcGFyYW0gc2NoZW1hVHlwZVN5c3RlbSAtIFRoZSBzY2hlbWEgdHlwZSBzeXN0ZW1zIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSB0aGUgY29tcGlsZXIganVzdCBwcmlvciB0byBjYWxsaW5nCisgICAgICogICB0aGlzIGV4dGVuc2lvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gcGFybXMgLSBuYW1lIHZhbHVlIHBhaXJzIG9mIG9wdGlvbnMgdG8gdGhpcyBzY2hlbWEgY29tcGlsZXIgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2NoZW1hQ29tcGlsZXJFeHRlbnNpb24oU2NoZW1hVHlwZVN5c3RlbSBzY2hlbWFUeXBlU3lzdGVtLCBNYXAgcGFybXMpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29weS5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGNiY2UKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFDb3B5LmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uSU9VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuaW50ZXJuYWwueG1sYmVhbnMud3NkbHN1YnN0LkRlZmluaXRpb25zRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5pbnRlcm5hbC54bWxiZWFucy53c2Rsc3Vic3QuVEltcG9ydDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuSW1wb3J0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5JbmNsdWRlRG9jdW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFDb3B5Cit7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCBhcmdzLmxlbmd0aCA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IHNjaGVtYWNvcHkgc291cmNldXJsIFt0YXJnZXRmaWxlXSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVVJJIHNvdXJjZSA9IG51bGw7CisgICAgICAgIFVSSSB0YXJnZXQgPSBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzb3VyY2UgPSBuZXcgVVJJKGFyZ3NbMF0pOworICAgICAgICAgICAgc291cmNlLnRvVVJMKCk7IC8vIHRvIHRyaWdnZXIgZXhjZXB0aW9uCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkJhZGx5IGZvcm1lZCBVUkwgIiArIHNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVUkkgZGlyID0gbmV3IEZpbGUoIi4iKS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdFBhcnQgPSBzb3VyY2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgIGxhc3RQYXJ0ID0gbGFzdFBhcnQuc3Vic3RyaW5nKGxhc3RQYXJ0Lmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKGRpciwgVVJJLmNyZWF0ZShsYXN0UGFydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNhbm9uaWNhbGl6ZSBjdXJyZW50IGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBVUkkoYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0YXJnZXQuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEZpbGUodGFyZ2V0KS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgY2Fub25pY2FsaXplIGN1cnJlbnQgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNYXAgdGhpbmdzVG9Db3B5ID0gZmluZEFsbFJlbGF0aXZlKHNvdXJjZSwgdGFyZ2V0KTsKKyAgICAgICAgY29weUFsbCh0aGluZ3NUb0NvcHksIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUFsbChNYXAgdXJpTWFwLCBib29sZWFuIHN0ZG91dCkKKyAgICB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHVyaU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBVUkkgc291cmNlID0gKFVSSSlpLm5leHQoKTsKKyAgICAgICAgICAgIFVSSSB0YXJnZXQgPSAoVVJJKXVyaU1hcC5nZXQoc291cmNlKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElPVXRpbC5jb3B5Q29tcGxldGVseShzb3VyY2UsIHRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZG91dCkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgY29weSAiICsgc291cmNlICsgIiAtPiAiICsgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGRvdXQpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvcGllZCAiICsgc291cmNlICsgIiAtPiAiICsgdGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBzY2hlbWEgb3Igd3NkbCBhdCB0aGUgc291cmNlIFVSSSB0byB0aGUgdGFyZ2V0IFVSSSwgYWxvbmcKKyAgICAgKiB3aXRoIGFueSByZWxhdGl2ZSByZWZlcmVuY2VzLiAgVGhlIHRhcmdldCBVUkkgc2hvdWxkIGJlIGEgZmlsZSBVUkkuCisgICAgICogSWYgZG9Db3B5IGlzIGZhbHNlLCB0aGUgZmlsZSBjb3BpZXMgYXJlIG5vdCBhY3R1YWxseSBkb25lOyB0aGUgbWFwCisgICAgICogcmV0dXJuZWQganVzdCBkZXNjcmliZXMgdGhlIGNvcGllcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBhbiBhcmJpdHJhcnkgVVJJIGRlc2NyaWJpbmcgYSBzb3VyY2UgU2NoZW1hIG9yIFdTREwKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IGEgZmlsZSBVUkkgZGVzY3JpYmluZyBhIHRhcmdldCBmaWxlbmFtZQorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgYWxsIHRoZSBzb3VyY2UvdGFyZ2V0IFVSSXMgbmVlZGVkIHRvIGNvcHkKKyAgICAgKiB0aGUgZmlsZSBhbG9uZyB3aXRoIGFsbCBpdHMgcmVsYXRpdmUgcmVmZXJlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpbmRBbGxSZWxhdGl2ZShVUkkgc291cmNlLCBVUkkgdGFyZ2V0KQorICAgIHsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIHJlc3VsdC5wdXQoc291cmNlLCB0YXJnZXQpOworCisgICAgICAgIExpbmtlZExpc3QgcHJvY2VzcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHByb2Nlc3MuYWRkKHNvdXJjZSk7CisKKyAgICAgICAgd2hpbGUgKCFwcm9jZXNzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVVJJIG5leHRTb3VyY2UgPSAoVVJJKXByb2Nlc3MucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIFVSSSBuZXh0VGFyZ2V0ID0gKFVSSSlyZXN1bHQuZ2V0KG5leHRTb3VyY2UpOworICAgICAgICAgICAgTWFwIG5leHRSZXN1bHRzID0gZmluZFJlbGF0aXZlSW5PbmUobmV4dFNvdXJjZSwgbmV4dFRhcmdldCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXh0UmVzdWx0cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVSSSBuZXdTb3VyY2UgPSAoVVJJKWkubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY29udGFpbnNLZXkobmV3U291cmNlKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChuZXdTb3VyY2UsIG5leHRSZXN1bHRzLmdldChuZXdTb3VyY2UpKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzLmFkZChuZXdTb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBsb2FkT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCkuCisgICAgICAgICAgICBzZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnL2ludGVybmFsL3htbGJlYW5zL3dzZGxzdWJzdCIgCisgICAgICAgICAgICApKTsKKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBmaW5kUmVsYXRpdmVJbk9uZShVUkkgc291cmNlLCBVUkkgdGFyZ2V0KQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFVSTCBzb3VyY2VVUkwgPSBzb3VyY2UudG9VUkwoKTsKKyAgICAgICAgICAgIFhtbE9iamVjdCB4b2JqID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2Uoc291cmNlVVJMLCBsb2FkT3B0aW9ucyk7CisgICAgICAgICAgICBYbWxDdXJzb3IgeGN1ciA9IHhvYmoubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICB4Y3VyLnRvRmlyc3RDaGlsZCgpOworCisgICAgICAgICAgICBNYXAgcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKworICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBTY2hlbWFEb2N1bWVudCkKKyAgICAgICAgICAgICAgICBwdXRNYXBwaW5nc0Zyb21TY2hlbWEocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgKChTY2hlbWFEb2N1bWVudCl4b2JqKS5nZXRTY2hlbWEoKSk7CisgICAgICAgICAgICBlbHNlIGlmICh4b2JqIGluc3RhbmNlb2YgRGVmaW5pdGlvbnNEb2N1bWVudCkKKyAgICAgICAgICAgICAgICBwdXRNYXBwaW5nc0Zyb21Xc2RsKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsICgoRGVmaW5pdGlvbnNEb2N1bWVudCl4b2JqKS5nZXREZWZpbml0aW9ucygpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhbnkgZXhjZXB0aW9ucyBwYXJzaW5nIHRoZSBnaXZlbiBVUkw/ICBUaGVuIHNraXAgdGhpcyBmaWxlIHNpbGVudGx5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE5ld01hcHBpbmcoTWFwIHJlc3VsdCwgVVJJIG9yaWdTb3VyY2UsIFVSSSBvcmlnVGFyZ2V0LCBTdHJpbmcgbGl0ZXJhbFVSSSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGl0ZXJhbFVSSSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFVSSSBuZXdSZWxhdGl2ZSA9IG5ldyBVUkkobGl0ZXJhbFVSSSk7CisgICAgICAgICAgICBpZiAobmV3UmVsYXRpdmUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFVSSSBuZXdTb3VyY2UgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG9yaWdTb3VyY2UsIG5ld1JlbGF0aXZlKTsKKyAgICAgICAgICAgIFVSSSBuZXdUYXJnZXQgPSBDb2RlR2VuVXRpbC5yZXNvbHZlKG9yaWdUYXJnZXQsIG5ld1JlbGF0aXZlKTsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3U291cmNlLCBuZXdUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdXJpIHN5bnRheCBwcm9ibGVtPyBkbyBub3RoaW5nIHNpbGVudGx5LgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRNYXBwaW5nc0Zyb21TY2hlbWEoTWFwIHJlc3VsdCwgVVJJIHNvdXJjZSwgVVJJIHRhcmdldCwgU2NoZW1hRG9jdW1lbnQuU2NoZW1hIHNjaGVtYSkKKyAgICB7CisgICAgICAgIEltcG9ydERvY3VtZW50LkltcG9ydFtdIGltcG9ydHMgPSBzY2hlbWEuZ2V0SW1wb3J0QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcHV0TmV3TWFwcGluZyhyZXN1bHQsIHNvdXJjZSwgdGFyZ2V0LCBpbXBvcnRzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpOworCisgICAgICAgIEluY2x1ZGVEb2N1bWVudC5JbmNsdWRlW10gaW5jbHVkZXMgPSBzY2hlbWEuZ2V0SW5jbHVkZUFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBwdXROZXdNYXBwaW5nKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsIGluY2x1ZGVzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0TWFwcGluZ3NGcm9tV3NkbChNYXAgcmVzdWx0LCBVUkkgc291cmNlLCBVUkkgdGFyZ2V0LCBEZWZpbml0aW9uc0RvY3VtZW50LkRlZmluaXRpb25zIHdkb2MpCisgICAgeworICAgICAgICBYbWxPYmplY3RbXSB0eXBlcyA9IHdkb2MuZ2V0VHlwZXNBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFEb2N1bWVudC5TY2hlbWFbXSBzY2hlbWFzID0gKFNjaGVtYURvY3VtZW50LlNjaGVtYVtdKXR5cGVzW2ldLnNlbGVjdFBhdGgoImRlY2xhcmUgbmFtZXNwYWNlIHhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgeHM6c2NoZW1hIik7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjaGVtYXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgcHV0TWFwcGluZ3NGcm9tU2NoZW1hKHJlc3VsdCwgc291cmNlLCB0YXJnZXQsIHNjaGVtYXNbal0pOworICAgICAgICB9CisKKyAgICAgICAgVEltcG9ydFtdIGltcG9ydHMgPSB3ZG9jLmdldEltcG9ydEFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHB1dE5ld01hcHBpbmcocmVzdWx0LCBzb3VyY2UsIHRhcmdldCwgaW1wb3J0c1tpXS5nZXRMb2NhdGlvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFJbXBvcnRSZXNvbHZlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjhlMGMyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvU2NoZW1hSW1wb3J0UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkltcG9ydERvY3VtZW50LkltcG9ydDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLkluY2x1ZGVEb2N1bWVudC5JbmNsdWRlOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hSW1wb3J0UmVzb2x2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgSW1wb3J0TG9hZGVyIHdpc2hlcyB0byByZXNvbHZlIHRoZQorICAgICAqIGdpdmVuIGltcG9ydC4gIFNob3VsZCByZXR1cm4gYSBTY2hlbWFSZXNvdXJjZSB3aG9zZQorICAgICAqICJlcXVhbHMiIHJlbGF0aW9uc2hpcCByZXZlYWxzIHdoZW4gYSBTY2hlbWFSZXNvdXJjZSBpcworICAgICAqIGR1cGxpY2F0ZWQgYW5kIHNob3VsZG4ndCBiZSBleGFtaW5lZCBhZ2Fpbi4KKyAgICAgKgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFSZXNvdXJjZSBsb29rdXBSZXNvdXJjZShTdHJpbmcgbnNVUkksIFN0cmluZyBVUkwpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIG5vdGlmeSB0aGF0IHRoZSBleHBlY3RlZCBuYW1lc3BhY2UgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICogYWN0dWFsIG5hbWVzcGFjZSwgb3IgaWYgbm8gbmFtZXNwYWNlIGlzIGtub3duLCB0byByZXBvcnQgdGhlCisgICAgICogZGlzY292ZXJlZCBuYW1lc3BhY2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0QWN0dWFsTmFtZXNwYWNlKFNjaGVtYVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgYWN0dWFsTmFtZXNwYWNlKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gc3VwcGx5IGEgc2NoZW1hIHJlc291cmNlIHdpdGggYW4gb3B0aW9uYWwgYXNzb2NpYXRlZAorICAgICAqIGV4cGVjdGVkLW5hbWVzcGFjZS1VUkkgYW5kIG9yaWdpbmFsLWxvY2F0aW9uLVVSTC4KKyAgICAgKgorICAgICAqIFRoZSBlcXVhbHMgKGFuZCBoYXNoQ29kZSkgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBTY2hlbWFSZXNvdXJjZQorICAgICAqIG9iamVjdHMgd2lsbCBiZSB1c2VkIHRvIGF2b2lkIGV4YW1pbmluZyB0aGUgc2FtZSByZXNvdXJjZSB0d2ljZTsKKyAgICAgKiB0aGVzZSBtdXN0IGJlIGltcGxlbWVudGVkIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBydWxlcyBmb3IKKyAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHR3byByZXNvdXJjZXMgYXJlIHRoZSBzYW1lLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hUmVzb3VyY2UKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgcGFyc2VkIHNjaGVtYSBvYmplY3QuCisgICAgICAgICAqLworCisgICAgICAgIHB1YmxpYyBTY2hlbWEgZ2V0U2NoZW1hKCk7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlc29sdmVJbXBvcnRzKFNjaGVtYVJlc291cmNlW10gcmVzb3VyY2VzKQorICAgIHsKKyAgICAgICAgTGlua2VkTGlzdCBxdWV1ZU9mUmVzb3VyY2VzID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKKyAgICAgICAgTGlua2VkTGlzdCBxdWV1ZU9mTG9jYXRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBTZXQgc2VlblJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hUmVzb3VyY2UgbmV4dFJlc291cmNlOworCisgICAgICAgICAgICAvLyBmZXRjaCBuZXh0IHJlc291cmNlLgorICAgICAgICAgICAgaWYgKCFxdWV1ZU9mUmVzb3VyY2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgb2ZmIHRoZSBpbml0aWFsIHF1ZXVlCisgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gKFNjaGVtYVJlc291cmNlKXF1ZXVlT2ZSZXNvdXJjZXMucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFxdWV1ZU9mTG9jYXRvcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG9yIG9mZiB0aGUgbGlzdCBvZiBsb2NhdG9ycworICAgICAgICAgICAgICAgIFNjaGVtYUxvY2F0b3IgbG9jYXRvciA9IChTY2hlbWFMb2NhdG9yKXF1ZXVlT2ZMb2NhdG9ycy5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGxvb2t1cFJlc291cmNlKGxvY2F0b3IubmFtZXNwYWNlLCBsb2NhdG9yLnNjaGVtYUxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dFJlc291cmNlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUsIHRoZW4gdGVybWluYXRlIGxvb3AKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdHJhY2sgYW5kIHNraXAgZHVwbGljYXRlcworICAgICAgICAgICAgaWYgKHNlZW5SZXNvdXJjZXMuY29udGFpbnMobmV4dFJlc291cmNlKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHNlZW5SZXNvdXJjZXMuYWRkKG5leHRSZXNvdXJjZSk7CisKKyAgICAgICAgICAgIC8vIGdldCByZXNvdXJjZSBjb250ZW50cworICAgICAgICAgICAgU2NoZW1hIHNjaGVtYSA9IG5leHRSZXNvdXJjZS5nZXRTY2hlbWEoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgYWN0dWFsIG5hbWVzcGFjZQorICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIGlmIChhY3R1YWxUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhY3R1YWxUYXJnZXROYW1lc3BhY2UgPSAiIjsKKworICAgICAgICAgICAgLy8gcmVwb3J0IGFjdHVhbCBuYW1lc3BhY2UKKyAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRhcmdldE5hbWVzcGFjZSA9IG5leHRSZXNvdXJjZS5nZXROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICFhY3R1YWxUYXJnZXROYW1lc3BhY2UuZXF1YWxzKGV4cGVjdGVkVGFyZ2V0TmFtZXNwYWNlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXBvcnRBY3R1YWxOYW1lc3BhY2UobmV4dFJlc291cmNlLCBhY3R1YWxUYXJnZXROYW1lc3BhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3cgZ28gdGhyb3VnaCBhbmQgcmVjb3JkIGFsbCB0aGUgaW1wb3J0cworICAgICAgICAgICAgSW1wb3J0W10gc2NoZW1hSW1wb3J0cyA9IHNjaGVtYS5nZXRJbXBvcnRBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFJbXBvcnRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHF1ZXVlT2ZMb2NhdG9ycy5hZGQobmV3IFNjaGVtYUxvY2F0b3Ioc2NoZW1hSW1wb3J0c1tpXS5nZXROYW1lc3BhY2UoKSA9PSBudWxsID8gIiIgOiBzY2hlbWFJbXBvcnRzW2ldLmdldE5hbWVzcGFjZSgpLCBzY2hlbWFJbXBvcnRzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gYW5kIHJlY29yZCBhbGwgdGhlIGluY2x1ZGVzIHRvbworICAgICAgICAgICAgSW5jbHVkZVtdIHNjaGVtYUluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFJbmNsdWRlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxdWV1ZU9mTG9jYXRvcnMuYWRkKG5ldyBTY2hlbWFMb2NhdG9yKG51bGwsIHNjaGVtYUluY2x1ZGVzW2ldLmdldFNjaGVtYUxvY2F0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjaGVtYUxvY2F0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBTY2hlbWFMb2NhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7CisgICAgICAgICAgICB0aGlzLnNjaGVtYUxvY2F0aW9uID0gc2NoZW1hTG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzY2hlbWFMb2NhdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1NjaGVtYVJlc291cmNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWNiMzIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9TY2hlbWFSZXNvdXJjZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLklPVXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgU2NoZW1hUmVzb3VyY2VNYW5hZ2VyIGV4dGVuZHMgQmFzZVNjaGVtYVJlc291cmNlTWFuYWdlcgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFpbnRhaW5zIFwieHNkb3dubG9hZC54bWxcIiwgYW4gaW5kZXggb2YgbG9jYWxseSBkb3dubG9hZGVkIC54c2QgZmlsZXMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IHNkb3dubG9hZCBbLWRpciBkaXJlY3RvcnldIFstcmVmcmVzaF0gWy1yZWN1cnNlXSBbLXN5bmNdIFt1cmwvZmlsZS4uLl0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTHMgdGhhdCBhcmUgc3BlY2lmaWVkIGFyZSBkb3dubG9hZGVkIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgY2FjaGVkLiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbiBhZGRpdGlvbjoiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtZGlyIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IGZvciB0aGUgeHNkb3dubG9hZC54bWwgZmlsZSAoZGVmYXVsdCAuKS4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtc3luYyBzeW5jaHJvbml6ZXMgdGhlIGluZGV4IHRvIGFueSBsb2NhbCAueHNkIGZpbGVzIGluIHRoZSB0cmVlLiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1yZWN1cnNlIHJlY3Vyc2l2ZWx5IGRvd25sb2FkcyBpbXBvcnRlZCBhbmQgaW5jbHVkZWQgLnhzZCBmaWxlcy4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtcmVmcmVzaCByZWRvd25sb2FkcyBhbGwgaW5kZXhlZCAueHNkIGZpbGVzLiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZiBubyBmaWxlcyBvciBVUkxzIGFyZSBzcGVjaWZpZWQsIGFsbCBpbmRleGVkIGZpbGVzIGFyZSByZWxldmFudC4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0IG9wdHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBvcHRzLmFkZCgiZGlyIik7CisgICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIG9wdHMpOworICAgICAgICBpZiAoY2wuZ2V0T3B0KCJsaWNlbnNlIikgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tbWFuZExpbmUucHJpbnRMaWNlbnNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKKworICAgICAgICBib29sZWFuIHN5bmMgPSAoY2wuZ2V0T3B0KCJzeW5jIikgIT0gbnVsbCk7CisgICAgICAgIGJvb2xlYW4gcmVmcmVzaCA9IChjbC5nZXRPcHQoInJlZnJlc2giKSAhPSBudWxsKTsKKyAgICAgICAgYm9vbGVhbiBpbXBvcnRzID0gKGNsLmdldE9wdCgicmVjdXJzZSIpICE9IG51bGwpOworICAgICAgICBTdHJpbmcgZGlyID0gY2wuZ2V0T3B0KCJkaXIiKTsKKyAgICAgICAgaWYgKGRpciA9PSBudWxsKQorICAgICAgICAgICAgZGlyID0gIi4iOworICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcik7CisKKyAgICAgICAgU2NoZW1hUmVzb3VyY2VNYW5hZ2VyIG1ncjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1nciA9IG5ldyBTY2hlbWFSZXNvdXJjZU1hbmFnZXIoZGlyZWN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdCB1cmlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb29rc0xpa2VVUkwoYXJnc1tpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXJpTGlzdC5hZGQoYXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBGaWxlKGRpcmVjdG9yeSwgYXJnc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGVhbCB3aXRoIGZpbGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBmaWxlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSlpLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghaXNJbkRpcmVjdG9yeShmaWxlLCBkaXJlY3RvcnkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmlsZSBub3Qgd2l0aGluIGRpcmVjdG9yeTogIiArIGZpbGUpOworICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkZWFsIHdpdGggZGlyZWN0b3JpZXMKKyAgICAgICAgZmlsZUxpc3QgPSBjb2xsZWN0WFNERmlsZXMoKEZpbGVbXSlmaWxlTGlzdC50b0FycmF5KG5ldyBGaWxlWzBdKSk7CisKKyAgICAgICAgU3RyaW5nW10gdXJpcyA9IChTdHJpbmdbXSl1cmlMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IChGaWxlW10pZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZVswXSk7CisgICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IHJlbGF0aXZlRmlsZW5hbWVzKGZpbGVzLCBkaXJlY3RvcnkpOworCisgICAgICAgIGlmICh1cmlzLmxlbmd0aCArIGZpbGVuYW1lcy5sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtZ3IucHJvY2Vzcyh1cmlzLCBmaWxlbmFtZXMsIHN5bmMsIHJlZnJlc2gsIGltcG9ydHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWdyLnByb2Nlc3NBbGwoc3luYywgcmVmcmVzaCwgaW1wb3J0cyk7CisgICAgICAgIH0KKworICAgICAgICBtZ3Iud3JpdGVDYWNoZSgpOworICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGxvb2tzTGlrZVVSTChTdHJpbmcgc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0ci5zdGFydHNXaXRoKCJodHRwOiIpIHx8IHN0ci5zdGFydHNXaXRoKCJodHRwczoiKSB8fCBzdHIuc3RhcnRzV2l0aCgiZnRwOiIpIHx8IHN0ci5zdGFydHNXaXRoKCJmaWxlOiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWxhdGl2ZUZpbGVuYW1lKEZpbGUgZmlsZSwgRmlsZSBkaXJlY3RvcnkpCisgICAgeworICAgICAgICBpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUuZXF1YWxzKGRpcmVjdG9yeSkpCisgICAgICAgICAgICByZXR1cm4gIi4iOworICAgICAgICByZXR1cm4gcmVsYXRpdmVGaWxlbmFtZShmaWxlLmdldFBhcmVudEZpbGUoKSwgZGlyZWN0b3J5KSArICIvIiArIGZpbGUuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHJlbGF0aXZlRmlsZW5hbWVzKEZpbGVbXSBmaWxlcywgRmlsZSBkaXJlY3RvcnkpCisgICAgeworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2ZpbGVzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlbGF0aXZlRmlsZW5hbWUoZmlsZXNbaV0sIGRpcmVjdG9yeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5EaXJlY3RvcnkoRmlsZSBmaWxlLCBGaWxlIGRpcikKKyAgICB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmaWxlLmVxdWFscyhkaXIpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBpc0luRGlyZWN0b3J5KGZpbGUuZ2V0UGFyZW50RmlsZSgpLCBkaXIpOworICAgIH0KKworCisKKworCisgICAgcHVibGljIFNjaGVtYVJlc291cmNlTWFuYWdlcihGaWxlIGRpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIF9kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgX2RpcmVjdG9yeTsKKworCisgICAgLy8gU09NRSBNRVRIT0RTIFRPIE9WRVJSSURFID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFNlbmRzIG1lc3NhZ2VzIHRvIFN5c3RlbS5vdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd2FybmluZyhTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWxlbmFtZSBleGlzdHMuICBUaGUgZmlsZW5hbWVzCisgICAgICogYXJlIG9mIHRoZSBmb3JtICIvZm9vL2Jhci96ZWUueHNkIiBhbmQgc2hvdWxkIGJlIGNvbnN0cnVlZAorICAgICAqIGFzIHJvb3RlZCBhdCB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAobmV3IEZpbGUoX2RpcmVjdG9yeSwgZmlsZW5hbWUpKS5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBmaWxlbmFtZSBhcyBhbiBJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JGaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShfZGlyZWN0b3J5LCBmaWxlbmFtZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBlbnRpcmUgZmlsZSBpbiBvbmUgc3RlcC4gIEFuIElucHV0U3RyZWFtIGlzIHBhc3NlZCBhbmQKKyAgICAgKiBjb3BpZWQgdG8gdGhlIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbnB1dFN0cmVhbVRvRmlsZShJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9kaXJlY3RvcnksIGZpbGVuYW1lKTsKKworICAgICAgICBGaWxlIHBhcmVudCA9IHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICBpZiAoIXBhcmVudC5leGlzdHMoKSkKKyAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOworICAgICAgICBJT1V0aWwuY29weUNvbXBsZXRlbHkoaW5wdXQsIG91dHB1dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhIGZpbGUuICBTb21ldGltZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgd3JpdGluZyBhIG5ldyBmaWxlCisgICAgICogd2Ugbm90aWNlIHRoYXQgaXQncyBleGFjdGx5IHRoZSBzYW1lIGFzIGFuIGV4aXN0aW5nIGZpbGUgYW5kCisgICAgICogd2UgZGVsZXRlIGl0LiBXZSBuZXZlciBkZWxldGUgYSBmaWxlIHRoYXQgd2FzIGdpdmVuIHRvIHVzCisgICAgICogYnkgdGhlIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZShTdHJpbmcgZmlsZW5hbWUpCisgICAgeworICAgICAgICBuZXcgRmlsZShfZGlyZWN0b3J5LCBmaWxlbmFtZSkuZGVsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBYU0QgZmlsZXNuYW1lcyBpbiB0aGUgcHJvamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWxsWFNERmlsZW5hbWVzKCkKKyAgICB7CisgICAgICAgIEZpbGVbXSBhbGxGaWxlcyA9IChGaWxlW10pY29sbGVjdFhTREZpbGVzKG5ldyBGaWxlW10geyBfZGlyZWN0b3J5IH0pLnRvQXJyYXkobmV3IEZpbGVbMF0pOworICAgICAgICByZXR1cm4gcmVsYXRpdmVGaWxlbmFtZXMoYWxsRmlsZXMsIF9kaXJlY3RvcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSByZWN1cnNpdmUgZmlsZSBmaWx0ZXIgdG8gZG8gdGhlIGFib3ZlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3QgY29sbGVjdFhTREZpbGVzKEZpbGVbXSBkaXJzKQorICAgIHsKKyAgICAgICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGYgPSBkaXJzW2ldOworICAgICAgICAgICAgaWYgKCFmLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVzLmFkZEFsbChjb2xsZWN0WFNERmlsZXMoCisgICAgICAgICAgICAgICAgICAgIGYubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuaXNGaWxlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueHNkIik7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9UeXBlSGllcmFyY2h5UHJpbnRlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYyNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvVHlwZUhpZXJhcmNoeVByaW50ZXIuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnRvb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBUeXBlSGllcmFyY2h5UHJpbnRlcgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbW1hbmRMaW5lIGNsID0gbmV3IENvbW1hbmRMaW5lKGFyZ3MsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CisgICAgICAgIGlmIChjbC5nZXRPcHQoImxpY2Vuc2UiKSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBDb21tYW5kTGluZS5wcmludExpY2Vuc2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjbC5hcmdzKCkubGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpbnRzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiB0eXBlcyBkZWZpbmVkIGluIGEgc2NoZW1hLiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogeHNkdHJlZSBbLW5vYW5vbl0gWy1ub3B2cl0gWy1ub3VwYV0gWy1saWNlbnNlXSBmaWxlMS54c2QgZmlsZTIueHNkIC4uLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIG5vYW5vbiA9IChjbC5nZXRPcHQoIm5vYW5vbiIpICE9IG51bGwpOworICAgICAgICBib29sZWFuIG5vcHZyID0gKGNsLmdldE9wdCgibm9wdnIiKSAhPSBudWxsKTsKKyAgICAgICAgYm9vbGVhbiBub3VwYSA9IChjbC5nZXRPcHQoIm5vdXBhIikgIT0gbnVsbCk7CisgICAgICAgIAorICAgICAgICBGaWxlW10gc2NoZW1hRmlsZXMgPSBjbC5nZXRGaWxlcygpOworICAgICAgICAKKyAgICAgICAgLy8gc3RlcCAxOiBsb2FkIGFsbCB0aGUgZmlsZXMKKyAgICAgICAgTGlzdCBzZG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFGaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2RvY3MuYWRkKAorICAgICAgICAgICAgICAgICAgICBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRmlsZXNbaV0sIChuZXcgWG1sT3B0aW9ucygpKS5zZXRMb2FkTGluZU51bWJlcnMoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggc2NoZW1hRmlsZXNbaV0gKyAiIG5vdCBsb2FkYWJsZTogIiArIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICBYbWxPYmplY3RbXSBzY2hlbWFzID0gKFhtbE9iamVjdFtdKXNkb2NzLnRvQXJyYXkobmV3IFhtbE9iamVjdFswXSk7CisgICAgICAgIAorICAgICAgICAvLyBzdGVwIDI6IGNvbXBpbGUgYWxsIHRoZSBzY2hlbWFzCisgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gdHlwZVN5c3RlbTsKKyAgICAgICAgQ29sbGVjdGlvbiBjb21wRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBYbWxPcHRpb25zIHNjaGVtYU9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICBzY2hlbWFPcHRpb25zLnNldEVycm9yTGlzdGVuZXIoY29tcEVycm9ycyk7CisgICAgICAgIHNjaGVtYU9wdGlvbnMuc2V0Q29tcGlsZURvd25sb2FkVXJscygpOworICAgICAgICBpZiAobm9wdnIpCisgICAgICAgICAgICBzY2hlbWFPcHRpb25zLnNldENvbXBpbGVOb1B2clJ1bGUoKTsKKyAgICAgICAgaWYgKG5vdXBhKQorICAgICAgICAgICAgc2NoZW1hT3B0aW9ucy5zZXRDb21waWxlTm9VcGFSdWxlKCk7CisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZVN5c3RlbSA9IFhtbEJlYW5zLmNvbXBpbGVYc2Qoc2NoZW1hcywgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSwgc2NoZW1hT3B0aW9ucyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNjaGVtYSBpbnZhbGlkIik7CisgICAgICAgICAgICBpZiAoY29tcEVycm9ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGVsc2UgZm9yIChJdGVyYXRvciBpID0gY29tcEVycm9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpLm5leHQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHN0ZXAgMzogZ28gdGhyb3VnaCBhbGwgdGhlIHR5cGVzLCBhbmQgbm90ZSB0aGVpciBiYXNlIHR5cGVzIGFuZCBuYW1lc3BhY2VzCisgICAgICAgIE1hcCBwcmVmaXhlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByZWZpeGVzLnB1dCgiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgInhtbCIpOworICAgICAgICBwcmVmaXhlcy5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInhzIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieG1sbnM6eHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIik7CisgICAgICAgIAorICAgICAgICAvLyBUaGlzIHdpbGwgYmUgYSBtYXAgb2YgKGJhc2UgU2NoZW1hVHlwZSAtPiBDb2xsZWN0aW9uIG9mIGRpcmVjdGx5IGRlcnZpZWQgdHlwZXMpCisgICAgICAgIE1hcCBjaGlsZFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgCisgICAgICAgIC8vIGJyZWFkdGhmaXJzdCB0cmF2ZXJzYWwgb2YgdGhlIHR5cGUgY29udGFpbm1lbnQgdHJlZQorICAgICAgICBMaXN0IGFsbFNlZW5UeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHR5cGVTeXN0ZW0uZG9jdW1lbnRUeXBlcygpKSk7CisgICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0eXBlU3lzdGVtLmF0dHJpYnV0ZVR5cGVzKCkpKTsKKyAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHR5cGVTeXN0ZW0uZ2xvYmFsVHlwZXMoKSkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsU2VlblR5cGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gKFNjaGVtYVR5cGUpYWxsU2VlblR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gcmVjdXJzZSB0aHJvdWdoIG5lc3RlZCBhbm9ueW1vdXMgdHlwZXMgYXMgd2VsbAorICAgICAgICAgICAgaWYgKCFub2Fub24pCisgICAgICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gd2UncmUgbm90IGludGVyZXN0ZWQgaW4gZG9jdW1lbnQgdHlwZXMsIGF0dHJpYnV0ZSB0eXBlcywgb3IgY2hhc2luZyB0aGUgYmFzZSB0eXBlIG9mIGFueVR5cGUKKyAgICAgICAgICAgIGlmIChzVHlwZS5pc0RvY3VtZW50VHlwZSgpIHx8IHNUeXBlLmlzQXR0cmlidXRlVHlwZSgpIHx8IHNUeXBlID09IFhtbE9iamVjdC50eXBlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBhc3NpZ24gYSBwcmVmaXggdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGlzIHR5cGUgaWYgbmVlZGVkCisgICAgICAgICAgICBub3RlTmFtZXNwYWNlKHByZWZpeGVzLCBzVHlwZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGVudGVyIHRoaXMgdHlwZSBpbiB0aGUgbGlzdCBvZiBjaGlsZHJlbiBvZiBpdHMgYmFzZSB0eXBlCisgICAgICAgICAgICBDb2xsZWN0aW9uIGNoaWxkcmVuID0gKENvbGxlY3Rpb24pY2hpbGRUeXBlcy5nZXQoc1R5cGUuZ2V0QmFzZVR5cGUoKSk7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBjaGlsZFR5cGVzLnB1dChzVHlwZS5nZXRCYXNlVHlwZSgpLCBjaGlsZHJlbik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYSBidWlsdGluIHR5cGUgaXMgc2VlbiwgYWRkIGl0IHRvbyAodG8gZ2V0IGEgY29tcGxldGUgdHJlZSB1cCB0byBhbnlUeXBlKQorICAgICAgICAgICAgICAgIGlmIChzVHlwZS5nZXRCYXNlVHlwZSgpLmlzQnVpbHRpblR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZChzVHlwZS5nZXRCYXNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkcmVuLmFkZChzVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHN0ZXAgNDogcHJpbnQgdGhlIHRyZWUsIHN0YXJ0aW5nIGZyb20geHM6YW55VHlwZSAoaS5lLiwgWG1sT2JqZWN0LnR5cGUpCisgICAgICAgIExpc3QgdHlwZXNUb1ByaW50ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0eXBlc1RvUHJpbnQuYWRkKFhtbE9iamVjdC50eXBlKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNwYWNlcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKCF0eXBlc1RvUHJpbnQuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gKFNjaGVtYVR5cGUpdHlwZXNUb1ByaW50LnJlbW92ZSh0eXBlc1RvUHJpbnQuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzcGFjZXMuc2V0TGVuZ3RoKE1hdGgubWF4KDAsIHNwYWNlcy5sZW5ndGgoKSAtIDIpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3BhY2VzICsgIistIiArIFFOYW1lSGVscGVyLnJlYWRhYmxlKHNUeXBlLCBwcmVmaXhlcykgKyBub3RlcyhzVHlwZSkpOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY2hpbGRyZW4gPSAoQ29sbGVjdGlvbiljaGlsZFR5cGVzLmdldChzVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwYWNlcy5hcHBlbmQodHlwZXNUb1ByaW50LnNpemUoKSA9PSAwIHx8IHR5cGVzVG9QcmludC5nZXQodHlwZXNUb1ByaW50LnNpemUoKSAtIDEpID09IG51bGwgPyAiICAiIDogInwgIik7CisgICAgICAgICAgICAgICAgICAgIHR5cGVzVG9QcmludC5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHR5cGVzVG9QcmludC5hZGRBbGwoY2hpbGRyZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm90ZXMoU2NoZW1hVHlwZSBzVHlwZSkKKyAgICB7CisgICAgICAgIGlmIChzVHlwZS5pc0J1aWx0aW5UeXBlKCkpCisgICAgICAgICAgICByZXR1cm4gIiAoYnVpbHRpbikiOworICAgICAgICAKKyAgICAgICAgaWYgKHNUeXBlLmlzU2ltcGxlVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldFNpbXBsZVZhcmlldHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIgKGxpc3QpIjsKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiICh1bmlvbikiOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChzVHlwZS5nZXRFbnVtZXJhdGlvblZhbHVlcygpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiAoZW51bWVyYXRpb24pIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKHNUeXBlLmdldENvbnRlbnRUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAiIChtaXhlZCkiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAiIChjb21wbGV4KSI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG5vdGVOYW1lc3BhY2UoTWFwIHByZWZpeGVzLCBTY2hlbWFUeXBlIHNUeXBlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IFFOYW1lSGVscGVyLm5hbWVzcGFjZShzVHlwZSk7CisgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSB8fCBwcmVmaXhlcy5jb250YWluc0tleShuYW1lc3BhY2UpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBRTmFtZUhlbHBlci5zdWdnZXN0UHJlZml4KG5hbWVzcGFjZSk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBiYXNlOworICAgICAgICBmb3IgKGludCBuID0gMDsgcHJlZml4ZXMuY29udGFpbnNWYWx1ZShyZXN1bHQpOyBuICs9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJhc2UgKyBuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcmVmaXhlcy5wdXQobmFtZXNwYWNlLCByZXN1bHQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhtbG5zOiIgKyByZXN1bHQgKyAiPVwiIiArIG5hbWVzcGFjZSArICJcIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW4uamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE1ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzI3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKKworLyoqCisgKiBNb2RlbGVkIGFmdGVyIEFudCdzIGphdmFjIGFuZCB6aXAgdGFza3MuCisgKgorICogU2NoZW1hIGZpbGVzIHRvIHByb2Nlc3MsIG9yIGRpcmVjdG9yaWVzIG9mIHNjaGVtYSBmaWxlcywgYXJlIHNldCB3aXRoIHRoZSAnc2NoZW1hJworICogYXR0cmlidXRlLCBhbmQgY2FuIGJlIGZpbHRlcmVkIHdpdGggJ2luY2x1ZGVzJyBhbmQgJ2V4Y2x1ZGVzJy4KKyAqIEFsdGVybmF0aXZlbHksIG9uZSBvciBtb3JlIG5lc3RlZCAmbHQ7ZmlsZXNldCZndDsgZWxlbWVudHMgY2FuIHNwZWNpZnkgdGhlIAorICogZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBYTUxCZWFuLgorICogVGhlIGluY2x1ZGUgc2V0IGNhbiBhbHNvIGRlZmluZSAuamF2YSBmaWxlcyB0aGF0IHNob3VsZCBiZSBidWlsdCBhcyB3ZWxsLiAgCisgKiBTZWUgdGhlIEZpbGVTZXQgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2FudC9tYW51YWwvaW5kZXguaHRtbAorICogZm9yIGluc3RydWN0aW9ucyBvbiBGaWxlU2V0cyBpZiB5b3UgYXJlIHVuZmFtaWxpYXIgd2l0aCB0aGVpciB1c2FnZS4KKyAqLworCitwdWJsaWMgY2xhc3MgWE1MQmVhbiBleHRlbmRzIE1hdGNoaW5nVGFzaworeworICAgIHByaXZhdGUgQXJyYXlMaXN0ICAgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHByaXZhdGUgU2V0ICAgICAgICAgbWRlZm5hbWVzcGFjZXM7CisKKyAgICBwcml2YXRlIFBhdGggICAgICAgIGNsYXNzcGF0aDsKKyAgICAKKyAgICBwcml2YXRlIEZpbGUgICAgICAgIGRlc3RmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjZ2VuZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NnZW5kaXI7CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuICAgICBxdWlldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNvbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG9uZXJyb3IgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yayA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyAgICAgIHR5cGVzeXN0ZW1uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeUluaXRpYWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5TWF4aW11bVNpemU7CisgICAgCisgICAgcHJpdmF0ZSBMaXN0ICAgICAgICBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgcHJpdmF0ZSBIYXNoTWFwICAgICBfZXh0Um91dGVyID0gbmV3IEhhc2hNYXAoNSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEID0gIi54c2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMID0gIi53c2RsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFWQSA9ICIuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTRENPTkZJRyA9ICIueHNkY29uZmlnIjsKKworCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLyogVkFMSURBVElPTiAqLworICAgICAgICAvL3JlcXVpcmVkCisgICAgICAgIGlmIChzY2hlbWFzLnNpemUoKSA9PSAwCisgICAgICAgICAgICAmJiBzY2hlbWEgPT0gbnVsbAorICAgICAgICAgICAgJiYgZmlsZXNldC5nZXREaXIocHJvamVjdCkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgJ3NjaGVtYScgb3IgJ2RpcicgYXR0cmlidXRlIG9yIGEgbmVzdGVkIGZpbGVzZXQgaXMgcmVxdWlyZWQuIjsKKyAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgX2V4dFJvdXRlci5wdXQoWFNELCBuZXcgSGFzaFNldCgpKTsKKyAgICAgICAgX2V4dFJvdXRlci5wdXQoV1NETCwgbmV3IEhhc2hTZXQoKSk7CisgICAgICAgIF9leHRSb3V0ZXIucHV0KEpBVkEsIG5ldyBIYXNoU2V0KCkpOworICAgICAgICBfZXh0Um91dGVyLnB1dChYU0RDT05GSUcsIG5ldyBIYXNoU2V0KCkpOworCisgICAgICAgIEZpbGUgdGhlQmFzZWRpciA9IHNjaGVtYTsKKworICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzY2hlbWEuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlU2Nhbm5lciBzY2FubmVyID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihzY2hlbWEpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKHBhdGhzLCBzY2FubmVyLmdldEJhc2VkaXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhlQmFzZWRpciA9IHNjaGVtYS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKG5ldyBTdHJpbmdbXSB7IHNjaGVtYS5nZXROYW1lKCkgfSwgdGhlQmFzZWRpcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmaWxlc2V0LmdldERpcihwcm9qZWN0KSAhPSBudWxsKQorICAgICAgICAgICAgc2NoZW1hcy5hZGQoZmlsZXNldCk7CisgICAgICAgIAorICAgICAgICBJdGVyYXRvciBzaSA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHNpLmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBzaS5uZXh0KCk7CisgICAgICAgICAgICBGaWxlU2Nhbm5lciBzY2FubmVyID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwcm9qZWN0KTsKKyAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IHNjYW5uZXIuZ2V0QmFzZWRpcigpOworICAgICAgICAgICAgU3RyaW5nW10gcGF0aHMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICAgICAgcHJvY2Vzc1BhdGhzKHBhdGhzLCBiYXNlZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldCB4c2RMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoWFNEKTsKKyAgICAgICAgU2V0IHdzZGxMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoV1NETCk7CisgICAgICAgIAorICAgICAgICBpZiAoeHNkTGlzdC5zaXplKCkgKyB3c2RsTGlzdC5zaXplKCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgZmluZCBhbnkgeHNkIG9yIHdzZGwgZmlsZXMgdG8gcHJvY2Vzcy4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vb3B0aW9uYWwKKyAgICAgICAgU2V0IGphdmFMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoSkFWQSk7CisgICAgICAgIFNldCB4c2Rjb25maWdMaXN0ID0gKFNldCkgX2V4dFJvdXRlci5nZXQoWFNEQ09ORklHKTsKKworICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwgJiYgc3Jjb25seSkKKyAgICAgICAgICAgIHNyY2dlbmRpciA9IGNsYXNzZ2VuZGlyOworCisgICAgICAgIGlmIChkZXN0ZmlsZSA9PSBudWxsICYmIGNsYXNzZ2VuZGlyID09IG51bGwgJiYgISBzcmNvbmx5KQorICAgICAgICAgICAgZGVzdGZpbGUgPSBuZXcgRmlsZSgieG1sdHlwZXMuamFyIik7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBxdWlldCA9IGZhbHNlOworCisgICAgICAgIC8qIEVYRUNVVElPTiAqLworCisgICAgICAgIEZpbGVbXSB4c2RBcnJheSA9IChGaWxlW10pIHhzZExpc3QudG9BcnJheShuZXcgRmlsZVt4c2RMaXN0LnNpemUoKV0pOworICAgICAgICBGaWxlW10gd3NkbEFycmF5ID0gKEZpbGVbXSkgd3NkbExpc3QudG9BcnJheShuZXcgRmlsZVt3c2RsTGlzdC5zaXplKCldKTsKKyAgICAgICAgRmlsZVtdIGphdmFBcnJheSA9IChGaWxlW10pIGphdmFMaXN0LnRvQXJyYXkobmV3IEZpbGVbamF2YUxpc3Quc2l6ZSgpXSk7CisgICAgICAgIEZpbGVbXSB4c2Rjb25maWdBcnJheSA9IChGaWxlW10pIHhzZGNvbmZpZ0xpc3QudG9BcnJheShuZXcgRmlsZVt4c2Rjb25maWdMaXN0LnNpemUoKV0pOworICAgICAgICBFcnJvckxvZ2dlciBlcnIgPSBuZXcgRXJyb3JMb2dnZXIodmVyYm9zZSk7CisKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5CisgICAgICAgICAgICBGaWxlIHRtcGRpciA9IG51bGw7CisgICAgICAgICAgICBpZiAoc3JjZ2VuZGlyID09IG51bGwgfHwgY2xhc3NnZW5kaXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXBkaXIgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZVRlbXBEaXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNnZW5kaXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzcmNnZW5kaXIgPSBTY2hlbWFDb2RlR2VuZXJhdG9yLmNyZWF0ZURpcih0bXBkaXIsICJzcmMiKTsKKyAgICAgICAgICAgIGlmIChjbGFzc2dlbmRpciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNsYXNzZ2VuZGlyID0gU2NoZW1hQ29kZUdlbmVyYXRvci5jcmVhdGVEaXIodG1wZGlyLCAiY2xhc3NlcyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB1c2UgdGhlIHN5c3RlbSBjbGFzc3BhdGggaWYgdXNlciBkaWRuJ3QgcHJvdmlkZSBhbnkKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgLy8gcHJlcGVuZCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvbiB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgICBQYXRoLlBhdGhFbGVtZW50IHBhdGhFbGVtZW50ID0gY2xhc3NwYXRoLmNyZWF0ZVBhdGhFbGVtZW50KCk7CisgICAgICAgICAgICBwYXRoRWxlbWVudC5zZXRMb2NhdGlvbihjbGFzc2dlbmRpcik7CisgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nW10gcGF0aHMgPSBjbGFzc3BhdGgubGlzdCgpOworICAgICAgICAgICAgRmlsZVtdIGNwID0gbmV3IEZpbGVbcGF0aHMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgY3BbaV0gPSBuZXcgRmlsZShwYXRoc1tpXSk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNvdXJjZQorICAgICAgICAgICAgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU2NoZW1hQ29tcGlsZXIuUGFyYW1ldGVycygpOworICAgICAgICAgICAgcGFyYW1zLnNldEJhc2VEaXIodGhlQmFzZWRpcik7CisgICAgICAgICAgICBwYXJhbXMuc2V0WHNkRmlsZXMoeHNkQXJyYXkpOworICAgICAgICAgICAgcGFyYW1zLnNldFdzZGxGaWxlcyh3c2RsQXJyYXkpOworICAgICAgICAgICAgcGFyYW1zLnNldEphdmFGaWxlcyhqYXZhQXJyYXkpOworICAgICAgICAgICAgcGFyYW1zLnNldENvbmZpZ0ZpbGVzKHhzZGNvbmZpZ0FycmF5KTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc3BhdGgoY3ApOworICAgICAgICAgICAgLy9wYXJhbXMuc2V0T3V0cHV0SmFyKGRlc3RmaWxlKTsgLy8gYWx3YXlzIHVzZSB0aGUgamFyIHRhc2sgYmVsb3cKKyAgICAgICAgICAgIHBhcmFtcy5zZXROYW1lKHR5cGVzeXN0ZW1uYW1lKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZ2VuZGlyKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZ2VuZGlyKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXROb2phdmFjKHRydWUpOyAvLyBhbHdheXMgY29tcGlsZSB1c2luZyBqYXZhYyB0YXNrIGJlbG93CisgICAgICAgICAgICBwYXJhbXMuc2V0RGVidWcoZGVidWcpOworICAgICAgICAgICAgcGFyYW1zLnNldFZlcmJvc2UodmVyYm9zZSk7CisgICAgICAgICAgICBwYXJhbXMuc2V0UXVpZXQocXVpZXQpOworICAgICAgICAgICAgcGFyYW1zLnNldERvd25sb2FkKGRvd25sb2FkKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOworICAgICAgICAgICAgcGFyYW1zLnNldEVycm9yTGlzdGVuZXIoZXJyKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRNZGVmTmFtZXNwYWNlcyhtZGVmbmFtZXNwYWNlcyk7CisgICAgICAgICAgICBzdWNjZXNzID0gU2NoZW1hQ29tcGlsZXIuY29tcGlsZShwYXJhbXMpOworCisgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiAhc3Jjb25seSkgeworICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgIEphdmFjIGphdmFjID0gbmV3IEphdmFjKCk7CisgICAgICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBqYXZhYy5zZXRUYXNrTmFtZShnZXRUYXNrTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBqYXZhYy5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGlsZXIgIT0gbnVsbCkgamF2YWMuc2V0Q29tcGlsZXIoY29tcGlsZXIpOworICAgICAgICAgICAgICAgIGphdmFjLnNldERlYnVnKGRlYnVnKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWdMZXZlbCAhPSBudWxsKSBqYXZhYy5zZXREZWJ1Z0xldmVsKGRlYnVnTGV2ZWwpOworICAgICAgICAgICAgICAgIGphdmFjLnNldERlc3RkaXIoY2xhc3NnZW5kaXIpOworICAgICAgICAgICAgICAgIGphdmFjLnNldEV4ZWN1dGFibGUoZm9ya2VkRXhlY3V0YWJsZSk7CisgICAgICAgICAgICAgICAgamF2YWMuc2V0RmFpbG9uZXJyb3IoZmFpbG9uZXJyb3IpOworICAgICAgICAgICAgICAgIGphdmFjLnNldEZvcmsoZm9yayk7CisgICAgICAgICAgICAgICAgamF2YWMuc2V0SW5jbHVkZWFudHJ1bnRpbWUoaW5jbHVkZUFudFJ1bnRpbWUpOworICAgICAgICAgICAgICAgIGphdmFjLnNldEluY2x1ZGVqYXZhcnVudGltZShpbmNsdWRlSmF2YVJ1bnRpbWUpOworICAgICAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihuZXcgUGF0aChwcm9qZWN0LCBzcmNnZW5kaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAobWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUobWVtb3J5SW5pdGlhbFNpemUpOworICAgICAgICAgICAgICAgIGlmIChtZW1vcnlNYXhpbXVtU2l6ZSAhPSBudWxsKSBqYXZhYy5zZXRNZW1vcnlNYXhpbXVtU2l6ZShtZW1vcnlNYXhpbXVtU2l6ZSk7CisgICAgICAgICAgICAgICAgamF2YWMuc2V0T3B0aW1pemUob3B0aW1pemUpOworICAgICAgICAgICAgICAgIGphdmFjLnNldFZlcmJvc2UodmVyYm9zZSk7CisgICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOworCisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KQorICAgICAgICAgICAgICAgICAgICBsb2coIlRpbWUgdG8gY29tcGlsZSBjb2RlOiAiICsgKChkb3VibGUpKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMCkgKyAiIHNlY29uZHMiKTsKKworICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gamFyIHRoZSBjb21waWxlZCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgIEphciBqYXIgPSBuZXcgSmFyKCk7CisgICAgICAgICAgICAgICAgICAgIGphci5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBqYXIuc2V0VGFza05hbWUoZ2V0VGFza05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGphci5zZXRCYXNlZGlyKGNsYXNzZ2VuZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgamFyLnNldERlc3RGaWxlKGRlc3RmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgamFyLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0bXBkaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNjaGVtYUNvZGVHZW5lcmF0b3IudHJ5SGFyZFRvRGVsZXRlKHRtcGRpcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQorICAgICAgICB7CisgICAgICAgICAgICAvL2ludGVycnVwdGVkIG1lYW5zIGNhbmNlbAorICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvZygiRXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIHNjaGVtYXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworICAgICAgICAgICAgbG9nKHN3LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdWNjZXNzICYmIGZhaWxvbmVycm9yKQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCk7IC8vc3RvcCB0aGUgYnVpbGQKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhdGhzKFN0cmluZ1tdIHBhdGhzLCBGaWxlIGJhc2VEaXIpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZG90ID0gcGF0aHNbaV0ubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChkb3QgPiAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBwb3NzRXh0ID0gcGF0aC5zdWJzdHJpbmcoZG90KS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIFNldCBzZXQgPSAoU2V0KSBfZXh0Um91dGVyLmdldChwb3NzRXh0KTsKKworICAgICAgICAgICAgICAgIGlmIChzZXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChuZXcgRmlsZShiYXNlRGlyLCBwYXRoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgZmlsZXNldCkKKyAgICB7CisgICAgICAgIHNjaGVtYXMuYWRkKGZpbGVzZXQpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy9HZXR0ZXIvU2V0dGVycworICAgIHB1YmxpYyBGaWxlIGdldFNjaGVtYSgpCisgICAgeworICAgICAgICByZXR1cm4gc2NoZW1hOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmlsZSB0aGF0IHBvaW50cyB0byBlaXRoZXIgYW4gaW5kaXZpZHVhbCBzY2hlbWEgZmlsZSBvciBhIGRpcmVjdG9yeSBvZiBmaWxlcy4KKyAgICAgKiBJdCBpcyBvcHRpb25hbCBvbmx5IGlmIG9uZSBvciBtb3JlICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cyBhcmUgbmVzdGVkIGluIHRoaXMKKyAgICAgKiB0YXNrLgorICAgICAqIEBwYXJhbSBzY2hlbWEgUmVxdWlyZWQsIHVubGVzcyBhIGZpbGVzZXQgZWxlbWVudCBpcyBuZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKEZpbGUgc2NoZW1hKQorICAgIHsKKyAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzcGF0aCB0byB1c2UgaWYgc2NoZW1hcyBpbiB0aGUgZmlsZXNldCBpbXBvcnQgZGVmaW5pdGlvbnMgdGhhdCBhcmUKKyAgICAgKiBzdXBwbGllZCBieSBvdGhlciBjb21waWxlZCB4bWwgYmVhbnMgSkFSIGZpbGVzLCBvciBpZiAuamF2YSBmaWxlcyBhcmUgaW4gdGhlCisgICAgICogc2NoZW1hIGZpbGVzZXQuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggY2xhc3NwYXRoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuY2xhc3NwYXRoICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBjbGFzc3BhdGg7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aHJlZiBPcHRpb25hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIGNsYXNzcGF0aHJlZikKKyAgICB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICAKKyAgICAgICAgY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKS5zZXRSZWZpZChjbGFzc3BhdGhyZWYpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXREZXN0ZmlsZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVzdGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZSBjcmVhdGVkLiAgRm9yIGluc3RhbmNlLCAibXlYTUxCZWFuLmphciIKKyAgICAgKiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0cyBvZiB0aGlzIHRhc2sgaW50byBhIGphciB3aXRoIHRoZSBzYW1lIG5hbWUuCisgICAgICogT3B0aW9uYWwsIGRlZmF1bHRzIHRvICJ4bWx0eXBlcy5qYXIiLgorICAgICAqIEBwYXJhbSBkZXN0ZmlsZSBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGZpbGUoRmlsZSBkZXN0ZmlsZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVzdGZpbGUgPSBkZXN0ZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRTcmNnZW5kaXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNyY2dlbmRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBsb2NhdGlvbiB0byBnZW5lcmF0ZSAuamF2YSBmaWxlcyBpbnRvLiAgT3B0aW9uYWwsIGRlZmF1bHRzIHRvCisgICAgICogYSB0ZW1wIGRpci4KKyAgICAgKiBAcGFyYW0gc3JjZ2VuZGlyIE9wdGlvbmFsLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNnZW5kaXIoRmlsZSBzcmNnZW5kaXIpCisgICAgeworICAgICAgICB0aGlzLnNyY2dlbmRpciA9IHNyY2dlbmRpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRDbGFzc2dlbmRpcigpCisgICAgeworICAgICAgICByZXR1cm4gY2xhc3NnZW5kaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbG9jYXRpb24gdG8gZ2VuZXJhdGUgLmNsYXNzIGZpbGVzIGludG8uICBPcHRpb25hbCwgZGVmYXVsdHMgdG8KKyAgICAgKiBhIHRlbXAgZGlyLgorICAgICAqIEBwYXJhbSBjbGFzc2dlbmRpciBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NnZW5kaXIoRmlsZSBjbGFzc2dlbmRpcikKKyAgICB7CisgICAgICAgIHRoaXMuY2xhc3NnZW5kaXIgPSBjbGFzc2dlbmRpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKQorICAgIHsKKyAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbXBpbGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rvd25sb2FkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkb3dubG9hZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwZXJtaXQgdGhlIGNvbXBpbGVyIHRvIGRvd25sb2FkIFVSTHMgZm9yIGltcG9ydHMKKyAgICAgKiBhbmQgaW5jbHVkZXMuICBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBhbGwgaW1wb3J0cyBhbmQgaW5jbHVkZXMKKyAgICAgKiBtdXN0IGJlIGNvcGllZCBsb2NhbGx5LgorICAgICAqIEBwYXJhbSBkb3dubG9hZCBPcHRpb25hbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZChib29sZWFuIGRvd25sb2FkKQorICAgIHsKKyAgICAgICAgdGhpcy5kb3dubG9hZCA9IGRvd25sb2FkOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3B0aW1pemUoYm9vbGVhbiBvcHRpbWl6ZSkgeworICAgICAgICB0aGlzLm9wdGltaXplID0gb3B0aW1pemU7CisgICAgfQorCisgICAgLyoqIEdldHMgdGhlIG9wdGltaXplIGZsYWcuICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3B0aW1pemUoKSB7CisgICAgICAgIHJldHVybiBvcHRpbWl6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcmJvc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSB2ZXJib3NlIE9wdGlvbmFsLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkKKyAgICB7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNRdWlldCgpCisgICAgeworICAgICAgICByZXR1cm4gcXVpZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgdGhlIGFtb3VudCBvZiBvdXRwdXQuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gcXVpZXQgT3B0aW9uYWwuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHNldFF1aWV0KGJvb2xlYW4gcXVpZXQpCisgICAgeworICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpCisgICAgeworICAgICAgICByZXR1cm4gZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiBkZWJ1Z0xldmVsLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgZGVidWdMZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlYnVnTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBkZWJ1Z0xldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWcgY29tbWFuZC1saW5lIHN3aXRjaC4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybgorICAgICAqIGFuZCBjbGFzc2ljKHZlciA+PSAxLjIpLiBMZWdhbCB2YWx1ZXMgYXJlIG5vbmUgb3IgYQorICAgICAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGxpbmVzLCB2YXJzLAorICAgICAqIGFuZCBzb3VyY2UuIElmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgOm5vbmUKKyAgICAgKiB3aWxsIGJlIGFwcGVuZGVkIHRvIC1nLiBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZQorICAgICAqIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gZGVidWdMZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKFN0cmluZyAgdikgeworICAgICAgICB0aGlzLmRlYnVnTGV2ZWwgPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzLgorICAgICAqIEBwYXJhbSBkZWJ1ZyBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0RGVidWcoYm9vbGVhbiBkZWJ1ZykKKyAgICB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiAidHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmsoYm9vbGVhbiBmKSB7CisgICAgICAgIGZvcmsgPSBmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLgorICAgICAqCisgICAgICogPHA+SWdub3JlZCB1bmxlc3MgZm9yayBpcyB0cnVlIG9yIGV4dEphdmFjIGhhcyBiZWVuIHNwZWNpZmllZAorICAgICAqIGFzIHRoZSBjb21waWxlci48L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZm9ya0V4ZWMpIHsKKyAgICAgICAgZm9ya2VkRXhlY3V0YWJsZSA9IGZvcmtFeGVjOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZvcmtlZEV4ZWN1dGFibGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTcmNvbmx5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBzcmNvbmx5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyB0aGF0IG9ubHkgc291cmNlIHdpbGwgYmUgZ2VuZXJhdGVkLiAgT3B0aW9uYWwsCisgICAgICogZGVmYXVsdCBpcyBmYWxzZS4KKyAgICAgKiBAcGFyYW0gc3Jjb25seSBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0U3Jjb25seShib29sZWFuIHNyY29ubHkpCisgICAgeworICAgICAgICB0aGlzLnNyY29ubHkgPSBzcmNvbmx5OworICAgIH0KKyAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVzeXN0ZW1uYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlc3lzdGVtbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBTY2hlbWFDb21waWxlciBleHRlbnNpb25zIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7ZXh0ZW5zaW9uPiBzdWJlbGVtZW50LgorICAgICAqICBTY2hlbWEgQ29tcGlsZXIgZXh0ZW5zaW9ucyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGNvbS54YmVhbi50b28uU2NoZW1hQ29tcGlsZXJFeHRlbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbigpIHsKKyAgICAgICAgRXh0ZW5zaW9uIGUgPSBuZXcgRXh0ZW5zaW9uKCk7CisgICAgICAgIGV4dGVuc2lvbnMuYWRkKGUpOworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBuYW1lc3BhY2VzIGluIHdoaWNoIGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBhcmUgdG8gYmUgaWdub3JlZAorICAgICAqIGNhbiBiZSBwYXNzZWQgaW4gdmlhIHRoZSAmbHQ7aWdub3JlRHVwbGljYXRlc0luTmFtZXNwYWNlcz4gc3ViZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVEdXBsaWNhdGVzSW5OYW1lc3BhY2VzKFN0cmluZyBuYW1lc3BhY2VzKSB7CisgICAgICAgIG1kZWZuYW1lc3BhY2VzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lc3BhY2VzLCAiLCIpOworICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQorICAgICAgICB7CisgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICBtZGVmbmFtZXNwYWNlcy5hZGQobmFtZXNwYWNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWdub3JlRHVwbGljYXRlc0luTmFtZXNwYWNlcygpIHsKKyAgICAgICAgaWYgKG1kZWZuYW1lc3BhY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEl0ZXJhdG9yIGkgPSBtZGVmbmFtZXNwYWNlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKFN0cmluZylpLm5leHQoKSk7CisgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgdGhlIFR5cGVTeXN0ZW1Ib2xkZXIgY2xhc3Mgc2hvdWxkIGJlIAorICAgICAqIGdlbmVyYXRlZCBpbi4gTm9ybWFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCB1bnNwZWNpZmllZC4gIE5vbmUgb2YKKyAgICAgKiB0aGUgeG1sIGJlYW5zIGFyZSBnZW5lcmF0ZWQgaW4gdGhpcyBwYWNrYWdlLgorICAgICAqIDxCUj48QlI+VXNlIC54c2Rjb25maWcgZmlsZXMgdG8gbW9kaWZ5IHhtbCBiZWFuIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZXMuCisgICAgICogQHBhcmFtIHR5cGVzeXN0ZW1uYW1lIE9wdGlvbmFsLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlc3lzdGVtbmFtZShTdHJpbmcgdHlwZXN5c3RlbW5hbWUpCisgICAgeworICAgICAgICB0aGlzLnR5cGVzeXN0ZW1uYW1lID0gdHlwZXN5c3RlbW5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsb25lcnJvcigpCisgICAgeworICAgICAgICByZXR1cm4gZmFpbG9uZXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgYW50IHRhcmdldCB3aWxsIGNvbnRpbnVlIGlmIHRoZSBYTUxCZWFuCisgICAgICogY3JlYXRpb24gZW5jb3VudGVycyBhIGJ1aWxkIGVycm9yLiAgRGVmYXVsdHMgdG8gdHJ1ZS4gIE9wdGlvbmFsLgorICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciBPcHRpb25hbC4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0RmFpbG9uZXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikKKyAgICB7CisgICAgICAgIHRoaXMuZmFpbG9uZXJyb3IgPSBmYWlsb25lcnJvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVBbnRSdW50aW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmNsdWRlQW50UnVudGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQW50UnVudGltZShib29sZWFuIGluY2x1ZGVBbnRSdW50aW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlQW50UnVudGltZSA9IGluY2x1ZGVBbnRSdW50aW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUphdmFSdW50aW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmNsdWRlSmF2YVJ1bnRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUphdmFSdW50aW1lKGJvb2xlYW4gaW5jbHVkZUphdmFSdW50aW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlSmF2YVJ1bnRpbWUgPSBpbmNsdWRlSmF2YVJ1bnRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbml0aWFsIG1lbW9yeSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGphdmFjIHByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnlJbml0aWFsU2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gbWVtb3J5SW5pdGlhbFNpemU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVtb3J5SW5pdGlhbFNpemUoU3RyaW5nIG1lbW9yeUluaXRpYWxTaXplKQorICAgIHsKKyAgICAgICAgdGhpcy5tZW1vcnlJbml0aWFsU2l6ZSA9IG1lbW9yeUluaXRpYWxTaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgc2l6ZSBvZiB0aGUgdW5kZXJseWluZyBqYXZhYyBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtb3J5TWF4aW11bVNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbW9yeU1heGltdW1TaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeU1heGltdW1TaXplKFN0cmluZyBtZW1vcnlNYXhpbXVtU2l6ZSkKKyAgICB7CisgICAgICAgIHRoaXMubWVtb3J5TWF4aW11bVNpemUgPSBtZW1vcnlNYXhpbXVtU2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgdXJpRnJvbUZpbGUoRmlsZSBmKQorICAgIHsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZi5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERvbid0IHNwaXQgb3V0IGFuIGV4Y2VwdGlvbiBoZXJlIGJlY2F1c2Ugb24gV2luZG93cyB5b3UnbGwgZ2V0IG9uZQorICAgICAgICAgICAgLy8gaWYgdGhlIGZpbGVuYW1lIGlzICJhdXgiLCAibHB0MSIsIGV0Yy4gSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkKKyAgICAgICAgICAgIC8vIHRvIGRlYWwgd2l0aCB0aG9zZSBjYXNlcyBjb3JyZWN0bHksIHVzdWFsbHkgYnkgY2FsbGluZyBGaWxlU3ZjLmludmFsaWRQYXRoQ2hlY2soKQorICAgICAgICAgICAgLy8gTWVzc2FnZVN2Yy5nZXQoKS5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICByZXR1cm4gZi5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSSSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEVycm9yTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX25vaXN5OworICAgICAgICBwcml2YXRlIFVSSSBfYmFzZVVSSTsKKworICAgICAgICBwdWJsaWMgRXJyb3JMb2dnZXIoYm9vbGVhbiBub2lzeSkKKyAgICAgICAgeworICAgICAgICAgICAgX25vaXN5ID0gbm9pc3k7CisgICAgICAgICAgICBfYmFzZVVSSSA9IHVyaUZyb21GaWxlKHByb2plY3QuZ2V0QmFzZURpcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPSAoWG1sRXJyb3IpbzsKKyAgICAgICAgICAgICAgICBpZiAoZXJyLmdldFNldmVyaXR5KCkgPT0gWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IpCisgICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVyci5nZXRTZXZlcml0eSgpID09IFhtbEVycm9yLlNFVkVSSVRZX1dBUk5JTkcpCisgICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfbm9pc3kpCisgICAgICAgICAgICAgICAgICAgIGxvZyhlcnIudG9TdHJpbmcoX2Jhc2VVUkkpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWE1MQmVhblhTVENIYXJuZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4N2M3MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hNTEJlYW5YU1RDSGFybmVzcy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitwdWJsaWMgY2xhc3MgWE1MQmVhblhTVENIYXJuZXNzIGltcGxlbWVudHMgWFNUQ1Rlc3Rlci5IYXJuZXNzCit7CisgICAgcHVibGljIHZvaWQgcnVuVGVzdENhc2UoWFNUQ1Rlc3Rlci5UZXN0Q2FzZVJlc3VsdCByZXN1bHQpCisgICAgeworICAgICAgICBYU1RDVGVzdGVyLlRlc3RDYXNlIHRlc3RDYXNlID0gcmVzdWx0LmdldFRlc3RDYXNlKCk7CisgICAgICAgIAorICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgY2FzZSAiICsgdGVzdENhc2UuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBib29sZWFuIHNjaGVtYVZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW5zdGFuY2VWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHN0ZXAgMSwgbG9hZCBzY2hlbWEgZmlsZSBldGMuCisgICAgICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxPYmplY3Qgc2NoZW1hID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpLCBuZXcgWG1sT3B0aW9ucygpLnNldEVycm9yTGlzdGVuZXIoZXJyb3JzKS5zZXRMb2FkTGluZU51bWJlcnMoKSk7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0IHNjaGVtYTIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRSZXNvdXJjZUZpbGUoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzY2hlbWEyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UodGVzdENhc2UuZ2V0UmVzb3VyY2VGaWxlKCksIG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpLnNldExvYWRMaW5lTnVtYmVycygpKTsKKyAgICAgICAgICAgICAgICBYbWxPYmplY3RbXSBzY2hlbWFzID0gc2NoZW1hMiA9PSBudWxsID8gbmV3IFhtbE9iamVjdFtdIHsgc2NoZW1hIH0gOiBuZXcgWG1sT2JqZWN0W10geyBzY2hlbWEsIHNjaGVtYTIgfTsKKyAgICAgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSA9IFhtbEJlYW5zLmNvbXBpbGVYc2Qoc2NoZW1hcywgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSwgbmV3IFhtbE9wdGlvbnMoKS5zZXRFcnJvckxpc3RlbmVyKGVycm9ycykpOworICAgICAgICAgICAgICAgIGxvYWRlciA9IFhtbEJlYW5zLnR5cGVMb2FkZXJVbmlvbihuZXcgU2NoZW1hVHlwZUxvYWRlcltdIHsgc3lzdGVtLCBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjaGVtYVZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFhtbEV4Y2VwdGlvbikgfHwgZXJyb3JzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDcmFzaCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFN2TWVzc2FnZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN3LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdC5hZGRTdk1lc3NhZ2VzKGVycm9ycyk7CisgICAgICAgICAgICByZXN1bHQuc2V0U3ZBY3R1YWwoc2NoZW1hVmFsaWQpOworICAgICAgICAgICAgZXJyb3JzLmNsZWFyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3RlcCAyLCBsb2FkIGluc3RhbmNlIGZpbGUgYW5kIHZhbGlkYXRlCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxPYmplY3QgaW5zdGFuY2UgPSBsb2FkZXIucGFyc2UodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCksIG51bGwsIG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpLnNldExvYWRMaW5lTnVtYmVycygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlLnZhbGlkYXRlKG5ldyBYbWxPcHRpb25zKCkuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpKSkKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluc3RhbmNlVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgWG1sRXhjZXB0aW9uKSB8fCBlcnJvcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldENyYXNoKHRydWUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkSXZNZXNzYWdlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3cudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hZGRJdk1lc3NhZ2VzKGVycm9ycyk7CisgICAgICAgICAgICByZXN1bHQuc2V0SXZBY3R1YWwoaW5zdGFuY2VWYWxpZCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC5zdWNjZWVkZWQoKSA/ICJTdWNjZXNzLiI6ICJGYWlsdXJlLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWFNUQ1Rlc3Rlci5qYXZhIGIvdjEvc3JjL3htbGNvbXAvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3Rvb2wvWFNUQ1Rlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGNlOWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9YU1RDVGVzdGVyLmphdmEKQEAgLTAsMCArMSw0MTUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDYWxlbmRhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuVGVzdHNEb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueG1sYmVhbi5sdGdmbXQuRmlsZURlc2M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitwdWJsaWMgY2xhc3MgWFNUQ1Rlc3RlcgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAKKyAgICAgICAgQ29tbWFuZExpbmUgY2wgPSBuZXcgQ29tbWFuZExpbmUoYXJncywgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKKyAgICAgICAgYm9vbGVhbiBzaG93cGFzcyA9IChjbC5nZXRPcHQoInNob3dwYXNzIikgIT0gbnVsbCk7CisgICAgICAgIEZpbGVbXSBhbGxGaWxlcyA9IGNsLmdldEZpbGVzKCk7CisgICAgICAgIENvbGxlY3Rpb24gbHRnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEhhcm5lc3MgaGFybmVzcyA9IG5ldyBYTUxCZWFuWFNUQ0hhcm5lc3MoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsRmlsZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbGxGaWxlc1tpXS5nZXROYW1lKCkuaW5kZXhPZigiTFRHIikgPj0gMCkKKyAgICAgICAgICAgICAgICBsdGdGaWxlcy5hZGQoYWxsRmlsZXNbaV0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGaWxlIHJlc3VsdHNGaWxlID0gbmV3IEZpbGUoIm91dC5odG1sIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihyZXN1bHRzRmlsZSkpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPGh0bWw+Iik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8c3R5bGU+dGQge2JvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFja30geG1wIHt3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbH0gPC9zdHlsZT4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIjxib2R5PiIpOworCisgICAgICAgIHdyaXRlci5wcmludGxuKCI8c2NyaXB0IGxhbmd1YWdlPSdKYXZhU2NyaXB0JyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPiIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigidmFyIHc7Iik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJmdW5jdGlvbiBvcGVuV2luZG93KHNjaGVtYSwgaW5zdGFuY2UpIHsiKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgaWYgKHcgPT0gbnVsbCkgeyIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiICAgIHcgPSB3aW5kb3cub3BlbignYWJvdXQ6YmxhbmsnLCAneHN0YycpOyIpOworCSAgICB3cml0ZXIucHJpbnRsbigiICB9Iik7CisJICAgIHdyaXRlci5wcmludGxuKCIgIGlmICh3LmNsb3NlZCkgeyIpOworCQl3cml0ZXIucHJpbnRsbigiICAgIHcgPSB3aW5kb3cub3BlbignYWJvdXQ6YmxhbmsnLCAneHN0YycpOyIpOworCSAgICB3cml0ZXIucHJpbnRsbigiICB9Iik7CisJICAgIHdyaXRlci5wcmludGxuKCIgIHcuZG9jdW1lbnQub3BlbigpOyIpOworCSAgICB3cml0ZXIucHJpbnRsbigiICB3LmRvY3VtZW50LndyaXRlKFwiPGZyYW1lc2V0IHJvd3M9KiwqPjxmcmFtZSBzcmM9J1wiICsgc2NoZW1hICsgXCInPjxmcmFtZSBzcmM9J1wiICsgaW5zdGFuY2UgKyBcIic+PC9mcmFtZXNldD5cIik7Iik7CisJICAgIHdyaXRlci5wcmludGxuKCIgIHcuZG9jdW1lbnQuY2xvc2UoKTsiKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgdy5mb2N1cygpOyIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigifSIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9zY3JpcHQ+Iik7CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIjxoMT5YTUwgU2NoZW1hIFRlc3QgQ29sbGVjdGlvbiBSZXN1bHRzPC9oMT4iKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIjxwPlJ1biBvbiAiICsgKG5ldyBYbWxDYWxlbmRhcihuZXcgRGF0ZSgpKSkgKyAiPC9wPiIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPHRhYmxlIHN0eWxlPSdib3JkZXI6IDFweCBzb2xpZCBibGFjaycgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPiIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPHRyPjx0ZCB3aWR0aD03NSU+RGVzY3JpcHRpb248L3RkPjx0ZCB3aWR0aD0xMi41JT5zY2ggdjwvdGQ+PHRkIHdpZHRoPTEyLjUlPmlucyB2PC90ZD48L3RyPiIpOworICAgICAgICBpbnQgZmFpbHVyZXMgPSAwOworICAgICAgICBpbnQgY2FzZXMgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsdGdGaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGx0Z0ZpbGUgPSAoRmlsZSlpLm5leHQoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyB0ZXN0IGNhc2VzIGluICIgKyBsdGdGaWxlKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gbHRnRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgVGVzdENhc2VbXSB0ZXN0Q2FzZXMgPSBwYXJzZUxUR0ZpbGUobHRnRmlsZSwgbHRnRXJyb3JzKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGlmICh0ZXN0Q2FzZXMgIT0gbnVsbCkgZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0Q2FzZXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdENhc2VSZXN1bHQgcmVzdWx0ID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnRlc3RDYXNlID0gdGVzdENhc2VzW2pdOworICAgICAgICAgICAgICAgIGhhcm5lc3MucnVuVGVzdENhc2UocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBjYXNlcyArPSAxOworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnN1Y2NlZWRlZCgpKQorICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcyArPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzaG93cGFzcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkIGNvbHNwYW49MyBiZ2NvbG9yPXNreWJsdWU+IiArIGx0Z0ZpbGUgKyAiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgaWYgKCFsdGdFcnJvcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkPkVycm9ycyB3aXRoaW4gdGhlIExURyBmaWxlOiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8eG1wPiIpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGx0Z0Vycm9ycy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihqLm5leHQoKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwveG1wPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkIGNvbHNwYW49MyBiZ2NvbG9yPWdyZWVuPk5vdGhpbmcgdG8gcmVwb3J0PC90ZD48L3RyPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHJlc3VsdHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkgOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW1tYXJpemVSZXN1bHRBc0hUTUxUYWJsZVJvd3MoKFRlc3RDYXNlUmVzdWx0KWoubmV4dCgpLCB3cml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8dHI+PHRkIGNvbHNwYW49Mz5TdW1tYXJ5OiAiICsgZmFpbHVyZXMgKyAiIGZhaWx1cmVzIG91dCBvZiAiICsgY2FzZXMgKyAiIGNhc2VzIHJ1bi48L3RkPjwvdHI+Iik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8L3RhYmxlPiIpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgCisgICAgICAgIGxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZSBydW4gdGVzdHM6ICIgKyAoKGRvdWJsZSkoZmluaXNoIC0gc3RhcnQpIC8gMTAwMC4wKSArICIgc2Vjb25kcyIgKTsKKyAgICAgICAgCisgICAgICAgIC8vIExhdW5jaCByZXN1bHRzCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndpbmRvd3MiKSA+PSAwKQorICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygiY21kIC9jIHN0YXJ0IGlleHBsb3JlIFwiIiArIHJlc3VsdHNGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIlwiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyBvdXRwdXQgdG8gIiArIHJlc3VsdHNGaWxlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2FzZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIGx0Z0ZpbGU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOworICAgICAgICBwcml2YXRlIFN0cmluZyBvcmlnaW47CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBwcml2YXRlIEZpbGUgc2NoZW1hRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIGluc3RhbmNlRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlIHJlc291cmNlRmlsZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN2RXhwZWN0ZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdkV4cGVjdGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcnZFeHBlY3RlZDsKKworICAgICAgICBwdWJsaWMgRmlsZSBnZXRMdGdGaWxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGx0Z0ZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFNjaGVtYUZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2NoZW1hRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldEluc3RhbmNlRmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZUZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZSBnZXRSZXNvdXJjZUZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VGaWxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdkV4cGVjdGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN2RXhwZWN0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0l2RXhwZWN0ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXZFeHBlY3RlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnZFeHBlY3RlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBydkV4cGVjdGVkOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENhc2VSZXN1bHQKKyAgICB7CisgICAgICAgIHByaXZhdGUgVGVzdENhc2UgdGVzdENhc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzdkFjdHVhbDsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIHN2TWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdkFjdHVhbDsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGl2TWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjcmFzaDsKKworICAgICAgICBwdWJsaWMgVGVzdENhc2UgZ2V0VGVzdENhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGVzdENhc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N2QWN0dWFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN2QWN0dWFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3ZBY3R1YWwoYm9vbGVhbiBzdkFjdHVhbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zdkFjdHVhbCA9IHN2QWN0dWFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJdkFjdHVhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdkFjdHVhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEl2QWN0dWFsKGJvb2xlYW4gaXZBY3R1YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaXZBY3R1YWwgPSBpdkFjdHVhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldFN2TWVzc2FnZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihzdk1lc3NhZ2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFN2TWVzc2FnZXMoQ29sbGVjdGlvbiBzdk1lc3NhZ2VzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnN2TWVzc2FnZXMuYWRkQWxsKHN2TWVzc2FnZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24gZ2V0SXZNZXNzYWdlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGl2TWVzc2FnZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkSXZNZXNzYWdlcyhDb2xsZWN0aW9uIGl2TWVzc2FnZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaXZNZXNzYWdlcy5hZGRBbGwoaXZNZXNzYWdlcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENyYXNoKGJvb2xlYW4gY3Jhc2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY3Jhc2ggPSBjcmFzaDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDcmFzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjcmFzaDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VjY2VlZGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFjcmFzaCAmJiAoaXNJdkFjdHVhbCgpID09IHRlc3RDYXNlLmlzSXZFeHBlY3RlZCgpKSAmJiAoaXNTdkFjdHVhbCgpID09IHRlc3RDYXNlLmlzU3ZFeHBlY3RlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBIYXJuZXNzCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBydW5UZXN0Q2FzZShUZXN0Q2FzZVJlc3VsdCByZXN1bHQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlSFRNTExpbmsoRmlsZSBmaWxlLCBib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAiJm5ic3A7IjsKKyAgICAgICAgVVJJIHVyaSA9IGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkkoKTsKKyAgICAgICAgcmV0dXJuICI8YSBocmVmPVwiIiArIHVyaSArICJcIiB0YXJnZXQ9X2JsYW5rPiIgKyBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSArICI8L2E+IjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBsZWFkaW5nU3BhY2UgPSBQYXR0ZXJuLmNvbXBpbGUoIl5cXHMrIiwgUGF0dGVybi5NVUxUSUxJTkUpOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VIVE1MRGVzY3JpcHRpb24oVGVzdENhc2UgdGVzdENhc2UpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPGEgY2xhc3M9bm9saW5lIGhyZWY9J2phdmFzY3JpcHQ6b3BlbldpbmRvdyhcIiIpOworICAgICAgICBpZiAodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoImFib3V0Ok5vIHNjaGVtYSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzYi5hcHBlbmQodGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFxcXFxcXFwiKSk7CisKKyAgICAgICAgc2IuYXBwZW5kKCJcIiwgXCIiKTsKKyAgICAgICAgaWYgKHRlc3RDYXNlLmdldEluc3RhbmNlRmlsZSgpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoImFib3V0Ok5vIGluc3RhbmNlIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIikpOworICAgICAgICBzYi5hcHBlbmQoIlwiKSc+PHhtcD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxlYWRpbmdTcGFjZS5tYXRjaGVyKHRlc3RDYXNlLmdldERlc2NyaXB0aW9uKCkpLnJlcGxhY2VBbGwoIiIpICsgIigiICsgdGVzdENhc2UuZ2V0SWQoKSArICIpIik7CisgICAgICAgIHNiLmFwcGVuZCgiPC94bXA+PC9hPiIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1bW1hcml6ZVJlc3VsdEFzSFRNTFRhYmxlUm93cyhUZXN0Q2FzZVJlc3VsdCByZXN1bHQsIFByaW50V3JpdGVyIG91dCkKKyAgICB7CisgICAgICAgIFRlc3RDYXNlIHRlc3RDYXNlID0gcmVzdWx0LmdldFRlc3RDYXNlKCk7CisgICAgICAgIGJvb2xlYW4gc1JpZ2h0ID0gdGVzdENhc2UuZ2V0U2NoZW1hRmlsZSgpID09IG51bGwgfHwgdGVzdENhc2UuaXNTdkV4cGVjdGVkKCkgPT0gcmVzdWx0LmlzU3ZBY3R1YWwoKTsKKyAgICAgICAgYm9vbGVhbiBpUmlnaHQgPSB0ZXN0Q2FzZS5nZXRJbnN0YW5jZUZpbGUoKSA9PSBudWxsIHx8IHRlc3RDYXNlLmlzSXZFeHBlY3RlZCgpID09IHJlc3VsdC5pc0l2QWN0dWFsKCk7CisgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbihyZXN1bHQuaXNDcmFzaCgpID8gIjx0ciBiZ2NvbG9yPWJsYWNrIGNvbG9yPXdoaXRlPiIgOiAiPHRyPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRkIHZhbGlnbj10b3A+IiArIG1ha2VIVE1MRGVzY3JpcHRpb24odGVzdENhc2UpICsgIjwvdGQ+Iik7CisgICAgICAgIFN0cmluZyBzTGlua3M7CisgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRSZXNvdXJjZUZpbGUoKSA9PSBudWxsKQorICAgICAgICAgICAgc0xpbmtzID0gbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldFNjaGVtYUZpbGUoKSwgcmVzdWx0LmlzU3ZBY3R1YWwoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNMaW5rcyA9IG1ha2VIVE1MTGluayh0ZXN0Q2FzZS5nZXRTY2hlbWFGaWxlKCksIHJlc3VsdC5pc1N2QWN0dWFsKCkpICsgIjxicj4iICsgbWFrZUhUTUxMaW5rKHRlc3RDYXNlLmdldFJlc291cmNlRmlsZSgpLCByZXN1bHQuaXNTdkFjdHVhbCgpKTsKKyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKChzUmlnaHQgPyAiPHRkIHZhbGlnbj10b3A+IiA6IHJlc3VsdC5pc1N2QWN0dWFsKCkgPyAiPHRkIGJnY29sb3I9b3JhbmdlIHZhbGlnbj10b3A+IiA6ICI8dGQgYmdjb2xvcj1yZWQgdmFsaWduPXRvcD4iKSArIHNMaW5rcyArICI8L3RkPiIpOworICAgICAgICBvdXQucHJpbnRsbigoaVJpZ2h0ID8gIjx0ZCB2YWxpZ249dG9wPiIgOiByZXN1bHQuaXNJdkFjdHVhbCgpID8gIjx0ZCBiZ2NvbG9yPW9yYW5nZSB2YWxpZ249dG9wPiIgOiAiPHRkIGJnY29sb3I9cmVkIHZhbGlnbj10b3A+IikgKyBtYWtlSFRNTExpbmsodGVzdENhc2UuZ2V0SW5zdGFuY2VGaWxlKCksIHJlc3VsdC5pc0l2QWN0dWFsKCkpICsgIjwvdGQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RyPiIpOworICAgICAgICBpZiAoIXJlc3VsdC5nZXRJdk1lc3NhZ2VzKCkuaXNFbXB0eSgpIHx8ICFyZXN1bHQuZ2V0U3ZNZXNzYWdlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2VlZGVkKCkpCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zIGJnY29sb3I9eWVsbG93Pjx4bXA+Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0cj48dGQgY29sc3Bhbj0zPjx4bXA+Iik7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSByZXN1bHQuZ2V0U3ZNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oai5uZXh0KCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gcmVzdWx0LmdldEl2TWVzc2FnZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGoubmV4dCgpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3htcD48L3RyPjwvdGQ+Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBUZXN0Q2FzZVtdIHBhcnNlTFRHRmlsZShGaWxlIGx0Z0ZpbGUsIENvbGxlY3Rpb24gb3V0ZXJFcnJvcnMpCisgICAgeworICAgICAgICBDb2xsZWN0aW9uIGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9wdGlvbnMgbHRnT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgICAgICBsdGdPcHRpb25zLnNldExvYWRTdWJzdGl0dXRlTmFtZXNwYWNlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoIiIsICJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL2x0Z2ZtdCIpKTsKKyAgICAgICAgICAgIGx0Z09wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvcnMpOworICAgICAgICAgICAgbHRnT3B0aW9ucy5zZXRMb2FkTGluZU51bWJlcnMoKTsKKyAgICAgICAgICAgIFRlc3RzRG9jdW1lbnQgZG9jID0gVGVzdHNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGx0Z0ZpbGUsIGx0Z09wdGlvbnMpOworICAgICAgICAgICAgaWYgKCFkb2MudmFsaWRhdGUobHRnT3B0aW9ucykpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRG9jdW1lbnQgIiArIGx0Z0ZpbGUgKyAiIG5vdCB2YWxpZC4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhtbGJlYW4ubHRnZm10LlRlc3RDYXNlW10gdGVzdENhc2VzID0gZG9jLmdldFRlc3RzKCkuZ2V0VGVzdEFycmF5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Q2FzZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdENhc2UgbmV3Q2FzZSA9IG5ldyBUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIG5ld0Nhc2UubHRnRmlsZSA9IGx0Z0ZpbGU7CisgICAgICAgICAgICAgICAgbmV3Q2FzZS5pZCA9IHRlc3RDYXNlc1tpXS5nZXRJZCgpOworICAgICAgICAgICAgICAgIG5ld0Nhc2Uub3JpZ2luID0gdGVzdENhc2VzW2ldLmdldE9yaWdpbigpOworICAgICAgICAgICAgICAgIG5ld0Nhc2UuZGVzY3JpcHRpb24gPSB0ZXN0Q2FzZXNbaV0uZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgICAgICBGaWxlRGVzY1tdIGZpbGVkZXNjcyA9IHRlc3RDYXNlc1tpXS5nZXRGaWxlcygpLmdldEZpbGVBcnJheSgpOworICAgICAgICAgICAgICAgIHRlc3RDYXNlc1tpXS5nZXRPcmlnaW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVkZXNjcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBmaWxlZGVzY3Nbal0uZ2V0Rm9sZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGVkZXNjc1tqXS5nZXRGaWxlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBGaWxlIHRoZUZpbGUgPSBuZXcgRmlsZShsdGdGaWxlLmdldFBhcmVudEZpbGUoKSwgZGlyICsgIi8iICsgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRoZUZpbGUuZXhpc3RzKCkgfHwgIXRoZUZpbGUuaXNGaWxlKCkgfHwgIXRoZUZpbGUuY2FuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJDYW4ndCByZWFkIGZpbGUgIiArIHRoZUZpbGUsIGZpbGVkZXNjc1tqXSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWxlZGVzY3Nbal0uZ2V0Um9sZSgpLmludFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsZURlc2MuUm9sZS5JTlRfSU5TVEFOQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Nhc2UuaW5zdGFuY2VGaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyRXJyb3JzLmFkZChYbWxFcnJvci5mb3JPYmplY3QoIk1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgZmlsZSBzcGVpY2lmZWQgLSBpZ25vcmluZyBhbGwgYnV0IGxhc3QiLCBmaWxlZGVzY3Nbal0pLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2UuaW5zdGFuY2VGaWxlID0gdGhlRmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLml2RXhwZWN0ZWQgPSBmaWxlZGVzY3Nbal0uZ2V0VmFsaWRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmlsZURlc2MuUm9sZS5JTlRfU0NIRU1BOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXNlLnNjaGVtYUZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKFhtbEVycm9yLmZvck9iamVjdCgiTW9yZSB0aGFuIG9uZSBzY2hlbWEgZmlsZSBzcGVpY2lmZWQgLSBpZ25vcmluZyBhbGwgYnV0IGxhc3QiLCBmaWxlZGVzY3Nbal0pLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nhc2Uuc2NoZW1hRmlsZSA9IHRoZUZpbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5zdkV4cGVjdGVkID0gZmlsZWRlc2NzW2pdLmdldFZhbGlkaXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbGVEZXNjLlJvbGUuSU5UX1JFU09VUkNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDYXNlLnJlc291cmNlRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckVycm9ycy5hZGQoWG1sRXJyb3IuZm9yT2JqZWN0KCJNb3JlIHRoYW4gb25lIHJlc291cmNlIGZpbGUgc3BlaWNpZmVkIC0gaWdub3JpbmcgYWxsIGJ1dCBsYXN0IiwgZmlsZWRlc2NzW2pdKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDYXNlLnJlc291cmNlRmlsZSA9IHRoZUZpbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2FzZS5ydkV4cGVjdGVkID0gZmlsZWRlc2NzW2pdLmdldFZhbGlkaXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbihYbWxFcnJvci5mb3JPYmplY3QoIlVuZXhwZWN0ZWQgZmlsZSByb2xlIiwgZmlsZWRlc2NzW2pdKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXdDYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoVGVzdENhc2VbXSlyZXN1bHQudG9BcnJheShuZXcgVGVzdENhc2VbcmVzdWx0LnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVycm9ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGVsc2UgZm9yIChJdGVyYXRvciBpID0gZXJyb3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgb3V0ZXJFcnJvcnMuYWRkKGkubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YSBiL3YxL3NyYy94bWxjb21wL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC90b29sL1hzYkR1bXBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGQ1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29tcC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvdG9vbC9Yc2JEdW1wZXIuamF2YQpAQCAtMCwwICsxLDEyMjggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC51dGlsLkhleEJpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hTG9jYWxBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFQYXJ0aWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnNvYXAuU09BUEFycmF5VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGNsYXNzIFhzYkR1bXBlcgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGR1bXAobmV3IEZpbGUoYXJnc1tpXSksIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkdW1wKEZpbGUgZmlsZSwgYm9vbGVhbiBmb3JjZSkKKyAgICB7CisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKAorICAgICAgICAgICAgICAgIG5ldyBGaWxlRmlsdGVyKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsZS5pc0ZpbGUoKSAmJiBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzYiIpOyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHVtcChmaWxlc1tpXSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikgfHwgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgZHVtcFppcChmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmb3JjZSB8fCBmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhzYiIpKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkdW1wKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksICIgICIpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBaaXAoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGZpbGUpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHppcEZpbGUuZW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi54c2IiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBkdW1wKHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpLCAiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKElucHV0U3RyZWFtIGlucHV0KQorICAgIHsKKyAgICAgICAgZHVtcChpbnB1dCwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgaW5kZW50KQorICAgIHsKKyAgICAgICAgWHNiRHVtcGVyIGR1bXBlciA9IG5ldyBYc2JEdW1wZXIoaW5wdXQsIGluZGVudCk7CisgICAgICAgIGR1bXBlci5kdW1wQWxsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBYc2JEdW1wZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgaW5kZW50KQorICAgIHsKKyAgICAgICAgX2lucHV0ID0gbmV3IERhdGFJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICBfaW5kZW50ID0gaW5kZW50OworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSB7IFN5c3RlbS5vdXQuZmx1c2goKTsgfQorICAgIHZvaWQgZW1pdChTdHJpbmcgc3RyKSB7IFN5c3RlbS5vdXQucHJpbnRsbihfaW5kZW50ICsgc3RyKTsgZmx1c2goKTsgfQorICAgIHZvaWQgZW1pdCgpIHsgU3lzdGVtLm91dC5wcmludGxuKCk7IGZsdXNoKCk7IH0KKyAgICB2b2lkIGVycm9yKEV4Y2VwdGlvbiBlKSB7IFN5c3RlbS5vdXQucHJpbnRsbihlLnRvU3RyaW5nKCkpOyBmbHVzaCgpOyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZTIgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSApOyBlMi5pbml0Q2F1c2UoIGUgKTsgdGhyb3cgZTI7IH0KKyAgICB2b2lkIGVycm9yKFN0cmluZyBzdHIpIHsgU3lzdGVtLm91dC5wcmludGxuKHN0cik7IGZsdXNoKCk7IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlMiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIHN0ciApOyB0aHJvdyBlMjsgfQorICAgIHByaXZhdGUgU3RyaW5nIF9pbmRlbnQ7CisgICAgdm9pZCBpbmRlbnQoKSB7IF9pbmRlbnQgKz0gIiAgIjsgfQorICAgIHZvaWQgb3V0ZGVudCgpIHsgX2luZGVudCA9IF9pbmRlbnQuc3Vic3RyaW5nKDAsIF9pbmRlbnQubGVuZ3RoKCkgLSAyKTsgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9CQUJFID0gMHhEQTdBQkFCRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUpPUl9WRVJTSU9OID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5PUl9WRVJTSU9OID0gMTg7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFJTkRFWCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BVFlQRSA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BRUxFTUVOVCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFQT0lOVEVSID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFNT0RFTEdST1VQID0gNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFVFlQRV9TQ0hFTUFBVFRSSUJVVEVHUk9VUCA9IDc7CisKKyAgICBzdGF0aWMgU3RyaW5nIGZpbGV0eXBlU3RyaW5nKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlOREVYOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUlOREVYIjsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BVFlQRTogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFUWVBFIjsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BRUxFTUVOVDogcmV0dXJuICJGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UIjsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURSI7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVBPSU5URVI6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BUE9JTlRFUiI7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQU1PREVMR1JPVVA6IHJldHVybiAiRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUCI7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQOiByZXR1cm4gIkZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURUdST1VQIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIEZJTEVUWVBFICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9TS0lQUEFCTEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSVhFRCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX05JTExBQkxFID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tFWFQgPSAxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQkxPQ0tSRVNUID0gMzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0JMT0NLU1VCU1QgPSA2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BBUlRfQUJTVFJBQ1QgPSAxMjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QQVJUX0ZJTkFMRVhUID0gMjU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUEFSVF9GSU5BTFJFU1QgPSA1MTI7CisKKyAgICBzdGF0aWMgU3RyaW5nIHBhcnRpY2xlZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9TS0lQUEFCTEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9TS0lQUEFCTEUgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9GSVhFRCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJWEVEIHwgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfTklMTEFCTEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9OSUxMQUJMRSB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0JMT0NLRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tFWFQgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS1JFU1QpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUEFSVF9CTE9DS1JFU1QgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9CTE9DS1NVQlNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQkxPQ0tTVUJTVCB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QQVJUX0FCU1RSQUNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfQUJTVFJBQ1QgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUEFSVF9GSU5BTEVYVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QQVJUX0ZJTkFMRVhUIHwgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX1BBUlRfRklOQUxSRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BBUlRfRklOQUxSRVNUIHwgIik7CisgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgcmVzdWx0LmFwcGVuZCgiMCB8ICIpOworICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkgLSAzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSVNBVFRSID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFPUFRJT05BTCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19QUk9QX0pBVkFBUlJBWSA9IDg7CisKKyAgICBzdGF0aWMgU3RyaW5nIHByb3BlcnR5ZmxhZ3NTdHJpbmcoaW50IGZsYWdzKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9JU0FUVFIpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfUFJPUF9JU0FUVFIgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUFJPUF9KQVZBU0lOR0xFVE9OKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1BST1BfSkFWQVNJTkdMRVRPTiB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QUk9QX0pBVkFPUFRJT05BTCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFPUFRJT05BTCB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19QUk9QX0pBVkFBUlJBWSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19QUk9QX0pBVkFBUlJBWSB8ICIpOworICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApIHJlc3VsdC5hcHBlbmQoIjAgfCAiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfTk9ORSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfR0xPQkFMID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9MT0NBTEFUVFIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0xPQ0FMRUxUID0gMzsKKworICAgIHN0YXRpYyBTdHJpbmcgY29udGFpbmVyZmllbGRUeXBlU3RyaW5nKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEZJRUxEX05PTkU6IHJldHVybiAiRklFTERfTk9ORSI7CisgICAgICAgICAgICBjYXNlIEZJRUxEX0dMT0JBTDogcmV0dXJuICJGSUVMRF9HTE9CQUwiOworICAgICAgICAgICAgY2FzZSBGSUVMRF9MT0NBTEFUVFI6IHJldHVybiAiRklFTERfTE9DQUxBVFRSIjsKKyAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxFTFQ6IHJldHVybiAiRklFTERfTE9DQUxFTFQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gY29udGFpbmVyIGZpZWxkIHR5cGUgKCIgKyBjb2RlICsgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdHlwZSBmbGFncworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TSU1QTEVfVFlQRSAgICAgPSAweDE7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ1VNRU5UX1RZUEUgICA9IDB4MjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1JERVJFRCAgICAgICAgID0gMHg0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CT1VOREVEICAgICAgICAgPSAweDg7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTklURSAgICAgICAgICA9IDB4MTA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX05VTUVSSUMgICAgICAgICA9IDB4MjA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1NUUklOR0VOVU0gICAgICA9IDB4NDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1VOSU9OX09GX0xJU1RTICA9IDB4ODA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0hBU19QQVRURVJOICAgICA9IDB4MTAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19PUkRFUl9TRU5TSVRJVkUgPSAweDIwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfVE9UQUxfT1JERVIgICAgID0gMHg0MDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTVBJTEVEICAgICAgICA9IDB4ODAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CTE9DS19FWFQgICAgICAgPSAweDEwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JMT0NLX1JFU1QgICAgICA9IDB4MjAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOQUxfRVhUICAgICAgID0gMHg0MDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5BTF9SRVNUICAgICAgPSAweDgwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX1VOSU9OICAgICA9IDB4MTAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZJTkFMX0xJU1QgICAgICA9IDB4MjAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FCU1RSQUNUICAgICAgICA9IDB4NDAwMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0FUVFJJQlVURV9UWVBFICA9IDB4ODAwMDA7CisKKyAgICBzdGF0aWMgU3RyaW5nIHR5cGVmbGFnc1N0cmluZyhpbnQgZmxhZ3MpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19TSU1QTEVfVFlQRSkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19TSU1QTEVfVFlQRSB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19ET0NVTUVOVF9UWVBFKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0RPQ1VNRU5UX1RZUEUgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQVRUUklCVVRFX1RZUEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQVRUUklCVVRFX1RZUEUgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfT1JERVJFRCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19PUkRFUkVEIHwgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0JPVU5ERUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQk9VTkRFRCB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19GSU5JVEUpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOSVRFIHwgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX05VTUVSSUMpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfTlVNRVJJQyB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19TVFJJTkdFTlVNKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX1NUUklOR0VOVU0gfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfVU5JT05fT0ZfTElTVFMpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfVU5JT05fT0ZfTElTVFMgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfSEFTX1BBVFRFUk4pICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfSEFTX1BBVFRFUk4gfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfVE9UQUxfT1JERVIpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfVE9UQUxfT1JERVIgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ09NUElMRUQpICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfQ09NUElMRUQgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQkxPQ0tfRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JMT0NLX0VYVCB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19CTE9DS19SRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0JMT0NLX1JFU1QgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfRVhUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX0VYVCB8ICIpOworICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19GSU5BTF9SRVNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0ZJTkFMX1JFU1QgfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfVU5JT04pICE9IDApIHJlc3VsdC5hcHBlbmQoIkZMQUdfRklOQUxfVU5JT04gfCAiKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfRklOQUxfTElTVCkgIT0gMCkgcmVzdWx0LmFwcGVuZCgiRkxBR19GSU5BTF9MSVNUIHwgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FCU1RSQUNUKSAhPSAwKSByZXN1bHQuYXBwZW5kKCJGTEFHX0FCU1RSQUNUIHwgIik7CisgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgcmVzdWx0LmFwcGVuZCgiMCB8ICIpOworICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkgLSAzKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBBbGwoKQorICAgIHsKKyAgICAgICAgaW50IGZpbGV0eXBlID0gZHVtcEhlYWRlcigpOworICAgICAgICBzd2l0Y2ggKGZpbGV0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUlOREVYOgorICAgICAgICAgICAgICAgIGR1bXBJbmRleERhdGEoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQVRZUEU6CisgICAgICAgICAgICAgICAgZHVtcFR5cGVGaWxlRGF0YSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGSUxFVFlQRV9TQ0hFTUFFTEVNRU5UOgorICAgICAgICAgICAgICAgIGR1bXBQYXJ0aWNsZURhdGEodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZJTEVUWVBFX1NDSEVNQUFUVFJJQlVURToKKyAgICAgICAgICAgICAgICBkdW1wQXR0cmlidXRlRGF0YSh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BUE9JTlRFUjoKKyAgICAgICAgICAgICAgICBkdW1wUG9pbnRlckRhdGEoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BTU9ERUxHUk9VUDoKKyAgICAgICAgICAgICAgICBkdW1wTW9kZWxHcm91cERhdGEoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklMRVRZUEVfU0NIRU1BQVRUUklCVVRFR1JPVVA6CisgICAgICAgICAgICAgICAgZHVtcEF0dHJpYnV0ZUdyb3VwRGF0YSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlYWRFbmQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGhleDMyU3RyaW5nKGludCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBkdW1wSGVhZGVyKCkKKyAgICB7CisgICAgICAgIGludCBtYWdpYyA9IHJlYWRJbnQoKTsKKyAgICAgICAgZW1pdCgiTWFnaWMgY29va2llOiAiICsgaGV4MzJTdHJpbmcobWFnaWMpKTsKKworICAgICAgICBpZiAobWFnaWMgIT0gREFUQV9CQUJFKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KCJXcm9uZyBtYWdpYyBjb29raWUuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIF9tYWpvcnZlciA9IHJlYWRTaG9ydCgpOworICAgICAgICBfbWlub3J2ZXIgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTgsIDApKQorICAgICAgICAgICAgX3JlbGVhc2VubyA9IHJlYWRTaG9ydCgpOworCisgICAgICAgIGVtaXQoIk1ham9yIHZlcnNpb246ICIgKyBfbWFqb3J2ZXIpOworICAgICAgICBlbWl0KCJNaW5vciB2ZXJzaW9uOiAiICsgX21pbm9ydmVyKTsKKyAgICAgICAgZW1pdCgiUmVsZWFzZSBudW1iZXI6ICIgKyBfcmVsZWFzZW5vKTsKKworICAgICAgICBpZiAoX21ham9ydmVyICE9IE1BSk9SX1ZFUlNJT04gfHwgX21pbm9ydmVyID4gTUlOT1JfVkVSU0lPTikKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgiSW5jb21wYXRpYmxlIHZlcnNpb24uIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhY3R1YWxmaWxldHlwZSA9IHJlYWRTaG9ydCgpOworICAgICAgICBlbWl0KCJGaWxldHlwZTogIiArIGZpbGV0eXBlU3RyaW5nKGFjdHVhbGZpbGV0eXBlKSk7CisKKyAgICAgICAgX3N0cmluZ1Bvb2wgPSBuZXcgU3RyaW5nUG9vbCgpOworICAgICAgICBfc3RyaW5nUG9vbC5yZWFkRnJvbShfaW5wdXQpOworCisgICAgICAgIHJldHVybiBhY3R1YWxmaWxldHlwZTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBQb2ludGVyRGF0YSgpCisgICAgeworICAgICAgICBlbWl0KCJUeXBlIHN5c3RlbTogIiArIHJlYWRTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcEluZGV4RGF0YSgpCisgICAgeworICAgICAgICAvLyBoYXMgYSBoYW5kbGUgcG9vbCAoY291bnQsIGhhbmRsZS90eXBlLCBoYW5kbGUvdHlwZS4uLikKKyAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZW1pdCgiSGFuZGxlIHBvb2wgKCIgKyBzaXplICsgIik6Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHNob3J0IGNvZGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGVtaXQoaGFuZGxlICsgIiAoIiArIGZpbGV0eXBlU3RyaW5nKGNvZGUpICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBvdXRkZW50KCk7CisKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgZWxlbWVudHMiKTsKKworICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgYXR0cmlidXRlcyIpOworCisgICAgICAgIC8vIGF0dHIgZ3JvdXBzIGFuZCBtb2RlbCBncm91cHMKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJNb2RlbCBncm91cHMiKTsKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJBdHRyaWJ1dGUgZ3JvdXBzIik7CisKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJJZGVudGl0eSBjb25zdHJhaW50cyIpOworCisgICAgICAgIC8vIHFuYW1lIG1hcCBvZiBnbG9iYWwgdHlwZXMKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJHbG9iYWwgdHlwZXMiKTsKKworICAgICAgICAvLyBxbmFtZSBtYXAgb2YgZG9jdW1lbnQgdHlwZXMsIGJ5IHRoZSBxbmFtZSBvZiB0aGUgY29udGFpbmVkIGVsZW1lbnQKKyAgICAgICAgZHVtcFFOYW1lTWFwKCJEb2N1bWVudCB0eXBlcyIpOworICAgICAgICAKKyAgICAgICAgLy8gcW5hbWUgbWFwIG9mIGF0dHJpYnV0ZSB0eXBlcywgYnkgdGhlIHFuYW1lIG9mIHRoZSBjb250YWluZWQgYXR0cmlidXRlCisgICAgICAgIGR1bXBRTmFtZU1hcCgiQXR0cmlidXRlIHR5cGVzIik7CisKKyAgICAgICAgLy8gYWxsIHRoZSB0eXBlcyBpbmRleGVkIGJ5IGNsYXNzbmFtZQorICAgICAgICBkdW1wQ2xhc3NuYW1lSW5kZXgoIkFsbCB0eXBlcyBieSBjbGFzc25hbWUiKTsKKworICAgICAgICAvLyBhbGwgdGhlIG5hbWVzcGFjZXMKKyAgICAgICAgZHVtcFN0cmluZ0FycmF5KCJEZWZpbmVkIG5hbWVzcGFjZXMiKTsKKyAgICAgICAgCisgICAgICAgIC8vIHZlcnNpb24gMTUgc3R1ZmYgZm9yIHJlZGVmaW5lcworICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNSwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZWZpbmVkIGdsb2JhbCB0eXBlcyIpOworICAgICAgICAgICAgZHVtcFFOYW1lTWFwKCJSZWRmaW5lZCBtb2RlbCBncm91cHMiKTsKKyAgICAgICAgICAgIGR1bXBRTmFtZU1hcCgiUmVkZmluZWQgYXR0cmlidXRlIGdyb3VwcyIpOworICAgICAgICB9CisKKyAgICAgICAgcmVhZEVuZCgpOworICAgIH0KKworCisgICAgY2xhc3MgU3RyaW5nUG9vbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBMaXN0IGludHNUb1N0cmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHByaXZhdGUgTWFwIHN0cmluZ3NUb0ludHMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIFN0cmluZ1Bvb2woKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRzVG9TdHJpbmdzLmFkZChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHJpbmdGb3JDb2RlKGludCBjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpaW50c1RvU3RyaW5ncy5nZXQoY29kZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29kZUZvclN0cmluZyhTdHJpbmcgc3RyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKXN0cmluZ3NUb0ludHMuZ2V0KHN0cik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEludGVnZXIoaW50c1RvU3RyaW5ncy5zaXplKCkpOworICAgICAgICAgICAgICAgIGludHNUb1N0cmluZ3MuYWRkKHN0cik7CisgICAgICAgICAgICAgICAgc3RyaW5nc1RvSW50cy5wdXQoc3RyLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWFkRnJvbShEYXRhSW5wdXRTdHJlYW0gaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRzVG9TdHJpbmdzLnNpemUoKSAhPSAxIHx8IHN0cmluZ3NUb0ludHMuc2l6ZSgpICE9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGlucHV0LnJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgIGVtaXQoIlN0cmluZyBwb29sICgiICsgc2l6ZSArICIpOiIpOworICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGlucHV0LnJlYWRVVEYoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBjb2RlRm9yU3RyaW5nKHN0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IGkpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoY29kZSArICIgPSBcIiIgKyBzdHIgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0ZGVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdChlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWN0aXZlIHdoaWxlIGxvYWRpbmcgb25lIHR5cGUuCisgICAgRGF0YUlucHV0U3RyZWFtIF9pbnB1dDsKKyAgICBTdHJpbmdQb29sIF9zdHJpbmdQb29sOworCisgICAgc2hvcnQgcmVhZFNob3J0KCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2lucHV0LnJlYWRTaG9ydCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcihlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IHJlYWRJbnQoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZEludCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcihlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIHJlYWRTdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9zdHJpbmdQb29sLnN0cmluZ0ZvckNvZGUocmVhZFNob3J0KCkpOworICAgIH0KKworICAgIFFOYW1lIHJlYWRRTmFtZSgpCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVhZFN0cmluZygpOworICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gcmVhZFN0cmluZygpOworICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsbmFtZSk7CisgICAgfQorCisgICAgU3RyaW5nIHJlYWRIYW5kbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmcoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgcmVhZFR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRIYW5kbGUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHFuYW1lU3RyaW5nKFFOYW1lIHFuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKHFuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIihudWxsKSI7CisgICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHFuYW1lLmdldExvY2FsUGFydCgpICsgIkAiICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHFuYW1lU2V0U3RyaW5nKFFOYW1lU2V0IHNldCkKKyAgICB7CisgICAgICAgIHJldHVybiBzZXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBRTmFtZU1hcChTdHJpbmcgZmllbGRuYW1lKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiICgiICsgc2l6ZSArICIpOiIpOworICAgICAgICBpbmRlbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQocW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpICsgIiA9ICIgKyByZWFkSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIG91dGRlbnQoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBUeXBlQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7CisgICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKKyAgICAgICAgaW5kZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KGkgKyAiID0gIiArIHJlYWRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIG91dGRlbnQoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBDbGFzc25hbWVJbmRleChTdHJpbmcgZmllbGRuYW1lKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZW1pdChmaWVsZG5hbWUgKyAiICgiICsgc2l6ZSArICIpOiIpOworICAgICAgICBpbmRlbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQocmVhZFN0cmluZygpICsgIiA9ICIgKyByZWFkVHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBvdXRkZW50KCk7CisgICAgfQorCisgICAgdm9pZCBkdW1wU3RyaW5nQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gcmVhZFNob3J0KCk7CisgICAgICAgIGVtaXQoZmllbGRuYW1lICsgIiAoIiArIHNpemUgKyAiKToiKTsKKyAgICAgICAgaW5kZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0ZGVudCgpOworICAgIH0KKworICAgIHZvaWQgcmVhZEVuZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG9oLCB3ZWxsLgorICAgICAgICB9CisgICAgICAgIF9pbnB1dCA9IG51bGw7CisgICAgICAgIF9zdHJpbmdQb29sID0gbnVsbDsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHBhcnRpY2xlVHlwZVN0cmluZyhpbnQgc3B0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzcHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuQUxMOiByZXR1cm4gIkFMTCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRTogcmV0dXJuICJDSE9JQ0UiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5FTEVNRU5UOiByZXR1cm4gIkVMRU1FTlQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TRVFVRU5DRTogcmV0dXJuICJTRVFVRU5DRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOiByZXR1cm4gIldJTERDQVJEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHBhcnRpY2xlIHR5cGUgKCIgKyBzcHQgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGJpZ0ludGVnZXJTdHJpbmcoQmlnSW50ZWdlciBiaWdpbnQpCisgICAgeworICAgICAgICBpZiAoYmlnaW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIihudWxsKSI7CisgICAgICAgIHJldHVybiBiaWdpbnQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHdjcHJvY2Vzc1N0cmluZyhpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFQYXJ0aWNsZS5TVFJJQ1Q6IHJldHVybiAiU1RSSUNUIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0tJUDogcmV0dXJuICJTS0lQIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuTEFYOiByZXR1cm4gIkxBWCI7CisgICAgICAgICAgICBjYXNlIDA6IHJldHVybiAiTk9UX1dJTERDQVJEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHByb2Nlc3MgdHlwZSAoIiArIGNvZGUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGR1bXBQYXJ0aWNsZURhdGEoYm9vbGVhbiBnbG9iYWwpCisgICAgeworICAgICAgICBzaG9ydCBwYXJ0aWNsZVR5cGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZW1pdChwYXJ0aWNsZVR5cGVTdHJpbmcocGFydGljbGVUeXBlKSArICI6Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBzaG9ydCBwYXJ0aWNsZUZsYWdzID0gcmVhZFNob3J0KCk7CisgICAgICAgIGVtaXQoIkZsYWdzOiAiICsgcGFydGljbGVmbGFnc1N0cmluZyhwYXJ0aWNsZUZsYWdzKSk7CisKKyAgICAgICAgZW1pdCgiTWluT2NjdXJzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7CisgICAgICAgIGVtaXQoIk1heE9jY3VyczogIiArIGJpZ0ludGVnZXJTdHJpbmcocmVhZEJpZ0ludGVnZXIoKSkpOworCisgICAgICAgIGVtaXQoIlRyYW5zaXRpb246ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOworCisgICAgICAgIHN3aXRjaCAocGFydGljbGVUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLldJTERDQVJEOgorICAgICAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHNldDogIiArIHFuYW1lU2V0U3RyaW5nKHJlYWRRTmFtZVNldCgpKSk7CisgICAgICAgICAgICAgICAgZW1pdCgiV2lsZGNhcmQgcHJvY2VzczogIiArIHdjcHJvY2Vzc1N0cmluZyhyZWFkU2hvcnQoKSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkVMRU1FTlQ6CisgICAgICAgICAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZW1pdCgiVHlwZTogIiArIHJlYWRUeXBlKCkpOworICAgICAgICAgICAgICAgIGVtaXQoIkRlZmF1bHQ6ICIgKyByZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE2LCAwKSkKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJXc2RsQXJyYXlUeXBlOiAiICsgU09BUEFycmF5VHlwZVN0cmluZyhyZWFkU09BUEFycmF5VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdExlYXN0KDIsIDE3LCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoIlN1YnN0aXR1dGlvbiBncm91cCBoZWFkICIgKyByZWFkSGFuZGxlKCkpOworCisgICAgICAgICAgICAgICAgICAgIHNob3J0IHN1YnN0R3JvdXBDb3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgICAgICAgICBlbWl0KCJTdWJzdGl0dXRpb24gZ3JvdXAgbWVtYmVycyAoIiArIHN1YnN0R3JvdXBDb3VudCArICIpIik7CisgICAgICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0R3JvdXBDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0ZGVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJJZGVudGl0eSBjb25zdHJhaW50cyAoIiArIGNvdW50ICsgIik6Iik7CisgICAgICAgICAgICAgICAgaW5kZW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChyZWFkSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRkZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbCkKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiRmlsZW5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkFMTDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUGFydGljbGUuU0VRVUVOQ0U6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVBhcnRpY2xlLkNIT0lDRToKKyAgICAgICAgICAgICAgICBkdW1wUGFydGljbGVBcnJheSgiUGFydGljbGUgY2hpbGRyZW4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBlcnJvcigiVW5yZWNvZ25pemVkIHNjaGVtYSBwYXJ0aWNsZSB0eXBlIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0ZGVudCgpOworICAgIH0KKworICAgIHZvaWQgZHVtcFBhcnRpY2xlQXJyYXkoU3RyaW5nIGZpZWxkbmFtZSkKKyAgICB7CisgICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICBlbWl0KGZpZWxkbmFtZSArICIoIiArIGNvdW50ICsgIik6Iik7CisgICAgICAgIGluZGVudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICBkdW1wUGFydGljbGVEYXRhKGZhbHNlKTsKKyAgICAgICAgb3V0ZGVudCgpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgY29tcGxleFZhcmlldHlTdHJpbmcoaW50IGNvZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTVBUWV9DT05URU5UOiByZXR1cm4gIkVNUFRZX0NPTlRFTlQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UOiByZXR1cm4gIlNJTVBMRV9DT05URU5UIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQ6IHJldHVybiAiRUxFTUVOVF9DT05URU5UIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UOiByZXR1cm4gIk1JWEVEX0NPTlRFTlQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gY29tcGxleCB2YXJpZXR5ICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgc2ltcGxlVmFyaWV0eVN0cmluZyhpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzogcmV0dXJuICJBVE9NSUMiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkxJU1Q6IHJldHVybiAiTElTVCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046IHJldHVybiAiVU5JT04iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gc2ltcGxlIHZhcmlldHkgKCIgKyBjb2RlICsgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIGZhY2V0Q29kZVN0cmluZyhpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0xFTkdUSDogcmV0dXJuICJGQUNFVF9MRU5HVEgiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9MRU5HVEg6IHJldHVybiAiRkFDRVRfTUlOX0xFTkdUSCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0xFTkdUSDogcmV0dXJuICJGQUNFVF9NQVhfTEVOR1RIIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NSU5fRVhDTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01JTl9FWENMVVNJVkUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX01JTl9JTkNMVVNJVkU6IHJldHVybiAiRkFDRVRfTUlOX0lOQ0xVU0lWRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRkFDRVRfTUFYX0lOQ0xVU0lWRTogcmV0dXJuICJGQUNFVF9NQVhfSU5DTFVTSVZFIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5GQUNFVF9NQVhfRVhDTFVTSVZFOiByZXR1cm4gIkZBQ0VUX01BWF9FWENMVVNJVkUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX1RPVEFMX0RJR0lUUzogcmV0dXJuICJGQUNFVF9UT1RBTF9ESUdJVFMiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkZBQ0VUX0ZSQUNUSU9OX0RJR0lUUzogcmV0dXJuICJGQUNFVF9GUkFDVElPTl9ESUdJVFMiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZmFjZXQgY29kZSAoIiArIGNvZGUgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgd2hpdGVzcGFjZUNvZGVTdHJpbmcoaW50IGNvZGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5XU19DT0xMQVBTRTogcmV0dXJuICJXU19DT0xMQVBTRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfUFJFU0VSVkU6IHJldHVybiAiV1NfUFJFU0VSVkUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLldTX1JFUExBQ0U6IHJldHVybiAiV1NfUkVQTEFDRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuV1NfVU5TUEVDSUZJRUQ6IHJldHVybiAiV1NfVU5TUEVDSUZJRUQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gd2hpdGVzcGFjZSBjb2RlICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBkZXJpdmF0aW9uVHlwZVN0cmluZyhpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkRUX05PVF9ERVJJVkVEOiByZXR1cm4gIkRUX05PVF9ERVJJVkVEIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5EVF9SRVNUUklDVElPTjogcmV0dXJuICJEVF9SRVNUUklDVElPTiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuRFRfRVhURU5TSU9OOiByZXR1cm4gIkRUX0VYVEVOU0lPTiI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVW5rbm93biBkZXJpdmF0aW9uIGNvZGUgKCIgKyBjb2RlICsgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBkdW1wVHlwZUZpbGVEYXRhKCkKKyAgICB7CisgICAgICAgIGVtaXQoIk5hbWU6ICIgKyBxbmFtZVN0cmluZyhyZWFkUU5hbWUoKSkpOworICAgICAgICBlbWl0KCJPdXRlciB0eXBlOiAiICsgcmVhZFR5cGUoKSk7CisgICAgICAgIGVtaXQoIkRlcHRoOiAiICsgcmVhZFNob3J0KCkpOworICAgICAgICBlbWl0KCJCYXNlIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKKyAgICAgICAgZW1pdCgiRGVyaXZhdGlvbiB0eXBlOiAiICsgZGVyaXZhdGlvblR5cGVTdHJpbmcocmVhZFNob3J0KCkpKTsKKyAgICAgICAgCisgICAgICAgIGVtaXQoIkNvbnRhaW5lciBmaWVsZDoiKTsKKyAgICAgICAgaW5kZW50KCk7CisgICAgICAgIGludCBjb250YWluZXJmaWVsZHR5cGUgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZW1pdCgiUmVmdHlwZTogIiArIGNvbnRhaW5lcmZpZWxkVHlwZVN0cmluZyhjb250YWluZXJmaWVsZHR5cGUpKTsKKyAgICAgICAgc3dpdGNoIChjb250YWluZXJmaWVsZHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRklFTERfR0xPQkFMOgorICAgICAgICAgICAgICAgIGVtaXQoIkhhbmRsZTogIiArIHJlYWRIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZJRUxEX0xPQ0FMQVRUUjoKKyAgICAgICAgICAgICAgICBlbWl0KCJJbmRleDogIiArIHJlYWRTaG9ydCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRklFTERfTE9DQUxFTFQ6CisgICAgICAgICAgICAgICAgZW1pdCgiSW5kZXg6ICIgKyByZWFkU2hvcnQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb3V0ZGVudCgpOworICAgICAgICBlbWl0KCJKYXZhIGNsYXNzIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOworICAgICAgICBlbWl0KCJKYXZhIGltcGwgY2xhc3MgbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7CisKKyAgICAgICAgZHVtcFR5cGVBcnJheSgiQW5vbnltb3VzIHR5cGVzIik7CisKKyAgICAgICAgZW1pdCgiQW5vbnltb3VzIHVuaW9uIG1lbWJlciBvcmRpbmFsOiAiICsgcmVhZFNob3J0KCkpOworCisgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgZmxhZ3MgPSByZWFkSW50KCk7CisgICAgICAgIGVtaXQoIkZsYWdzOiAiICsgdHlwZWZsYWdzU3RyaW5nKGZsYWdzKSk7CisgICAgICAgIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9ICgoZmxhZ3MgJiBGTEFHX1NJTVBMRV9UWVBFKSA9PSAwKTsKKworICAgICAgICBzaG9ydCBjb21wbGV4VmFyaWV0eSA9IFNjaGVtYVR5cGUuTk9UX0NPTVBMRVhfVFlQRTsKKyAgICAgICAgaWYgKGlzQ29tcGxleFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbXBsZXhWYXJpZXR5ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBlbWl0KCJDb21wbGV4IHZhcmlldHk6ICIgKyBjb21wbGV4VmFyaWV0eVN0cmluZyhjb21wbGV4VmFyaWV0eSkpOworCisgICAgICAgICAgICBzaG9ydCBhdHRyQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGVtaXQoIkF0dHJpYnV0ZSBtb2RlbCAoIiArIGF0dHJDb3VudCArICIpOiIpOworICAgICAgICAgICAgaW5kZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGR1bXBBdHRyaWJ1dGVEYXRhKGZhbHNlKTsKKworICAgICAgICAgICAgZW1pdCgiV2lsZGNhcmQgc2V0OiAiICsgcW5hbWVTZXRTdHJpbmcocmVhZFFOYW1lU2V0KCkpKTsKKyAgICAgICAgICAgIGVtaXQoIldpbGRjYXJkIHByb2Nlc3M6ICIgKyB3Y3Byb2Nlc3NTdHJpbmcocmVhZFNob3J0KCkpKTsKKyAgICAgICAgICAgIG91dGRlbnQoKTsKKworICAgICAgICAgICAgLy8gQXR0cmlidXRlIFByb3BlcnR5IFRhYmxlCisgICAgICAgICAgICBzaG9ydCBhdHRyUHJvcENvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgcHJvcGVydGllcyAoIiArIGF0dHJQcm9wQ291bnQgKyAiKToiKTsKKyAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyUHJvcENvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHVtcFByb3BlcnR5RGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0ZGVudCgpOworCisgICAgICAgICAgICBpZiAoY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5FTEVNRU5UX0NPTlRFTlQgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5NSVhFRF9DT05URU5UKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQoIklzQWxsOiAiICsgcmVhZFNob3J0KCkpOworCisgICAgICAgICAgICAgICAgLy8gQ29udGVudCBtb2RlbCB0cmVlCisgICAgICAgICAgICAgICAgZHVtcFBhcnRpY2xlQXJyYXkoIkNvbnRlbnQgbW9kZWwiKTsKKworICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgUHJvcGVydHkgVGFibGUKKyAgICAgICAgICAgICAgICBzaG9ydCBlbGVtUHJvcENvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICAgICAgZW1pdCgiRWxlbWVudCBwcm9wZXJ0aWVzICgiICsgZWxlbVByb3BDb3VudCArICIpOiIpOworICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbVByb3BDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFByb3BlcnR5RGF0YSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRkZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQ29tcGxleFR5cGUgfHwgY29tcGxleFZhcmlldHkgPT0gU2NoZW1hVHlwZS5TSU1QTEVfQ09OVEVOVCkKKyAgICAgICAgeworICAgICAgICAgICAgc2hvcnQgc2ltcGxlVmFyaWV0eSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZW1pdCgiU2ltcGxlIHR5cGUgdmFyaWV0eTogIiArIHNpbXBsZVZhcmlldHlTdHJpbmcoc2ltcGxlVmFyaWV0eSkpOworCisgICAgICAgICAgICBib29sZWFuIGlzU3RyaW5nRW51bSA9ICgoZmxhZ3MgJiBGTEFHX1NUUklOR0VOVU0pICE9IDApOworCisgICAgICAgICAgICBzaG9ydCBmYWNldENvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgICAgICBlbWl0KCJGYWNldHMgKCIgKyBmYWNldENvdW50ICsgIik6Iik7CisgICAgICAgICAgICBpbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmFjZXRDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQoZmFjZXRDb2RlU3RyaW5nKHJlYWRTaG9ydCgpKSk7CisgICAgICAgICAgICAgICAgZW1pdCgiVmFsdWU6ICIgKyByZWFkWG1sVmFsdWVPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyByZWFkU2hvcnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRkZW50KCk7CisKKyAgICAgICAgICAgIGVtaXQoIldoaXRlc3BhY2UgcnVsZTogIiArIHdoaXRlc3BhY2VDb2RlU3RyaW5nKHJlYWRTaG9ydCgpKSk7CisKKyAgICAgICAgICAgIHNob3J0IHBhdHRlcm5Db3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZW1pdCgiUGF0dGVybnMgKCIgKyBwYXR0ZXJuQ291bnQgKyAiKToiKTsKKyAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0KHJlYWRTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRkZW50KCk7CisKKyAgICAgICAgICAgIHNob3J0IGVudW1Db3VudCA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZW1pdCgiRW51bWVyYXRpb24gdmFsdWVzICgiICsgZW51bUNvdW50ICsgIik6Iik7CisgICAgICAgICAgICBpbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bUNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdChyZWFkWG1sVmFsdWVPYmplY3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRkZW50KCk7CisKKyAgICAgICAgICAgIGVtaXQoIkJhc2UgZW51bSB0eXBlOiAiICsgcmVhZFR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaXNTdHJpbmdFbnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNob3J0IHNlQ291bnQgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgICAgICAgICBlbWl0KCJTdHJpbmcgZW51bSBlbnRyaWVzICgiICsgc2VDb3VudCArICIpOiIpOworICAgICAgICAgICAgICAgIGluZGVudCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiXCIiICsgcmVhZFN0cmluZygpICsgIlwiIC0+ICIgKyByZWFkU2hvcnQoKSArICIgPSAiICsgcmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0ZGVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHNpbXBsZVZhcmlldHkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkFUT01JQzoKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiUHJpbWl0aXZlIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiRGVjaW1hbCBzaXplOiAiICsgcmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgZW1pdCgiTGlzdCBpdGVtIHR5cGU6ICIgKyByZWFkVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuVU5JT046CisgICAgICAgICAgICAgICAgICAgIGR1bXBUeXBlQXJyYXkoIlVuaW9uIG1lbWJlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBlcnJvcigiVW5rbm93biBzaW1wbGUgdHlwZSB2YXJpZXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbWl0KCJGaWxlbmFtZTogIiArIHJlYWRTdHJpbmcoKSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBhdHRydXNlQ29kZVN0cmluZyhpbnQgY29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY29kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTY2hlbWFMb2NhbEF0dHJpYnV0ZS5PUFRJT05BTDogcmV0dXJuICJPUFRJT05BTCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYUxvY2FsQXR0cmlidXRlLlJFUVVJUkVEOiByZXR1cm4gIlJFUVVJUkVEIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hTG9jYWxBdHRyaWJ1dGUuUFJPSElCSVRFRDogcmV0dXJuICJQUk9ISUJJVEVEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIHVzZSBjb2RlICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHVtcEF0dHJpYnV0ZURhdGEoYm9vbGVhbiBnbG9iYWwpCisgICAgeworICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKKyAgICAgICAgZW1pdCgiVHlwZTogIiArIHJlYWRUeXBlKCkpOworICAgICAgICBlbWl0KCJVc2U6ICIgKyBhdHRydXNlQ29kZVN0cmluZyhyZWFkU2hvcnQoKSkpOworICAgICAgICBlbWl0KCJEZWZhdWx0OiAiICsgcmVhZFN0cmluZygpKTsKKyAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTYsIDApKQorICAgICAgICAgICAgZW1pdCgiRGVmYXVsdCB2YWx1ZTogIiArIHJlYWRYbWxWYWx1ZU9iamVjdCgpKTsKKyAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyByZWFkU2hvcnQoKSk7CisgICAgICAgIGVtaXQoIldzZGxBcnJheVR5cGU6ICIgKyBTT0FQQXJyYXlUeXBlU3RyaW5nKHJlYWRTT0FQQXJyYXlUeXBlKCkpKTsKKyAgICAgICAgaWYgKGdsb2JhbCkKKyAgICAgICAgICAgIGVtaXQoIkZpbGVuYW1lOiAiICsgcmVhZFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpb25zIHByZXR0eU9wdGlvbnMgPQorICAgICAgICBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpOworICAgIAorICAgIHZvaWQgZHVtcFhtbCgpCisgICAgeworICAgICAgICBTdHJpbmcgeG1sID0gcmVhZFN0cmluZygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCggWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApLnhtbFRleHQoIHByZXR0eU9wdGlvbnMgKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0KCAiISEhISEhIEJBRCBYTUwgISEhISEiICk7CisgICAgICAgICAgICBlbWl0KCB4bWwgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGR1bXBNb2RlbEdyb3VwRGF0YSgpCisgICAgeworICAgICAgICBlbWl0KCJOYW1lOiAiICsgcW5hbWVTdHJpbmcocmVhZFFOYW1lKCkpKTsKKyAgICAgICAgZW1pdCgiVGFyZ2V0IG5hbWVzcGFjZTogIiArIHJlYWRTdHJpbmcoKSk7CisgICAgICAgIGVtaXQoIkNoYW1lbGVvbjogIiArIHJlYWRTaG9ydCgpKTsKKyAgICAgICAgaWYgKGF0TGVhc3QoMiwgMTUsIDApKQorICAgICAgICAgICAgZW1pdCgiUmVkZWZpbmU6ICIgKyByZWFkU2hvcnQoKSk7CisgICAgICAgIGVtaXQoIk1vZGVsIEdyb3VwIFhtbDogIik7CisgICAgICAgIGR1bXBYbWwoKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXBBdHRyaWJ1dGVHcm91cERhdGEoKQorICAgIHsKKyAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7CisgICAgICAgIGVtaXQoIlRhcmdldCBuYW1lc3BhY2U6ICIgKyByZWFkU3RyaW5nKCkpOworICAgICAgICBlbWl0KCJDaGFtZWxlb246ICIgKyByZWFkU2hvcnQoKSk7CisgICAgICAgIGlmIChhdExlYXN0KDIsIDE1LCAwKSkKKyAgICAgICAgICAgIGVtaXQoIlJlZGVmaW5lOiAiICsgcmVhZFNob3J0KCkpOworICAgICAgICBlbWl0KCJBdHRyaWJ1dGUgR3JvdXAgWG1sOiAiKTsKKyAgICAgICAgZHVtcFhtbCgpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgYWx3YXlzU3RyaW5nKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkNPTlNJU1RFTlRMWTogcmV0dXJuICJDT05TSVNURU5UTFkiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5ORVZFUjogcmV0dXJuICJORVZFUiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlZBUklBQkxFOiByZXR1cm4gIlZBUklBQkxFIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGZyZXF1ZW5jeSBjb2RlICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcganRjU3RyaW5nKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LlhNTF9PQkpFQ1Q6IHJldHVybiAiWE1MX09CSkVDVCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQk9PTEVBTjogcmV0dXJuICJKQVZBX0JPT0xFQU4iOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0ZMT0FUOiByZXR1cm4gIkpBVkFfRkxPQVQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0RPVUJMRTogcmV0dXJuICJKQVZBX0RPVUJMRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQllURTogcmV0dXJuICJKQVZBX0JZVEUiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX1NIT1JUOiByZXR1cm4gIkpBVkFfU0hPUlQiOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX0lOVDogcmV0dXJuICJKQVZBX0lOVCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTE9ORzogcmV0dXJuICJKQVZBX0xPTkciOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0RFQ0lNQUw6IHJldHVybiAiSkFWQV9CSUdfREVDSU1BTCI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQklHX0lOVEVHRVI6IHJldHVybiAiSkFWQV9CSUdfSU5URUdFUiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfU1RSSU5HOiByZXR1cm4gIkpBVkFfU1RSSU5HIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9CWVRFX0FSUkFZOiByZXR1cm4gIkpBVkFfQllURV9BUlJBWSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RBVEU6IHJldHVybiAiSkFWQV9HREFURSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfR0RVUkFUSU9OOiByZXR1cm4gIkpBVkFfR0RVUkFUSU9OIjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHkuSkFWQV9EQVRFOiByZXR1cm4gIkpBVkFfREFURSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfUU5BTUU6IHJldHVybiAiSkFWQV9RTkFNRSI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfQ0FMRU5EQVI6IHJldHVybiAiSkFWQV9DQUxFTkRBUiI7CisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfTElTVDogcmV0dXJuICJKQVZBX0xJU1QiOworCisgICAgICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5LkpBVkFfRU5VTTogcmV0dXJuICJKQVZBX0VOVU0iOworICAgICAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eS5KQVZBX09CSkVDVDogcmV0dXJuICJKQVZBX09CSkVDVCI7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGphdmEgdHlwZSBjb2RlICgiICsgY29kZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHVtcFByb3BlcnR5RGF0YSgpCisgICAgeworICAgICAgICBlbWl0KCJQcm9wZXJ0eSIpOworICAgICAgICBpbmRlbnQoKTsKKyAgICAgICAgZW1pdCgiTmFtZTogIiArIHFuYW1lU3RyaW5nKHJlYWRRTmFtZSgpKSk7CisgICAgICAgIGVtaXQoIlR5cGU6ICIgKyByZWFkVHlwZSgpKTsKKyAgICAgICAgaW50IHByb3BmbGFncyA9IHJlYWRTaG9ydCgpOworICAgICAgICBlbWl0KCJGbGFnczogIiArIHByb3BlcnR5ZmxhZ3NTdHJpbmcocHJvcGZsYWdzKSk7CisgICAgICAgIGVtaXQoIkNvbnRhaW5lciB0eXBlOiAiICsgcmVhZFR5cGUoKSk7CisgICAgICAgIGVtaXQoIk1pbiBvY2N1cmFuY2VzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7CisgICAgICAgIGVtaXQoIk1heCBvY2N1cmFuY2VzOiAiICsgYmlnSW50ZWdlclN0cmluZyhyZWFkQmlnSW50ZWdlcigpKSk7CisgICAgICAgIGVtaXQoIk5pbGxhYmxlOiAiICsgYWx3YXlzU3RyaW5nKHJlYWRTaG9ydCgpKSk7CisgICAgICAgIGVtaXQoIkRlZmF1bHQ6ICIgKyBhbHdheXNTdHJpbmcocmVhZFNob3J0KCkpKTsKKyAgICAgICAgZW1pdCgiRml4ZWQ6ICIgKyBhbHdheXNTdHJpbmcocmVhZFNob3J0KCkpKTsKKyAgICAgICAgZW1pdCgiRGVmYXVsdCB0ZXh0OiAiICsgcmVhZFN0cmluZygpKTsKKyAgICAgICAgZW1pdCgiSmF2YSBwcm9wIG5hbWU6ICIgKyByZWFkU3RyaW5nKCkpOworICAgICAgICBlbWl0KCJKYXZhIHR5cGUgY29kZTogIiArIGp0Y1N0cmluZyhyZWFkU2hvcnQoKSkpOworICAgICAgICBlbWl0KCJUeXBlIGZvciBqYXZhIHNpZ25hdHVyZTogIiArIHJlYWRUeXBlKCkpOworICAgICAgICBlbWl0KCJKYXZhIHNldHRlciBkZWxpbWl0ZXI6ICIgKyBxbmFtZVNldFN0cmluZyhyZWFkUU5hbWVTZXQoKSkpOworICAgICAgICBpZiAoYXRMZWFzdCgyLCAxNiwgMCkpCisgICAgICAgICAgICBlbWl0KCJEZWZhdWx0IHZhbHVlOiAiICsgcmVhZFhtbFZhbHVlT2JqZWN0KCkpOworICAgICAgICBpZiAoKChwcm9wZmxhZ3MgJiBGTEFHX1BST1BfSVNBVFRSKSA9PSAwKSAmJiBhdExlYXN0KDIsIDE3LCAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2hvcnQgc2l6ZSA9IHJlYWRTaG9ydCgpOworICAgICAgICAgICAgZW1pdCgiQWNjZXB0ZWQgc3Vic3RpdHV0aW9ucyAoIiArIHNpemUgKyAiKToiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNpemUgOyBpKyspCisgICAgICAgICAgICAgICAgZW1pdCgiICBBY2NlcHRlZCBuYW1lICIgKyByZWFkUU5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRkZW50KCk7CisgICAgfQorCisgICAgU3RyaW5nIHJlYWRYbWxWYWx1ZU9iamVjdCgpCisgICAgeworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlYWRUeXBlKCk7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICAKKyAgICAgICAgaW50IGJ0YyA9IHJlYWRTaG9ydCgpOworICAgICAgICBTdHJpbmcgdmFsdWU7CisgICAgICAgIHN3aXRjaCAoYnRjKQorICAgICAgICB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAibmlsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfU0lNUExFOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19BTllfVVJJOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19TVFJJTkc6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RVUkFUSU9OOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX1RJTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RBVEU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX01PTlRIX0RBWToKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19EQVk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0JPT0xFQU46CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfQkFTRV82NF9CSU5BUlk6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0hFWF9CSU5BUlk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoSGV4QmluLmVuY29kZShyZWFkQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMTkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YlNlcXVlbmNlKDAsIDE2KSArICIuLi4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfUU5BTUU6CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX05PVEFUSU9OOgorICAgICAgICAgICAgICAgIHZhbHVlID0gUU5hbWVIZWxwZXIucHJldHR5KHJlYWRRTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfRE9VQkxFOgorICAgICAgICAgICAgICAgIHZhbHVlID0gRG91YmxlLnRvU3RyaW5nKHJlYWREb3VibGUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlICsgIiAoIiArIHR5cGUgKyAiOiAiICsgYnRjICsiKSI7CisgICAgfQorCisgICAgZG91YmxlIHJlYWREb3VibGUoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaW5wdXQucmVhZERvdWJsZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcihlKTsKKyAgICAgICAgICAgIHJldHVybiAwLjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgU09BUEFycmF5VHlwZVN0cmluZyhTT0FQQXJyYXlUeXBlIHQpCisgICAgeworICAgICAgICBpZiAodCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgcmV0dXJuIFFOYW1lSGVscGVyLnByZXR0eSh0LmdldFFOYW1lKCkpICsgdC5zb2FwMTFEaW1lbnNpb25TdHJpbmcoKTsKKyAgICB9CisKKyAgICBTT0FQQXJyYXlUeXBlIHJlYWRTT0FQQXJyYXlUeXBlKCkKKyAgICB7CisgICAgICAgIFFOYW1lIHFOYW1lID0gcmVhZFFOYW1lKCk7CisgICAgICAgIFN0cmluZyBkaW1lbnNpb25zID0gcmVhZFN0cmluZygpOworICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbmV3IFNPQVBBcnJheVR5cGUocU5hbWUsIGRpbWVuc2lvbnMpOworICAgIH0KKworICAgIFFOYW1lU2V0IHJlYWRRTmFtZVNldCgpCisgICAgeworICAgICAgICBzaG9ydCBmbGFnID0gcmVhZFNob3J0KCk7CisKKyAgICAgICAgU2V0IHVyaVNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHNob3J0IHVyaUNvdW50ID0gcmVhZFNob3J0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXJpQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHVyaVNldC5hZGQocmVhZFN0cmluZygpKTsKKworICAgICAgICBTZXQgcW5hbWVTZXQxID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgc2hvcnQgcW5jb3VudDEgPSByZWFkU2hvcnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmNvdW50MTsgaSsrKQorICAgICAgICAgICAgcW5hbWVTZXQxLmFkZChyZWFkUU5hbWUoKSk7CisKKyAgICAgICAgU2V0IHFuYW1lU2V0MiA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIHNob3J0IHFuY291bnQyID0gcmVhZFNob3J0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5jb3VudDI7IGkrKykKKyAgICAgICAgICAgIHFuYW1lU2V0Mi5hZGQocmVhZFFOYW1lKCkpOworCisgICAgICAgIGlmIChmbGFnID09IDEpCisgICAgICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyh1cmlTZXQsIG51bGwsIHFuYW1lU2V0MSwgcW5hbWVTZXQyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNldHMobnVsbCwgdXJpU2V0LCBxbmFtZVNldDIsIHFuYW1lU2V0MSk7CisgICAgfQorCisgICAgYnl0ZVtdIHJlYWRCeXRlQXJyYXkoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0IGxlbiA9IF9pbnB1dC5yZWFkU2hvcnQoKTsKKyAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgX2lucHV0LnJlYWRGdWxseShyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IoZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJpZ0ludGVnZXIgcmVhZEJpZ0ludGVnZXIoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IHJlYWRCeXRlQXJyYXkoKTsKKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAxICYmIHJlc3VsdFswXSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTzsKKyAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMSAmJiByZXN1bHRbMF0gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLk9ORTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHJlc3VsdCk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGJ5dGVbXSBTSU5HTEVfWkVST19CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKTAgfTsKKworICAgIHByaXZhdGUgaW50IF9tYWpvcnZlcjsKKyAgICBwcml2YXRlIGludCBfbWlub3J2ZXI7CisgICAgcHJpdmF0ZSBpbnQgX3JlbGVhc2VubzsKKworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXRMZWFzdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKKyAgICB7CisgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoX21ham9ydmVyIDwgbWFqb3J2ZXIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoX21pbm9ydmVyIDwgbWlub3J2ZXIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA+PSByZWxlYXNlbm8pOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGF0TW9zdChpbnQgbWFqb3J2ZXIsIGludCBtaW5vcnZlciwgaW50IHJlbGVhc2VubykKKyAgICB7CisgICAgICAgIGlmIChfbWFqb3J2ZXIgPiBtYWpvcnZlcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9tYWpvcnZlciA8IG1ham9ydmVyKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChfbWlub3J2ZXIgPiBtaW5vcnZlcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKF9taW5vcnZlciA8IG1pbm9ydmVyKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiAoX3JlbGVhc2VubyA8PSByZWxlYXNlbm8pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL0V4dGVuc2lvbkhvbGRlci5qYXZhIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL0V4dGVuc2lvbkhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMmIxNDEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvRXh0ZW5zaW9uSG9sZGVyLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoIGNlemFyLmFuZHJlaSBhdCBiZWEuY29tICkKKyAqIERhdGU6IEFwciAyNSwgMjAwNAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXplbnRzIGFsbCB0aGUgZXh0ZW5zaW9ucyBmb3IgYWxsIHhiZWFuIHNldHMuCisgKiBUaGlzIGNsYXNzIGlzIHRoZSByb290IG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCByZXByZXplbnRzIGFsbCB0aGUgZXh0ZW5zaW9ucy4KKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbkhvbGRlcgoreworICAgIC8vIHRoZXNlIGxpc3RzIGFyZSBleHBlY3RlZCB0byBiZSBxdWl0ZSBzbWFsbAorICAgIHByaXZhdGUgTGlzdCBfaW50ZXJmYWNlRXh0ZW5zaW9uczsKKyAgICBwcml2YXRlIExpc3QgX3ByZVBvc3RFeHRlbnNpb25zOworCisgICAgRXh0ZW5zaW9uSG9sZGVyKCkKKyAgICB7CisgICAgICAgIF9pbnRlcmZhY2VFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBfcHJlUG9zdEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgdm9pZCBhZGRJbnRlcmZhY2VFeHRlbnNpb24oSW50ZXJmYWNlRXh0ZW5zaW9uIGV4dCkKKyAgICB7CisgICAgICAgIGlmIChleHQ9PW51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgX2ludGVyZmFjZUV4dGVuc2lvbnMuYWRkKGV4dCk7CisgICAgfQorCisgICAgdm9pZCBhZGRQcmVQb3N0RXh0ZW5zaW9uKFByZVBvc3RFeHRlbnNpb24gZXh0KQorICAgIHsKKyAgICAgICAgaWYgKGV4dD09bnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBfcHJlUG9zdEV4dGVuc2lvbnMuYWRkKGV4dCk7CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB1c2VkIG9ubHkgZm9yIGRldGVjdGluZyBtZXRob2QgY29saXNpb25zIG9mIGV4dGVuZGluZyBpbnRlcmZhY2VzCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlCisgICAgeworICAgICAgICBwcml2YXRlIFN0cmluZyBfaW50Zk5hbWU7ICAvLyBTdG9yZWQgb25seSBmb3IgZXJyb3Igb3V0cHV0LCBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIGVxdWFscyBvciBoYXNoQ29kZQorICAgICAgICBwcml2YXRlIE1ldGhvZCBfbWV0aG9kOworCisgICAgICAgIE1ldGhvZFNpZ25hdHVyZShTdHJpbmcgaW50Zk5hbWUsIE1ldGhvZCBtZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRmTmFtZT09bnVsbCB8fCBtZXRob2Q9PW51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW50ZXJmYWNlOiAiICsgaW50Zk5hbWUgKyAiIG1ldGhvZDogIiArIG1ldGhvZCk7CisKKyAgICAgICAgICAgIF9pbnRmTmFtZSA9IGludGZOYW1lOworICAgICAgICAgICAgX21ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9pbnRmTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRTaWduYXR1cmUoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc2lnID0gIiI7CisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBfbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKKyAgICAgICAgICAgICAgICBzaWcgKz0gKCBpPT0wID8gIiIgOiAiICwiICkgKyBwYXJhbVR5cGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9tZXRob2QuZ2V0TmFtZSgpICsgIigiICsgc2lnICsgIikiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICEobyBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBNZXRob2RTaWduYXR1cmUgbXMgPSAoTWV0aG9kU2lnbmF0dXJlKW87CisKKyAgICAgICAgICAgIGlmICghbXMuX21ldGhvZC5nZXROYW1lKCkuZXF1YWxzKF9tZXRob2QuZ2V0TmFtZSgpKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBfbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBDbGFzc1tdIG1zUGFyYW1UeXBlcyA9IF9tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKworICAgICAgICAgICAgaWYgKG1zUGFyYW1UeXBlcy5sZW5ndGggIT0gcGFyYW1UeXBlcy5sZW5ndGggKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtc1BhcmFtVHlwZXNbaV0gIT0gcGFyYW1UeXBlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IF9tZXRob2QuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisKKyAgICAgICAgICAgIENsYXNzW10gcGFyYW1UeXBlcyA9IF9tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhc2ggKj0gMTk7CisgICAgICAgICAgICAgICAgaGFzaCArPSBwYXJhbVR5cGVzW2ldLmhhc2hDb2RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZWNvbmRQaGFzZVZhbGlkYXRpb24oKQorICAgIHsKKyAgICAgICAgLy8gdmFsaWRhdGUgaW50ZXJmYWNlIG1ldGhvZHMgY29sbGlzaW9ucworICAgICAgICBNYXAgbWV0aG9kU2lnbmF0dXJlcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW50ZXJmYWNlRXh0ZW5zaW9ucy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJmYWNlRXh0ZW5zaW9uIGludGVyZmFjZUV4dGVuc2lvbiA9IChJbnRlcmZhY2VFeHRlbnNpb24pIF9pbnRlcmZhY2VFeHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW50ZXJmYWNlRXh0ZW5zaW9uLmdldEludGVyZmFjZU1ldGhvZENvdW50KCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgTWV0aG9kU2lnbmF0dXJlKGludGVyZmFjZUV4dGVuc2lvbi5nZXRJbnRlcmZhY2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VFeHRlbnNpb24uZ2V0SW50ZXJmYWNlTWV0aG9kKGopKTsKKworICAgICAgICAgICAgICAgIGlmICggbWV0aG9kU2lnbmF0dXJlcy5jb250YWluc0tleShtcykgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlIG1zMiA9IChNZXRob2RTaWduYXR1cmUpIG1ldGhvZFNpZ25hdHVyZXMuZ2V0KG1zKTsKKyAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKCJDb2xsaWRpbmcgbWV0aG9kcyAnIiArIG1zLmdldFNpZ25hdHVyZSgpICsgIicgaW4gaW50ZXJmYWNlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zLmdldEludGVyZmFjZU5hbWUoKSArICIgYW5kICIgKyBtczIuZ2V0SW50ZXJmYWNlTmFtZSgpICsgIi4iLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RvcmUgaXQgaW50byBoYXNobWFwCisgICAgICAgICAgICAgICAgbWV0aG9kU2lnbmF0dXJlcy5wdXQobXMsIG1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgUHJlUG9zdEV4dGVuc2lvbi1zIGRvIG5vdCBpbnRlcnNlY3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcHJlUG9zdEV4dGVuc2lvbnMuc2l6ZSgpIC0gMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVQb3N0RXh0ZW5zaW9uIGEgPSAoUHJlUG9zdEV4dGVuc2lvbikgX3ByZVBvc3RFeHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgX3ByZVBvc3RFeHRlbnNpb25zLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFByZVBvc3RFeHRlbnNpb24gYiA9IChQcmVQb3N0RXh0ZW5zaW9uKSBfcHJlUG9zdEV4dGVuc2lvbnMuZ2V0KGopOworICAgICAgICAgICAgICAgIGlmIChhLmhhc05hbWVTZXRJbnRlcnNlY3Rpb24oYikpCisgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigiVGhlIGFwcGxpY2FibGUgZG9tYWluIGZvciBoYW5kbGVyICciICsgYS5nZXRIYW5kbGVyTmFtZUZvckphdmFTb3VyY2UoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnRlcnNlY3RzIHdpdGggdGhlIG9uZSBmb3IgJyIgKyBiLmdldEhhbmRsZXJOYW1lRm9ySmF2YVNvdXJjZSgpICsgIicuIiwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG5vcm1hbGl6ZSgpCisgICAgeworICAgICAgICAvL3RvZG86IG5vdCB5ZXQgdXNlZCwgdXNlZnVsIGZvciBvcHRpbWl6aW5nIGphciBzaXplIGluIGNhc2Ugb2YgYmlnIGludGVyZmFjZXMgYW5kIGJpZyBzY2hlbWFzCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOWUkiKTsKKyAgICAgICAgLy8gdGhpcyBtYXR0ZXJzIG9ubHkgZm9yIEludGVyZmFjZUV4dGVuc2lvbi1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmVyaWZ5SW50ZXJmYWNlTmFtZUNvbGxpc2lvbnMoU2V0IGdlbmVkVXNlZE5hbWVzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW50ZXJmYWNlRXh0ZW5zaW9ucy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJmYWNlRXh0ZW5zaW9uIGludGVyZmFjZUV4dGVuc2lvbiA9IChJbnRlcmZhY2VFeHRlbnNpb24pIF9pbnRlcmZhY2VFeHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmICggZ2VuZWRVc2VkTmFtZXMuY29udGFpbnMoaW50ZXJmYWNlRXh0ZW5zaW9uLmdldEludGVyZmFjZU5hbWVGb3JKYXZhU291cmNlKCkudG9Mb3dlckNhc2UoKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigiRXh0ZW5zaW9uIGludGVyZmFjZSAnIiArIGludGVyZmFjZUV4dGVuc2lvbi5nZXRJbnRlcmZhY2VOYW1lRm9ySmF2YVNvdXJjZSgpICsgIicgY3JlYXRlcyBhIG5hbWUgY29sbGlzaW9uIHdpdGggb25lIG9mIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlcyBvciBjbGFzc2VzLiIsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUgPSBpbnRlcmZhY2VFeHRlbnNpb24uZ2V0SGFuZGxlck5hbWVGb3JKYXZhU291cmNlKCk7CisgICAgICAgICAgICBpZiAoIGhhbmRsZXJDbGFzc05hbWUhPW51bGwgJiYKKyAgICAgICAgICAgICAgICBnZW5lZFVzZWROYW1lcy5jb250YWlucyhoYW5kbGVyQ2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFDb25maWcuZXJyb3IoIkhhbmRsZXIgY2xhc3MgJyIgKyBoYW5kbGVyQ2xhc3NOYW1lICsgIicgY3JlYXRlcyBhIG5hbWUgY29sbGlzaW9uIHdpdGggb25lIG9mIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlcyBvciBjbGFzc2VzLiIsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcHJlUG9zdEV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZVBvc3RFeHRlbnNpb24gcHJlUG9zdEV4dGVuc2lvbiA9IChQcmVQb3N0RXh0ZW5zaW9uKSBfcHJlUG9zdEV4dGVuc2lvbnMuZ2V0KGkpOworICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUgPSBwcmVQb3N0RXh0ZW5zaW9uLmdldEhhbmRsZXJOYW1lRm9ySmF2YVNvdXJjZSgpOworICAgICAgICAgICAgaWYgKCBoYW5kbGVyQ2xhc3NOYW1lIT1udWxsICYmCisgICAgICAgICAgICAgICAgZ2VuZWRVc2VkTmFtZXMuY29udGFpbnMoaGFuZGxlckNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKCJIYW5kbGVyIGNsYXNzICciICsgcHJlUG9zdEV4dGVuc2lvbi5nZXRIYW5kbGVyTmFtZUZvckphdmFTb3VyY2UoKSArICInIGNyZWF0ZXMgYSBuYW1lIGNvbGxpc2lvbiB3aXRoIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgb3IgY2xhc3Nlcy4iLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEV4dGVuc2lvbkhvbGRlciBleHRlbnNpb25Ib2xkZXJGb3IoU3RyaW5nIGphdmFOYW1lKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfaW50ZXJmYWNlRXh0ZW5zaW9ucy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJmYWNlRXh0ZW5zaW9uIGludGVyZmFjZUV4dGVuc2lvbiA9IChJbnRlcmZhY2VFeHRlbnNpb24pIF9pbnRlcmZhY2VFeHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VFeHRlbnNpb24uY29udGFpbnMoamF2YU5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfcHJlUG9zdEV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZVBvc3RFeHRlbnNpb24gcHJlUG9zdEV4dGVuc2lvbiA9IChQcmVQb3N0RXh0ZW5zaW9uKSBfcHJlUG9zdEV4dGVuc2lvbnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHByZVBvc3RFeHRlbnNpb24uY29udGFpbnMoamF2YU5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW50ZXJmYWNlRXh0ZW5zaW9uc0ZvcihTdHJpbmcgZnVsbEphdmFOYW1lKQorICAgIHsKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2ludGVyZmFjZUV4dGVuc2lvbnMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEludGVyZmFjZUV4dGVuc2lvbiBpbnRmRXh0ID0gKEludGVyZmFjZUV4dGVuc2lvbikgX2ludGVyZmFjZUV4dGVuc2lvbnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGludGZFeHQuY29udGFpbnMoZnVsbEphdmFOYW1lKSkKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGludGZFeHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFByZVBvc3RFeHRlbnNpb24gZ2V0UHJlUG9zdEV4dGVuc2lvbnNGb3IoU3RyaW5nIGZ1bGxKYXZhTmFtZSkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3ByZVBvc3RFeHRlbnNpb25zLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVQb3N0RXh0ZW5zaW9uIHByZVBvc3RFeHQgPSAoUHJlUG9zdEV4dGVuc2lvbikgX3ByZVBvc3RFeHRlbnNpb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChwcmVQb3N0RXh0LmNvbnRhaW5zKGZ1bGxKYXZhTmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHByZVBvc3RFeHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL0ludGVyZmFjZUV4dGVuc2lvbi5qYXZhIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL0ludGVyZmFjZUV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjc4OGMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvSW50ZXJmYWNlRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoIGNlemFyLmFuZHJlaSBhdCBiZWEuY29tICkKKyAqIERhdGU6IE1hciAyNSwgMjAwNAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkV4dGVuc2lvbmNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworcHVibGljIGNsYXNzIEludGVyZmFjZUV4dGVuc2lvbgoreworICAgIHByaXZhdGUgTmFtZVNldCBfeGJlYW5TZXQ7CisgICAgcHJpdmF0ZSBDbGFzcyBfaW50ZXJmYWNlOworICAgIHByaXZhdGUgQ2xhc3MgX2RlbGVnYXRlVG9DbGFzczsKKyAgICBwcml2YXRlIFN0cmluZyBfZGVsZWdhdGVUb0NsYXNzTmFtZTsKKyAgICBwcml2YXRlIE1ldGhvZFtdIF9pbnRlcmZhY2VNZXRob2RzOworICAgIHByaXZhdGUgTWV0aG9kW10gX2RlbGVnYXRlVG9NZXRob2RzOworCisgICAgc3RhdGljIEludGVyZmFjZUV4dGVuc2lvbiBuZXdJbnN0YW5jZShOYW1lU2V0IHhiZWFuU2V0LCBFeHRlbnNpb25jb25maWcuSW50ZXJmYWNlIGludGZYTykKKyAgICB7CisgICAgICAgIEludGVyZmFjZUV4dGVuc2lvbiByZXN1bHQgPSBuZXcgSW50ZXJmYWNlRXh0ZW5zaW9uKCk7CisKKyAgICAgICAgcmVzdWx0Ll94YmVhblNldCA9IHhiZWFuU2V0OworICAgICAgICByZXN1bHQuX2ludGVyZmFjZSA9IHZhbGlkYXRlSW50ZXJmYWNlKGludGZYTy5nZXROYW1lKCksIGludGZYTyk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5faW50ZXJmYWNlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigiSW50ZXJmYWNlICciICsgaW50ZlhPLmdldFN0YXRpY0hhbmRsZXIoKSArICInIG5vdCBmb3VuZC4iLCBpbnRmWE8pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQuX2RlbGVnYXRlVG9DbGFzc05hbWUgPSBpbnRmWE8uZ2V0U3RhdGljSGFuZGxlcigpOworICAgICAgICByZXN1bHQuX2RlbGVnYXRlVG9DbGFzcyA9IHZhbGlkYXRlQ2xhc3MocmVzdWx0Ll9kZWxlZ2F0ZVRvQ2xhc3NOYW1lLCBpbnRmWE8pOworCisgICAgICAgIGlmICggcmVzdWx0Ll9kZWxlZ2F0ZVRvQ2xhc3M9PW51bGwgKSAvLyBubyBIYW5kbGVyQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hQ29uZmlnLndhcm5pbmcoIkhhbmRsZXIgY2xhc3MgJyIgKyBpbnRmWE8uZ2V0U3RhdGljSGFuZGxlcigpICsgIicgbm90IGZvdW5kIG9uIGNsYXNzcGF0aCwgc2tpcCB2YWxpZGF0aW9uLiIsIGludGZYTyk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZXN1bHQudmFsaWRhdGVNZXRob2RzKGludGZYTykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHZhbGlkYXRlSW50ZXJmYWNlKFN0cmluZyBpbnRmU3RyLCBYbWxPYmplY3QgbG9jKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlSmF2YShpbnRmU3RyLCB0cnVlLCBsb2MpOworICAgIH0KKworICAgIHN0YXRpYyBDbGFzcyB2YWxpZGF0ZUNsYXNzKFN0cmluZyBjbHNTdHIsIFhtbE9iamVjdCBsb2MpCisgICAgeworICAgICAgICByZXR1cm4gdmFsaWRhdGVKYXZhKGNsc1N0ciwgZmFsc2UsIGxvYyk7CisgICAgfQorCisgICAgc3RhdGljIENsYXNzIHZhbGlkYXRlSmF2YShTdHJpbmcgY2xzU3RyLCBib29sZWFuIGlzSW50ZXJmYWNlLCBYbWxPYmplY3QgbG9jKQorICAgIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudCA9IGlzSW50ZXJmYWNlID8gIkludGVyZmFjZSIgOiAiQ2xhc3MiOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3MuZm9yTmFtZShjbHNTdHIpOworICAgICAgICAgICAgaWYgKCAoaXNJbnRlcmZhY2UgJiYgIWNscy5pc0ludGVyZmFjZSgpKSB8fAorICAgICAgICAgICAgICAgICAgICAoIWlzSW50ZXJmYWNlICYmIGNscy5pc0ludGVyZmFjZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFDb25maWcuZXJyb3IoIiciICsgY2xzU3RyICsgIicgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAgICAgKGlzSW50ZXJmYWNlID8gImFuIGludGVyZmFjZSIgOiAiYSBjbGFzcyIpICsgIi4iLCBsb2MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKGNscy5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKGVudCArICIgJyIgKyBjbHNTdHIgKyAiJyBpcyBub3QgcHVibGljLiIsIGxvYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjbHM7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKGVudCArICIgJyIgKyBjbHNTdHIgKyAiJyBub3QgZm91bmQuIiwgbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTWV0aG9kcyhYbWxPYmplY3QgbG9jKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IF9kZWxlZ2F0ZVRvQ2xhc3MgIT0gbnVsbCA6ICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiI7CisgICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOworCisgICAgICAgIF9pbnRlcmZhY2VNZXRob2RzID0gX2ludGVyZmFjZS5nZXRNZXRob2RzKCk7CisgICAgICAgIF9kZWxlZ2F0ZVRvTWV0aG9kcyA9IG5ldyBNZXRob2RbX2ludGVyZmFjZU1ldGhvZHMubGVuZ3RoXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9pbnRlcmZhY2VNZXRob2RzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZCAmPSB2YWxpZGF0ZU1ldGhvZChpLCBfaW50ZXJmYWNlTWV0aG9kc1tpXSwgbG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWxpZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVNZXRob2QoaW50IGluZGV4LCBNZXRob2QgbWV0aG9kLCBYbWxPYmplY3QgbG9jKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisKKyAgICAgICAgQ2xhc3NbXSBkZWxlZ2F0ZVBhcmFtcyA9IG5ldyBDbGFzc1twYXJhbVR5cGVzLmxlbmd0aCsxXTsKKyAgICAgICAgZGVsZWdhdGVQYXJhbXNbMF0gPSBYbWxPYmplY3QuY2xhc3M7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGVsZWdhdGVQYXJhbXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGVnYXRlUGFyYW1zW2ldID0gcGFyYW1UeXBlc1tpLTFdOworICAgICAgICB9CisKKyAgICAgICAgTWV0aG9kIGhhbmRsZXJNZXRob2QgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlck1ldGhvZCA9IF9kZWxlZ2F0ZVRvQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGRlbGVnYXRlUGFyYW1zKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRocm93cyBleGNlcHRpb25zCisgICAgICAgICAgICBDbGFzc1tdIGludGZFeGNlcHRpb25zID0gbWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7CisgICAgICAgICAgICBDbGFzc1tdIGRlbGVnYXRlRXhjZXB0aW9ucyA9IGhhbmRsZXJNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKKyAgICAgICAgICAgIGlmICggZGVsZWdhdGVFeGNlcHRpb25zLmxlbmd0aCE9aW50ZkV4Y2VwdGlvbnMubGVuZ3RoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTY2hlbWFDb25maWcuZXJyb3IoIkhhbmRsZXIgbWV0aG9kICciICsgX2RlbGVnYXRlVG9DbGFzcy5nZXROYW1lKCkgKyAiLiIgKyBtZXRob2ROYW1lICsgIigiICsgbGlzdFR5cGVzKGRlbGVnYXRlUGFyYW1zKSArCisgICAgICAgICAgICAgICAgICAgICIpJyBtdXN0IGRlY2xhcmUgdGhlIHNhbWUgZXhjZXB0aW9ucyBhcyB0aGUgaW50ZXJmYWNlIG1ldGhvZCAnIiArIF9pbnRlcmZhY2UuZ2V0TmFtZSgpICsgIi4iICsgbWV0aG9kTmFtZSArICIoIiArIGxpc3RUeXBlcyhwYXJhbVR5cGVzKSwgbG9jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVFeGNlcHRpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggZGVsZWdhdGVFeGNlcHRpb25zW2ldIT1pbnRmRXhjZXB0aW9uc1tpXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25maWcuZXJyb3IoIkhhbmRsZXIgbWV0aG9kICciICsgX2RlbGVnYXRlVG9DbGFzcy5nZXROYW1lKCkgKyAiLiIgKyBtZXRob2ROYW1lICsgIigiICsgbGlzdFR5cGVzKGRlbGVnYXRlUGFyYW1zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiKScgbXVzdCBkZWNsYXJlIHRoZSBzYW1lIGV4Y2VwdGlvbnMgYXMgdGhlIGludGVyZmFjZSBtZXRob2QgJyIgKyBfaW50ZXJmYWNlLmdldE5hbWUoKSArICIuIiArIG1ldGhvZE5hbWUgKyAiKCIgKyBsaXN0VHlwZXMocGFyYW1UeXBlcyksIGxvYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFDb25maWcuZXJyb3IoIkhhbmRsZXIgY2xhc3MgJyIgKyBfZGVsZWdhdGVUb0NsYXNzLmdldE5hbWUoKSArICInIGRvZXMgbm90IGNvbnRhaW4gbWV0aG9kICIgKyBtZXRob2ROYW1lICsgIigiICsgbGlzdFR5cGVzKGRlbGVnYXRlUGFyYW1zKSArICIpIiwgbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKCJTZWN1cml0eSB2aW9sYXRpb24gZm9yIGNsYXNzICciICsgX2ludGVyZmFjZS5nZXROYW1lKCkgKyAiJyBhY2Nlc2luZyBtZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiKCIgKyBsaXN0VHlwZXMoZGVsZWdhdGVQYXJhbXMpICsgIikiLCBsb2MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhoYW5kbGVyTWV0aG9kLmdldE1vZGlmaWVycygpKSB8fCAhTW9kaWZpZXIuaXNTdGF0aWMoaGFuZGxlck1ldGhvZC5nZXRNb2RpZmllcnMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigiTWV0aG9kICciICsgX2RlbGVnYXRlVG9DbGFzcy5nZXROYW1lKCkgKyAiLiIgKyBtZXRob2ROYW1lICsgIigiICsgbGlzdFR5cGVzKGRlbGVnYXRlUGFyYW1zKSArICIpJyBtdXN0IGJlIGRlY2xhcmVkIHB1YmxpYyBhbmQgc3RhdGljLiIsIGxvYyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJldHVyblR5cGUuZXF1YWxzKGhhbmRsZXJNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKCJSZXR1cm4gdHlwZSBmb3IgbWV0aG9kICciICsgaGFuZGxlck1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgKyAiICIgKyBfZGVsZWdhdGVUb0NsYXNzLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICIuIiArIG1ldGhvZE5hbWUgKyAiKCIgKyBsaXN0VHlwZXMoZGVsZWdhdGVQYXJhbXMpICsgIiknIGRvZXMgbm90IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW50ZXJmYWNlIG1ldGhvZCA6JyIgKyByZXR1cm5UeXBlICsgIicuIiwgbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIF9kZWxlZ2F0ZVRvTWV0aG9kc1tpbmRleF0gPSBtZXRob2Q7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxpc3RUeXBlcyhDbGFzc1tdIHR5cGVzKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHR5cGVzW2ldOworICAgICAgICAgICAgaWYgKGk+MCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbWl0VHlwZSh0eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtaXRUeXBlKENsYXNzIGNscykKKyAgICB7CisgICAgICAgIGlmIChjbHMuaXNBcnJheSgpKQorICAgICAgICAgICAgcmV0dXJuIGVtaXRUeXBlKGNscy5nZXRDb21wb25lbnRUeXBlKCkpICsgIltdIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNscy5nZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7CisgICAgfQorCisgICAgLyogcHVibGljIGdldHRlcnMgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgZnVsbEphdmFOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF94YmVhblNldC5jb250YWlucyhmdWxsSmF2YU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gX2ludGVyZmFjZS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lRm9ySmF2YVNvdXJjZSgpCisgICAgeworICAgICAgICByZXR1cm4gZW1pdFR5cGUoX2ludGVyZmFjZSk7CisgICAgfQorCisgICAgLy8gdXNlZCBvbmx5IGZvciB2YWxpZGF0aW9uCisgICAgcHVibGljIFN0cmluZyBnZXRIYW5kbGVyTmFtZUZvckphdmFTb3VyY2UoKQorICAgIHsKKyAgICAgICAgaWYgKF9kZWxlZ2F0ZVRvQ2xhc3M9PW51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gZW1pdFR5cGUoX2RlbGVnYXRlVG9DbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnRlcmZhY2VNZXRob2RDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gX2ludGVyZmFjZU1ldGhvZHMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTWV0aG9kTmFtZShpbnQgbWV0aG9kSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gX2ludGVyZmFjZU1ldGhvZHNbbWV0aG9kSW5kZXhdLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kIGdldEludGVyZmFjZU1ldGhvZChpbnQgbWV0aG9kSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gX2ludGVyZmFjZU1ldGhvZHNbbWV0aG9kSW5kZXhdOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTWV0aG9kRGVjbChpbnQgbWV0aG9kSW5kZXgpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE1ldGhvZCBtID0gX2ludGVyZmFjZU1ldGhvZHNbbWV0aG9kSW5kZXhdOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ldOworICAgICAgICAgICAgc2IuYXBwZW5kKCBpPT0wID8gIiIgOiAiLCAiICk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIGVtaXRUeXBlKHBhcmFtVHlwZSkgKyAiIHAiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgZXhjZXB0aW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgQ2xhc3NbXSBleGNDbGFzc2VzID0gbS5nZXRFeGNlcHRpb25UeXBlcygpOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxleGNDbGFzc2VzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZXhjZXB0aW9ucy5hcHBlbmQoKGk9PTAgPyAiIHRocm93cyAiIDogIiwgIikgKyBlbWl0VHlwZShleGNDbGFzc2VzW2ldKSk7CisKKyAgICAgICAgcmV0dXJuICJwdWJsaWMgIiArIGVtaXRUeXBlKG0uZ2V0UmV0dXJuVHlwZSgpKSArICIgIiArIG0uZ2V0TmFtZSgpICsgIigiICsgc2IudG9TdHJpbmcoKSArICIpIiArIGV4Y2VwdGlvbnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU1ldGhvZEltcGwoaW50IG1ldGhvZEluZGV4KQorICAgIHsKKwkvLyB1c2UgdGhlIG1ldGhvZHMgZnJvbSB0aGUgaW50ZXJmYWNlIGZvciBnZW4gdGhlIGNhbGwgdG8gdGhlIGhhbmRsZXIKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGlmICghdm9pZC5jbGFzcy5lcXVhbHMoX2ludGVyZmFjZU1ldGhvZHNbbWV0aG9kSW5kZXhdLmdldFJldHVyblR5cGUoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoInJldHVybiAiKTsKKworICAgICAgICBzYi5hcHBlbmQoX2RlbGVnYXRlVG9DbGFzc05hbWUgKyAiLiIgKyBfZGVsZWdhdGVUb01ldGhvZHNbbWV0aG9kSW5kZXhdLmdldE5hbWUoKSArICIodGhpcyIpOworCisgICAgICAgIGludCBwYXJhbUNvdW50ID0gX2ludGVyZmFjZU1ldGhvZHNbbWV0aG9kSW5kZXhdLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpPTA7IGk8cGFyYW1Db3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgcCIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL05hbWVTZXQuamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9OYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwYjhkMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9OYW1lU2V0LmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoIGNlemFyLmFuZHJlaSBhdCBiZWEuY29tICkKKyAqIERhdGU6IEFwciAyNSwgMjAwNAorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworLyoqCisgKiBSZXByZXplbnRzIGEgbm9uIGZpbml0ZSBzZXQgb2YgbmFtZXMuCisgKiBAc2VlIE5hbWVTZXRCdWlsZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lU2V0Cit7CisgICAgLyoqCisgICAgICogQW4gZW1wdHkgTmFtZVNldCwgaXQgZG9lc24ndCBjb250YWluIGFueSBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOYW1lU2V0IEVNUFRZID0gbmV3IE5hbWVTZXQodHJ1ZSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKKyAgICAvKioKKyAgICAgKiBUaGUgTmFtZVNldCB0aGF0IGNvbnRhaW5zIGFueSBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOYW1lU2V0IEVWRVJZVEhJTkcgPSBuZXcgTmFtZVNldChmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKKworICAgIC8qCisgICAgVGhlcmUgYXJlIHR3byBiaWcgY2FzZXM6CisgICAgMSkgLSBpdCByZXByZXplbnRzICIqIiwgaWUgYWxsIGV4Y2VwdCBhIGZpbml0ZSBzZXQgb2YgbmFtZXM6IF9pc0Zpbml0ZT09ZmFsc2UKKyAgICAyKSAtIGlmIHJlcHJlemVudHMgb25seSBhIGZpbml0ZSBzZXQgb2YgbmFtZXM6IF9pc0Zpbml0ZT09dHJ1ZQorICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIF9pc0Zpbml0ZTsKKyAgICBwcml2YXRlIFNldCBfZmluaXRlU2V0OworCisgICAgcHJpdmF0ZSBOYW1lU2V0KGJvb2xlYW4gaXNGaW5pdGUsIFNldCBmaW5pdGVTZXQpCisgICAgeworICAgICAgICBfaXNGaW5pdGUgPSBpc0Zpbml0ZTsKKyAgICAgICAgX2Zpbml0ZVNldCA9IGZpbml0ZVNldDsKKyAgICB9CisKKyAgICBzdGF0aWMgTmFtZVNldCBuZXdJbnN0YW5jZShib29sZWFuIGlzRmluaXRlLCBTZXQgZmluaXRlU2V0KQorICAgIHsKKyAgICAgICAgaWYgKCBmaW5pdGVTZXQuc2l6ZSgpPT0wICkKKyAgICAgICAgICAgIGlmICggaXNGaW5pdGUgKQorICAgICAgICAgICAgICAgIHJldHVybiBOYW1lU2V0LkVNUFRZOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOYW1lU2V0LkVWRVJZVEhJTkc7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2V0IGZzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgIGZzLmFkZEFsbChmaW5pdGVTZXQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYW1lU2V0KGlzRmluaXRlLCBmcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQgaW50ZXJzZWN0RmluaXRlU2V0cyhTZXQgYSwgU2V0IGIpCisgICAgeworICAgICAgICBTZXQgaW50ZXJzZWN0aW9uID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgLy9jb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgX2Zpbml0ZVNldCB3aXRoIHdpdGhTZXQKKyAgICAgICAgd2hpbGUgKGEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgYS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChiLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbi5hZGQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGlzIE5hbWVTZXQgd2l0aCB0aGUgJ3dpdGgnIE5hbWVTZXQuCisgICAgICovCisgICAgcHVibGljIE5hbWVTZXQgdW5pb24oTmFtZVNldCB3aXRoKQorICAgIHsKKyAgICAgICAgaWYgKF9pc0Zpbml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdpdGguX2lzRmluaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldCB1bmlvbiA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgdW5pb24uYWRkQWxsKF9maW5pdGVTZXQpOworICAgICAgICAgICAgICAgIHVuaW9uLmFkZEFsbCh3aXRoLl9maW5pdGVTZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh0cnVlLCB1bmlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0IHN1YnN0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBzdWJzdC5hZGRBbGwod2l0aC5fZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICBzdWJzdC5yZW1vdmVBbGwoX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbHNlLCBzdWJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2l0aC5faXNGaW5pdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0IHN1YnN0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBzdWJzdC5hZGRBbGwoX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgc3Vic3QucmVtb3ZlQWxsKHdpdGguX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbHNlLCBzdWJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbHNlLCBpbnRlcnNlY3RGaW5pdGVTZXRzKF9maW5pdGVTZXQsIHdpdGguX2Zpbml0ZVNldCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgTmFtZVNldCB3aXRoIHRoZSAnd2l0aCcgTmFtZVNldAorICAgICAqLworICAgIHB1YmxpYyBOYW1lU2V0IGludGVyc2VjdChOYW1lU2V0IHdpdGgpCisgICAgeworICAgICAgICBpZiAoX2lzRmluaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2l0aC5faXNGaW5pdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHRydWUsIGludGVyc2VjdEZpbml0ZVNldHMoX2Zpbml0ZVNldCwgd2l0aC5fZmluaXRlU2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0IHN1YnN0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBzdWJzdC5hZGRBbGwoX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgc3Vic3QucmVtb3ZlQWxsKHdpdGguX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbHNlLCBzdWJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2l0aC5faXNGaW5pdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2V0IHN1YnN0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBzdWJzdC5hZGRBbGwod2l0aC5fZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICBzdWJzdC5yZW1vdmVBbGwoX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHRydWUsIHN1YnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXQgdW5pb24gPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgIHVuaW9uLmFkZEFsbChfZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICB1bmlvbi5hZGRBbGwod2l0aC5fZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UoZmFsc2UsIHVuaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJzdHJhY3RpbmcgdGhpcyBOYW1lU2V0IGZyb20gJ2Zyb20nIE5hbWVTZXQKKyAgICAgKiBAc2VlIE5hbWVTZXQjc3Vic3RyYWN0CisgICAgICovCisgICAgcHVibGljIE5hbWVTZXQgc3Vic3RyYWN0RnJvbShOYW1lU2V0IGZyb20pCisgICAgeworICAgICAgICByZXR1cm4gZnJvbS5zdWJzdHJhY3QodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnN0cmFjdGluZyAnd2hhdCcgTmFtZVNldCBmcm9tIHRoaXMgTmFtZVNldAorICAgICAqIEBzZWUgTmFtZVNldCNzdWJzdHJhY3RGcm9tCisgICAgICovCisgICAgcHVibGljIE5hbWVTZXQgc3Vic3RyYWN0KE5hbWVTZXQgd2hhdCkKKyAgICB7CisgICAgICAgIGlmIChfaXNGaW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2hhdC5faXNGaW5pdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGl0J3MgdGhlIHN1YnN0IG9mIF9maW5pdGVTZXQgd2l0aCB3aGF0Ll9maW5pdGVTZXQKKyAgICAgICAgICAgICAgICBTZXQgc3Vic3QgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgICAgIHN1YnN0LmFkZEFsbChfZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICBzdWJzdC5yZW1vdmVBbGwod2hhdC5fZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UodHJ1ZSwgc3Vic3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh0cnVlLCBpbnRlcnNlY3RGaW5pdGVTZXRzKF9maW5pdGVTZXQsIHdoYXQuX2Zpbml0ZVNldCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3aGF0Ll9pc0Zpbml0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaXQncyB0aGUgdW5pb24gb2YgX2Zpbml0ZVNldCB3aXRoIHdoYXQuX2Zpbml0ZVNldAorICAgICAgICAgICAgICAgIFNldCB1bmlvbiA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgdW5pb24uYWRkQWxsKF9maW5pdGVTZXQpOworICAgICAgICAgICAgICAgIHVuaW9uLmFkZEFsbCh3aGF0Ll9maW5pdGVTZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZShmYWxzZSwgdW5pb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdoYXQncyBpbiB0aGlzU2V0IGFuZCBpdCdzIG5vdCBpbiB3aGF0U2V0CisgICAgICAgICAgICAgICAgU2V0IHN1YnN0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBzdWJzdC5hZGRBbGwod2hhdC5fZmluaXRlU2V0KTsKKyAgICAgICAgICAgICAgICBzdWJzdC5yZW1vdmVBbGwoX2Zpbml0ZVNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHRydWUsIHN1YnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW52ZXJzaW9uIG9mIHRoaXMgTmFtZVNldAorICAgICAqLworICAgIHB1YmxpYyBOYW1lU2V0IGludmVydCgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2UoIV9pc0Zpbml0ZSwgX2Zpbml0ZVNldCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBpZiAoX2lzRmluaXRlKQorICAgICAgICAgICAgcmV0dXJuIF9maW5pdGVTZXQuY29udGFpbnMobmFtZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAhX2Zpbml0ZVNldC5jb250YWlucyhuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvTmFtZVNldEJ1aWxkZXIuamF2YSBiL3YxL3NyYy94bWxjb25maWcvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL2NvbmZpZy9OYW1lU2V0QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNjFhMDgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvTmFtZVNldEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKCBjZXphci5hbmRyZWkgYXQgYmVhLmNvbSApCisgKiBEYXRlOiBBcHIgMjUsIDIwMDQKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworLyoqCisgKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBOYW1lU2V0IE5hbWVTZXRzfS4KKyAqLworcHVibGljIGNsYXNzIE5hbWVTZXRCdWlsZGVyCit7CisgICAgcHJpdmF0ZSBib29sZWFuIF9pc0Zpbml0ZTsKKyAgICBwcml2YXRlIFNldCBfZmluaXRlU2V0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBidWlsZGVyIGZvciBhIE5hbWVTZXQuCisgICAgICovCisgICAgcHVibGljIE5hbWVTZXRCdWlsZGVyKCkKKyAgICB7CisgICAgICAgIF9pc0Zpbml0ZSA9IHRydWU7CisgICAgICAgIF9maW5pdGVTZXQgPSBuZXcgSGFzaFNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmVydHMgdGhlIHJlcHJlc2VudGluZyBOYW1lU2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52ZXJ0KCkKKyAgICB7CisgICAgICAgIF9pc0Zpbml0ZSA9ICFfaXNGaW5pdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5hbWUgdG8gdGhlIHJlcHJlc2VudGluZyBOYW1lU2V0CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBpZiAoX2lzRmluaXRlICkKKyAgICAgICAgICAgIF9maW5pdGVTZXQuYWRkKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZmluaXRlU2V0LnJlbW92ZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IE5hbWVTZXQgd2l0aCB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQgTmFtZVNldAorICAgICAqLworICAgIHB1YmxpYyBOYW1lU2V0IHRvTmFtZVNldCgpCisgICAgeworICAgICAgICBpZiAoIF9maW5pdGVTZXQuc2l6ZSgpPT0wICkKKyAgICAgICAgICAgIGlmICggX2lzRmluaXRlICkKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFtZVNldC5FTVBUWTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTmFtZVNldC5FVkVSWVRISU5HOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTmFtZVNldC5uZXdJbnN0YW5jZShfaXNGaW5pdGUsIF9maW5pdGVTZXQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvUHJlUG9zdEV4dGVuc2lvbi5qYXZhIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1ByZVBvc3RFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM3OTVlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1ByZVBvc3RFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpICggY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20gKQorICogRGF0ZTogQXByIDEyLCAyMDA0CisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbmZpZzsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuRXh0ZW5zaW9uY29uZmlnOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBQcmVQb3N0RXh0ZW5zaW9uCit7CisgICAgcHVibGljIHN0YXRpYyBpbnQgT1BFUkFUSU9OX1NFVCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbnQgT1BFUkFUSU9OX0lOU0VSVCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbnQgT1BFUkFUSU9OX1JFTU9WRSA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFBBUkFNVFlQRVNfUFJFUE9TVCA9IG5ldyBDbGFzc1tde2ludC5jbGFzcywgWG1sT2JqZWN0LmNsYXNzLCBRTmFtZS5jbGFzcywgYm9vbGVhbi5jbGFzcywgaW50LmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFID0gIihpbnQsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBib29sZWFuLCBpbnQpIjsKKworICAgIHByaXZhdGUgTmFtZVNldCBfeGJlYW5TZXQ7CisgICAgcHJpdmF0ZSBDbGFzcyBfZGVsZWdhdGVUb0NsYXNzOworICAgIHByaXZhdGUgU3RyaW5nIF9kZWxlZ2F0ZVRvQ2xhc3NOYW1lOworICAgIHByaXZhdGUgTWV0aG9kIF9wcmVTZXQ7CisgICAgcHJpdmF0ZSBNZXRob2QgX3Bvc3RTZXQ7CisKKyAgICBzdGF0aWMgUHJlUG9zdEV4dGVuc2lvbiBuZXdJbnN0YW5jZShOYW1lU2V0IHhiZWFuU2V0LCBFeHRlbnNpb25jb25maWcuUHJlUG9zdFNldCBwcmVQb3N0WE8pCisgICAgeworICAgICAgICBpZiAocHJlUG9zdFhPPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgUHJlUG9zdEV4dGVuc2lvbiByZXN1bHQgPSBuZXcgUHJlUG9zdEV4dGVuc2lvbigpOworCisgICAgICAgIHJlc3VsdC5feGJlYW5TZXQgPSB4YmVhblNldDsKKyAgICAgICAgcmVzdWx0Ll9kZWxlZ2F0ZVRvQ2xhc3NOYW1lID0gcHJlUG9zdFhPLmdldFN0YXRpY0hhbmRsZXIoKTsKKyAgICAgICAgcmVzdWx0Ll9kZWxlZ2F0ZVRvQ2xhc3MgPSBJbnRlcmZhY2VFeHRlbnNpb24udmFsaWRhdGVDbGFzcyhyZXN1bHQuX2RlbGVnYXRlVG9DbGFzc05hbWUsIHByZVBvc3RYTyk7CisKKyAgICAgICAgaWYgKCByZXN1bHQuX2RlbGVnYXRlVG9DbGFzcz09bnVsbCApIC8vIG5vIEhhbmRsZXJDbGFzcworICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFDb25maWcud2FybmluZygiSGFuZGxlciBjbGFzcyAnIiArIHByZVBvc3RYTy5nZXRTdGF0aWNIYW5kbGVyKCkgKyAiJyBub3QgZm91bmQgb24gY2xhc3NwYXRoLCBza2lwIHZhbGlkYXRpb24uIiwgcHJlUG9zdFhPKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlc3VsdC5sb29rQWZ0ZXJQcmVBbmRQb3N0KHByZVBvc3RYTykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBsb29rQWZ0ZXJQcmVBbmRQb3N0KFhtbE9iamVjdCBsb2MpCisgICAgeworICAgICAgICBhc3NlcnQgX2RlbGVnYXRlVG9DbGFzcyE9bnVsbCA6ICJEZWxlZ2F0ZSB0byBjbGFzcyBoYW5kbGVyIGV4cGVjdGVkLiI7CisgICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBfcHJlU2V0ID0gX2RlbGVnYXRlVG9DbGFzcy5nZXRNZXRob2QoInByZVNldCIsIFBBUkFNVFlQRVNfUFJFUE9TVCk7CisKKyAgICAgICAgICAgIGlmICghX3ByZVNldC5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKQorICAgICAgICAgICAgeworCQkvLyBqdXN0IGVtaXQgYW4gd2FybmluZyBhbmQgZG9uJ3QgcmVtZW1iZXIgYXMgYSBwcmVTZXQKKyAgICAgICAgICAgICAgICBTY2hlbWFDb25maWcud2FybmluZygiTWV0aG9kICciICsgX2RlbGVnYXRlVG9DbGFzcy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAiLnByZVNldCIgKyBTSUdOQVRVUkUgKyAiJyAiICsKKyAgICAgICAgICAgICAgICAgICAgInNob3VsZCByZXR1cm4gYm9vbGVhbiB0byBiZSBjb25zaWRlcmVkIGZvciBhIHByZVNldCBoYW5kbGVyLiIsIGxvYyk7CisgICAgICAgICAgICAgICAgX3ByZVNldCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICB7fSAvLyBub3QgYXZhaWxhYmxlIGlzIG9rLCBfcHJlU2V0IHdpbGwgYmUgbnVsbAorICAgICAgICBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NoZW1hQ29uZmlnLmVycm9yKCJTZWN1cml0eSB2aW9sYXRpb24gZm9yIGNsYXNzICciICsgX2RlbGVnYXRlVG9DbGFzcy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICInIGFjY2VzaW5nIG1ldGhvZCBwcmVTZXQiICsgU0lHTkFUVVJFICwgbG9jKTsKKyAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgX3Bvc3RTZXQgPSBfZGVsZWdhdGVUb0NsYXNzLmdldE1ldGhvZCgicG9zdFNldCIsIFBBUkFNVFlQRVNfUFJFUE9TVCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICB7fSAvLyBub3QgYXZhaWxhYmxlIGlzIG9rLCBfcG9zdFNldCB3aWxsIGJlIG51bGwKKyAgICAgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigiU2VjdXJpdHkgdmlvbGF0aW9uIGZvciBjbGFzcyAnIiArIF9kZWxlZ2F0ZVRvQ2xhc3MuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAiJyBhY2Nlc2luZyBtZXRob2QgcG9zdFNldCIgKyBTSUdOQVRVUkUsIGxvYyk7CisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9wcmVTZXQ9PW51bGwgJiYgX3Bvc3RTZXQ9PW51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNjaGVtYUNvbmZpZy5lcnJvcigicHJlUG9zdFNldCBoYW5kbGVyIHNwZWNpZmllZCAnIiArIF9kZWxlZ2F0ZVRvQ2xhc3MuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAiJyBidXQgbm8gcHJlU2V0IiArIFNJR05BVFVSRSArICIgb3IgIiArCisgICAgICAgICAgICAgICAgInBvc3RTZXQiICsgU0lHTkFUVVJFICsgIiBtZXRob2RzIGZvdW5kLiIsIGxvYyk7CisgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbGlkOworICAgIH0KKworICAgIC8vIHB1YmxpYyBtZXRob2RzCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGZ1bGxKYXZhTmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBfeGJlYW5TZXQuY29udGFpbnMoZnVsbEphdmFOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmVDYWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfcHJlU2V0IT1udWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Bvc3RDYWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfcG9zdFNldCE9bnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIGluIGEgZm9ybSB0aGF0IGNhbiBiZSBwdXQgaW4gYSBqYXZhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJOYW1lRm9ySmF2YVNvdXJjZSgpCisgICAgeworICAgICAgICAvLyB1c2VkIG9ubHkgaW4gdmFsaWRhdGlvbgorICAgICAgICBpZiAoX2RlbGVnYXRlVG9DbGFzcz09bnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBJbnRlcmZhY2VFeHRlbnNpb24uZW1pdFR5cGUoX2RlbGVnYXRlVG9DbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZWQgY29kZSBmb3IgbWFrZWluZyB0aGUgcHJlU2V0IGNhbGwKKyAgICAgKiBAcGFyYW0gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBpc0F0dHIKKyAgICAgKiBAcGFyYW0gaW5kZXggdXN1YWx5IGlzICdpJywgb3IgY2FuIGJlIC0xIGZvciBub24gYXJyYXkgcHJvcGVydGllcworICAgICAqIEByZXR1cm4gZ2VuZWQgY29kZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlQ2FsbChpbnQgb3BUeXBlLCBTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBpc0F0dHIsIFN0cmluZyBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGVUb0NsYXNzTmFtZSArICIucHJlU2V0KCIgKyBvcFR5cGUgKyAiLCB0aGlzLCAiICsgaWRlbnRpZmllciArICIsICIgKyBpc0F0dHIgKyAiLCAiICsgaW5kZXggKyAiKSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZWQgY29kZSBmb3IgbWFrZWluZyB0aGUgcHJlU2V0IGNhbGwKKyAgICAgKiBAcGFyYW0gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBpc0F0dHIKKyAgICAgKiBAcGFyYW0gaW5kZXggdXN1YWx5IGlzICdpJywgb3IgY2FuIGJlIC0xIGZvciBub24gYXJyYXkgcHJvcGVydGllcworICAgICAqIEByZXR1cm4gZ2VuZWQgY29kZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdENhbGwoaW50IG9wVHlwZSwgU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gaXNBdHRyLCBTdHJpbmcgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlVG9DbGFzc05hbWUgKyAiLnBvc3RTZXQoIiArIG9wVHlwZSArICIsIHRoaXMsICIgKyBpZGVudGlmaWVyICsgIiwgIiArIGlzQXR0ciArICIsICIgKyBpbmRleCArICIpOyI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZVNldEludGVyc2VjdGlvbihQcmVQb3N0RXh0ZW5zaW9uIGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiAhTmFtZVNldC5FTVBUWS5lcXVhbHMoX3hiZWFuU2V0LmludGVyc2VjdChleHQuX3hiZWFuU2V0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1NjaGVtYUNvbmZpZy5qYXZhIGIvdjEvc3JjL3htbGNvbmZpZy9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvY29uZmlnL1NjaGVtYUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYWE4MDUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sY29uZmlnL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9jb25maWcvU2NoZW1hQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkNvbmZpZ0RvY3VtZW50LkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLkV4dGVuc2lvbmNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC54bWxiZWFucy54MjAwNC54MDIueGJlYW4uY29uZmlnLk5zY29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnhtbGJlYW5zLngyMDA0LngwMi54YmVhbi5jb25maWcuUW5hbWVjb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlN0c2NTdGF0ZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgU2NoZW1hQ29uZmlnCit7CisgICAgcHJpdmF0ZSBNYXAgX3BhY2thZ2VNYXA7CisgICAgcHJpdmF0ZSBNYXAgX3ByZWZpeE1hcDsKKyAgICBwcml2YXRlIE1hcCBfc3VmZml4TWFwOworICAgIHByaXZhdGUgTWFwIF9wYWNrYWdlTWFwQnlVcmlQcmVmaXg7IC8vIHVyaSBwcmVmaXggLT4gcGFja2FnZQorICAgIHByaXZhdGUgTWFwIF9wcmVmaXhNYXBCeVVyaVByZWZpeDsgIC8vIHVyaSBwcmVmaXggLT4gbmFtZSBwcmVmaXgKKyAgICBwcml2YXRlIE1hcCBfc3VmZml4TWFwQnlVcmlQcmVmaXg7ICAvLyB1cmkgcHJlZml4IC0+IG5hbWUgc3VmZml4CisgICAgcHJpdmF0ZSBNYXAgX3FuYW1lTWFwOworICAgIHByaXZhdGUgRXh0ZW5zaW9uSG9sZGVyIF9leHRlbnNpb25Ib2xkZXI7CisKKyAgICBwcml2YXRlIFNjaGVtYUNvbmZpZygpCisgICAgeworICAgICAgICBfcGFja2FnZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX3ByZWZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX3N1ZmZpeE1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX3BhY2thZ2VNYXBCeVVyaVByZWZpeCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX3ByZWZpeE1hcEJ5VXJpUHJlZml4ID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgICAgICBfc3VmZml4TWFwQnlVcmlQcmVmaXggPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgIF9xbmFtZU1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICAgICAgX2V4dGVuc2lvbkhvbGRlciA9IG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hQ29uZmlnIGZvckNvbmZpZ0RvY3VtZW50cyhDb25maWdbXSBjb25maWdzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFDb25maWcoY29uZmlncyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU2NoZW1hQ29uZmlnKENvbmZpZ1tdIGNvbmZpZ3MpCisgICAgeworICAgICAgICBfcGFja2FnZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9wcmVmaXhNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgICAgICBfc3VmZml4TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgX3BhY2thZ2VNYXBCeVVyaVByZWZpeCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9wcmVmaXhNYXBCeVVyaVByZWZpeCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9zdWZmaXhNYXBCeVVyaVByZWZpeCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9xbmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9leHRlbnNpb25Ib2xkZXIgPSBuZXcgRXh0ZW5zaW9uSG9sZGVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDb25maWcgY29uZmlnID0gY29uZmlnc1tpXTsKKyAgICAgICAgICAgIE5zY29uZmlnW10gbnNhID0gY29uZmlnLmdldE5hbWVzcGFjZUFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5zYS5sZW5ndGg7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VTZXR0aW5nKG5zYVtqXS5nZXRVcmkoKSwgbnNhW2pdLmdldFBhY2thZ2UoKSwgX3BhY2thZ2VNYXApOworICAgICAgICAgICAgICAgIHJlY29yZE5hbWVzcGFjZVNldHRpbmcobnNhW2pdLmdldFVyaSgpLCBuc2Fbal0uZ2V0UHJlZml4KCksIF9wcmVmaXhNYXApOworICAgICAgICAgICAgICAgIHJlY29yZE5hbWVzcGFjZVNldHRpbmcobnNhW2pdLmdldFVyaSgpLCBuc2Fbal0uZ2V0U3VmZml4KCksIF9zdWZmaXhNYXApOworICAgICAgICAgICAgICAgIHJlY29yZE5hbWVzcGFjZVByZWZpeFNldHRpbmcobnNhW2pdLmdldFVyaXByZWZpeCgpLCBuc2Fbal0uZ2V0UGFja2FnZSgpLCBfcGFja2FnZU1hcEJ5VXJpUHJlZml4KTsKKyAgICAgICAgICAgICAgICByZWNvcmROYW1lc3BhY2VQcmVmaXhTZXR0aW5nKG5zYVtqXS5nZXRVcmlwcmVmaXgoKSwgbnNhW2pdLmdldFByZWZpeCgpLCBfcHJlZml4TWFwQnlVcmlQcmVmaXgpOworICAgICAgICAgICAgICAgIHJlY29yZE5hbWVzcGFjZVByZWZpeFNldHRpbmcobnNhW2pdLmdldFVyaXByZWZpeCgpLCBuc2Fbal0uZ2V0U3VmZml4KCksIF9zdWZmaXhNYXBCeVVyaVByZWZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFFuYW1lY29uZmlnW10gcW5jID0gY29uZmlnLmdldFFuYW1lQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcW5jLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9xbmFtZU1hcC5wdXQocW5jW2pdLmdldE5hbWUoKSwgcW5jW2pdLmdldEphdmFuYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFeHRlbnNpb25jb25maWdbXSBleHQgPSBjb25maWcuZ2V0RXh0ZW5zaW9uQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0Lmxlbmd0aDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY29yZEV4dGVuc2lvblNldHRpbmcoZXh0W2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9leHRlbnNpb25Ib2xkZXIuc2Vjb25kUGhhc2VWYWxpZGF0aW9uKCk7CisgICAgICAgIC8vdG9kbyBfZXh0ZW5zaW9uSG9sZGVyLm5vcm1hbGl6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVjb3JkTmFtZXNwYWNlU2V0dGluZyhPYmplY3Qga2V5LCBTdHJpbmcgdmFsdWUsIE1hcCByZXN1bHQpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZWxzZSBpZiAoa2V5ID09IG51bGwpCisgICAgICAgICAgICByZXN1bHQucHV0KCIiLCB2YWx1ZSk7CisgICAgICAgIGVsc2UgaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZyAmJiAiIyNhbnkiLmVxdWFscyhrZXkpKQorICAgICAgICAgICAgcmVzdWx0LnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgZWxzZSBpZiAoa2V5IGluc3RhbmNlb2YgTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChMaXN0KWtleSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIiMjbG9jYWwiLmVxdWFscyh1cmkpKQorICAgICAgICAgICAgICAgICAgICB1cmkgPSAiIjsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KHVyaSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWNvcmROYW1lc3BhY2VQcmVmaXhTZXR0aW5nKExpc3QgbGlzdCwgU3RyaW5nIHZhbHVlLCBNYXAgcmVzdWx0KQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGVsc2UgaWYgKGxpc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQucHV0KGkubmV4dCgpLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVjb3JkRXh0ZW5zaW9uU2V0dGluZyhFeHRlbnNpb25jb25maWcgZXh0KQorICAgIHsKKyAgICAgICAgTmFtZVNldCB4YmVhblNldCA9IG51bGw7CisgICAgICAgIE9iamVjdCBrZXkgPSBleHQuZ2V0Rm9yKCk7CisKKworICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nICYmICIqIi5lcXVhbHMoa2V5KSkKKyAgICAgICAgICAgIHhiZWFuU2V0ID0gTmFtZVNldC5FVkVSWVRISU5HOworICAgICAgICBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBMaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lU2V0QnVpbGRlciB4YmVhblNldEJ1aWxkZXIgPSBuZXcgTmFtZVNldEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoTGlzdClrZXkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHhiZWFuTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgeGJlYW5TZXRCdWlsZGVyLmFkZCh4YmVhbk5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeGJlYW5TZXQgPSB4YmVhblNldEJ1aWxkZXIudG9OYW1lU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoeGJlYW5TZXQ9PW51bGwpCisgICAgICAgICAgICBlcnJvcigiSW52YWxpZCB2YWx1ZSBvZiBhdHRyaWJ1dGUgJ2ZvcicgOiAnIiArIGtleSArICInLiIsIGV4dCk7CisKKyAgICAgICAgRXh0ZW5zaW9uY29uZmlnLkludGVyZmFjZVtdIGludGZYTyA9IGV4dC5nZXRJbnRlcmZhY2VBcnJheSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZlhPLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBfZXh0ZW5zaW9uSG9sZGVyLmFkZEludGVyZmFjZUV4dGVuc2lvbihJbnRlcmZhY2VFeHRlbnNpb24ubmV3SW5zdGFuY2UoeGJlYW5TZXQsIGludGZYT1tpXSkpOworICAgICAgICB9CisKKyAgICAgICAgX2V4dGVuc2lvbkhvbGRlci5hZGRQcmVQb3N0RXh0ZW5zaW9uKFByZVBvc3RFeHRlbnNpb24ubmV3SW5zdGFuY2UoeGJlYW5TZXQsIGV4dC5nZXRQcmVQb3N0U2V0KCkpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3RyaW5nIGxvb2t1cChNYXAgbWFwLCBNYXAgbWFwQnlVcmlQcmVmaXgsIFN0cmluZyB1cmkpCisgICAgeworICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICB1cmkgPSAiIjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpbWFwLmdldCh1cmkpOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAobWFwQnlVcmlQcmVmaXggIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gbG9va3VwQnlVcmlQcmVmaXgobWFwQnlVcmlQcmVmaXgsIHVyaSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoU3RyaW5nKW1hcC5nZXQoIiMjYW55Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9va3VwQnlVcmlQcmVmaXgoTWFwIG1hcEJ5VXJpUHJlZml4LCBTdHJpbmcgdXJpKQorICAgIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghbWFwQnlVcmlQcmVmaXguaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdXJpcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtYXBCeVVyaVByZWZpeC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0cHJlZml4ID0gKFN0cmluZylpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodXJpcHJlZml4ICE9IG51bGwgJiYgbmV4dHByZWZpeC5sZW5ndGgoKSA8IHVyaXByZWZpeC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKG5leHRwcmVmaXgpKQorICAgICAgICAgICAgICAgICAgICB1cmlwcmVmaXggPSBuZXh0cHJlZml4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXJpcHJlZml4ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbWFwQnlVcmlQcmVmaXguZ2V0KHVyaXByZWZpeCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy9wYWNrYWdlIG1ldGhvZHMKKyAgICBzdGF0aWMgdm9pZCB3YXJuaW5nKFN0cmluZyBzLCBYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IocywgWG1sRXJyb3IuU0VWRVJJVFlfV0FSTklORywgeG8pOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBzLCBYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICBTdHNjU3RhdGUuZ2V0KCkuZXJyb3IocywgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IsIHhvKTsKKyAgICB9CisKKyAgICAvL3B1YmxpYyBtZXRob2RzCisgICAgcHVibGljIFN0cmluZyBsb29rdXBQYWNrYWdlRm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gbG9va3VwKF9wYWNrYWdlTWFwLCBfcGFja2FnZU1hcEJ5VXJpUHJlZml4LCB1cmkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4Rm9yTmFtZXNwYWNlKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gbG9va3VwKF9wcmVmaXhNYXAsIF9wcmVmaXhNYXBCeVVyaVByZWZpeCwgdXJpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cFN1ZmZpeEZvck5hbWVzcGFjZShTdHJpbmcgdXJpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cChfc3VmZml4TWFwLCBfc3VmZml4TWFwQnlVcmlQcmVmaXgsIHVyaSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBsb29rdXBKYXZhbmFtZUZvclFOYW1lKFFOYW1lIHFuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpX3FuYW1lTWFwLmdldChxbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIEV4dGVuc2lvbkhvbGRlciBleHRlbnNpb25Ib2xkZXJGb3IoU3RyaW5nIGZ1bGxKYXZhTmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBfZXh0ZW5zaW9uSG9sZGVyLmV4dGVuc2lvbkhvbGRlckZvcihmdWxsSmF2YU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBFeHRlbnNpb25Ib2xkZXIgZ2V0RXh0ZW5zaW9uSG9sZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfZXh0ZW5zaW9uSG9sZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQXR0cmlidXRlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMTc2M2YKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhdHRyaWJ1dGUKKyAqCisgKgorICogQHZlcnNpb24gMS4wCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGUKKyAqLworcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGUgeworICAvKioKKyAgICogR2V0IHRoZSBYTUxOYW1lIG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4KKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZQorICAgKi8KKyAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSgpOworCisgIC8qKgorICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7CisKKyAgLyoqCisgICAqIEdldCB0aGUgYXR0cmlidXRlIHR5cGUgb2YgdGhlIGN1cnJlbnQgYXR0cmlidXRlCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKKworICAvKioKKyAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdHlwZSBvZiB0aGUgY3VycmVudCBhdHRyaWJ1dGUKKyAgICovCisgIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQXR0cmlidXRlSXRlcmF0b3IuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQXR0cmlidXRlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZTM5M2YyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9BdHRyaWJ1dGVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBzcGVjaWZpZXMgbWV0aG9kcyBmb3IgaXRlcmF0aW5nIG92ZXIgYXR0cmlidXRlcy4KKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZQorKi8KKworcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVJdGVyYXRvciB7CisgIC8qKgorICAgKiBHZXQgdGhlIG5leHQgQXR0cmlidXRlIG9uIHRoZSBzdHJlYW0KKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlCisgICAqLworICBwdWJsaWMgQXR0cmlidXRlIG5leHQoKTsKKworICAvKioKKyAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBhdHRyaWJ1dGVzIG9uIHRoZSBzdHJlYW0KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0cmVhbSB3aXRob3V0IHNoaWZ0aW5nIGl0CisgICAqLworICBwdWJsaWMgQXR0cmlidXRlIHBlZWsoKTsKKworCisgIC8qKgorICAgKiBTa2lwIHRoZSBuZXh0IGVsZW1lbnQgb24gdGhlIHN0cmVhbQorICAgKi8KKyAgcHVibGljIHZvaWQgc2tpcCgpOworfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQnVmZmVyZWRYTUxJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxYmY5YmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0J1ZmZlcmVkWE1MSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworLyoqCisgKiBFeHRlbmRzIHRoZSBYTUxJbnB1dFN0cmVhbSB0byBhbGxvdyBtYXJraW5nIGFuZCByZXNldGluZyBvZiB0aGUgc3RyZWFtLgorICoKKyAqIEBzaW5jZSBYTUxJbnB1dFN0cmVhbSAxLjAKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWUKKyAqLworcHVibGljIGludGVyZmFjZSBCdWZmZXJlZFhNTElucHV0U3RyZWFtIGV4dGVuZHMgWE1MSW5wdXRTdHJlYW0geworICAvKioKKyAgICogU2V0cyB0aGUgbWFya3MgYSBwb2ludCB0byByZXR1cm4gdG8gaW4gdGhlIHN0cmVhbSwKKyAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgbWFyay4KKyAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBCdWZmZXJlZFN0cmVhbXMKKyAgICovCisgIHB1YmxpYyB2b2lkIG1hcmsoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworICAvKioKKyAgICogUmVzZXRzIHRoZSBzdHJlYW0gdG8gdGhlIHByZXZpb3VzIG1hcmsuCisgICAqIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcms7CisgICAqLworICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFuZ2VQcmVmaXhNYXBwaW5nLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0NoYW5nZVByZWZpeE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTY0Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9DaGFuZ2VQcmVmaXhNYXBwaW5nLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqIFRoaXMgZXZlbnQgc2lnbmFscyB0aGF0IGEgcHJlZml4IG1hcHBpbmcgaGFzIGNoYW5nZWQgZnJvbQorICogT2xkTmFtZXNwYWNlTmFtZSB0byB0aGUgTmV3TmFtZXNwYWNlTmFtZQorICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0UHJlZml4TWFwcGluZworICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kUHJlZml4TWFwcGluZworICovCitwdWJsaWMgaW50ZXJmYWNlIENoYW5nZVByZWZpeE1hcHBpbmcgZXh0ZW5kcyBYTUxFdmVudCB7CisgIC8qCisgICAqIHJldHVybnMgdGhlIHVyaSB0aGF0IHRoZSBwcmVmaXggd2FzIGJvdW5kIHRvCisgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSB1cmkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkTmFtZXNwYWNlVXJpKCk7CisgIC8qCisgICAqIHJldHVybnMgdGhlIG5ldyB1cmkgdGhhdCB0aGUgcHJlZml4IGlzIGJvdW5kIHRvCisgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSB1cmkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZXNwYWNlVXJpKCk7CisgIC8qCisgICAqIHJldHVybnMgdGhlIHByZWZpeCB0aGF0IGlzIGJvdW5kCisgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBwcmVmaXgKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0NoYXJhY3RlckRhdGEuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ2hhcmFjdGVyRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiZTk1NTYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0NoYXJhY3RlckRhdGEuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07CisKKy8qKgorICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciBjaGFyYWN0ZXIgZGF0YQorICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50CisqLworcHVibGljIGludGVyZmFjZSBDaGFyYWN0ZXJEYXRhIGV4dGVuZHMgWE1MRXZlbnQgeworICAvKioKKyAgICogR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCwKKyAgICogcmV0dXJucyBudWxsIGlmIHRoZSBlbGVtZW50IGhhcyBubyBjb250ZW50CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKTsKKworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29udGVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCk7CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ29tbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9Db21tZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTliMzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vQ29tbWVudC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIGNvbW1lbnQgZGF0YQorICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50CisqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbW1lbnQgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhIHsKKyAgLyoqCisgICAqIE5vIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuCisgICAqLworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VsZW1lbnRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTc5YTVjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbGVtZW50RmlsdGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqCisgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgZmlsdGVyIG9uIGVsZW1lbnRzCisgKi8KKworcHVibGljIGludGVyZmFjZSBFbGVtZW50RmlsdGVyIHsKKyAgLyoqCisgICAqIHRlc3RzIHdoZXRoZXIgdGhpcyBldmVudCBpcyBwYXJ0IG9mIHRoaXMgc3RyZWFtIAorICAgKi8KKyAgYm9vbGVhbiBhY2NlcHQoWE1MRXZlbnQgZWxlbWVudCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VuZERvY3VtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQwNDAyYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRG9jdW1lbnQuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07CisKKy8qKgorICogQSBtYXJrZXIgaW50ZXJmYWNlIGZvciB0aGUgZW5kIG9mIGEgZG9jdW1lbnQKKyAqCisgKgorICogQHZlcnNpb24gMS4wCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAorKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW5kRG9jdW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7CisgIC8qKgorICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgorICAgKi8KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhlN2NhZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vRW5kRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHRoZSBlbmQgZWxlbWVudCBldmVudC4KKyAqIFRoZSBuYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgZ2V0TmFtZSBtZXRob2Qgb2YKKyAqIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudCBpbnRlcmZhY2UuCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQKKyovCitwdWJsaWMgaW50ZXJmYWNlIEVuZEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7CisgIC8qKgorICAgKiBObyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLiAgCisgICAqLworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRQcmVmaXhNYXBwaW5nLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VuZFByZWZpeE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDRlYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbmRQcmVmaXhNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqIFRoaXMgZXZlbnQgc2lnbmFscyB0aGF0IGEgcHJlZml4IG1hcHBpbmcgaGFzIGdvbmUgb3V0IG9mIHNjb3BlCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFuZ2VQcmVmaXhNYXBwaW5nCisgKi8KKworcHVibGljIGludGVyZmFjZSBFbmRQcmVmaXhNYXBwaW5nIGV4dGVuZHMgWE1MRXZlbnQgeworICAvKiAKKyAgICogUmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaGFzIGdvbmUgb3V0IG9mIHNjb3BlCisgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBwcmVmaXgKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0VudGl0eVJlZmVyZW5jZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMmMwYzEzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9FbnRpdHlSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07CisKKy8qKgorICogQW4gaW50ZXJmYWNlIGZvciBoYW5kbGluZyBFbnRpdHkgRGVjbGFyYXRpb25zCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgWE1MRXZlbnQgeworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50aXR5IHdhcyBza2lwcGVkCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBza2lwcGVkKCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0xvY2F0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL0xvY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTgzY2VhOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vTG9jYXRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW07CisKKy8qKgorICogUmV0dXJucyB0aGUgZG9jdW1lbnQgbG9jYXRpb24gb2YgdGhlIGV2ZW50LiAgVGhpcyBpcyBub3QKKyAqIHJlcXVpcmVkIHRvIGJlIGV4YWN0IGFuZCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuCisgKiAKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9jYXRpb24geworICAvKgorICAgKiByZXR1cm5zIHRoZSBjdXJyZW50IGNvbHVtbiBudW1iZXIKKyAgICoKKyAgICogQHJldHVybiBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNvbHVtbiBudW1iZXIKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCk7IAorICAvKgorICAgKiByZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUKKyAgICoKKyAgICogQHJldHVybiBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyCisgICAqLworICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKTsKKyAgLyoKKyAgICogcmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlIG9mIHRoZSBwdWJsaWMgSUQKKyAgICoKKyAgICogQHJldHVybiBwdWJsaWMgSUQgb3IgbnVsbCBpZiBub3Qgc2V0CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCk7IAorICAvKgorICAgKiByZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHN5c3RlbSBJRAorICAgKgorICAgKiBAcmV0dXJuIHN5c3RlbSBJRCBvciBudWxsIGlmIG5vdCBzZXQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKTsKK30KKworCisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0YmE4YzkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBBIG1hcmtlciBpbnRlcmZhY2UgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQKKyovCitwdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBleHRlbmRzIFhNTEV2ZW50IHsKKyAgLyoKKyAgICogdGhlIHRhcmdldCBzZWN0aW9uIG9mIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCisgICAqCisgICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgUEkgb3IgbnVsbAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKTsKKyAgLyoKKyAgICogdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIFBJJ3MgZGF0YSBvciBudWxsCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vUmVmZXJlbmNlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjA3MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9SZWZlcmVuY2VSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gYWxsb3cgcmVzb2x1dGlvbiBvZiByZWZlcmVuY2VzCisgKiBvbiBhIHN0cmVhbS4gIAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZVJlc29sdmVyIHsKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHhtbCBwb2ludGVkIHRvIGJ5IHRoaXMgaWRyZWYgYXMgYW4gWE1MSW5wdXRTdHJlYW0KKyAgICogQHBhcmFtIGlkcmVmCisgICAqLworICBYTUxJbnB1dFN0cmVhbSByZXNvbHZlKFN0cmluZyBpZHJlZikKKyAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBpZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgaWRyZWYKKyAgICogQHBhcmFtIGlkcmVmCisgICAqLworICBTdHJpbmcgZ2V0SWQoU3RyaW5nIGlkcmVmKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3BhY2UuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3BhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMDAzMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TcGFjZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBUaGlzIGVsZW1lbnQgcmV0dXJucyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gYWxsb3cgc2VwYXJhdGUKKyAqIGhhbmRsaW5nIGJ5IHRoZSBhcHBsaWNhdGlvbgorICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGludGVyZmFjZSBTcGFjZSBleHRlbmRzIENoYXJhY3RlckRhdGEgeworICAvKioKKyAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgaWdub3JhYmxlIHdoaXRlc3BhY2UKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlnbm9yYWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydERvY3VtZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1N0YXJ0RG9jdW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzIwNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydERvY3VtZW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqIEFuIGludGVyZmFjZSBmb3IgdGhlIHN0YXJ0IGRvY3VtZW50IGV2ZW50CisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQKKyovCitwdWJsaWMgaW50ZXJmYWNlIFN0YXJ0RG9jdW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7CisgIC8qIAorICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIHN0cmVhbQorICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gaWQsIGRlZmF1bHRzIHRvICIiCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7CisgIC8qIAorICAgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyBzdHlsZSBvZiB0aGlzIFhNTCBzdHJlYW0KKyAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLCBkZWZhdWx0cyB0byAiVVRGLTgiCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7CisgIC8qIAorICAgKiBSZXR1cm5zIGlmIHRoaXMgWE1MIGlzIHN0YW5kYWxvbmUKKyAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiBYTUwsIGRlZmF1bHRzIHRvICJ5ZXMiCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKTsKKyAgLyogCisgICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgWE1MIG9mIHRoaXMgWE1MIHN0cmVhbQorICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIFhNTCwgZGVmYXVsdHMgdG8gIjEuMCIKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydEVsZW1lbnQuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWU3MjU2OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnRFbGVtZW50LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKy8qKgorICogVGhlIFN0YXJ0RWxlbWVudCBpbnRlcmZhY2UgcHJvdmlkZXMgYWNjZXNzIHRvIGluZm9ybWF0aW9uIGFib3V0CisgKiBzdGFydCBlbGVtZW50cworICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yCisgKi8KKworcHVibGljIGludGVyZmFjZSBTdGFydEVsZW1lbnQgZXh0ZW5kcyBYTUxFdmVudCB7CisgIC8qKgorICAgKiBSZXR1cm5zIGFuIEF0dHJpYnV0ZUl0ZXJhdG9yIG9mIG5vbi1uYW1lc3BhY2UgZGVjbGFyZWQgYXR0cmlidXRlcworICAgKi8KKyAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldEF0dHJpYnV0ZXMoKTsKKyAgLyoqCisgICAqIFJldHVybnMgYW4gQXR0cmlidXRlSXRlcmF0b3Igb2YgbmFtZXNwYWNlcyBkZWNsYXJlZCBpbiB0aGlzIGVsZW1lbnQKKyAgICovCisgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXROYW1lc3BhY2VzKCk7CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBkZWNsYXJlZCBhdHRyaWJ1dGVzIGFuZCBuYW1lc3BhY2VzCisgICAqLworICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSByZWZlcnJlZCB0byBieSB0aGlzIG5hbWUKKyAgICovCisgIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlOYW1lKFhNTE5hbWUgbmFtZSk7CisgIC8qKgorICAgKiBHZXRzIHRoZSB2YWx1ZSB0aGF0IHRoZSBwcmVmaXggaXMgYm91bmQgdG8gaW4gdGhlCisgICAqIGNvbnRleHQgb2YgdGhpcyBlbGVtZW50LiAgUmV0dXJucyBudWxsIGlmIAorICAgKiB0aGUgcHJlZml4IGlzIG5vdCBib3VuZCBpbiB0aGlzIGNvbnRleHQKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKFN0cmluZyBwcmVmaXgpOworICAvKioKKyAgICogR2V0cyBhIGphdmEudXRpbC5NYXAgZnJvbSBwcmVmaXhlcyB0byBVUklzIGluIHNjb3BlIGZvciB0aGlzCisgICAqIGVsZW1lbnQuCisgICAqLworICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9TdGFydFByZWZpeE1hcHBpbmcuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnRQcmVmaXhNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmYzNjg3MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vU3RhcnRQcmVmaXhNYXBwaW5nLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqIFRoaXMgZXZlbnQgc2lnbmFscyB0aGF0IGEgcHJlZml4IG1hcHBpbmcgaGFzIGJlZ3VuIHNjb3BlCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kUHJlZml4TWFwcGluZworICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZworICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU3RhcnRQcmVmaXhNYXBwaW5nIGV4dGVuZHMgWE1MRXZlbnQgeworICAvKiAKKyAgICogUmV0dXJucyB0aGUgdXJpIG9mIHRoZSBwcmVmaXggdGhhdCBpcyBpbiBzY29wZSBmb3IgdGhlIGZvbGxvd2luZyAKKyAgICogZWxlbWVudAorICAgKiBAcmV0dXJuIFN0cmluZyB2YWx1ZSBvZiB0aGUgdXJpCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSgpOworICAvKiAKKyAgICogUmV0dXJucyB0aGUgcHJlZml4IHRoYXQgaXMgbm93IGluIHNjb3BlCisgICAqIEByZXR1cm4gU3RyaW5nIHZhbHVlIG9mIHRoZSBwcmVmaXgKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTEV2ZW50LmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTgxODYyMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MRXZlbnQuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgZWxlbWVudCBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIG1hcmt1cCBldmVudHMuCisgKgorICoKKyAqIEB2ZXJzaW9uIDEuMAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkNoYXJhY3RlckRhdGEKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWUKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFhNTEV2ZW50IHsKKyAgLyoqCisgICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBYTUxFdmVudAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UPTB4MDAwMDAwMDE7CisgIC8qKgorICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBTdGFydEVsZW1lbnQKKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UPTB4MDAwMDAwMDI7CisgIC8qKgorICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gRW5kRWxlbWVudAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRFbGVtZW50CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfRUxFTUVOVD0weDAwMDAwMDA0OworICAvKioKKyAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgUHJvY2Vzc2luZ0luc3RydWN0aW9uCisgICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTj0weDAwMDAwMDA4OworICAvKioKKyAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgQ2hhcmFjdGVyRGF0YSBFdmVudAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSQUNURVJfREFUQT0weDAwMDAwMDEwOworICAvKioKKyAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgQ29tbWVudAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Db21tZW50CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UPTB4MDAwMDAwMjA7CisgIC8qKgorICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBTcGFjZQorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TcGFjZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0U9MHgwMDAwMDA0MDsKKyAgLyoqCisgICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIE51bGxFbGVtZW50CisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVUxMX0VMRU1FTlQ9MHgwMDAwMDA4MDsKKyAgLyoqCisgICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIFN0YXJ0RG9jdW1lbnQKKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRE9DVU1FTlQ9MHgwMDAwMDEwMDsKKyAgLyoqCisgICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhbiBFbmREb2N1bWVudAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmREb2N1bWVudAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0RPQ1VNRU5UPTB4MDAwMDAyMDA7CisgIC8qKgorICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYSBTdGFydFByZWZpeE1hcHBpbmcKKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9QUkVGSVhfTUFQUElORz0weDAwMDAwNDAwOworICAvKioKKyAgICogQSBjb25zdGFudCB3aGljaCBpZGVudGlmaWVzIGEgRW5kUHJlZml4TWFwcGluZworICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbmRQcmVmaXhNYXBwaW5nCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkRfUFJFRklYX01BUFBJTkc9MHgwMDAwMDgwMDsKKyAgLyoqCisgICAqIEEgY29uc3RhbnQgd2hpY2ggaWRlbnRpZmllcyBhIENoYW5nZVByZWZpeE1hcHBpbmcKKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZworICAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRUZJWF9NQVBQSU5HPTB4MDAwMDEwMDA7CisgIC8qKgorICAgKiBBIGNvbnN0YW50IHdoaWNoIGlkZW50aWZpZXMgYW4gRW50aXR5UmVmZXJlbmNlIAorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5FbnRpdHlSZWZlcmVuY2UKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRUZFUkVOQ0U9MHgwMDAwMjAwMDsKKyAgLyoqCisgICAqIEdldCB0aGUgZXZlbnQgdHlwZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LAorICAgKiByZXR1cm5zIGFuIGludGVnZXIgc28gdGhhdCBzd2l0Y2ggc3RhdGVtZW50cworICAgKiBjYW4gYmUgd3JpdHRlbiBvbiB0aGUgcmVzdWx0CisgICAqLworICBwdWJsaWMgaW50IGdldFR5cGUoKTsKKyAgLyoqCisgICAqIEdldCB0aGUgZXZlbnQgdHlwZSBvZiB0aGUgY3VycmVudCBlbGVtZW50LAorICAgKiByZXR1cm5zIGFuIGludGVnZXIgc28gdGhhdCBzd2l0Y2ggc3RhdGVtZW50cworICAgKiBjYW4gYmUgd3JpdHRlbiBvbiB0aGUgcmVzdWx0CisgICAqLworICBwdWJsaWMgWE1MTmFtZSBnZXRTY2hlbWFUeXBlKCk7CisgIC8qKgorICAgKiBHZXQgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgdHlwZSBuYW1lCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBc1N0cmluZygpOworICAvKioKKyAgICogR2V0IHRoZSBYTUxOYW1lIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZQorICAgKi8KKyAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSgpOworCisgIC8qKgorICAgKiBDaGVjayBpZiB0aGlzIEVsZW1lbnQgaGFzIGEgbmFtZQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpOworCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoaXMgRWxlbWVudAorICAgKi8KKyAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCk7CisKKyAgLyoqCisgICAqIE1ldGhvZCBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzIHR5cGUKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCk7CisgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpOworICBwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZSgpOworICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0UHJlZml4TWFwcGluZygpOworICBwdWJsaWMgYm9vbGVhbiBpc0VuZFByZWZpeE1hcHBpbmcoKTsKKyAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VQcmVmaXhNYXBwaW5nKCk7CisgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0luc3RydWN0aW9uKCk7CisgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVyRGF0YSgpOworICBwdWJsaWMgYm9vbGVhbiBpc1NwYWNlKCk7CisgIHB1YmxpYyBib29sZWFuIGlzTnVsbCgpOworICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RG9jdW1lbnQoKTsKKyAgcHVibGljIGJvb2xlYW4gaXNFbmREb2N1bWVudCgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxJbnB1dFN0cmVhbS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiYzIwOTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL1hNTElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKgorICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIGludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgWE1MIEV2ZW50cworICogaW4gYW4gWE1MIGRvY3VtZW50LgorICoKKyAqIDxwPiBEaWZmZXJlbmNlIGZyb20gU0FYIDwvcD4KKyAqIDxwPiBBbiBldmVudCBzdHJlYW0gY2FuIGJlIHRob3VnaHQgb2YgZW5jYXBzdWxhdGluZyBTQVgKKyAqIGV2ZW50cy4gSXQgYXBwbGllcyBhbiBpdGVyYXRvci9wdWxsIG1ldGFwaG9yIHRvIHRoZSBwYXJzZXIgCisgKiBhbGxvd2luZyBwcm9jZWR1cmFsLCBzdHJlYW0tYmFzZWQsIGhhbmRsaW5nIG9mIGlucHV0IFhNTCByYXRoZXIgdGhhbgorICogaGF2aW5nIHRvIHdyaXRlIGNoYWluZWQgZXZlbnQgaGFuZGxlcnMgdG8gaGFuZGxlIGNvbXBsZXggWE1MCisgKiBkb2N1bWVudHMuCisgKiA8cD4gRGlmZmVyZW5jZSBmcm9tIERPTSA8L3A+CisgKiA8cD5UaGUgcHVsbCBtZXRhcGhvciBhbGxvd3Mgc2luZ2xlLXBhc3MsIHN0cmVhbS1iYXNlZCAgcGFyc2luZyBvZiB0aGUgZG9jdW1lbnQgcmF0aGVyCisgKiB0aGFuIHRyZWUgYmFzZWQgbWFuaXB1bGF0aW9uLjwvcD4KKyAqCisgKiBAc2luY2UgWE1MSW5wdXRTdHJlYW0gMS4wCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50CisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRWxlbWVudAorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YQorICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZQorICovCisKKy8vIFJFVklFVyBwZGFwa3VzQGJlYS5jb20gMjAwMi1TZXAtMTMgLS0gd2hpbGUgSSBsaWtlIHRoZSBjb252ZW5pZW5jZQorLy8gb2YgbWFueSBvZiB0aGVzZSBtZXRob2RzLCBpdCBzdHJpa2VzIG1lIHRoYXQgbWFueSBvZiB0aGVzZSBtZXRob2RzCisvLyBjb3VsZCBpbXBsZW1lbnRlZCBhcyBzdGF0aWMgbWV0aG9kcyBpbiBhIHV0aWxpdHkgY2xhc3MuICB0aGUgZG93bgorLy8gc2lkZSB0byBoYXZpbmcgdGhlbSBpbiB0aGlzIGJhc2UgaW50ZXJmYWNlIGlzIHRoYXQgaXQgbWFrZXMgdGhlCisvLyBjb250cmFjdCBmb3IgaW1wbGVtZW50ZXJzIHVubmVjZXNzYXJpbHkgc3RlYXAgYW5kIHJlc3VsdHMgaW4KKy8vIGR1cGxpY2F0ZWQgY29kZSBpbiBtZXRob2RzIHRoYXQgY2FuJ3QgZXh0ZW5kIG9uZSBvZiB0aGUgY29tbW9uIGJhc2UKKy8vIGNsYXNzZXMuICAKKworcHVibGljIGludGVyZmFjZSBYTUxJbnB1dFN0cmVhbSB7CisgIC8qKgorICAgKiBHZXQgdGhlIG5leHQgWE1MRXZlbnQgb24gdGhlIHN0cmVhbQorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAorICAgKi8KKyAgcHVibGljIFhNTEV2ZW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworICAvKioKKyAgICogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZXZlbnRzIHRvIHB1bGwgb2YgdGhlIHN0cmVhbQorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisgIC8qKgorICAgKiBTa2lwIHRoZSBuZXh0IHN0cmVhbSBldmVudAorICAgKi8KKyAgcHVibGljIHZvaWQgc2tpcCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisgIC8qKgorICAgKiBTa2lwcyB0aGUgZW50aXJlIG5leHQgc3RhcnQgdGFnIC8gZW5kIHRhZyBwYWlyLgorICAgKi8KKyAgcHVibGljIHZvaWQgc2tpcEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworICAvKioKKyAgICogQ2hlY2sgdGhlIG5leHQgWE1MRXZlbnQgd2l0aG91dCByZWFkaW5nIGl0IGZyb20gdGhlIHN0cmVhbS4KKyAgICogUmV0dXJucyBudWxsIGlmIHRoZSBzdHJlYW0gaXMgYXQgRU9GIG9yIGhhcyBubyBtb3JlIFhNTEV2ZW50cy4KKyAgICogQHNlZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQKKyAgICovCisgIHB1YmxpYyBYTUxFdmVudCBwZWVrKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKyAgLyoqCisgICAqIFBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIG5leHQgWE1MRXZlbnQgb2YgdGhpcyB0eXBlLiAgVGhlIG1ldGhvZAorICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBjb250YWlucyBhbm90aGVyIFhNTEV2ZW50IG9mIHRoaXMgdHlwZQorICAgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAcGFyYW0gZXZlbnRUeXBlIEFuIGludGVnZXIgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZWxlbWVudCB0eXBlLgorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudAorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gc2tpcChpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworICAvKioKKyAgICogUG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgbmFtZS4gIFRoZSBtZXRob2QKKyAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gY29udGFpbnMgYW5vdGhlciBlbGVtZW50IHdpdGggdGhpcyBuYW1lCisgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuICBTa2lwIGlzIGEgZm9yd2FyZCBvcGVyYXRvciBvbmx5LiAgSXQgZG9lcworICAgKiBub3QgbG9vayBiYWNrd2FyZCBpbiB0aGUgc3RyZWFtLgorICAgKiBAcGFyYW0gbmFtZSBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIFhNTCBuYW1lLgorICAgKiBJZiB0aGUgWE1MTmFtZS5nZXROYW1lU3BhY2VOYW1lKCkgbWV0aG9kIG9uIHRoZSBYTUxOYW1lIGFyZ3VtZW50IHJldHVybnMKKyAgICogbnVsbCB0aGUgWE1MTmFtZSB3aWxsIG1hdGNoIGp1c3QgdGhlIGxvY2FsIG5hbWUuICBQcmVmaXhlcyBhcmUKKyAgICogbm90IGNoZWNrZWQgZm9yIGVxdWFsaXR5LgorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxOYW1lCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBza2lwKFhNTE5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKyAgLyoqCisgICAqIFBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIG5hbWUgYW5kIHRoaXMgdHlwZS4KKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBjb250YWlucyBhbm90aGVyIGVsZW1lbnQgCisgICAqIHdpdGggdGhpcyBuYW1lIG9mIHRoaXMgdHlwZSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgCisgICAqIEBwYXJhbSBuYW1lIEFuIG9iamVjdCB0aGF0IGRlZmluZXMgYW4gWE1MIG5hbWUuCisgICAqIElmIHRoZSBYTUxOYW1lLmdldE5hbWVTcGFjZU5hbWUoKSBtZXRob2Qgb24gdGhlIFhNTE5hbWUgYXJndW1lbnQgcmV0dXJucworICAgKiBudWxsIHRoZSBYTUxOYW1lIHdpbGwgbWF0Y2gganVzdCB0aGUgbG9jYWwgbmFtZS4gIFByZWZpeGVzIGFyZQorICAgKiBub3QgY2hlY2tlZCBmb3IgZXF1YWxpdHkuCisgICAqIEBwYXJhbSBldmVudFR5cGUgQW4gaW50ZWdlciBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBlbGVtZW50IHR5cGUuCisgICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50CisgICAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWUKKyAgICovCisgIHB1YmxpYyBib29sZWFuIHNraXAoWE1MTmFtZSBuYW1lLCBpbnQgZXZlbnRUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworICAvKioKKyAgICogZ2V0U3ViU3RyZWFtKCkgcmV0dXJucyBhIHN0cmVhbSB3aGljaCBwb2ludHMgdG8gdGhlIGVudGlyZSBuZXh0IGVsZW1lbnQgaW4gdGhlCisgICAqIGN1cnJlbnQgc3RyZWFtLiAgRm9yIGV4YW1wbGU6IHRha2UgYSBkb2N1bWVudCB0aGF0IGhhcyBhIHJvb3Qgbm9kZSBBLCB3aGVyZSB0aGUgY2hpbGRyZW4KKyAgICogb2YgQSBhcmUgQiwgQywgYW5kIEQuIElmIHRoZSBzdHJlYW0gaXMgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgQSwgZ2V0U3ViU3RyZWFtKCkgd2lsbCByZXR1cm4gCisgICAqIEEsIEIsIEMgYW5kIEQgaW5jbHVkaW5nIHRoZSBzdGFydCBlbGVtZW50IG9mIEEgYW5kIHRoZSBlbmQgZWxlbWVudCBvZiBBLiAgVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXJlbnQKKyAgICogc3RyZWFtIGlzIG5vdCBjaGFuZ2VkIGFuZCB0aGUgZXZlbnRzIHJlYWQgYnkgdGhlIHN1YnN0cmVhbSBhcmUgd3JpdHRlbiBiYWNrIHRvIGl0cyBwYXJlbnQuICAgCisgICAqLworICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gZ2V0U3ViU3RyZWFtKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKyAgLyoqCisgICAqIENsb3NlcyB0aGlzIGlucHV0IHN0cmVhbSBhbmQgcmVsZWFzZXMgYW55IHN5c3RlbSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJlYW0uCisgICAqLworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZSByZXNvbHZlciB0aGF0IHdhcyBzZXQgZm9yIHRoaXMgc3RyZWFtLAorICAgKiByZXR1cm5zIG51bGwgaWYgbm8gUmVmZXJlbmNlUmVzb2x2ZXIgaGFzIGJlZW4gc2V0LgorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5SZWZlcmVuY2VSZXNvbHZlcgorICAgKi8KKyAgcHVibGljIFJlZmVyZW5jZVJlc29sdmVyIGdldFJlZmVyZW5jZVJlc29sdmVyKCk7CisgIC8qKgorICAgKiBQcm92aWRlcyBhIHdheSB0byBzZXQgdGhlIFJlZmVyZW5jZVJlc29sdmVyIG9mIHRoZSBzdHJlYW0sCisgICAqIHRoaXMgaXMgbW9zdGx5IG5lZWRlZCBmb3IgaGFuZGxlIHJlZmVyZW5jZXMgdG8gb3RoZXIgcGFydHMgb2YgdGhlCisgICAqIGRvY3VtZW50LgorICAgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5SZWZlcmVuY2VSZXNvbHZlcgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlUmVzb2x2ZXIoUmVmZXJlbmNlUmVzb2x2ZXIgcmVzb2x2ZXIpOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYzdkOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MTmFtZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFF1YWxpZmllZCBOYW1lIG9mIGFuIFhNTCBldmVudC4KKyAqCisgKgorICogQHZlcnNpb24gMS4wCisgKiBAc2VlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TdGFydEVsZW1lbnQKKyAqIEBzZWUgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTEV2ZW50CisgKi8KKworcHVibGljIGludGVyZmFjZSBYTUxOYW1lIHsKKyAgLyoKKyAgICogcmV0dXJucyB0aGUgdXJpIG9mIHRoZSBwcmVmaXggb2YgdGhpcyBuYW1lCisgICAqIAorICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHVyaSwgCisgICAqIGVtcHR5IHN0cmluZyBpZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgYm91bmQgdG8gZW1wdHkgc3RyaW5nIAorICAgKiBvciBudWxsIGlmIHRoZSBuYW1lIGRvZXMgbm90IGhhdmUgYSBuYW1lc3BhY2UKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpKCk7CisgIC8qCisgICAqIHJldHVybnMgdGhlIGxvY2FsbmFtZSBvZiB0aGUgeG1sIG5hbWUKKyAgICogCisgICAqIEByZXR1cm4gdGhlIGxvY2FsbmFtZSwgY2Fubm90IGJlIG51bGwKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCk7CisgIC8qCisgICAqIHJldHVybnMgdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUKKyAgICogCisgICAqIEByZXR1cm4gdGhlIHByZWZpeCBvZiB0aGUgeG1sIG5hbWUgb3IgbnVsbAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKTsKKworICAvKgorICAgKiByZXR1cm5zIHRoZSBwcmVmaXggb2YgdGhlIHhtbCBuYW1lICsgJzonICsgdGhlIGxvY2FsIG5hbWUKKyAgICogaWYgdGhlIHByZWZpeCBpcyBub3QgbnVsbAorICAgKiByZXR1cm5zIHRoZSBsb2NhbCBuYW1lIG90aGVyd2lzZQorICAgKiAKKyAgICogQHJldHVybiB0aGUgcHJlZml4IHBsdXMgdGhlIGxvY2FsIG5hbWUKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9YTUxTdHJlYW1FeGNlcHRpb24uamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmM3MTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vWE1MU3RyZWFtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLnV0aWxzLk5lc3RlZFRocm93YWJsZTsKKworLyoqCisgKiBUaGUgYmFzZSBleGNlcHRpb24gZm9yIHVuZXhwZWN0ZWQgaW5wdXQgZHVyaW5nIFhNTCBoYW5kbGluZworICoKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgY2xhc3MgWE1MU3RyZWFtRXhjZXB0aW9uIAorICBleHRlbmRzIElPRXhjZXB0aW9uIAorICBpbXBsZW1lbnRzIE5lc3RlZFRocm93YWJsZSAKK3sKKyAgcHJvdGVjdGVkIFRocm93YWJsZSB0aDsKKworICBwdWJsaWMgWE1MU3RyZWFtRXhjZXB0aW9uKCkge30KKworICBwdWJsaWMgWE1MU3RyZWFtRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsgCisgICAgc3VwZXIobXNnKTsgCisgIH0KKworICBwdWJsaWMgWE1MU3RyZWFtRXhjZXB0aW9uKFRocm93YWJsZSB0aCkgeworICAgIHRoaXMudGggPSB0aDsKKyAgICAKKyAgfQorCisgIHB1YmxpYyBYTUxTdHJlYW1FeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKSB7CisgICAgc3VwZXIobXNnKTsKKyAgICB0aGlzLnRoID0gdGg7CisgIH0KKworICAvKioKKyAgICogR2V0cyB0aGUgbmVzdGVkIGV4Y2VwdGlvbi4KKyAgICoKKyAgICogQHJldHVybiAgICAgICAgICAgICAgICAgTmVzdGVkIGV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFRocm93YWJsZSBnZXROZXN0ZWRFeGNlcHRpb24oKSB7CisgICAgcmV0dXJuIGdldE5lc3RlZCgpOworICB9CisKKyAgLy90cnkgdG8gZG8gc29tZXRpbmcgdXNlZnVsCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBTdHJpbmcgbXNnID0gc3VwZXIuZ2V0TWVzc2FnZSgpOworCisgICAgaWYgKG1zZyA9PSBudWxsICYmIHRoICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0aC5nZXRNZXNzYWdlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBtc2c7CisgICAgfQorICB9CisKKworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBOZXN0ZWRUaHJvd2FibGUgaW1wbGVtZW50YXRpb24uCisKKyAgLyoqCisgICAqIEdldHMgdGhlIG5lc3RlZCBUaHJvd2FibGUuCisgICAqCisgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgIE5lc3RlZCBleGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBUaHJvd2FibGUgZ2V0TmVzdGVkKCkgeworICAgIHJldHVybiB0aDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgc3VwZXJUb1N0cmluZygpIHsKKyAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHBzKSB7CisgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHBzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHB3KSB7CisgICAgc3VwZXIucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgfQorCisgIC8vIEVuZCBOZXN0ZWRUaHJvd2FibGUgaW1wbGVtZW50YXRpb24uCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgLyoqCisgICAqIFByaW50cyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIGl0cyBuZXN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAqCisgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBOZXN0ZWRUaHJvd2FibGUuVXRpbC50b1N0cmluZyh0aGlzKTsKKyAgfQorCisgIC8qKgorICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbiBhbmQKKyAgICogaXRzIG5lc3RlZCBleGNlcHRpb24uCisgICAqCisgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQorICAgKi8KKyAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsgCisgICAgTmVzdGVkVGhyb3dhYmxlLlV0aWwucHJpbnRTdGFja1RyYWNlKHRoaXMsIHMpOworICB9CisKKyAgLyoqCisgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAorICAgKiBpdHMgbmVzdGVkIGV4Y2VwdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHMgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtCisgICAqLworICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgdykgeyAKKyAgICBOZXN0ZWRUaHJvd2FibGUuVXRpbC5wcmludFN0YWNrVHJhY2UodGhpcywgdyk7CisgIH0KKworICAvKioKKyAgICogUHJpbnRzIHRoZSBzdGFjayB0cmFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24gYW5kCisgICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCisgICAqCisgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBQcmludFN0cmVhbQorICAgKi8KKyAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKCkgeworICAgIHByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vZXZlbnRzL0VsZW1lbnRUeXBlTmFtZXMuamF2YSBiL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vZXZlbnRzL0VsZW1lbnRUeXBlTmFtZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDY1NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbGlucHV0c3RyZWFtL29yZy9hcGFjaGUveG1sYmVhbnMveG1sL3N0cmVhbS9ldmVudHMvRWxlbWVudFR5cGVOYW1lcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5ldmVudHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBFbGVtZW50VHlwZU5hbWVzIHsKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShpbnQgdmFsKSB7IAorICAgIHN3aXRjaCh2YWwpIHsKKyAgICBjYXNlIFhNTEV2ZW50LlhNTF9FVkVOVDogcmV0dXJuICgiWE1MX0VWRU5UIik7CisgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UOiByZXR1cm4gKCJTVEFSVF9FTEVNRU5UIik7CisgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVDogcmV0dXJuICgiRU5EX0VMRU1FTlQiKTsKKyAgICBjYXNlIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT046IHJldHVybiAoIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iKTsKKyAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBOiByZXR1cm4gKCJDSEFSQUNURVJfREFUQSIpOworICAgIGNhc2UgWE1MRXZlbnQuQ09NTUVOVDogcmV0dXJuICgiQ09NTUVOVCIpOworICAgIGNhc2UgWE1MRXZlbnQuU1BBQ0U6IHJldHVybiAoIlNQQUNFIik7CisgICAgY2FzZSBYTUxFdmVudC5OVUxMX0VMRU1FTlQ6IHJldHVybiAoIk5VTExfRUxFTUVOVCIpOworICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfRE9DVU1FTlQ6IHJldHVybiAoIlNUQVJUX0RPQ1VNRU5UIik7CisgICAgY2FzZSBYTUxFdmVudC5FTkRfRE9DVU1FTlQ6IHJldHVybiAoIkVORF9ET0NVTUVOVCIpOworICAgIGNhc2UgWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkc6IHJldHVybiAoIlNUQVJUX1BSRUZJWF9NQVBQSU5HIik7CisgICAgY2FzZSBYTUxFdmVudC5DSEFOR0VfUFJFRklYX01BUFBJTkc6IHJldHVybiAoIkNIQU5HRV9QUkVGSVhfTUFQUElORyIpOworICAgIGNhc2UgWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HOiByZXR1cm4gKCJFTkRfUFJFRklYX01BUFBJTkciKTsKKyAgICBjYXNlIFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0U6IHJldHVybiAoIkVOVElUWV9SRUZFUkVOQ0UiKTsKKyAgICBkZWZhdWx0OiByZXR1cm4gIiI7CisgICAgfQorICB9CisgIHB1YmxpYyBzdGF0aWMgaW50IGdldFR5cGUoU3RyaW5nIHZhbCkgeworICAgIGlmICh2YWwuZXF1YWxzKCJYTUxfRVZFTlQiKSkgCisgICAgICByZXR1cm4gWE1MRXZlbnQuWE1MX0VWRU5UOworICAgIGlmICh2YWwuZXF1YWxzICgiU1RBUlRfRUxFTUVOVCIpKSByZXR1cm4gCisgICAgICAgIFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQ7IAorICAgIGlmICh2YWwuZXF1YWxzICgiRU5EX0VMRU1FTlQiKSkgcmV0dXJuIFhNTEV2ZW50LkVORF9FTEVNRU5UOworICAgIGlmICh2YWwuZXF1YWxzICgiUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT047IAorICAgIGlmICh2YWwuZXF1YWxzICgiQ0hBUkFDVEVSX0RBVEEiKSkKKyAgICAgIHJldHVybiBYTUxFdmVudC5DSEFSQUNURVJfREFUQTsgCisgICAgaWYgKHZhbC5lcXVhbHMgKCJDT01NRU5UIikpCisgICAgICByZXR1cm4gWE1MRXZlbnQuQ09NTUVOVDsgCisgICAgaWYgKHZhbC5lcXVhbHMgKCJTUEFDRSIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LlNQQUNFOyAKKyAgICBpZiAodmFsLmVxdWFscyAoIk5VTExfRUxFTUVOVCIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50Lk5VTExfRUxFTUVOVDsgCisgICAgaWYgKHZhbC5lcXVhbHMgKCJTVEFSVF9ET0NVTUVOVCIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UOyAKKyAgICBpZiAodmFsLmVxdWFscyAoIkVORF9ET0NVTUVOVCIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LkVORF9ET0NVTUVOVDsgCisgICAgaWYgKHZhbC5lcXVhbHMgKCJTVEFSVF9QUkVGSVhfTUFQUElORyIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HOyAKKyAgICBpZiAodmFsLmVxdWFscyAoIkNIQU5HRV9QUkVGSVhfTUFQUElORyIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORzsKKyAgICBpZiAodmFsLmVxdWFscyAoIkVOVElUWV9SRUZFUkVOQ0UiKSkKKyAgICAgIHJldHVybiBYTUxFdmVudC5FTlRJVFlfUkVGRVJFTkNFOyAKKyAgICBpZiAodmFsLmVxdWFscyAoIkVORF9QUkVGSVhfTUFQUElORyIpKQorICAgICAgcmV0dXJuIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORzsKKworICAgIHJldHVybiBYTUxFdmVudC5OVUxMX0VMRU1FTlQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxpbnB1dHN0cmVhbS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbC9zdHJlYW0vdXRpbHMvTmVzdGVkVGhyb3dhYmxlLmphdmEgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL3V0aWxzL05lc3RlZFRocm93YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlOGRiZTMKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1saW5wdXRzdHJlYW0vb3JnL2FwYWNoZS94bWxiZWFucy94bWwvc3RyZWFtL3V0aWxzL05lc3RlZFRocm93YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0udXRpbHM7CisKKy8qKgorICogVGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBOZXN0ZWRFeGNlcHRpb24sIE5lc3RlZEVycm9yLCBhbmQKKyAqIE5lc3RlZFJ1bnRpbWVFeGNlcHRpb24gbGFyZ2VseSBzbyBVdGlsIGNhbiBwcm92aWRlIGEgc3RhbmRhcmQKKyAqIGltcGxlbWVudGF0aW9uIG9mIHRvU3RyaW5nKCkgYW5kIHByaW50U3RhY2tUcmFjZSgpCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIEpESyAxLjQgc3R5bGUgbmVzdGVkIHRocm93YWJsZXMgd2hlcmUgcG9zc2libGUuCisgKi8KKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIE5lc3RlZFRocm93YWJsZSB7CisKKyAgLyoqIEdldCB0aGUgbmVzdGVkIFRocm93YWJsZS4gKi8KKyAgVGhyb3dhYmxlIGdldE5lc3RlZCgpOworCisgIC8qKiBDYWxsIHN1cGVyLnRvU3RyaW5nKCkuIFtLbHVkZ2UgYnV0IG5lY2Vzc2FyeS5dICovCisgIFN0cmluZyBzdXBlclRvU3RyaW5nKCk7CisKKyAgLyoqIENhbGwgc3VwZXIucHJpbnRTdGFja1RyYWNlKCkuIFtLbHVkZ2UgYnV0IG5lY2Vzc2FyeS5dICovCisgIHZvaWQgc3VwZXJQcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcHMpOworCisgIC8qKiBDYWxsIHN1cGVyLnByaW50U3RhY2tUcmFjZSgpLiBbS2x1ZGdlIGJ1dCBuZWNlc3NhcnkuXSAqLworICB2b2lkIHN1cGVyUHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHBvKTsKKworICBzdGF0aWMgY2xhc3MgVXRpbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBleGNlcHRpb24gbWVzc2FnZSBhbmQgaXRzIG5lc3RlZCBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoTmVzdGVkVGhyb3dhYmxlIG50KSB7CisgICAgICBUaHJvd2FibGUgbmVzdGVkID0gbnQuZ2V0TmVzdGVkKCk7CisgICAgICBpZiAobmVzdGVkID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG50LnN1cGVyVG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudC5zdXBlclRvU3RyaW5nKCkgKyAiIC0gd2l0aCBuZXN0ZWQgZXhjZXB0aW9uOiIgKworICAgICAgICAgIEVPTCArICJbIiArIG5lc3RlZFRvU3RyaW5nKG5lc3RlZCkgKyAiXSI7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5lc3RlZFRvU3RyaW5nKFRocm93YWJsZSBuZXN0ZWQpIHsKKyAgICAgIGlmIChuZXN0ZWQgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7CisgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIG5lc3RlZDsKKyAgICAgICAgcmV0dXJuIG5lc3RlZC50b1N0cmluZygpICsgIiAtIHdpdGggdGFyZ2V0IGV4Y2VwdGlvbjoiICsKKyAgICAgICAgICBFT0wgKyAiWyIgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkudG9TdHJpbmcoKSArCisgICAgICAgICAgIl0iOworICAgICAgfQorICAgICAgcmV0dXJuIG5lc3RlZC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAorICAgICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHMgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3RhY2tUcmFjZShOZXN0ZWRUaHJvd2FibGUgbnQsIFByaW50U3RyZWFtIHMpIHsKKyAgICAgIFRocm93YWJsZSBuZXN0ZWQgPSBudC5nZXROZXN0ZWQoKTsKKyAgICAgIGlmIChuZXN0ZWQgIT0gbnVsbCkgeworICAgICAgICBuZXN0ZWQucHJpbnRTdGFja1RyYWNlKHMpOworICAgICAgICBzLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLSBuZXN0ZWQgd2l0aGluOiAtLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgIH0KKyAgICAgIG50LnN1cGVyUHJpbnRTdGFja1RyYWNlKHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uIGFuZAorICAgICAqIGl0cyBuZXN0ZWQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHcgICAgICAgICAgICAgICAgIFByaW50V3JpdGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3RhY2tUcmFjZShOZXN0ZWRUaHJvd2FibGUgbnQsIFByaW50V3JpdGVyIHcpIHsKKyAgICAgIFRocm93YWJsZSBuZXN0ZWQgPSBudC5nZXROZXN0ZWQoKTsKKyAgICAgIGlmIChuZXN0ZWQgIT0gbnVsbCkgeworICAgICAgICBuZXN0ZWQucHJpbnRTdGFja1RyYWNlKHcpOworICAgICAgICB3LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLSBuZXN0ZWQgd2l0aGluOiAtLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgIH0KKyAgICAgIG50LnN1cGVyUHJpbnRTdGFja1RyYWNlKHcpOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvamF2YXgveG1sL25hbWVzcGFjZS9RTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZGU5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL2phdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLm5hbWVzcGFjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiA8Y29kZT5RTmFtZTwvY29kZT4gY2xhc3MgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgYSBxdWFsaWZpZWQgbmFtZQorICogYXMgc3BlY2lmaWVkIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSI+WE1MCisgKiBTY2hlbWEgUGFydDI6IERhdGF0eXBlcyBzcGVjaWZpY2F0aW9uPC9hPi4KKyAqIDxwPgorICogVGhlIHZhbHVlIG9mIGEgUU5hbWUgY29udGFpbnMgYSA8Yj5uYW1lc3BhY2VVUkk8L2I+LCBhIDxiPmxvY2FsUGFydDwvYj4gYW5kIGEgPGI+cHJlZml4PC9iPi4KKyAqIFRoZSBsb2NhbFBhcnQgcHJvdmlkZXMgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIHF1YWxpZmllZCBuYW1lLiBUaGUKKyAqIG5hbWVzcGFjZVVSSSBpcyBhIFVSSSByZWZlcmVuY2UgaWRlbnRpZnlpbmcgdGhlIG5hbWVzcGFjZS4KKyAqCisgKiBAdmVyc2lvbiAxLjEKKyAqLworcHVibGljIGNsYXNzIFFOYW1lIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKiBjb21tZW50L3NoYXJlZCBlbXB0eSBzdHJpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW1wdHlTdHJpbmcgPSAiIi5pbnRlcm4oKTsKKworICAgIC8qKiBGaWVsZCBuYW1lc3BhY2VVUkkgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7CisKKyAgICAvKiogRmllbGQgbG9jYWxQYXJ0ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxQYXJ0OworCisgICAgLyoqIEZpZWxkIHByZWZpeCAqLworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgUU5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lCisgICAgICovCisgICAgcHVibGljIFFOYW1lKFN0cmluZyBsb2NhbFBhcnQpIHsKKyAgICAgICAgdGhpcyhlbXB0eVN0cmluZywgbG9jYWxQYXJ0LCBlbXB0eVN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgTmFtZXNwYWNlIFVSSSBmb3IgdGhlIFFOYW1lCisgICAgICogQHBhcmFtIGxvY2FsUGFydCBMb2NhbCBwYXJ0IG9mIHRoZSBRTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCkgeworICAgICAgICB0aGlzKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0LCBlbXB0eVN0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgTmFtZXNwYWNlIFVSSSBmb3IgdGhlIFFOYW1lCisgICAgICogQHBhcmFtIGxvY2FsUGFydCBMb2NhbCBwYXJ0IG9mIHRoZSBRTmFtZS4KKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBvZiB0aGUgUU5hbWUuCisgICAgICovCisgICAgcHVibGljIFFOYW1lKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSAobmFtZXNwYWNlVVJJID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBlbXB0eVN0cmluZworICAgICAgICAgICAgICAgIDogbmFtZXNwYWNlVVJJLmludGVybigpOworICAgICAgICBpZiAobG9jYWxQYXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbG9jYWwgcGFydCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5sb2NhbFBhcnQgPSBsb2NhbFBhcnQuaW50ZXJuKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgcHJlZml4Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeC5pbnRlcm4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIE5hbWVzcGFjZSBVUkkgZm9yIHRoaXMgUU5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gTmFtZXNwYWNlIFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIExvY2FsIHBhcnQgZm9yIHRoaXMgUU5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWwgcGFydAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gbG9jYWxQYXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFByZWZpeCBmb3IgdGhpcyBRTmFtZQorICAgICAqCisgICAgICogQHJldHVybiBQcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgUU5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBRTmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICgobmFtZXNwYWNlVVJJID09IGVtcHR5U3RyaW5nKQorICAgICAgICAgICAgICAgID8gbG9jYWxQYXJ0CisgICAgICAgICAgICAgICAgOiAneycgKyBuYW1lc3BhY2VVUkkgKyAnfScgKyBsb2NhbFBhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoaXMgUU5hbWUgZm9yIGVxdWFsaXR5IHdpdGggYW5vdGhlciBvYmplY3QuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgYSBRTmFtZSBvciBpcyBudWxsIHRoZW4gdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIDx0dD5mYWxzZTwvdHQ+LgorICAgICAqIDxwPgorICAgICAqIEZvciB0d28gUU5hbWVzIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwgcmVxdWlyZXMgdGhhdCBib3RoCisgICAgICogbG9jYWxQYXJ0IGFuZCBuYW1lc3BhY2VVUkkgbXVzdCBiZSBlcXVhbC4gVGhpcyBtZXRob2QgdXNlcworICAgICAqIDxjb2RlPlN0cmluZy5lcXVhbHM8L2NvZGU+IHRvIGNoZWNrIGVxdWFsaXR5IG9mIGxvY2FsUGFydAorICAgICAqIGFuZCBuYW1lc3BhY2VVUkkuIEFueSBjbGFzcyB0aGF0IGV4dGVuZHMgUU5hbWUgaXMgcmVxdWlyZWQKKyAgICAgKiB0byBzYXRpc2Z5IHRoaXMgZXF1YWxpdHkgY29udHJhY3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgc2F0aXNmaWVzIHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIHRoZSA8Y29kZT5PYmplY3QuZXF1YWxzPC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZQorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGlkZW50aWNhbCB0byB0aGlzCisgICAgICogICAgICBRTmFtZTogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCisgICAgICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBRTmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobmFtZXNwYWNlVVJJID09ICgoUU5hbWUpIG9iaikubmFtZXNwYWNlVVJJKQorICAgICAgICAgICAgICAgICYmIChsb2NhbFBhcnQgPT0gKChRTmFtZSkgb2JqKS5sb2NhbFBhcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgUU5hbWUgaG9sZGluZyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBTdHJpbmcuCisgICAgICogPHA+CisgICAgICogVGhlIHN0cmluZyBtdXN0IGJlIGluIHRoZSBmb3JtIHJldHVybmVkIGJ5IHRoZSBRTmFtZS50b1N0cmluZygpCisgICAgICogbWV0aG9kLCBpLmUuICJ7bmFtZXNwYWNlVVJJfWxvY2FsUGFydCIsIHdpdGggdGhlICJ7bmFtZXNwYWNlVVJJfSIKKyAgICAgKiBwYXJ0IGJlaW5nIG9wdGlvbmFsLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZG8gYSBmdWxsIHZhbGlkYXRpb24gb2YgdGhlIHJlc3VsdGluZyBRTmFtZS4KKyAgICAgKiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2Vzbid0IGNoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyBuYW1lc3BhY2UgVVJJCisgICAgICogaXMgYSBsZWdhbCBVUkkgKHBlciBSRkMgMjM5NiBhbmQgUkZDIDI3MzIpLCBub3IgdGhhdCB0aGUgcmVzdWx0aW5nCisgICAgICogbG9jYWwgcGFydCBpcyBhIGxlZ2FsIE5DTmFtZSBwZXIgdGhlIFhNTCBOYW1lc3BhY2VzIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIHBhcnNlZAorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgc3BlY2lmaWVkIFN0cmluZyBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgUU5hbWUKKyAgICAgKiBAcmV0dXJuIFFOYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgdmFsdWVPZihTdHJpbmcgcykgeworCisgICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICd7JykgeworICAgICAgICAgICAgaW50IGkgPSBzLmluZGV4T2YoJ30nKTsKKworICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIFFOYW1lIGxpdGVyYWwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPT0gcy5sZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIFFOYW1lIGxpdGVyYWwiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShzLnN1YnN0cmluZygxLCBpKSwgcy5zdWJzdHJpbmcoaSArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIFFOYW1lIG9iamVjdC4gVGhlIGhhc2ggY29kZQorICAgICAqIGlzIGJhc2VkIG9uIGJvdGggdGhlIGxvY2FsUGFydCBhbmQgbmFtZXNwYWNlVVJJIHBhcnRzIG9mIHRoZQorICAgICAqIFFOYW1lLiBUaGlzIG1ldGhvZCBzYXRpc2ZpZXMgdGhlICBnZW5lcmFsIGNvbnRyYWN0IG9mIHRoZQorICAgICAqIDxjb2RlPk9iamVjdC5oYXNoQ29kZTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBRbmFtZSBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJLmhhc2hDb2RlKCkgXiBsb2NhbFBhcnQuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBkZXNlcmlhbGl6YXRpb24gcHJvcGVybHkgaW50ZXJucyB0aGUgcmVzdWx0cy4KKyAgICAgKiBAcGFyYW0gaW4gdGhlIE9iamVjdElucHV0U3RyZWFtIHRvIGJlIHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisKKyAgICAgICAgbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJLmludGVybigpOworICAgICAgICBsb2NhbFBhcnQgPSBsb2NhbFBhcnQuaW50ZXJuKCk7CisgICAgICAgIHByZWZpeCA9IHByZWZpeC5pbnRlcm4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRGVsZWdhdGVYbWxPYmplY3QuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9EZWxlZ2F0ZVhtbE9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDBiNWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRGVsZWdhdGVYbWxPYmplY3QuamF2YQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogU2VlIHtAbGluayBGaWx0ZXJYbWxPYmplY3R9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVsZWdhdGVYbWxPYmplY3QKK3sKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB1bmRlcmx5aW5nIFhtbE9iamVjdC4KKyAgICAgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc3VwcGx5IG9yIGNvbXB1dGUgdGhlIHdyYXBwZWQgb2JqZWN0LgorICAgICAqLworICAgIFhtbE9iamVjdCB1bmRlcmx5aW5nWG1sT2JqZWN0KCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRmlsdGVyWG1sT2JqZWN0LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvRmlsdGVyWG1sT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3ZDgyZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9GaWx0ZXJYbWxPYmplY3QuamF2YQpAQCAtMCwwICsxLDY0NCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBBIEZpbHRlclhtbE9iamVjdCBkZWxlZ2F0ZXMgdG8gc29tZSBvdGhlciBYbWxPYmplY3QsIHdoaWNoIGl0IGNhbiB1c2UgYXMKKyAqIGl0cyBiYXNpYyBzb3VyY2Ugb2YgZGF0YSwgcG9zc2libHkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGFsb25nIHRoZSB3YXkgb3IKKyAqIHByb3ZpZGluZyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuIFRoZSBjbGFzcyBGaWx0ZXJYbWxPYmplY3QgaXRzZWxmCisgKiBzaW1wbHkgb3ZlcnJpZGVzIGFsbCBtZXRob2RzIG9mIFhtbE9iamVjdCB3aXRoIHZlcnNpb25zIHRoYXQgcGFzcyBhbGwKKyAqIHJlcXVlc3RzIHRvIHRoZSB1bmRlcmx5aW5nIFhtbE9iamVjdC4gU3ViY2xhc3NlcyBvZiBGaWx0ZXJYbWxPYmplY3QgbWF5CisgKiBmdXJ0aGVyIG92ZXJyaWRlIHNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhbmQgbWF5IGFsc28gcHJvdmlkZSBhZGRpdGlvbmFsCisgKiBtZXRob2RzIGFuZCBmaWVsZHMuCisgKiA8cD4KKyAqIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0aGF0IEZpbHRlclhtbE9iamVjdCBoYXMgbm8gc3RvcmFnZSAoaS5lLiwgbm8KKyAqIG5vbi10cmFuc2llbnQgZmllbGRzKSwgYmVjYXVzZSBzdWJjbGFzc2VzIG1heSBiZSBzZXJpYWxpemFibGUgYW5kCisgKiBhZGRpbmcgc3RvcmFnZSB3b3VsZCBicmVhayB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuCisgKi8gCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsdGVyWG1sT2JqZWN0IGltcGxlbWVudHMgWG1sT2JqZWN0LCBTaW1wbGVWYWx1ZSwgRGVsZWdhdGVYbWxPYmplY3QKK3sKKyAgICBwdWJsaWMgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2NoZW1hVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnZhbGlkYXRlKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3RbXSBzZWxlY3RQYXRoKFN0cmluZyBwYXRoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zZWxlY3RQYXRoKHBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3RbXSBzZWxlY3RQYXRoKFN0cmluZyBwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnNlbGVjdFBhdGgocGF0aCwgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeShTdHJpbmcgcXVlcnkpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLmV4ZWNRdWVyeShxdWVyeSk7CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNRdWVyeShTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuZXhlY1F1ZXJ5KHF1ZXJ5LCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGNoYW5nZVR5cGUoU2NoZW1hVHlwZSBuZXdUeXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jaGFuZ2VUeXBlKG5ld1R5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmlsKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuaXNOaWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROaWwoKQorICAgIHsKKyAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNldE5pbCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tdXRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuaXNJbW11dGFibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IHNldChYbWxPYmplY3Qgc3JjT2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zZXQoc3JjT2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGNvcHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5jb3B5KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkudmFsdWVFcXVhbHMob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHZhbHVlSGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS52YWx1ZUhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuY29tcGFyZVRvKG9iaik7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVmFsdWUoWG1sT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuY29tcGFyZVZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubW9uaXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxEb2N1bWVudFByb3BlcnRpZXMgZG9jdW1lbnRQcm9wZXJ0aWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuZG9jdW1lbnRQcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgcHVibGljIFhtbEN1cnNvciBuZXdDdXJzb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdDdXJzb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdYTUxJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLnhtbFRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3UmVhZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgbmV3RG9tTm9kZSgpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0RvbU5vZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKENvbnRlbnRIYW5kbGVyIGNoLCBMZXhpY2FsSGFuZGxlciBsaCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUoY2gsIGxoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShmaWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShvcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZShXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZSh3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdYTUxJbnB1dFN0cmVhbShvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQoWG1sT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS54bWxUZXh0KG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gdW5kZXJseWluZ1htbE9iamVjdCgpLm5ld0lucHV0U3RyZWFtKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyKFhtbE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHJldHVybiB1bmRlcmx5aW5nWG1sT2JqZWN0KCkubmV3UmVhZGVyKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdYbWxPYmplY3QoKS5uZXdEb21Ob2RlKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKGNoLCBsaCwgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZShGaWxlIGZpbGUsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB1bmRlcmx5aW5nWG1sT2JqZWN0KCkuc2F2ZShmaWxlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcywgWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHVuZGVybHlpbmdYbWxPYmplY3QoKS5zYXZlKG9zLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlKFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdW5kZXJseWluZ1htbE9iamVjdCgpLnNhdmUodywgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGUgaW5zdGFuY2VUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuaW5zdGFuY2VUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBzdHJpbmdWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnN0cmluZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYnl0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zaG9ydFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBpbnRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmludFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlclZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYmlnSW50ZWdlclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuYmlnRGVjaW1hbFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5mbG9hdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmRvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBieXRlQXJyYXlWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmJ5dGVBcnJheVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZW51bVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5jYWxlbmRhclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZGF0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZGF0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEdEYXRlIGdEYXRlVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nRGF0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEdEdXJhdGlvbiBnRHVyYXRpb25WYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdEdXJhdGlvblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIHFOYW1lVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5xTmFtZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgbGlzdFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkubGlzdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgeGxpc3RWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnhsaXN0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG9iamVjdFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkub2JqZWN0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoYm9vbGVhbiB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoYnl0ZSB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoc2hvcnQgdikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KGludCB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQobG9uZyB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoQmlnSW50ZWdlciBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KEJpZ0RlY2ltYWwgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChmbG9hdCB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldCh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoZG91YmxlIHYpCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KHYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChieXRlW10gb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoQ2FsZW5kYXIgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldChvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChEYXRlIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KFFOYW1lIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoTGlzdCBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0KG9iaik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldFN0cmluZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0Qm9vbGVhblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0Qnl0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFNob3J0VmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRTaG9ydFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEludFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZ1ZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0TG9uZ1ZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0QmlnSW50ZWdlclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0QmlnRGVjaW1hbFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRGbG9hdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldERvdWJsZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEJ5dGVBcnJheVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZ2V0RW51bVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0RW51bVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRDYWxlbmRhclZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZVZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0RGF0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEdEYXRlIGdldEdEYXRlVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRHRGF0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIEdEdXJhdGlvbiBnZXRHRHVyYXRpb25WYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLmdldEdEdXJhdGlvblZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldFFOYW1lVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5nZXRRTmFtZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0TGlzdFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0TGlzdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgeGdldExpc3RWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnhnZXRMaXN0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuZ2V0T2JqZWN0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShTdHJpbmcgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldFN0cmluZ1ZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4gdikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRCb29sZWFuVmFsdWUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgdikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRCeXRlVmFsdWUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRWYWx1ZShzaG9ydCB2KQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldFNob3J0VmFsdWUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW50VmFsdWUoaW50IHYpCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0SW50VmFsdWUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ1ZhbHVlKGxvbmcgdikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRMb25nVmFsdWUodik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QmlnSW50ZWdlclZhbHVlKEJpZ0ludGVnZXIgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJpZ0ludGVnZXJWYWx1ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJpZ0RlY2ltYWxWYWx1ZShCaWdEZWNpbWFsIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRCaWdEZWNpbWFsVmFsdWUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKGZsb2F0IHYpCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0RmxvYXRWYWx1ZSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVWYWx1ZShkb3VibGUgdikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXREb3VibGVWYWx1ZSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEJ5dGVBcnJheVZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW51bVZhbHVlKFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldEVudW1WYWx1ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldENhbGVuZGFyVmFsdWUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0RGF0ZVZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0R0RhdGVWYWx1ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdEdXJhdGlvblZhbHVlKEdEdXJhdGlvbiBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0R0R1cmF0aW9uVmFsdWUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZVZhbHVlKFFOYW1lIG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5zZXRRTmFtZVZhbHVlKG9iaik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlzdFZhbHVlKExpc3Qgb2JqKQorICAgIHsKKyAgICAgICAgKChTaW1wbGVWYWx1ZSl1bmRlcmx5aW5nWG1sT2JqZWN0KCkpLnNldExpc3RWYWx1ZShvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKE9iamVjdCBvYmopCisgICAgeworICAgICAgICAoKFNpbXBsZVZhbHVlKXVuZGVybHlpbmdYbWxPYmplY3QoKSkuc2V0T2JqZWN0VmFsdWUob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvYmplY3RTZXQoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgICgoU2ltcGxlVmFsdWUpdW5kZXJseWluZ1htbE9iamVjdCgpKS5vYmplY3RTZXQob2JqKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Zjk2MjAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGUuamF2YQpAQCAtMCwwICsxLDEwNjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBHcmVnb3JpYW4gZGF0ZS4KKyAqIDxwPgorICogVGhlcmUgYXJlIG1hbnkgZGF0ZSB0eXBlcyBpbiBYTUwgU2NoZW1hLCBhbmQgdGhpcyB0eXBlCisgKiByZXByZXNlbnRzIHRoZSBuYXR1cmFsIHVuaW9uIG9mIGFsbCB0aG9zZSB0eXBlcy4gIEEgR0RhdGUKKyAqIGNhbiBob2xkIGFueSBzdWJzZXQgb2YgZGF0ZSBmaWVsZHMgKFllYXIsIE1vbnRoLCBEYXksIFRpbWUsCisgKiBUaW1lem9uZSwgb3Igc29tZSBjb21iaW5hdGlvbikuIFdoZXJldmVyIHRoZSBzcGVjaWZpY2F0aW9uCisgKiBwcm92aWRlcyBndWlkYW5jZSwgdGhlIGd1aWRlbGluZXMgaW4gdGhlCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvIj5YTUwgU2NoZW1hIDEuMCBzcGVjaWZpY2F0aW9uPC9hPgorICogKHBsdXMgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDUveG1sc2NoZW1hLWVycmF0YSI+cHVibGlzaGVkIGVycmF0YTwvYT4pIGFyZSBmb2xsb3dlZC4KKyAqIDxwPgorICogSW5zdGFuY2VzIG1heSBzZXBhcmF0ZWx5IGhhdmUgdmFsdWVzIG9yIG5vIHZhbHVlcyBmb3IKKyAqIHRoZSB5ZWFyLCBtb250aCwgZGF5LW9mLW1vbnRoLCBhbmQgdGltZS1vZi1kYXkuIE5vdCBhbGwKKyAqIG9wZXJhdGlvbnMgYXJlIG1lYW5pbmdmdWwgb24gYWxsIGNvbWJpbmF0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEdEYXRlIGltcGxlbWVudHMgR0RhdGVTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIAorICAgIC8vIGZvciBmYXN0IGVxdWFsaXR5IGNvbXBhcmlzb24sIGhhc2hpbmcsIGFuZCBzZXJpYWxpemF0aW9uCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9jYW5vbmljYWxTdHJpbmc7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIF9zdHJpbmc7CisKKyAgICBwcml2YXRlIGludCBfYml0czsKKyAgICBwcml2YXRlIGludCBfQ1k7CisgICAgcHJpdmF0ZSBpbnQgX007CisgICAgcHJpdmF0ZSBpbnQgX0Q7CisgICAgcHJpdmF0ZSBpbnQgX2g7CisgICAgcHJpdmF0ZSBpbnQgX207CisgICAgcHJpdmF0ZSBpbnQgX3M7CisgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKKyAgICBwcml2YXRlIGludCBfdHpzaWduOworICAgIHByaXZhdGUgaW50IF90emg7CisgICAgcHJpdmF0ZSBpbnQgX3R6bTsKKyAgICAKKyAgICAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIF96ZXJvID0gQmlnRGVjaW1hbC52YWx1ZU9mKDApOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgX29uZSA9IEJpZ0RlY2ltYWwudmFsdWVPZigxKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhIGxleGljYWwgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIEdEYXRlKENoYXJTZXF1ZW5jZSBzdHJpbmcpCisgICAgeworICAgICAgICAvLyBmaXJzdCB0cmltIFhNTCB3aGl0ZXNwYWNlCisgICAgICAgIGludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIHdoaWxlIChsZW4gPiAwICYmIGlzU3BhY2Uoc3RyaW5nLmNoYXJBdChsZW4gLSAxKSkpCisgICAgICAgICAgICBsZW4gLT0gMTsKKyAgICAgICAgd2hpbGUgKHN0YXJ0IDwgbGVuICYmIGlzU3BhY2Uoc3RyaW5nLmNoYXJBdChzdGFydCkpKQorICAgICAgICAgICAgc3RhcnQgKz0gMTsKKworICAgICAgICAvLyBwaWNrIG9wdGlvbmFsIHRpbWV6b25lIG9mZiB0aGUgZW5kCisgICAgICAgIGlmIChsZW4gLSBzdGFydCA+PSAxICYmIHN0cmluZy5jaGFyQXQobGVuIC0gMSkgPT0gJ1onKQorICAgICAgICB7CisgICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7CisgICAgICAgICAgICBsZW4gLT0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW4gLSBzdGFydCA+PSA2KQorICAgICAgICB0aW1lem9uZTogeworICAgICAgICAgICAgaW50IHR6c2lnbjsKKyAgICAgICAgICAgIGludCB0emhvdXI7CisgICAgICAgICAgICBpbnQgdHptaW51dGU7CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuY2hhckF0KGxlbiAtIDMpICE9ICc6JykKKyAgICAgICAgICAgICAgICBicmVhayB0aW1lem9uZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJpbmcuY2hhckF0KGxlbiAtIDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICB0enNpZ24gPSAtMTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgICAgIHR6c2lnbiA9IDE7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHRpbWV6b25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0emhvdXIgPSB0d29EaWdpdChzdHJpbmcsIGxlbiAtIDUpOworICAgICAgICAgICAgdHptaW51dGUgPSB0d29EaWdpdChzdHJpbmcsIGxlbiAtIDIpOworICAgICAgICAgICAgaWYgKHR6aG91ciA+IDE0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBob3VyIG11c3QgYmUgdHdvIGRpZ2l0cyBiZXR3ZWVuIC0xNCBhbmQgKzE0Iik7CisgICAgICAgICAgICBpZiAodHptaW51dGUgPiA1OSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIHpvbmUgbWludXRlIG11c3QgYmUgdHdvIGRpZ2l0cyBiZXR3ZWVuIDAwIGFuZCA1OSIpOworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUVaT05FOworICAgICAgICAgICAgX3R6c2lnbiA9IHR6c2lnbjsKKyAgICAgICAgICAgIF90emggPSB0emhvdXI7CisgICAgICAgICAgICBfdHptID0gdHptaW51dGU7CisgICAgICAgICAgICBsZW4gLT0gNjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBpY2sgZGF0ZSBmaWVsZHMgb2ZmIHRoZSBiZWdpbm5pbmcgaWYgaXQgZG9lc24ndCBsb29rIGxpa2UgYSB0aW1lCisgICAgICAgIGlmIChzdGFydCA8IGxlbiAmJiAoc3RhcnQgKyAyID49IGxlbiB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgMikgIT0gJzonKSkKKyAgICAgICAgc2NhbmRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHBhcnNlIHllYXIgc2lnbgorICAgICAgICAgICAgYm9vbGVhbiBuZWd5ZWFyID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCBsZW4gJiYgc3RyaW5nLmNoYXJBdChzdGFydCkgPT0gJy0nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5lZ3llYXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNjYW4geWVhciBkaWdpdHMKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IDA7CisgICAgICAgICAgICBpbnQgZGlnaXRzID0gLXN0YXJ0OworICAgICAgICAgICAgY2hhciBjaDsKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ggPSBzdGFydCA8IGxlbiA/IHN0cmluZy5jaGFyQXQoc3RhcnQpIDogJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAoIWlzRGlnaXQoY2gpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBkaWdpdFZhbChjaCk7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZ2l0cyArPSBzdGFydDsKKyAgICAgICAgICAgIGlmIChkaWdpdHMgPiA2KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInllYXIgdG9vIGxvbmcgKHVwIHRvIDYgZGlnaXRzKSIpOworICAgICAgICAgICAgZWxzZSBpZiAoZGlnaXRzID49IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7CisgICAgICAgICAgICAgICAgX0NZID0gIG5lZ3llYXIgPyAtdmFsdWUgOiB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRpZ2l0cyA+IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieWVhciBtdXN0IGJlIGZvdXIgZGlnaXRzIChtYXkgcGFkIHdpdGggemVyb2VzLCBlLmcuLCAwNTYwKSIpOworCisgICAgICAgICAgICAvLyBoeXBoZW4gaW50cm9kdWNlcyBhIG1vbnRoCisgICAgICAgICAgICBpZiAoY2ggIT0gJy0nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuZWd5ZWFyICYmICFoYXNZZWFyKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsgLy8gYSBzaW5nbGUgbWludXMKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgKz0gMTsKKworICAgICAgICAgICAgLy8gdHdvLWRpZ2l0IG1vbnRoCisgICAgICAgICAgICBpZiAobGVuIC0gc3RhcnQgPj0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHR3b0RpZ2l0KHN0cmluZywgc3RhcnQpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDEyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOworICAgICAgICAgICAgICAgICAgICBfTSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaHlwaGVuIGludHJvZHVjZXMgYSBkYXkKKyAgICAgICAgICAgIGNoID0gc3RhcnQgPCBsZW4gPyBzdHJpbmcuY2hhckF0KHN0YXJ0KSA6ICdcMCc7CisgICAgICAgICAgICBpZiAoY2ggIT0gJy0nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaGFzTW9udGgoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyAvLyBtaW51cyBhZnRlciBhIHllYXIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW5kYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgKz0gMTsKKworICAgICAgICAgICAgLy8gdHdvLWRpZ2l0IGRheQorICAgICAgICAgICAgaWYgKGxlbiAtIHN0YXJ0ID49IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9iaXRzIHw9IEhBU19EQVk7CisgICAgICAgICAgICAgICAgICAgIF9EID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWhhc0RheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGVycm9yIGluIHRoZSBvcmlnaW5hbCBzY2hlbWEgc3BlYyBwZXJtaXRzIGFuIGV4dHJhICctJyBoZXJlCisgICAgICAgICAgICAgICAgaWYgKGhhc01vbnRoKCkgJiYgIWhhc1llYXIoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gc3RhcnQgPCBsZW4gPyBzdHJpbmcuY2hhckF0KHN0YXJ0KSA6ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IC8vIG1pbnVzIGFmdGVyIGEgbW9udGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRpbWUKKyAgICAgICAgaWYgKHN0YXJ0IDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzWWVhcigpIHx8IGhhc01vbnRoKCkgfHwgaGFzRGF5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoc3RhcnQpICE9ICdUJykKKyAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRlIGFuZCB0aW1lIG11c3QgYmUgc2VwYXJhdGVkIGJ5ICdUJyIpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPCBzdGFydCArIDggfHwgc3RyaW5nLmNoYXJBdChzdGFydCArIDIpICE9ICc6JyB8fCBzdHJpbmcuY2hhckF0KHN0YXJ0ICsgNSkgIT0gJzonKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgaW50IGggPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChoID49IDI0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhvdXIgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCAyMyIpOworICAgICAgICAgICAgaW50IG0gPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0ICsgMyk7CisgICAgICAgICAgICBpZiAobSA+PSA2MCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaW51dGUgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCA1OSIpOworICAgICAgICAgICAgaW50IHMgPSB0d29EaWdpdChzdHJpbmcsIHN0YXJ0ICsgNik7CisgICAgICAgICAgICBpZiAocyA+PSA2MCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWNvbmQgbXVzdCBiZSBiZXR3ZWVuIDAwIGFuZCA1OSIpOworCisgICAgICAgICAgICBzdGFydCArPSA4OworCisgICAgICAgICAgICBCaWdEZWNpbWFsIGZzID0gX3plcm87CisgICAgICAgICAgICBpZiAoc3RhcnQgPCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5jaGFyQXQoc3RhcnQpICE9ICcuJykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCArIDEgPCBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChzdHJpbmcuY2hhckF0KGkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZzID0gbmV3IEJpZ0RlY2ltYWwoc3RyaW5nLnN1YlNlcXVlbmNlKHN0YXJ0LCBsZW4pLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYml0cyB8PSBIQVNfVElNRTsKKyAgICAgICAgICAgIF9oID0gaDsKKyAgICAgICAgICAgIF9tID0gbTsKKyAgICAgICAgICAgIF9zID0gczsKKyAgICAgICAgICAgIF9mcyA9IGZzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGRhdGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCisgICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCisgICAgICogYW4gdW5zcGVjaWZpZWQgdGltZXpvbmUuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGJ5IG5vdCBzcGVjaWZ5aW5nIHRoZSB0aW1lem9uZSB0aGUgR0RhdGUKKyAgICAgKiBiZWNvbWVzIHBhcnRpYWxseSB1bm9yZGVyZWQgd2l0aCByZXNwZWN0IHRvIHRpbWVzIHRoYXQKKyAgICAgKiBkbyBoYXZlIGEgc3BlY2lmaWVkIHRpbWV6b25lLgorICAgICAqLworICAgIHB1YmxpYyBHRGF0ZSgKKyAgICAgICAgICAgIGludCB5ZWFyLAorICAgICAgICAgICAgaW50IG1vbnRoLAorICAgICAgICAgICAgaW50IGRheSwKKyAgICAgICAgICAgIGludCBob3VyLAorICAgICAgICAgICAgaW50IG1pbnV0ZSwKKyAgICAgICAgICAgIGludCBzZWNvbmQsCisgICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQorICAgIHsKKyAgICAgICAgX2JpdHMgPSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKKworICAgICAgICBfQ1kgPSB5ZWFyOworICAgICAgICBfTSA9IG1vbnRoOworICAgICAgICBfRCA9IGRheTsKKyAgICAgICAgX2ggPSBob3VyOworICAgICAgICBfbSA9IG1pbnV0ZTsKKyAgICAgICAgX3MgPSBzZWNvbmQ7CisgICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBfemVybyA6IGZyYWN0aW9uOworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYWJzb2x1dGUgR0RhdGUgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsCisgICAgICogbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsCisgICAgICogc2Vjb25kcywgYW5kIGluIHRoZSB0aW1lem9uZSBzcGVjaWZpZWQuCisgICAgICogPHA+CisgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBhIHRpbWUgb3IgZGF0ZSB0aGF0IGlzbid0IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lLAorICAgICAqIHRoZW4gdXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHRpbWV6b25lIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0RhdGUoCisgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgIGludCBtb250aCwKKyAgICAgICAgICAgIGludCBkYXksCisgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgIGludCBtaW51dGUsCisgICAgICAgICAgICBpbnQgc2Vjb25kLAorICAgICAgICAgICAgQmlnRGVjaW1hbCBmcmFjdGlvbiwKKyAgICAgICAgICAgIGludCB0elNpZ24sCisgICAgICAgICAgICBpbnQgdHpIb3VyLAorICAgICAgICAgICAgaW50IHR6TWludXRlKQorICAgIHsKKyAgICAgICAgX2JpdHMgPSBIQVNfVElNRVpPTkUgfCBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKKworICAgICAgICBfQ1kgPSB5ZWFyOworICAgICAgICBfTSA9IG1vbnRoOworICAgICAgICBfRCA9IGRheTsKKyAgICAgICAgX2ggPSBob3VyOworICAgICAgICBfbSA9IG1pbnV0ZTsKKyAgICAgICAgX3MgPSBzZWNvbmQ7CisgICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBfemVybyA6IGZyYWN0aW9uOworICAgICAgICBfdHpzaWduID0gdHpTaWduOworICAgICAgICBfdHpoID0gdHpIb3VyOworICAgICAgICBfdHptID0gdHpNaW51dGU7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEdEYXRlIGJhc2VkIG9uIGEgamF2YS51dGlsLkRhdGUuCisgICAgICogPHA+CisgICAgICogVGhlIGN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBkZWZhdWx0IHRpbWV6b25lIGlzIHVzZWQgYXMgdGhlIHRpbWV6b25lLgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCBpZiBlYXN0ZXJuIGRheWxpZ2h0IHRpbWUgaXMgaW4gZWZmZWN0IGF0IHRoZSBnaXZlbgorICAgICAqIGRhdGUsIHRoZSB0aW1lem9uZSBvbiB0aGUgZWFzdCBjb2FzdCBvZiB0aGUgdW5pdGVkIHN0YXRlcworICAgICAqIHRyYW5zbGF0ZXMgdG8gR01ULTA1OjAwIChFU1QpICsgMTowMCAoRFQgb2Zmc2V0KSA9PSBHTVQtMDQ6MDAuCisgICAgICovCisgICAgcHVibGljIEdEYXRlKERhdGUgZGF0ZSkKKyAgICB7CisgICAgICAgIC8vIHJlcXVpcmVzIHNvbWUgZGF0ZSBtYXRoLCBzbyBjdG9yIGxpdmVzIG9uIEdEYXRlQnVpbGRlcgorICAgICAgICB0aGlzKG5ldyBHRGF0ZUJ1aWxkZXIoZGF0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhIGphdmEudXRpbC5DYWxlbmRhci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgY2FsZW5kYXIgZG9lcyBub3QgaGF2ZSBzb21lIGZpZWxkcyBzZXQsIHRoZSBzYW1lIGFic2VuY2UKKyAgICAgKiBvZiBpbmZvcm1hdGlvbiBpcyByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlLiAgTm90ZSB0aGF0CisgICAgICogamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIGZpbGxzIGluIGFsbCBmaWVsZHMgYXMgc29vbiBhcyBhbnkKKyAgICAgKiBhcmUgZmV0Y2hlZCwgc28gY29uc3RydWN0aW5nIGEgR0RhdGUgd2l0aCB0aGUgc2FtZSBjYWxlbmRhciBvYmplY3QKKyAgICAgKiB0d2ljZSBtYXkgcmVzdWx0IGluIGEgZGlmZmVyZW50IEdEYXRlIGJlY2F1c2Ugb2YgYSBjaGFuZ2VkIGNhbGVuZGFyLgorICAgICAqIE5vdGUgdGhhdCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyIGlzIHN0YWJsZSBpZiB5b3UgcmUtZ2V0IGEgc2V0IGZpZWxkLAorICAgICAqIHNvIGl0IGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0RhdGUoQ2FsZW5kYXIgY2FsZW5kYXIpCisgICAgeworICAgICAgICAvLyB3ZSBtdXN0IHNjcmFwZSB0aGUgImlzU2V0IiBpbmZvcm1hdGlvbiBvdXQgYmVmb3JlIGFjY2Vzc2luZyBhbnl0aGluZworICAgICAgICBib29sZWFuIGlzU2V0WWVhciA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLllFQVIpOworICAgICAgICBib29sZWFuIGlzU2V0RXJhID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuRVJBKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldE1vbnRoID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuTU9OVEgpOworICAgICAgICBib29sZWFuIGlzU2V0RGF5ID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldEhvdXJPZkRheSA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldEhvdXIgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5IT1VSKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldEFtUG0gPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5BTV9QTSk7CisgICAgICAgIGJvb2xlYW4gaXNTZXRNaW51dGUgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5NSU5VVEUpOworICAgICAgICBib29sZWFuIGlzU2V0U2Vjb25kID0gY2FsZW5kYXIuaXNTZXQoQ2FsZW5kYXIuU0VDT05EKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldE1pbGxpcyA9IGNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKKyAgICAgICAgYm9vbGVhbiBpc1NldFpvbmUgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5aT05FX09GRlNFVCk7CisgICAgICAgIGJvb2xlYW4gaXNTZXREc3QgPSBjYWxlbmRhci5pc1NldChDYWxlbmRhci5EU1RfT0ZGU0VUKTsKKworICAgICAgICBpZiAoaXNTZXRZZWFyKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKTsKKyAgICAgICAgICAgIGlmIChpc1NldEVyYSAmJiBjYWxlbmRhciBpbnN0YW5jZW9mIEdyZWdvcmlhbkNhbGVuZGFyKQorICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRVJBKSA9PSBHcmVnb3JpYW5DYWxlbmRhci5CQykKKyAgICAgICAgICAgICAgICAgICAgeSA9IDEgLSB5OworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7CisgICAgICAgICAgICBfQ1kgPSB5OworICAgICAgICB9CisgICAgICAgIGlmIChpc1NldE1vbnRoKQorICAgICAgICB7CisgICAgICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7CisgICAgICAgICAgICBfTSA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgKyAxOyAvLyAhIW5vdGUKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTZXREYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iaXRzIHw9IEhBU19EQVk7CisgICAgICAgICAgICBfRCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gZ290VGltZSA9IGZhbHNlOworCisgICAgICAgIGludCBoID0gMDsKKyAgICAgICAgaW50IG0gPSAwOworICAgICAgICBpbnQgcyA9IDA7CisgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBfemVybzsKKworICAgICAgICBpZiAoaXNTZXRIb3VyT2ZEYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOworICAgICAgICAgICAgZ290VGltZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXNTZXRIb3VyICYmIGlzU2V0QW1QbSkKKyAgICAgICAgeworICAgICAgICAgICAgaCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSKSArIGNhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSkgKiAxMjsKKyAgICAgICAgICAgIGdvdFRpbWUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU2V0TWludXRlKQorICAgICAgICB7CisgICAgICAgICAgICBtID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7CisgICAgICAgICAgICBnb3RUaW1lID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1NldFNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpOworICAgICAgICAgICAgZ290VGltZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTZXRNaWxsaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzID0gQmlnRGVjaW1hbC52YWx1ZU9mKGNhbGVuZGFyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksIDMpOworICAgICAgICAgICAgZ290VGltZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ290VGltZSkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUU7CisgICAgICAgICAgICBfaCA9IGg7CisgICAgICAgICAgICBfbSA9IG07CisgICAgICAgICAgICBfcyA9IHM7CisgICAgICAgICAgICBfZnMgPSBmczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1NldFpvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpOworICAgICAgICAgICAgaWYgKGlzU2V0RHN0KQorICAgICAgICAgICAgICAgIHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyArPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCk7CisKKyAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKKyAgICAgICAgICAgIGlmICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdHpzaWduID0gMDsKKyAgICAgICAgICAgICAgICBfdHpoID0gMDsKKyAgICAgICAgICAgICAgICBfdHptID0gMDsKKyAgICAgICAgICAgICAgICBUaW1lWm9uZSB6b25lID0gY2FsZW5kYXIuZ2V0VGltZVpvbmUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSB6b25lLmdldElEKCk7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgPiAzKSBzd2l0Y2ggKGlkLmNoYXJBdCgzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOiBfdHpzaWduID0gMTsgYnJlYWs7ICAgLy8gR01UKzAwOjAwCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBfdHpzaWduID0gLTE7IGJyZWFrOyAgLy8gR01ULTAwOjAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90enNpZ24gPSAoem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIDwgMCA/IC0xIDogKzEpOworICAgICAgICAgICAgICAgIHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyA9IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAqIF90enNpZ247CisgICAgICAgICAgICAgICAgX3R6aCA9IHpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyAvIDM2MDAwMDA7CisgICAgICAgICAgICAgICAgX3R6bSA9ICh6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgLSBfdHpoICogMzYwMDAwMCkgLyA2MDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBHRGF0ZSBiYXNlZCBvbiBhbm90aGVyIEdEYXRlU3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGdkYXRlKQorICAgIHsKKyAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWVab25lKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iaXRzIHw9IEhBU19USU1FWk9ORTsKKyAgICAgICAgICAgIF90enNpZ24gPSBnZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKTsKKyAgICAgICAgICAgIF90emggPSBnZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKTsKKyAgICAgICAgICAgIF90em0gPSBnZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUU7CisgICAgICAgICAgICBfaCA9IGdkYXRlLmdldEhvdXIoKTsKKyAgICAgICAgICAgIF9tID0gZ2RhdGUuZ2V0TWludXRlKCk7CisgICAgICAgICAgICBfcyA9IGdkYXRlLmdldFNlY29uZCgpOworICAgICAgICAgICAgX2ZzID0gZ2RhdGUuZ2V0RnJhY3Rpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZGF0ZS5oYXNEYXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX0RBWTsKKyAgICAgICAgICAgIF9EID0gZ2RhdGUuZ2V0RGF5KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2RhdGUuaGFzTW9udGgoKSkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX01PTlRIOworICAgICAgICAgICAgX00gPSBnZGF0ZS5nZXRNb250aCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdkYXRlLmhhc1llYXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7CisgICAgICAgICAgICBfQ1kgPSBnZGF0ZS5nZXRZZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGlnaXQoY2hhciBjaCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKGNoYXIpKGNoIC0gJzAnKSA8PSAnOScgLSAnMCcpOyAvLyBjaGFyIGlzIHVuc2lnbmVkCisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1NwYWNlKGNoYXIgY2gpCisgICAgeworICAgICAgICBzd2l0Y2ggKGNoKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IGRpZ2l0VmFsKGNoYXIgY2gpCisgICAgeworICAgICAgICByZXR1cm4gKGNoIC0gJzAnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdHdvRGlnaXQoQ2hhclNlcXVlbmNlIHN0ciwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgY2hhciBjaDEgPSBzdHIuY2hhckF0KGluZGV4KTsKKyAgICAgICAgY2hhciBjaDIgPSBzdHIuY2hhckF0KGluZGV4ICsgMSk7CisgICAgICAgIGlmICghaXNEaWdpdChjaDEpIHx8ICFpc0RpZ2l0KGNoMikpCisgICAgICAgICAgICByZXR1cm4gMTAwOyAvLyBub3QgdHdvIGRpZ2l0cworICAgICAgICByZXR1cm4gZGlnaXRWYWwoY2gxKSAqIDEwICsgZGlnaXRWYWwoY2gyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWU6IGFsbCBHRGF0ZSBpbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgZmxhZ3MgaW5kaWNhdGluZyB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiBjb250YWluZWQgYnkgdGhpcyBHRGF0ZS4gIFRoZSBmaXZlIGZsYWdzIGFyZQorICAgICAqIEhBU19USU1FWk9ORSwgSEFTX1lFQVIsIEhBU19NT05USCwgSEFTX0RBWSwgYW5kIEhBU19USU1FLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9iaXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lem9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lWm9uZSgpCisgICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfVElNRVpPTkUpICE9IDApOyB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgeWVhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNZZWFyKCkKKyAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19ZRUFSKSAhPSAwKTsgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vbnRoLW9mLXllYXIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9udGgoKQorICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX01PTlRIKSAhPSAwKTsgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGRheS1vZi1tb250aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXkoKQorICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX0RBWSkgIT0gMCk7IH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lLW9mLWRheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNUaW1lKCkKKyAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19USU1FKSAhPSAwKTsgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIGZ1bGwgZGF0ZSAoeWVhciwgbW9udGgsIGRheSkKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNEYXRlKCkKKyAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIChIQVNfREFZIHwgSEFTX01PTlRIIHwgSEFTX1lFQVIpKSA9PSAoSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSKSk7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHllYXIuIFNob3VsZCBiZSBhIGZvdXItZGlnaXQgeWVhciBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0WWVhcigpCisgICAgICAgIHsgcmV0dXJuIF9DWTsgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1vbnRoLW9mLXllYXIuIEphbnVhcnkgaXMgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE1vbnRoKCkKKyAgICAgICAgeyByZXR1cm4gX007ICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkYXktb2YtbW9udGguIFRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCBpcyAxLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RGF5KCkKKyAgICAgICAgeyByZXR1cm4gX0Q7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGhvdXItb2YtZGF5LiBNaWRuaWdodCBpcyAwLCBhbmQgMTFQTSBpcyAyMy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEhvdXIoKQorICAgICAgICB7IHJldHVybiBfaDsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWludXRlLW9mLWhvdXIuIFJhbmdlIGZyb20gMCB0byA1OS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCisgICAgICAgIHsgcmV0dXJuIF9tOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlLiBSYW5nZSBmcm9tIDAgdG8gNTkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRTZWNvbmQoKQorICAgICAgICB7IHJldHVybiBfczsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCisgICAgICAgIHsgcmV0dXJuIF9mczsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSB6b25lIHNpZ24uIEZvciB0aW1lIHpvbmVzIGVhc3Qgb2YgR01ULAorICAgICAqIHRoaXMgaXMgcG9zaXRpdmU7IGZvciB0aW1lIHpvbmVzIHdlc3QsIHRoaXMgaXMgbmVnYXRpdmUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRUaW1lWm9uZVNpZ24oKQorICAgICAgICB7IHJldHVybiBfdHpzaWduOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgaG91ci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKKyAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lSG91cigpCisgICAgICAgIHsgcmV0dXJuIF90emg7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgorICAgICAqCisgICAgICogVGhpcyBpcyBhbHdheXMgcG9zaXRpdmU6IGZvciB0aGUgc2lnbiwgbG9vayBhdAorICAgICAqIGdldFRpbWVab25lU2lnbigpLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGltZVpvbmVNaW51dGUoKQorICAgICAgICB7IHJldHVybiBfdHptOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb3VuZGVkIG1pbGxpc2Vjb25kIHZhbHVlLiBSYW5nZSBmcm9tIDAgdG8gOTk5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaWxsaXNlY29uZCgpCisgICAgeworICAgICAgICBpZiAoX2ZzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIF9mcy5zZXRTY2FsZSgzLCBCaWdEZWNpbWFsLlJPVU5EX0hBTEZfVVApLnVuc2NhbGVkVmFsdWUoKS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBTcGVjaWZpYyBtb21lbnRzIG9yCisgICAgICogdGltZXMtb2YtZGF5IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lIGFyZSBub3JtYWxpemVkIHRvCisgICAgICogVVRDIHRpbWUgdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBzdHJpbmcgZm9ybSBmb3IgdGhlbS4KKyAgICAgKiBPdGhlciByZWN1cnJpbmcgdGltZSBzcGVjaWZpY2F0aW9ucyBrZWVwIHRoZWlyIHRpbWV6b25lCisgICAgICogaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxTdHJpbmcoKQorICAgIHsKKyAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBHRGF0ZSBjb3JyZXNwb25kcyB0byBhIHZhbGlkIGdyZWdvcmlhbiBkYXRlIHZhbHVlCisgICAgICogaW4gWE1MIHNjaGVtYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuaXNWYWxpZEdEYXRlKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEp1bGlhbiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBHcmVnb3JpYW4gZGF0ZS4KKyAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCisgICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEp1bGlhbkRhdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdEYXRlQnVpbGRlci5qdWxpYW5EYXRlRm9yR0RhdGUodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGFuIHtAbGluayBYbWxDYWxlbmRhcn0uCisgICAgICogPHA+CisgICAgICoge0BsaW5rIFhtbENhbGVuZGFyfSBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXJ9CisgICAgICogd2hpY2ggaXMgc2xpZ2h0bHkgY3VzdG9taXplZCB0byBtYXRjaCBYTUwgc2NoZW1hIGRhdGUgcnVsZXMuCisgICAgICogPHA+CisgICAgICogVGhlIHJldHVybmVkIHtAbGluayBYbWxDYWxlbmRhcn0gaGFzIG9ubHkgdGhvc2UgdGltZSBhbmQgZGF0ZSBmaWVsZHMKKyAgICAgKiBzZXQgdGhhdCBhcmUgcmVmbGVjdGVkIGluIHRoZSBHRGF0ZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlCisgICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29udHJhY3Qgd29ya3MsIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgaXNTZXQoKSB2YW5pc2hlcworICAgICAqIGFzIHNvb24gYXMgeW91IHZpZXcgYW55IHVuc2V0IGZpZWxkIHVzaW5nIGdldCgpIG1ldGhvZHMuCisgICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoaWNoIGRhdGUgZmllbGRzCisgICAgICogYXJlIHNldCwgeW91IG11c3QgY2FsbCBpc1NldCgpIGZpcnN0IGJlZm9yZSBnZXQoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sQ2FsZW5kYXIgZ2V0Q2FsZW5kYXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxDYWxlbmRhcih0aGlzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGltZSBhcyBhIGphdmEudXRpbC5EYXRlCisgICAgICogaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gR0RhdGVCdWlsZGVyLmRhdGVGb3JHRGF0ZSh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJpc29uIHRvIGFub3RoZXIgR0RhdGUuCisgICAgICogPHVsPgorICAgICAqIDxsaT5SZXR1cm5zIC0xIGlmIHRoaXMgPCBkYXRlLiAobGVzcy10aGFuKQorICAgICAqIDxsaT5SZXR1cm5zIDAgaWYgdGhpcyA9PSBkYXRlLiAoZXF1YWwpCisgICAgICogPGxpPlJldHVybnMgMSBpZiB0aGlzID4gZGF0ZS4gKGdyZWF0ZXItdGhhbikKKyAgICAgKiA8bGk+UmV0dXJucyAyIGlmIHRoaXMgPD4gZGF0ZS4gKGluY29tcGFyYWJsZSkKKyAgICAgKiA8L3VsPgorICAgICAqIFR3byBpbnN0YW5jZXMgYXJlIGluY29tcGFyYWJsZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IGFtb3VudHMKKyAgICAgKiBvZiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUb0dEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlc3BlYykKKyAgICB7CisgICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuY29tcGFyZUdEYXRlKHRoaXMsIGRhdGVzcGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgY29kZSBmb3IgdGhlIHNoYXBlIG9mIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlLCBvciAwIGlmIHRoZQorICAgICAqIGluc3RhbmNlIGRvZXNuJ3QgY29udGFpbiBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEKKyAgICAgKiBTY2hlbWEgdHlwZS4KKyAgICAgKiA8cD4gCisgICAgICogVmFsdWUgd2lsbCBiZSBlcXVhbCB0bworICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19OT1RfQlVJTFRJTn0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUn0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUl9NT05USH0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEh9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIX0RBWX0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfREFZfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURX0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEVfVElNRX0sIG9yCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX1RJTUV9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBHRGF0ZUJ1aWxkZXIuYnRjRm9yRmxhZ3MoX2JpdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkdXJhdGlvbiB0byB0aGlzIEdEYXRlLCBhbmQgcmV0dXJucyBhIG5ldyBHRGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0RhdGUgYWRkKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICBHRGF0ZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIodGhpcyk7CisgICAgICAgIGJ1aWxkZXIuYWRkR0R1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9HRGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBkdXJhdGlvbiB0byB0aGlzIEdEYXRlLCBhbmQgcmV0dXJucyBhIG5ldyBHRGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0RhdGUgc3VidHJhY3QoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIEdEYXRlQnVpbGRlciBidWlsZGVyID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKKyAgICAgICAgYnVpbGRlci5zdWJ0cmFjdEdEdXJhdGlvbihkdXJhdGlvbik7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvR0RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHRGF0ZSBpcyBhbiBpbW11dGFibGUgY2xhc3MsIGFuZCBlcXVhbGl0eSBpcyBjb21wdXRlZCBiYXNlZAorICAgICAqIG9uIGl0cyBjYW5vbmljYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCisgICAgeworICAgICAgICBpZiAob2JqID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgR0RhdGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGVuc3VyZUNhbm9uaWNhbFN0cmluZygpOworICAgICAgICByZXR1cm4gX2Nhbm9uaWNhbFN0cmluZy5lcXVhbHMoKChHRGF0ZSlvYmopLmNhbm9uaWNhbFN0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIEdEYXRlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBfY2Fub25pY2FsU3RyaW5nLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKKyAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KKyAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgorICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKKyAgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ2Fub25pY2FsU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmIChfY2Fub25pY2FsU3RyaW5nICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYm9vbGVhbiBuZWVkTm9ybWFsaXplID0KKyAgICAgICAgICAgIChoYXNUaW1lWm9uZSgpICYmIGdldFRpbWVab25lU2lnbigpICE9IDAgJiYgaGFzVGltZSgpICYmCisgICAgICAgICAgICAoKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkpOworCisgICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSAmJiBnZXRGcmFjdGlvbigpICE9IG51bGwgJiYgZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9IGdldEZyYWN0aW9uKCkudW5zY2FsZWRWYWx1ZSgpOworICAgICAgICAgICAgbmVlZE5vcm1hbGl6ZSA9IChiaS5tb2QoR0RhdGVCdWlsZGVyLlRFTikuc2lnbnVtKCkgPT0gMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW5lZWROb3JtYWxpemUpCisgICAgICAgICAgICBfY2Fub25pY2FsU3RyaW5nID0gdG9TdHJpbmcoKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBHRGF0ZUJ1aWxkZXIgZ2RiID0gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgIGdkYi5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgIF9jYW5vbmljYWxTdHJpbmcgPSBnZGIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYXR1cmFsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlLCBpbmNsdWRpbmcgdGltZXpvbmUuIEZvciB0eXBlcyB0aGF0IGNvcnJlc3BvbmQKKyAgICAgKiB0byBkZWZpbmVkIHNjaGVtYSB0eXBlcyAoc2NoZW1hQnVpbHRpblR5cGVDb2RlKCkgPiAwKSwKKyAgICAgKiB0aGlzIHByb3ZpZGVzIHRoZSBuYXR1cmFsIGxleGljYWwgcmVwcmVzZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogV2hlbiBib3RoIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBzcGVjaWZpZWQsIHRoaXMgc3RyaW5nIGlzIG5vdAorICAgICAqIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIHRoZSB0aW1lem9uZSBpcyBVVEMgKFopCisgICAgICogKHNpbmNlIHRoZSBzYW1lIG1vbWVudCBpbiB0aW1lIGNhbiBiZSBleHByZXNzZWQgaW4gZGlmZmVyZW50CisgICAgICogdGltZXpvbmVzKS4gVG8gZ2V0IGEgY2Fub25pY2FsIHN0cmluZywgdXNlIHRoZSBjYW5vbmljYWxTdHJpbmcoKQorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmIChfc3RyaW5nID09IG51bGwpCisgICAgICAgICAgICBfc3RyaW5nID0gZm9ybWF0R0RhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBfc3RyaW5nOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBfdGVuc0RpZ2l0ID0KKyAgICB7CisgICAgICAgICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCcsICcwJywKKyAgICAgICAgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLCAnMScsICcxJywgJzEnLAorICAgICAgICAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsICcyJywgJzInLCAnMicsCisgICAgICAgICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywgJzMnLCAnMycsICczJywKKyAgICAgICAgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLCAnNCcsICc0JywgJzQnLAorICAgICAgICAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsICc1JywgJzUnLCAnNScsCisgICAgICAgICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywgJzYnLCAnNicsICc2JywKKyAgICAgICAgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLCAnNycsICc3JywgJzcnLAorICAgICAgICAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsICc4JywgJzgnLCAnOCcsCisgICAgICAgICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywgJzknLCAnOScsICc5JywKKyAgICB9OworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNoYXJbXSBfb25lc0RpZ2l0ID0KKyAgICB7CisgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9wYWRUd29BcHBlbmQoY2hhcltdIGIsIGludCBpLCBpbnQgbikKKyAgICB7CisgICAgICAgIGFzc2VydChuID49IDAgJiYgbiA8IDEwMCk7CisgICAgICAgIGJbaV0gPSBfdGVuc0RpZ2l0W25dOworICAgICAgICBiW2kgKyAxXSA9IF9vbmVzRGlnaXRbbl07CisgICAgICAgIHJldHVybiBpICsgMjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX3BhZEZvdXJBcHBlbmQoY2hhcltdIGIsIGludCBpLCBpbnQgbikKKyAgICB7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgYltpKytdID0gJy0nOworICAgICAgICAgICAgbiA9IC1uOworICAgICAgICB9CisgICAgICAgIGlmIChuID49IDEwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IEludGVnZXIudG9TdHJpbmcobik7CisgICAgICAgICAgICBzLmdldENoYXJzKDAsIHMubGVuZ3RoKCksIGIsIGkpOworICAgICAgICAgICAgcmV0dXJuIGkgKyBzLmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIGludCBxID0gbiAvIDEwMDsKKyAgICAgICAgaW50IHIgPSBuIC0gcSAqIDEwMDsKKyAgICAgICAgYltpXSA9IF90ZW5zRGlnaXRbcV07CisgICAgICAgIGJbaSArIDFdID0gX29uZXNEaWdpdFtxXTsKKyAgICAgICAgYltpICsgMl0gPSBfdGVuc0RpZ2l0W3JdOworICAgICAgICBiW2kgKyAzXSA9IF9vbmVzRGlnaXRbcl07CisgICAgICAgIHJldHVybiBpICsgNDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGltZVpvbmUgR01UWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZVtdIE1JTlVTWk9ORSA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMDowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDE6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTAyOjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMzowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDQ6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA1OjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wNjowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMDc6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA4OjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wOTowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTA6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTExOjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0xMjowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQtMTM6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTE0OjAwIiksCisgICAgICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVab25lW10gUExVU1pPTkUgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDA6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzAxOjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswMjowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDM6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA0OjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNTowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDY6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA3OjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswODowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDk6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzEwOjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxMTowMCIpLAorICAgICAgICAgICAgICAgIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMTI6MDAiKSwKKyAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzEzOjAwIiksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCsxNDowMCIpLAorICAgICAgICAgICAgfTsKKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFRpbWVab25lIHRpbWVab25lRm9yR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCisgICAgeworICAgICAgICAvLyB1c2UgYSBjYWNoZWQgdGltZXpvbmUgaWYgaW50ZWdyYWw7IG90aGVyd2lzZSBtYWtlIGEgbmV3IG9uZS4KKyAgICAgICAgaWYgKCFkYXRlLmhhc1RpbWVab25lKCkpCisgICAgICAgICAgICByZXR1cm4gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEdNVFpPTkU7CisgICAgICAgIGlmIChkYXRlLmdldFRpbWVab25lTWludXRlKCkgPT0gMCAmJiBkYXRlLmdldFRpbWVab25lSG91cigpIDw9IDE0ICYmIGRhdGUuZ2V0VGltZVpvbmVIb3VyKCkgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFRpbWVab25lU2lnbigpIDwgMCA/IE1JTlVTWk9ORVtkYXRlLmdldFRpbWVab25lSG91cigpXSA6IFBMVVNaT05FW2RhdGUuZ2V0VGltZVpvbmVIb3VyKCldOworICAgICAgICAKKyAgICAgICAgY2hhcltdIHpiID0gbmV3IGNoYXJbOV07CisgICAgICAgIHpiWzBdID0gJ0cnOworICAgICAgICB6YlsxXSA9ICdNJzsKKyAgICAgICAgemJbMl0gPSAnVCc7CisgICAgICAgIHpiWzNdID0gKGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPCAwKSA/ICctJyA6ICcrJzsKKyAgICAgICAgR0RhdGUuX3BhZFR3b0FwcGVuZCh6YiwgNCwgZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSk7CisgICAgICAgIHpiWzZdID0gJzonOworICAgICAgICBHRGF0ZS5fcGFkVHdvQXBwZW5kKHpiLCA3LCBkYXRlLmdldFRpbWVab25lTWludXRlKCkpOworICAgICAgICByZXR1cm4gVGltZVpvbmUuZ2V0VGltZVpvbmUobmV3IFN0cmluZyh6YikpOworICAgIH0KKyAgICAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgZm9ybWF0R0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIHNwZWMpCisgICAgeworICAgICAgICAvLyBXZSd2ZSB1c2VkIGEgY2hhcltdIHJhdGhlciB0aGFuIGEgU3RyaW5nQnVmZmVyIGZvciBhIDR4IHNwZWVkdXAKKyAgICAgICAgLy8gLVlZKDEwKVlZLU1NLUREVEhIOk1NOlNTLkZGRkZGRitaSDpaTQorICAgICAgICAvLyAxICsgMTAgICArIDMrIDMrIDMrIDMrIDMrMSArIHMgKyAzKyAzID0gMzMgKyBzCisgICAgICAgIEJpZ0RlY2ltYWwgZnMgPSBzcGVjLmdldEZyYWN0aW9uKCk7CisgICAgICAgIGNoYXJbXSBtZXNzYWdlID0gbmV3IGNoYXJbMzMgKyAoZnMgPT0gbnVsbCA/IDAgOiBmcy5zY2FsZSgpKV07CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICBpZiAoc3BlYy5oYXNZZWFyKCkgfHwgc3BlYy5oYXNNb250aCgpIHx8IHNwZWMuaGFzRGF5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRteTogeworICAgICAgICAgICAgICAgIGlmIChzcGVjLmhhc1llYXIoKSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IF9wYWRGb3VyQXBwZW5kKG1lc3NhZ2UsIDAsIHNwZWMuZ2V0WWVhcigpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICctJzsKKworICAgICAgICAgICAgICAgIGlmICghKHNwZWMuaGFzTW9udGgoKSB8fCBzcGVjLmhhc0RheSgpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG15OworCisgICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJy0nOworICAgICAgICAgICAgICAgIGlmIChzcGVjLmhhc01vbnRoKCkpCisgICAgICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0TW9udGgoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXNwZWMuaGFzRGF5KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIGRteTsKKworICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICctJzsKKyAgICAgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldERheSgpKTsKKyAgICAgICAgICAgICAgICBicmVhayBkbXk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3BlYy5oYXNUaW1lKCkpCisgICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJ1QnOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNwZWMuaGFzVGltZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldEhvdXIoKSk7CisgICAgICAgICAgICBtZXNzYWdlW2krK10gPSAnOic7CisgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldE1pbnV0ZSgpKTsKKyAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKKyAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0U2Vjb25kKCkpOworICAgICAgICAgICAgaWYgKGZzICE9IF96ZXJvKSAvLyAob3B0aW1pemF0aW9uIH4zJSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnJhYyA9IHNwZWMuZ2V0RnJhY3Rpb24oKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGludCBwb2ludCA9IGZyYWMuaW5kZXhPZignLicpOworICAgICAgICAgICAgICAgIGlmIChwb2ludCA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhYy5nZXRDaGFycyhwb2ludCwgZnJhYy5sZW5ndGgoKSwgbWVzc2FnZSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gZnJhYy5sZW5ndGgoKSAtIHBvaW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcGVjLmhhc1RpbWVab25lKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcGVjLmdldFRpbWVab25lU2lnbigpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVzc2FnZVtpKytdID0gJ1onOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9IHNwZWMuZ2V0VGltZVpvbmVTaWduKCkgPiAwID8gJysnIDogJy0nOworICAgICAgICAgICAgICAgIGkgPSBfcGFkVHdvQXBwZW5kKG1lc3NhZ2UsIGksIHNwZWMuZ2V0VGltZVpvbmVIb3VyKCkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2VbaSsrXSA9ICc6JzsKKyAgICAgICAgICAgICAgICBpID0gX3BhZFR3b0FwcGVuZChtZXNzYWdlLCBpLCBzcGVjLmdldFRpbWVab25lTWludXRlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaXQgd291bGQgYmUgbmljZSB0byB1c2UgKDAsIGksIG1lc3NhZ2UpIGN0b3IgaW5zdGVhZAorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhtZXNzYWdlLCAwLCBpKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEYXRlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjRjODAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNDU2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBHRGF0ZSBHRGF0ZXN9LgorICogPHA+CisgKiBMaWtlIEdEYXRlLCBhIEdEYXRlQnVpbGRlciByZXByZXNlbnRzIGFuIEdyZWdvcmlhbiBEYXRlLCBUaW1lLAorICogYW5kIFRpbWV6b25lLCBvciBzdWJzZXQgb2YgaW5mb3JtYXRpb24gKFllYXIsIE1vbnRoLCBEYXksCisgKiBUaW1lLCBUaW1lem9uZSwgb3Igc29tZSBjb21iaW5hdGlvbikuIFdoZXJldmVyIGl0IHByb3ZpZGVzCisgKiBndWlkYW5jZSwgdGhlIFhNTCBTY2hlbWEgMS4wIHNwZWNpZmljYXRpb24gKHBsdXMgcHVibGlzaGVkCisgKiBlcnJhdGEpIGlzIGZvbGxvd2VkLgorICogPHA+CisgKiBJbnN0YW5jZXMgbWF5IHNlcGFyYXRlbHkgc2V0IG9yIGNsZWFyIHRoZSB5ZWFyLCBtb250aCwKKyAqIGRheS1vZi1tb250aCwgYW5kIHRpbWUtb2YtZGF5LiBOb3QgYWxsIG9wZXJhdGlvbnMgYXJlCisgKiBtZWFuaW5nZnVsIG9uIGFsbCBjb21iaW5hdGlvbnMuIEluIHBhcnRpY3VsYXIsIHRpbWV6b25lCisgKiBub3JtYWxpemF0aW9uIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlcmUgaXMgYSB0aW1lLCBvcgorICogYSB0aW1lIHRvZ2V0aGVyIHdpdGggYSBmdWxsIGRhdGUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHRGF0ZUJ1aWxkZXIgaW1wbGVtZW50cyBHRGF0ZVNwZWNpZmljYXRpb24sIGphdmEuaW8uU2VyaWFsaXphYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgX2JpdHM7CisgICAgcHJpdmF0ZSBpbnQgX0NZOworICAgIHByaXZhdGUgaW50IF9NOworICAgIHByaXZhdGUgaW50IF9EOworICAgIHByaXZhdGUgaW50IF9oOworICAgIHByaXZhdGUgaW50IF9tOworICAgIHByaXZhdGUgaW50IF9zOworICAgIHByaXZhdGUgQmlnRGVjaW1hbCBfZnM7CisgICAgcHJpdmF0ZSBpbnQgX3R6c2lnbjsKKyAgICBwcml2YXRlIGludCBfdHpoOworICAgIHByaXZhdGUgaW50IF90em07CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGVCdWlsZGVyIHNwZWNpZnlpbmcgbm8gZGF0ZSBvciB0aW1lCisgICAgICovCisgICAgcHVibGljIEdEYXRlQnVpbGRlcigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbm90aGVyIEdEYXRlQnVpbGRlciB3aXRoIHRoZSBzYW1lIHZhbHVlCisgICAgICogYXMgdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEdEYXRlQnVpbGRlcih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBHRGF0ZSBmcm9tIHRoaXMgR0RhdGVCdWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBHRGF0ZSB0b0dEYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR0RhdGUodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydXRzIGEgR0RhdGVCdWlsZGVyIGJ5IGNvcHlpbmcgYW5vdGhlciBHRGF0ZVNwZWNpZmljYWl0b24uCisgICAgICovCisgICAgcHVibGljIEdEYXRlQnVpbGRlcihHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGUpCisgICAgeworICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSkKKyAgICAgICAgICAgIHNldFRpbWVab25lKGdkYXRlLmdldFRpbWVab25lU2lnbigpLCBnZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSwgZ2RhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSk7CisKKyAgICAgICAgaWYgKGdkYXRlLmhhc1RpbWUoKSkKKyAgICAgICAgICAgIHNldFRpbWUoZ2RhdGUuZ2V0SG91cigpLCBnZGF0ZS5nZXRNaW51dGUoKSwgZ2RhdGUuZ2V0U2Vjb25kKCksIGdkYXRlLmdldEZyYWN0aW9uKCkpOworCisgICAgICAgIGlmIChnZGF0ZS5oYXNEYXkoKSkKKyAgICAgICAgICAgIHNldERheShnZGF0ZS5nZXREYXkoKSk7CisKKyAgICAgICAgaWYgKGdkYXRlLmhhc01vbnRoKCkpCisgICAgICAgICAgICBzZXRNb250aChnZGF0ZS5nZXRNb250aCgpKTsKKworICAgICAgICBpZiAoZ2RhdGUuaGFzWWVhcigpKQorICAgICAgICAgICAgc2V0WWVhcihnZGF0ZS5nZXRZZWFyKCkpOworICAgIH0KKworICAgIC8vIEZvcm1zOgorCisgICAgLy8gRGF0ZSBwYXJ0OgorICAgIC8vIFllYXI6ICAgICAgICgtP1xkezQsfSkKKyAgICAvLyBZZWFyTW9udGg6ICAoLT9cZHs0LH0pLShcZHsyfSkKKyAgICAvLyBEYXRlOiAgICAgICAoLT9cZHs0LH0pLShcZHsyfSktKFxkezJ9KQorICAgIC8vIE1vbnRoOiAgICAgIC0tKFxkezJ9KSgtLSk/ICAgICAgICAgICAgICAvL2VycmF0YSBSLTQ4CisgICAgLy8gTW9udGhEYXk6ICAgLS0oXGR7Mn0pLShcZHsyfSkKKyAgICAvLyBEYXk6ICAgICAgICAtLS0oXGR7Mn0pCisKKyAgICAvLyBUaW1lIHBhcnQ6CisgICAgLy8gVGltZTogICAgICAgKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoLlxkKik/CisKKyAgICAvLyBUaW1lem9uZSBwYXJ0OgorICAgIC8vIFRaOiAgICAgICAgIChaKXwoWystXVxkezJ9KTooXGR7Mn0pCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGVCdWlsZGVyIGZyb20gYSBsZXhpY2FsCisgICAgICogcmVwcmVzZW50YXRpb24uIFRoZSBsZXhpY2FsIHNwYWNlIGNvbnRhaW5zIHRoZQorICAgICAqIHVuaW9uIG9mIHRoZSBsZXhpY2FsIHNwYWNlcyBvZiBhbGwgdGhlIHNjaGVtYQorICAgICAqIGRhdGUvdGltZSB0eXBlcyAoZXhjZXB0IGZvciBkdXJhdGlvbikuCisgICAgICovCisgICAgcHVibGljIEdEYXRlQnVpbGRlcihDaGFyU2VxdWVuY2Ugc3RyaW5nKQorICAgIHsKKyAgICAgICAgdGhpcyhuZXcgR0RhdGUoc3RyaW5nKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgR0RhdGVCdWlsZGVyKENhbGVuZGFyIGNhbGVuZGFyKQorICAgIHsKKyAgICAgICAgdGhpcyhuZXcgR0RhdGUoY2FsZW5kYXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgR0RhdGVCdWlsZGVyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwgZGF5LAorICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmRzLCBpbgorICAgICAqIGFuIHVuc3BlY2lmaWVkIHRpbWV6b25lLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBieSBub3Qgc3BlY2lmeWluZyB0aGUgdGltZXpvbmUgdGhlIEdEYXRlQnVpbGRlcgorICAgICAqIGJlY29tZXMgcGFydGlhbGx5IHVub3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gdGltZXN0aGF0IGRvIGhhdmUgYQorICAgICAqIHNwZWNpZmllZCB0aW1lem9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0geWVhciBUaGUgeWVhcgorICAgICAqIEBwYXJhbSBtb250aCBUaGUgbW9udGgsIGZyb20gMS0xMgorICAgICAqIEBwYXJhbSBkYXkgVGhlIGRheSBvZiBtb250aCwgZnJvbSAxLTMxCisgICAgICogQHBhcmFtIGhvdXIgVGhlIGhvdXIgb2YgZGF5LCBmcm9tIDAtMjMKKyAgICAgKiBAcGFyYW0gbWludXRlIFRoZSBtaW51dGUgb2YgaG91ciwgZnJvbSAwLTU5CisgICAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIG9mIG1pbnV0ZSwgZnJvbSAwLTU5CisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBmcmFjdGlvbiBvZiBzZWNvbmQsIDAuMCB0byAwLjk5OS4uLiAobWF5IGJlIG51bGwpIAorICAgICAqLworICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoCisgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgIGludCBtb250aCwKKyAgICAgICAgICAgIGludCBkYXksCisgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgIGludCBtaW51dGUsCisgICAgICAgICAgICBpbnQgc2Vjb25kLAorICAgICAgICAgICAgQmlnRGVjaW1hbCBmcmFjdGlvbikKKyAgICB7CisgICAgICAgIF9iaXRzID0gSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUU7CisKKyAgICAgICAgX0NZID0geWVhcjsKKyAgICAgICAgX00gPSBtb250aDsKKyAgICAgICAgX0QgPSBkYXk7CisgICAgICAgIF9oID0gaG91cjsKKyAgICAgICAgX20gPSBtaW51dGU7CisgICAgICAgIF9zID0gc2Vjb25kOworICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGFic29sdXRlIEdEYXRlQnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgeWVhciwKKyAgICAgKiBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsIGZyYWN0aW9uYWwKKyAgICAgKiBzZWNvbmRzLCBhbmQgaW4gdGhlIHRpbWV6b25lIHNwZWNpZmllZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgeW91IGNhbiByZWV4cHJlc3MgdGhlIEdEYXRlQnVpbGRlciBpbiBhbnkgdGltZXpvbmUgdXNpbmcKKyAgICAgKiBub3JtYWxpemVUb1RpbWVab25lKCkuIFRoZSBub3JtYWxpemUoKSBtZXRob2Qgbm9ybWFsaXplcyB0byBVVEMuCisgICAgICogPHA+CisgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBhIHRpbWUgb3IgZGF0ZSB0aGF0IGlzbid0IGluIGEgc3BlY2lmaWVkIHRpbWV6b25lLAorICAgICAqIHRoZW4gdXNlIHRoZSBjb25zdHJ1Y3RvciB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHRpbWV6b25lIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5ZWFyIHRoZSB5ZWFyCisgICAgICogQHBhcmFtIG1vbnRoIHRoZSBtb250aCwgZnJvbSAxLTEyCisgICAgICogQHBhcmFtIGRheSB0aGUgZGF5IG9mIG1vbnRoLCBmcm9tIDEtMzEKKyAgICAgKiBAcGFyYW0gaG91ciB0aGUgaG91ciBvZiBkYXksIGZyb20gMC0yMworICAgICAqIEBwYXJhbSBtaW51dGUgdGhlIG1pbnV0ZSBvZiBob3VyLCBmcm9tIDAtNTkKKyAgICAgKiBAcGFyYW0gc2Vjb25kIHRoZSBzZWNvbmQgb2YgbWludXRlLCBmcm9tIDAtNTkKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGhlIGZyYWN0aW9uIG9mIHNlY29uZCwgMC4wIHRvIDAuOTk5Li4uIChtYXkgYmUgbnVsbCkKKyAgICAgKiBAcGFyYW0gdHpTaWduIHRoZSB0aW1lem9uZSBvZmZzZXQgc2lnbiwgZWl0aGVyICsxLCAwLCBvciAtMQorICAgICAqIEBwYXJhbSB0ekhvdXIgdGhlIHRpbWV6b25lIG9mZnNldCBob3VyCisgICAgICogQHBhcmFtIHR6TWludXRlIHRoZSB0aW1lem9uZSBvZmZzZXQgbWludXRlIAorICAgICAqLworICAgIHB1YmxpYyBHRGF0ZUJ1aWxkZXIoCisgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgIGludCBtb250aCwKKyAgICAgICAgICAgIGludCBkYXksCisgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgIGludCBtaW51dGUsCisgICAgICAgICAgICBpbnQgc2Vjb25kLAorICAgICAgICAgICAgQmlnRGVjaW1hbCBmcmFjdGlvbiwKKyAgICAgICAgICAgIGludCB0elNpZ24sCisgICAgICAgICAgICBpbnQgdHpIb3VyLAorICAgICAgICAgICAgaW50IHR6TWludXRlKQorICAgIHsKKyAgICAgICAgX2JpdHMgPSBIQVNfVElNRVpPTkUgfCBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRTsKKworICAgICAgICBfQ1kgPSB5ZWFyOworICAgICAgICBfTSA9IG1vbnRoOworICAgICAgICBfRCA9IGRheTsKKyAgICAgICAgX2ggPSBob3VyOworICAgICAgICBfbSA9IG1pbnV0ZTsKKyAgICAgICAgX3MgPSBzZWNvbmQ7CisgICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOworICAgICAgICBfdHpzaWduID0gdHpTaWduOworICAgICAgICBfdHpoID0gdHpIb3VyOworICAgICAgICBfdHptID0gdHpNaW51dGU7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEdEYXRlQnVpbGRlciBiYXNlZCBvbiBhIGphdmEudXRpbC5EYXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjdXJyZW50IG9mZnNldCBvZiB0aGUgZGVmYXVsdCB0aW1lem9uZSBpcyB1c2VkIGFzIHRoZSB0aW1lem9uZS4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgZWFzdGVybiBkYXlsaWdodCB0aW1lIGlzIGluIGVmZmVjdCBhdCB0aGUgZ2l2ZW4KKyAgICAgKiBkYXRlLCB0aGUgdGltZXpvbmUgb24gdGhlIGVhc3QgY29hc3Qgb2YgdGhlIHVuaXRlZCBzdGF0ZXMKKyAgICAgKiB0cmFuc2xhdGVzIHRvIEdNVC0wNTowMCAoRVNUKSArIDE6MDAgKERUIG9mZnNldCkgPT0gR01ULTA0OjAwLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIG9iamVjdCB0byBjb3B5CisgICAgICovCisgICAgcHVibGljIEdEYXRlQnVpbGRlcihEYXRlIGRhdGUpCisgICAgeworICAgICAgICBzZXREYXRlKGRhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGluc3RhbmNlIGlzIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGluZGljYXRpbmcgdGhlIGluZm9ybWF0aW9uCisgICAgICogY29udGFpbmVkIGJ5IHRoaXMgR0RhdGUuICBUaGUgZml2ZSBmbGFncyBhcmUKKyAgICAgKiBIQVNfVElNRVpPTkUsIEhBU19ZRUFSLCBIQVNfTU9OVEgsIEhBU19EQVksIGFuZCBIQVNfVElNRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZsYWdzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfYml0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgdGltZXpvbmUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzVGltZVpvbmUoKQorICAgICAgICB7IHJldHVybiAoKF9iaXRzICYgSEFTX1RJTUVaT05FKSAhPSAwKTsgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGRhdGUvdGltZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIHllYXIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzWWVhcigpCisgICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfWUVBUikgIT0gMCk7IH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBtb250aC1vZi15ZWFyLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vbnRoKCkKKyAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19NT05USCkgIT0gMCk7IH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBkYXktb2YtbW9udGguCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRGF5KCkKKyAgICAgICAgeyByZXR1cm4gKChfYml0cyAmIEhBU19EQVkpICE9IDApOyB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgdGltZS1vZi1kYXkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzVGltZSgpCisgICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiBIQVNfVElNRSkgIT0gMCk7IH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBmdWxsIGRhdGUgKHllYXIsIG1vbnRoLCBkYXkpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRGF0ZSgpCisgICAgICAgIHsgcmV0dXJuICgoX2JpdHMgJiAoSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSKSkgPT0gKEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUikpOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB5ZWFyLiBTaG91bGQgYmUgYSBmb3VyLWRpZ2l0IHllYXIgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFllYXIoKQorICAgICAgICB7IHJldHVybiBfQ1k7ICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyLiBKYW51YXJ5IGlzIDEuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRNb250aCgpCisgICAgICAgIHsgcmV0dXJuIF9NOyAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoLiBUaGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGggaXMgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERheSgpCisgICAgICAgIHsgcmV0dXJuIF9EOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheS4gTWlkbmlnaHQgaXMgMCwgYW5kIDExUE0gaXMgMjMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRIb3VyKCkKKyAgICAgICAgeyByZXR1cm4gX2g7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyLiBSYW5nZSBmcm9tIDAgdG8gNTkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRNaW51dGUoKQorICAgICAgICB7IHJldHVybiBfbTsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZS4gUmFuZ2UgZnJvbSAwIHRvIDU5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0U2Vjb25kKCkKKyAgICAgICAgeyByZXR1cm4gX3M7IH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQmlnRGVjaW1hbCBnZXRGcmFjdGlvbigpCisgICAgICAgIHsgcmV0dXJuIF9mczsgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb3VuZGVkIG1pbGxpc2Vjb25kIHZhbHVlLiBSYW5nZSBmcm9tIDAgdG8gOTk5CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRNaWxsaXNlY29uZCgpCisgICAgeworICAgICAgICBpZiAoX2ZzID09IG51bGwgfHwgX2ZzID09IEdEYXRlLl96ZXJvKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBfZnMuc2V0U2NhbGUoMywgQmlnRGVjaW1hbC5ST1VORF9IQUxGX1VQKS51bnNjYWxlZFZhbHVlKCkuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgc2lnbi4gRm9yIHRpbWUgem9uZXMgZWFzdCBvZiBHTVQsCisgICAgICogdGhpcyBpcyBwb3NpdGl2ZTsgZm9yIHRpbWUgem9uZXMgd2VzdCwgdGhpcyBpcyBuZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lU2lnbigpCisgICAgICAgIHsgcmV0dXJuIF90enNpZ247IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBob3VyLgorICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKKyAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lSG91cigpCisgICAgICAgIHsgcmV0dXJuIF90emg7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBtaW51dGVzLgorICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKKyAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFRpbWVab25lTWludXRlKCkKKyAgICAgICAgeyByZXR1cm4gX3R6bTsgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgeWVhci4gU2hvdWxkIGJlIGEgZm91ci1kaWdpdCB5ZWFyIHNwZWNpZmljYXRpb24uCisgICAgICogQHBhcmFtIHllYXIgdGhlIHllYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRZZWFyKGludCB5ZWFyKQorICAgIHsKKyAgICAgICAgaWYgKHllYXIgPCAtNDcxMiB8fCB5ZWFyID4gOTk5OTk5KQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieWVhciBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgX2JpdHMgfD0gSEFTX1lFQVI7IF9DWSA9IHllYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbW9udGgtb2YteWVhci4gSmFudWFyeSBpcyAxLgorICAgICAqIEBwYXJhbSBtb250aCB0aGUgbW9udGgsIGZyb20gMS0xMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vbnRoKGludCBtb250aCkKKyAgICB7CisgICAgICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1vbnRoIG91dCBvZiByYW5nZSIpOworICAgICAgICBfYml0cyB8PSBIQVNfTU9OVEg7IF9NID0gbW9udGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGF5LW9mLW1vbnRoLiBUaGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGggaXMgMS4KKyAgICAgKiBAcGFyYW0gZGF5IHRoZSBkYXkgb2YgbW9udGgsIGZyb20gMS0zMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERheShpbnQgZGF5KQorICAgIHsKKyAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXkgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIF9iaXRzIHw9IEhBU19EQVk7IF9EID0gZGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWUuIEhvdXJzIGluIHRoZSBkYXkgcmFuZ2UgZnJvbSAwIHRvIDIzOworICAgICAqIG1pbnV0ZXMgYW5kIHNlY29uZHMgcmFuZ2UgZnJvbSAwIHRvIDU5OyBhbmQgZnJhY3Rpb25hbAorICAgICAqIHNlY29uZHMgcmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCisgICAgICogVGhlIGZyYWN0aW9uIGNhbiBiZSBudWxsIGFuZCBpcyBhc3N1bWVkIHRvIGJlIHplcm8uCisgICAgICogQHBhcmFtIGhvdXIgdGhlIGhvdXIgb2YgZGF5LCBmcm9tIDAtMjMKKyAgICAgKiBAcGFyYW0gbWludXRlIHRoZSBtaW51dGUgb2YgaG91ciwgZnJvbSAwLTU5CisgICAgICogQHBhcmFtIHNlY29uZCB0aGUgc2Vjb25kIG9mIG1pbnV0ZSwgZnJvbSAwLTU5CisgICAgICogQHBhcmFtIGZyYWN0aW9uIHRoZSBmcmFjdGlvbiBvZiBzZWNvbmQsIDAuMCB0byAwLjk5OS4uLiAobWF5IGJlIG51bGwpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZShpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgQmlnRGVjaW1hbCBmcmFjdGlvbikKKyAgICB7CisgICAgICAgIGlmIChob3VyIDwgMCB8fCBob3VyID4gMjMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJob3VyIG91dCBvZiByYW5nZSIpOworICAgICAgICBpZiAobWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1pbnV0ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgaWYgKHNlY29uZCA8IDAgfHwgc2Vjb25kID4gNTkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWNvbmQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIGlmIChmcmFjdGlvbiAhPSBudWxsICYmIChmcmFjdGlvbi5zaWdudW0oKSA8IDAgfHwgZnJhY3Rpb24uY29tcGFyZVRvKEdEYXRlLl9vbmUpID4gMSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcmFjdGlvbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgX2JpdHMgfD0gSEFTX1RJTUU7CisgICAgICAgIF9oID0gaG91cjsKKyAgICAgICAgX20gPSBtaW51dGU7CisgICAgICAgIF9zID0gc2Vjb25kOworICAgICAgICBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0aW1lIHpvbmUgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3RoZXIgdGltZQorICAgICAqIGZpZWxkcy4gSWYgeW91IHdpdGggdG8gYWRqdXN0IG90aGVyIHRpbWUgZmllbGRzIHRvIGV4cHJlc3MKKyAgICAgKiB0aGUgc2FtZSBhY3R1YWwgbW9tZW50IGluIHRpbWUgaW4gYSBkaWZmZXJlbnQgdGltZSB6b25lLAorICAgICAqIHVzZSBub3JtYWxpemVUb1RpbWVab25lLgorICAgICAqIDxwPgorICAgICAqIFRpbWV6b25lcyBtdXN0IGJlIGJldHdlZW4gLTE0OjAwIGFuZCArMTQ6MDAuIFNpZ24KKyAgICAgKiBtdXN0IGJlIC0xIG9yIDEgKG9yIDAgZm9yIFVUQyBvbmx5KSwgYW5kIHRoZSBvZmZzZXQgaG91cnMKKyAgICAgKiBhbmQgbWludXRlIGFyZ3VtZW50cyBtdXN0IGJlIG5vbm5lZ2F0aXZlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0elNpZ24gdGhlIHRpbWV6b25lIG9mZnNldCBzaWduLCBlaXRoZXIgKzEsIDAsIG9yIC0xCisgICAgICogQHBhcmFtIHR6SG91ciB0aGUgdGltZXpvbmUgb2Zmc2V0IGhvdXIKKyAgICAgKiBAcGFyYW0gdHpNaW51dGUgdGhlIHRpbWV6b25lIG9mZnNldCBtaW51dGUgCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoaW50IHR6U2lnbiwgaW50IHR6SG91ciwgaW50IHR6TWludXRlKQorICAgIHsKKyAgICAgICAgaWYgKCEoKHR6U2lnbiA9PSAwICYmIHR6SG91ciA9PSAwICYmIHR6TWludXRlID09IDApIHx8CisgICAgICAgICAgICAgICgodHpTaWduID09IC0xIHx8IHR6U2lnbiA9PSAxKSAmJgorICAgICAgICAgICAgICAgKHR6SG91ciA+PSAwICYmIHR6TWludXRlID49IDApICYmCisgICAgICAgICAgICAgICAodHpIb3VyID09IDE0ICYmIHR6TWludXRlID09IDAgfHwgdHpIb3VyIDwgMTQgJiYgdHpNaW51dGUgPCA2MCkpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBvdXQgb2YgcmFuZ2UgKC0xNDowMCB0byArMTQ6MDApLiAoIiArCisgICAgICAgICAgICAgICAgKHR6U2lnbjwwID8gIi0iIDogIisiKSArIHR6SG91ciArICI6IiArIHR6TWludXRlICsgIikiKTsKKworICAgICAgICBfYml0cyB8PSBIQVNfVElNRVpPTkU7CisgICAgICAgIF90enNpZ24gPSB0elNpZ247CisgICAgICAgIF90emggPSB0ekhvdXI7CisgICAgICAgIF90em0gPSB0ek1pbnV0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZSB6b25lIGJhc2VkIG9uIGEgbnVtYmVyIG9mIG9mZnNldCBtaW51dGVzIHJhdGhlcgorICAgICAqIHRoYW4gc2lnbi9ob3VyL21pbnV0ZTsgZm9yIGV4YW1wbGUsIHNldFRpbWVab25lKC02MCkgaXMgdGhlCisgICAgICogc2FtZSBhcyBzZXRUaW1lWm9uZSgtMSwgMSwgMCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoaW50IHR6VG90YWxNaW51dGVzKQorICAgIHsKKyAgICAgICAgaWYgKHR6VG90YWxNaW51dGVzIDwgLTE0ICogNjAgfHwgdHpUb3RhbE1pbnV0ZXMgPiAxNCAqIDYwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIG91dCBvZiByYW5nZSAoLTg0MCB0byA4NDAgbWludXRlcykuICgiICsgdHpUb3RhbE1pbnV0ZXMgKyAiKSIpOworICAgICAgICAKKyAgICAgICAgaW50IHR6U2lnbiA9IHR6VG90YWxNaW51dGVzIDwgMCA/IC0xIDogdHpUb3RhbE1pbnV0ZXMgPiAwID8gMSA6IDA7CisgICAgICAgIHR6VG90YWxNaW51dGVzICo9IHR6U2lnbjsKKyAgICAgICAgaW50IHR6SCA9IHR6VG90YWxNaW51dGVzIC8gNjA7CisgICAgICAgIGludCB0ek0gPSB0elRvdGFsTWludXRlcyAtIHR6SCAqIDYwOworICAgICAgICAKKyAgICAgICAgc2V0VGltZVpvbmUodHpTaWduLCB0ekgsIHR6TSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSB5ZWFyLiBBZnRlciBjbGVhcmluZywgaGFzWWVhciByZXR1cm5zIGZhbHNlIGFuZCB0aGUKKyAgICAgKiB2YWx1ZSBvZiBnZXRZZWFyIGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclllYXIoKQorICAgICAgICB7IF9iaXRzICY9IH5IQVNfWUVBUjsgX0NZID0gMDsgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgbW9udGgtb2YteWVhci4gQWZ0ZXIgY2xlYXJpbmcuIGhhc01vbnRoIHJldHVybnMgZmFsc2UgYW5kCisgICAgICogdGhlIHZhbHVlIG9mIGdldE1vbnRoIGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhck1vbnRoKCkKKyAgICAgICAgeyBfYml0cyAmPSB+SEFTX01PTlRIOyBfTSA9IDA7ICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGRheS1vZi1tb250aC4gQWZ0ZXIgY2xlYXJpbmcuIGhhc0RheSByZXR1cm5zIGZhbHNlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBvZiBnZXREYXkgaXMgdW5kZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyRGF5KCkKKyAgICAgICAgeyBfYml0cyAmPSB+SEFTX0RBWTsgX0QgPSAwOyAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSB0aW1lLW9mLWRheS4KKyAgICAgKiBBZnRlciBjbGVhcmluZy4gaGFzVGltZSByZXR1cm5zIGZhbHNlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBvZiBnZXRUaW1lIGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclRpbWUoKQorICAgIHsKKyAgICAgICAgX2JpdHMgJj0gfkhBU19USU1FOworICAgICAgICBfaCA9IDA7CisgICAgICAgIF9tID0gMDsKKyAgICAgICAgX3MgPSAwOworICAgICAgICBfZnMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgdGltZXpvbmUuIEFmdGVyIGNsZWFyaW5nLiBoYXNUaW1lWm9uZSByZXR1cm5zIGZhbHNlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBvZiBnZXRUaW1lWm9uZUhvdXIgYW5kIGdldFRpbWVab25lTWludXRlIGFyZSB1bmRlZmluZWQuCisgICAgICogRG9lcyBub3QgY2hhbmdlIHRoZSBvdGhlciB0aW1lIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclRpbWVab25lKCkKKyAgICB7CisgICAgICAgIF9iaXRzICY9IH5IQVNfVElNRVpPTkU7CisgICAgICAgIF90enNpZ24gPSAwOworICAgICAgICBfdHpoID0gMDsKKyAgICAgICAgX3R6bSA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBhbGwgZGF0ZSBmaWVsZHMgbGllIHdpdGhpbiB0aGVpciBsZWdhbCByYW5nZXMuICBBIEdEYXRlQnVpbGRlcgorICAgICAqIGNhbiBiZSBpbnZhbGlkLCBmb3IgZXhhbXBsZSwgaWYgeW91IGNoYW5nZSB0aGUgbW9udGggdG8gRmVicnVhcnkKKyAgICAgKiBhbmQgdGhlIGRheS1vZi1tb250aCBpcyAzMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkR0RhdGUodGhpcyk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCisgICAgeworICAgICAgICBpZiAoZGF0ZS5oYXNNb250aCgpICYmIChkYXRlLmdldE1vbnRoKCkgPCAxIHx8IGRhdGUuZ2V0TW9udGgoKSA+IDEyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZGF0ZS5oYXNEYXkoKSAmJiAoZGF0ZS5nZXREYXkoKSA8IDEgfHwgZGF0ZS5nZXREYXkoKSA+IDMxIHx8CisgICAgICAgICAgICBkYXRlLmdldERheSgpID4gMjggJiYgZGF0ZS5oYXNNb250aCgpICYmCisgICAgICAgICAgICAgICAgKGRhdGUuaGFzWWVhcigpID8gZGF0ZS5nZXREYXkoKSA+IF9tYXhEYXlJbk1vbnRoRm9yKGRhdGUuZ2V0WWVhcigpLCBkYXRlLmdldE1vbnRoKCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldERheSgpID4gX21heERheUluTW9udGgoZGF0ZS5nZXRNb250aCgpKSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChkYXRlLmhhc1RpbWUoKSAmJiAoZGF0ZS5nZXRIb3VyKCkgPCAwIHx8IGRhdGUuZ2V0SG91cigpID4gMjMgfHwKKyAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlKCkgPCAwIHx8IGRhdGUuZ2V0TWludXRlKCkgPiA1OSB8fAorICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmQoKSA8IDAgfHwgZGF0ZS5nZXRTZWNvbmQoKSA+IDU5IHx8CisgICAgICAgICAgICBkYXRlLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPCAwIHx8IGRhdGUuZ2V0RnJhY3Rpb24oKS5jb21wYXJlVG8oR0RhdGUuX29uZSkgPj0gMCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGRhdGUuaGFzVGltZVpvbmUoKSAmJgorICAgICAgICAgICAgKCEoKGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCAmJiBkYXRlLmdldFRpbWVab25lSG91cigpID09IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID09IDApIHx8CisgICAgICAgICAgICAgICgoZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSA9PSAtMSB8fCBkYXRlLmdldFRpbWVab25lU2lnbigpID09ICsxKSAmJgorICAgICAgICAgICAgICAgIC8vIE5COiBhbGxvdyArMDA6MDAgYW5kIC0wMDowMAorICAgICAgICAgICAgICAgIC8vIChkYXRlLmdldFRpbWVab25lSG91cigpID09IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID4gMCB8fCBkYXRlLmdldFRpbWVab25lSG91cigpID4gMCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPj0gMCkgJiYKKyAgICAgICAgICAgICAgIChkYXRlLmdldFRpbWVab25lSG91cigpID49IDAgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpID49IDApICYmCisgICAgICAgICAgICAgICAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSA9PSAxNCAmJiBkYXRlLmdldFRpbWVab25lTWludXRlKCkgPT0gMCB8fCBkYXRlLmdldFRpbWVab25lSG91cigpIDwgMTQgJiYgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpIDwgNjApKSkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIGV2ZXJ5dGluZyBsb29rcyBrb3NoZXIKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemVzIHRoZSBpbnN0YW5jZSwgZW5zdXJpbmcgZGF0ZSBhbmQgdGltZSBmaWVsZHMgYXJlIHdpdGhpbgorICAgICAqIHRoZWlyIG5vcm1hbCByYW5nZXMuCisgICAgICogPHA+CisgICAgICogSWYgbm8gdGltZXpvbmUgb3Igbm8gdGltZSBpcyBzcGVjaWZpZWQsIG9yIGlmIGEgcGFydGlhbCBkYXRlIGlzIHNwZWNpZmllZCwgdGhpcworICAgICAqIG1ldGhvZCBkb2VzIG5vdGhpbmcsIGFuZCBsZWF2ZXMgdGhlIHRpbWV6b25lIGluZm9ybWF0aW9uIGFzLWlzLgorICAgICAqIDxwPgorICAgICAqIElmIGEgdGltZSBvciB0aW1lIGFuZCBkYXRlIGlzIHNwZWNpZmllZCwgdGhpcyBtZXRob2Qgbm9ybWFsaXplcyB0aGUgdGltZXpvbmUKKyAgICAgKiB0byBVVEMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkKKyAgICB7CisgICAgICAgIC8vIERhdGVUaW1lIG9yIFRpbWUsIHdpdGggVGltZVpvbmU6IG5vcm1hbGl6ZSB0byBVVEMuCisgICAgICAgIC8vIEluIHRoZSBwcm9jZXNzIGFsbCB0aGUgZmllbGRzIHdpbGwgYmUgbm9ybWFsaXplZC4KKyAgICAgICAgaWYgKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpICYmCisgICAgICAgICAgICBoYXNUaW1lWm9uZSgpICYmIGhhc1RpbWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm9ybWFsaXplVG9UaW1lWm9uZSgwLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vIHRpbWV6b25lLCBvciBpbmNvbXBsZXRlIGRhdGUuCisgICAgICAgICAgICBsb25nIGNhcnJ5ID0gMDsKKworICAgICAgICAgICAgaWYgKGhhc1RpbWUoKSkKKyAgICAgICAgICAgICAgICBjYXJyeSA9IF9ub3JtYWxpemVUaW1lKCk7CisKKyAgICAgICAgICAgIGlmIChoYXNEYXkoKSkKKyAgICAgICAgICAgICAgICBfRCArPSBjYXJyeTsKKworICAgICAgICAgICAgaWYgKGhhc0RhdGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbm9ybWFsaXplRGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaGFzTW9udGgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3aXRoIGluY29tcGxldGUgZGF0ZXMsIGp1c3QgbW9udGhzIGNhbiBiZSBub3JtYWxpemVkOgorICAgICAgICAgICAgICAgIC8vIGRheXMgc3RheSBkZW5vcm1hbGl6ZWQuCisgICAgICAgICAgICAgICAgaWYgKF9NIDwgMSB8fCBfTSA+IDEyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRlbXAgPSBfTTsKKyAgICAgICAgICAgICAgICAgICAgX00gPSBfbW9kdWxvKHRlbXAsIDEsIDEzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1llYXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DWSA9IF9DWSArIChpbnQpX2ZRdW90aWVudCh0ZW1wLCAxLCAxMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZnJhY3Rpb25hbCBzZWNvbmRzCisgICAgICAgIGlmIChoYXNUaW1lKCkgJiYgX2ZzICE9IG51bGwgJiYgX2ZzLnNjYWxlKCkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2ZzLnNpZ251bSgpID09IDApCisgICAgICAgICAgICAgICAgX2ZzID0gR0RhdGUuX3plcm87CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9IF9mcy51bnNjYWxlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaW50IGxhc3R6ZXJvOworICAgICAgICAgICAgICAgIGZvciAobGFzdHplcm8gPSBzdHIubGVuZ3RoKCk7IGxhc3R6ZXJvID4gMDsgbGFzdHplcm8gLT0gMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ci5jaGFyQXQobGFzdHplcm8gLSAxKSAhPSAnMCcpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobGFzdHplcm8gPCBzdHIubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIF9mcyA9IF9mcy5zZXRTY2FsZShfZnMuc2NhbGUoKSAtIHN0ci5sZW5ndGgoKSArIGxhc3R6ZXJvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSB0aW1lIGFuZCB0aW1lem9uZSBhcmUga25vd24sIHRoaXMgbWV0aG9kIGNoYW5nZXMgdGhlIHRpbWV6b25lIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBVVEMgb2Zmc2V0LCBhbHRlcmluZyBtaW51dGVzLCBob3VycywgZGF5LCBtb250aCwgYW5kIHllYXIgYXMKKyAgICAgKiBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBkZXNjcmliZWQgbW9tZW50IGluIHRpbWUgaXMgdGhlIHNhbWUuCisgICAgICogPHA+CisgICAgICogSXQgaXMgYW4gZXJyb3IgdG8gb3BlcmF0ZSBvbiBpbnN0YW5jZXMgd2l0aG91dCBhIHRpbWUgb3IgdGltZXpvbmUsIG9yCisgICAgICogd2l0aCBhIHBhcnRpYWxseSBzcGVjaWZpZWQgZGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdHpTaWduIHRoZSB0aW1lem9uZSBvZmZzZXQgc2lnbiwgZWl0aGVyICsxLCAwLCBvciAtMQorICAgICAqIEBwYXJhbSB0ekhvdXIgdGhlIHRpbWV6b25lIG9mZnNldCBob3VyCisgICAgICogQHBhcmFtIHR6TWludXRlIHRoZSB0aW1lem9uZSBvZmZzZXQgbWludXRlIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZVRvVGltZVpvbmUoaW50IHR6U2lnbiwgaW50IHR6SG91ciwgaW50IHR6TWludXRlKQorICAgIHsKKyAgICAgICAgaWYgKCEoKHR6U2lnbiA9PSAwICYmIHR6SG91ciA9PSAwICYmIHR6TWludXRlID09IDApIHx8CisgICAgICAgICAgICAgICgodHpTaWduID09IC0xIHx8IHR6U2lnbiA9PSAxKSAmJgorICAgICAgICAgICAgICAgKHR6SG91ciA+PSAwICYmIHR6TWludXRlID49IDApICYmCisgICAgICAgICAgICAgICAodHpIb3VyID09IDE0ICYmIHR6TWludXRlID09IDAgfHwgdHpIb3VyIDwgMTQgJiYgdHpNaW51dGUgPCA2MCkpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRpbWUgem9uZSBtdXN0IGJlIGJldHdlZW4gLTE0OjAwIGFuZCArMTQ6MDAiKTsKKworICAgICAgICBpZiAoIWhhc1RpbWVab25lKCkgfHwgIWhhc1RpbWUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBub3JtYWxpemUgdGltZSB6b25lIHdpdGhvdXQgYm90aCB0aW1lIGFuZCB0aW1lem9uZSIpOworCisgICAgICAgIGlmICghKGhhc0RheSgpID09IGhhc01vbnRoKCkgJiYgaGFzRGF5KCkgPT0gaGFzWWVhcigpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyBkYXRlIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIGRhdGUiKTsKKworICAgICAgICBpbnQgaHNoaWZ0ID0gdHpTaWduICogdHpIb3VyIC0gX3R6c2lnbiAqIF90emg7CisgICAgICAgIGludCBtc2hpZnQgPSB0elNpZ24gKiB0ek1pbnV0ZSAtIF90enNpZ24gKiBfdHptOworCisgICAgICAgIF90enNpZ24gPSB0elNpZ247CisgICAgICAgIF90emggPSB0ekhvdXI7CisgICAgICAgIF90em0gPSB0ek1pbnV0ZTsKKyAgICAgICAgYWRkRHVyYXRpb24oMSwgMCwgMCwgMCwgaHNoaWZ0LCBtc2hpZnQsIDAsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZXMgdG8gYSB0aW1lIHpvbmUgc3BlY2lmaWVkIGJ5IGEgbnVtYmVyIG9mIG9mZnNldCBtaW51dGVzIHJhdGhlcgorICAgICAqIHRoYW4gc2lnbi9ob3VyL21pbnV0ZTsgZm9yIGV4YW1wbGUsIG5vcm1hbGl6ZVRvVGltZVpvbmUoLTYwKSBpcyB0aGUKKyAgICAgKiBzYW1lIGFzIG5vcm1hbGl6ZVRvVGltZVpvbmUoLTEsIDEsIDApLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZVRvVGltZVpvbmUoaW50IHR6VG90YWxNaW51dGVzKQorICAgIHsKKyAgICAgICAgaWYgKHR6VG90YWxNaW51dGVzIDwgLTE0ICogNjAgfHwgdHpUb3RhbE1pbnV0ZXMgPiAxNCAqIDYwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSB6b25lIG91dCBvZiByYW5nZSAoLTg0MCB0byA4NDAgbWludXRlcykuICgiICsgdHpUb3RhbE1pbnV0ZXMgKyAiKSIpOworICAgICAgICAKKyAgICAgICAgaW50IHR6U2lnbiA9IHR6VG90YWxNaW51dGVzIDwgMCA/IC0xIDogdHpUb3RhbE1pbnV0ZXMgPiAwID8gMSA6IDA7CisgICAgICAgIHR6VG90YWxNaW51dGVzICo9IHR6U2lnbjsKKyAgICAgICAgaW50IHR6SCA9IHR6VG90YWxNaW51dGVzIC8gNjA7CisgICAgICAgIGludCB0ek0gPSB0elRvdGFsTWludXRlcyAtIHR6SCAqIDYwOworICAgICAgICAKKyAgICAgICAgbm9ybWFsaXplVG9UaW1lWm9uZSh0elNpZ24sIHR6SCwgdHpNKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBnaXZlbiBkdXJhdGlvbiB0byB0aGUgZGF0ZS90aW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgZHVyYXRpb24gdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICBhZGREdXJhdGlvbihkdXJhdGlvbi5nZXRTaWduKCksIGR1cmF0aW9uLmdldFllYXIoKSwgZHVyYXRpb24uZ2V0TW9udGgoKSwgZHVyYXRpb24uZ2V0RGF5KCksCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLmdldEhvdXIoKSwgZHVyYXRpb24uZ2V0TWludXRlKCksIGR1cmF0aW9uLmdldFNlY29uZCgpLCBkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdHMgYSBnaXZlbiBkdXJhdGlvbiBmcm9tIHRoZSBkYXRlL3RpbWUuCisgICAgICogCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSBkdXJhdGlvbiB0byBzdWJ0cmFjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YnRyYWN0R0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICBhZGREdXJhdGlvbigtZHVyYXRpb24uZ2V0U2lnbigpLCBkdXJhdGlvbi5nZXRZZWFyKCksIGR1cmF0aW9uLmdldE1vbnRoKCksIGR1cmF0aW9uLmdldERheSgpLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbi5nZXRIb3VyKCksIGR1cmF0aW9uLmdldE1pbnV0ZSgpLCBkdXJhdGlvbi5nZXRTZWNvbmQoKSwgZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemVzIHRoZSBkYXRlIGJ5IGNhcnJ5aW5nIG92ZXIgdG8gdGhlIHllYXIgYW55IG1vbnRocyBvdXRzaWRlIDEuLjEyCisgICAgICogYW5kIGNhcnJ5aW5nIG92ZXIgdG8gdGhlIG1vbnRoIGFueSBkYXlzIG91dHNpZGUgMS4uKGRheXMtaW4tbW9udGgpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBfbm9ybWFsaXplRGF0ZSgpCisgICAgeworICAgICAgICBpZiAoX00gPCAxIHx8IF9NID4gMTIgfHwgX0QgPCAxIHx8IF9EID4gX21heERheUluTW9udGhGb3IoX0NZLCBfTSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZpeCBtb250aHMgZmlyc3QKKyAgICAgICAgICAgIGludCB0ZW1wID0gX007CisgICAgICAgICAgICBfTSA9IF9tb2R1bG8odGVtcCwgMSwgMTMpOworICAgICAgICAgICAgX0NZID0gX0NZICsgKGludClfZlF1b3RpZW50KHRlbXAsIDEsIDEzKTsKKworICAgICAgICAgICAgLy8gdGhlbiBwdWxsIGRheXMgb3V0CisgICAgICAgICAgICBpbnQgZXh0cmFkYXlzID0gX0QgLSAxOworICAgICAgICAgICAgX0QgPSAxOworCisgICAgICAgICAgICAvLyB0aGVuIHVzZSB0aGUganVsaWFuIGRhdGUgZnVuY3Rpb24gdG8gZml4CisgICAgICAgICAgICBzZXRKdWxpYW5EYXRlKGdldEp1bGlhbkRhdGUoKSArIGV4dHJhZGF5cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemVzIHRpbWUgc28gdGhhdCBmcmFjdGlvbnMgYXJlIDAuLjEoZXhjKSwgc2Vjb25kcy9taW51dGVzIDAuLjU5LAorICAgICAqIGFuZCBob3VycyAwLi4yNC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRheXMgdG8gY2Fycnkgb3ZlciBmcm9tIG5vcm1hbGl6aW5nCisgICAgICogYXdheSBtb3JlIHRoYW4gMjQgaG91cnMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIF9ub3JtYWxpemVUaW1lKCkKKyAgICB7CisgICAgICAgIGxvbmcgY2FycnkgPSAwOworICAgICAgICBsb25nIHRlbXA7CisKKyAgICAgICAgLy8gZnJhY3Rpb25zCisgICAgICAgIGlmIChfZnMgIT0gbnVsbCAmJiAoX2ZzLnNpZ251bSgpIDwgMCB8fCBfZnMuY29tcGFyZVRvKEdEYXRlLl9vbmUpID49IDApKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdEZWNpbWFsIGJkY2FycnkgPSBfZnMuc2V0U2NhbGUoMCwgQmlnRGVjaW1hbC5ST1VORF9GTE9PUik7CisgICAgICAgICAgICBfZnMgPSBfZnMuc3VidHJhY3QoYmRjYXJyeSk7CisgICAgICAgICAgICBjYXJyeSA9IGJkY2FycnkubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FycnkgIT0gMCB8fCBfcyA8IDAgfHwgX3MgPiA1OSB8fCBfbSA8IDAgfHwgX20gPiA1MCB8fCBfaCA8IDAgfHwgX2ggPiAyMykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2Vjb25kcworICAgICAgICAgICAgdGVtcCA9IF9zICsgY2Fycnk7CisgICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgNjApOworICAgICAgICAgICAgX3MgPSBfbW9kKHRlbXAsIDYwLCBjYXJyeSk7CisKKyAgICAgICAgICAgIC8vIG1pbnV0ZXMKKyAgICAgICAgICAgIHRlbXAgPSBfbSArIGNhcnJ5OworICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDYwKTsKKyAgICAgICAgICAgIF9tID0gX21vZCh0ZW1wLCA2MCwgY2FycnkpOworCisgICAgICAgICAgICAvLyBob3VycworICAgICAgICAgICAgdGVtcCA9IF9oICsgY2Fycnk7CisgICAgICAgICAgICBjYXJyeSA9IF9mUXVvdGllbnQodGVtcCwgMjQpOworICAgICAgICAgICAgX2ggPSBfbW9kKHRlbXAsIDI0LCBjYXJyeSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2Fycnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGdpdmVuIGR1cmF0aW9uIHRvIHRoZSBkYXRlL3RpbWUuCisgICAgICogCisgICAgICogQHBhcmFtIHNpZ24gKzEgdG8gYWRkLCAtMSB0byBzdWJ0cmFjdAorICAgICAqIEBwYXJhbSB5ZWFyIHRoZSBudW1iZXIgb2YgeWVhcnMgdG8gYWRkCisgICAgICogQHBhcmFtIG1vbnRoIHRoZSBudW1iZXIgb2YgbW9udGhzIHRvIGFkZAorICAgICAqIEBwYXJhbSBkYXkgdGhlIG51bWJlciBvZiBkYXlzIHRvIGFkZAorICAgICAqIEBwYXJhbSBob3VyIHRoZSBudW1iZXIgb2YgaG91cnMgdG8gYWRkCisgICAgICogQHBhcmFtIG1pbnV0ZSB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gYWRkCisgICAgICogQHBhcmFtIHNlY29uZCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gYWRkCisgICAgICogQHBhcmFtIGZyYWN0aW9uIHRoZSBudW1iZXIgb2YgZnJhY3Rpb25hbCBzZWNvbmRzIHRvIGFkZCAobWF5IGJlIG51bGwpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRHVyYXRpb24oaW50IHNpZ24sIGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCisgICAgeworICAgICAgICBib29sZWFuIHRpbWVtYXRoID0gaG91ciAhPSAwIHx8IG1pbnV0ZSAhPSAwIHx8IHNlY29uZCAhPSAwIHx8IGZyYWN0aW9uICE9IG51bGwgJiYgZnJhY3Rpb24uc2lnbnVtKCkgIT0gMDsKKyAgICAgICAgaWYgKHRpbWVtYXRoICYmICFoYXNUaW1lKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgZG8gdGltZSBtYXRoIHdpdGhvdXQgYSBjb21wbGV0ZSB0aW1lIik7CisgICAgICAgIGJvb2xlYW4gZGF0ZW1hdGggPSBoYXNEYXkoKSAmJiAoZGF5ICE9IDAgfHwgdGltZW1hdGgpOworICAgICAgICBpZiAoZGF0ZW1hdGggJiYgIWhhc0RhdGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBkbyBkYXRlIG1hdGggd2l0aG91dCBhIGNvbXBsZXRlIGRhdGUiKTsKKworICAgICAgICBpbnQgdGVtcDsKKworICAgICAgICAvLyBtb250aHMgKyB5ZWFycyBhcmUgZWFzeQorICAgICAgICBpZiAobW9udGggIT0gMCB8fCB5ZWFyICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFByZXBhcmUgdGhlIF9EIHRvIGJlIHBlZ2dlZCBiZWZvcmUgY2hhbmdpbmcgbW9udGgKKyAgICAgICAgICAgIGlmIChoYXNEYXkoKSkKKyAgICAgICAgICAgICAgICBfbm9ybWFsaXplRGF0ZSgpOworCisgICAgICAgICAgICAvLyBBZGQgbW9udGhzIGFuZCB5ZWFycworICAgICAgICAgICAgdGVtcCA9IF9NICsgc2lnbiAqIG1vbnRoOworICAgICAgICAgICAgX00gPSBfbW9kdWxvKHRlbXAsIDEsIDEzKTsKKyAgICAgICAgICAgIF9DWSA9IF9DWSArIHNpZ24gKiB5ZWFyICsgKGludClfZlF1b3RpZW50KHRlbXAsIDEsIDEzKTsKKworICAgICAgICAgICAgLy8gSW4gbmV3IG1vbnRoLCBkYXkgbWF5IG5lZWQgdG8gYmUgcGVnZ2VkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgICAgICBpZiAoaGFzRGF5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KF9EID49IDEpOworICAgICAgICAgICAgICAgIHRlbXAgPSBfbWF4RGF5SW5Nb250aEZvcihfQ1ksIF9NKTsKKyAgICAgICAgICAgICAgICBpZiAoX0QgPiB0ZW1wKQorICAgICAgICAgICAgICAgICAgICBfRCA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIGNhcnJ5ID0gMDsKKworICAgICAgICBpZiAodGltZW1hdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZyYWN0aW9ucworICAgICAgICAgICAgaWYgKGZyYWN0aW9uICE9IG51bGwgJiYgZnJhY3Rpb24uc2lnbnVtKCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZzLnNpZ251bSgpID09IDAgJiYgc2lnbiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBfZnMgPSBmcmFjdGlvbjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIF9mcyA9IChzaWduID09IDEpID8gX2ZzLmFkZChmcmFjdGlvbikgOiBfZnMuc3VidHJhY3QoZnJhY3Rpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWNvbmRzLCBtaW51dGVzLCBob3VycworICAgICAgICAgICAgX3MgKz0gc2lnbiAqIHNlY29uZDsKKyAgICAgICAgICAgIF9tICs9IHNpZ24gKiBtaW51dGU7CisgICAgICAgICAgICBfaCArPSBzaWduICogaG91cjsKKworICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRpbWUKKyAgICAgICAgICAgIGNhcnJ5ID0gX25vcm1hbGl6ZVRpbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRlbWF0aCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZGF5czogbWF5IHJlcXVpcmUgcmVub3JtYWxpemF0aW9uCisgICAgICAgICAgICBfRCArPSBzaWduICogZGF5ICsgY2Fycnk7CisgICAgICAgICAgICBfbm9ybWFsaXplRGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4ge3llYXIsbW9udGh9IGNvbXB1dGVzIG1heGltdW0KKyAgICAgKiBudW1iZXIgb2YgZGF5cyBmb3IgZ2l2ZW4gbW9udGgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgX21heERheUluTW9udGhGb3IoaW50IHllYXIsIGludCBtb250aCkKKyAgICB7CisgICAgICAgIGlmIChtb250aCA9PSA0IHx8IG1vbnRoID09IDYgfHwgbW9udGggPT0gOSB8fCBtb250aCA9PSAxMSkKKyAgICAgICAgICAgIHJldHVybiAzMDsKKworICAgICAgICBpZiAobW9udGggPT0gMikKKyAgICAgICAgICAgIHJldHVybiAoX2lzTGVhcFllYXIoeWVhcikgPyAyOSA6IDI4KTsKKworICAgICAgICByZXR1cm4gMzE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4ge3llYXIsbW9udGh9IGNvbXB1dGVzIG1heGltdW0KKyAgICAgKiBudW1iZXIgb2YgZGF5cyBmb3IgZ2l2ZW4gbW9udGgKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgX21heERheUluTW9udGgoaW50IG1vbnRoKQorICAgIHsKKyAgICAgICAgaWYgKG1vbnRoID09IDQgfHwgbW9udGggPT0gNiB8fCBtb250aCA9PSA5IHx8IG1vbnRoID09IDExKQorICAgICAgICAgICAgcmV0dXJuIDMwOworCisgICAgICAgIGlmIChtb250aCA9PSAyKQorICAgICAgICAgICAgcmV0dXJuIDI5OworCisgICAgICAgIHJldHVybiAzMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKdWxpYW4gZGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgR3JlZ29yaWFuIGRhdGUuCisgICAgICogVGhlIEp1bGlhbiBkYXRlIChKRCkgaXMgYSBjb250aW51b3VzIGNvdW50IG9mIGRheXMgZnJvbQorICAgICAqIDEgSmFudWFyeSA0NzEzIEJDICg9IC00NzEyIEphbnVhcnkgMSkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRKdWxpYW5EYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqdWxpYW5EYXRlRm9yR0RhdGUodGhpcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBHcmVnb3JpYW4gZGF0ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gSnVsaWFuIGRhdGUuCisgICAgICogVGhlIEp1bGlhbiBkYXRlIChKRCkgaXMgYSBjb250aW51b3VzIGNvdW50IG9mIGRheXMgZnJvbQorICAgICAqIDEgSmFudWFyeSA0NzEzIEJDICg9IC00NzEyIEphbnVhcnkgMSkuCisgICAgICogCisgICAgICogQHBhcmFtIGp1bGlhbmRheSB0aGUganVsaWFuIGRheSBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKdWxpYW5EYXRlKGludCBqdWxpYW5kYXkpCisgICAgeworICAgICAgICBpZiAoanVsaWFuZGF5IDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGUgYmVmb3JlIHllYXIgLTQ3MTIiKTsKKworICAgICAgICBpbnQgdGVtcDsKKyAgICAgICAgaW50IHFlcG9jOworCisgICAgICAgIC8vIGZyb20gaHR0cDovL2FhLnVzbm8ubmF2eS5taWwvZmFxL2RvY3MvSkRfRm9ybXVsYS5odG1sCisgICAgICAgIHRlbXAgPSBqdWxpYW5kYXkgKyA2ODU2OTsKKyAgICAgICAgcWVwb2MgPSA0ICogdGVtcCAvIDE0NjA5NzsKKyAgICAgICAgdGVtcCA9IHRlbXAgLSAoMTQ2MDk3ICogcWVwb2MgKyAzKSAvIDQ7CisgICAgICAgIF9DWSA9IDQwMDAgKiAodGVtcCArIDEpIC8gMTQ2MTAwMTsKKyAgICAgICAgdGVtcCA9IHRlbXAgLSAxNDYxICogX0NZIC8gNCArIDMxOworICAgICAgICBfTSA9IDgwICogdGVtcCAvIDI0NDc7CisgICAgICAgIF9EID0gdGVtcCAtIDI0NDcgKiBfTSAvIDgwOworICAgICAgICB0ZW1wID0gX00gLyAxMTsKKyAgICAgICAgX00gPSBfTSArIDIgLSAxMiAqIHRlbXA7CisgICAgICAgIF9DWSA9IDEwMCAqIChxZXBvYyAtIDQ5KSArIF9DWSArIHRlbXA7CisKKyAgICAgICAgX2JpdHMgfD0gSEFTX0RBWSB8IEhBU19NT05USCB8IEhBU19ZRUFSOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCB0aW1lIGFuZCBkYXRlIGJhc2VkIG9uIGEgamF2YS51dGlsLkRhdGUgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIHRpbWV6b25lIG9mZnNldCB1c2VkIGlzIGJhc2VkIG9uIHRoZSBkZWZhdWx0IFRpbWVab25lLiAoVGhlCisgICAgICogZGVmYXVsdCBUaW1lWm9uZSBpcyBjb25zdWx0ZWQgdG8gaW5jb3Jwb3JhdGUgZGF5bGlnaHQgc2F2aW5ncyBvZmZzZXRzCisgICAgICogaWYgYXBwbGljYWJsZSBmb3IgdGhlIGN1cnJlbnQgZGF0ZSBhcyB3ZWxsIGFzIHRoZSBiYXNlIHRpbWV6b25lIG9mZnNldC4pCisgICAgICogPHA+CisgICAgICogSWYgeW91IHdpc2ggdG8gbm9ybWFsaXplIHRoZSB0aW1lem9uZSwgZS5nLiwgdG8gVVRDLCBmb2xsb3cgdGhpcyB3aXRoCisgICAgICogYSBjYWxsIHRvIG5vcm1hbGl6ZVRvVGltZVpvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGUgdGhlIERhdGUgb2JqZWN0IHRvIGNvcHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkKKyAgICB7CisgICAgICAgIC8vIERlZmF1bHQgdGltZXpvbmUKKyAgICAgICAgVGltZVpvbmUgZHR6ID0gVGltZVpvbmUuZ2V0RGVmYXVsdCgpOworICAgICAgICBpbnQgb2Zmc2V0ID0gZHR6LmdldE9mZnNldChkYXRlLmdldFRpbWUoKSk7CisgICAgICAgIGludCBvZmZzZXRzaWduID0gMTsKKyAgICAgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldHNpZ24gPSAtMTsKKyAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IG9mZnNldG1pbiA9IG9mZnNldCAvICgxMDAwICogNjApOworICAgICAgICBpbnQgb2Zmc2V0aHIgPSBvZmZzZXRtaW4gLyA2MDsKKyAgICAgICAgb2Zmc2V0bWluID0gb2Zmc2V0bWluIC0gb2Zmc2V0aHIgKiA2MDsKKworICAgICAgICBzZXRUaW1lWm9uZShvZmZzZXRzaWduLCBvZmZzZXRociwgb2Zmc2V0bWluKTsKKyAgICAgICAgCisgICAgICAgIC8vIHBhcmFub2lhOiB0ei5nZXRPZmZzZXQgY2FuIHJldHVybiBmcmFjdGlvbnMgb2YgbWludXRlcywgYnV0IHdlIG11c3Qgcm91bmQKKyAgICAgICAgaW50IHJvdW5kZWRvZmZzZXQgPSBvZmZzZXRzaWduICogKG9mZnNldGhyICogNjAgKyBvZmZzZXRtaW4pICogNjAgKiAxMDAwOworCisgICAgICAgIC8vIG1pZG5pZ2h0CisgICAgICAgIHNldFRpbWUoMCwgMCwgMCwgR0RhdGUuX3plcm8pOworCisgICAgICAgIC8vIFNldCB0byBKYW51YXJ5IDEsIDE5NzAuCisgICAgICAgIC8vIHNldEp1bGlhbkRhdGUoMjQ0MDU4OCk7CisgICAgICAgIF9iaXRzIHw9IEhBU19EQVkgfCBIQVNfTU9OVEggfCBIQVNfWUVBUjsKKyAgICAgICAgX0NZID0gMTk3MDsKKyAgICAgICAgX00gPSAxOworICAgICAgICBfRCA9IDE7CisKKyAgICAgICAgLy8gQWRkIGEgZHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgICAgICAgIGFkZEdEdXJhdGlvbihuZXcgR0R1cmF0aW9uKDEsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKGRhdGUuZ2V0VGltZSgpICsgcm91bmRlZG9mZnNldCwgMykpKTsKKworICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IHNzLjAwMCAtPiBzcworICAgICAgICBpZiAoX2ZzLnNpZ251bSgpID09IDApCisgICAgICAgICAgICBfZnMgPSBHRGF0ZS5femVybzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29waWVzIGEgR0RhdGVTcGVjaWZpY2F0aW9uLCBjb21wbGV0ZWx5IHJlcGxhY2luZyB0aGUgY3VycmVudAorICAgICAqIGluZm9ybWF0aW9uIGluIHRoaXMgR0RhdGVCdWlsZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnZGF0ZSB0aGUgR0RhdGVTcGVjaWZpY2F0aW9uIHRvIGNvcHkKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0R0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGdkYXRlKQorICAgIHsKKyAgICAgICAgX2JpdHMgPSBnZGF0ZS5nZXRGbGFncygpICYgKEhBU19USU1FWk9ORSB8IEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FKTsKKyAgICAgICAgX0NZID0gZ2RhdGUuZ2V0WWVhcigpOworICAgICAgICBfTSA9IGdkYXRlLmdldE1vbnRoKCk7CisgICAgICAgIF9EID0gZ2RhdGUuZ2V0RGF5KCk7CisgICAgICAgIF9oID0gZ2RhdGUuZ2V0SG91cigpOworICAgICAgICBfbSA9IGdkYXRlLmdldE1pbnV0ZSgpOworICAgICAgICBfcyA9IGdkYXRlLmdldFNlY29uZCgpOworICAgICAgICBfZnMgPSBnZGF0ZS5nZXRGcmFjdGlvbigpOworICAgICAgICBfdHpzaWduID0gZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCk7CisgICAgICAgIF90emggPSBnZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKTsKKyAgICAgICAgX3R6bSA9IGdkYXRlLmdldFRpbWVab25lTWludXRlKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbWUgYXMgYW4ge0BsaW5rIFhtbENhbGVuZGFyfS4KKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgWG1sQ2FsZW5kYXJ9IGlzIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcn0KKyAgICAgKiB3aGljaCBpcyBzbGlnaHRseSBjdXN0b21pemVkIHRvIG1hdGNoIFhNTCBzY2hlbWEgZGF0ZSBydWxlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFhtbENhbGVuZGFyfSBoYXMgb25seSB0aG9zZSB0aW1lIGFuZCBkYXRlIGZpZWxkcworICAgICAqIHNldCB0aGF0IGFyZSByZWZsZWN0ZWQgaW4gdGhlIEdEYXRlIG9iamVjdC4gIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUKKyAgICAgKiB7QGxpbmsgamF2YS51dGlsLkNhbGVuZGFyfSBjb250cmFjdCB3b3JrcywgYW55IGluZm9ybWF0aW9uIGluIHRoZSBpc1NldCgpIHZhbmlzaGVzCisgICAgICogYXMgc29vbiBhcyB5b3UgdmlldyBhbnkgdW5zZXQgZmllbGQgdXNpbmcgZ2V0KCkgbWV0aG9kcy4KKyAgICAgKiBUaGlzIG1lYW5zIHRoYXQgaWYgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hpY2ggZGF0ZSBmaWVsZHMKKyAgICAgKiBhcmUgc2V0LCB5b3UgbXVzdCBjYWxsIGlzU2V0KCkgZmlyc3QgYmVmb3JlIGdldCgpLgorICAgICAqLworICAgIHB1YmxpYyBYbWxDYWxlbmRhciBnZXRDYWxlbmRhcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFhtbENhbGVuZGFyKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGltZSBhcyBhIGphdmEudXRpbC5EYXRlCisgICAgICogaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGF0ZUZvckdEYXRlKHRoaXMpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBqdWxpYW5EYXRlRm9yR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGUpCisgICAgeworICAgICAgICBpZiAoIWRhdGUuaGFzRGF0ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGRvIGRhdGUgbWF0aCB3aXRob3V0IGEgY29tcGxldGUgZGF0ZSIpOworCisgICAgICAgIC8vIGZyb20gaHR0cDovL2FhLnVzbm8ubmF2eS5taWwvZmFxL2RvY3MvSkRfRm9ybXVsYS5odG1sCisgICAgICAgIGludCByZXN1bHQgPSBkYXRlLmdldERheSgpLTMyMDc1KzE0NjEqKGRhdGUuZ2V0WWVhcigpKzQ4MDArKGRhdGUuZ2V0TW9udGgoKS0xNCkvMTIpLzQrCisgICAgICAgICAgICAzNjcqKGRhdGUuZ2V0TW9udGgoKS0yLShkYXRlLmdldE1vbnRoKCktMTQpLzEyKjEyKS8xMi0zKigoZGF0ZS5nZXRZZWFyKCkrNDkwMCsoZGF0ZS5nZXRNb250aCgpLTE0KS8xMikvMTAwKS80OworCisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0ZSB0b28gZmFyIGluIHRoZSBwYXN0ICh5ZWFyIGFsbG93ZWQgdG8gLTQ3MTIpIik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBEYXRlIGRhdGVGb3JHRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKKyAgICB7CisgICAgICAgIGxvbmcgakRhdGUgPSBqdWxpYW5EYXRlRm9yR0RhdGUoZGF0ZSk7CisgICAgICAgIGxvbmcgdG8xOTcwRGF0ZSA9IGpEYXRlIC0gMjQ0MDU4ODsKKyAgICAgICAgbG9uZyB0bzE5NzBNcyA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiB0bzE5NzBEYXRlOworCisgICAgICAgIHRvMTk3ME1zICs9IGRhdGUuZ2V0TWlsbGlzZWNvbmQoKTsKKyAgICAgICAgdG8xOTcwTXMgKz0gZGF0ZS5nZXRTZWNvbmQoKSAqIDEwMDA7CisgICAgICAgIHRvMTk3ME1zICs9IGRhdGUuZ2V0TWludXRlKCkgKiA2MCAqIDEwMDA7CisgICAgICAgIHRvMTk3ME1zICs9IGRhdGUuZ2V0SG91cigpICogNjAgKiA2MCAqIDEwMDA7CisgICAgICAgIGlmIChkYXRlLmhhc1RpbWVab25lKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvMTk3ME1zIC09IChkYXRlLmdldFRpbWVab25lTWludXRlKCkgKiBkYXRlLmdldFRpbWVab25lU2lnbigpKSAqIDYwICogMTAwMDsKKyAgICAgICAgICAgIHRvMTk3ME1zIC09IChkYXRlLmdldFRpbWVab25lSG91cigpICogZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSkgKiA2MCAqIDYwICogMTAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRpbWVab25lIGRlZiA9IFRpbWVab25lLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBkZWYuZ2V0T2Zmc2V0KHRvMTk3ME1zKTsKKyAgICAgICAgICAgIHRvMTk3ME1zIC09IG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0bzE5NzBNcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3IgbGVhcCB5ZWFycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9pc0xlYXBZZWFyKGludCB5ZWFyKQorICAgIHsKKyAgICAgICAgLy8gQlVHQlVHOiBKdWxpYW4gY2FsZW5kYXI/CisgICAgICAgIHJldHVybiAoKHllYXIgJSA0ID09IDApICYmICgoeWVhciAlIDEwMCAhPSAwKSB8fCAoeWVhciAlIDQwMCA9PSAwKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZRdW90aWVudChhLCBiKSA9IHRoZSBncmVhdGVzdCBpbnRlZ2VyIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhL2IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIF9mUXVvdGllbnQobG9uZyBhLCBpbnQgYikKKyAgICB7CisgICAgICAgIGlmICgoYSA8IDApID09IChiIDwgMCkpCisgICAgICAgICAgICByZXR1cm4gYSAvIGI7CisKKyAgICAgICAgcmV0dXJuIC0oKGIgLSBhIC0gMSkgLyBiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2R1bG8oYSwgYikgPSBhIC0gZlF1b3RpZW50KGEsYikqYgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBfbW9kKGxvbmcgYSwgaW50IGIsIGxvbmcgcXVvdGllbnQpCisgICAgeworICAgICAgICByZXR1cm4gKGludCkoYSAtIHF1b3RpZW50KmIpIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2R1bG8oYSAtIGxvdywgaGlnaCAtIGxvdykgKyBsb3cKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX21vZHVsbyhsb25nIHRlbXAsIGludCBsb3csIGludCBoaWdoKQorICAgIHsKKyAgICAgICAgbG9uZyBhID0gdGVtcCAtIGxvdzsKKyAgICAgICAgaW50IGIgPSBoaWdoIC0gbG93OworICAgICAgICByZXR1cm4gKF9tb2QoYSwgYiwgX2ZRdW90aWVudChhLCBiKSkgKyBsb3cpIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90aWVudChhIC0gbG93LCBoaWdoIC0gbG93KQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgX2ZRdW90aWVudChsb25nIHRlbXAsIGludCBsb3csIGludCBoaWdoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9mUXVvdGllbnQodGVtcCAtIGxvdywgaGlnaCAtIGxvdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0byB0aGUgZmlyc3QgcG9zc2libGUgbW9tZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAgICAgKiBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBfc2V0VG9GaXJzdE1vbWVudCgpCisgICAgeworICAgICAgICAvLyAxNTg0IHdhcyB0aGUgZmlyc3QgbGVhcCB5ZWFyIGR1cmluZyB3aGljaCB0aGUgR3JlZ29yaWFuCisgICAgICAgIC8vIGNhbGVuZGFyIHdhcyBpbiB1c2U6IHNlZW1zIGxpa2UgdGhlIG1vc3QgcmVhc29uYWJsZSAiZmlyc3QiCisgICAgICAgIC8vIHllYXIgdG8gdXNlIGluIGFic2VuY2Ugb2YgYSB5ZWFyLgorCisgICAgICAgIGlmICghaGFzWWVhcigpKQorICAgICAgICAgICAgc2V0WWVhcigxNTg0KTsKKworICAgICAgICBpZiAoIWhhc01vbnRoKCkpCisgICAgICAgICAgICBzZXRNb250aCgxKTsKKworICAgICAgICBpZiAoIWhhc0RheSgpKQorICAgICAgICAgICAgc2V0RGF5KDEpOworCisgICAgICAgIGlmICghaGFzVGltZSgpKQorICAgICAgICAgICAgc2V0VGltZSgwLCAwLCAwLCBHRGF0ZS5femVybyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEYXRlLgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+UmV0dXJucyAtMSBpZiB0aGlzIDwgZGF0ZS4gKGxlc3MtdGhhbikKKyAgICAgKiA8bGk+UmV0dXJucyAwIGlmIHRoaXMgPT0gZGF0ZS4gKGVxdWFsKQorICAgICAqIDxsaT5SZXR1cm5zIDEgaWYgdGhpcyA+IGRhdGUuIChncmVhdGVyLXRoYW4pCisgICAgICogPGxpPlJldHVybnMgMiBpZiB0aGlzIDw+IGRhdGUuIChpbmNvbXBhcmFibGUpCisgICAgICogPC91bD4KKyAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSBpbmNvbXBhcmFibGUgaWYgdGhleSBoYXZlIGRpZmZlcmVudCBhbW91bnRzCisgICAgICogb2YgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGVzcGVjIHRoZSBkYXRlIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvR0RhdGUoR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGVzcGVjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVHRGF0ZSh0aGlzLCBkYXRlc3BlYyk7CisgICAgfQorCisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgY29tcGFyZUdEYXRlKEdEYXRlU3BlY2lmaWNhdGlvbiB0ZGF0ZSwgR0RhdGVTcGVjaWZpY2F0aW9uIGRhdGVzcGVjKQorICAgIHsKKyAgICAgICAgLy8gc2FtZSBhbW91bnQgb2YgaW5mb3JtYXRpb246IGxvb2tzIGdvb2QKKyAgICAgICAgaW50IGJpdGRpZmYgPSB0ZGF0ZS5nZXRGbGFncygpIF4gZGF0ZXNwZWMuZ2V0RmxhZ3MoKTsKKworICAgICAgICBlYXN5OiBpZiAoKGJpdGRpZmYgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUgfCBIQVNfVElNRVpPTkUpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGUgb3RoZXIgZGF0ZSBuZWVkcyB0byBiZSBub3JtYWxpemVkIHRvCisgICAgICAgICAgICAvLyBvdXIgdGltZXpvbmUsIG1ha2UgYSBjbG9uZSBhbmQgZG8gc28gaWYgcG9zc2libGUKKyAgICAgICAgICAgIGlmICh0ZGF0ZS5oYXNUaW1lWm9uZSgpICYmCisgICAgICAgICAgICAgICAgKGRhdGVzcGVjLmdldFRpbWVab25lSG91cigpICE9IHRkYXRlLmdldFRpbWVab25lSG91cigpIHx8CisgICAgICAgICAgICAgICAgIGRhdGVzcGVjLmdldFRpbWVab25lTWludXRlKCkgIT0gdGRhdGUuZ2V0VGltZVpvbmVNaW51dGUoKSB8fAorICAgICAgICAgICAgICAgICBkYXRlc3BlYy5nZXRUaW1lWm9uZVNpZ24oKSAhPSB0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0ZXNwZWMgPSBuZXcgR0RhdGVCdWlsZGVyKGRhdGVzcGVjKTsKKworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IHRkYXRlLmdldEZsYWdzKCkgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gMCAmJiBmbGFncyAhPSAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZKSB8fCAhdGRhdGUuaGFzVGltZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlc2UgY2FzZXMgd2UnbGwgbmVlZCB0byBmaWxsIGluIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAoKEdEYXRlQnVpbGRlcilkYXRlc3BlYykuX3NldFRvRmlyc3RNb21lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGRhdGUgPSBuZXcgR0RhdGVCdWlsZGVyKHRkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgKChHRGF0ZUJ1aWxkZXIpdGRhdGUpLl9zZXRUb0ZpcnN0TW9tZW50KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKChHRGF0ZUJ1aWxkZXIpZGF0ZXNwZWMpLm5vcm1hbGl6ZVRvVGltZVpvbmUodGRhdGUuZ2V0VGltZVpvbmVTaWduKCksIHRkYXRlLmdldFRpbWVab25lSG91cigpLCB0ZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29tcGFyZSBieSBmaWVsZAorICAgICAgICAgICAgcmV0dXJuIGZpZWxkd2lzZUNvbXBhcmUodGRhdGUsIGRhdGVzcGVjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpZmZlcmVudCBhbW91bnRzIG9mIGluZm9ybWF0aW9uIChleGNlcHQgdGltZXpvbmUpOiBub3QgY29tcGFyYWJsZQorICAgICAgICBpZiAoKGJpdGRpZmYgJiAoSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZIHwgSEFTX1RJTUUpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgLy8gVGhlIHNjaGVtYSBzcGVjIHNheXMgd2Ugc2hvdWxkIHRyeSB0byBjb21wYXJlIHdpdGgtdGltZXpvbmUgYW5kCisgICAgICAgIC8vIHdpdGhvdXQtdGltZXpvbmUgc3BlY2lmaWNhdGlvbnMuLi4gV2VsbCwgT0ssIHN1cmUsIGlmIHRoZXkgc2F5IHNvLgorCisgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSB0aW1lem9uZSBidXQgdGhlIG90aGVyIGRvZXM6IHJldmVyc2UgdGhlIGNhbGwKKyAgICAgICAgaWYgKCF0ZGF0ZS5oYXNUaW1lWm9uZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29tcGFyZUdEYXRlKGRhdGVzcGVjLCB0ZGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09IDIgPyAyIDogLXJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyB0ZGF0ZSBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYSB0aW1lem9uZSBhbmQgZGF0ZXNwZWMgbm90LgorCisgICAgICAgIC8vIFRvIG11Y2sgd2l0aCB0aGUgdGltZXMsIG1ha2UgY2xvbmVzCisgICAgICAgIEdEYXRlQnVpbGRlciBwZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIodGRhdGUpOworCisgICAgICAgIC8vIFRvIGNvdmVyIHRoZSBvbmUgdW5jb3ZlcmVkIGNhc2U6IGlmIG9uZSBkYXRlIGlzIDAyLzI4IGFuZCB0aGUKKyAgICAgICAgLy8gb3RoZXIgZGF0ZSBpcyAwMy8wMSwgc2hpZnQgZGF5cyBjbG9zZXIgYnkgb25lIHRvIHNpbXVsYXRlIGJlaW5nCisgICAgICAgIC8vIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGggd2l0aGluIGEgbGVhcCB5ZWFyCisgICAgICAgIGlmICgodGRhdGUuZ2V0RmxhZ3MoKSAmIChIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkpKSA9PSAoSEFTX01PTlRIIHwgSEFTX0RBWSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0ZGF0ZS5nZXREYXkoKSA9PSAyOCAmJiB0ZGF0ZS5nZXRNb250aCgpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGVzcGVjLmdldERheSgpID09IDAxICYmIGRhdGVzcGVjLmdldE1vbnRoKCkgPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBkYXRlLnNldERheSgyOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0ZXNwZWMuZ2V0RGF5KCkgPT0gMjggJiYgZGF0ZXNwZWMuZ2V0TW9udGgoKSA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0ZGF0ZS5nZXREYXkoKSA9PSAwMSAmJiB0ZGF0ZS5nZXRNb250aCgpID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwZGF0ZS5zZXRNb250aCgwMik7CisgICAgICAgICAgICAgICAgICAgIHBkYXRlLnNldERheSgyOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yIHRpbWVzcGFucywgY29tcGFyZSBieSBmaXJzdCBpbnN0YW50IG9mIHRpbWUKKyAgICAgICAgLy8gcG9zc2libGUuIFRoZXJlZm9yZSwgZmlsbCBpbiBNaWRuaWdodCwgSmFudWFyeSAxLCAxNTg0IChhIGxlYXAgeWVhcikKKyAgICAgICAgLy8gaW4gYWJzZW5jZSBvZiBvdGhlciBpbmZvcm1hdGlvbi4KKyAgICAgICAgcGRhdGUuX3NldFRvRmlyc3RNb21lbnQoKTsKKworICAgICAgICAvLyBQIDwgUSBpZiBQIDwgKFEgd2l0aCB0aW1lIHpvbmUgKzE0OjAwKQorICAgICAgICBHRGF0ZUJ1aWxkZXIgcXBsdXNkYXRlID0gbmV3IEdEYXRlQnVpbGRlcihkYXRlc3BlYyk7CisgICAgICAgIHFwbHVzZGF0ZS5fc2V0VG9GaXJzdE1vbWVudCgpOworICAgICAgICBxcGx1c2RhdGUuc2V0VGltZVpvbmUoMSwgMTQsIDApOworICAgICAgICBxcGx1c2RhdGUubm9ybWFsaXplVG9UaW1lWm9uZSh0ZGF0ZS5nZXRUaW1lWm9uZVNpZ24oKSwgdGRhdGUuZ2V0VGltZVpvbmVIb3VyKCksIHRkYXRlLmdldFRpbWVab25lTWludXRlKCkpOworICAgICAgICBpZiAoZmllbGR3aXNlQ29tcGFyZShwZGF0ZSwgcXBsdXNkYXRlKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBQID4gUSBpZiBQID4gKFEgd2l0aCB0aW1lIHpvbmUgLTE0OjAwKQorICAgICAgICBHRGF0ZUJ1aWxkZXIgcW1pbnVzZGF0ZSA9IHFwbHVzZGF0ZTsKKyAgICAgICAgcW1pbnVzZGF0ZS5zZXRHRGF0ZShkYXRlc3BlYyk7CisgICAgICAgIHFtaW51c2RhdGUuX3NldFRvRmlyc3RNb21lbnQoKTsKKyAgICAgICAgcW1pbnVzZGF0ZS5zZXRUaW1lWm9uZSgtMSwgMTQsIDApOworICAgICAgICBxbWludXNkYXRlLm5vcm1hbGl6ZVRvVGltZVpvbmUodGRhdGUuZ2V0VGltZVpvbmVTaWduKCksIHRkYXRlLmdldFRpbWVab25lSG91cigpLCB0ZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKTsKKyAgICAgICAgaWYgKGZpZWxkd2lzZUNvbXBhcmUocGRhdGUsIHFtaW51c2RhdGUpID09IDEpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvLyBQIDw+IFEgb3RoZXJ3aXNlCisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvZXMgYSBzaW1wbGUgbW9zdC1zaWduaWZpY2FudC1kaWdpdC1maXJzdCBjb21wYXJpc29uLAorICAgICAqIGlnbm9yaW5nIGFueSB0aW1lem9uZSBvciBoYXMvZG9lc24ndCBoYXZlIGlzc3Vlcy4KKyAgICAgKiBUaGUgZGF0YSBtdXN0IGhhdmUgYmVlbiBkaWdlc3RlZCBmaXJzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmllbGR3aXNlQ29tcGFyZShHRGF0ZVNwZWNpZmljYXRpb24gdGRhdGUsIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQorICAgIHsKKyAgICAgICAgaWYgKHRkYXRlLmhhc1llYXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IENZID0gZGF0ZS5nZXRZZWFyKCk7CisgICAgICAgICAgICBpbnQgVENZID0gdGRhdGUuZ2V0WWVhcigpOworICAgICAgICAgICAgaWYgKFRDWSA8IENZKSByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoVENZID4gQ1kpIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICh0ZGF0ZS5oYXNNb250aCgpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgTSA9IGRhdGUuZ2V0TW9udGgoKTsKKyAgICAgICAgICAgIGludCBUTSA9IHRkYXRlLmdldE1vbnRoKCk7CisgICAgICAgICAgICBpZiAoVE0gPCBNKSByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoVE0gPiBNKSByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGRhdGUuaGFzRGF5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBEID0gZGF0ZS5nZXREYXkoKTsKKyAgICAgICAgICAgIGludCBURCA9IHRkYXRlLmdldERheSgpOworICAgICAgICAgICAgaWYgKFREIDwgRCkgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKFREID4gRCkgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRkYXRlLmhhc1RpbWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGggPSBkYXRlLmdldEhvdXIoKTsKKyAgICAgICAgICAgIGludCB0aCA9IHRkYXRlLmdldEhvdXIoKTsKKyAgICAgICAgICAgIGlmICh0aCA8IGgpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmICh0aCA+IGgpIHJldHVybiAxOworICAgICAgICAgICAgaW50IG0gPSBkYXRlLmdldE1pbnV0ZSgpOworICAgICAgICAgICAgaW50IHRtID0gdGRhdGUuZ2V0TWludXRlKCk7CisgICAgICAgICAgICBpZiAodG0gPCBtKSByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAodG0gPiBtKSByZXR1cm4gMTsKKyAgICAgICAgICAgIGludCBzID0gZGF0ZS5nZXRTZWNvbmQoKTsKKyAgICAgICAgICAgIGludCB0cyA9IHRkYXRlLmdldFNlY29uZCgpOworICAgICAgICAgICAgaWYgKHRzIDwgcykgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHRzID4gcykgcmV0dXJuIDE7CisgICAgICAgICAgICBCaWdEZWNpbWFsIGZzID0gZGF0ZS5nZXRGcmFjdGlvbigpOworICAgICAgICAgICAgQmlnRGVjaW1hbCB0ZnMgPSB0ZGF0ZS5nZXRGcmFjdGlvbigpOworICAgICAgICAgICAgaWYgKHRmcyA9PSBudWxsICYmIGZzID09IG51bGwpIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuICh0ZnMgPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogdGZzKS5jb21wYXJlVG8oZnMgPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYnVpbHRpbiB0eXBlIGNvZGUgZm9yIHRoZSBzaGFwZSBvZiB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiBjb250YWluZWQgaW4gdGhpcyBpbnN0YW5jZSwgb3IgMCBpZiB0aGUKKyAgICAgKiBpbnN0YW5jZSBkb2Vzbid0IGNvbnRhaW4gaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byBhCisgICAgICogU2NoZW1hIHR5cGUuCisgICAgICogPHA+IAorICAgICAqIFZhbHVlIHdpbGwgYmUgZXF1YWwgdG8KKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfTk9UX0JVSUxUSU59LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJ9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX1lFQVJfTU9OVEh9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USF9EQVl9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX0RBWX0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEV9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFX1RJTUV9LCBvcgorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19USU1FfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gYnRjRm9yRmxhZ3MoX2JpdHMpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBidGNGb3JGbGFncyhpbnQgZmxhZ3MpCisgICAgeworICAgICAgICBzd2l0Y2ggKGZsYWdzICYgKEhBU19ZRUFSIHwgSEFTX01PTlRIIHwgSEFTX0RBWSB8IEhBU19USU1FKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIQVNfWUVBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19ZRUFSOworICAgICAgICAgICAgY2FzZSBIQVNfWUVBUiB8IEhBU19NT05USDoKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfR19ZRUFSX01PTlRIOworICAgICAgICAgICAgY2FzZSBIQVNfTU9OVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg7CisgICAgICAgICAgICBjYXNlIEhBU19NT05USCB8IEhBU19EQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEhfREFZOworICAgICAgICAgICAgY2FzZSBIQVNfREFZOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19HX0RBWTsKKyAgICAgICAgICAgIGNhc2UgSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZOgorICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWFUeXBlLkJUQ19EQVRFOworICAgICAgICAgICAgY2FzZSBIQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfREFURV9USU1FOworICAgICAgICAgICAgY2FzZSBIQVNfVElNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hVHlwZS5CVENfVElNRTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNjaGVtYVR5cGUuQlRDX05PVF9CVUlMVElOOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBmaWVsZHMgaW4gdGhpcyBHRGF0ZUJ1aWxkZXIgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUKKyAgICAgKiBmb3IgdGhlIGdpdmVuIFNjaGVtYVR5cGUgZGF0ZSBjb2RlLiAgVGhlIGNvZGUgc2hvdWxkIGJlCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUn0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfWUVBUl9NT05USH0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEh9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19HX01PTlRIX0RBWX0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfREFZfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURX0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0RBVEVfVElNRX0sIG9yCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX1RJTUV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlQ29kZSB0aGUgdHlwZSBjb2RlIHRvIGFwcGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVpbHRpblR5cGVDb2RlKGludCB0eXBlQ29kZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZUNvZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19ZRUFSOgorICAgICAgICAgICAgICAgIC8vSEFTX1lFQVIKKyAgICAgICAgICAgICAgICBjbGVhck1vbnRoKCk7CisgICAgICAgICAgICAgICAgY2xlYXJEYXkoKTsKKyAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfWUVBUl9NT05USDoKKyAgICAgICAgICAgICAgICAvL0hBU19ZRUFSIHwgSEFTX01PTlRICisgICAgICAgICAgICAgICAgY2xlYXJEYXkoKTsKKyAgICAgICAgICAgICAgICBjbGVhclRpbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFNjaGVtYVR5cGUuQlRDX0dfTU9OVEg6CisgICAgICAgICAgICAgICAgLy9IQVNfTU9OVEgKKyAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKKyAgICAgICAgICAgICAgICBjbGVhckRheSgpOworICAgICAgICAgICAgICAgIGNsZWFyVGltZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfR19NT05USF9EQVk6CisgICAgICAgICAgICAgICAgLy9IQVNfTU9OVEggfCBIQVNfREFZCisgICAgICAgICAgICAgICAgY2xlYXJZZWFyKCk7CisgICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19HX0RBWToKKyAgICAgICAgICAgICAgICAvL0hBU19EQVkKKyAgICAgICAgICAgICAgICBjbGVhclllYXIoKTsKKyAgICAgICAgICAgICAgICBjbGVhck1vbnRoKCk7CisgICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFOgorICAgICAgICAgICAgICAgIC8vSEFTX1lFQVIgfCBIQVNfTU9OVEggfCBIQVNfREFZCisgICAgICAgICAgICAgICAgY2xlYXJUaW1lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUU6CisgICAgICAgICAgICAgICAgLy9IQVNfWUVBUiB8IEhBU19NT05USCB8IEhBU19EQVkgfCBIQVNfVElNRQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgU2NoZW1hVHlwZS5CVENfVElNRToKKyAgICAgICAgICAgICAgICAvL0hBU19USU1FCisgICAgICAgICAgICAgICAgY2xlYXJZZWFyKCk7CisgICAgICAgICAgICAgICAgY2xlYXJNb250aCgpOworICAgICAgICAgICAgICAgIGNsZWFyRGF5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb2RlVHlwZSBtdXN0IGJlIG9uZSBvZiBTY2hlbWFUeXBlIEJUQ18gIERBVEUgVElNRSByZWxhdGVkIHR5cGVzLiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRFTiA9IEJpZ0ludGVnZXIudmFsdWVPZigxMCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4gU3BlY2lmaWMgbW9tZW50cyBvcgorICAgICAqIHRpbWVzLW9mLWRheSBpbiBhIHNwZWNpZmllZCB0aW1lem9uZSBhcmUgbm9ybWFsaXplZCB0bworICAgICAqIFVUQyB0aW1lIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgc3RyaW5nIGZvcm0gZm9yIHRoZW0uCisgICAgICogT3RoZXIgcmVjdXJyaW5nIHRpbWUgc3BlY2lmaWNhdGlvbnMga2VlcCB0aGVpciB0aW1lem9uZQorICAgICAqIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY2Fub25pY2FsU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gbmVlZE5vcm1hbGl6ZSA9CisgICAgICAgICAgICAoaGFzVGltZVpvbmUoKSAmJiBnZXRUaW1lWm9uZVNpZ24oKSAhPSAwICYmIGhhc1RpbWUoKSAmJgorICAgICAgICAgICAgKChoYXNEYXkoKSA9PSBoYXNNb250aCgpICYmIGhhc0RheSgpID09IGhhc1llYXIoKSkpKTsKKworICAgICAgICBpZiAoIW5lZWROb3JtYWxpemUgJiYgZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciBiaSA9IGdldEZyYWN0aW9uKCkudW5zY2FsZWRWYWx1ZSgpOworICAgICAgICAgICAgbmVlZE5vcm1hbGl6ZSA9IChiaS5tb2QoVEVOKS5zaWdudW0oKSA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbmVlZE5vcm1hbGl6ZSkKKyAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpOworCisgICAgICAgIEdEYXRlQnVpbGRlciBjZGF0ZSA9IG5ldyBHRGF0ZUJ1aWxkZXIodGhpcyk7CisgICAgICAgIGNkYXRlLm5vcm1hbGl6ZSgpOworICAgICAgICByZXR1cm4gY2RhdGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0dXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFRoaXMgcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiB0aGF0IGlzIGF2YWlsYWJsZSwgaW5jbHVkaW5nIHRpbWV6b25lLiBGb3IgdHlwZXMgdGhhdCBjb3JyZXNwb25kCisgICAgICogdG8gZGVmaW5lZCBzY2hlbWEgdHlwZXMgKHNjaGVtYUJ1aWx0aW5UeXBlQ29kZSgpID4gMCksCisgICAgICogdGhpcyBwcm92aWRlcyB0aGUgbmF0dXJhbCBsZXhpY2FsIHJlcHJlc2VudGF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYm90aCB0aW1lIGFuZCB0aW1lem9uZSBhcmUgc3BlY2lmaWVkLCB0aGlzIHN0cmluZyBpcyBub3QKKyAgICAgKiB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIHVubGVzcyB0aGUgdGltZXpvbmUgaXMgVVRDIChaKQorICAgICAqIChzaW5jZSB0aGUgc2FtZSBtb21lbnQgaW4gdGltZSBjYW4gYmUgZXhwcmVzc2VkIGluIGRpZmZlcmVudAorICAgICAqIHRpbWV6b25lcykuIFRvIGdldCBhIGNhbm9uaWNhbCBzdHJpbmcsIHVzZSB0aGUgY2Fub25pY2FsU3RyaW5nKCkKKyAgICAgKiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gR0RhdGUuZm9ybWF0R0RhdGUodGhpcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVTcGVjaWZpY2F0aW9uLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0RhdGVTcGVjaWZpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhZjYxZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRGF0ZVNwZWNpZmljYXRpb24uamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gWE1MIFNjaGVtYS1jb21wYXRpYmxlIEdyZWdvcmlhbiBkYXRlLgorICogPHA+CisgKiBCb3RoIHRoZSBpbW11dGFibGUgR0RhdGUgYW5kIHRoZSBtdXRhYmxlIEdEYXRlQnVpbGRlciBhcmUKKyAqIEdEYXRlU3BlY2lmaWNhdGlvbnMuICBVc2UgdGhpcyBpbnRlcmZhY2Ugd2hlcmUgeW91IHdhbnQgdG8KKyAqIGFsbG93IGNhbGxlcnMgdG8gcGFzcyBhbnkgaW1wbGVtZW50YXRpb24gb2YgYSBHRGF0ZS4KKyAqIAorICogQHNlZSBHRGF0ZQorICogQHNlZSBYbWxDYWxlbmRhcgorICovCitwdWJsaWMgaW50ZXJmYWNlIEdEYXRlU3BlY2lmaWNhdGlvbgoreworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBmbGFncyBpbmRpY2F0aW5nIHRoZSBpbmZvcm1hdGlvbgorICAgICAqIGNvbnRhaW5lZCBieSB0aGlzIEdEYXRlLiAgVGhlIGZpdmUgZmxhZ3MgYXJlCisgICAgICoge0BsaW5rICNIQVNfVElNRVpPTkV9LCB7QGxpbmsgI0hBU19ZRUFSfSwge0BsaW5rICNIQVNfTU9OVEh9LAorICAgICAqIHtAbGluayAjSEFTX0RBWX0sIGFuZCB7QGxpbmsgI0hBU19USU1FfS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0RmxhZ3MoKTsKKworICAgIC8qKiBUaW1lem9uZSBpcyBzcGVjaWZpZWQuIFNlZSB7QGxpbmsgI2dldEZsYWdzfS4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IEhBU19USU1FWk9ORSA9IDE7CisgICAgLyoqIFllYXIgaXMgc3BlY2lmaWVkLiBTZWUge0BsaW5rICNnZXRGbGFnc30uICovCisgICAgcHVibGljIGZpbmFsIGludCBIQVNfWUVBUiA9IDI7CisgICAgLyoqIE1vbnRoIG9mIHllYXIgaXMgc3BlY2lmaWVkLiBTZWUge0BsaW5rICNnZXRGbGFnc30uICovCisgICAgcHVibGljIGZpbmFsIGludCBIQVNfTU9OVEggPSA0OworICAgIC8qKiBEYXkgb2YgbW9udGggaXMgc3BlY2lmaWVkLiBTZWUge0BsaW5rICNnZXRGbGFnc30uICovCisgICAgcHVibGljIGZpbmFsIGludCBIQVNfREFZID0gODsKKyAgICAvKiogVGltZSBvZiBkYXkgaXMgc3BlY2lmaWVkLiBTZWUge0BsaW5rICNnZXRGbGFnc30uICovCisgICAgcHVibGljIGZpbmFsIGludCBIQVNfVElNRSA9IDE2OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIEdEYXRlIHNwZWNpZmljYXRpb24gaXMgaW1tdXRhYmxlLiBHRGF0ZSByZXR1cm5zIHRydWUsCisgICAgICogYW5kIEdEYXRlQnVpbGRlciByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbW11dGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBHRGF0ZSBjb3JyZXNwb25kcyB0byBhIHZhbGlkIGdyZWdvcmlhbiBkYXRlIHZhbHVlCisgICAgICogaW4gWE1MIHNjaGVtYS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzVmFsaWQoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lem9uZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc1RpbWVab25lKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgZGF0ZS90aW1lIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgeWVhci4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc1llYXIoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBtb250aC1vZi15ZWFyLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzTW9udGgoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBkYXktb2YtbW9udGguCisgICAgICovCisgICAgYm9vbGVhbiBoYXNEYXkoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSB0aW1lLW9mLWRheS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc1RpbWUoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBkYXRlL3RpbWUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBmdWxsIGRhdGUgKHllYXIsIG1vbnRoLCBkYXkpCisgICAgICovCisgICAgYm9vbGVhbiBoYXNEYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB5ZWFyLiBTaG91bGQgYmUgYSBmb3VyLWRpZ2l0IHllYXIgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgZ2V0WWVhcigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhci4gSmFudWFyeSBpcyAxLgorICAgICAqLworICAgIGludCBnZXRNb250aCgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoLiBUaGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGggaXMgMS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0RGF5KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheS4gTWlkbmlnaHQgaXMgMCwgYW5kIDExUE0gaXMgMjMuCisgICAgICovCisgICAgaW50IGdldEhvdXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyLiBSYW5nZSBmcm9tIDAgdG8gNTkuCisgICAgICovCisgICAgaW50IGdldE1pbnV0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZS4gUmFuZ2UgZnJvbSAwIHRvIDU5LgorICAgICAqLworICAgIGludCBnZXRTZWNvbmQoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBzaWduLiBGb3IgdGltZSB6b25lcyBlYXN0IG9mIEdNVCwKKyAgICAgKiB0aGlzIGlzIHBvc2l0aXZlOyBmb3IgdGltZSB6b25lcyB3ZXN0LCB0aGlzIGlzIG5lZ2F0aXZlLgorICAgICAqLworICAgIGludCBnZXRUaW1lWm9uZVNpZ24oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBob3VyLgorICAgICAqIFRoaXMgaXMgYWx3YXlzIHBvc2l0aXZlOiBmb3IgdGhlIHNpZ24sIGxvb2sgYXQKKyAgICAgKiBnZXRUaW1lWm9uZVNpZ24oKS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VGltZVpvbmVIb3VyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0aW1lIHpvbmUgbWludXRlcy4KKyAgICAgKiBUaGlzIGlzIGFsd2F5cyBwb3NpdGl2ZTogZm9yIHRoZSBzaWduLCBsb29rIGF0CisgICAgICogZ2V0VGltZVpvbmVTaWduKCkuCisgICAgICovCisgICAgaW50IGdldFRpbWVab25lTWludXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmcmFjdGlvbi1vZi1zZWNvbmQuIFJhbmdlIGZyb20gMCAoaW5jbHVzaXZlKSB0byAxIChleGNsdXNpdmUpLgorICAgICAqLworICAgIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdW5kZWQgbWlsbGlzZWNvbmQgdmFsdWUuIFJhbmdlIGZyb20gMCB0byA5OTkKKyAgICAgKi8KKyAgICBpbnQgZ2V0TWlsbGlzZWNvbmQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEp1bGlhbiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBHcmVnb3JpYW4gZGF0ZS4KKyAgICAgKiBUaGUgSnVsaWFuIGRhdGUgKEpEKSBpcyBhIGNvbnRpbnVvdXMgY291bnQgb2YgZGF5cyBmcm9tCisgICAgICogMSBKYW51YXJ5IDQ3MTMgQkMgKD0gLTQ3MTIgSmFudWFyeSAxKS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0SnVsaWFuRGF0ZSgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGFuIHtAbGluayBYbWxDYWxlbmRhcn0uCisgICAgICogPHA+CisgICAgICoge0BsaW5rIFhtbENhbGVuZGFyfSBpcyBhIHN1YmNsYXNzIG9mIHtAbGluayBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXJ9CisgICAgICogd2hpY2ggaXMgc2xpZ2h0bHkgY3VzdG9taXplZCB0byBtYXRjaCBYTUwgc2NoZW1hIGRhdGUgcnVsZXMuCisgICAgICogPHA+CisgICAgICogVGhlIHJldHVybmVkIHtAbGluayBYbWxDYWxlbmRhcn0gaGFzIG9ubHkgdGhvc2UgdGltZSBhbmQgZGF0ZSBmaWVsZHMKKyAgICAgKiBzZXQgdGhhdCBhcmUgcmVmbGVjdGVkIGluIHRoZSBHRGF0ZSBvYmplY3QuICBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlCisgICAgICoge0BsaW5rIGphdmEudXRpbC5DYWxlbmRhcn0gY29udHJhY3Qgd29ya3MsIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgaXNTZXQoKSB2YW5pc2hlcworICAgICAqIGFzIHNvb24gYXMgeW91IHZpZXcgYW55IHVuc2V0IGZpZWxkIHVzaW5nIGdldCgpIG1ldGhvZHMuCisgICAgICogVGhpcyBtZWFucyB0aGF0IGlmIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoaWNoIGRhdGUgZmllbGRzCisgICAgICogYXJlIHNldCwgeW91IG11c3QgY2FsbCBpc1NldCgpIGZpcnN0IGJlZm9yZSBnZXQoKS4KKyAgICAgKi8KKyAgICBYbWxDYWxlbmRhciBnZXRDYWxlbmRhcigpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aW1lIGFzIGEgamF2YS51dGlsLkRhdGUKKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBEYXRlIGdldERhdGUoKTsKKworICAgIC8qKgorICAgICAqIENvbXBhcmlzb24gdG8gYW5vdGhlciBHRGF0ZS4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCisgICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKKyAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQorICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQorICAgICAqIDwvdWw+CisgICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cworICAgICAqIG9mIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnZGF0ZXNwZWMgdGhlIGRhdGUgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqLworICAgIGludCBjb21wYXJlVG9HRGF0ZShHRGF0ZVNwZWNpZmljYXRpb24gZ2RhdGVzcGVjKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ1aWx0aW4gdHlwZSBjb2RlIGZvciB0aGUgc2hhcGUgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgICogY29udGFpbmVkIGluIHRoaXMgaW5zdGFuY2UsIG9yIDAgaWYgdGhlCisgICAgICogaW5zdGFuY2UgZG9lc24ndCBjb250YWluIGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYQorICAgICAqIFNjaGVtYSB0eXBlLgorICAgICAqIDxwPiAKKyAgICAgKiBWYWx1ZSB3aWxsIGJlIGVxdWFsIHRvCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX05PVF9CVUlMVElOfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19ZRUFSX01PTlRIfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19NT05USH0sCisgICAgICoge0BsaW5rIFNjaGVtYVR5cGUjQlRDX0dfTU9OVEhfREFZfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfR19EQVl9LAorICAgICAqIHtAbGluayBTY2hlbWFUeXBlI0JUQ19EQVRFfSwKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfREFURV9USU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgU2NoZW1hVHlwZSNCVENfVElNRX0uCisgICAgICovCisgICAgaW50IGdldEJ1aWx0aW5UeXBlQ29kZSgpOworCisgICAgLyoqCisgICAgICogVGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFNwZWNpZmljIG1vbWVudHMgb3IKKyAgICAgKiB0aW1lcy1vZi1kYXkgaW4gYSBzcGVjaWZpZWQgdGltZXpvbmUgYXJlIG5vcm1hbGl6ZWQgdG8KKyAgICAgKiBVVEMgdGltZSB0byBwcm9kdWNlIGEgY2Fub25pY2FsIHN0cmluZyBmb3JtIGZvciB0aGVtLgorICAgICAqIE90aGVyIHJlY3VycmluZyB0aW1lIHNwZWNpZmljYXRpb25zIGtlZXAgdGhlaXIgdGltZXpvbmUKKyAgICAgKiBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBTdHJpbmcgY2Fub25pY2FsU3RyaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0dXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIFRoaXMgcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiB0aGF0IGlzIGF2YWlsYWJsZSwgaW5jbHVkaW5nIHRpbWV6b25lLiBGb3IgdHlwZXMgdGhhdCBjb3JyZXNwb25kCisgICAgICogdG8gZGVmaW5lZCBzY2hlbWEgdHlwZXMgKHNjaGVtYUJ1aWx0aW5UeXBlQ29kZSgpID4gMCksCisgICAgICogdGhpcyBwcm92aWRlcyB0aGUgbmF0dXJhbCBsZXhpY2FsIHJlcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogV2hlbiBib3RoIHRpbWUgYW5kIHRpbWV6b25lIGFyZSBzcGVjaWZpZWQsIHRoaXMgc3RyaW5nIGlzIG5vdAorICAgICAqIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gdW5sZXNzIHRoZSB0aW1lem9uZSBpcyBVVEMgKFopCisgICAgICogKHNpbmNlIHRoZSBzYW1lIG1vbWVudCBpbiB0aW1lIGNhbiBiZSBleHByZXNzZWQgaW4gZGlmZmVyZW50CisgICAgICogdGltZXpvbmVzKS4gVG8gZ2V0IGEgY2Fub25pY2FsIHN0cmluZywgdXNlIHRoZSBjYW5vbmljYWxTdHJpbmcoKQorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgdG9TdHJpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjA5NGQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIFhNTCBTY2hlbWEtY29tcGF0aWJsZSBkdXJhdGlvbi4KKyAqIDxwPgorICogQSBkdXJhdGlvbiBpcyBtYWRlIHVwIG9mIGEgbnVtYmVyIG9mIHllYXJzLCBtb250aHMsIGRheXMsIGhvdXJzLAorICogbWludXRlcywgc2Vjb25kcywgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzLiBTZWUgdGhlCisgKiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24KKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZHVyYXRpb24iPnNlY3Rpb24gb24geHM6ZHVyYXRpb248L2E+CisgKiBmb3IgZGV0YWlscyBvbiB0aGUgcnVsZXMgZm9yCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uLW9yZGVyIj5jb21wYXJpbmcgZHVyYXRpb25zPC9hPiBhbmQKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYWRkaW5nLWR1cmF0aW9ucy10by1kYXRlVGltZXMiPmFkZGluZyBkdXJhdGlvbnMgdG8gZGF0ZXM8L2E+LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR0R1cmF0aW9uIGltcGxlbWVudHMgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICBwcml2YXRlIGludCBfc2lnbjsKKyAgICBwcml2YXRlIGludCBfQ1k7CisgICAgcHJpdmF0ZSBpbnQgX007CisgICAgcHJpdmF0ZSBpbnQgX0Q7CisgICAgcHJpdmF0ZSBpbnQgX2g7CisgICAgcHJpdmF0ZSBpbnQgX207CisgICAgcHJpdmF0ZSBpbnQgX3M7CisgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIF9mczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgR0R1cmF0aW9uIHJlcHJlc2VudGluZyB6ZXJvIHNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIEdEdXJhdGlvbigpCisgICAgeworICAgICAgICBfc2lnbiA9ICsxOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX05PVEhJTkcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX1lFQVIgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX01PTlRIID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9EQVkgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX0hPVVIgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVOX01JTlVURSA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRU5fU0VDT05EID0gNjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb24gZnJvbSBhIGxleGljYWwKKyAgICAgKiByZXByZXNlbnRhdGlvbi4gVGhlIGxleGljYWwgc3BhY2UgY29udGFpbnMgdGhlCisgICAgICogdW5pb24gb2YgdGhlIGxleGljYWwgc3BhY2VzIG9mIGFsbCB0aGUgc2NoZW1hCisgICAgICogZGF0ZS90aW1lIHR5cGVzIChleGNlcHQgZm9yIGR1cmF0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0R1cmF0aW9uKENoYXJTZXF1ZW5jZSBzdHIpCisgICAgeworICAgICAgICAvLyBGb3JtOiAgICAgICAgLVBuWW5NbkRUbkhuTW5TCisgICAgICAgIC8vICh3aGVyZSBlYWNoIG4gbWF5IGJlIHByZWNlZGVkIGJ5IGEgLSBmb3IgdXMsIGFuZCB0aGUgd2hvbGUgbWF5IGJlIC0pCisKKyAgICAgICAgLy8gZmlyc3QgdHJpbSBYTUwgd2hpdGVzcGFjZQorICAgICAgICBpbnQgbGVuID0gc3RyLmxlbmd0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICB3aGlsZSAobGVuID4gMCAmJiBHRGF0ZS5pc1NwYWNlKHN0ci5jaGFyQXQobGVuIC0gMSkpKQorICAgICAgICAgICAgbGVuIC09IDE7CisgICAgICAgIHdoaWxlIChzdGFydCA8IGxlbiAmJiBHRGF0ZS5pc1NwYWNlKHN0ci5jaGFyQXQoc3RhcnQpKSkKKyAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisKKyAgICAgICAgX3NpZ24gPSAxOworICAgICAgICBib29sZWFuIHRtYXJrID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHN0YXJ0IDwgbGVuICYmIHN0ci5jaGFyQXQoc3RhcnQpID09ICctJykKKyAgICAgICAgeworICAgICAgICAgICAgX3NpZ24gPSAtMTsKKyAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhcnQgPj0gbGVuIHx8IHN0ci5jaGFyQXQoc3RhcnQpICE9ICdQJykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3QgYmVnaW4gd2l0aCBQIik7CisKKyAgICAgICAgc3RhcnQgKz0gMTsKKworICAgICAgICBpbnQgc2VlbiA9IFNFRU5fTk9USElORzsKKyAgICAgICAgX2ZzID0gR0RhdGUuX3plcm87CisKKyAgICAgICAgZm9yICg7c3RhcnQgPCBsZW47IHN0YXJ0ICs9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gbmVndmFsID0gZmFsc2U7CisgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChzdGFydCk7CisgICAgICAgICAgICBpZiAoY2ggPT0gJ1QnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0bWFyaykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVyYXRpb24gbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgVCciKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VlbiA+IFNFRU5fREFZKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUIGluIGR1cmF0aW9uIG11c3QgcHJlY2VkZSB0aW1lIGZpZWxkcyIpOworICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX0RBWTsKKyAgICAgICAgICAgICAgICB0bWFyayA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbGVuKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7CisgICAgICAgICAgICAgICAgY2ggPSBzdHIuY2hhckF0KHN0YXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PSAnLScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmVndmFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gbGVuKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gMTsKKyAgICAgICAgICAgICAgICBjaCA9IHN0ci5jaGFyQXQoc3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFHRGF0ZS5pc0RpZ2l0KGNoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGR1cmF0aW9uIik7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSBHRGF0ZS5kaWdpdFZhbChjaCk7CisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICAgICAgY2ggPSAoc3RhcnQgPCBsZW4pID8gc3RyLmNoYXJBdChzdGFydCkgOiAnXDAnOworICAgICAgICAgICAgICAgIGlmICghR0RhdGUuaXNEaWdpdChjaCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIEdEYXRlLmRpZ2l0VmFsKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PSAnLicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGkgPSBzdGFydDsKKyAgICAgICAgICAgICAgICBkbyBpICs9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgR0RhdGUuaXNEaWdpdChjaCA9IHN0ci5jaGFyQXQoaSkpKTsKKyAgICAgICAgICAgICAgICBfZnMgPSBuZXcgQmlnRGVjaW1hbChzdHIuc3ViU2VxdWVuY2Uoc3RhcnQsIGkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChpID49IGxlbiB8fCBjaCAhPSAnUycpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZHVyYXRpb24iKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmVndmFsKQorICAgICAgICAgICAgICAgIHZhbHVlID0gLXZhbHVlOworICAgICAgICAgICAgc3dpdGNoIChzZWVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9OT1RISU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1knKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9ZRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgX0NZID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9ZRUFSOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ00nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9NT05USDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9NT05USDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdEJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFNFRU5fREFZOworICAgICAgICAgICAgICAgICAgICAgICAgX0QgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSBTRUVOX0RBWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdIJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX0hPVVI7CisgICAgICAgICAgICAgICAgICAgICAgICBfaCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIFNFRU5fSE9VUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdNJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bWFyaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aW1lIGluIGR1cmF0aW9uIG11c3QgZm9sbG93IFQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBTRUVOX01JTlVURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgU0VFTl9NSU5VVEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnUycpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG1hcmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZSBpbiBkdXJhdGlvbiBtdXN0IGZvbGxvdyBUIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gU0VFTl9TRUNPTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBfcyA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXJhdGlvbiBtdXN0IHNwZWNpZnkgWSBNIEQgVCBIIE0gUyBpbiBvcmRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2lnbiwKKyAgICAgKiB5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsCisgICAgICogZnJhY3Rpb25hbCBzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBHRHVyYXRpb24oCisgICAgICAgICAgICBpbnQgc2lnbiwKKyAgICAgICAgICAgIGludCB5ZWFyLAorICAgICAgICAgICAgaW50IG1vbnRoLAorICAgICAgICAgICAgaW50IGRheSwKKyAgICAgICAgICAgIGludCBob3VyLAorICAgICAgICAgICAgaW50IG1pbnV0ZSwKKyAgICAgICAgICAgIGludCBzZWNvbmQsCisgICAgICAgICAgICBCaWdEZWNpbWFsIGZyYWN0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKHNpZ24gIT0gMSAmJiBzaWduICE9IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBfc2lnbiA9IHNpZ247CisgICAgICAgIF9DWSA9IHllYXI7CisgICAgICAgIF9NID0gbW9udGg7CisgICAgICAgIF9EID0gZGF5OworICAgICAgICBfaCA9IGhvdXI7CisgICAgICAgIF9tID0gbWludXRlOworICAgICAgICBfcyA9IHNlY29uZDsKKyAgICAgICAgX2ZzID0gZnJhY3Rpb24gPT0gbnVsbCA/IEdEYXRlLl96ZXJvIDogZnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiBmcm9tIGFub3RoZXIgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZ0R1cmF0aW9uKQorICAgIHsKKyAgICAgICAgX3NpZ24gPSBnRHVyYXRpb24uZ2V0U2lnbigpOworICAgICAgICBfQ1kgPSBnRHVyYXRpb24uZ2V0WWVhcigpOworICAgICAgICBfTSA9IGdEdXJhdGlvbi5nZXRNb250aCgpOworICAgICAgICBfRCA9IGdEdXJhdGlvbi5nZXREYXkoKTsKKyAgICAgICAgX2ggPSBnRHVyYXRpb24uZ2V0SG91cigpOworICAgICAgICBfbSA9IGdEdXJhdGlvbi5nZXRNaW51dGUoKTsKKyAgICAgICAgX3MgPSBnRHVyYXRpb24uZ2V0U2Vjb25kKCk7CisgICAgICAgIF9mcyA9IGdEdXJhdGlvbi5nZXRGcmFjdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbm90aGVyIEdEYXRlIHdpdGggdGhlIHNhbWUgdmFsdWUKKyAgICAgKiBhcyB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR0R1cmF0aW9uKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCBHRHVyYXRpb24gaW5zdGFuY2VzIHJldHVybiB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW1tdXRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpZ24gb2YgdGhlIGR1cmF0aW9uOiArMSBpcyBmb3J3YXJkcworICAgICAqIGFuZCAtMSBpcyBiYWNrd2FyZHMgaW4gdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFNpZ24oKQorICAgICAgICB7IHJldHVybiBfc2lnbjsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgeWVhciBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKKyAgICAgICAgeyByZXR1cm4gX0NZOyAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhciBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRNb250aCgpCisgICAgICAgIHsgcmV0dXJuIF9NOyAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERheSgpCisgICAgICAgIHsgcmV0dXJuIF9EOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRIb3VyKCkKKyAgICAgICAgeyByZXR1cm4gX2g7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCisgICAgICAgIHsgcmV0dXJuIF9tOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCisgICAgICAgIHsgcmV0dXJuIF9zOyB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCisgICAgICovCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKQorICAgICAgICB7IHJldHVybiBfZnM7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cworICAgICAqIG9mIHRoZSBkdXJhdGlvbiBhcmUgbm9ubmVnYXRpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCisgICAgeworICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5pc1ZhbGlkRHVyYXRpb24odGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCisgICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKKyAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQorICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQorICAgICAqIDwvdWw+CisgICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cworICAgICAqIG9mIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5jb21wYXJlRHVyYXRpb25zKHRoaXMsIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0dXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1cmF0aW9uLgorICAgICAqIDxwPgorICAgICAqIEFueSBjb21wb25lbnRzIHRoYXQgYXJlIHplcm8gYXJlIG9taXR0ZWQuIE5vdGUgdGhhdCBpZiB0aGUgZHVyYXRpb24KKyAgICAgKiBpcyBpbnZhbGlkLCBpLmUuLCBpdCBoYXMgbmVnYXRpdmUgY29tcG9uZW50cywgdGhvc2UgbmVnYXRpdmUKKyAgICAgKiBjb21wb25lbnRzIGFyZSBzZXJpYWxpemVkIG91dCBoZXJlLiBUbyBjaGVjayBmb3IgdmFsaWRpdHksIHVzZQorICAgICAqIHRoZSBpc1ZhbGlkKCkgbWV0aG9kOyBhbmQgdG8gbm9ybWFsaXplIG1vc3QgZHVyYXRpb25zIHRvIGEgdmFsaWQKKyAgICAgKiBmb3JtIHVzZSB0aGUgbm9ybWFsaXplKCkgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdEdXJhdGlvbkJ1aWxkZXIuZm9ybWF0RHVyYXRpb24odGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBHRHVyYXRpb24gd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGlzIG9uZSBhbmQgdGhlCisgICAgICogc3VwcGxpZWQgZHVyYXRpb24uICBEb2VzIGEgZmllbGR3aXNlIGFkZGl0aW9uLCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIEdEdXJhdGlvbiBhZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIGludCBzaWduID0gX3NpZ24gKiBkdXJhdGlvbi5nZXRTaWduKCk7CisgICAgICAgIHJldHVybiBfYWRkKGR1cmF0aW9uLCBzaWduKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IEdEdXJhdGlvbiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nCisgICAgICogdGhlIHN1cHBsaWVkIGR1cmF0aW9uIGZyb20gdGhpcyBvbmUuICBEb2VzIGEgZmllbGR3aXNlCisgICAgICogc3VidHJhY3Rpb24sIHdpdGggbm8gbm9ybWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0R1cmF0aW9uIHN1YnRyYWN0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICBpbnQgc2lnbiA9IC1fc2lnbiAqIGR1cmF0aW9uLmdldFNpZ24oKTsKKyAgICAgICAgcmV0dXJuIF9hZGQoZHVyYXRpb24sIHNpZ24pOworICAgIH0KKworICAgIHByaXZhdGUgR0R1cmF0aW9uIF9hZGQoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbiwgaW50IHNpZ24pCisgICAgeworICAgICAgICBHRHVyYXRpb24gcmVzdWx0ID0gbmV3IEdEdXJhdGlvbih0aGlzKTsKKyAgICAgICAgcmVzdWx0Ll9DWSArPSBzaWduICogZHVyYXRpb24uZ2V0WWVhcigpOworICAgICAgICByZXN1bHQuX00gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1vbnRoKCk7CisgICAgICAgIHJlc3VsdC5fRCArPSBzaWduICogZHVyYXRpb24uZ2V0RGF5KCk7CisgICAgICAgIHJlc3VsdC5faCArPSBzaWduICogZHVyYXRpb24uZ2V0SG91cigpOworICAgICAgICByZXN1bHQuX20gKz0gc2lnbiAqIGR1cmF0aW9uLmdldE1pbnV0ZSgpOworICAgICAgICByZXN1bHQuX3MgKz0gc2lnbiAqIGR1cmF0aW9uLmdldFNlY29uZCgpOworCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICAgIGlmIChyZXN1bHQuX2ZzLnNpZ251bSgpID09IDAgJiYgc2lnbiA9PSAxKQorICAgICAgICAgICAgcmVzdWx0Ll9mcyA9IGR1cmF0aW9uLmdldEZyYWN0aW9uKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdC5fZnMgPSBzaWduID4gMCA/CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5fZnMuYWRkKGR1cmF0aW9uLmdldEZyYWN0aW9uKCkpIDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Ll9mcy5zdWJ0cmFjdChkdXJhdGlvbi5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUd28gR0R1cmF0aW9ucyBhcmUgZXF1YWwgaWYgYWxsIHRoZWlyIGZpZWxkcyBhcmUgZXF1YWwuCisgICAgICogVGhlIGVxdWFscyBmdW5jdGlvbiBkb2VzIG5vdCBhcHBseSBub3JtYWxpemF0aW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopCisgICAgeworICAgICAgICBpZiAob2JqID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgR0R1cmF0aW9uKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBHRHVyYXRpb24gZHVyYXRpb24gPSAoR0R1cmF0aW9uKW9iajsKKyAgICAgICAgcmV0dXJuIChfc2lnbiA9PSBkdXJhdGlvbi5nZXRTaWduKCkgJiYKKyAgICAgICAgICAgICAgICBfQ1kgPT0gZHVyYXRpb24uZ2V0WWVhcigpICYmCisgICAgICAgICAgICAgICAgX00gPT0gZHVyYXRpb24uZ2V0TW9udGgoKSAmJgorICAgICAgICAgICAgICAgIF9EID09IGR1cmF0aW9uLmdldERheSgpICYmCisgICAgICAgICAgICAgICAgX2ggPT0gZHVyYXRpb24uZ2V0SG91cigpICYmCisgICAgICAgICAgICAgICAgX20gPT0gZHVyYXRpb24uZ2V0TWludXRlKCkgJiYKKyAgICAgICAgICAgICAgICBfcyA9PSBkdXJhdGlvbi5nZXRTZWNvbmQoKSAmJgorICAgICAgICAgICAgICAgIF9mcy5lcXVhbHMoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSkpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChfcyArCisgICAgICAgICAgICAgICAgX20gKiAoNjAgKyA3KSArCisgICAgICAgICAgICAgICAgX2ggKiAoNjAgKiA2MCArIDcpICsKKyAgICAgICAgICAgICAgICBfRCAqICg2MCAqIDYwICogMjQgKyA3KSArCisgICAgICAgICAgICAgICAgX00gKiAoNjAgKiA2MCAqIDI0ICogMzEgKyA3KSArCisgICAgICAgICAgICAgICAgX0NZICooNjAgKiA2MCAqIDI0ICogMzcyICsgNykgKworICAgICAgICAgICAgICAgIF9zaWduICogMTE5MTcwNDkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9HRHVyYXRpb25CdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGU0ZGYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNTk0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKKy8qKgorICogVXNlZCB0byBidWlsZCB7QGxpbmsgR0R1cmF0aW9uIEdEdXJhdGlvbnN9LgorICovIAorcHVibGljIGNsYXNzIEdEdXJhdGlvbkJ1aWxkZXIgaW1wbGVtZW50cyBHRHVyYXRpb25TcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIAorICAgIHByaXZhdGUgaW50IF9zaWduOworICAgIHByaXZhdGUgaW50IF9DWTsKKyAgICBwcml2YXRlIGludCBfTTsKKyAgICBwcml2YXRlIGludCBfRDsKKyAgICBwcml2YXRlIGludCBfaDsKKyAgICBwcml2YXRlIGludCBfbTsKKyAgICBwcml2YXRlIGludCBfczsKKyAgICBwcml2YXRlIEJpZ0RlY2ltYWwgX2ZzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBHRHVyYXRpb25CdWlsZGVyIHJlcHJlc2VudGluZyB6ZXJvIHNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIEdEdXJhdGlvbkJ1aWxkZXIoKQorICAgIHsKKyAgICAgICAgX3NpZ24gPSArMTsKKyAgICAgICAgX2ZzID0gR0RhdGUuX3plcm87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEdEdXJhdGlvbiBmcm9tIGEgbGV4aWNhbAorICAgICAqIHJlcHJlc2VudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBHRHVyYXRpb25CdWlsZGVyKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgdGhpcyhuZXcgR0R1cmF0aW9uKHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgR0R1cmF0aW9uQnVpbGRlciB3aXRoIHRoZSBzcGVjaWZpZWQgc2lnbiwKKyAgICAgKiB5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG9wdGlvbmFsCisgICAgICogZnJhY3Rpb25hbCBzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBHRHVyYXRpb25CdWlsZGVyKAorICAgICAgICAgICAgaW50IHNpZ24sCisgICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgIGludCBtb250aCwKKyAgICAgICAgICAgIGludCBkYXksCisgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgIGludCBtaW51dGUsCisgICAgICAgICAgICBpbnQgc2Vjb25kLAorICAgICAgICAgICAgQmlnRGVjaW1hbCBmcmFjdGlvbikKKyAgICB7CisgICAgICAgIGlmIChzaWduICE9IDEgJiYgc2lnbiAhPSAtMSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgX3NpZ24gPSBzaWduOworICAgICAgICBfQ1kgPSB5ZWFyOworICAgICAgICBfTSA9IG1vbnRoOworICAgICAgICBfRCA9IGRheTsKKyAgICAgICAgX2ggPSBob3VyOworICAgICAgICBfbSA9IG1pbnV0ZTsKKyAgICAgICAgX3MgPSBzZWNvbmQ7CisgICAgICAgIF9mcyA9IGZyYWN0aW9uID09IG51bGwgPyBHRGF0ZS5femVybyA6IGZyYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBHRHVyYXRpb25CdWlsZGVyIGZyb20gYW5vdGhlciBHRHVyYXRpb25CdWlsZGVyU3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgR0R1cmF0aW9uQnVpbGRlcihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGdEdXJhdGlvbikKKyAgICB7CisgICAgICAgIF9zaWduID0gZ0R1cmF0aW9uLmdldFNpZ24oKTsKKyAgICAgICAgX0NZID0gZ0R1cmF0aW9uLmdldFllYXIoKTsKKyAgICAgICAgX00gPSBnRHVyYXRpb24uZ2V0TW9udGgoKTsKKyAgICAgICAgX0QgPSBnRHVyYXRpb24uZ2V0RGF5KCk7CisgICAgICAgIF9oID0gZ0R1cmF0aW9uLmdldEhvdXIoKTsKKyAgICAgICAgX20gPSBnRHVyYXRpb24uZ2V0TWludXRlKCk7CisgICAgICAgIF9zID0gZ0R1cmF0aW9uLmdldFNlY29uZCgpOworICAgICAgICBfZnMgPSBnRHVyYXRpb24uZ2V0RnJhY3Rpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYW5vdGhlciBHRHVyYXRpb25CdWlsZGVyIHdpdGggdGhlIHNhbWUgdmFsdWUKKyAgICAgKiBhcyB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgR0R1cmF0aW9uQnVpbGRlcih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBHRHVyYXRpb24gZnJvbSB0aGlzIEdEdXJhdGlvbkJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIEdEdXJhdGlvbiB0b0dEdXJhdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEdEdXJhdGlvbih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRvIHRoaXMgZHVyYXRpb24uICBEb2VzIGEgZmllbGR3aXNlIGFkZCwgd2l0aCBubworICAgICAqIG5vcm1hbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICBpbnQgc2lnbiA9IF9zaWduICogZHVyYXRpb24uZ2V0U2lnbigpOworICAgICAgICBfYWRkKGR1cmF0aW9uLCBzaWduKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdHMgZnJvbSB0aGlzIGR1cmF0aW9uLiAgRG9lcyBhIGZpZWxkd2lzZSBzdWJ0cmFjdGlvbiwKKyAgICAgKiB3aXRoIG5vIG5vcm1hbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3VidHJhY3RHRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIGludCBzaWduID0gLV9zaWduICogZHVyYXRpb24uZ2V0U2lnbigpOworICAgICAgICBfYWRkKGR1cmF0aW9uLCBzaWduKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2FkZChHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uLCBpbnQgc2lnbikKKyAgICB7CisgICAgICAgIF9DWSArPSBzaWduICogZHVyYXRpb24uZ2V0WWVhcigpOworICAgICAgICBfTSArPSBzaWduICogZHVyYXRpb24uZ2V0TW9udGgoKTsKKyAgICAgICAgX0QgKz0gc2lnbiAqIGR1cmF0aW9uLmdldERheSgpOworICAgICAgICBfaCArPSBzaWduICogZHVyYXRpb24uZ2V0SG91cigpOworICAgICAgICBfbSArPSBzaWduICogZHVyYXRpb24uZ2V0TWludXRlKCk7CisgICAgICAgIF9zICs9IHNpZ24gKiBkdXJhdGlvbi5nZXRTZWNvbmQoKTsKKworICAgICAgICBpZiAoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChfZnMuc2lnbnVtKCkgPT0gMCAmJiBzaWduID09IDEpCisgICAgICAgICAgICBfZnMgPSBkdXJhdGlvbi5nZXRGcmFjdGlvbigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZnMgPSBzaWduID4gMCA/CisgICAgICAgICAgICAgICAgICAgIF9mcy5hZGQoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSkgOgorICAgICAgICAgICAgICAgICAgICBfZnMuc3VidHJhY3QoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2lnbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTaWduKGludCBzaWduKQorICAgIHsKKyAgICAgICAgaWYgKHNpZ24gIT0gMSAmJiBzaWduICE9IC0xKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBfc2lnbiA9IHNpZ247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgeWVhciBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0WWVhcihpbnQgeWVhcikKKyAgICAgICAgeyBfQ1kgPSB5ZWFyOyB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtb250aCBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9udGgoaW50IG1vbnRoKQorICAgICAgICB7IF9NID0gbW9udGg7IH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRheSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF5KGludCBkYXkpCisgICAgICAgIHsgX0QgPSBkYXk7ICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBob3VyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3VyKGludCBob3VyKQorICAgICAgICB7IF9oID0gaG91cjsgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1pbnV0ZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWludXRlKGludCBtaW51dGUpCisgICAgICAgIHsgX20gPSBtaW51dGU7IH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlY29uZCBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vjb25kKGludCBzZWNvbmQpCisgICAgICAgIHsgX3MgPSBzZWNvbmQ7IH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZCBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhY3Rpb24oQmlnRGVjaW1hbCBmcmFjdGlvbikKKyAgICAgICAgeyBfZnMgPSBmcmFjdGlvbiA9PSBudWxsID8gR0RhdGUuX3plcm8gOiBmcmFjdGlvbjsgfQorCisgICAgLyoqCisgICAgICogQWxsIEdEdXJhdGlvbiBpbnN0YW5jZXMgcmV0dXJuIHRydWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbW11dGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2lnbiBvZiB0aGUgZHVyYXRpb246ICsxIGlzIGZvcndhcmRzCisgICAgICogYW5kIC0xIGlzIGJhY2t3YXJkcyBpbiB0aW1lLgorICAgICAqIFRoaXMgdmFsdWUgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aGUKKyAgICAgKiB0cnVlIGRpcmVjdGlvbiBvZiB0aGUgZHVyYXRpb24gaWYgdGhlIGR1cmF0aW9uCisgICAgICogaXMgbm90IG5vcm1hbGl6ZWQgb3Igbm90IG5vcm1hbGl6YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFNpZ24oKQorICAgICAgICB7IHJldHVybiBfc2lnbjsgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgeWVhciBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRZZWFyKCkKKyAgICAgICAgeyByZXR1cm4gX0NZOyAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbW9udGgtb2YteWVhciBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRNb250aCgpCisgICAgICAgIHsgcmV0dXJuIF9NOyAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGF5LW9mLW1vbnRoIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERheSgpCisgICAgICAgIHsgcmV0dXJuIF9EOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBob3VyLW9mLWRheSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRIb3VyKCkKKyAgICAgICAgeyByZXR1cm4gX2g7IH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1pbnV0ZS1vZi1ob3VyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE1pbnV0ZSgpCisgICAgICAgIHsgcmV0dXJuIF9tOyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZWNvbmQtb2YtbWludXRlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldFNlY29uZCgpCisgICAgICAgIHsgcmV0dXJuIF9zOyB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZyYWN0aW9uLW9mLXNlY29uZC4gUmFuZ2UgZnJvbSAwIChpbmNsdXNpdmUpIHRvIDEgKGV4Y2x1c2l2ZSkuCisgICAgICovCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0RnJhY3Rpb24oKQorICAgICAgICB7IHJldHVybiBfZnM7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgb2YgdGhlIGluZGl2aWR1YWwgY29tcG9uZW50cworICAgICAqIG9mIHRoZSBkdXJhdGlvbiBhcmUgbm9ubmVnYXRpdmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCisgICAgeworICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5pc1ZhbGlkRHVyYXRpb24odGhpcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSBkdXJhdGlvbiB2YWx1ZS4gVGhpcyBlbnN1cmVzIHRoYXQgbW9udGhzLAorICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgZnJhY3Rpb25zIGFyZSBwb3NpdGl2ZSBhbmQKKyAgICAgKiB3aXRoaW4gdGhlIHJhbmdlcyAwLi4xMSwgMC4uMjMsIDAuLjU5LCBldGMuIE5lZ2F0aXZlCisgICAgICogZHVyYXRpb25zIGFyZSBpbmRpY2F0ZWQgYnkgYSBuZWdhdGl2ZSBzaWduIHJhdGhlcgorICAgICAqIHRoYW4gbmVnYXRpdmUgY29tcG9uZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBNb3N0IGR1cmF0aW9uIHNwZWNpZmljYXRpb25zIGNhbiBiZSBub3JtYWxpemVkIHRvCisgICAgICogdmFsaWQgZHVyYXRpb25zIHdpdGggYWxsIHBvc2l0aXZlIGNvbXBvbmVudHMsIGJ1dAorICAgICAqIG5vdCBhbGwgb2YgdGhlbSBjYW4uCisgICAgICogPHA+CisgICAgICogVGhlIG9ubHkgc2l0dWF0aW9ucyB3aGljaCBjYW5ub3QgYmUgbm9ybWFsaXplZCBhcmUKKyAgICAgKiB3aGVyZSB0aGUgeWVhci9tb250aCBhbmQgdGhlIGRheS9ob3VyL21pbnV0ZS9zZWNvbmQKKyAgICAgKiBvZmZzZXRzIGFyZSBvZiBvcHBvc2l0ZSBzaWduLiBEYXlzIGNhbm5vdCBiZSBjYXJyaWVkCisgICAgICogaW50byBtb250aHMgc2luY2UgdGhlIGxlbmd0aCBvZiBhIEdyZWdvcmlhbiBtb250aCBpcworICAgICAqIHZhcmlhYmxlIGRlcGVuZGluZyBvbiB3aGVuIHRoZSBkdXJhdGlvbiBpcyBhcHBsaWVkLgorICAgICAqIEluIHRoZXNlIGNhc2VzLCB0aGlzIG1ldGhvZCBub3JtYWxpemVzIHRoZSBjb21wb25lbnRzCisgICAgICogc28gdGhhdCAiZGF5IiBpcyB0aGUgb25seSBuZWdhdGl2ZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkKKyAgICB7CisgICAgICAgIF9ub3JtYWxpemVJbXBsKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGZRdW90aWVudChhLCBiKSA9IHRoZSBncmVhdGVzdCBpbnRlZ2VyIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhL2IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIF9mUXVvdGllbnQobG9uZyBhLCBpbnQgYikKKyAgICB7CisgICAgICAgIGlmICgoYSA8IDApID09IChiIDwgMCkpCisgICAgICAgICAgICByZXR1cm4gYSAvIGI7CisKKyAgICAgICAgcmV0dXJuIC0oKGIgLSBhIC0gMSkgLyBiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtb2R1bG8oYSwgYikgPSBhIC0gZlF1b3RpZW50KGEsYikqYgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfbW9kKGxvbmcgYSwgaW50IGIsIGxvbmcgcXVvdGllbnQpCisgICAgeworICAgICAgICByZXR1cm4gKGludCkoYSAtIHF1b3RpZW50KmIpIDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgaW1wbGVtZW5hdGlvbiBvZiBub3JtYWxpemUuIFRoZSBmbGFnIGlzCisgICAgICogdG8gZmFjaWxpdGF0ZSB0aGlzIG1ldGhvZCBjYWxsaW5nIGl0c2VsZiB3aXRob3V0CisgICAgICogZGFuZ2VyIG9mIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgX25vcm1hbGl6ZUltcGwoYm9vbGVhbiBhZGp1c3RTaWduKQorICAgIHsKKyAgICAgICAgbG9uZyB0ZW1wOworCisgICAgICAgIC8vIG1vbnRocyB0byB5ZWFycworICAgICAgICBpZiAoX00gPCAwIHx8IF9NID4gMTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSBfTTsKKyAgICAgICAgICAgIGxvbmcgeWNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCAxMik7CisgICAgICAgICAgICBfTSA9IF9tb2QodGVtcCwgMTIsIHljYXJyeSk7CisgICAgICAgICAgICBfQ1kgKz0geWNhcnJ5OworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBjYXJyeSA9IDA7CisKKyAgICAgICAgLy8gZnJhY3Rpb25zIHRvIHNlY29uZHMKKyAgICAgICAgaWYgKF9mcyAhPSBudWxsICYmIChfZnMuc2lnbnVtKCkgPCAwIHx8IF9mcy5jb21wYXJlVG8oR0RhdGUuX29uZSkgPj0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmRjYXJyeSA9IF9mcy5zZXRTY2FsZSgwLCBCaWdEZWNpbWFsLlJPVU5EX0ZMT09SKTsKKyAgICAgICAgICAgIF9mcyA9IF9mcy5zdWJ0cmFjdChiZGNhcnJ5KTsKKyAgICAgICAgICAgIGNhcnJ5ID0gYmRjYXJyeS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhcnJ5ICE9IDAgfHwgX3MgPCAwIHx8IF9zID4gNTkgfHwgX20gPCAwIHx8IF9tID4gNTAgfHwgX2ggPCAwIHx8IF9oID4gMjMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNlY29uZHMKKyAgICAgICAgICAgIHRlbXAgPSBfcyArIGNhcnJ5OworICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDYwKTsKKyAgICAgICAgICAgIF9zID0gX21vZCh0ZW1wLCA2MCwgY2FycnkpOworCisgICAgICAgICAgICAvLyBtaW51dGVzCisgICAgICAgICAgICB0ZW1wID0gX20gKyBjYXJyeTsKKyAgICAgICAgICAgIGNhcnJ5ID0gX2ZRdW90aWVudCh0ZW1wLCA2MCk7CisgICAgICAgICAgICBfbSA9IF9tb2QodGVtcCwgNjAsIGNhcnJ5KTsKKworICAgICAgICAgICAgLy8gaG91cnMKKyAgICAgICAgICAgIHRlbXAgPSBfaCArIGNhcnJ5OworICAgICAgICAgICAgY2FycnkgPSBfZlF1b3RpZW50KHRlbXAsIDI0KTsKKyAgICAgICAgICAgIF9oID0gX21vZCh0ZW1wLCAyNCwgY2FycnkpOworICAgICAgICAgICAgX0QgKz0gY2Fycnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX0NZID09IDAgJiYgX00gPT0gMCAmJiBfRCA9PSAwICYmIF9oID09IDAgJiYgX20gPT0gMCAmJiBfcyA9PSAwICYmIChfZnMgPT0gbnVsbCB8fCBfZnMuc2lnbnVtKCkgPT0gMCkpCisgICAgICAgICAgICBfc2lnbiA9IDE7CisKKyAgICAgICAgaWYgKGFkanVzdFNpZ24gJiYgKF9EIDwgMCB8fCBfQ1kgPCAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpZ24gPSAoX0QgPD0gMCAmJiAoX0NZIDwgMCB8fCBfQ1kgPT0gMCAmJiBfTSA9PSAwKSkgPyAtX3NpZ24gOiBfZ2V0VG90YWxTaWduU2xvd2x5KCk7CisgICAgICAgICAgICBpZiAoc2lnbiA9PSAyKQorICAgICAgICAgICAgICAgIHNpZ24gPSAoX0NZIDwgMCkgPyAtX3NpZ24gOiBfc2lnbjsKKyAgICAgICAgICAgIGlmIChzaWduID09IDApCisgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICBpZiAoc2lnbiAhPSBfc2lnbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2lnbiA9IHNpZ247CisgICAgICAgICAgICAgICAgX0NZID0gLV9DWTsKKyAgICAgICAgICAgICAgICBfTSA9IC1fTTsKKyAgICAgICAgICAgICAgICBfRCA9IC1fRDsKKyAgICAgICAgICAgICAgICBfaCA9IC1faDsKKyAgICAgICAgICAgICAgICBfbSA9IC1fbTsKKyAgICAgICAgICAgICAgICBfcyA9IC1fczsKKyAgICAgICAgICAgICAgICBpZiAoX2ZzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIF9mcyA9IF9mcy5uZWdhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9ub3JtYWxpemVJbXBsKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBzcGVjKQorICAgIHsKKyAgICAgICAgaWYgKCEoc3BlYy5nZXRTaWduKCkgPT0gMSB8fCBzcGVjLmdldFNpZ24oKSA9PSAtMSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIChzcGVjLmdldFllYXIoKSA+PSAwICYmIHNwZWMuZ2V0TW9udGgoKSA+PSAwICYmIHNwZWMuZ2V0RGF5KCkgPj0gMCAmJgorICAgICAgICAgICAgICAgIHNwZWMuZ2V0SG91cigpID49IDAgJiYgc3BlYy5nZXRNaW51dGUoKSA+PSAwICAmJiBzcGVjLmdldFNlY29uZCgpID49IDAgJiYKKyAgICAgICAgICAgICAgICBzcGVjLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPj0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCisgICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKKyAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQorICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQorICAgICAqIDwvdWw+CisgICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cworICAgICAqIG9mIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvR0R1cmF0aW9uKEdEdXJhdGlvblNwZWNpZmljYXRpb24gZHVyYXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gR0R1cmF0aW9uQnVpbGRlci5jb21wYXJlRHVyYXRpb25zKHRoaXMsIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmF0dXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1cmF0aW9uLgorICAgICAqIDxwPgorICAgICAqIEFueSBjb21wb25lbnRzIHRoYXQgYXJlIHplcm8gYXJlIG9taXR0ZWQuIE5vdGUgdGhhdCBpZiB0aGUgZHVyYXRpb24KKyAgICAgKiBpcyBpbnZhbGlkLCBpLmUuLCBpdCBoYXMgbmVnYXRpdmUgY29tcG9uZW50cywgdGhvc2UgbmVnYXRpdmUKKyAgICAgKiBjb21wb25lbnRzIGFyZSBzZXJpYWxpemVkIG91dCBoZXJlLiBUbyBjaGVjayBmb3IgdmFsaWRpdHksIHVzZQorICAgICAqIHRoZSBpc1ZhbGlkKCkgbWV0aG9kOyBhbmQgdG8gbm9ybWFsaXplIG1vc3QgZHVyYXRpb25zIHRvIGEgdmFsaWQKKyAgICAgKiBmb3JtIHVzZSB0aGUgbm9ybWFsaXplKCkgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEdEdXJhdGlvbkJ1aWxkZXIuZm9ybWF0RHVyYXRpb24odGhpcyk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGNvbXBhcmVEdXJhdGlvbnMoR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkMSwgR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkMikKKyAgICB7CisgICAgICAgIC8vIGZpcnN0IGRvIGFuIGFsbC1maWVsZHMgY2hlY2sKKyAgICAgICAgaWYgKGQxLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgPT0gMCAmJiBkMi5nZXRGcmFjdGlvbigpLnNpZ251bSgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzMSA9IGQxLmdldFNpZ24oKTsKKyAgICAgICAgICAgIGludCBzMiA9IGQyLmdldFNpZ24oKTsKKyAgICAgICAgICAgIGxvbmcgbW9udGgxID0gczEgKiAoKGxvbmcpZDEuZ2V0WWVhcigpICogMTIgKyBkMS5nZXRNb250aCgpKTsKKyAgICAgICAgICAgIGxvbmcgbW9udGgyID0gczIgKiAoKGxvbmcpZDIuZ2V0WWVhcigpICogMTIgKyBkMi5nZXRNb250aCgpKTsKKyAgICAgICAgICAgIGxvbmcgc2VjMSA9IHMxICogKCgoKGxvbmcpZDEuZ2V0RGF5KCkgKiAyNCArIGQxLmdldEhvdXIoKSkgKiA2MCArIGQxLmdldE1pbnV0ZSgpKSAqIDYwICsgZDEuZ2V0U2Vjb25kKCkpOworICAgICAgICAgICAgbG9uZyBzZWMyID0gczIgKiAoKCgobG9uZylkMi5nZXREYXkoKSAqIDI0ICsgZDIuZ2V0SG91cigpKSAqIDYwICsgZDIuZ2V0TWludXRlKCkpICogNjAgKyBkMi5nZXRTZWNvbmQoKSk7CisgICAgICAgICAgICBpZiAobW9udGgxID09IG1vbnRoMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VjMSA9PSBzZWMyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpZiAoc2VjMSA8IHNlYzIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBpZiAoc2VjMSA+IHNlYzIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vbnRoMSA8IG1vbnRoMiAmJiBzZWMxIC0gc2VjMiA8IDI4ICogMjQgKiA2MCAqIDYwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChtb250aDEgPiBtb250aDIgJiYgc2VjMiAtIHNlYzEgPCAyOCAqIDI0ICogNjAgKiA2MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBhbnN3ZXIgaXNuJ3Qgb2J2aW91cywgc28gdGhlbiBkbyBhIHRvdGFsLXNpZ24gY2hlY2sKKyAgICAgICAgR0R1cmF0aW9uQnVpbGRlciBkaWZmID0gbmV3IEdEdXJhdGlvbkJ1aWxkZXIoZDEpOworICAgICAgICBkaWZmLnN1YnRyYWN0R0R1cmF0aW9uKGQyKTsKKyAgICAgICAgcmV0dXJuIGRpZmYuX2dldFRvdGFsU2lnblNsb3dseSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlciBzY2hlbWEgc3BlYywgY29tcGFyaXNvbiBvZiBkdXJhdGlvbnMgaXMgc2ltcGx5IGRvbmUKKyAgICAgKiBieSBjYWxjdWxhdGluZyBhZGRpbmcgdGhlIGR1cmF0aW9uIHRvIHRoZXNlIGZvdXIgZGF0ZXMgYW5kCisgICAgICogY29tcGFyaW5nIHRoZSByZXN1bHRzLiBJZiB0aGUgcmVzdWx0cyBhcmUgYW1iaWd1b3VzLCB0aGUKKyAgICAgKiBhbnN3ZXIgaXMgImluY29tcGFyYWJsZSIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR0RhdGVbXSBfY29tcERhdGUgPSBuZXcgR0RhdGVbXQorICAgIHsKKyAgICAgICAgbmV3IEdEYXRlKDE2OTYsIDksIDEsIDAsIDAsIDAsIG51bGwsIDAsIDAsIDApLAorICAgICAgICBuZXcgR0RhdGUoMTY5NywgMiwgMSwgMCwgMCwgMCwgbnVsbCwgMCwgMCwgMCksCisgICAgICAgIG5ldyBHRGF0ZSgxOTAzLCAzLCAxLCAwLCAwLCAwLCBudWxsLCAwLCAwLCAwKSwKKyAgICAgICAgbmV3IEdEYXRlKDE5MDMsIDcsIDEsIDAsIDAsIDAsIG51bGwsIDAsIDAsIDApCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhpcyByZXR1cm5zIHRoZSB0b3RhbCBzaWduIG9mIHRoZSBkdXJhdGlvbiwgKzEKKyAgICAgKiBpZiB0aGUgZHVyYXRpb24gbW92ZXMgZm9yd2FyZCBpbiB0aW1lLCAtMSBpZiB0aGUKKyAgICAgKiBkdXJhdGlvbiBtb3ZlcyBiYWNrd2FyZHMgaW4gdGltZSwgMCBpZiB0aGUgZHVyYXRpb24KKyAgICAgKiBpcyB6ZXJvLWxlbmd0aCwgYW5kIDIgaWYgdGhlIGR1cmF0aW9uIG1heSBiZSBwb3NpdGl2ZQorICAgICAqIG9yIG5lZ2F0aXZlIGRlcGVuZGluZyBvbiB0aGUgZGF0ZS4KKyAgICAgKgorICAgICAqIChGb3IgZXhhbXBsZSwgb25lIG1vbnRoIG1pbnVzIDMwIGRheXMgaXMgaW5kZXRlcm1pbmF0ZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgX2dldFRvdGFsU2lnblNsb3dseSgpCisgICAgeworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgaW50IG5lZyA9IDA7CisgICAgICAgIGludCB6ZXIgPSAwOworCisgICAgICAgIEdEYXRlQnVpbGRlciBlbmRkYXRlID0gbmV3IEdEYXRlQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jb21wRGF0ZS5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZW5kZGF0ZS5zZXRHRGF0ZShfY29tcERhdGVbaV0pOworICAgICAgICAgICAgZW5kZGF0ZS5hZGRHRHVyYXRpb24odGhpcyk7CisgICAgICAgICAgICBzd2l0Y2ggKGVuZGRhdGUuY29tcGFyZVRvR0RhdGUoX2NvbXBEYXRlW2ldKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgICAgICBuZWcrKzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICB6ZXIrKzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBwb3MrKzsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zID09IF9jb21wRGF0ZS5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gKzE7CisgICAgICAgIGlmIChuZWcgPT0gX2NvbXBEYXRlLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHplciA9PSBfY29tcERhdGUubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBmb3JtYXREdXJhdGlvbihHRHVyYXRpb25TcGVjaWZpY2F0aW9uIGR1cmF0aW9uKQorICAgIHsKKyAgICAgICAgLy8gU2lnbitQOiAgICAgICgtKT9QCisgICAgICAgIC8vIFllYXI6ICAgICAgICAoPzooXGQrKVkpPworICAgICAgICAvLyBNb250aDogICAgICAgKD86KFxkKylNKT8KKyAgICAgICAgLy8gRGF5OiAgICAgICAgICg/OihcZCspRCk/CisgICAgICAgIC8vIFRpbWU6ICAgICAgICAoPzooVCkKKyAgICAgICAgLy8gSG91cnM6ICAgICAgICAgICg/OihcZCspSCk/CisgICAgICAgIC8vIE1pbnV0ZXM6ICAgICAgICAoPzooXGQrKU0pPworICAgICAgICAvLyBTZWNvbmRzOiAgICAgICAgKD86KFxkKyg/OlwuXGQqKT98KD86LlxkKylTKT8KKworICAgICAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoMzApOworCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRTaWduKCkgPCAwKQorICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJy0nKTsKKworICAgICAgICBtZXNzYWdlLmFwcGVuZCgnUCcpOworCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRZZWFyKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0WWVhcigpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdZJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVyYXRpb24uZ2V0TW9udGgoKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChkdXJhdGlvbi5nZXRNb250aCgpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdNJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVyYXRpb24uZ2V0RGF5KCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0RGF5KCkpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ0QnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRIb3VyKCkgIT0gMCB8fCBkdXJhdGlvbi5nZXRNaW51dGUoKSAhPSAwIHx8IGR1cmF0aW9uLmdldFNlY29uZCgpICE9IDAgfHwKKyAgICAgICAgICAgICAoZHVyYXRpb24uZ2V0RnJhY3Rpb24oKS5zaWdudW0oKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1QnKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRIb3VyKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0SG91cigpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdIJyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVyYXRpb24uZ2V0TWludXRlKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0TWludXRlKCkpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ00nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdXJhdGlvbi5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgcyA9IGR1cmF0aW9uLmdldEZyYWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24uZ2V0U2Vjb25kKCkgIT0gMCkKKyAgICAgICAgICAgICAgICBzID0gcy5hZGQoQmlnRGVjaW1hbC52YWx1ZU9mKGR1cmF0aW9uLmdldFNlY29uZCgpKSk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChzKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCdTJyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZHVyYXRpb24uZ2V0U2Vjb25kKCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZHVyYXRpb24uZ2V0U2Vjb25kKCkpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoJ1MnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtZXNzYWdlLmxlbmd0aCgpIDw9IDIpCisgICAgICAgICAgICAvLyBTcGVjaWZ5IHplcm8gc2Vjb25kcyBpZiBldmVyeXRoaW5nIHdhcyAwCisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiVDBTIik7CisKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvR0R1cmF0aW9uU3BlY2lmaWNhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvblNwZWNpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M1Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL0dEdXJhdGlvblNwZWNpZmljYXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBYTUwgU2NoZW1hLWNvbXBhdGlibGUgZHVyYXRpb24uCisgKiA8cD4KKyAqIEJvdGggdGhlIGltbXV0YWJsZSBHRHVyYXRpb24gYW5kIHRoZSBtdXRhYmxlIEdEdXJhdGlvbkJ1aWxkZXIgYXJlCisgKiBHRHVyYXRpb25TcGVjaWZpY2F0aW9ucy4gIFVzZSB0aGlzIGludGVyZmFjZSB3aGVyZSB5b3Ugd2FudCB0bworICogYWxsb3cgY2FsbGVycyB0byBwYXNzIGFueSBpbXBsZW1lbnRhdGlvbiBvZiBhIEdEdXJhdGlvbi4KKyAqIAorICogQHNlZSBHRHVyYXRpb24KKyAqLworcHVibGljIGludGVyZmFjZSBHRHVyYXRpb25TcGVjaWZpY2F0aW9uCit7CisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzSW1tdXRhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduIG9mIHRoZSBkdXJhdGlvbjogKzEgaXMgZm9yd2FyZHMKKyAgICAgKiBhbmQgLTEgaXMgYmFja3dhcmRzIGluIHRpbWUuCisgICAgICovCisgICAgaW50IGdldFNpZ24oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHllYXIgY29tcG9uZW50LgorICAgICAqLworICAgIGludCBnZXRZZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtb250aC1vZi15ZWFyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TW9udGgoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRheS1vZi1tb250aCBjb21wb25lbnQuCisgICAgICovCisgICAgaW50IGdldERheSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaG91ci1vZi1kYXkgY29tcG9uZW50LgorICAgICAqLworICAgIGludCBnZXRIb3VyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtaW51dGUtb2YtaG91ciBjb21wb25lbnQuCisgICAgICovCisgICAgaW50IGdldE1pbnV0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vjb25kLW9mLW1pbnV0ZSBjb21wb25lbnQuCisgICAgICovCisgICAgaW50IGdldFNlY29uZCgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZnJhY3Rpb24tb2Ytc2Vjb25kLiBSYW5nZSBmcm9tIDAgKGluY2x1c2l2ZSkgdG8gMSAoZXhjbHVzaXZlKS4KKyAgICAgKi8KKyAgICBCaWdEZWNpbWFsIGdldEZyYWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGNvbXBvbmVudHMKKyAgICAgKiBvZiB0aGUgZHVyYXRpb24gYXJlIG5vbm5lZ2F0aXZlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNWYWxpZCgpOworCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiB0byBhbm90aGVyIEdEdXJhdGlvbi4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlJldHVybnMgLTEgaWYgdGhpcyA8IGRhdGUuIChsZXNzLXRoYW4pCisgICAgICogPGxpPlJldHVybnMgMCBpZiB0aGlzID09IGRhdGUuIChlcXVhbCkKKyAgICAgKiA8bGk+UmV0dXJucyAxIGlmIHRoaXMgPiBkYXRlLiAoZ3JlYXRlci10aGFuKQorICAgICAqIDxsaT5SZXR1cm5zIDIgaWYgdGhpcyA8PiBkYXRlLiAoaW5jb21wYXJhYmxlKQorICAgICAqIDwvdWw+CisgICAgICogVHdvIGluc3RhbmNlcyBhcmUgaW5jb21wYXJhYmxlIGlmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgYW1vdW50cworICAgICAqIG9mIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIGludCBjb21wYXJlVG9HRHVyYXRpb24oR0R1cmF0aW9uU3BlY2lmaWNhdGlvbiBkdXJhdGlvbik7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVDYWNoZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU1ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lQ2FjaGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogQSBjYWNoZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvb2wgUU5hbWUgaW5zdGFuY2VzLiAgRWFjaCB0aHJlYWQgaGFzIG9uZS4KKyAqLyAKK3B1YmxpYyBmaW5hbCBjbGFzcyBRTmFtZUNhY2hlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEID0gMC43MGY7CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOworICAgIHByaXZhdGUgaW50IG51bUVudHJpZXMgPSAwOworICAgIHByaXZhdGUgaW50IHRocmVzaG9sZDsKKyAgICBwcml2YXRlIGludCBoYXNobWFzazsKKyAgICBwcml2YXRlIFFOYW1lW10gdGFibGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUU5hbWVDYWNoZSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsQ2FwYWNpdHkgYW5kIGxvYWRGYWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdG8gaW5pdGlhbGx5IG1ha2Ugc3BhY2UgZm9yCisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgYSBudW1iZXIgdG8gY29udHJvbCB0aGUgZGVuc2l0eSBvZiB0aGUgaGFzaHRhYmxlCisgICAgICovIAorICAgIHB1YmxpYyBRTmFtZUNhY2hlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpCisgICAgeworICAgICAgICBhc3NlcnQgaW5pdGlhbENhcGFjaXR5ID4gMDsKKyAgICAgICAgYXNzZXJ0IGxvYWRGYWN0b3IgPiAwICYmIGxvYWRGYWN0b3IgPCAxOworCisgICAgICAgIC8vIEZpbmQgYSBwb3dlciBvZiAyID49IGluaXRpYWxDYXBhY2l0eQorICAgICAgICBpbnQgY2FwYWNpdHkgPSAxNjsKKyAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSAKKyAgICAgICAgICAgIGNhcGFjaXR5IDw8PSAxOworICAgIAorICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOworICAgICAgICB0aGlzLmhhc2htYXNrID0gY2FwYWNpdHkgLSAxOworICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOworICAgICAgICB0YWJsZSA9IG5ldyBRTmFtZVtjYXBhY2l0eV07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFFOYW1lQ2FjaGUgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbENhcGFjaXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIGluaXRpYWxseSBtYWtlIHNwYWNlIGZvcgorICAgICAqLyAKKyAgICBwdWJsaWMgUU5hbWVDYWNoZShpbnQgaW5pdGlhbENhcGFjaXR5KQorICAgIHsKKyAgICAgICAgdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIFFOYW1lIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSBhbmQgbG9jYWxuYW1lLgorICAgICAqIENyZWF0ZXMgb25lIGlmIG9uZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIGxvY2FsbmFtZQorICAgICAqIEByZXR1cm4gdGhlIGNhY2hlZCBRTmFtZQorICAgICAqLyAKKyAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7CisgICAgICAgICovCisgICAgICAgIGFzc2VydCBsb2NhbE5hbWUgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gIiI7CisKKyAgICAgICAgaW50IGluZGV4ID0gaGFzaCh1cmksIGxvY2FsTmFtZSkgJiBoYXNobWFzazsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFFOYW1lIHEgPSB0YWJsZVtpbmRleF07CisgICAgICAgICAgICBpZiAocSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bUVudHJpZXMrKzsKKyAgICAgICAgICAgICAgICBpZiAobnVtRW50cmllcyA+PSB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgIHJlaGFzaCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2luZGV4XSA9IG5ldyBRTmFtZSh1cmksIGxvY2FsTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlcXVhbHMocSwgdXJpLCBsb2NhbE5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBxOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBpbmRleCA9IChpbmRleC0xKSAmIGhhc2htYXNrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlaGFzaCgpCisgICAgeworICAgICAgICBpbnQgbmV3TGVuZ3RoID0gdGFibGUubGVuZ3RoICogMjsKKyAgICAgICAgUU5hbWVbXSBuZXdUYWJsZSA9IG5ldyBRTmFtZVtuZXdMZW5ndGhdOworICAgICAgICBpbnQgbmV3SGFzaG1hc2sgPSBuZXdMZW5ndGggLSAxOworCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHRhYmxlLmxlbmd0aCA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgUU5hbWUgcSA9IHRhYmxlW2ldOworICAgICAgICAgICAgaWYgKHEgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBoYXNoKHEuZ2V0TmFtZXNwYWNlVVJJKCksIHEuZ2V0TG9jYWxQYXJ0KCkpICYgbmV3SGFzaG1hc2s7CisgICAgICAgICAgICAgICAgd2hpbGUgKG5ld1RhYmxlW25ld0luZGV4XSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBuZXdJbmRleCA9IChuZXdJbmRleCAtIDEpICYgbmV3SGFzaG1hc2s7CisgICAgICAgICAgICAgICAgbmV3VGFibGVbbmV3SW5kZXhdID0gcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRhYmxlID0gbmV3VGFibGU7CisgICAgICAgIGhhc2htYXNrID0gbmV3SGFzaG1hc2s7CisgICAgICAgIHRocmVzaG9sZCA9IChpbnQpKG5ld0xlbmd0aCAqIGxvYWRGYWN0b3IpOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuICh1cmkuaGFzaENvZGUoKSA8PCA1KSArIGxvY2FsTmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzKFFOYW1lIHEsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gcS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobG9jYWxOYW1lKSAmJiBxLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyh1cmkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYzUzMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldC5qYXZhCkBAIC0wLDAgKzEsNDQ2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBsYXR0aWNlIG9mIGZpbml0ZSBhbmQgaW5maW5pdGUgc2V0cyBvZiBRTmFtZXMuCisgKiBUaGUgbGF0dGljZSB0aGUgbWluaW1hbCBvbmUgdGhhdCBpcyBjbG9zZWQgdW5kZXIgdW5pb24sIGludGVyc2VjdGlvbiwgYW5kCisgKiBpbnZlcnNlLCBhbmQgY29udGFpbnMgaW5kaXZpZHVhbCBRTmFtZXMgYXMgd2VsbCBhcyBlbnRpcmUgbmFtZXNwYWNlcy4KKyAqIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB0d28ga2luZHMgb2YgUU5hbWVTZXRzOgorICogPHVsPgorICogPGxpPkEgUU5hbWVTZXQgY2FuIGNvdmVyIGEgZmluaXRlIHNldCBvZiBuYW1lc3BhY2VzLCBhZGRpdGlvbmFsbHkgaW5jbHVkaW5nIGEgZmluaXRlCisgKiAgICAgc2V0IG9mIFFOYW1lcyBvdXRzaWRlIHRob3NlIG5hbWVzcGFjZXMsIGFuZCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKyAqICAgICBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIGV4Y2x1ZGVkIGZyb20gdGhvc2UgbmFtZXNwYWVzOgorICogICA8dWw+CisgKiAgIDxsaT5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzID09IHRoZSBzZXQgb2YgZXhjbHVkZWQgUU5hbWVzIGZyb20gY292ZXJlZFVSSXMgbmFtZXNwYWNlcworICogICA8bGk+ZXhjbHVkZWRVUklzID09IG51bGwKKyAqICAgPGxpPmluY2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIGNvdmVyZWQgbmFtZXNwYWNlIFVSSXMKKyAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIG91dHNpZGUgY292ZXJlZFVSSXMgbmFtZXNwYWNlcworICogICA8L3VsPgorICogPC9saT4KKyAqIDxsaT5BIFFOYW1lU2V0IGNhbiBjb3ZlciBhbGwgbmFtZXNwYWNlcyBleGNlcHQgZm9yIGEgZmluaXRlIG51bWJlciBvZiBleGNsdWRlZCBvbmVzLAorICogICAgIGFkZGl0aW9uYWxseSBpbmNsdWRpbmcgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyB3aXRoaW4gdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXMsCisgKiAgICAgYW5kIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIGZpbml0ZSBzZXQgb2YgUU5hbWVzIG91dHNpZGUgdGhlIGV4Y2x1ZGVkIG5hbWVzcGFjZXM6CisgKiAgIDx1bD4KKyAqICAgPGxpPmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMgPT0gdGhlIHNldCBvZiBleGNsdWRlZCBRTmFtZXMgb3V0c2lkZSB1bmNvdmVyZWRVUklzIG5hbWVzcGFjZXMKKyAqICAgPGxpPmV4Y2x1ZGVkVVJJcyA9PSB0aGUgc2V0IG9mIHVuY292ZXJlZCBuYW1lc3BhY2UgVVJJcworICogICA8bGk+aW5jbHVkZWRVUklzID09IG51bGwKKyAqICAgPGxpPmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMgPT0gc2V0IG9mIGFkZGl0aW9uYWwgUU5hbWVzIGZyb20gdW5jb3ZlcmVkVVJJcyBuYW1lc3BhY2VzCisgKiAgIDwvdWw+CisgKiA8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogTm90aWNlIHRoYXQgYSBmaW5pdGUgc2V0IG9mIFFOYW1lcyBpcyBhIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgZmlyc3QKKyAqIGNhdGVnb3J5IG91dGxpbmVkIGFib3ZlOgorICogPHVsPgorICogPGxpPkEgUW5hbWVTZXQgY2FuIGNvbnRhaW4gYSBmaW5pdGUgbnVtYmVyIG9mIFFOYW1lczoKKyAqICAgPHVsPgorICogICA8bGk+ZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyA9PSBudWxsCisgKiAgIDxsaT5leGNsdWRlZFVSSXMgPT0gbnVsbAorICogICA8bGk+aW5jbHVkZWRVUklzID09IGVtcHR5IHNldAorICogICA8bGk+aW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyA9PSBzZXQgb2YgaW5jbHVkZWQgUU5hbWVzCisgKiAgIDwvdWw+CisgKiA8L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFFOYW1lU2V0IGltcGxlbWVudHMgUU5hbWVTZXRTcGVjaWZpY2F0aW9uLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIAorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfaW52ZXJ0ZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkVVJJczsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBfZXhjbHVkZWRRTmFtZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgX2luY2x1ZGVkUU5hbWVzOworCisgICAgLyoqCisgICAgICogVGhlIGVtcHR5IFFOYW1lU2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgRU1QVFkgPSBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgQUxMID0gbmV3IFFOYW1lU2V0KENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOworCisgICAgLyoqCisgICAgICogVGhlIFFOYW1lU2V0IGNvbnRhaW5pbmcgYWxsIFFOYW1lcyBpbiB0aGUgbG9jYWwgKG5vLSluYW1lc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZVNldCBMT0NBTCA9IG5ldyBRTmFtZVNldChudWxsLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIiIpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgUU5hbWVTZXQgY29udGFpbmluZyBhbGwgUU5hbWVzIGV4Y2VwdCBmb3IgdGhvc2UgaW4gdGhlIGxvY2FsIChuby0pbmFtZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWVTZXQgTk9OTE9DQUwgPSBuZXcgUU5hbWVTZXQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCIiKSwgbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBmdW5jdGlvbiB0byBtaW5pbWl6ZSBvYmplY3QgY3JlYXRpb24gd2hlbiBjb3B5aW5nIHNldHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0IG1pblNldENvcHkoU2V0IG9yaWdpbmFsKQorICAgIHsKKyAgICAgICAgaWYgKG9yaWdpbmFsID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKG9yaWdpbmFsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisgICAgICAgIGlmIChvcmlnaW5hbC5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ob3JpZ2luYWwuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQob3JpZ2luYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2V0cyBvZiBleGNsdWRlZCBVUklzLAorICAgICAqIGluY2x1ZGVkIFVSSXMsIGV4Y2x1ZGVkIFFOYW1lcyBpbiBpbmNsdWRlZCBuYW1lc3BhY2VzLCBhbmQgaW5jbHVkZWQKKyAgICAgKiBRTmFtZXMgaW4gZXhjbHVkZWQgbmFtZXNwYWNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQorICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQorICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKKyAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcworICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBmb3JTZXRzKFNldCBleGNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFVSSXMsIFNldCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykKKyAgICB7CisgICAgICAgIGlmICgoZXhjbHVkZWRVUklzICE9IG51bGwpID09IChpbmNsdWRlZFVSSXMgIT0gbnVsbCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKKworICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLmlzRW1wdHkoKSAmJiBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyA9PSBudWxsICYmIGV4Y2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gQUxMOworICAgICAgICBpZiAoZXhjbHVkZWRVUklzID09IG51bGwgJiYgaW5jbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGluY2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKKyAgICAgICAgICAgIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIExPQ0FMOworICAgICAgICBpZiAoaW5jbHVkZWRVUklzID09IG51bGwgJiYgZXhjbHVkZWRVUklzLnNpemUoKSA9PSAxICYmIGV4Y2x1ZGVkVVJJcy5jb250YWlucygiIikgJiYKKyAgICAgICAgICAgIGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIE5PTkxPQ0FMOworCisgICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQoCisgICAgICAgICAgICAgICAgbWluU2V0Q29weShleGNsdWRlZFVSSXMpLAorICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRVUklzKSwKKyAgICAgICAgICAgICAgICBtaW5TZXRDb3B5KGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMpLAorICAgICAgICAgICAgICAgIG1pblNldENvcHkoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgaW5jbHVkZWQgUU5hbWVzCisgICAgICogCisgICAgICogQHBhcmFtIGluY2x1ZGVkUU5hbWVzIHRoZSBhcnJheSBvZiBpbmNsdWRlZCBRTmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvckFycmF5KFFOYW1lW10gaW5jbHVkZWRRTmFtZXMpCisgICAgeworICAgICAgICBpZiAoaW5jbHVkZWRRTmFtZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluY2x1ZGVkUU5hbWVzIGNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVNldChudWxsLCBuZXcgSGFzaFNldCgpLCBudWxsLCBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KGluY2x1ZGVkUU5hbWVzKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZVNldCB3aXRoIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBnaXZlbgorICAgICAqIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3BpZWQgUU5hbWVTZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvclNwZWNpZmljYXRpb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNwZWMpCisgICAgeworICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIFFOYW1lU2V0KQorICAgICAgICAgICAgcmV0dXJuIChRTmFtZVNldClzcGVjOworICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyhzcGVjLmV4Y2x1ZGVkVVJJcygpLCBzcGVjLmluY2x1ZGVkVVJJcygpLCBzcGVjLmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSwgc3BlYy5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB3aWxkY2FyZCBuYW1lc3BhY2Ugc3RyaW5nLgorICAgICAqIFRoaXMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVUklzLCBwbHVzIHNwZWNpYWwgdG9rZW5zIGFzIHNwZWNpZmllZAorICAgICAqIGluIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gKCMjYW55LCAjI290aGVyLCAjI3RhcmdldE5hbWVzcGFjZSwgIyNsb2NhbCkuCisgICAgICogQHJldHVybiB0aGUgY29uc3RydWN0ZWQgUU5hbWVTZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lU2V0IGZvcldpbGRjYXJkTmFtZXNwYWNlU3RyaW5nKFN0cmluZyB3aWxkY2FyZCwgU3RyaW5nIHRhcmdldFVSSSkKKyAgICB7CisgICAgICAgIHJldHVybiBRTmFtZVNldC5mb3JTcGVjaWZpY2F0aW9uKG5ldyBRTmFtZVNldEJ1aWxkZXIod2lsZGNhcmQsIHRhcmdldFVSSSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZVNldCBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIFFOYW1lLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFFOYW1lU2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBRTmFtZVNldCBzaW5nbGV0b24oUU5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUU5hbWVTZXQobnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUU5hbWVTZXRCdWlsZGVyIHdob3NlIGNvbnRlbnRzIGFyZSBnaXZlbiBieQorICAgICAqIHRoZSBmb3VyIHNldHMuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN0dWN0b3IgaXMgUFJJVkFURSBiZWNhdXNlIGl0IHVzZXMgdGhlIGdpdmVuCisgICAgICogc2V0cyBkaXJlY3RseSwgYW5kIGl0IHRydXN0cyBpdHMgY2FsbGVycyB0byBzZXQgb25seSBpbW11dGFibGUgdmFsdWVzLgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgaXMgb25seSBjYWxsZWQgYnkgdGhlIHN0YXRpYyBidWlsZGVyIG1ldGhvZHMgb24KKyAgICAgKiBRTmFtZVNldDogdGhvc2UgbWV0aG9kcyBhcmUgYWxsIGNhcmVmdWwgYXNzaWduIG9ubHkgdW5jaGFuZ2luZyBzZXRzLgorICAgICAqLworICAgIHByaXZhdGUgUU5hbWVTZXQoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQorICAgIHsKKyAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBpbmNsdWRlZFVSSXM7CisgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzOworICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBleGNsdWRlZFVSSXM7CisgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzOworICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhbCB4bWwgbmFtZXMgYXJlIGhhc2VkIHVzaW5nICIiIGFzIHRoZSBuYW1lc3BhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5zRnJvbU5hbWUoUU5hbWUgeG1sTmFtZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBucyA9IHhtbE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgIHJldHVybiBucyA9PSBudWxsID8gIiIgOiBuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBxbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBpbiA9IF9pbmNsdWRlZFVSSXMuY29udGFpbnMobnNGcm9tTmFtZShuYW1lKSkgPworICAgICAgICAgICAgICAgICAgICAgIV9leGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSA6CisgICAgICAgICAgICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpOworICAgICAgICByZXR1cm4gX2ludmVydGVkIF4gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIE1vZGVsVHJhbnNpdGlvblNldCBjb250YWlucyBhbGwgUU5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfaW52ZXJ0ZWQgJiYgX2luY2x1ZGVkVVJJcy5pc0VtcHR5KCkgJiYgX2luY2x1ZGVkUU5hbWVzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIG5vIFFOYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiAhX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuaXNFbXB0eSgpICYmIF9pbmNsdWRlZFFOYW1lcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBvbmUgYW5kIGFub3RoZXIuCisgICAgICogQHBhcmFtIHNldCB0aGUgc2V0IHRvIGluc2Vyc2VjdCB3aXRoCisgICAgICogQHJldHVybiB0aGUgaW50ZXJzZWN0aW9uCisgICAgICovCisgICAgcHVibGljIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQorICAgIHsKKyAgICAgICAgUU5hbWVTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIodGhpcyk7CisgICAgICAgIHJlc3VsdC5yZXN0cmljdChzZXQpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvUU5hbWVTZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFFOYW1lU2V0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgorICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB1bmlvbiB3aXRoCisgICAgICogQHJldHVybiB0aGUgdW5pb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWVTZXQgdW5pb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOworICAgICAgICByZXN1bHQuYWRkQWxsKHNldCk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9RTmFtZVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWVTZXQgaW52ZXJzZSgpCisgICAgeworICAgICAgICBpZiAodGhpcyA9PSBFTVBUWSkKKyAgICAgICAgICAgIHJldHVybiBBTEw7CisgICAgICAgIGlmICh0aGlzID09IEFMTCkKKyAgICAgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICAgICAgaWYgKHRoaXMgPT0gTE9DQUwpCisgICAgICAgICAgICByZXR1cm4gTk9OTE9DQUw7CisgICAgICAgIGlmICh0aGlzID09IE5PTkxPQ0FMKQorICAgICAgICAgICAgcmV0dXJuIExPQ0FMOworICAgICAgICByZXR1cm4gbmV3IFFOYW1lU2V0KGluY2x1ZGVkVVJJcygpLCBleGNsdWRlZFVSSXMoKSwgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBhIHN1YnNldCBvZiB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRhaW5zIGFsbCBRTmFtZXMgY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQorICAgIHsKKyAgICAgICAgLy8gYS5jb250YWlucyhiKSA9PSBhLmludmVyc2UuaXNEaXNqb2ludChiKQorICAgICAgICBpZiAoIV9pbnZlcnRlZCAmJiBzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBpbnZlcnNlKCkuaXNEaXNqb2ludChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGdpdmVuIHNldCBpcyBkaXNqb2ludCBmcm9tIHRoaXMgb25lLgorICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCB0byB0ZXN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzZXQgaXMgZGlzam9pbnQgZnJvbSB0aGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGlzam9pbnQoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIGlmIChfaW52ZXJ0ZWQgJiYgc2V0LmV4Y2x1ZGVkVVJJcygpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKF9pbnZlcnRlZCkKKyAgICAgICAgICAgIHJldHVybiBpc0Rpc2pvaW50SW1wbChzZXQsIHRoaXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gaXNEaXNqb2ludEltcGwodGhpcywgc2V0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRGlzam9pbnRJbXBsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQxLCBRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MikKKyAgICB7CisgICAgICAgIFNldCBpbmNsdWRlVVJJcyA9IHNldDEuaW5jbHVkZWRVUklzKCk7CisgICAgICAgIFNldCBvdGhlckluY2x1ZGVVUklzID0gc2V0Mi5pbmNsdWRlZFVSSXMoKTsKKyAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVkZVVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXJJbmNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldCBvdGhlckV4Y2x1ZGVVUklzID0gc2V0Mi5leGNsdWRlZFVSSXMoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFvdGhlckV4Y2x1ZGVVUklzLmNvbnRhaW5zKGkubmV4dCgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNldDIuY29udGFpbnMoKFFOYW1lKWkubmV4dCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5jbHVkZVVSSXMuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDIuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXQxLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogTmFtZXNwYWNlcyB0aGF0IGFyZSBmdWxseSBleGNsdWRlZCBmcm9tIHRoZSBzZXQgZXhjZXB0IGZvciBhIGZpbml0ZQorICAgICAqIG51bWJlciBvZiBpbmRpdmlkdWFsIFFOYW1lIGV4Y2VwdGlvbnMuICBSZXR1cm5zIG51bGwgaWYgdGhpcyBzZXQgaXMgaW5maW5pdGUuCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIG5hbWVzcGFjZSBVUkkgc3RyaW5ncworICAgICAqLyAKKyAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkVVJJcygpCisgICAgeworICAgICAgICBpZiAoX2ludmVydGVkKSByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbmNsdWRlZFVSSXMpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2VzIHRoYXQgYXJlIGZ1bGx5IGluY2x1ZGVkIGluIHNldCBleGNlcHQgZm9yIGEgZmluaXRlCisgICAgICogbnVtYmVyIG9mIGluZGl2aWR1YWwgUU5hbWUgZXhjZXB0aW9ucy4gUmV0dXJucyBudWxsIGlmIHRoaXMgc2V0IGlzIGluZmluaXRlLgorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBuYW1lc3BhY2UgVVJJIHN0cmluZ3MKKyAgICAgKi8gCisgICAgcHVibGljIFNldCBpbmNsdWRlZFVSSXMoKQorICAgIHsKKyAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpIHJldHVybiBfaW5jbHVkZWRVUklzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBRTmFtZXMgZXhjbHVkZWQgZnJvbSB0aGUgc2V0IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHdpdGhpbgorICAgICAqIGEgbmFtZXNwYWNlIHRoYXQgaXMgb3RoZXJ3aXNlIGZ1bGx5IGluY2x1ZGVkIGluIHRoZSBzZXQuCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIGV4Y2x1ZGVkIFFOYW1lcyBmcm9tIHdpdGhpbiBpbmNsdWRlZFVSSSBuYW1lc3BhY2VzCisgICAgICovIAorICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpCisgICAgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbnZlcnRlZCA/IF9pbmNsdWRlZFFOYW1lcyA6IF9leGNsdWRlZFFOYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBRTmFtZXMgaW5jbHVkZWQgaW4gdGhlIHNldCBldmVuIHRob3VnaCB0aGV5IGFyZSB3aXRoaW4KKyAgICAgKiBhIG5hbWVzcGFjZSB0aGF0IGlzIG90aGVyd2lzZSBmdWxseSBpbmNsdWRlZCBpbiB0aGUgc2V0LgorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBpbmNsdWRlZCBRTmFtZXMgZnJvbSB3aXRoaW4gZXhjbHVkZWRVUkkgbmFtZXNwYWNlcworICAgICAqLyAKKyAgICBwdWJsaWMgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChfaW52ZXJ0ZWQgPyBfZXhjbHVkZWRRTmFtZXMgOiBfaW5jbHVkZWRRTmFtZXMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlRTmFtZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZywgc3ViamVjdCB0byBjaGFuZ2UuCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQoIlFOYW1lU2V0Iik7CisgICAgICAgIHNiLmFwcGVuZChfaW52ZXJ0ZWQgPyAiLSgiIDogIisoIik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFVSSXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIrKkAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpLm5leHQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2V4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHByZXR0eVFOYW1lKChRTmFtZSlpLm5leHQoKSkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9pbmNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIisiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXggPSBzYi5sYXN0SW5kZXhPZigiLCAiKTsKKyAgICAgICAgaWYgKGluZGV4ID4gMCkKKyAgICAgICAgICAgIHNiLnNldExlbmd0aChpbmRleCk7CisgICAgICAgIHNiLmFwcGVuZCgnKScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9RTmFtZVNldEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDcyNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBVc2VkIHRvIGJ1aWxkIHtAbGluayBRTmFtZVNldCBRTmFtZVNldHN9LgorICovIAorcHVibGljIGNsYXNzIFFOYW1lU2V0QnVpbGRlciBpbXBsZW1lbnRzIFFOYW1lU2V0U3BlY2lmaWNhdGlvbiwgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gX2ludmVydGVkOworICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFVSSXM7CisgICAgcHJpdmF0ZSBTZXQgX2V4Y2x1ZGVkUU5hbWVzOworICAgIHByaXZhdGUgU2V0IF9pbmNsdWRlZFFOYW1lczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgUU5hbWVTZXRCdWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoKQorICAgIHsKKyAgICAgICAgX2ludmVydGVkID0gZmFsc2U7CisgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4gYnkKKyAgICAgKiBhbm90aGVyIFFOYW1lU2V0U3BlY2lmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBRTmFtZVNldFNwZWNpZmljYWl0b24gdG8gY29weQorICAgICAqLworICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIFNldCBpbmNsdWRlZFVSSXMgPSBzZXQuaW5jbHVkZWRVUklzKCk7CisgICAgICAgIGlmIChpbmNsdWRlZFVSSXMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2ludmVydGVkID0gZmFsc2U7CisgICAgICAgICAgICBfaW5jbHVkZWRVUklzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRVUklzKTsKKyAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOworICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBfaW52ZXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgX2luY2x1ZGVkVVJJcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFVSSXMoKSk7CisgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKKyAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcyA9IG5ldyBIYXNoU2V0KHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFFOYW1lU2V0QnVpbGRlciB3aG9zZSBpbml0YWwgY29udGVudHMgYXJlIGdpdmVuIGJ5CisgICAgICogdGhlIGZvdXIgc2V0cy4gIEV4YWN0bHkgb25lIG9mIGVpdGhlciBleGNsdWRlZFVSSXMgb3IgaW5jbHVkZWRVUklzIG11c3QKKyAgICAgKiBiZSBub24tbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXhjbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUkkgc3RyaW5ncyB0byBleGNsdWRlIGZyb20gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQorICAgICAqIEBwYXJhbSBpbmNsdWRlZFVSSXMgdGhlIGZpbml0ZSBzZXQgb2YgbmFtZXNwYWNlIFVSSSBzdHJpbmdzIHRvIGluY2x1ZGUgaW4gdGhlIHNldCwgb3IgbnVsbCBpZiB0aGlzIHNldCBpcyBpbmZpbml0ZQorICAgICAqIEBwYXJhbSBleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzIHRoZSBmaW5pdGUgc2V0IG9mIGV4Y2VwdGlvbmFsIFFOYW1lcyB0byBleGNsdWRlIGZyb20gdGhlIGluY2x1ZGVkIG5hbWVzcGFjZXMKKyAgICAgKiBAcGFyYW0gZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyB0aGUgZmluaXRlIHNldCBvZiBleGNlcHRpb25hbCBRTmFtZXMgdG8gaW5jbHVkZSB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWQgbmFtZXNwYWNlcworICAgICAqLworICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMsIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKQorICAgIHsKKyAgICAgICAgaWYgKGluY2x1ZGVkVVJJcyAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJcyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfaW52ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFVSSXMpOworICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcyk7CisgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleGNsdWRlZFVSSXMgIT0gbnVsbCAmJiBpbmNsdWRlZFVSSXMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2ludmVydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFVSSXMpOworICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcyk7CisgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSBuZXcgSGFzaFNldChleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBleGNsdWRlZFVSSXMgYW5kIGluY2x1ZGVkVVJJcyBtdXN0IGJlIG51bGwiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBRTmFtZVNldEJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUgZ2l2ZW4KKyAgICAgKiBhcyBhIGxpc3Qgb2YgbmFtZXNwYWNlIFVSSXMsIHVzaW5nIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGJ5IHdpbGRjYXJkcworICAgICAqIGluIFhTRCBmaWxlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyIGEgd2lsZGNhcmQgbmFtZXNwYWNlIHNwZWNpZmljYXRpb24gc3RyaW5nIHN1Y2ggYXMgIiMjYW55IiwKKyAgICAgKiAgICAgICAgIiMjb3RoZXIiLCAiIyNsb2NhbCIsICIjI3RhcmdldE5hbWVzcGFjZSIsIG9yIGEgc3BhY2Utc2VwYXJhdGVkCisgICAgICogICAgICAgIGxpc3Qgb2YgVVJJcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VVJJIHRoZSBjdXJyZW50IHRhcmdldE5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBRTmFtZVNldEJ1aWxkZXIoU3RyaW5nIHN0ciwgU3RyaW5nIHRhcmdldFVSSSkKKyAgICB7CisgICAgICAgIHRoaXMoKTsKKworICAgICAgICBpZiAoc3RyID09IG51bGwpCisgICAgICAgICAgICBzdHIgPSAiIyNhbnkiOworCisgICAgICAgIFN0cmluZ1tdIHVyaSA9IHNwbGl0TGlzdChzdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVyaS5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGFkZHVyaSA9IHVyaVtpXTsKKyAgICAgICAgICAgIGlmIChhZGR1cmkuc3RhcnRzV2l0aCgiIyMiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkdXJpLmVxdWFscygiIyNvdGhlciIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBRTmFtZVNldEJ1aWxkZXIgdGVtcCA9IG5ldyBRTmFtZVNldEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UodGFyZ2V0VVJJKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5hZGROYW1lc3BhY2UoIiIpOworICAgICAgICAgICAgICAgICAgICB0ZW1wLmludmVydCgpOworICAgICAgICAgICAgICAgICAgICBhZGRBbGwodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGR1cmkuZXF1YWxzKCIjI2FueSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW52ZXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmlbaV0uZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVSSSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhZGR1cmkgPSB0YXJnZXRVUkk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVyaVtpXS5lcXVhbHMoIiMjbG9jYWwiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFkZHVyaSA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZE5hbWVzcGFjZShhZGR1cmkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvY2FsIHhtbCBuYW1lcyBhcmUgaGFzZWQgdXNpbmcgIiIgYXMgdGhlIG5hbWVzcGFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbnNGcm9tTmFtZShRTmFtZSBRTmFtZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBucyA9IFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICByZXR1cm4gbnMgPT0gbnVsbCA/ICIiIDogbnM7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjaCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzcGxpdExpc3QoU3RyaW5nIHMpCisgICAgeworICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOworICAgICAgICAgICAgICAgIAorICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBmb3IgKDs7KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgaXNTcGFjZShzLmNoYXJBdChpKSkpCisgICAgICAgICAgICAgICAgaSArPSAxOworICAgICAgICAgICAgaWYgKGkgPj0gcy5sZW5ndGgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKT09MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR0FSUkFZOworICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgICAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKCkgJiYgIWlzU3BhY2Uocy5jaGFyQXQoaSkpKQorICAgICAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQocy5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHhtbCBuYW1lcyBmcm9tIHFuYW1lc2V0IHdob3NlIG5hbWVzcGFjZSBtYXRjaGVzIHRoZSB1cmkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxNYXRjaGluZ05zKFN0cmluZyB1cmksIFNldCBxbmFtZXNldCkKKyAgICB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lc2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKG5zRnJvbU5hbWUoKFFOYW1lKWkubmV4dCgpKSkpCisgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgeG1sIG5hbWVzIGZyb20gcW5hbWVzZXQgd2hvc2UgbmFtZXNwYWNlIGlzIGluIHRoZQorICAgICAqIGZpcnN0IHNldCBvZiB1cmlzIGJ1dCBub3QgdGhlIHNlY29uZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1hdGNoaW5nRmlyc3RPbmx5KFNldCBzZXRGaXJzdCwgU2V0IHNldFNlY29uZCwgU2V0IHFuYW1lc2V0KQorICAgIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5zID0gbnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpOworICAgICAgICAgICAgaWYgKHNldEZpcnN0LmNvbnRhaW5zKG5zKSAmJiAhc2V0U2Vjb25kLmNvbnRhaW5zKG5zKSkKKyAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB4bWwgbmFtZXMgZnJvbSBxbmFtZXNldCB3aG9zZSBuYW1lc3BhY2UgaXMgaW4gYm90aAorICAgICAqIHNldHMgb2YgdXJpcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE1hdGNoaW5nQm90aChTZXQgc2V0Rmlyc3QsIFNldCBzZXRTZWNvbmQsIFNldCBxbmFtZXNldCkKKyAgICB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHFuYW1lc2V0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBucyA9IG5zRnJvbU5hbWUoKFFOYW1lKWkubmV4dCgpKTsKKyAgICAgICAgICAgIGlmIChzZXRGaXJzdC5jb250YWlucyhucykgJiYgc2V0U2Vjb25kLmNvbnRhaW5zKG5zKSkKKyAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB4bWwgbmFtZXMgZnJvbSBxbmFtZXNldCB3aG9zZSBuYW1lc3BhY2UgaXMgaW4gbmVpdGhlcgorICAgICAqIHNldCBvZiB1cmlzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsTWF0Y2hpbmdOZWl0aGVyKFNldCBzZXRGaXJzdCwgU2V0IHNldFNlY29uZCwgU2V0IHFuYW1lc2V0KQorICAgIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gcW5hbWVzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5zID0gbnNGcm9tTmFtZSgoUU5hbWUpaS5uZXh0KCkpOworICAgICAgICAgICAgaWYgKCFzZXRGaXJzdC5jb250YWlucyhucykgJiYgIXNldFNlY29uZC5jb250YWlucyhucykpCisgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBNb2RlbFRyYW5zaXRpb25TZXQgY29udGFpbnMgdGhlIGdpdmVuIHFuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFFOYW1lIG5hbWUpCisgICAgeworICAgICAgICBib29sZWFuIGluID0gX2luY2x1ZGVkVVJJcy5jb250YWlucyhuc0Zyb21OYW1lKG5hbWUpKSA/CisgICAgICAgICAgICAgICAgICAgICAhX2V4Y2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSk7CisgICAgICAgIHJldHVybiBfaW52ZXJ0ZWQgXiBpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIGFsbCBRTmFtZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBbGwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9pbnZlcnRlZCAmJiBfaW5jbHVkZWRVUklzLnNpemUoKSA9PSAwICYmIF9pbmNsdWRlZFFOYW1lcy5zaXplKCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgTW9kZWxUcmFuc2l0aW9uU2V0IGNvbnRhaW5zIG5vIFFOYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiAhX2ludmVydGVkICYmIF9pbmNsdWRlZFVSSXMuc2l6ZSgpID09IDAgJiYgX2luY2x1ZGVkUU5hbWVzLnNpemUoKSA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgb25lIGFuZCBhbm90aGVyLgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZVNldCBpbnRlcnNlY3QoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOworICAgICAgICByZXN1bHQucmVzdHJpY3Qoc2V0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1FOYW1lU2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBRTmFtZVNldCB0aGF0IGlzIHRoZSB1bmlvbiBvZiB0aGlzIG9uZSBhbmQgYW5vdGhlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWVTZXQgdW5pb24oUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIFFOYW1lU2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKHRoaXMpOworICAgICAgICByZXN1bHQuYWRkQWxsKHNldCk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9RTmFtZVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgUU5hbWVTZXQgdGhhdCBpcyB0aGUgaW52ZXJzZSBvZiB0aGlzIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWVTZXQgaW52ZXJzZSgpCisgICAgeworICAgICAgICByZXR1cm4gUU5hbWVTZXQuZm9yU2V0cyhpbmNsdWRlZFVSSXMoKSwgZXhjbHVkZWRVUklzKCksIGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgdGhpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIGlmICghX2ludmVydGVkICYmIHNldC5leGNsdWRlZFVSSXMoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGludmVyc2UoKS5pc0Rpc2pvaW50KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc2V0IGlzIGRpc2pvaW50IGZyb20gdGhpcyBvbmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXNqb2ludChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQorICAgIHsKKyAgICAgICAgaWYgKF9pbnZlcnRlZCAmJiBzZXQuZXhjbHVkZWRVUklzKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoX2ludmVydGVkKQorICAgICAgICAgICAgcmV0dXJuIGlzRGlzam9pbnRJbXBsKHNldCwgdGhpcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBpc0Rpc2pvaW50SW1wbCh0aGlzLCBzZXQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Rpc2pvaW50SW1wbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0MSwgUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldDIpCisgICAgeworICAgICAgICBTZXQgaW5jbHVkZVVSSXMgPSBzZXQxLmluY2x1ZGVkVVJJcygpOworICAgICAgICBTZXQgb3RoZXJJbmNsdWRlVVJJcyA9IHNldDIuaW5jbHVkZWRVUklzKCk7CisgICAgICAgIGlmIChvdGhlckluY2x1ZGVVUklzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG90aGVySW5jbHVkZVVSSXMuY29udGFpbnMoaS5uZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTZXQgb3RoZXJFeGNsdWRlVVJJcyA9IHNldDIuZXhjbHVkZWRVUklzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdWRlVVJJcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb3RoZXJFeGNsdWRlVVJJcy5jb250YWlucyhpLm5leHQoKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNldDEuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXQyLmNvbnRhaW5zKChRTmFtZSlpLm5leHQoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluY2x1ZGVVUklzLnNpemUoKSA+IDApCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZXQyLmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2V0MS5jb250YWlucygoUU5hbWUpaS5uZXh0KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgUU5hbWVTZXRCdWlsZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKQorICAgIHsKKyAgICAgICAgX2ludmVydGVkID0gZmFsc2U7CisgICAgICAgIF9pbmNsdWRlZFVSSXMuY2xlYXIoKTsKKyAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLmNsZWFyKCk7CisgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludmVydHMgdGhpcyBRTmFtZVNldEJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52ZXJ0KCkKKyAgICB7CisgICAgICAgIF9pbnZlcnRlZCA9ICFfaW52ZXJ0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNpbmdsZSBRTmFtZSB0byB0aGlzIFFOYW1lU2V0QnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUU5hbWUgcW5hbWUpCisgICAgeworICAgICAgICBpZiAoIV9pbnZlcnRlZCkKKyAgICAgICAgICAgIGFkZEltcGwocW5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1vdmVJbXBsKHFuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVudGlyZSBuYW1lc3BhY2UgVVJJIG9mIFFOYW1lcyB0byB0aGlzIFFOYW1lU2V0QnVpbGRlci4KKyAgICAgKiBUaGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQgdG8gc2lnbmlmaXkgdGhlIChsb2NhbCkgbm8tbmFtZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgdXJpKQorICAgIHsKKyAgICAgICAgaWYgKCFfaW52ZXJ0ZWQpCisgICAgICAgICAgICBhZGROYW1lc3BhY2VJbXBsKHVyaSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZUltcGwodXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIFFOYW1lU2V0IHRvIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQorICAgIHsKKyAgICAgICAgaWYgKF9pbnZlcnRlZCkKKyAgICAgICAgICAgIHJlbW92ZUFsbEltcGwoc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRBbGxJbXBsKHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBxbmFtZSBmcm9tIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShRTmFtZSBxbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChfaW52ZXJ0ZWQpCisgICAgICAgICAgICBhZGRJbXBsKHFuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3ZlSW1wbChxbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnRpcmUgbmFtZXNwYWNlIFVSSSBmcm9tIHRoaXMgUU5hbWVTZXRCdWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgdXJpKQorICAgIHsKKyAgICAgICAgaWYgKF9pbnZlcnRlZCkKKyAgICAgICAgICAgIGFkZE5hbWVzcGFjZUltcGwodXJpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3ZlTmFtZXNwYWNlSW1wbCh1cmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gUU5hbWVTZXQgZnJvbSB0aGlzIFFOYW1lU2V0QnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCkKKyAgICB7CisgICAgICAgIGlmIChfaW52ZXJ0ZWQpCisgICAgICAgICAgICBhZGRBbGxJbXBsKHNldC5pbmNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVtb3ZlQWxsSW1wbChzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKSwgc2V0LmV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3RzIHRoZSBjb250ZW50cyBvZiB0aGlzIFFOYW1lU2V0QnVpbGRlciB0byBiZSBhIHN1YnNldCBvZiB0aGUKKyAgICAgKiBnaXZlbiBRTmFtZVNldC4gSW4gb3RoZXIgd29yZHMsIGNvbXB1dGVzIGFuIGludGVyc2VjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXN0cmljdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KQorICAgIHsKKyAgICAgICAgaWYgKF9pbnZlcnRlZCkKKyAgICAgICAgICAgIGFkZEFsbEltcGwoc2V0LmV4Y2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRVUklzKCksIHNldC5leGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCksIHNldC5pbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1vdmVBbGxJbXBsKHNldC5leGNsdWRlZFVSSXMoKSwgc2V0LmluY2x1ZGVkVVJJcygpLCBzZXQuZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpLCBzZXQuaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhZGQocW5hbWUpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEltcGwoUU5hbWUgcW5hbWUpCisgICAgeworICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyhuc0Zyb21OYW1lKHFuYW1lKSkpCisgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMucmVtb3ZlKHFuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX2luY2x1ZGVkUU5hbWVzLmFkZChxbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWRkKG5zKSB0aGF0IGlnbm9yZXMgaW52ZXJzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2VJbXBsKFN0cmluZyB1cmkpCisgICAgeworICAgICAgICBpZiAoX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZW1vdmVBbGxNYXRjaGluZ05zKHVyaSwgX2V4Y2x1ZGVkUU5hbWVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTnModXJpLCBfaW5jbHVkZWRRTmFtZXMpOworICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5hZGQodXJpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFkZChzZXQpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsbEltcGwoU2V0IGluY2x1ZGVkVVJJcywgU2V0IGV4Y2x1ZGVkVVJJcywgU2V0IGluY2x1ZGVkUU5hbWVzLCBTZXQgZXhjbHVkZWRRTmFtZXMpCisgICAgeworICAgICAgICBib29sZWFuIGV4Y2x1ZGUgPSAoZXhjbHVkZWRVUklzICE9IG51bGwpOworICAgICAgICBTZXQgc3BlY2lhbFVSSXMgPSBleGNsdWRlID8gZXhjbHVkZWRVUklzIDogaW5jbHVkZWRVUklzOworCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9leGNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKWkubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zRnJvbU5hbWUobmFtZSk7CisgICAgICAgICAgICBpZiAoKGV4Y2x1ZGUgXiBzcGVjaWFsVVJJcy5jb250YWlucyh1cmkpKSAmJiAhZXhjbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmICghX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpICYmICFfaW5jbHVkZWRRTmFtZXMuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmICghX2luY2x1ZGVkVVJJcy5jb250YWlucyh1cmkpKQorICAgICAgICAgICAgICAgIF9pbmNsdWRlZFFOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXhjbHVkZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlQWxsTWF0Y2hpbmdGaXJzdE9ubHkoaW5jbHVkZWRVUklzLCBfaW5jbHVkZWRVUklzLCBfaW5jbHVkZWRRTmFtZXMpOworICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5hZGRBbGwoaW5jbHVkZWRVUklzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTmVpdGhlcihleGNsdWRlZFVSSXMsIF9pbmNsdWRlZFVSSXMsIF9pbmNsdWRlZFFOYW1lcyk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFleGNsdWRlZFVSSXMuY29udGFpbnModXJpKSkKKyAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXhjbHVkZWRVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCisgICAgICAgICAgICAgICAgICAgIF9pbmNsdWRlZFVSSXMuYWRkKHVyaSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfaW5jbHVkZWRVUklzLnJlbW92ZSh1cmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0IHRlbXAgPSBfZXhjbHVkZWRRTmFtZXM7CisgICAgICAgICAgICBfZXhjbHVkZWRRTmFtZXMgPSBfaW5jbHVkZWRRTmFtZXM7CisgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMgPSB0ZW1wOworICAgICAgICAgICAgX2ludmVydGVkID0gIV9pbnZlcnRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHJlbW92ZShxbmFtZSkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlSW1wbChRTmFtZSBxbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKG5zRnJvbU5hbWUocW5hbWUpKSkKKyAgICAgICAgICAgIF9leGNsdWRlZFFOYW1lcy5hZGQocW5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMucmVtb3ZlKHFuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiByZW1vdmUobnMpIHRoYXQgaWdub3JlcyBpbnZlcnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU5hbWVzcGFjZUltcGwoU3RyaW5nIHVyaSkKKyAgICB7CisgICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTnModXJpLCBfZXhjbHVkZWRRTmFtZXMpOworICAgICAgICAgICAgX2luY2x1ZGVkVVJJcy5yZW1vdmUodXJpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nTnModXJpLCBfaW5jbHVkZWRRTmFtZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgcmVtb3ZlKHNldCkgdGhhdCBpZ25vcmVzIGludmVyc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWxsSW1wbChTZXQgaW5jbHVkZWRVUklzLCBTZXQgZXhjbHVkZWRVUklzLCBTZXQgaW5jbHVkZWRRTmFtZXMsIFNldCBleGNsdWRlZFFOYW1lcykKKyAgICB7CisgICAgICAgIGJvb2xlYW4gZXhjbHVkZSA9IChleGNsdWRlZFVSSXMgIT0gbnVsbCk7CisgICAgICAgIFNldCBzcGVjaWFsVVJJcyA9IGV4Y2x1ZGUgPyBleGNsdWRlZFVSSXMgOiBpbmNsdWRlZFVSSXM7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2luY2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChleGNsdWRlIF4gc3BlY2lhbFVSSXMuY29udGFpbnModXJpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVkUU5hbWVzLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGluY2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkpCisgICAgICAgICAgICAgICAgX2V4Y2x1ZGVkUU5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGV4Y2x1ZGVkUU5hbWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFFOYW1lIG5hbWUgPSAoUU5hbWUpaS5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNGcm9tTmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChfaW5jbHVkZWRVUklzLmNvbnRhaW5zKHVyaSkgJiYgIV9leGNsdWRlZFFOYW1lcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgICAgICBfaW5jbHVkZWRRTmFtZXMuYWRkKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4Y2x1ZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nRmlyc3RPbmx5KF9pbmNsdWRlZFVSSXMsIGV4Y2x1ZGVkVVJJcywgX2V4Y2x1ZGVkUU5hbWVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZUFsbE1hdGNoaW5nQm90aChfaW5jbHVkZWRVUklzLCBpbmNsdWRlZFVSSXMsIF9leGNsdWRlZFFOYW1lcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChleGNsdWRlIF4gc3BlY2lhbFVSSXMuY29udGFpbnMoaS5uZXh0KCkpKQorICAgICAgICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGV4Y2x1ZGVkVVJJcygpCisgICAgeworICAgICAgICBpZiAoX2ludmVydGVkKSByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbmNsdWRlZFVSSXMpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGluY2x1ZGVkVVJJcygpCisgICAgeworICAgICAgICBpZiAoIV9pbnZlcnRlZCkgcmV0dXJuIF9pbmNsdWRlZFVSSXM7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZXhjbHVkZWRRTmFtZXNJbkluY2x1ZGVkVVJJcygpCisgICAgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbnZlcnRlZCA/IF9pbmNsdWRlZFFOYW1lcyA6IF9leGNsdWRlZFFOYW1lcyk7CisgICAgfQorCisgICAgcHVibGljIFNldCBpbmNsdWRlZFFOYW1lc0luRXhjbHVkZWRVUklzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoX2ludmVydGVkID8gX2V4Y2x1ZGVkUU5hbWVzIDogX2luY2x1ZGVkUU5hbWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmV0dHlRTmFtZShRTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKSArICJAIiArIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZywgc3ViamVjdCB0byBjaGFuZ2UuCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQoIlFOYW1lU2V0QnVpbGRlciIpOworICAgICAgICBzYi5hcHBlbmQoX2ludmVydGVkID8gIi0oIiA6ICIrKCIpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRVUklzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiKypAIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaS5uZXh0KCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9leGNsdWRlZFFOYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChwcmV0dHlRTmFtZSgoUU5hbWUpaS5uZXh0KCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfaW5jbHVkZWRRTmFtZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIrIik7CisgICAgICAgICAgICBzYi5hcHBlbmQocHJldHR5UU5hbWUoKFFOYW1lKWkubmV4dCgpKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gc2IubGFzdEluZGV4T2YoIiwgIik7CisgICAgICAgIGlmIChpbmRleCA+IDApCisgICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5kZXgpOworICAgICAgICBzYi5hcHBlbmQoJyknKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgUU5hbWVTZXR9IGVxdWl2YWxlbnQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcworICAgICAqIFFOYW1lU2V0QnVpbGRlci4KKyAgICAgKi8gCisgICAgcHVibGljIFFOYW1lU2V0IHRvUU5hbWVTZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFFOYW1lU2V0LmZvclNwZWNpZmljYXRpb24odGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0U3BlY2lmaWNhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1FOYW1lU2V0U3BlY2lmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDJmMTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvUU5hbWVTZXRTcGVjaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbGF0dGljZSBvZiBmaW5pdGUgYW5kIGluZmluaXRlIHNldHMgb2YgUU5hbWVzLgorICogCisgKiBAc2VlIFFOYW1lU2V0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUU5hbWVTZXRTcGVjaWZpY2F0aW9uCit7CisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBRTmFtZS4KKyAgICAgKgorICAgICAqIFJvdWdobHkgZXF1aXZhbGVudCB0bzoKKyAgICAgKiAgICAoaW5jbHVkZWRVUklzKCkgPT0gbnVsbCA/CisgICAgICogICAgICAgICAgIGV4Y2x1ZGVkVVJJcygpLmNvbnRhaW5zKG5hbWVzcGFjZSkgOgorICAgICAqICAgICAgICAgICBpbmNsdWRlZFVSSXMoKS5jb250YWlucyhuYW1lc3BhY2UpCisgICAgICogICAgKSA/CisgICAgICogICAgICAgICFleGNsdWRlZFFOYW1lc0luSW5jbHVkZWRVUklzKCkuY29udGFpbnMobmFtZSkgOgorICAgICAqICAgICAgICAgaW5jbHVkZWRRTmFtZXNJbkV4Y2x1ZGVkVVJJcygpLmNvbnRhaW5zKG5hbWUpCisgICAgICovCisgICAgYm9vbGVhbiBjb250YWlucyhRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHNldCBpcyB0aGUgc2V0IG9mIGFsbCBRTmFtZXMuCisgICAgICovCisgICAgYm9vbGVhbiBpc0FsbCgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgc2V0IGlzIGVtcHR5LgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbXB0eSgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgc3Vic2V0IG9mIHRoaXMgc2V0LgorICAgICAqLyAKKyAgICBib29sZWFuIGNvbnRhaW5zQWxsKFFOYW1lU2V0U3BlY2lmaWNhdGlvbiBzZXQpOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgaXMgZGlzam9pbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNldC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRGlzam9pbnQoUU5hbWVTZXRTcGVjaWZpY2F0aW9uIHNldCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gd2l0aCBhbm90aGVyIFFOYW1lU2V0LgorICAgICAqLworICAgIFFOYW1lU2V0IGludGVyc2VjdChRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaW9uIHdpdGggYW5vdGhlciBRTmFtZVNldC4KKyAgICAgKi8KKyAgICBRTmFtZVNldCB1bmlvbihRTmFtZVNldFNwZWNpZmljYXRpb24gc2V0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW52ZXJzZSBvZiB0aGlzIFFOYW1lU2V0LiBUaGF0IGlzIHRoZSBRTmFtZVNldCB3aGljaAorICAgICAqIGNvbnRhaW5zIGFsbCB0aGUgUU5hbWVzIG5vdCBjb250YWluZWQgaW4gdGhpcyBzZXQuIEluIG90aGVyIHdvcmRzCisgICAgICogZm9yIHdoaWNoIHNldC5jb250YWlucyhuYW1lKSAhPSBzZXQuaW52ZXJzZSgpLmNvbnRhaW5zKG5hbWUpIGZvcgorICAgICAqIGFsbCBuYW1lcy4KKyAgICAgKi8KKyAgICBRTmFtZVNldCBpbnZlcnNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmluaXRlIHNldCBvZiBuYW1lc3BhY2UgVVJJcyB0aGF0IGFyZSBhbG1vc3QgY29tcGxldGVseSBleGNsdWRlZCBmcm9tCisgICAgICogdGhlIHNldCAodGhhdCBpcywgZWFjaCBuYW1lc3BhY2UgVVJJIHRoYXQgaW5jbHVkZWQgaW4gdGhlIHNldCB3aXRoIHdpdGgKKyAgICAgKiBhIGZpbml0ZSBudW1iZXIgb2YgUU5hbWUgZXhjZXB0aW9ucykuIE51bGwgaWYgdGhlIHNldCBvZiBuYW1lc3BhY2VVUklzCisgICAgICogdGhhdCBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgaW5jbHVkZWQgaXMgaW5maW5pdGUuCisgICAgICogPHA+CisgICAgICogTnVsbCAobWVhbmluZyBhbG1vc3QgYWxsIFVSSXMgZXhjbHVkZWQpIGlmIGluY2x1ZGVkVVJJcygpIGlzIG5vbi1udWxsOworICAgICAqIG5vbi1udWxsIG90aGVyd2lzZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc2FtZSBzZXQgYXMgaW52ZXJzZSgpLmluY2x1ZGVkVVJJcygpLgorICAgICAqLworICAgIFNldCBleGNsdWRlZFVSSXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIG5hbWVzcGFjZSBVUklzIHRoYXQgYXJlIGFsbW9zdCBjb21wbGV0ZWx5IGluY2x1ZGVkIGluCisgICAgICogdGhlIHNldCAodGhhdCBpcywgZWFjaCBuYW1lc3BhY2UgVVJJIHRoYXQgaW5jbHVkZWQgaW4gdGhlIHNldCB3aXRoIHdpdGgKKyAgICAgKiBhIGZpbml0ZSBudW1iZXIgb2YgUU5hbWUgZXhjZXB0aW9ucykuIE51bGwgaWYgdGhlIHNldCBvZiBuYW1lc3BhY2VVUklzCisgICAgICogdGhhdCBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgaW5jbHVkZWQgaXMgaW5maW5pdGUuCisgICAgICogPHA+CisgICAgICogTnVsbCAobWVhbmluZyBhbG1vc3QgYWxsIFVSSXMgaW5jbHVkZWQpIGlmIGV4Y2x1ZGVkVVJJcygpIGlzIG5vbi1udWxsOworICAgICAqIG5vbi1udWxsIG90aGVyd2lzZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc2FtZSBhcyBpbnZlcnNlLmV4Y2x1ZGVkVVJJcygpLgorICAgICAqLworICAgIFNldCBpbmNsdWRlZFVSSXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIFFOYW1lcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZXQgd2l0aGluIG5hbWVzcGFjZXMKKyAgICAgKiB0aGF0IGFyZSBvdGhlcndpc2UgaW5jbHVkZWQuIFNob3VsZCBvbmx5IGNvbnRhaW4gUU5hbWVzIHdpdGhpbiBuYW1lc3BhY2UKKyAgICAgKiB0aGF0IGFyZSB3aXRoaW4gdGhlIHNldCBpbmNsdWRlZFVSSXMoKSAob3IgYW55IFVSSSwgaWYgaW5jbHVkZWRVUklzKCkKKyAgICAgKiBpcyBudWxsLCB3aGljaCBtZWFucyB0aGF0IGFsbCBVUklzIGFyZSBhbG1vc3QgY29tcGxldGVseSBpbmNsdWRlZCkuCisgICAgICogPHA+CisgICAgICogTmV2ZXIgbnVsbC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc2FtZSBzZXQgYXMgaW52ZXJzZSgpLmluY2x1ZGVkUU5hbWVzKCkuCisgICAgICovCisgICAgU2V0IGV4Y2x1ZGVkUU5hbWVzSW5JbmNsdWRlZFVSSXMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaW5pdGUgc2V0IG9mIFFOYW1lcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgc2V0IHdpdGhpbiBuYW1lc3BhY2VzCisgICAgICogdGhhdCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkLiBTaG91bGQgb25seSBjb250YWluIFFOYW1lcyB3aXRoaW4gbmFtZXNwYWNlCisgICAgICogdGhhdCBhcmUgd2l0aGluIHRoZSBzZXQgZXhjbHVkZWRVUklzKCkgKG9yIGFueSBVUkksIGlmIGV4Y2x1ZGVkVVJJcygpCisgICAgICogaXMgbnVsbCwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgVVJJcyBhcmUgYWxtb3N0IGNvbXBsZXRlbHkgZXhjbHVkZWQpLgorICAgICAqIDxwPgorICAgICAqIE5ldmVyIG51bGwuCisgICAgICogPHA+CisgICAgICogVGhlIHNhbWUgYXMgaW52ZXJzZSgpLmV4Y2x1ZGVkUU5hbWVzKCkuCisgICAgICovCisgICAgU2V0IGluY2x1ZGVkUU5hbWVzSW5FeGNsdWRlZFVSSXMoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVHcm91cC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUF0dHJpYnV0ZUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M3ZDBmYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVHcm91cC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIGdyb3VwLgorICogPHA+CisgKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgaXMgYSBzeW50YWN0aWMgY29uc3RydWN0LCBub3QgYSBwYXJ0CisgKiBvZiB0aGUgbG9naWNhbCBtb2RlbC4gRm9yIGV4YW1wbGUsIHR5cGVzIGRlY2xhcmVkIHdpdGhpbiBhbgorICogYXR0cmlidXRlIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KKyAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaXRzZWxmLiBUaGVyZWZvcmUKKyAqIGluIHRoZSBsb2dpY2FsIG1vZGVsIG9mIGEgc2NoZW1hIHR5cGUgc3lzdGVtLCBhbiBhdHRyaWJ1dGUKKyAqIGdyb3VwIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZAorICogaW50byB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgorICogCisgKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIjZmluZEF0dHJpYnV0ZUdyb3VwCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQXR0cmlidXRlR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKK3sKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEVfR1JPVVAuCisgICAgICovCisgICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCBncm91cC4KKyAgICAgKi8KKyAgICBRTmFtZSBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFsbG93IG9uLWRlbWFuZCBsb2FkaW5nIG9mIGF0dHJpYnV0ZSBncm91cHMuCisgICAgICogCisgICAgICogQGV4Y2x1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKKyAgICB7CisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hQXR0cmlidXRlR3JvdXAgYXR0cmlidXRlR3JvdXApCisgICAgICAgICAgICB7IHN1cGVyKGF0dHJpYnV0ZUdyb3VwKTsgfQorCisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCisgICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuQVRUUklCVVRFX0dST1VQOyB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYUF0dHJpYnV0ZUdyb3VwIGdldCgpCisgICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hQXR0cmlidXRlR3JvdXApZ2V0Q29tcG9uZW50KCk7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlTW9kZWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFBdHRyaWJ1dGVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZmM2MWYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQXR0cmlidXRlTW9kZWwuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGFsbG93ZWQgb24gYSBjb21wbGV4IHR5cGUuCisgKiAKKyAqIEBzZWUgU2NoZW1hVHlwZSNnZXRBdHRyaWJ1dGVNb2RlbAorICovIAorcHVibGljIGludGVyZmFjZSBTY2hlbWFBdHRyaWJ1dGVNb2RlbAoreworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIG1vZGVsLgorICAgICAqLworICAgIFNjaGVtYUxvY2FsQXR0cmlidXRlW10gZ2V0QXR0cmlidXRlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICovCisgICAgU2NoZW1hTG9jYWxBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFFOYW1lIG5hbWUpOworCisgICAgLyoqCisgICAgICogUU5hbWVTZXQgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgd2lsZGNhcmQgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBRTmFtZVNldCBnZXRXaWxkY2FyZFNldCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc2luZyBjb2RlICh7QGxpbmsgI1NUUklDVH0sIHtAbGluayAjTEFYfSwge0BsaW5rICNTS0lQfSkuCisgICAgICogUmV0dXJucyAwICh7QGxpbmsgI05PTkV9KSBpZiBubyB3aWxkY2FyZCBzcGVjaWZpZWQuCisgICAgICovCisgICAgaW50IGdldFdpbGRjYXJkUHJvY2VzcygpOworCisgICAgLyoqIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOworICAgIC8qKiBTdHJpY3Qgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUNUID0gMTsKKyAgICAvKiogTGF4IHdpbGRjYXJkIHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IExBWCA9IDI7CisgICAgLyoqIFNraXAgd2lsZGNhcmQgcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDM7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NDRkMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGdsb2JhbCBTY2hlbWEgQ29tcG9uZW50LiAgVGhhdCBpcywgYSB0eXBlLCBlbGVtZW50LCBhdHRyaWJ1dGUsCisgKiBtb2RlbCBncm91cCwgYXR0cmlidXRlIGdyb3VwLCBvciBpZGVudGl0eSBjb25zdHJhaW50LgorICogPHA+CisgKiBOb3RlIHRoYXQgbm90IGFsbCB0eXBlcywgZWxlbWVudHMsIGFuZCBhdHRyaWJ1dGVzIGFyZSBnbG9iYWw7IGxvY2FsCisgKiB0eXBlcywgZWxlbWVudCwgYW5kIGF0dHJpYnV0ZXMgZG8gbm90IGFwcGVhciBpbiB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZS4KKyAqIEFsc28gbm90ZSB0aGF0IG90aGVyIGluZm9ybWF0aW9uIGl0ZW1zIHN1Y2ggYXMgcGFydGljbGVzLCBmYWNldHMsIGFuZAorICogc28gb24gYXJlIG5vdCBnbG9iYWxseSBpbmRleGVkLCBzbyBhcmUgbm90IFNjaGVtYUNvbXBvbmVudHMuCisgKiAKKyAqIEBzZWUgU2NoZW1hVHlwZQorICogQHNlZSBTY2hlbWFHbG9iYWxFbGVtZW50CisgKiBAc2VlIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZQorICogQHNlZSBTY2hlbWFBdHRyaWJ1dGVHcm91cAorICogQHNlZSBTY2hlbWFNb2RlbEdyb3VwCisgKiBAc2VlIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbXBvbmVudAoreworICAgIC8qKiBBIHR5cGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBUWVBFID0gMDsKKyAgICAvKiogQW4gZWxlbWVudCBkZWZpbml0aW9uLiAgU2VlIHtAbGluayAjZ2V0Q29tcG9uZW50VHlwZX0gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOworICAgIC8qKiBBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAzOworICAgIC8qKiBBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfR1JPVVAgPSA0OworICAgIC8qKiBBbiBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb24uICBTZWUge0BsaW5rICNnZXRDb21wb25lbnRUeXBlfSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSURFTlRJVFlfQ09OU1RSQUlOVCA9IDU7CisgICAgLyoqIEEgbW9kZWwgZ3JvdXAgZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBNT0RFTF9HUk9VUCA9IDY7CisgICAgLyoqIEEgbm90YXRpb24gZGVmaW5pdGlvbi4gIFNlZSB7QGxpbmsgI2dldENvbXBvbmVudFR5cGV9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTiA9IDc7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGNvZGUgZm9yIHRoZSBzY2hlbWEgb2JqZWN0LCBlaXRoZXIge0BsaW5rICNUWVBFfSwKKyAgICAgKiB7QGxpbmsgI0VMRU1FTlR9LCB7QGxpbmsgI0FUVFJJQlVURX0sIHtAbGluayAjQVRUUklCVVRFX0dST1VQfSwKKyAgICAgKiB7QGxpbmsgI01PREVMX0dST1VQfSwge0BsaW5rICNJREVOVElUWV9DT05TVFJBSU5UfSwgb3Ige0BsaW5rICNOT1RBVElPTn0uCisgICAgICovCisgICAgaW50IGdldENvbXBvbmVudFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGVzeXN0ZW0gd2l0aGluIHdoaWNoIHRoaXMgY29tcG9uZW50IGRlZmluaXRpb24gcmVzaWRlcworICAgICAqLworICAgIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNjaGVtYSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBRTmFtZSBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBBIGxhenkgcmVmZXJlbmNlIHRvIGEgY29tcG9uZW50LiBVc2VkIGJ5IFNjaGVtYVR5cGVMb2FkZXJzIHRvCisgICAgICogYXZvaWQgbG9hZGluZyBjb21wb25lbnRzIHVudGlsIHRoZXkgYXJlIGFjdHVhbGx5IG5lZWRlZC4KKyAgICAgKiAKKyAgICAgKiBAZXhjbHVkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVmCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYUNvbXBvbmVudCBzY2hlbWFDb21wb25lbnQpCisgICAgICAgICAgICB7IF9zY2hlbWFDb21wb25lbnQgPSBzY2hlbWFDb21wb25lbnQ7IH0KKworICAgICAgICBwcm90ZWN0ZWQgUmVmKFNjaGVtYVR5cGVTeXN0ZW0gc2NoZW1hVHlwZVN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKKyAgICAgICAgICAgIHsgYXNzZXJ0KGhhbmRsZSAhPSBudWxsKTsgX3NjaGVtYVR5cGVTeXN0ZW0gPSBzY2hlbWFUeXBlU3lzdGVtOyBfaGFuZGxlID0gaGFuZGxlOyB9CisKKyAgICAgICAgcHJpdmF0ZSBTY2hlbWFDb21wb25lbnQgX3NjaGVtYUNvbXBvbmVudDsKKyAgICAgICAgcHJpdmF0ZSBTY2hlbWFUeXBlU3lzdGVtIF9zY2hlbWFUeXBlU3lzdGVtOworICAgICAgICBwdWJsaWMgU3RyaW5nIF9oYW5kbGU7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRDb21wb25lbnRUeXBlKCk7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0VHlwZVN5c3RlbSgpCisgICAgICAgICAgICB7IHJldHVybiBfc2NoZW1hVHlwZVN5c3RlbTsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zY2hlbWFDb21wb25lbnQgPT0gbnVsbCAmJiBfaGFuZGxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3NjaGVtYUNvbXBvbmVudCA9IF9zY2hlbWFUeXBlU3lzdGVtLnJlc29sdmVIYW5kbGUoX2hhbmRsZSk7CisKKyAgICAgICAgICAgIHJldHVybiBfc2NoZW1hQ29tcG9uZW50OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nIG9mIHNjaGVtYSBjb21wb25lbnRzLgorICAgICAqLyAKKyAgICBwdWJsaWMgUmVmIGdldENvbXBvbmVudFJlZigpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUZpZWxkLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFlNGVmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUZpZWxkLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGVsZW1lbnQgb3IgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgorICogCisgKiBAc2VlIFNjaGVtYVR5cGUjZ2V0Q29udGFpbmVyRmllbGQKKyAqIEBzZWUgU2NoZW1hTG9jYWxFbGVtZW50CisgKiBAc2VlIFNjaGVtYUxvY2FsQXR0cmlidXRlCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUZpZWxkCit7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZm9ybS11bnF1YWxpZmllZC1vci1xdWFsaWZpZWQgbmFtZS4KKyAgICAgKi8KKyAgICBRTmFtZSBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdXNlIGlzIGFuIGF0dHJpYnV0ZQorICAgICAqLworICAgIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgbmlsbGFibGU7IGFsd2F5cyBmYWxzZSBmb3IgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzTmlsbGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyB1c2UuCisgICAgICovCisgICAgU2NoZW1hVHlwZSBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5PY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUuCisgICAgICogSWYgaXQgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIGRlZmF1bHRzIHRvIEJpZ0ludGVnZXIuT05FLgorICAgICAqLworICAgIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhPY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUsIG9yIG51bGwgaWYgaXQKKyAgICAgKiBpcyB1bmJvdW5kZWQuCisgICAgICogSWYgaXQgaXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGlzIGRlZmF1bHRzIHRvIEJpZ0ludGVnZXIuT05FLgorICAgICAqLworICAgIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBhcyBwbGFpbiB0ZXh0LiBTZWUge0BsaW5rICNpc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2lzRml4ZWR9LgorICAgICAqLworICAgIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGFzIGEgc3Ryb25nbHktdHlwZWQgdmFsdWUuICBTZWUge0BsaW5rICNpc0RlZmF1bHR9IGFuZCB7QGxpbmsgI2lzRml4ZWR9LgorICAgICAqLworICAgIFhtbEFueVNpbXBsZVR5cGUgZ2V0RGVmYXVsdFZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIGEgZGVmYXVsdCBpcyBzdXBwbGllZC4gSWYge0BsaW5rICNpc0ZpeGVkfSwgdGhlbiBpc0RlZmF1bHQgaXMgYWx3YXlzIHRydWUuCisgICAgICovCisgICAgYm9vbGVhbiBpc0RlZmF1bHQoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHZhbHVlIGlzIGZpeGVkLgorICAgICAqLworICAgIGJvb2xlYW4gaXNGaXhlZCgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDkzMmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hR2xvYmFsQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWZpbml0aW9uCisgKiAKKyAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNmaW5kQXR0cmlidXRlCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBleHRlbmRzIFNjaGVtYUxvY2FsQXR0cmlidXRlLCBTY2hlbWFDb21wb25lbnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIC54c2QgZmlsZSB3aXRoaW4gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgd2FzIGRlZmluZWQKKyAgICAgKi8gCisgICAgU3RyaW5nIGdldFNvdXJjZU5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgZWxlbWVudHMuCisgICAgICogCisgICAgICogQGV4Y2x1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKKyAgICB7CisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hR2xvYmFsQXR0cmlidXRlIGVsZW1lbnQpCisgICAgICAgICAgICB7IHN1cGVyKGVsZW1lbnQpOyB9CisKKyAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKKyAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKKyAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5BVFRSSUJVVEU7IH0KKworICAgICAgICBwdWJsaWMgZmluYWwgU2NoZW1hR2xvYmFsQXR0cmlidXRlIGdldCgpCisgICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsQXR0cmlidXRlKWdldENvbXBvbmVudCgpOyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cnVucyBhIFNjaGVtYUdsb2JhbEVsZW1lbnQuUmVmIHBvaW50aW5nIHRvIHRoaXMgZWxlbWVudCBpdHNlbGYuCisgICAgICovCisgICAgcHVibGljIFJlZiBnZXRSZWYoKTsKKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUdsb2JhbEVsZW1lbnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxNjA1MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFHbG9iYWxFbGVtZW50LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGdsb2JhbCBlbGVtZW50IGRlZmluaXRpb24uCisgKiAKKyAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNmaW5kRWxlbWVudAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUdsb2JhbEVsZW1lbnQgZXh0ZW5kcyBTY2hlbWFMb2NhbEVsZW1lbnQsIFNjaGVtYUNvbXBvbmVudAoreworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgLnhzZCBmaWxlIHdpdGhpbiB3aGljaCB0aGlzIGF0dHJpYnV0ZSB3YXMgZGVmaW5lZAorICAgICAqLyAKKyAgICBTdHJpbmcgZ2V0U291cmNlTmFtZSgpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIFFOYW1lcyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgdGhlIG1lbWJlcnMgb2YgdGhlCisgICAgICogc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB3aGljaCB0aGlzIGVsZW1lbnQgaXMgdGhlIGhlYWQsCisgICAgICogbm90IGluY2x1ZGluZyB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgUU5hbWVbXSBzdWJzdGl0dXRpb25Hcm91cE1lbWJlcnMoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBlbGVtZW50IHRoYXQgaXMgdGhlIGhlYWQgb2YgdGhpcyBlbGVtZW50J3Mgc3Vic3RpdHV0aW9uCisgICAgICogZ3JvdXAsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIKKyAgICAgKiBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4KKyAgICAgKi8KKyAgICBTY2hlbWFHbG9iYWxFbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHVzaW5nIHRoaXMgZWxlbWVudCBhcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbgorICAgICAqIGdyb3VwIGZvciBhIHN1YnN0aXR1dGlvbiB2aWEgdHlwZSBleHRlbnNpb24gaXMgcHJvaGliaXRlZC4KKyAgICAgKiBJZiBib3RoIGZpbmFsRXh0ZW5zaW9uIGFuZCBmaW5hbFJlc3RyaWN0aW9uIGFyZSB0cnVlLCB0aGlzCisgICAgICogZWxlbWVudCBjYW5ub3QgYmUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cC4KKyAgICAgKiBTZW5zaWJsZSBvbmx5IGZvciBnbG9iYWwgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZmluYWxFeHRlbnNpb24oKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdXNpbmcgdGhpcyBlbGVtZW50IGFzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uCisgICAgICogZ3JvdXAgZm9yIGEgc3Vic3RpdHV0aW9uIHZpYSB0eXBlIHJlc3RyaWN0aW9uIGlzIHByb2hpYml0ZWQuCisgICAgICogSWYgYm90aCBmaW5hbEV4dGVuc2lvbiBhbmQgZmluYWxSZXN0cmljdGlvbiBhcmUgdHJ1ZSwgdGhpcworICAgICAqIGVsZW1lbnQgY2Fubm90IGJlIGhlYWQgb2YgYSBzdWJzdGl0dXRpb24gZ3JvdXAuCisgICAgICogU2Vuc2libGUgb25seSBmb3IgZ2xvYmFsIGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsUmVzdHJpY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgZWxlbWVudHMuCisgICAgICogCisgICAgICogQGV4Y2x1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKKyAgICB7CisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hR2xvYmFsRWxlbWVudCBlbGVtZW50KQorICAgICAgICAgICAgeyBzdXBlcihlbGVtZW50KTsgfQorCisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCisgICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuRUxFTUVOVDsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFHbG9iYWxFbGVtZW50IGdldCgpCisgICAgICAgICAgICB7IHJldHVybiAoU2NoZW1hR2xvYmFsRWxlbWVudClnZXRDb21wb25lbnQoKTsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJ1bnMgYSBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBwb2ludGluZyB0byB0aGlzIGVsZW1lbnQgaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBSZWYgZ2V0UmVmKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYUlkZW50aXR5Q29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2IwOGQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGlkZW50aXR5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbi4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50Cit7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWxlY3RvciB4cGF0aCBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0U2VsZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIHNlbGVjdG9yLgorICAgICAqLworICAgIE9iamVjdCBnZXRTZWxlY3RvclBhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiAoYSBjb3B5IG9mKSB0aGUgeHBhdGhzIGZvciBhbGwgdGhlIGZpZWxkcy4KKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXRGaWVsZHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbXBpbGVkIHhwYXRoIG9iamVjdCBmb3IgdGhlIGZpZWxkLgorICAgICAqLworICAgIE9iamVjdCBnZXRGaWVsZFBhdGgoaW50IGluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlYWQtb25seSBjb3B5IG9mIHRoZSBuYW1lc3BhY2UgbWFwLiBUaGlzIGlzIHRoZSAKKyAgICAgKiBzZXQgb2YgcHJlZml4IHRvIFVSSSBtYXBwaW5ncyB0aGF0IHdlcmUgaW4gc2NvcGUgaW4gdGhlCisgICAgICogc2NoZW1hIGF0IHRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGNvbnN0cmFpbnQgd2FzIGRlY2xhcmVkCisgICAgICovCisgICAgTWFwIGdldE5TTWFwKCk7CisKKyAgICAvKiogQSA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUta2V5Ij54czprZXk8L2E+IGNvbnN0cmFpbnQuICBTZWUge0BsaW5rICNnZXRDb25zdHJhaW50Q2F0ZWdvcnl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENDX0tFWSA9IDE7CisgICAgLyoqIEEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWtleSI+eHM6a2V5UmVmPC9hPiBjb25zdHJhaW50LiAgU2VlIHtAbGluayAjZ2V0Q29uc3RyYWludENhdGVnb3J5fS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQ19LRVlSRUYgPSAyOworICAgIC8qKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1rZXkiPnhzOnVuaXF1ZTwvYT4gY29uc3RyYWludC4gIFNlZSB7QGxpbmsgI2dldENvbnN0cmFpbnRDYXRlZ29yeX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0NfVU5JUVVFID0gMzsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29uc3RyYWludCBjYXRlZ29yeS4gRWl0aGVyIHtAbGluayAjQ0NfS0VZfSwge0BsaW5rICNDQ19LRVlSRUZ9LAorICAgICAqIG9yIHtAbGluayAjQ0NfVU5JUVVFfS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0Q29uc3RyYWludENhdGVnb3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBrZXkgdGhhdCBhIGtleSByZWYgcmVmZXJzIHRvLiBPbmx5IHZhbGlkIGZvcgorICAgICAqIGtleXJlZnMuCisgICAgICovCisgICAgU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGdldFJlZmVyZW5jZWRLZXkoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgaWRlbnRpdHkgY29uc3RyYWludHMuCisgICAgICogCisgICAgICogQGV4Y2x1ZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlZiBleHRlbmRzIFNjaGVtYUNvbXBvbmVudC5SZWYKKyAgICB7CisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hSWRlbnRpdHlDb25zdHJhaW50IGlkYykKKyAgICAgICAgICAgIHsgc3VwZXIoaWRjKTsgfQorCisgICAgICAgIHB1YmxpYyBSZWYoU2NoZW1hVHlwZVN5c3RlbSBzeXN0ZW0sIFN0cmluZyBoYW5kbGUpCisgICAgICAgICAgICB7IHN1cGVyKHN5c3RlbSwgaGFuZGxlKTsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgICAgICB7IHJldHVybiBTY2hlbWFDb21wb25lbnQuSURFTlRJVFlfQ09OU1RSQUlOVDsgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQgZ2V0KCkKKyAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQpZ2V0Q29tcG9uZW50KCk7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxBdHRyaWJ1dGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzI3NzUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgYXR0cmlidXRlIGRlZmluaXRpb24uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUxvY2FsQXR0cmlidXRlIGV4dGVuZHMgU2NoZW1hRmllbGQKK3sKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjUFJPSElCSVRFRH0sIHtAbGluayAjT1BUSU9OQUx9LCBvciB7QGxpbmsgI1JFUVVJUkVEfS4KKyAgICAgKiAoQWN0dWFsbHksIG5ldmVyIHJldHVybnMgUFJPSElCSVRFRCBiZWNhdXNlIHRoZSBzY2hlbWEgc3BlY2lmaWNhaW9uCisgICAgICogc3RhdGVzIHRoYXQgYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIG5vIGF0dHJpYnV0ZQorICAgICAqIGF0IGFsbCwgc28gYSBwcm9oaWJpdGVkIGF0dHJpYnV0ZSB3aWxsIG5ldmVyIGJlIHByZXNlbnQgaW4gdGhlIGNvbXBpbGVkCisgICAgICogbW9kZWwuKQorICAgICAqLworICAgIGludCBnZXRVc2UoKTsKKworICAgIC8qKiBBIHByb2hpYml0ZWQgYXR0cmlidXRlLiAgU2VlIHtAbGluayAjZ2V0VXNlfS4gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBST0hJQklURUQgPSAxOworICAgIC8qKiBBbiBvcHRpb25hbCBhdHRyaWJ1dGUuICBTZWUge0BsaW5rICNnZXRVc2V9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAyOworICAgIC8qKiBBIHJlcXVpcmVkIGF0dHJpYnV0ZS4gIFNlZSB7QGxpbmsgI2dldFVzZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDM7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTG9jYWxFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmZWI0MAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFMb2NhbEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsb2NhbCBvciBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9uLgorICovIAorcHVibGljIGludGVyZmFjZSBTY2hlbWFMb2NhbEVsZW1lbnQgZXh0ZW5kcyBTY2hlbWFGaWVsZAoreworICAgIC8qKgorICAgICAqIFRydWUgaWYgZXh0ZW5zaW9uIGlzIGJsb2NrZWQuCisgICAgICovCisgICAgYm9vbGVhbiBibG9ja0V4dGVuc2lvbigpOworICAgIC8qKgorICAgICAqIFRydWUgaWYgcmVzdHJpY3Rpb24gaXMgYmxvY2tlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGJsb2NrUmVzdHJpY3Rpb24oKTsKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIGVsZW1lbnQgc3Vic3RpdHV0aW9uIGlzIGJsb2NrZWQuCisgICAgICovCisgICAgYm9vbGVhbiBibG9ja1N1YnN0aXR1dGlvbigpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgcHJvaGliaXRlZCBpbiBjb250ZW50LiBPbmx5CisgICAgICogc2Vuc2libGUgaWYgdGhpcyBpcyB0aGUgaGVhZCBvZiBhIHN1YnN0aXR1dGlvbiBncm91cDsKKyAgICAgKiB0aGVuIG9ubHkgc3Vic3RpdHV0aW9uIGdyb3VwIG1lbWJlcnMgY2FuIGFwcGVhci48UD4KKyAgICAgKiAKKyAgICAgKiBBbHRob3VnaCBsb2NhbCBlbGVtZW50cyBjYW5ub3QgYmUgYWJzdHJhY3QsIGlmIGFuIGVsZW1lbnQgCisgICAgICogdXNlIGlzIGEgcmVmIHRvIGEgZ2xvYmFsIGVsZW1lbnQsIHRoZW4gdGhlIGZsYWcgZnJvbSB0aGUgCisgICAgICogZ2xvYmFsIGVsZW1lbnQgaXMgY29waWVkIGluIHRvIHRoZSBsb2NhbCBlbGVtZW50IHdoZXJlIHRoZSAKKyAgICAgKiB1c2Ugb2NjdXJzLgorICAgICAqLworICAgIGJvb2xlYW4gaXNBYnN0cmFjdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIEtleSwgS2V5UmVmLCBhbmQgVW5pcXVlIGNvbnN0cmFpbnRzCisgICAgICogb24gdGhpcyBlbGVtZW50LgorICAgICAqLworICAgIFNjaGVtYUlkZW50aXR5Q29uc3RyYWludFtdIGdldElkZW50aXR5Q29uc3RyYWludHMoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFNb2RlbEdyb3VwLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTW9kZWxHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWY2NjEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hTW9kZWxHcm91cC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtb2RlbCBncm91cC4KKyAqIDxwPgorICogQSBtb2RlbCBncm91cCBpcyBhIHN5bnRhY3RpYyBjb25zdHJ1Y3QsIG5vdCBhIHBhcnQgb2YKKyAqIHRoZSBsb2dpY2FsIG1vZGVsLiBGb3IgZXhhbXBsZSwgdHlwZXMgZGVjbGFyZWQgd2l0aGluIGEKKyAqIG1vZGVsIGdyb3VwIGJlY29tZSBsb2NhbCB0byB0aGUgdHlwZSB0aGF0IHVzZXMgdGhlIGdyb3VwIC0KKyAqIHRoZXkncmUgbm90IGxvY2FsIHRvIHRoZSBtb2RlbCBncm91cCBpdHNlbGYuIFRoZXJlZm9yZSBpbgorICogdGhlIGxvZ2ljYWwgbW9kZWwgb2YgYSBzY2hlbWEgdHlwZSBzeXN0ZW0sIGEgbW9kZWwgZ3JvdXAKKyAqIGRvZXNuJ3QgcmVwcmVzZW50IGFueXRoaW5nLiBJdHMgY29udGVudHMgYXJlIG1lcmdlZCBpbnRvCisgKiB0aGUgbG9naWNhbCBtb2RlbCBhdCBwYXJzZSB0aW1lLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYU1vZGVsR3JvdXAgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKK3sKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNjaGVtYUNvbXBvbmVudC5HUk9VUC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0Q29tcG9uZW50VHlwZSgpOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIGdyb3VwLgorICAgICAqLworICAgIFFOYW1lIGdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWxsb3cgb24tZGVtYW5kIGxvYWRpbmcgb2YgbW9kZWwgZ3JvdXBzLgorICAgICAqIAorICAgICAqIEBleGNsdWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSZWYgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQuUmVmCisgICAgeworICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYU1vZGVsR3JvdXAgbW9kZWxHcm91cCkKKyAgICAgICAgICAgIHsgc3VwZXIobW9kZWxHcm91cCk7IH0KKworICAgICAgICBwdWJsaWMgUmVmKFNjaGVtYVR5cGVTeXN0ZW0gc3lzdGVtLCBTdHJpbmcgaGFuZGxlKQorICAgICAgICAgICAgeyBzdXBlcihzeXN0ZW0sIGhhbmRsZSk7IH0KKworICAgICAgICBwdWJsaWMgZmluYWwgaW50IGdldENvbXBvbmVudFR5cGUoKQorICAgICAgICAgICAgeyByZXR1cm4gU2NoZW1hQ29tcG9uZW50Lk1PREVMX0dST1VQOyB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYU1vZGVsR3JvdXAgZ2V0KCkKKyAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFNb2RlbEdyb3VwKWdldENvbXBvbmVudCgpOyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hUGFydGljbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRiZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVBhcnRpY2xlLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIFNjaGVtYSBwYXJ0aWNsZSBkZWZpbml0aW9uLgorICogPHA+CisgKiBUaGUgY29udGVudCBtb2RlbCBvZiBhIGNvbXBsZXggdHlwZSBpcyBhIHRyZWUgb2YgcGFydGljbGVzLiAgRWFjaAorICogcGFydGljbGUgaXMgZWl0aGVyIGFuIHtAbGluayAjQUxMfSwge0BsaW5rICNDSE9JQ0V9LCB7QGxpbmsgI1NFUVVFTkNFfSwKKyAqIHtAbGluayAjRUxFTUVOVH0sIG9yIHtAbGluayAjV0lMRENBUkR9LgorICogQWxsLCBjaG9pY2UgYW5kIHNlcXVlbmNlIHBhcnRpY2xlcyBhcmUgZ3JvdXBzIHRoYXQgY2FuIGhhdmUgY2hpbGQKKyAqIHBhcnRpY2xlczsgZWxlbWVudHMgYW5kIHdpbGRjYXJkcyBhcmUgYWx3YXlzIGxlYXZlcyBvZiB0aGUgcGFydGljbGUgdHJlZS4KKyAqIDxwPgorICogVGhlIHRyZWUgb2YgcGFydGljbGVzIGF2YWlsYWJsZSBvbiBhIHNjaGVtYSB0eXBlIGlzIG1pbmltaXplZCwgdGhhdAorICogaXMsIGl0IGFscmVhZHkgaGFzIHJlbW92ZWQgInBvaW50bGVzcyIgcGFydGljbGVzIHN1Y2ggYXMgZW1wdHkKKyAqIHNlcXVlbmNlcywgbm9ucmVwZWF0aW5nIHNlcXVlbmNlcyB3aXRoIG9ubHkgb25lIGl0ZW0sIGFuZCBzbyBvbi4KKyAqICg8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2Nvcy1wYXJ0aWNsZS1yZXN0cmljdCI+UG9pbnRsZXNzIHBhcnRpY2xlczwvYT4KKyAqIGFyZSBkZWZpbmVkIHByZWNpc2VseSBpbiB0aGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uLikKKyAqIAorICogQHNlZSBTY2hlbWFUeXBlI2dldENvbnRlbnRNb2RlbAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVBhcnRpY2xlCit7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFydGljbGUgdHlwZSAoe0BsaW5rICNBTEx9LCB7QGxpbmsgI0NIT0lDRX0sCisgICAgICoge0BsaW5rICNTRVFVRU5DRX0sIHtAbGluayAjRUxFTUVOVH0sIG9yIHtAbGluayAjV0lMRENBUkR9KS4gCisgICAgICovIAorICAgIGludCBnZXRQYXJ0aWNsZVR5cGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2RlY2xhcmUtY29udGVudE1vZGVsIj54czphbGw8L2E+IGdyb3VwLgorICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCisgICAgICovIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMTsKKyAgICAvKioKKyAgICAgKiBBIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1jb250ZW50TW9kZWwiPnhzOmNob2ljZTwvYT4gZ3JvdXAuCisgICAgICogU2VlIHtAbGluayAjZ2V0UGFydGljbGVUeXBlfS4KKyAgICAgKi8gCisgICAgc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOworICAgIC8qKgorICAgICAqIEEgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLWNvbnRlbnRNb2RlbCI+eHM6c2VxdWVuY2U8L2E+IGdyb3VwLgorICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCisgICAgICovIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAzOworICAgIC8qKgorICAgICAqIEFuIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZGVjbGFyZS1lbGVtZW50Ij54czplbGVtZW50PC9hPiBwYXJ0aWNsZS4KKyAgICAgKiBUaGlzIGNvZGUgbWVhbnMgdGhlIHBhcnRpY2xlIGNhbiBiZSBjb2VyY2VkIHRvIHtAbGluayBTY2hlbWFMb2NhbEVsZW1lbnR9LgorICAgICAqIFNlZSB7QGxpbmsgI2dldFBhcnRpY2xlVHlwZX0uCisgICAgICovIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDQ7CisgICAgLyoqCisgICAgICogQW4gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNkZWNsYXJlLW9wZW5uZXNzIj54czphbnk8L2E+IHBhcnRpY2xlLAorICAgICAqIGFsc28ga25vd24gYXMgYW4gZWxlbWVudCB3aWxkY2FyZC4KKyAgICAgKiBTZWUge0BsaW5rICNnZXRQYXJ0aWNsZVR5cGV9LgorICAgICAqLyAKKyAgICBzdGF0aWMgZmluYWwgaW50IFdJTERDQVJEID0gNTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbk9jY3VycyB2YWx1ZSBmb3IgdGhpcyBwYXJ0aWNsZS4KKyAgICAgKiBJZiBpdCdzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhpcyByZXR1cm5zIEJpZ0ludGVnZXIuT05FLgorICAgICAqLworICAgIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhPY2N1cnMgdmFsdWUgZm9yIHRoaXMgcGFydGljbGUsIG9yIG51bGwgaWYgaXQKKyAgICAgKiBpcyB1bmJvdW5kZWQuCisgICAgICogSWYgaXQncyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHRoaXMgcmV0dXJucyBCaWdJbnRlZ2VyLk9ORS4KKyAgICAgKi8KKyAgICBCaWdJbnRlZ2VyIGdldE1heE9jY3VycygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluT2NjdXJzIHZhbHVlLCBwZWdnZWQgdG8gYSAzMi1iaXQgaW50IGZvcgorICAgICAqIGNvbnZlbmllbmNlIG9mIGEgdmFsaWRhdGluZyBzdGF0ZSBtYWNoaW5lIHRoYXQgZG9lc24ndCBjb3VudAorICAgICAqIGhpZ2hlciB0aGFuIE1BWF9JTlQgYW55d2F5LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50TWluT2NjdXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhPY2N1cnMgdmFsdWUsIHBlZ2dlZCB0byBhIDMyLWJpdCBpbnQgZm9yCisgICAgICogY29udmVuaWVuY2Ugb2YgYSB2YWxpZGF0aW5nIHN0YXRlIG1hY2hpbmUgdGhhdCBkb2Vzbid0IGNvdW50CisgICAgICogaGlnaGVyIHRoYW4gTUFYX0lOVCBhbnl3YXkuIFVuYm91bmRlZCBpcyBnaXZlbiBhcyBNQVhfSU5ULgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50TWF4T2NjdXJzKCk7CisKKworICAgIC8qKgorICAgICAqIE9uZSBpZiBtaW5PY2N1cnMgPT0gbWF4T2NjdXJzID09IDEuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NpbmdsZXRvbigpOworCisgICAgLyoqCisgICAgICogQXBwbGllcyB0byBzZXF1ZW5jZSwgY2hvaWNlLCBhbmQgYWxsIHBhcnRpY2xlcyBvbmx5OiByZXR1cm5zIGFuIGFycmF5CisgICAgICogb2YgYWxsIHRoZSBwYXJ0aWNsZSBjaGlsZHJlbiBpbiBvcmRlci4KKyAgICAgKi8KKyAgICBTY2hlbWFQYXJ0aWNsZVtdIGdldFBhcnRpY2xlQ2hpbGRyZW4oKTsKKworICAgIC8qKgorICAgICAqIEFub3RoZXIgd2F5IHRvIGFjY2VzcyB0aGUgcGFydGljbGUgY2hpbGRyZW4uCisgICAgICovCisgICAgU2NoZW1hUGFydGljbGUgZ2V0UGFydGljbGVDaGlsZChpbnQgaSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLgorICAgICAqLworICAgIGludCBjb3VudE9mUGFydGljbGVDaGlsZCgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHBhcnRpY2xlIGNhbiBzdGFydCB3aXRoIHRoZSBnaXZlbiBlbGVtZW50CisgICAgICogKHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0cnVjdHVyZSBvZiBhbGwgY2hpbGQgcGFydGljbGVzCisgICAgICogb2YgY291cnNlKS4KKyAgICAgKi8KKyAgICBib29sZWFuIGNhblN0YXJ0V2l0aEVsZW1lbnQoUU5hbWUgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBRTmFtZVNldCBvZiBlbGVtZW50IG5hbWVzIHRoYXQgY2FuIGJlCisgICAgICogYWNjZXB0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHBhcnRpY2xlLgorICAgICAqLworICAgIFFOYW1lU2V0IGFjY2VwdGVkU3RhcnROYW1lcygpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHBhcnRpY2xlIGNhbiBiZSBza2lwcGVkICh0YWtpbmcgaW50byBhY2NvdW50CisgICAgICogYm90aCB0aGUgbWluT2N1cnMgYXMgd2VsbCBhcyB0aGUgc3RydWN0dXJlIG9mIGFsbCB0aGUKKyAgICAgKiBjaGlsZCBwYXJ0aWNsZXMpCisgICAgICovCisgICAgYm9vbGVhbiBpc1NraXBwYWJsZSgpOworCisgICAgLyoqCisgICAgICogRm9yIHdpbGRjYXJkcywgcmV0dXJucyBhIFFOYW1lU2V0IHJlcHJlc2VudGluZyB0aGUgd2lsZGNhcmQuCisgICAgICovCisgICAgUU5hbWVTZXQgZ2V0V2lsZGNhcmRTZXQoKTsKKworICAgIC8qKgorICAgICAqIEZvciB3aWxkY2FyZHMsIHJldHVybnMgdGhlIHByb2Nlc3NpbmcgY29kZSAoe0BsaW5rICNTVFJJQ1R9LCB7QGxpbmsgI0xBWH0sIHtAbGluayAjU0tJUH0pLgorICAgICAqLworICAgIGludCBnZXRXaWxkY2FyZFByb2Nlc3MoKTsKKworICAgIC8qKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI1dpbGRjYXJkX2RldGFpbHMiPlN0cmljdCB3aWxkY2FyZDwvYT4gcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RSSUNUID0gMTsKKyAgICAvKiogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNXaWxkY2FyZF9kZXRhaWxzIj5MYXggd2lsZGNhcmQ8L2E+IHByb2Nlc3NpbmcuIFNlZSB7QGxpbmsgI2dldFdpbGRjYXJkUHJvY2Vzc30gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IExBWCA9IDI7CisgICAgLyoqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jV2lsZGNhcmRfZGV0YWlscyI+U2tpcCB3aWxkY2FyZDwvYT4gcHJvY2Vzc2luZy4gU2VlIHtAbGluayAjZ2V0V2lsZGNhcmRQcm9jZXNzfSAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0tJUCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWxlbWVudHMgb25seTogdGhlIFFOYW1lIGZvciB0aGUgZWxlbWVudCB1c2UuCisgICAgICogTWF5IGJlIHVucXVhbGlmaWVkIHZlcnNpb24gb2YgcmVmZXJlbmNlZCBlbGVtZW50J3MgbmFtZS4KKyAgICAgKi8KKyAgICBRTmFtZSBnZXROYW1lKCk7CisgICAgCisgICAgLyoqCisgICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgICAgICovCisgICAgU2NoZW1hVHlwZSBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWxlbWVudHMgb25seTogdHJ1ZSBpZiBuaWxsYWJsZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzTmlsbGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiByZXR1cm5zIHRoZSBkZWZhdWx0IChvciBmaXhlZCkgdGV4dCB2YWx1ZQorICAgICAqLworICAgIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpOworICAgIAorICAgIC8qKgorICAgICAqIEZvciBlbGVtZW50cyBvbmx5OiByZXR1cm5zIHRoZSBkZWZhdWx0IChvciBmaXhlZCkgc3Ryb25nbHktdHlwZWQgdmFsdWUKKyAgICAgKi8KKyAgICBYbWxBbnlTaW1wbGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogRm9yIGVsZW1lbnRzIG9ubHk6IFRydWUgaWYgaGFzIGRlZmF1bHQuIElmIGlzRml4ZWQsIHRoZW4gaXNEZWZhdWx0IGlzIGFsd2F5cyB0cnVlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNEZWZhdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWxlbWVudHMgb25seTogdHJ1ZSBpZiBpcyBmaXhlZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRml4ZWQoKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MTI2MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFQcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzdW1tYXJ5IG9mIHNpbWlsYXIgU2NoZW1hRmllbGRzIGluIGEgY29tcGxleCB0eXBlLgorICogPHA+CisgKiBJbiBhIHNjaGVtYSB0eXBlLCBldmVyeSBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZSBtdXN0IGhhdmUgdGhlCisgKiBzYW1lIHR5cGUuICBUaGVyZWZvcmUsIGFsbCB0b2dldGhlciwgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCisgKiBmb3JtIGEgY29oZXJlbnQgY29sbGVjdGlvbiBvZiBzaW1pbGFyIGVsZW1lbnRzLiAgU2ltaWxhcmx5LCBhdHRyaWJ1dGVzCisgKiBjYW4gb25seSBiZSBkZWZpbmVkIG9uY2UsIHNvIGVhY2ggYXR0cmlidXRlIG9idmlvdXNseSBpcyBhIGNvaGVyZW50CisgKiBncm91cCBvbiBpdHMgb3duLgorICogPHA+CisgKiBBIFNjaGVtYVByb3BlcnR5IHJlcHJlc2VudHMgYSBzdW1tYXJ5IG9mIHRoZSB0aGUgZWxlbWVudHMgd2l0aCBhCisgKiBnaXZlbiBuYW1lIG9yIHRoZSBhdHRyaWJ1dGUgd2l0aCBhIGdpdmVuIG5hbWUuICBJdCByZXByZXNlbnRzIHRoZQorICogc3VtbWFyeSBjYXJkaW5hbGl0eSBvZiB0aGUgZmllbGRzLCB0aGUgc3VtbWFyeSBkZWZhdWx0IGFuZCBmaXhlZAorICogdmFsdWVzLCBhbmQgc28gb24uICBXaGVuIGluZmVycmluZyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlbGVtZW50CisgKiBvciBhdHRyaWJ1dGUsIGl0IGlzIHR5cGljYWxseSBlYXNpZXIgdG8gY29uc3VsdCB0aGVuIFNjaGVtYVByb3BlcnR5CisgKiB0aGFuIHRvIGh1bnQgZm9yIHRoZSBleGFjdCBTY2hlbWFGaWVsZCBpbiB0aGUgcGFydGljbGUgdHJlZSBvcgorICogYXR0cmlidXRlIG1vZGVsLgorICogCisgKiBAc2VlIFNjaGVtYVR5cGUjZ2V0UHJvcGVydGllcworICogQHNlZSBTY2hlbWFUeXBlI2dldEF0dHJpYnV0ZVByb3BlcnRpZXMKKyAqIEBzZWUgU2NoZW1hVHlwZSNnZXRFbGVtZW50UHJvcGVydGllcworICogQHNlZSBTY2hlbWFUeXBlI2dldEF0dHJpYnV0ZVByb3BlcnR5CisgKiBAc2VlIFNjaGVtYVR5cGUjZ2V0RWxlbWVudFByb3BlcnR5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NoZW1hUHJvcGVydHkKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSB3aXRoaW4gd2hpY2ggdGhpcyBwcm9wZXJ0eSBhcHBlYXJzCisgICAgICovIAorICAgIFNjaGVtYVR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBvciBhdHRyaWJ1dGUKKyAgICAgKi8gCisgICAgUU5hbWUgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogRm9yIGVsZW1lbnQgcHJvcGVydGllcyB0aGUgc2V0IG9mIG5hbWVzIHRoYXQgYXJlIGFjY2VwdGVkIGZvciB0aGlzIHByb3BlcnR5CisgICAgICogaWYgdGhpcyBlbGVtZW50IGlzIHRoZSBoZWFkIG9mIGEgc3Vic3RpdHV0aW9uIGdyb3VwLiBUaGlzIHdpbGwgYWx3YXlzCisgICAgICogaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCwgaWUsIHRoZSBwcm9wZXJ0eSdzIG5hbWUuCisgICAgICovCisgICAgUU5hbWVbXSBhY2NlcHRlZE5hbWVzKCk7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIEphdmEgbmFtZSBmb3IgdGhpcyBwcm9wZXJ0eS4gIEZvciBleGFtcGxlLCBpZiB0aGUgbWV0aG9kIHRvCisgICAgICogYWNjZXNzIHRoaXMgcHJvcGVydHkgaXMgY2FsbGVkIGdldEZpcnN0TmFtZSwgdGhlbiB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgdGhlIHN0cmluZyAiRmlyc3ROYW1lIi4gIE1heSBiZSBudWxsIGlmIHRoZSBzY2hlbWEgdHlwZQorICAgICAqIGhhcyBub3QgYmVlbiBjb21waWxlZCB0byBKYXZhLgorICAgICAqLyAKKyAgICBTdHJpbmcgZ2V0SmF2YVByb3BlcnR5TmFtZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgZm9yIHJlYWQtb25seSBwcm9wZXJ0aWVzLgorICAgICAqLyAKKyAgICBib29sZWFuIGlzUmVhZE9ubHkoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgZm9yIGF0dHJpYnV0ZXMuCisgICAgICovIAorICAgIGJvb2xlYW4gaXNBdHRyaWJ1dGUoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWEgdHlwZSBmb3IgdGhlIHByb3BlcnR5LgorICAgICAqLyAKKyAgICBTY2hlbWFUeXBlIGdldFR5cGUoKTsKKworICAgIC8vIG5vdGUgdGhhdCBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBpZiB0aGUgYXJyYXkgZ2V0dGVyIHNob3dzIHVwIGZpcnN0LAorICAgIC8vIHRoZW4gdGhlIHNpbmdlbHRvbiBnZXR0ZXIgaXMgbmV2ZXIgYWxsb3dlZCB0byBzaG93IHVwLgorCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtYSB0eXBlIHJldHVybmVkIGZyb20gdGhlIEphdmEgZ2V0dGVyIGZvciB0aGlzIHByb3BlcnR5LgorICAgICAqIEFwcGxpZXMgb25seSB0byB0eXBlcyB0aGF0IGhhdmUgYmVlbiBjb2RlIGdlbmVyYXRlZCB0byBKYXZhOyBtYXkKKyAgICAgKiBiZSBhIGJhc2UgdHlwZSBvZiBnZXRUeXBlKCkuCisgICAgICovIAorICAgIHB1YmxpYyBTY2hlbWFUeXBlIGphdmFCYXNlZE9uVHlwZSgpOyAvLyBKYXZhIHByb3BlcnR5IHR5cGUgYmFzZWQgb24gdGhpcyBiYXNlIHR5cGUKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZXJlIGlzIGEgSmF2YSBnZXR0ZXIgdGhhdCByZXR1cm5zIGEgc2luZ2xldG9uLgorICAgICAqLyAKKyAgICBib29sZWFuIGV4dGVuZHNKYXZhU2luZ2xldG9uKCk7IC8vIGhhcyBzaW5nbGV0b24gZ2V0dGVyCisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhbiBKYXZhIGlzU2V0IG1ldGhvZCB0aGF0IHRlc3RzIGZvciBwcmVzZW5jZS4KKyAgICAgKi8gCisgICAgYm9vbGVhbiBleHRlbmRzSmF2YU9wdGlvbigpOyAgICAvLyBoYXMgaXNTZXQgdGVzdGVyCisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIEphdmEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhbiBhcnJheS4KKyAgICAgKi8gCisgICAgYm9vbGVhbiBleHRlbmRzSmF2YUFycmF5KCk7ICAgICAvLyBoYXMgYXJyYXkgZ2V0dGVyIChjYWxsZWQgLUFycmF5LCBpZiBzaW5nbGV0b24gaXMgcHJlc2VudCkKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYXR1cmFsIEphdmEgdHlwZSBmb3IgdGhpcyBwcm9wZXJ0eS4gIFJldHVybnMgZWl0aGVyCisgICAgICogWE1MX09CSkVDVCAoZm9yIGNvbXBsZXggdHlwZXMpIG9yIG9uZSBvZiB0aGUgSkFWQV8qIGNvbnN0YW50cyBkZXNjcmliZWQKKyAgICAgKiBpbiB0aGlzIGludGVyZmFjZS4KKyAgICAgKi8gCisgICAgaW50IGdldEphdmFUeXBlQ29kZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBlbGVtZW50IG5hbWVzIHdoaWNoIHNob3VsZCBhcHBlYXIgc3RyaWN0bHkgYWZ0ZXIgYWxsCisgICAgICogb2NjdXJlbmNlcyBvZiB0aGUgZWxlbWVudHMgZGVzY3JpYmVkIGJ5IHRoaXMgcHJvcGVydHkuIEZvciBlbGVtZW50IHByb3BlcnRpZXMgb25seS4KKyAgICAgKi8gCisgICAgUU5hbWVTZXQgZ2V0SmF2YVNldHRlckRlbGltaXRlcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN1bW1hcml6ZWQgbWluaW11bSBvY2N1cnJhbmNlIG51bWJlci4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBzZXF1ZW5jZSBjb250YWluaW5nIGEgbm9ub3B0aW9uYWwgc2luZ2xldG9uIGVsZW1lbnQgcmVwZWF0ZWQgdHdpY2Ugd2lsbAorICAgICAqIHJlc3VsdCBpbiBhIHByb3BlcnR5IGdldE1pbk9jY3VycygpIG9mIDIuCisgICAgICovIAorICAgIEJpZ0ludGVnZXIgZ2V0TWluT2NjdXJzKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN1bW1hcml6ZWQgbWluaW11bSBvY2N1cnJhbmNlIG51bWJlci4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBzZXF1ZW5jZSBjb250YWluaW5nIGEgbm9ub3B0aW9uYWwgc2luZ2xldG9uIGVsZW1lbnQgcmVwZWF0ZWQgdHdpY2Ugd2lsbAorICAgICAqIHJlc3VsdCBpbiBhIHByb3BlcnR5IGdldE1heE9jY3VycygpIG9mIDIuCisgICAgICovIAorICAgIEJpZ0ludGVnZXIgZ2V0TWF4T2NjdXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjTkVWRVJ9LCB7QGxpbmsgI1ZBUklBQkxFfSwgb3Ige0BsaW5rICNDT05TSVNURU5UTFl9IG5pbGxhYmxlLCBkZXBlbmRpbmcgb24gdGhlCisgICAgICogbmlsbGFiaWxpdHkgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgcHJvcGVydHkuIAorICAgICAqLworICAgIGludCBoYXNOaWxsYWJsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgI05FVkVSfSwge0BsaW5rICNWQVJJQUJMRX0sIG9yIHtAbGluayAjQ09OU0lTVEVOVExZfSBkZWZhdWx0ZWQsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBkZWZhdWx0cyBwcmVzZW50IGluIHRoZSBlbGVtZW50cyBpbiB0aGlzIHByb3BlcnR5LiAKKyAgICAgKi8KKyAgICBpbnQgaGFzRGVmYXVsdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgI05FVkVSfSwge0BsaW5rICNWQVJJQUJMRX0sIG9yIHtAbGluayAjQ09OU0lTVEVOVExZfSBmaXhlZCwgZGVwZW5kaW5nIG9uIHRoZQorICAgICAqIGZpeGVkIGNvbnN0cmFpbnRzIHByZXNlbnQgaW4gdGhlIGVsZW1lbnRzIGluIHRoaXMgcHJvcGVydHkuIAorICAgICAqLworICAgIGludCBoYXNGaXhlZCgpOworCisgICAgLyoqIEFwcGxpZXMgdG8gbm8gZWxlbWVudHMgZm9yIHRoaXMgcHJvcGVydHkuICBTZWUge0BsaW5rICNoYXNOaWxsYWJsZX0sIHtAbGluayAjaGFzRGVmYXVsdH0sIHtAbGluayAjaGFzRml4ZWR9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBORVZFUiA9IDA7CisgICAgLyoqIEFwcGxpZXMgdG8gc29tZSwgYnV0IG5vdCBvdGhlciBlbGVtZW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4gIFNlZSB7QGxpbmsgI2hhc05pbGxhYmxlfSwge0BsaW5rICNoYXNEZWZhdWx0fSwge0BsaW5rICNoYXNGaXhlZH0gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFID0gMTsKKyAgICAvKiogQXBwbGllcyB0byBhbGwgZWxlbWVudHMgZm9yIHRoaXMgcHJvcGVydHkuICBTZWUge0BsaW5rICNoYXNOaWxsYWJsZX0sIHtAbGluayAjaGFzRGVmYXVsdH0sIHtAbGluayAjaGFzRml4ZWR9ICovCisgICAgc3RhdGljIGZpbmFsIGludCBDT05TSVNURU5UTFkgPSAyOworCisgICAgLyoqIEFuIFhNTCBCZWFuIHR5cGUgdGhhdCBpbmhlcml0cyBmcm9tIHtAbGluayBYbWxPYmplY3R9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVCA9IDA7CisKKyAgICAvKiogSmF2YSBwcmltaXRpdmUgdHlwZSBjb2RlcyAoZm9yIG5vbi1udWxsYWJsZSBKYXZhIHR5cGVzKSBhcmUgYmV0d2VlbiBKQVZBX0ZJUlNUX1BSSU1JVElWRSBhbmQgSkFWQV9MQVNUX1BSSU1JVElWRSwgaW5jbHVzaXZlLiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9GSVJTVF9QUklNSVRJVkUgPSAxOworCisgICAgLyoqIEEgSmF2YSBib29sZWFuLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CT09MRUFOID0gMTsKKyAgICAvKiogQSBKYXZhIGZsb2F0LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9GTE9BVCA9IDI7CisgICAgLyoqIEEgSmF2YSBkb3VibGUuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0RPVUJMRSA9IDM7CisgICAgLyoqIEEgSmF2YSBieXRlLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CWVRFID0gNDsKKyAgICAvKiogQSBKYXZhIHNob3J0LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TSE9SVCA9IDU7CisgICAgLyoqIEEgSmF2YSBpbnQuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0lOVCA9IDY7CisgICAgLyoqIEEgSmF2YSBsb25nLiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MT05HID0gNzsKKworICAgIC8qKiBKYXZhIHByaW1pdGl2ZSB0eXBlIGNvZGVzIChmb3Igbm9uLW51bGxhYmxlIEphdmEgdHlwZXMpIGFyZSBiZXR3ZWVuIEpBVkFfRklSU1RfUFJJTUlUSVZFIGFuZCBKQVZBX0xBU1RfUFJJTUlUSVZFLCBpbmNsdXNpdmUuICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBU1RfUFJJTUlUSVZFID0gNzsKKworICAgIC8qKiBBIHtAbGluayBqYXZhLm1hdGguQmlnRGVjaW1hbH0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0JJR19ERUNJTUFMID0gODsKKyAgICAvKiogQSB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9CSUdfSU5URUdFUiA9IDk7CisgICAgLyoqIEEge0BsaW5rIFN0cmluZ30uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX1NUUklORyA9IDEwOworICAgIC8qKiBBIGJ5dGVbXS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfQllURV9BUlJBWSA9IDExOworICAgIC8qKiBBIHtAbGluayBHRGF0ZX0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0dEQVRFID0gMTI7CisgICAgLyoqIEEge0BsaW5rIEdEdXJhdGlvbn0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0dEVVJBVElPTiA9IDEzOworICAgIC8qKiBBIHtAbGluayBqYXZhLnV0aWwuRGF0ZX0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX0RBVEUgPSAxNDsKKyAgICAvKiogQSB7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZX0uIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX1FOQU1FID0gMTU7CisgICAgLyoqIEEge0BsaW5rIGphdmEudXRpbC5MaXN0fS4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfTElTVCA9IDE2OworICAgIC8qKiBBIHtAbGluayBqYXZhLnV0aWwuQ2FsZW5kYXJ9LiBTZWUge0BsaW5rICNnZXRKYXZhVHlwZUNvZGV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DQUxFTkRBUiA9IDE3OworCisgICAgLyoqIEEgZ2VuZXJhdGVkIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfSBzdWJjbGFzcy4gU2VlIHtAbGluayAjZ2V0SmF2YVR5cGVDb2RlfS4gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfRU5VTSA9IDE4OworICAgIC8qKiBBIHtAbGluayBqYXZhLmxhbmcuT2JqZWN0fSwgdXNlZCBmb3Igc29tZSBzaW1wbGUgdHlwZSB1bmlvbnMuIFNlZSB7QGxpbmsgI2dldEphdmFUeXBlQ29kZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBKQVZBX09CSkVDVCA9IDE5OyAvLyBmb3Igc29tZSB1bmlvbnMKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3IgZml4ZWQgdmFsdWUsCisgICAgICogaWYgaXQgaXMgY29uc2lzdGVudC4gSWYgaXQgaXMgbm90IGNvbnNpc3RlbnQsCisgICAgICogdGhlbiByZXR1cm5zIG51bGwuCisgICAgICogU2VlIHtAbGluayAjaGFzRGVmYXVsdH0gYW5kIHtAbGluayAjaGFzRml4ZWR9LgorICAgICAqLworICAgIFN0cmluZyBnZXREZWZhdWx0VGV4dCgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgb3IgZml4ZWQgdmFsdWUgYXMgYSBzdHJvbmdseS10eXBlZCB2YWx1ZSwKKyAgICAgKiBpZiBpdCBpcyBjb25zaXN0ZW50LiBJZiBpdCBpcyBub3QgY29uc2lzdGVudCwKKyAgICAgKiB0aGVuIHJldHVybnMgbnVsbC4KKyAgICAgKiBTZWUge0BsaW5rICNoYXNEZWZhdWx0fSBhbmQge0BsaW5rICNoYXNGaXhlZH0uCisgICAgICovCisgICAgWG1sQW55U2ltcGxlVHlwZSBnZXREZWZhdWx0VmFsdWUoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFTdHJpbmdFbnVtRW50cnkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFTdHJpbmdFbnVtRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBmZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVN0cmluZ0VudW1FbnRyeS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogRGVzY3JpYmVzIGEgY29kZS1nZW5lcmF0ZWQgc3RyaW5nIGVudW1lcmF0aW9uCisgKiAKKyAqIEBzZWUgU2NoZW1hVHlwZSNnZXRTdHJpbmdFbnVtRW50cmllcworICovIAorcHVibGljIGludGVyZmFjZSBTY2hlbWFTdHJpbmdFbnVtRW50cnkKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgZW51bWVyYXRlZCBzdHJpbmcgdmFsdWUKKyAgICAgKi8gCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIHJlcHJlc2VudCB0aGlzIGNob2ljZSBpbiB0aGUgZW51bWVyYXRpb24KKyAgICAgKi8gCisgICAgcHVibGljIGludCBnZXRJbnRWYWx1ZSgpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2FwaXRhbGl6ZWQgbmFtZSB0byB1c2UgZm9yIHRoZSBlbnVtZXJhdGlvbiBjb25zdGFudCBuYW1lCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW51bU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZDcxNmYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZS5qYXZhCkBAIC0wLDAgKzEsODcyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2NoZW1hIHR5cGUuCisgKiA8cD4KKyAqIFNjaGVtYVR5cGUgaXMgdGhlIG1ldGFkYXRhICJ0eXBlIiBjbGFzcyBmb3Ige0BsaW5rIFhtbE9iamVjdH0sIGFuZCBpdCBwbGF5cyB0aGUKKyAqIGFuYWxvZ291cyByb2xlIGZvciB7QGxpbmsgWG1sT2JqZWN0fSB0aGF0IHtAbGluayBqYXZhLmxhbmcuQ2xhc3N9IHBsYXlzIGZvcgorICoge0BsaW5rIGphdmEubGFuZy5PYmplY3R9LgorICogPHA+CisgKiBFdmVyeSBYTUwgQmVhbiBjbGFzcyBjb3JyZXNwb25kcyB0byBhIHNpbmdsZXRvbiBTY2hlbWFUeXBlIG9iamVjdAorICogb2J0YWluYWJsZSBieSBDbGFzc05hbWUudHlwZSAoZS5nLiwge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlciN0eXBlfSksIGFuZAorICogZXZlcnkgWE1MIEJlYW4gaW5zdGFuY2UgaGFzIGFuIGFjdHVhbCBTY2hlbWFUeXBlLCBvYnRhaW5hYmxlIGJ5CisgKiB7QGxpbmsgWG1sT2JqZWN0I3NjaGVtYVR5cGV9LiAgVGhlIENsYXNzTmFtZS50eXBlIGFuZCBzY2hlbWFUeXBlKCkgbWVjaGFuaXNtcyBhcmUKKyAqIGFuYWxvZ291cyB0byB0aGUgb3JkaW5hcnkgSmF2YSBDbGFzc05hbWUuY2xhc3MgYW5kIG9iai5nZXRDbGFzcygpIG1lY2hhbmlzbXMuCisgKiA8cD4KKyAqIEFsbCBzY2hlbWEgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGEgU2NoZW1hVHlwZSwgdGhpcyBpbmNsdWRlcyBhbGwgdHlwZXMKKyAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBidWlsdC1pbiBvciB1c2VyLWRlZmluZWQsIGNvbXBpbGVkIG9yCisgKiB1bmNvbXBpbGVkLCBzaW1wbGUgb3IgY29tcGxleC4KKyAqIDxwPgorICogSW4gYWRkaXRpb24sIGEgY29tcGlsZWQgWE1MIEJlYW4gdHlwZSBzeXN0ZW0gaW5jbHVkZXMgc3BlY2lhbCAiZG9jdW1lbnQiIHNjaGVtYSB0eXBlcworICogZWFjaCByZXByZXNlbnRpbmcgYSBkb2N1bWVudCBjb250YWluaW5nIG5vdGhpbmcgYnV0IGEgc2luZ2xlIGVsZW1lbnQgZm9yIGVhY2gKKyAqIGdsb2JhbCBlbGVtZW50LCBhbmQgc3BlY2lhbCAiYXR0cmlidXRlIiBzY2hlbWEgdHlwZXMgZWFjaCByZXByZXNlbnRpbmcKKyAqIGEgZnJhZ21lbnQgY29udGFpbmluZyBub3RoaW5nIGJ1dCBhIHNpbmdsZSBnbG9iYWwgYXR0cmlidXRlIGZvciBnbG9iYWwKKyAqIGF0dHJpYnV0ZS4KKyAqIDxwPgorICogRG8gbm90IGNvbmZ1c2UgU2NoZW1hIFR5cGVzIHdpdGggb3RoZXIgdHlwZXMgb2YgU2NoZW1hIENvbXBvbmVudHMgc3VjaCBhcworICoge0BsaW5rIFNjaGVtYUdsb2JhbEVsZW1lbnQgR2xvYmFsIEVsZW1lbnRzfSwge0BsaW5rIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBHbG9iYWwgQXR0cmlidXRlc30sCisgKiB7QGxpbmsgU2NoZW1hTW9kZWxHcm91cCBOYW1lZCBNb2RlbCBHcm91cHN9LCBvciB7QGxpbmsgU2NoZW1hQXR0cmlidXRlR3JvdXAgQXR0cmlidXRlIEdyb3Vwc30uCisgKiBTY2hlbWFUeXBlIHJlcHJlc2VudHMgYSBUeXBlIGNvbXBvbmVudCwgbm90IGFueSBvZiB0aGUgb3RoZXIga2luZHMgb2YgY29tcG9uZW50cy4KKyAqIFRoZXJlIGFyZSBkaWZmZXJlbnQga2luZHMgb2YgbWV0YWRhdGEgb2JqZWN0cyBmb3IgdGhlIGRpZmZlcmVudCBTY2hlbWEgY29tcG9uZW50cy4gCisgKiA8cD4KKyAqIFRoZSBzcGFjZSBvZiBTY2hlbWFUeXBlcyBpcyBkaXZpZGVkIGFzIGZvbGxvd3M6CisgKiAKKyAqIDx1bD4KKyAqIDxsaT5GaXJzdCwgdGhlcmUgaXMgdGhlIHVuaXZlcnNhbCBiYXNlIHR5cGUgYW5kIHRoZSB1bml2ZXJzYWwKKyAqICAgICBzdWJ0eXBlLiAgVGhlc2UgYXJlIHtAbGluayBYbWxPYmplY3QjdHlwZX0KKyAqICAgICAoY29ycmVzcG9uZGluZyB0byB4czphbnlUeXBlKSBhbmQge0BsaW5rIFhtbEJlYW5zI05PX1RZUEV9LAorICogICAgIHJlc3BlY3RpdmVseS4gIFRoZSBmaXJzdCB0eXBlIGlzIGEgYmFzZSB0eXBlIG9mIGFsbCBvdGhlcgorICogICAgIHR5cGVzLiAgVGhlIG90aGVyIHR5cGUgaW5kaWNhdGVzIHRoZSBhYnNlbmNlIG9mIHR5cGUgaW5mb3JtYXRpb24KKyAqICAgICBhbmQsIGF0IGxlYXN0IGluIHNldC10aGVvcmV0aWMgdGVybXMsIGlzIGEgc3VidHlwZSBvZiBhbGwgb3RoZXIgdHlwZXMuCisgKiA8bGk+VGhlcmUgaXMgYW5vdGhlciB1bml2ZXJzYWwgYmFzZSB0eXBlIHRoYXQgaXMgdGhlIGJhc2UgdHlwZQorICogICAgIGZvciBhbGwgc2ltcGxlIHR5cGVzLiAgVGhpcyBpcyB0aGUge0BsaW5rIFhtbEFueVNpbXBsZVR5cGUjdHlwZX0sCisgKiAgICAgY29ycmVzcG9uZGluZyB0byB4czphbnlTaW1wbGVUeXBlLiAgIE9ubHkgWG1sT2JqZWN0LnR5cGUgYW5kCisgKiAgICAgWG1sQW55U2ltcGxlVHlwZS50eXBlIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBmb3Ige0BsaW5rICNpc1VSVHlwZX0sIGFuZAorICogICAgIG9ubHkgWG1sQmVhbnMuTk9fVFlQRSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGZvciB7QGxpbmsgI2lzTm9UeXBlfS4KKyAqIDxsaT5UaGUgdHdvICJzcGVjaWFsIiBraW5kcyBvZiB0eXBlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdGhhdAorICogICAgIGRvIG5vdCBmb3JtYWxseSBleGlzdCBpbiB0aGUgYWN0dWFsIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGFyZQorICogICAgIGRvY3VtZW50IHR5cGVzIGFuZCBnbG9iYWwgYXR0cmlidXRlIHR5cGVzIChjb3JyZXNwb25kaW5nIHRvCisgKiAgICAgZG9jdW1lbnRzIHRoYXQgY29udGFpbiBhIGdsb2JhbCBlbGVtZW50LCBvciBmcmFnbWVudHMgdGhhdAorICogICAgIGNvbnRhaW4gYSBnbG9iYWwgYXR0cmlidXRlKS4gIFRoZXkgY2FuIGJlIGRldGVjdGVkIHVzaW5nCisgKiAgICAge0BsaW5rICNpc0RvY3VtZW50VHlwZX0gYW5kIHtAbGluayAjaXNBdHRyaWJ1dGVUeXBlfS4gT3RoZXIKKyAqICAgICB0aGFuIHRoZWlyIGFub255bWl0eSAobGFjayBvZiBhIHR5cGUgbmFtZSkgYW5kIHRoZWlyIGFwcGVhcmFuY2UKKyAqICAgICBvbmx5IGF0IHRoZSByb290IG9mIGFuIGluc3RhbmNlLCB0aGV5IGFyZSBvdGhlcndpc2UganVzdCBsaWtlCisgKiAgICAgb3JkaW5hcnkgY29tcGxleCB0eXBlcy4KKyAqIDxsaT5TaW1wbGUgdHlwZXMgY2FuIGJlIGRldGVjdGVkIHVzaW5nIHtAbGluayAjaXNTaW1wbGVUeXBlfS4KKyAqICAgICBDb21wbGV4IHR5cGVzIGFyZSBjb25zZGVyZWQgdG8gYmUgYWxsIHRoZSB0eXBlcyB0aGF0IGFyZQorICogICAgIG5vdCBzaW1wbGUuCisgKiA8bGk+U2ltcGxlIHR5cGVzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgdmFyaWV0aWVzOiBhdG9taWMgdHlwZXMsCisgKiAgICAgbGlzdCB0eXBlcywgYW5kIHVuaW9uIHR5cGVzLiAgV2hpY2ggdmFyaWV0eSBvZiBzaW1wbGUgdHlwZQorICogICAgIHlvdSBoYXZlIGNhbiBiZSBkaXNjb3ZlcmQgdXNpbmcge0BsaW5rICNnZXRTaW1wbGVWYXJpZXR5fS4KKyAqICAgICBJdCB3aWxsIHJldHVybiBlaXRoZXIge0BsaW5rICNBVE9NSUN9LCB7QGxpbmsgI0xJU1R9LCBvcgorICogICAgIHtAbGluayAjVU5JT059LgorICogPGxpPkFuIHtAbGluayAjQVRPTUlDfSBzaW1wbGUgdHlwZSBpcyBhbHdheXMgYmFzZWQgb24gb25lIG9mIHRoZQorICogICAgIDIwIGJ1aWx0LWluIHByaW1pdGl2ZSBzY2hlbWEgdHlwZXMuICBZb3UgY2FuIGRldGVybWluZQorICogICAgIHRoZSB1bmRlcmx5aW5nIHByaW1pdGl2ZSB0eXBlIGZvciBhbiBhdG9taWMgc2ltcGxlIHR5cGUKKyAqICAgICBieSBjYWxsaW5nIHtAbGluayAjZ2V0UHJpbWl0aXZlVHlwZX0uICBBbiBhdG9taWMgdHlwZQorICogICAgIG1heSBhZGQgZmFjZXQgcmVzdHJpY3Rpb25zIG9uIHRvcCBvZiB0aGUgcHJpbWl0aXZlIHR5cGUsCisgKiAgICAgYW5kIHRoZXNlIGZhY2V0cyBjYW4gYmUgZXhwbG9yZWQgdXNpbmcge0BsaW5rICNnZXRGYWNldH0sCisgKiAgICAge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0sIHtAbGluayAjbWF0Y2hQYXR0ZXJuRmFjZXR9LAorICogICAgIHtAbGluayAjZ2V0RW51bWVyYXRpb25WYWx1ZXN9LCBhbmQgcmVsYXRlZCBtZXRob2RzLgorICogPGxpPkEge0BsaW5rICNMSVNUfSBzaW1wbGUgdHlwZSBpcyBhbHdheXMgYmFzZWQgb24gYW5vdGhlciBub24tbGlzdAorICogICAgIHNpbXBsZSB0eXBlLiAgVGhlIHVuZGVybHlpbmcgbGlzdCBpdGVtIHR5cGUgY2FuIGJlIG9idGFpbmVkCisgKiAgICAgYnkgdXNpbmcge0BsaW5rICNnZXRMaXN0SXRlbVR5cGV9LgorICogPGxpPkEge0BsaW5rICNVTklPTn0gc2ltcGxlIHR5cGUgaXMgYWx3YXlzIGNvbXBvc2VkIG91dCBvZiBhIG51bWJlciBvZgorICogICAgIG90aGVyIHNpbXBsZSB0eXBlcy4gIFRoZSBkaXJlY3QgbWVtYmVycyBvZiB0aGUgdW5pb24gY2FuCisgKiAgICAgYmUgb2J0YWluZWQgYnkge0BsaW5rICNnZXRVbmlvbk1lbWJlclR5cGVzfS4gIFdoZW4gdW5pb25zCisgKiAgICAgY29uc2lzdCBvZiBvdGhlciB1bmlvbnMsIGl0IGlzIHVzZWZ1bCB0byBrbm93IHVzZWZ1bCB0byBrbm93CisgKiAgICAgdGhlICJsZWF2ZXMgb2YgdGhlIHVuaW9uIHRyZWUiLCBzbyB0aGUKKyAqICAgICBzZXQgb2Ygbm9uLXVuaW9uIHR5cGVzIG1ha2luZyB1cCB0aGUgdW5pb24gY2FuIGJlIG9idGFpbmVkCisgKiAgICAgYnkge0BsaW5rICNnZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXN9LiAgVGhlIGNsb3N1cmUgb2YgdGhlCisgKiAgICAgZW50aXJlICJ1bmlvbiB0cmVlIiBpcyB7QGxpbmsgI2dldFVuaW9uU3ViVHlwZXN9ICh0aGlzIGluY2x1ZGVzCisgKiAgICAgdGhlIHR5cGUgaXRzZWxmKS4gIEZvcgorICogICAgIHNpbXBsZSB1bmlvbnMgdGhhdCBkbyBub3QgY29uc2lzdCBvZiBvdGhlciB1bmlvbnMsIGFsbCB0aHJlZQorICogICAgIG9mIHRoZXNlIHNldHMgYXJlIHRoZSBzYW1lLgorICogPGxpPkNvbXBsZXggdHlwZXMgaGF2ZSBuZXN0ZWQgc3RydWN0dXJlLiAgVGhleSBhcmUgZGl2aWRlZCBpbnRvCisgKiAgICAgZm91ciBjb250ZW50IHR5cGVzOiBlbXB0eSBjb250ZW50LCBzaW1wbGUgY29udGVudCwgZWxlbWVudC1vbmx5CisgKiAgICAgY29udGVudCwgYW5kIG1peGVkIGNvbnRlbnQuICBBbGwga2luZHMgb2YgY29tcGxleCB0eXBlcyBtYXkKKyAqICAgICBoYXZlIGF0dHJpYnV0ZXMuICBUaGUgY29udGVudCB0eXBlIGZvciBhIGNvbXBsZXggdHlwZSBjYW4KKyAqICAgICBiZSBkZXJtaW5lZCB1c2luZyB7QGxpbmsgI2dldENvbnRlbnRUeXBlfS4gIFRoaXMgd2lsbCByZXR1cm4KKyAqICAgICB7QGxpbmsgI0VNUFRZX0NPTlRFTlR9LCB7QGxpbmsgI1NJTVBMRV9DT05URU5UfSwKKyAqICAgICB7QGxpbmsgI0VMRU1FTlRfQ09OVEVOVH0sIG9yIHtAbGluayAjTUlYRURfQ09OVEVOVH0uCisgKiA8bGk+SWYgYSBjb21wbGV4IHR5cGUgaGFzIHtAbGluayAjRU1QVFlfQ09OVEVOVH0sIHRoZSBjb250ZW50IG1vZGVsIHdpbGwgYmUgbnVsbC4KKyAqIDxsaT5JZiBhIGNvbXBsZXggdHlwZSBoYXMge0BsaW5rICNTSU1QTEVfQ09OVEVOVH0sIHRoZW4gaXQgd2lsbCBleHRlbmQgdGhlCisgKiAgICAgc2ltcGxlIHR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnQuICBJbiBhZGRpdGlvbiwgdGhlIHR5cGUKKyAqICAgICBtYXkgaW1wb3NlIGFkZGl0aW9uYWwgc2ltcGxlIHR5cGUgZmFjZXQgcmVzdHJpY3Rpb25zOyB0aGVzZSBjYW4gCisgKiAgICAgYmUgZGV0ZXJtaW5lZCBpbiB0aGUgc2FtZSB3YXkgdGhleSBhcmUgZm9yIGEgc2ltcGxlIHR5cGUuCisgKiA8bGk+SWYgYSBjb21wbGV4IHR5cGUgaGFzIHtAbGluayAjRUxFTUVOVF9DT05URU5UfSBvciB7QGxpbmsgI01JWEVEX0NPTlRFTlR9LCB0aGVuCisgKiAgICAgdGhlIGRldGFpbGVkIGNvbnRlbnQgbW9kZWwgY2FuIGJlIGRldGVybWluZWQgYnkgZXhhbWluaW5nCisgKiAgICAgdGhlIHBhcnRpY2xlIHRyZWUgKHdoaWNoIG1heSBiZSBudWxsIGZvciBNSVhFRF9DT05URU5UKS4KKyAqICAgICBUaGUgcGFydGljbGUgdHJlZSBjYW4gYmUgb2J0YWluZWQgdmlhIHtAbGluayAjZ2V0Q29udGVudE1vZGVsfS4KKyAqIDxsaT5XaGVuIHdvcmtpbmcgd2l0aCBhIGNvbXBsZXggdHlwZSwgbW9zdCB1c2VycyB3aWxsIGZpbmQgaXQKKyAqICAgICBzdWZmaWNpZW50IHRvIGRpc2NvdmVyIHRoZSBzdW1tYXJpemVkIHNoYXBlIG9mIHRoZSBjb250ZW50IG1vZGVsCisgKiAgICAgYW5kIGF0dHJpYnV0ZSBtb2RlbCB1c2luZyB7QGxpbmsgI2dldEVsZW1lbnRQcm9wZXJ0aWVzfSwKKyAqICAgICB7QGxpbmsgI2dldEF0dHJpYnV0ZVByb3BlcnRpZXN9LCBhbmQgcmVsYXRlZCBtZXRob2RzIHJhdGhlciB0aGFuCisgKiAgICAgZXhhbWluaW5nIHRoZSBwYXJ0aWNsZSB0cmVlIGFuZCBhdHRyaWJ1dGUgbW9kZWwgZGlyZWN0bHkuCisgKiA8L3VsPgorICogCisgKiBAc2VlIFNjaGVtYVR5cGVMb2FkZXIKKyAqIEBzZWUgWG1sT2JqZWN0I3NjaGVtYVR5cGUKKyAqIEBzZWUgU2ltcGxlVmFsdWUjaW5zdGFuY2VUeXBlCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGUgZXh0ZW5kcyBTY2hlbWFDb21wb25lbnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSB0eXBlIGluIHRoZSBzY2hlbWEuCisgICAgICogTnVsbCBpZiB0aGUgdHlwZSBpcyBhbm9ueW1vdXMgKG5lc3RlZCksIG9yIGlmIGl0IGlzIGEgZG9jdW1lbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUU5hbWUgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBzY2hlbWEgZWxlbWVudC4KKyAgICAgKiBOdWxsIGZvciB0b3AtbGV2ZWwgKG5hbWVkKSB0eXBlcyBhbmQgZG9jdW1lbnQgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYUZpZWxkIGdldENvbnRhaW5lckZpZWxkKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgaXMgYSBkb2N1bWVudCB0eXBlLgorICAgICAqIDxwPgorICAgICAqIERvY3VtZW50IHR5cGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IGdsb2JhbCBlbGVtZW50LiBBIGRvY3VtZW50CisgICAgICogdHlwZSBpcyBhbiB1bm5hbWVkIGNvbXBsZXggdHlwZSB0aGF0IGNvbnRhaW5zIGV4YWN0bHkgb25lIGVsZW1lbnQ6CisgICAgICogd2UgZGVmaW5lIHRoZXNlIHR5cGVzLCBiZWNhdXNlIHRoZXkgYXJlIHRoZSB0eXBlcyBvZiB0aGUgImRvY3VtZW50cyIKKyAgICAgKiB3aGljaCBjb250YWluIHRoZSBkZWZpbmVkIGdsb2JhbCBlbGVtZW50cywgYW5kIHRoZXkgYWxsIHR1cm4gaW50bworICAgICAqIEphdmEgdHlwZXMuIChOYW1lZCBFbGVtZW50bmFtZURvY3VtZW50LikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50VHlwZSgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIGlzIGEgYXR0cmlidXRlIHR5cGUuCisgICAgICogPHA+CisgICAgICogQXR0cmlidXRlIHR5cGVzIGFyZSBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IGdsb2JhbCBhdHRyaWJ1dGUuIEFuIGF0dHJpYnV0ZQorICAgICAqIHR5cGUgaXMgYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUgdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBhdHRyaWJ1dGU6CisgICAgICogd2UgZGVmaW5lIHRoZXNlIHR5cGVzLCBiZWNhdXNlIHRoZXkgYXJlIHRoZSB0eXBlcyBvZiB0aGUgImF0dHJpYnV0ZSBkb2N1bWVudHMiCisgICAgICogd2hpY2ggY29udGFpbiB0aGUgZGVmaW5lZCBnbG9iYWwgYXR0cmlidXRlLCBhbmQgdGhleSBhbGwgdHVybiBpbnRvCisgICAgICogSmF2YSB0eXBlcy4gKE5hbWVkIEF0dHJpYnV0ZW5hbWVBdHRyaWJ1dGUuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlVHlwZSgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbGVtZW50IG5hbWUgaWYgdGhpcyBpcyBhIGRvY3VtZW50IHR5cGUsCisgICAgICogb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldERvY3VtZW50RWxlbWVudE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBxbmFtZSBpZiB0aGlzIGlzIGEgYXR0cmlidXRlIHR5cGUsCisgICAgICogb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZVR5cGVBdHRyaWJ1dGVOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0ZXIgc2NoZW1hIHR5cGUuCisgICAgICogTnVsbCBmb3IgdG9wLWxldmVsIChuYW1lZCkgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0T3V0ZXJUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgYW5vbnltb3VzIHR5cGUgaGFzIG5vIGNvcnJlc3BvbmRpbmcgSmF2YSB0eXBlLiBUcnVlIGZvcgorICAgICAqIGFub255bW91cyB0eXBlcyBuZXN0ZWQgd2l0aGluIHNpbXBsZSB0eXBlIHJlc3RyaWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1NraXBwZWRBbm9ueW1vdXNUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgc2NoZW1hIHR5cGUgd2FzIGNvbXBpbGVkIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nCisgICAgICogSmF2YSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBpbGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZ1bGxKYXZhTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIHNob3J0IHVucXVhbGZpaWVkIEphdmEgbmFtZSBmb3IgdGhlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRKYXZhTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGdWxsSmF2YUltcGxOYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2hvcnQgdW5xdWFsZmlpZWQgSmF2YSBuYW1lIGZvciB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTaG9ydEphdmFJbXBsTmFtZSgpOworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGlzIHNjaGVtYSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudW1lcmF0aW9uIHR5cGUgZm9yIHRoaXMgc2NoZW1hIHR5cGUsCisgICAgICogaWYgYXBwbGljYWJsZSAob3IgbnVsbCBpZiBub3QgYW4gZW51bWVyYXRpb24pLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRFbnVtSmF2YUNsYXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBYc2QgdHlwZSBpcyBhbm9ueW1vdXMgKGkuZS4sIG5vdCB0b3AtbGV2ZWwpLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQW5vbnltb3VzVHlwZSgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3IgYW55IG9mIHRoZSA0MCsgYnVpbHQtaW4gdHlwZXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNCdWlsdGluVHlwZSgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3IgdGhlIGFueVNpbXBsZVR5cGUgYW5kIGFueSByZXN0cmljdGlvbnMvdW5pb25zL2xpc3RzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2ltcGxlVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBiYXNlIHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbiB0eXBlLiBVbmlvbnMgYW5kIGxpc3RzCisgICAgICogcmV0dXJuIHRoZSBhbnlTaW1wbGVUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEJhc2VUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGNvbW1vbiBiYXNlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gVGhlIHJldHVybmVkCisgICAgICogdHlwZSBpcyB0aGUgbW9zdCBzcGVjaWZpYyBkZWNsYXJlZCBiYXNlIHR5cGUgb2YgYm90aCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRDb21tb25CYXNlVHlwZShTY2hlbWFUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgZGVyaXZlcyBmcm9tIHRoaXMgdHlwZSAob3IgaWYKKyAgICAgKiBpdCBpcyB0aGUgc2FtZSB0eXBlKS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCBYbWxPYmplY3QudHlwZSAodGhlIGFueVR5cGUpIGlzIGFzc2lnbmFibGUKKyAgICAgKiBmcm9tIGFsbCB0eXBlLCBhbmQgdGhlIFhtbEJlYW5zLm5vVHlwZSAodGhlIGFic2VuY2Ugb2YKKyAgICAgKiBhIHR5cGUpIGlzIGFzc2lnbmFibGUgdG8gYWxsIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oU2NoZW1hVHlwZSB0eXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciBmb3IgdGhlIGRlcml2YXRpb24gdHlwZSwgZWl0aGVyIAorICAgICAqIHtAbGluayAjRFRfRVhURU5TSU9OfSwge0BsaW5rICNEVF9SRVNUUklDVElPTn0sIHtAbGluayAjRFRfTk9UX0RFUklWRUR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVyaXZhdGlvblR5cGUoKTsKKyAgICAKKyAgICAvKiogTm90IGRlcml2ZWQuICBUcnVlIGZvciBYbWxPYmplY3QudHlwZSBvbmx5LiBTZWUge0BsaW5rICNnZXREZXJpdmF0aW9uVHlwZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFRfTk9UX0RFUklWRUQgPSAwOworICAgIC8qKiBEZXJpdmVkIGJ5IHJlc3RyaWN0aW9uLiBTZWUge0BsaW5rICNnZXREZXJpdmF0aW9uVHlwZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFRfUkVTVFJJQ1RJT04gPSAxOworICAgIC8qKiBEZXJpdmVkIGJ5IGV4dGVuc2lvbi4gU2VlIHtAbGluayAjZ2V0RGVyaXZhdGlvblR5cGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERUX0VYVEVOU0lPTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGludGVnZXIgZm9yIGJ1aWx0aW4gdHlwZXMgdGhhdCBjYW4gYmUgdXNlZAorICAgICAqIGZvciBxdWljayBjb21wYXJpc29uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QnVpbHRpblR5cGVDb2RlKCk7CisKKyAgICAvKiogTm90IGEgYnVpbHRpbiB0eXBlICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OT1RfQlVJTFRJTiA9IDA7CisgICAgLyoqIHhzOmFueVR5cGUsIGFrYSB7QGxpbmsgWG1sT2JqZWN0I3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19BTllfVFlQRSA9IDE7CisgICAgCisgICAgLyoqIFRoZSBwcmltaXRpdmUgdHlwZXMgaGF2ZSBjb2RlcyBiZXR3ZWVuIEJUQ19GSVJTVF9QUklNSVRJVkUgYW5kIEJUQ19MQVNUX1BSSU1JVElWRSBpbmNsdXNpdmUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRklSU1RfUFJJTUlUSVZFID0gMjsKKworICAgIC8qKiB4czphbnlTaW1wbGVUeXBlLCBha2Ege0BsaW5rIFhtbEFueVNpbXBsZVR5cGUjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0FOWV9TSU1QTEUgPSAyOworCisgICAgLyoqIHhzOmJvb2xlYW4sIGFrYSB7QGxpbmsgWG1sQm9vbGVhbiN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfQk9PTEVBTiA9IDM7CisgICAgLyoqIHhzOmJhc2U2NEJpbmFyeSwgYWthIHtAbGluayBYbWxCYXNlNjRCaW5hcnkjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0JBU0VfNjRfQklOQVJZID0gNDsKKyAgICAvKiogeHM6aGV4QmluYXJ5LCBha2Ege0BsaW5rIFhtbEJhc2U2NEJpbmFyeSN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSEVYX0JJTkFSWSA9IDU7CisgICAgLyoqIHhzOmFueVVSSSwgYWthIHtAbGluayBYbWxBbnlVUkkjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0FOWV9VUkkgPSA2OworICAgIC8qKiB4czpRTmFtZSwgYWthIHtAbGluayBYbWxRTmFtZSN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfUU5BTUUgPSA3OworICAgIC8qKiB4czpOT1RBVElPTiwgYWthIHtAbGluayBYbWxOT1RBVElPTiN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9UQVRJT04gPSA4OworICAgIC8qKiB4czpmbG9hdCwgYWthIHtAbGluayBYbWxGbG9hdCN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfRkxPQVQgPSA5OworICAgIC8qKiB4czpkb3VibGUsIGFrYSB7QGxpbmsgWG1sRG91YmxlI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19ET1VCTEUgPSAxMDsKKyAgICAvKiogeHM6ZGVjaW1hbCwgYWthIHtAbGluayBYbWxEZWNpbWFsI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19ERUNJTUFMID0gMTE7CisgICAgLyoqIHhzOnN0cmluZywgYWthIHtAbGluayBYbWxTdHJpbmcjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1NUUklORyA9IDEyOworCisgICAgLyoqIHhzOmR1cmF0aW9uLCBha2Ege0BsaW5rIFhtbER1cmF0aW9uI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19EVVJBVElPTiA9IDEzOworICAgIC8qKiB4czpkYXRlVGltZSwgYWthIHtAbGluayBYbWxEYXRlVGltZSN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfREFURV9USU1FID0gMTQ7CisgICAgLyoqIHhzOnRpbWUsIGFrYSB7QGxpbmsgWG1sVGltZSN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVElNRSA9IDE1OworICAgIC8qKiB4czpkYXRlLCBha2Ege0BsaW5rIFhtbERhdGUjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0RBVEUgPSAxNjsKKyAgICAvKiogeHM6Z1llYXJNb250aCwgYWthIHtAbGluayBYbWxHWWVhck1vbnRoI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX1lFQVJfTU9OVEggPSAxNzsKKyAgICAvKiogeHM6Z1llYXIsIGFrYSB7QGxpbmsgWG1sR1llYXIjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0dfWUVBUiA9IDE4OworICAgIC8qKiB4czpnTW9udGhEYXksIGFrYSB7QGxpbmsgWG1sR01vbnRoRGF5I3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19HX01PTlRIX0RBWSA9IDE5OworICAgIC8qKiB4czpnRGF5LCBha2Ege0BsaW5rIFhtbEdEYXkjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0dfREFZID0gMjA7CisgICAgLyoqIHhzOmdNb250aCwgYWthIHtAbGluayBYbWxHTW9udGgjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0dfTU9OVEggPSAyMTsKKworICAgIC8qKiBUaGUgcHJpbWl0aXZlIHR5cGVzIGhhdmUgY29kZXMgYmV0d2VlbiBCVENfRklSU1RfUFJJTUlUSVZFIGFuZCBCVENfTEFTVF9QUklNSVRJVkUgaW5jbHVzaXZlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0xBU1RfUFJJTUlUSVZFID0gMjE7CisKKyAgICAvLyBkZXJpdmVkIG51bWVyaWNzCisgICAgLyoqIHhzOmludGVnZXIsIGFrYSB7QGxpbmsgWG1sSW50ZWdlciN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSU5URUdFUiA9IDIyOworICAgIC8qKiB4czpsb25nLCBha2Ege0BsaW5rIFhtbExvbmcjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0xPTkcgPSAyMzsKKyAgICAvKiogeHM6aW50LCBha2Ege0BsaW5rIFhtbEludCN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfSU5UID0gMjQ7CisgICAgLyoqIHhzOnNob3J0LCBha2Ege0BsaW5rIFhtbFNob3J0I3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19TSE9SVCA9IDI1OworICAgIC8qKiB4czpieXRlLCBha2Ege0BsaW5rIFhtbEJ5dGUjdHlwZX0gKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0JZVEUgPSAyNjsKKyAgICAvKiogeHM6bm9uUG9zaXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlciN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk9OX1BPU0lUSVZFX0lOVEVHRVIgPSAyNzsKKyAgICAvKiogeHM6TmVnYXRpdmVJbnRlZ2VyLCBha2Ege0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlciN0eXBlfSAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTkVHQVRJVkVfSU5URUdFUiA9IDI4OworICAgIC8qKiB4czpub25OZWdhdGl2ZUludGVnZXIsIGFrYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OT05fTkVHQVRJVkVfSU5URUdFUiA9IDI5OworICAgIC8qKiB4czpwb3NpdGl2ZUludGVnZXIsIGFrYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyI3R5cGV9ICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19QT1NJVElWRV9JTlRFR0VSID0gMzA7CisgICAgLyoqIHhzOnVuc2lnbmVkTG9uZywgYWthIHtAbGluayBYbWxVbnNpZ25lZExvbmcjdHlwZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVU5TSUdORURfTE9ORyA9IDMxOworICAgIC8qKiB4czp1bnNpZ25lZEludCwgYWthIHtAbGluayBYbWxVbnNpZ25lZEludCN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19VTlNJR05FRF9JTlQgPSAzMjsKKyAgICAvKiogeHM6dW5zaWduZWRTaG9ydCwgYWthIHtAbGluayBYbWxVbnNpZ25lZFNob3J0I3R5cGV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX1VOU0lHTkVEX1NIT1JUID0gMzM7CisgICAgLyoqIHhzOnVuc2lnbmVkQnl0ZSwgYWthIHtAbGluayBYbWxVbnNpZ25lZEJ5dGUjdHlwZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfVU5TSUdORURfQllURSA9IDM0OworCisgICAgLy8gZGVyaXZlZCBzdHJpbmdzCisgICAgLyoqIHhzOm5vcm1hbGl6ZWRTdHJpbmcsIGFrYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZyN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OT1JNQUxJWkVEX1NUUklORyA9IDM1OworICAgIC8qKiB4czp0b2tlbiwgYWthIHtAbGluayBYbWxUb2tlbiN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19UT0tFTiA9IDM2OworICAgIC8qKiB4czpOYW1lLCBha2Ege0BsaW5rIFhtbE5hbWUjdHlwZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTkFNRSA9IDM3OworICAgIC8qKiB4czpOQ05hbWUsIGFrYSB7QGxpbmsgWG1sTkNOYW1lI3R5cGV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX05DTkFNRSA9IDM4OworICAgIC8qKiB4czpsYW5ndWFnZSwgYWthIHtAbGluayBYbWxMYW5ndWFnZSN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19MQU5HVUFHRSA9IDM5OworICAgIC8qKiB4czpJRCwgYWthIHtAbGluayBYbWxJRCN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19JRCA9IDQwOworICAgIC8qKiB4czpJRFJFRiwgYWthIHtAbGluayBYbWxJRFJFRiN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19JRFJFRiA9IDQxOworICAgIC8qKiB4czpJRFJFRlMsIGFrYSB7QGxpbmsgWG1sSURSRUZTI3R5cGV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0lEUkVGUyA9IDQyOworICAgIC8qKiB4czpFTlRJVFksIGFrYSB7QGxpbmsgWG1sRU5USVRZI3R5cGV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0VOVElUWSA9IDQzOworICAgIC8qKiB4czpFTlRJVElFUywgYWthIHtAbGluayBYbWxFTlRJVElFUyN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19FTlRJVElFUyA9IDQ0OworICAgIC8qKiB4czpOTVRPS0VOLCBha2Ege0BsaW5rIFhtbE5NVE9LRU4jdHlwZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVENfTk1UT0tFTiA9IDQ1OworICAgIC8qKiB4czpOTVRPS0VOUywgYWthIHtAbGluayBYbWxOTVRPS0VOUyN0eXBlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJUQ19OTVRPS0VOUyA9IDQ2OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlRDX0xBU1RfQlVJTFRJTiA9IDQ2OworCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3IgYW55VHlwZSBhbmQgYW55U2ltcGxlVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VSVHlwZSgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBmb3IgdGhlIHR5cGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHRoZSBhYnNlbmNlIG9mIGEgZGV0ZXJtaW5lZCB0eXBlLgorICAgICAqIFhNTCBPYmplY3RzIHdob3NlIHR5cGUgaXNOb1R5cGUoKSBhcmUgbmV2ZXIgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOb1R5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNjaGVtYVR5cGVMb2FkZXIgaW4gd2hpY2ggdGhpcyB0eXBlIHdhcyBkZWZpbmVkLgorICAgICAqIENvbXBsZXggdHlwZXMgYXJlIGRlZmluZWQgYW5kIHVzZWQgaW4gZXhhY3RseSBvbmUgc2NoZW1hIHR5cGUKKyAgICAgKiBzeXN0ZW0sIGJ1dCBzaW1wbGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gb25lIHR5cGUgc3lzdGVtIGFuZCBjYW4KKyAgICAgKiBiZSB1c2VkIGluIGFueSBudW1iZXIgb2YgdHlwZSBzeXN0ZW1zLiBUaGUgbW9zdCBjb21tb24gY2FzZSBpcworICAgICAqIHRoZSBidWlsdGluIHR5cGVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgYnVpbHRpbiB0eXBlIHN5c3RlbQorICAgICAqIGFuZCB1c2VkIGVsc2V3aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZVN5c3RlbSBnZXRUeXBlU3lzdGVtKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZSBmb3IgdGhlIFhTRCBmaWxlIGZyb20gd2hpY2ggdGhpcyB0eXBlCisgICAgICogd2FzIGxvYWRlZC4gSW50ZW5kZWQgZm9yIHVzZSB3aGVuIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKTsKKworICAgIC8qKiBUcnVlIGlmIHRoaXMgdHlwZSBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBpbiBpbnN0YW5jZXMgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCk7CisKKyAgICAvKiogVHJ1ZSBpZiBvdGhlciB0eXBlcyBjYW5ub3QgZXh0ZW5kIHRoaXMgdHlwZSAob25seSBmb3IgY29tcGxleCB0eXBlcykgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5hbEV4dGVuc2lvbigpOworCisgICAgLyoqIFRydWUgaWYgb3RoZXIgdHlwZXMgY2Fubm90IHJlc3RyaWN0IHRoaXMgdHlwZSAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsUmVzdHJpY3Rpb24oKTsKKworICAgIC8qKiBUcnVlIGlmIGxpc3QgZGVyaXZhdGlvbiBvZiB0aGlzIHR5cGUgaXMgcHJvaGliaXRlZCAob25seSBmb3Igc2ltcGxlIHR5cGVzKSAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsTGlzdCgpOworCisgICAgLyoqIFRydWUgaWYgdW5pb24gZGVyaXZhdGlvbiBvZiB0aGlzIHR5cGUgaXMgcHJvaGliaXRlZCAob25seSBmb3Igc2ltcGxlIHR5cGVzKSAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmFsVW5pb24oKTsKKworICAgIC8qKiBUcnVlIGlmIGV4dGVuc2lvbnMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBzdWJzdGl0dXRlZCBmb3IgdGhpcyB0eXBlICovCisgICAgcHVibGljIGJvb2xlYW4gYmxvY2tFeHRlbnNpb24oKTsKKworICAgIC8qKiBUcnVlIGlmIHJlc3RyaWN0aW9ucyBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIHN1YnN0aXR1dGVkIGZvciB0aGlzIHR5cGUgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBibG9ja1Jlc3RyaWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayAjRU1QVFlfQ09OVEVOVH0sIHtAbGluayAjU0lNUExFX0NPTlRFTlR9LCB7QGxpbmsgI0VMRU1FTlRfQ09OVEVOVH0sIG9yCisgICAgICoge0BsaW5rICNNSVhFRF9DT05URU5UfSBmb3IgY29tcGxleCB0eXBlcy4gRm9yIG5vbmNvbXBsZXggdHlwZXMsIHJldHVybnMKKyAgICAgKiB7QGxpbmsgI05PVF9DT01QTEVYX1RZUEV9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29udGVudFR5cGUoKTsKKyAgICAKKyAgICAvKiogTm90IGEgY29tcGxleCB0eXBlLiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX0NPTVBMRVhfVFlQRSA9IDA7CisgICAgLyoqIEVtcHR5IGNvbnRlbnQuICBTZWUge0BsaW5rICNnZXRDb250ZW50VHlwZSgpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTVBUWV9DT05URU5UID0gMTsKKyAgICAvKiogU2ltcGxlIGNvbnRlbnQuICBTZWUge0BsaW5rICNnZXRDb250ZW50VHlwZSgpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfQ09OVEVOVCA9IDI7CisgICAgLyoqIEVsZW1lbnQtb25seSBjb250ZW50LiAgU2VlIHtAbGluayAjZ2V0Q29udGVudFR5cGUoKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DT05URU5UID0gMzsKKyAgICAvKiogTWl4ZWQgY29udGVudC4gIFNlZSB7QGxpbmsgI2dldENvbnRlbnRUeXBlKCl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JWEVEX0NPTlRFTlQgPSA0OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNjaGVtYVR5cGVFbGVtZW50U2VxdWVuY2VyfSBvYmplY3QsIHdoaWNoIGNhbiB0aGVuCisgICAgICogYmUgdXNlZCB0byB2YWxpZGF0ZSBjb21wbGV4IGNvbnRlbnQgaW5zaWRlIHRoaXMgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwKKyAgICAgKiBmb3IgZXhhbXBsZSBmb3IgdHJ5aW5nIG91dCBkaWZmZXJlbnQgbmFtZXMgYW5kIHNlZSB3aGljaCBvbmUgd291bGQgYmUKKyAgICAgKiB2YWxpZCBhcyBhIGNoaWxkIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBTY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlciBnZXRFbGVtZW50U2VxdWVuY2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgb2YgaW5uZXIgKGFub255bW91cykgdHlwZXMgZGVmaW5lZAorICAgICAqIHdpdGhpbiB0aGlzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGVbXSBnZXRBbm9ueW1vdXNUeXBlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNjaGVtYVByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gYW4gZWxlbWVudCB3aXRoaW4gdGhpcworICAgICAqIGNvbXBsZXggdHlwZSBieSBsb29raW5nIHVwIHRoZSBlbGVtZW50IG5hbWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVByb3BlcnR5IGdldEVsZW1lbnRQcm9wZXJ0eShRTmFtZSBlbHROYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgdG8gZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVByb3BlcnR5W10gZ2V0RWxlbWVudFByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTY2hlbWFQcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIGFuIGF0dHJpYnV0ZSB3aXRoaW4gdGhpcworICAgICAqIGNvbXBsZXggdHlwZSBieSBsb29raW5nIHVwIHRoZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUHJvcGVydHkgZ2V0QXR0cmlidXRlUHJvcGVydHkoUU5hbWUgYXR0ck5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIFNjaGVtYVByb3BlcnRpZXMgY29ycmVzcG9uZGluZyB0byBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eVtdIGdldEF0dHJpYnV0ZVByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHRoZSBTY2hlbWFQcm9wZXJ0aWVzIHdpdGhpbiB0aGlzIGNvbXBsZXggdHlwZSwKKyAgICAgKiBlbGVtZW50cyBmb2xsb3dlZCBieSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFQcm9wZXJ0eVtdIGdldFByb3BlcnRpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNjaGVtYVByb3BlcnRpZXMgZGVmaW5lZCBieSB0aGlzIGNvbXBsZXggdHlwZSwKKyAgICAgKiBleGNsdXNpdmUgb2YgdGhlIGJhc2UgdHlwZSAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBTY2hlbWFQcm9wZXJ0eVtdIGdldERlcml2ZWRQcm9wZXJ0aWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgbW9kZWwgZm9yIHRoaXMgY29tcGxleCB0eXBlICh3aXRoIHNpbXBsZSBvciBjb21wbGV4IGNvbnRlbnQpLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFBdHRyaWJ1dGVNb2RlbCBnZXRBdHRyaWJ1dGVNb2RlbCgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHR5cGUgcGVybWl0cyB3aWxkY2FyZCBhdHRyaWJ1dGVzLiBTZWUgdGhlIGF0dHJpYnV0ZSBtb2RlbCBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHdpbGRjYXJkcyBhcmUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNBdHRyaWJ1dGVXaWxkY2FyZHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBsZXggY29udGVudCBtb2RlbCBmb3IgdGhpcyBjb21wbGV4IHR5cGUgKHdpdGggY29tcGxleCBjb250ZW50KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hUGFydGljbGUgZ2V0Q29udGVudE1vZGVsKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdHlwZSBwZXJtaXRzIGVsZW1lbnQgd2lsZGNhcmRzLiBTZWUgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB3aWxkY2FyZHMgYXJlIGFsbG93ZWQsIGFuZCB3aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNFbGVtZW50V2lsZGNhcmRzKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZG9jdW1lbnQgdHlwZXMsIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciB0aGUKKyAgICAgKiBkb2N1bWVudCBlbGVtZW50IG5hbWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFN1YnN0aXR1dGlvbihRTmFtZSBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGNvbXBsZXggY29udGVudCBtb2RlbCBmb3IgdGhpcyBjb21wbGV4IHR5cGUgaXMgYW4gImFsbCIgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQWxsQ29udGVudCgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBwYXJ0aWNsZXMgaGF2ZSBzYW1lIGRlZmF1bHRzLCBuaWxsYWJpbGl0eSwgZXRjLCB0aGF0IGFyZQorICAgICAqIGludmFyaWFudCB3aGVuIG9yZGVyIGNoYW5nZXMuIENvbXB1dGVkIG9ubHkgZm9yIEphdmFpemVkIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzT3JkZXJTZW5zaXRpdmUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYSBjaGlsZCBlbGVtZW50IGJhc2VkIG9uIHRoZSBlbGVtZW50IG5hbWUgYW5kCisgICAgICogYW4geHNpOnR5cGUgYXR0cmlidXRlIChhbmQgdGhlIHR5cGUgc3lzdGVtIHdpdGhpbiB3aGljaCBuYW1lcyBhcmUKKyAgICAgKiByZXNvbHZlZCkuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0RWxlbWVudFR5cGUoUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSwgU2NoZW1hVHlwZUxvYWRlciB3aWxkY2FyZFR5cGVMb2FkZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiBhbiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZAorICAgICAqIHRoZSB0eXBlIHN5c3RlbSB3aXRoaW4gd2hpY2ggKHdpbGRjYXJkKSBuYW1lcyBhcmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0QXR0cmlidXRlVHlwZShRTmFtZSBlbHROYW1lLCBTY2hlbWFUeXBlTG9hZGVyIHdpbGRjYXJkVHlwZUxvYWRlcik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTSU1QTEUgVFlQRSBNT0RFTCBCRUxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKiB4czpsZW5ndGggZmFjZXQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9MRU5HVEggPSAwOworICAgIC8qKiB4czptaW5MZW5ndGggZmFjZXQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NSU5fTEVOR1RIID0gMTsKKyAgICAvKiogeHM6bWF4TGVuZ3RoIGZhY2V0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUFYX0xFTkdUSCA9IDI7CisgICAgLyoqIHhzOm1pbkV4Y2x1c2l2ZSBmYWNldCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01JTl9FWENMVVNJVkUgPSAzOworICAgIC8qKiB4czptaW5JbmNsdXNpdmUgZmFjZXQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUNFVF9NSU5fSU5DTFVTSVZFID0gNDsKKyAgICAvKiogeHM6bWF4SW5jbHVzaXZlIGZhY2V0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfTUFYX0lOQ0xVU0lWRSA9IDU7CisgICAgLyoqIHhzOm1heEV4Y2x1c2l2ZSBmYWNldCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX01BWF9FWENMVVNJVkUgPSA2OworICAgIC8qKiB4czp0b3RhbERpZ2l0cyBmYWNldCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1RPVEFMX0RJR0lUUyA9IDc7CisgICAgLyoqIHhzOmZyYWN0aW9uRGlnaXRzIGZhY2V0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRlJBQ1RJT05fRElHSVRTID0gODsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfQkFTSUNfRkFDRVQgPSA4OworCisgICAgLyoqIHhzOndoaXRlU3BhY2UgZmFjZXQgLSB1c2Uge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0gaW5zdGVhZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ0VUX1dISVRFX1NQQUNFID0gOTsKKyAgICAvKiogeHM6cGF0dGVybiBmYWNldCAtIHVzZSB7QGxpbmsgI21hdGNoUGF0dGVybkZhY2V0fSBpbnN0ZWFkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfUEFUVEVSTiA9IDEwOworICAgIC8qKiB4czplbnVtZXJhdGlvbiBmYWNldCAtIHVzZSB7QGxpbmsgI2dldEVudW1lcmF0aW9uVmFsdWVzfSBpbnN0ZWFkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFDRVRfRU5VTUVSQVRJT04gPSAxMTsKKworICAgIC8qKiBUaGUgbGFzdCBvcmRpbmFyeSBmYWNldCBjb2RlICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfRkFDRVQgPSAxMTsKKyAgICAKKyAgICAvKiogQHNlZSAjb3JkZXJlZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09SREVSRUQgPSAxMjsKKyAgICAvKiogQHNlZSAjaXNCb3VuZGVkICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQk9VTkRFRCA9IDEzOworICAgIC8qKiBAc2VlICNpc0Zpbml0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NBUkRJTkFMSVRZID0gMTQ7CisgICAgLyoqIEBzZWUgI2lzTnVtZXJpYyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX05VTUVSSUMgPSAxNTsKKyAgICAKKyAgICAvKiogVGhlIGxhc3QgcHJvcGVydHkgY29kZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfUFJPUEVSVFkgPSAxNTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZhY2V0LCBvciBudWxsIGlmCisgICAgICogbm9uZSBpcyBzZXQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFhtbEFueVNpbXBsZVR5cGUgZ2V0RmFjZXQoaW50IGZhY2V0Q29kZSk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBmYWNldCBpcyBmaXhlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0ZhY2V0Rml4ZWQoaW50IGZhY2V0Q29kZSk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIG9yZGVyZWQuICBSZXR1cm5zIGVpdGhlciB7QGxpbmsgI1VOT1JERVJFRH0sCisgICAgICoge0BsaW5rICNQQVJUSUFMX09SREVSfSwgb3Ige0BsaW5rICNUT1RBTF9PUkRFUn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBvcmRlcmVkKCk7CisKKyAgICAvKiogVW5vcmRlcmVkLiBTZWUge0BsaW5rICNvcmRlcmVkfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBVTk9SREVSRUQgPSAwOworICAgIC8qKiBQYXJ0aWFsbHkgb3JkZXJlZC4gU2VlIHtAbGluayAjb3JkZXJlZH0uICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgUEFSVElBTF9PUkRFUiA9IDE7CisgICAgLyoqIFRvdGFsbHkgb3JkZXJlZC4gU2VlIHtAbGluayAjb3JkZXJlZH0uICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgVE9UQUxfT1JERVIgPSAyOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBib3VuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQm91bmRlZCgpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBmaW5pdGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGaW5pdGUoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgbnVtZXJpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc051bWVyaWMoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlcmUgYXJlIHJlZ2V4IHBhdHRlcm4gZmFjZW50cworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1BhdHRlcm5GYWNldCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFBhdHRlcm5zKCk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybiBmYWNldHMuCisgICAgICogQWx3YXlzIHRydWUgaWYgdGhlcmUgYXJlIG5vIHBhdHRlcm4gZmFjZXRzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1hdGNoUGF0dGVybkZhY2V0KFN0cmluZyBzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbGlkIG9iamVjdHMgZnJvbSB0aGUKKyAgICAgKiBlbnVtZXJhdGlvbiBmYWNldCwgbnVsbCBpZiBubyBlbnVtZXJhdGlvbiBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBYbWxBbnlTaW1wbGVUeXBlW10gZ2V0RW51bWVyYXRpb25WYWx1ZXMoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyBpcyBhIHN0cmluZyBlbnVtIHdoZXJlIGFuIGludGVnZXIKKyAgICAgKiBpcyBhc3NpZ25lZCB0byBlYWNoIGVudW1lcmF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzU3RyaW5nRW51bVZhbHVlcygpOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBpcyBhIHN0cmluZyBlbnVtZXJhdGlvbiwgcmV0dXJucyB0aGUgbW9zdCBiYXNpYyBiYXNlIHNjaGVtYQorICAgICAqIHR5cGUgdGhhdCB0aGlzIGVudWVtcmF0aW9uIGlzIGJhc2VkIG9uLiBPdGhlcndpc2UgcmV0dXJucyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldEJhc2VFbnVtVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgU2NoZW1hU3RyaW5nRW51bUVudHJpZXMgZm9yIHRoaXMgdHlwZTogdGhpcworICAgICAqIGFycmF5IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBqYXZhIGNvbnN0YW50IG5hbWVzIHVzZWQgZm9yCisgICAgICogZWFjaCBzdHJpbmcgZW51bSBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hU3RyaW5nRW51bUVudHJ5W10gZ2V0U3RyaW5nRW51bUVudHJpZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBlbnVtIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW1lcmF0ZWQKKyAgICAgKiBzdHJpbmcsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhpcyB0eXBlIGlzIG5vdAorICAgICAqIGEgc3RyaW5nIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFTdHJpbmdFbnVtRW50cnkgZW51bUVudHJ5Rm9yU3RyaW5nKFN0cmluZyBzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBlbnVtIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW1lcmF0ZWQKKyAgICAgKiBzdHJpbmcsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhpcyB0eXBlIGlzIG5vdAorICAgICAqIGEgc3RyaW5nIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGVudW1Gb3JTdHJpbmcoU3RyaW5nIHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGVudW0gdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZW51bWVyYXRlZAorICAgICAqIHN0cmluZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBtYXRjaCBvciB0aGlzIHR5cGUgaXMgbm90CisgICAgICogYSBzdHJpbmcgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZW51bUZvckludChpbnQgaSk7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGZvciBhbnkgb2YgdGhlIDIwIHByaW1pdGl2ZSB0eXBlcyAocGx1cyBhbnlTaW1wbGVUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJpbWl0aXZlVHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzaW1wbGUgdHlwZSBpcyBBVE9NSUMsIFVOSU9OLCBvciBMSVNULgorICAgICAqIFJldHVybnMge0BsaW5rICNOT1RfU0lNUExFfSwge0BsaW5rICNBVE9NSUN9LCB7QGxpbmsgI1VOSU9OfSwKKyAgICAgKiBvciB7QGxpbmsgI0xJU1R9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2ltcGxlVmFyaWV0eSgpOworICAgIAorICAgIC8qKiBOb3QgYSBzaW1wbGUgdHlwZSBvciBzaW1wbGUgY29udGVudC4gU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UX1NJTVBMRSA9IDA7CisgICAgLyoqIEF0b21pYyB0eXBlLiAgU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVE9NSUMgPSAxOworICAgIC8qKiBVbmlvbiB0eXBlLiAgU2VlIHtAbGluayAjZ2V0U2ltcGxlVmFyaWV0eX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklPTiA9IDI7CisgICAgLyoqIFNpbXBsZSBsaXN0IHR5cGUuICBTZWUge0BsaW5rICNnZXRTaW1wbGVWYXJpZXR5fSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1QgPSAzOworCisKKyAgICAvKioKKyAgICAgKiBGb3IgYXRvbWljIHR5cGVzIG9ubHk6IGdldCB0aGUgcHJpbWl0aXZlIHR5cGUgdW5kZXJseWluZyB0aGlzIG9uZS4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBub3QgYW4gYXRvbWljIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNjaGVtYVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpOworCisgICAgLyoqCisgICAgICogRm9yIGF0b21pYyBudW1lcmljIHJlc3RyaWN0aW9ucyBvZiBkZWNpbWFsIG9ubHk6IHRoZQorICAgICAqIG51bWVyaWMgc2l6ZSBjYXRlZ29yeS4gVGFrZXMgaW50byBhY2NvdW50IG1pbiBhbmQgbWF4CisgICAgICogcmVzdHJpY3Rpb25zIGFzIHdlbGwgYXMgdG90YWxEaWdpdHMgYW5kIGZyYWN0aW9uRGlnaXRzCisgICAgICogZmFjZXRzLgorICAgICAqIDxwPgorICAgICAqIFJldHVybnMgZWl0aGVyIHtAbGluayAjTk9UX0RFQ0lNQUx9LAorICAgICAqIHtAbGluayAjU0laRV9CWVRFfSwge0BsaW5rICNTSVpFX1NIT1JUfSwge0BsaW5rICNTSVpFX0lOVH0sCisgICAgICoge0BsaW5rICNTSVpFX0xPTkd9LCB7QGxpbmsgI1NJWkVfQklHX0lOVEVHRVJ9LCBvcgorICAgICAqIHtAbGluayAjU0laRV9CSUdfREVDSU1BTH0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREZWNpbWFsU2l6ZSgpOworCisgICAgLyoqIE5vdCBhIGRlY2ltYWwgcmVzdHJpY3Rpb24uIFNlZSB7QGxpbmsgI2dldERlY2ltYWxTaXplfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfREVDSU1BTCA9IDA7CisgICAgLyoqIEZpdHMgaW4gYSBieXRlLiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9CWVRFID0gODsKKyAgICAvKiogRml0cyBpbiBhIHNob3J0LiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9TSE9SVCA9IDE2OworICAgIC8qKiBGaXRzIGluIGFuIGludC4gU2VlIHtAbGluayAjZ2V0RGVjaW1hbFNpemV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJWkVfSU5UID0gMzI7CisgICAgLyoqIEZpdHMgaW4gYSBsb25nLiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9MT05HID0gNjQ7CisgICAgLyoqIEZpdHMgaW4gYSB7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXJ9LiBTZWUge0BsaW5rICNnZXREZWNpbWFsU2l6ZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9CSUdfSU5URUdFUiA9IDEwMDAwMDA7IC8vICJtaWxsaW9ucyIKKyAgICAvKiogRml0cyBpbiBhIHtAbGluayBqYXZhLm1hdGguQmlnRGVjaW1hbH0uIFNlZSB7QGxpbmsgI2dldERlY2ltYWxTaXplfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0JJR19ERUNJTUFMID0gMTAwMDAwMTsgLy8gImV2ZW4gbW9yZSIKKworICAgIC8qKgorICAgICAqIEZvciB1bmlvbiB0eXBlcyBvbmx5OiBnZXQgdGhlIHNoYWxsb3cgbWVtYmVyIHR5cGVzLiBUaGlzCisgICAgICogcmV0dXJucyB0aGUgZGVjbGFyZWQgbWVtYmVyIHR5cGVzIG9mIHRoZSB1bmlvbiwgc28sIGZvcgorICAgICAqIGV4YW1wbGUgaWYgdGhlIHR5cGUgY29udGFpbnMgYW5vdGhlciB1bmlvbiwgdGhlIG5lc3RlZAorICAgICAqIG1lbWJlcnMgb2YgdGhhdCB1bmlvbiBhcmUgTk9UIHJldHVybmVkIGhlcmUuCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZVtdIGdldFVuaW9uTWVtYmVyVHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIEZvciB1bmlvbiB0eXBlcyBvbmx5OiBnZXRzIHRoZSBmdWxsIHRyZWUgb2YgbWVtYmVyIHR5cGVzLgorICAgICAqIFRoaXMgY29tcHV0ZXMgdGhlIGNsb3N1cmUgb2YgdGhlIHNldCByZXR1cm5lZCBieQorICAgICAqIGdldFVuaW9uTWVtYmVyVHlwZXMoKSwgc28sIGZvciBleGFtcGxlLCBpdCByZXR1cm5zCisgICAgICogYWxsIHRoZSB0eXBlcyBuZXN0ZWQgd2l0aGluIHVuaW9ucyBvZiB1bmlvbnMgYXMgd2VsbAorICAgICAqIGFzIHRoZSB0b3AtbGV2ZWwgbWVtYmVyczsgdGhlIHNldCBhbHNvIGluY2x1ZGVzIHRoZQorICAgICAqIHR5cGUgaXRzZWxmLiBJZiB5b3UgYXJlIHNlZWtpbmcgb25seSB0aGUgYmFzaWMKKyAgICAgKiBub24tdW5pb24gY29uc2l0dWVudHMsIHVzZSBnZXRVbmlvbkNvbnN0aXR1ZW50VHlwZXMuCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBudWxsIGlmIHRoaXMgdHlwZSBpcyBub3QgYSB1bmlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZVtdIGdldFVuaW9uU3ViVHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIEZvciB1bmlvbiB0eXBlcyBvbmx5OiBnZXQgdGhlIGNvbnN0aXR1ZW50IG1lbWJlciB0eXBlcy4gVGhpcworICAgICAqIHJldHVybnMgb25seSBub24tdW5pb24gdHlwZXMsIHNvLCBmb3IgZXhhbXBsZSwgZm9yIHVuaW9ucyBvZgorICAgICAqIHVuaW9ucywgdGhpcyByZXR1cm5zIHRoZSBmbGF0dGVuZWQgbGlzdCBvZiBpbmRpdmlkdWFsIG1lbWJlcgorICAgICAqIHR5cGVzIHdpdGhpbiB0aGUgaW5uZXJtb3N0IHVuaW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyB0eXBlIGlzIG5vdCBhIHVuaW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlW10gZ2V0VW5pb25Db25zdGl0dWVudFR5cGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgdW5pb24gdHlwZXMgb25seTogZ2V0IHRoZSBtb3N0IHNwZWNpZmljIGNvbW1vbiBiYXNlCisgICAgICogdHlwZSBvZiB0aGUgY29uc3RpdHVlbnQgbWVtYmVyIHR5cGVzLiBNYXkgcmV0dXJuIGEgVVIgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyB0eXBlIGlzIG5vdCBhIHVuaW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTY2hlbWFUeXBlIGdldFVuaW9uQ29tbW9uQmFzZVR5cGUoKTsKKworICAgIC8qKgorICAgICAqIEZvciBhbm9ueW1vdXMgdHlwZXMgZGVmaW5lZCBpbnNpZGUgYSB1bmlvbiBvbmx5OiBnZXRzCisgICAgICogdGhlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgZGVjbGFyYXRpb24gb3JkZXIgb2YgdGhpcworICAgICAqIHR5cGUgd2l0aGluIHRoZSBvdXRlciB1bmlvbiB0eXBlLCBvciB6ZXJvIGlmIHRoaXMgaXMKKyAgICAgKiBub3QgYXBwbGljYWJsZS4gVGhlIGZpcnN0IGFub255bW91cyB1bmlvbiBtZW1iZXIgd2l0aGluCisgICAgICogYSB1bmlvbiB0eXBlIGlzIG51bWJlcmVkICIxIi4gVXNlZCB0byBkaWZmZXJlbnRpYXRlCisgICAgICogYmV0d2VlbiBkaWZmZXJlbnQgYW5vbnltb3VzIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QW5vbnltb3VzVW5pb25NZW1iZXJPcmRpbmFsKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3IgbGlzdCB0eXBlcyBvbmx5OiBnZXQgdGhlIGl0ZW0gdHlwZS4gVGhpcyBpcyB0aGUgYXRvbWljCisgICAgICogb3IgdW5pb24gdHlwZSB0aGF0IGlzIHRoZSB0eXBlIG9mIGV2ZXJ5IGVudHJ5IGluIHRoZSBsaXN0LgorICAgICAqIDxwPgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGlzIHR5cGUgaXMgbm90IGEgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU2NoZW1hVHlwZSBnZXRMaXN0SXRlbVR5cGUoKTsKKworICAgIC8qKgorICAgICAqIEZvciBub251bmlvbiBzaW1wbGUgdHlwZXM6IGdldCB0aGUgd2hpdGVzcGFjZSBydWxlLiBUaGlzIGlzCisgICAgICogZWl0aGVyIHtAbGluayAjV1NfUFJFU0VSVkV9LCB7QGxpbmsgI1dTX1JFUExBQ0V9LCBvcgorICAgICAqIHtAbGluayAjV1NfQ09MTEFQU0V9LiBSZXR1cm5zIHtAbGluayAjV1NfVU5TUEVDSUZJRUR9CisgICAgICogZm9yIHVuaW9ucyBhbmQgY29tcGxleCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFdoaXRlU3BhY2VSdWxlKCk7CisKKyAgICAvKiogV2hpdGVzcGFjZSBydWxlIHVuc3BlY2lmaWVkLiAgU2VlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1VOU1BFQ0lGSUVEID0gMDsKKyAgICAvKiogV2hpdGVzcGFjZSBwcmVzZXJ2ZWQuICBTZWUge0BsaW5rICNnZXRXaGl0ZVNwYWNlUnVsZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NfUFJFU0VSVkUgPSAxOworICAgIC8qKiBXaGl0ZXNwYWNlIHJlcGxhY2VkIGJ5IG9yZGluYXJ5IHNwYWNlLiAgU2VlIHtAbGluayAjZ2V0V2hpdGVTcGFjZVJ1bGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTX1JFUExBQ0UgPSAyOworICAgIC8qKiBXaGl0ZXNwYWNlIGNvbGxhcHNlZCBhbmQgdHJpbW1lZC4gIFNlZSB7QGxpbmsgI2dldFdoaXRlU3BhY2VSdWxlfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19DT0xMQVBTRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGltbXV0YWJsZSBzaW1wbGUgdHlwZSB2YWx1ZSB0aGF0IGRvZXMgbm90IHJlc2lkZSBpbiBhIHRyZWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFhtbEFueVNpbXBsZVR5cGUgbmV3VmFsdWUoT2JqZWN0IHYpOworICAgIAorCisgICAgLyoqCisgICAgICogVXNlZCB0byBhbGxvdyBvbi1kZW1hbmQgbG9hZGluZyBvZiB0eXBlcy4KKyAgICAgKiAKKyAgICAgKiBAZXhjbHVkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgU2NoZW1hQ29tcG9uZW50LlJlZgorICAgIHsKKyAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlIHR5cGUpCisgICAgICAgICAgICB7IHN1cGVyKHR5cGUpOyB9CisKKyAgICAgICAgcHVibGljIFJlZihTY2hlbWFUeXBlU3lzdGVtIHN5c3RlbSwgU3RyaW5nIGhhbmRsZSkKKyAgICAgICAgICAgIHsgc3VwZXIoc3lzdGVtLCBoYW5kbGUpOyB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb21wb25lbnRUeXBlKCkKKyAgICAgICAgICAgIHsgcmV0dXJuIFNjaGVtYUNvbXBvbmVudC5UWVBFOyB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFNjaGVtYVR5cGUgZ2V0KCkKKyAgICAgICAgICAgIHsgcmV0dXJuIChTY2hlbWFUeXBlKWdldENvbXBvbmVudCgpOyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cnVucyBhIFNjaGVtYVR5cGUuUmVmIHBvaW50aW5nIHRvIHRoaXMgc2NoZW1hIHR5cGUgaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBSZWYgZ2V0UmVmKCk7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTkzNDcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUVsZW1lbnRTZXF1ZW5jZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcHJvZ3JhbWF0aWNhbGx5IHZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiBhbgorICogWE1MIGVsZW1lbnQuQ2FsbCB0byBib3RoIHtAbGluayAjbmV4dH0gYW5kIHtAbGluayAjcGVla30KKyAqIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQKKyAqIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgaXMgYWxsb3dlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZWxlbWVudAorICogY29udGVudCwgdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCB7QGxpbmsgI25leHR9IHdpbGwgYWR2YW5jZQorICogdGhlIGN1cnJlbnQgcG9zaXRpb24sIHdoaWxlIHtAbGluayAjcGVla30gd29uJ3QuCisgKgorICogQHNlZSBTY2hlbWFUeXBlI2dldEVsZW1lbnRTZXF1ZW5jZXIKKyAqLworcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlRWxlbWVudFNlcXVlbmNlcgoreworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGF0IHRoZQorICAgICAqIGN1cnJlbnQgcG9zaXRpb24uIEFkdmFuY2VzIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqLworICAgIGJvb2xlYW4gbmV4dChRTmFtZSBlbGVtZW50TmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGF0IHRoZQorICAgICAqIGN1cnJlbnQgcG9zaXRpb24uIERvZXMgbm90IGFkdmFuY2UgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICovCisgICAgYm9vbGVhbiBwZWVrKFFOYW1lIGVsZW1lbnROYW1lKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlTG9hZGVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2VlNTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2VhcmNoYWJsZSBzZXQgb2YgWE1MIFNjaGVtYSBjb21wb25lbnQgZGVmaW5pdGlvbnMuCisgKiA8cD4KKyAqIFNjaGVtYVR5cGVMb2FkZXIgaXMgc29tZXdoYXQgYW5hbG9nb3VzIHRvIHtAbGluayBqYXZhLmxhbmcuQ2xhc3NMb2FkZXJ9LAorICogYmVjYXVzZSBpdCBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyB7QGxpbmsgU2NoZW1hQ29tcG9uZW50fSBkZWZpbml0aW9ucworICogYnkgbmFtZSwgeWV0IGl0IGlzIG5vdCByZXNwb25zaWJsZSBmb3IgYmVpbmcgYWJsZSB0byBlbnVtZXJhdGUgYWxsIHRoZQorICogY29tcG9uZW50IGRlZmluaXRvbnMgYXZhaWxhYmxlLiAoSWYgeW91IHdpc2ggdG8gZW51bWVyYXRlIGNvbXBvbmVudAorICogZGVmaW5pdGlvbnMsIHNlZSB7QGxpbmsgU2NoZW1hVHlwZVN5c3RlbX0uKSBUaGVyZSBhcmUgc29tZSB3YXlzIGluIHdoaWNoCisgKiBTY2hlbWFUeXBlU3lzdGVtcyBhcmUgZGlzc2ltaWxhciBmcm9tIENsYXNzTG9hZGVycywgaG93ZXZlci4KKyAqIFNpbmNlIFhNTCBTY2hlbWEgaGFzIGEgbnVtYmVyIG9mIGluc3RhbmNlLW9yaWVudGVkIHR5cGluZyBtZWNoYW5pc21zCisgKiAoc3VjaCBhcyB3aWxkY2FyZHMpIHRoYXQgZG8gbm90IGV4aXN0IGluIEphdmEsIGEgU2NoZW1hVHlwZUxvYWRlciBpcworICogbm90IGFzc29jaWF0ZWQgd2l0aCBhIHR5cGU7IGluc3RlYWQsIGEgU2NoZW1hVHlwZUxvYWRlciBpcyBhc3NvY2lhdGVkCisgKiB3aXRoIGVhY2ggWE1MIGluc3RhbmNlLgorICogPHA+CisgKiBFdmVyeSBYTUwgaW5zdGFuY2UgaXMgbG9hZGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIFNjaGVtYVR5cGVMb2FkZXI7CisgKiB0aGUgU2NoZW1hVHlwZUxvYWRlciBmb3IgYW4gaW5zdGFuY2UgaXMgdXNlZCB0byByZXNvbHZlIGFsbCB0eXBlIGRlZmluaXRpb25zCisgKiB3aXRoaW4gdGhlIGluc3RhbmNlIGFuZCBmb3IgYXBwbHlpbmcgdHlwZS1zZW5zaXRpdmUgbWV0aG9kcyBzdWNoIGFzCisgKiB7QGxpbmsgWG1sT2JqZWN0I3ZhbGlkYXRlfS4KKyAqIDxwPgorICogTm9ybWFsbHkgdGhlIFNjaGVtYVR5cGVMb2FkZXIgYmVpbmcgdXNlZCBmb3IgYWxsIGluc3RhbmNlcyBpcyB0aGUKKyAqIGNvbnRleHQgdHlwZSBsb2FkZXIgKHRoYXQgaXMsIHRoZSBTY2hlbWFUeXBlTG9hZGVyIHJldHVybmVkIGZyb20KKyAqIHtAbGluayBYbWxCZWFucyNnZXRDb250ZXh0VHlwZUxvYWRlcigpfSkuICBUaGUgY29udGV4dCB0eXBlIGxvYWRlcgorICogY29uc3VsdHMgdGhlIHRocmVhZCdzIGNvbnRleHQgQ2xhc3NMb2FkZXIgKHNlZSB7QGxpbmsgVGhyZWFkI2dldENvbnRleHRDbGFzc0xvYWRlcigpfSkKKyAqIHRvIGZpbmQgc2NoZW1hIHR5cGUgZGVmaW50aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KKyAqIFRoZSBuZXQgcmVzdWx0IGlzIHRoYXQgeW91IGNhbiB1c2Ugc2NoZW1hIHR5cGVzIHNpbXBseSBieSBwdXR0aW5nCisgKiB0aGVpciBjb21waWxlZCBzY2hlbWEgSkFScyBvbiB5b3VyIGNsYXNzcGF0aC4KKyAqIElmIHlvdSB3aXNoIHRvIGxvYWQgaW5zdGFuY2VzIHVzaW5nIGEgZGlmZmVyZW50IFNjaGVtYVR5cGVMb2FkZXIsIHRoZW4geW91IG11c3QKKyAqIGNhbGwge0BsaW5rICNwYXJzZX0gbWV0aG9kcyBvbiB0aGUgU2NoZW1hVHlwZUxvYWRlciBpbnN0YW5jZSBleHBsaWNpdGx5CisgKiByYXRoZXIgdGhhbiB1c2luZyB0aGUgbm9ybWFsIGNvbnZlbmllbnQgRmFjdG9yeSBtZXRob2RzLgorICogPHA+CisgKiBBIFNjaGVtYVR5cGVMb2FkZXIgY2FuIGJlIG9idGFpbmVkIGJ5IGR5bmFtaWNhbGx5IGxvYWRpbmcgWFNEIGZpbGVzCisgKiB1c2luZyB7QGxpbmsgWG1sQmVhbnMjbG9hZFhzZH0sIG9yIGJ5IGFzc2VtYmxpbmcgb3RoZXIgU2NoZW1hVHlwZUxvYWRlcnMKKyAqIG9yIFNjaGVtYVR5cGVTeXN0ZW1zIG9uIGEgcGF0aCB1c2luZyB7QGxpbmsgWG1sQmVhbnMjdHlwZUxvYWRlclVuaW9ufS4KKyAqIAorICogQHNlZSBYbWxCZWFucyNsb2FkWHNkCisgKiBAc2VlIFhtbEJlYW5zI2dldENvbnRleHRUeXBlTG9hZGVyCisgKiBAc2VlIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbgorICogQHNlZSBTY2hlbWFUeXBlU3lzdGVtCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFNjaGVtYVR5cGVMb2FkZXIKK3sKKyAgICAvKiogUmV0dXJucyB0aGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCisgICAgcHVibGljIFNjaGVtYVR5cGUgZmluZFR5cGUoUU5hbWUgbmFtZSk7CisKKyAgICAvKiogUmV0dXJucyB0aGUgZG9jdW1lbnQgdHlwZSByb290ZWQgYXQgdGhlIGdpdmVuIGVsZW1lbnQgbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLworICAgIHB1YmxpYyBTY2hlbWFUeXBlIGZpbmREb2N1bWVudFR5cGUoUU5hbWUgbmFtZSk7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB0eXBlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGF0dHJpYnV0ZSBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCisgICAgcHVibGljIFNjaGVtYVR5cGUgZmluZEF0dHJpYnV0ZVR5cGUoUU5hbWUgbmFtZSk7CisKKyAgICAvKiogUmV0dXJucyB0aGUgZ2xvYmFsIGVsZW1lbnQgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsRWxlbWVudCBmaW5kRWxlbWVudChRTmFtZSBuYW1lKTsKKworICAgIC8qKiBSZXR1cm5zIHRoZSBnbG9iYWwgYXR0cmlidXRlIGRlZmludGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsIGlmIG5vbmUuICovCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEF0dHJpYnV0ZSBmaW5kQXR0cmlidXRlKFFOYW1lIG5hbWUpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoZSBtb2RlbCBncm91cCBkZWZpbnRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBub25lLiAqLworICAgIHB1YmxpYyBTY2hlbWFNb2RlbEdyb3VwIGZpbmRNb2RlbEdyb3VwKFFOYW1lIG5hbWUpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW50aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4gKi8KKyAgICBwdWJsaWMgU2NoZW1hQXR0cmlidXRlR3JvdXAgZmluZEF0dHJpYnV0ZUdyb3VwKFFOYW1lIG5hbWUpOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGVsb2FkZXIgY29udGFpbnMgYW55IGRlZmluaXRpb25zIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VEZWZpbmVkKFN0cmluZyBuYW1lc3BhY2UpOworCisgICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLworICAgIHB1YmxpYyBTY2hlbWFUeXBlLlJlZiBmaW5kVHlwZVJlZihRTmFtZSBuYW1lKTsKKworICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZS5SZWYgZmluZERvY3VtZW50VHlwZVJlZihRTmFtZSBuYW1lKTsKKyAgICAKKyAgICAvKiogVXNlZCBmb3Igb24tZGVtYW5kIGxvYWRpbmcuICovCisgICAgcHVibGljIFNjaGVtYVR5cGUuUmVmIGZpbmRBdHRyaWJ1dGVUeXBlUmVmKFFOYW1lIG5hbWUpOworCisgICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLworICAgIHB1YmxpYyBTY2hlbWFHbG9iYWxFbGVtZW50LlJlZiBmaW5kRWxlbWVudFJlZihRTmFtZSBuYW1lKTsKKworICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlLlJlZiBmaW5kQXR0cmlidXRlUmVmKFFOYW1lIG5hbWUpOworICAgIAorICAgIC8qKiBVc2VkIGZvciBvbi1kZW1hbmQgbG9hZGluZy4gKi8KKyAgICBwdWJsaWMgU2NoZW1hTW9kZWxHcm91cC5SZWYgZmluZE1vZGVsR3JvdXBSZWYoUU5hbWUgbmFtZSk7CisgICAgCisgICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cC5SZWYgZmluZEF0dHJpYnV0ZUdyb3VwUmVmKFFOYW1lIG5hbWUpOworCisgICAgLyoqIFVzZWQgZm9yIG9uLWRlbWFuZCBsb2FkaW5nLiAqLworICAgIHB1YmxpYyBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnQuUmVmIGZpbmRJZGVudGl0eUNvbnN0cmFpbnRSZWYoUU5hbWUgbmFtZSk7CisKKyAgICAvKiogRmluZHMgYSB0eXBlIGZvciBhIGdpdmVuIHNpZ25hdHVyZSBzdHJpbmcgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9yU2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpOworCisgICAgLyoqIEZpbmRzIGEgdHlwZSBmb3IgYSBnaXZlbiBmdWxseS1xdWFsaWZpZWQgWE1MIEJlYW4gY2xhc3NuYW1lICovCisgICAgcHVibGljIFNjaGVtYVR5cGUgdHlwZUZvckNsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKTsKKworICAgIC8qKiBMb2FkcyBvcmlnaW5hbCBYU0Qgc291cmNlIGFzIGEgc3RyZWFtLiAgU2VlIHtAbGluayBTY2hlbWFUeXBlI2dldFNvdXJjZU5hbWV9LiAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTb3VyY2VBc1N0cmVhbShTdHJpbmcgc291cmNlTmFtZSk7CisgICAgCisgICAgLyoqIENvbXBpbGVzIGFuIFhQYXRoICovCisgICAgcHVibGljIFN0cmluZyBjb21waWxlUGF0aChTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKKworICAgIC8qKiBDb21waWxlcyBhbiBYUXVlcnkgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVRdWVyeShTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb247CisKKyAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gKi8KKyAgICBwdWJsaWMgWG1sT2JqZWN0IG5ld0luc3RhbmNlICggU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTdHJpbmcgeG1sVGV4dCwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uOworICAgIC8qKiBQYXJzZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCisgICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIEZpbGUgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBVUkwgZmlsZSwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBJbnB1dFN0cmVhbSBqaW9pcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBSZWFkZXIgamlvciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLiAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKKyAgICAvKiogUGFyc2VzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MworICAgICAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uOworICAgIC8qKiBSZXR1cm5zIGFuIFhtbFNheEhhbmRsZXIgdGhhdCBjYW4gcGFyc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUuICovCisgICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICk7CisgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtIHRoYXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIFhNTCBpcyBub3QgdmFsaWQgCisgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCisgICAgICovCisgICAgcHVibGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I2ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVMb2FkZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBpZiB0aGVyZSBpcyBjb3JydXB0aW9uIG9yIGEgdmVyc2lvbiBtaXNtYXRjaAorICogaW4gYSBjb21waWxlZCBzY2hlbWEgdHlwZSBzeXN0ZW0uCisgKi8gCitwdWJsaWMgY2xhc3MgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbiBleHRlbmRzIFhtbFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIGludCBfY29kZTsKKyAgICAKKyAgICAvKiogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSwgZmlsZW5hbWUsIGV4dGVuc2lvbiwgYW5kIGNvZGUgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBoYW5kbGUsIGludCBjb2RlKQorICAgIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSArICIgKCIgKyBuYW1lICsgIi4iICsgaGFuZGxlICsgIikgLSBjb2RlICIgKyBjb2RlKTsKKyAgICAgICAgX2NvZGUgPSBjb2RlOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLCBmaWxlbmFtZSwgZXh0ZW5zaW9uLCBjb2RlLCBhbmQgY2F1c2UgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBoYW5kbGUsIGludCBjb2RlLCBFeGNlcHRpb24gY2F1c2UpCisgICAgeworICAgICAgICBzdXBlcihtZXNzYWdlICsgIiAoIiArIG5hbWUgKyAiLiIgKyBoYW5kbGUgKyAiKSAtIGNvZGUgIiArIGNvZGUpOworICAgICAgICBfY29kZSA9IGNvZGU7CisgICAgICAgIGluaXRDYXVzZShjYXVzZSk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUsIGdpdmVuIGJ5IG9uZSBvZiB0aGUgbnVtZXJpYyBjb25zdGFudHMgaW4gdGhpcyBjbGFzcyAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gX2NvZGU7CisgICAgfQorCisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUkVTT1VSQ0UgPSAwOworICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX01BR0lDX0NPT0tJRSA9IDE7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfTUFKT1JfVkVSU0lPTiA9IDI7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfTUlOT1JfVkVSU0lPTiA9IDM7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JPTkdfRklMRV9UWVBFID0gNDsKKyAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlJFQ09HTklaRURfSU5ERVhfRU5UUlkgPSA1OworICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdST05HX1BST1BFUlRZX1RZUEUgPSA2OworICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BTEZPUk1FRF9DT05URU5UX01PREVMID0gNzsKKyAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19TSU1QTEVfVkFSSUVUWSA9IDg7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU9fRVhDRVBUSU9OID0gOTsKKyAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfVE9PX0xBUkdFID0gMTA7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1BBUlRJQ0xFX1RZUEUgPSAxMTsKKyAgICAvKiBTZWUge0BsaW5rICNnZXRDb2RlfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfV1JJVEVBQkxFID0gMTI7CisgICAgLyogU2VlIHtAbGluayAjZ2V0Q29kZX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX0hBTkRMRSA9IDEzOworICAgIC8qIFNlZSB7QGxpbmsgI2dldENvZGV9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FU1RFRF9FWENFUFRJT04gPSAxNDsKK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NjaGVtYVR5cGVTeXN0ZW0uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyN2I5NQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TY2hlbWFUeXBlU3lzdGVtLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBmaW5pdGUgc2V0IG9mIFhNTCBTY2hlbWEgY29tcG9uZW50IGRlZmluaXRpb25zLgorICogPHA+CisgKiBFdmVyeSB7QGxpbmsgU2NoZW1hQ29tcG9uZW50fSBzdWNoIGFzIGEge0BsaW5rIFNjaGVtYVR5cGV9LAorICoge0BsaW5rIFNjaGVtYUdsb2JhbEVsZW1lbnR9LCB7QGxpbmsgU2NoZW1hR2xvYmFsQXR0cmlidXRlfSwKKyAqIHtAbGluayBTY2hlbWFNb2RlbEdyb3VwfSwge0BsaW5rIFNjaGVtYUF0dHJpYnV0ZUdyb3VwfSwgb3IKKyAqIHtAbGluayBTY2hlbWFJZGVudGl0eUNvbnN0cmFpbnR9LCBpcyBkZWZpbmVkIGluIGV4YWN0bHkgb25lCisgKiBTY2hlbWFUeXBlU3lzdGVtLiAgKFNlZSB7QGxpbmsgU2NoZW1hQ29tcG9uZW50I2dldFR5cGVTeXN0ZW0oKX0uKQorICogQSBzaW5nbGUgU2NoZW1hVHlwZVN5c3RlbSBjYW4gaW5jbHVkZSBkZWZpbml0aW9ucworICogZnJvbSBhbnkgbnVtYmVyIG9mIG5hbWVzcGFjZXM7IG9uZSBTY2hlbWFUeXBlU3lzdGVtIGNvbnNpc3RzIHNpbXBseQorICogb2YgYSBzZXQgb2YgY29tcG9uZW50IGRlZmluaXRpb25zIHRoYXQgd2VyZSBjb21waWxlZCB0b2dldGhlci4KKyAqIDxwPgorICogU2luY2UgZXZlcnkgY29tcG9uZW50IGlzIGRlZmluZWQgaW4gYSBzaW5nbGUgU2NoZW1hVHlwZVN5c3RlbSwgbm8KKyAqIFNjaGVtYVR5cGVTeXN0ZW0gb3RoZXIgdGhhbiB7QGxpbmsgWG1sQmVhbnMjZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKX0KKyAqIGluY2x1ZGVzIGFueSBvZiB0aGUgdGhlIGJ1aWx0LWluIHR5cGVzLiAgVGhhdCBtZWFucworICogeW91IGNhbm5vdCBvcmRpbmFyaWx5IGxvYWQgaW5zdGFuY2VzIHVzaW5nIGEgc2luZ2xlCisgKiBTY2hlbWFUeXBlU3lzdGVtIGJ5IGl0c2VsZi4gSW5zdGVhZCwgeW91IHdpbGwgd2FudCB0byBjb21iaW5lIGEgcGF0aCBvZgorICogU2NoZW1hVHlwZVN5c3RlbXMgdG9nZXRoZXIgdXNpbmcge0BsaW5rIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbn0KKyAqIHRvIGZvcm0gYSBTY2hlbWFUeXBlTG9hZGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvYWRpbmcgaW5zdGFuY2VzLgorICogPHA+CisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGNvbXBpbGVzIHRoZSBzY2hlbWEgaW4gbXlYU0RGaWxlCisgKiBpbiB0aGUgcHJlc2VuY2Ugb2Ygb25seSB0aGUgbWluaW1hbCBidWlsdGluIHR5cGUgc3lzdGVtLgorICogVGhlIHJlc3VsdGluZyBTY2hlbWFUeXBlU3lzdGVtIDxjb2RlPnN0czwvY29kZT4gY29udGFpbnMgb25seSB0aGUgZGVmaW5pdGlvbnMKKyAqIGZyb20gbXlYU0QgZmlsZS4gIEluIG9yZGVyIHRvIGxvYWQgYW5kIHZhbGlkYXRlIGFuIGluc3RhbmNlIHdpdGhpbgorICogdGhlIGNvbnRleHQgb2YgdGhvc2UgdHlwZXMsIHdlIG11c3QgbmV4dCBjb25zdHJ1Y3QgYQorICoge0BsaW5rIFNjaGVtYVR5cGVMb2FkZXJ9IDxjb2RlPnN0bDwvY29kZT4gdGhhdCBjb250YWlucyBib3RoCisgKiB0aGUgYnVpbHRpbiB0eXBlIHN5c3RlbSBhbmQgdGhlIHR5cGVzIGRlZmluZWQgd2l0aGluIHRoZSBteVhTRCBmaWxlLgorICogPHByZT4KKyAqIFNjaGVtYVR5cGVTeXN0ZW0gc3RzID0gWG1sQmVhbnMuY29tcGlsZVhzZChuZXcgWG1sT2JqZWN0W10KKyAqICAgIHsgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UobXlYU0RGaWxlKSB9LAorICogICAgWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKSwKKyAqICAgIG51bGwpOworICogU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBYbWxCZWFucy50eXBlTG9hZGVyVW5pb24obmV3IFNjaGVtYVR5cGVMb2FkZXJbXQorICogICAgeyBzdHMsIFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkgfSk7CisgKiBYbWxPYmplY3QgbXlkb2MgPSBzdGwucGFyc2UoaW5zdGFuY2VGaWxlLCBudWxsLCBudWxsKTsKKyAqIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgdmFsaWQ6ICIgKyBteWRvYy52YWxpZGF0ZSgpKTsKKyAqIDwvcHJlPgorICogPHA+CisgKiBBcyB5b3UgY2FuIHNlZSwgZm9yIHdvcmtpbmcgd2l0aCBpbnN0YW5jZXMsIHlvdSB0eXBpY2FsbHkgd2FudCB0bworICogd29yayB3aXRoIGEgU2NoZW1hVHlwZUxvYWRlciBjb25zdHJ1Y3RlZCBmcm9tIGEgcGF0aCByYXRoZXIgdGhhbgorICogYSBzb2xpdGFyeSBTY2hlbWFUeXBlU3lzdGVtLiAgU2VlIHtAbGluayBYbWxCZWFucyNsb2FkWHNkfSBmb3IKKyAqIGEgY29udmVuaWVudCBhbHRlcm5hdGl2ZSB0byB7QGxpbmsgWG1sQmVhbnMjY29tcGlsZVhzZH0uCisgKiA8cD4KKyAqIEEgU2NoZW1hVHlwZVN5c3RlbSBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBlbnVtZXJhdGUgdGhlIGV4YWN0IHNldAorICogb2YgY29tcG9uZW50IGRlZmluaXRpb25zIGRlcml2ZWQgZnJvbSBhIHNldCBvZiBYU0QgZmlsZXMsIGZvciBleGFtcGxlLAorICogd2hlbiB5b3UgYXJlIGFuYWx5emluZyB0aGUgY29udGVudHMgb2YgdGhlIFhTRCBmaWxlcyB0aGVtc2VsdmVzLgorICogSGVyZSBpcyBob3cgdG8gdXNlIGEgU2NoZW1hVHlwZVN5c3RlbSB0byBpbnNwZWN0IGEgc2V0IG9mIHNjaGVtYQorICogZGVmaW5pdGlvbnM6CisgKiA8b2w+CisgKiA8bGk+Rmlyc3QsIHVzZSB7QGxpbmsgWG1sQmVhbnMjY29tcGlsZVhzZH0gdG8gY29tcGlsZSBhbnkgbnVtYmVyCisgKiAgICAgb2Ygc2NoZW1hIGZpbGVzLiAgSWYgdGhlIHNjaGVtYSBmaWxlcyBhcmUgdmFsaWQsIHJlc3VsdCB3aWxsCisgKiAgICAgYmUgYSBTY2hlbWFUeXBlU3lzdGVtIHRoYXQgY29udGFpbnMgYWxsIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbnMKKyAqICAgICBmcm9tIHRob3NlIGZpbGVzLiAgSXQgd2lsbCBjb250YWluIG5vIG90aGVyIGNvbXBvbmVudCBkZWZpbml0aW9ucy4KKyAqIDxsaT5BbHRlcm5hdGl2ZWx5LCBjYWxsIHtAbGluayBTY2hlbWFDb21wb25lbnQjZ2V0VHlwZVN5c3RlbX0gb24KKyAqICAgICBhIHByZWNvbXBpbGVkIHNjaGVtYSBjb21wb25lbnQgdG8gZGlzY292ZXIgdGhlIFNjaGVtYVR5cGVTeXN0ZW0KKyAqICAgICB3aXRoaW4gd2hpY2ggdGhhdCBjb21wb25lbnQgd2FzIG9yaWdpbmFsbHkgY29tcGlsZWQuCisgKiA8bGk+T25jZSB5b3UgaGF2ZSBhIFNjaGVtYVR5cGVTeXN0ZW0sIGNhbGw6CisgKiAgIDx1bD4KKyAqICAgPGxpPiB7QGxpbmsgI2dsb2JhbFR5cGVzKCl9IGZvciBhbGwgdGhlIGdsb2JhbCB0eXBlIGRlZmluaXRpb25zLgorICogICA8bGk+IHtAbGluayAjZ2xvYmFsRWxlbWVudHMoKX0gZm9yIGFsbCB0aGUgZ2xvYmFsIGVsZW1lbnQgZGVmaW5pdGlvbnMuCisgKiAgIDxsaT4ge0BsaW5rICNnbG9iYWxBdHRyaWJ1dGVzKCl9IGZvciBhbGwgdGhlIGdsb2JhbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuCisgKiAgIDxsaT4ge0BsaW5rICNtb2RlbEdyb3VwcygpfSBmb3IgYWxsIHRoZSBuYW1lZCBtb2RlbCBncm91cCBkZWZpbml0aW9ucy4KKyAqICAgPGxpPiB7QGxpbmsgI2F0dHJpYnV0ZUdyb3VwcygpfSBmb3IgYWxsIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbnMuCisgKiAgIDwvdWw+CisgKiA8bGk+SW4gYWRkaXRpb24sIHRoZXJlIGFyZSBzcGVjaWFsIHR5cGVzIGdlbmVyYXRlZCBmb3IgWE1MIEJlYW5zIHRoYXJlCisgKiAgICAgYXJlIG5vdCBmb3JtYWxseSBwYXJ0IG9mIHRoZSBTY2hlbWEgc3BlY2lmaWNhdGlvbjoKKyAqICAgPHVsPgorICogICA8bGk+IHtAbGluayAjZG9jdW1lbnRUeXBlcygpfSByZXR1cm5zIGFsbCB0aGUgZG9jdW1lbnQgdHlwZXMuCisgKiAgIDxsaT4ge0BsaW5rICNhdHRyaWJ1dGVUeXBlcygpfSByZXR1cm5zIGFsbCB0aGUgYXR0cmlidXRlIHR5cGVzLgorICogICA8L3VsPgorICogPC9vbD4KKyAqIAorICogPHA+CisgKiBBIGRvY3VtZW50IHR5cGUgaXMgYSB0eXBlIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgZ2xvYmFsIGVsZW1lbnQ7IHRoZXJlCisgKiBpcyBvbmUgZG9jdW1lbnQgdHlwZSBmb3IgZWFjaCBnbG9iYWwgZWxlbWVudCBkZWZpbml0aW9uIGluIGEKKyAqIFNjaGVtYVR5cGVTeXN0ZW0uICBJbiBhbiBpbnN0YW5jZSBkb2N1bWVudCwgb25seSB0aGUgcm9vdCBYbWxPYmplY3QKKyAqIGNhbiBoYXZlIGEgZG9jdW1lbnQgdHlwZSBhcyBpdHMgdHlwZS4KKyAqIDxwPgorICogU2ltaWxhcmx5LCBhbiBhdHRyaWJ1dGUgdHlwZSBpcyBhIHR5cGUgdGhhdCBjb250YWlucyBhIHNpbmdsZSBnbG9iYWwKKyAqIGF0dHJpYnV0ZSwgYW5kIHRoZXJlIGlzIG9uZSBhdHRyaWJ1dGUgdHlwZSBmb3IgZWFjaCBnbG9iYWwgYXR0cmlidXRlCisgKiBkZWZpbml0aW9uIGluIGEgU2NoZW1hVHlwZVN5c3RlbS4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSByb290CisgKiBYbWxPYmplY3QgcmVwcmVzZW50aW5nIGEgZnJhZ21lbnQgd2hvc2UgdHlwZSBpcyBhbiBhdHRyaWJ1dGUgdHlwZSwKKyAqIGJ1dCBhdHRyaWJ1dGUgdHlwZXMgYXJlIHByZXNlbnQgbWFpbmx5IGZvciBzeW1tZXRyeSBhbmQgdG8gc2ltcGxpZnkKKyAqIGNvZGUgc3VjaCBhcyB0aGUgdHlwZS10cmVlLXdhbGtpbmcgY29kZSBiZWxvdy4KKyAqIDxwPgorICogVGhlIGdsb2JhbCBjb21wb25lbnQgbWV0aG9kcyBhYm92ZSBvbmx5IHByb3ZpZGUgYSB2aWV3IG9mIHRoZSB0b3AtbGV2ZWwKKyAqIGNvbXBvbmVudHMgb2YgYSBTY2hlbWFUeXBlU3lzdGVtIGFuZCBkbyBub3QgaW5jbHVkZSBhbnkgbmVzdGVkCisgKiBkZWZpbml0aW9ucy4gIFRvIHZpZXcgYWxsIHRoZSBuZXN0ZWQgZGVmaW5pdGlvbnMsIHlvdSB3aWxsIHdhbnQgdG8KKyAqIHRyYXZlcnNlIHRoZSBlbnRpcmUgdHJlZSBvZiB7QGxpbmsgU2NoZW1hVHlwZX0gZGVmaW50aW9ucyB3aXRoaW4gYQorICogU2NoZW1hVHlwZVN5c3RlbSBieSBleGFtaW5pbmcgdGhlIHtAbGluayBTY2hlbWFUeXBlI2dldEFub255bW91c1R5cGVzKCl9CisgKiB3aXRoaW4gZWFjaCB7QGxpbmsgU2NoZW1hVHlwZX0gcmVjdXJzaXZlbHkuCisgKiA8cD5UaGUgZm9sbG93aW5nIGNvZGUgaXMgYSBzdGFuZGFyZCB0cmVld2FsayB0aGF0IHZpc2l0cyBldmVyeQorICoge0BsaW5rIFNjaGVtYVR5cGV9IGluIHRoZSBTY2hlbWFUeXBlU3lzdGVtIG9uY2UsIGluY2x1ZGluZyBuZXN0ZWQKKyAqIGRlZmluaXRpb25zLgorICogPHByZT4KKyAqIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICogYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHR5cGVTeXN0ZW0uZG9jdW1lbnRUeXBlcygpKSk7CisgKiBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5hdHRyaWJ1dGVUeXBlcygpKSk7CisgKiBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QodHlwZVN5c3RlbS5nbG9iYWxUeXBlcygpKSk7CisgKiBmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlZW5UeXBlcy5zaXplKCk7IGkrKykKKyAqIHsKKyAqICAgICBTY2hlbWFUeXBlIHNUeXBlID0gKFNjaGVtYVR5cGUpYWxsU2VlblR5cGVzLmdldChpKTsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW5sbnQoIlZpc2l0aW5nICIgKyBzVHlwZS50b1N0cmluZygpKTsKKyAqICAgICBhbGxTZWVuVHlwZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc1R5cGUuZ2V0QW5vbnltb3VzVHlwZXMoKSkpOworICogfQorICogPC9wcmU+CisgKgorICogQHNlZSBTY2hlbWFUeXBlIAorICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyIAorICogQHNlZSBYbWxCZWFucyNjb21waWxlWHNkCisgKiBAc2VlIFhtbEJlYW5zI3R5cGVMb2FkZXJVbmlvbgorICogQHNlZSBYbWxCZWFucyNnZXRCdWlsdGluVHlwZVN5c3RlbQorICovIAorcHVibGljIGludGVyZmFjZSBTY2hlbWFUeXBlU3lzdGVtIGV4dGVuZHMgU2NoZW1hVHlwZUxvYWRlcgoreworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlW10gZ2xvYmFsVHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IHR5cGVzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVtdIGRvY3VtZW50VHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVbXSBhdHRyaWJ1dGVUeXBlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYUdsb2JhbEVsZW1lbnRbXSBnbG9iYWxFbGVtZW50cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiB0aGlzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hR2xvYmFsQXR0cmlidXRlW10gZ2xvYmFsQXR0cmlidXRlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbW9kZWwgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFNjaGVtYU1vZGVsR3JvdXBbXSBtb2RlbEdyb3VwcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGdyb3VwcyBkZWZpbmVkIGluIHRoaXMgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFBdHRyaWJ1dGVHcm91cFtdIGF0dHJpYnV0ZUdyb3VwcygpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSB0eXBlIHN5c3RlbSAocmVzb2x2ZXMgYWxsIGhhbmRsZXMgd2l0aGluIHRoZSB0eXBlIHN5c3RlbSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZSgpOworCisgICAgLyoqCisgICAgICogTG9jYXRlcyBhIHR5cGUsIGVsZW1lbnQsIG9yIGF0dHJpYnV0ZSB1c2luZyB0aGUgaGFuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlbWFDb21wb25lbnQgcmVzb2x2ZUhhbmRsZShTdHJpbmcgaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgYSB0eXBlLCBlbGVtZW50LCBvciBhdHRyaWJ1dGUgdXNpbmcgdGhlIGhhbmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hVHlwZSB0eXBlRm9ySGFuZGxlKFN0cmluZyBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3Nsb2FkZXIgdXNlZCBieSB0aGlzIGxvYWRlciBmb3IgcmVzb2x2aW5nIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpOworCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhpcyB0eXBlIHRvIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVUb0RpcmVjdG9yeShGaWxlIGNsYXNzRGlyKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TaW1wbGVWYWx1ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1NpbXBsZVZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1NDk0YQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TaW1wbGVWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKKy8qKgorICogQWxsIFhtbE9iamVjdCBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGNvZXJjZWQgdG8gU2ltcGxlVmFsdWUuCisgKiBGb3IgYW55IGdpdmVuIHNjaGVtYSB0eXBlLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb252ZXJzaW9uCisgKiBtZXRob2RzIHdpbGwgd29yay4gIE90aGVycyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAqIDxwPgorICogU2ltcGxlVmFsdWUgaXMgdXNlZnVsIGZvciBkZWNsYXJpbmcgdmFyaWFibGVzIHdoaWNoIGNhbiBob2xkCisgKiBtb3JlIHRoYW4gb25lIHNpbWlsYXIgc2NoZW1hIHR5cGUgdGhhdCBtYXkgbm90IGhhcHBlbiB0bworICogaGF2ZSBhIGNvbW1vbiBYTUwgYmFzZSB0eXBlLCBmb3IgZXhhbXBsZSwgdHdvIGxpc3QgdHlwZXMsCisgKiBvciB0d28gdW5yZWxhdGVkIGludGVnZXIgcmVzdHJpY3Rpb25zIHRoYXQgaGFwcGVuIHRvIGZpdAorICogaW50byBhbiBpbnQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2ltcGxlVmFsdWUgZXh0ZW5kcyBYbWxPYmplY3QKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgc2FtZSBhcyBnZXRTY2hlbWFUeXBlIHVubGVzcyB0aGlzIGlzIGEgdW5pb24gaW5zdGFuY2UKKyAgICAgKiBvciBuaWwgdmFsdWUuCisgICAgICogPHA+CisgICAgICogRm9yIHVuaW9ucywgdGhpcyByZXR1cm5zIHRoZSBub24tdW5pb24gY29uc2l0dWVudCB0eXBlIG9mCisgICAgICogdGhpcyBpbnN0YW5jZS4gVGhpcyB0eXBlIG1heSBjaGFuZ2UgaWYgc2V0dGVycyBhcmUgY2FsbGVkCisgICAgICogdGhhdCBjYXVzZSB0aGUgaW5zdGFuY2UgdG8gY2hhbmdlIHRvIGFub3RoZXIgY29uc3RpdHVlbnQKKyAgICAgKiB0eXBlIG9mIHRoZSB1bmlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgbmlsIHZhbHVlcywgdGhpcyByZXR1cm5zIG51bGwuCisgICAgICovCisgICAgU2NoZW1hVHlwZSBpbnN0YW5jZVR5cGUoKTsKKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqLworICAgIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICovCisgICAgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqLworICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHNob3J0LiAqLworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGFuIGludC4gKi8KKyAgICBwdWJsaWMgaW50IGdldEludFZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nVmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uICovCisgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqLworICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWxWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGZsb2F0LiAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLiAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlVmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqLworICAgIGJ5dGVbXSBnZXRCeXRlQXJyYXlWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKi8KKyAgICBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGdldEVudW1WYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICovCisgICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfS4gKi8KKyAgICBEYXRlIGdldERhdGVWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0uICovCisgICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LiAqLworICAgIEdEdXJhdGlvbiBnZXRHRHVyYXRpb25WYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uICovCisgICAgUU5hbWUgZ2V0UU5hbWVWYWx1ZSgpOworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBmcmllbmRseSBKYXZhIG9iamVjdHMgKFN0cmluZywgSW50ZWdlciwgQnl0ZSwgU2hvcnQsIExvbmcsIEJpZ0ludGVnZXIsIERlY2ltYWwsIEZsb2F0LCBEb3VibGUsIGJ5dGVbXSwgQ2FsZW5kYXIsIEdEdXJhdGlvbikuICovCisgICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2YgWG1sQW55U2ltcGxlVHlwZSBvYmplY3RzLiAqLworICAgIExpc3QgeGdldExpc3RWYWx1ZSgpOworCisgICAgLyoqIFJldHVybnMgYSB1bmlvbiB2YWx1ZSBhcyBhIGl0cyBuYXR1cmFsIGZyaWVuZGx5IEphdmEgb2JqZWN0IChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqLworICAgIE9iamVjdCBnZXRPYmplY3RWYWx1ZSgpOworCisgICAgLy8gZm9sbG93aW5nIGFyZSBzaW1wbGUgdHlwZSB2YWx1ZSBzZXR0ZXJzCisKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfS4gKi8KKyAgICB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBvYmopOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJvb2xlYW4uICovCisgICAgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBieXRlLiAqLworICAgIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgdik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgc2hvcnQuICovCisgICAgdm9pZCBzZXRTaG9ydFZhbHVlKHNob3J0IHYpOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBpbnQuICovCisgICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgbG9uZy4gKi8KKyAgICB2b2lkIHNldExvbmdWYWx1ZShsb25nIHYpOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfS4gKi8KKyAgICB2b2lkIHNldEJpZ0ludGVnZXJWYWx1ZShCaWdJbnRlZ2VyIG9iaik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9LiAqLworICAgIHZvaWQgc2V0QmlnRGVjaW1hbFZhbHVlKEJpZ0RlY2ltYWwgb2JqKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4gKi8KKyAgICB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLiAqLworICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCisgICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gb2JqKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nRW51bUFic3RyYWN0QmFzZX0uICovCisgICAgdm9pZCBzZXRFbnVtVmFsdWUoU3RyaW5nRW51bUFic3RyYWN0QmFzZSBvYmopOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICovCisgICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIG9iaik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9LiAqLworICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgb2JqKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LiAqLworICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBvYmopOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBHRHVyYXRpb259LiAqLworICAgIHZvaWQgc2V0R0R1cmF0aW9uVmFsdWUoR0R1cmF0aW9uIG9iaik7CisgICAgLyoqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFFOYW1lfS4gKi8KKyAgICB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgb2JqKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0uICovCisgICAgdm9pZCBzZXRMaXN0VmFsdWUoTGlzdCBvYmopOworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBhcmJpdHJhcnkge0BsaW5rIE9iamVjdH0uICovCisgICAgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3Qgb2JqKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30uICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0U3RyaW5nVmFsdWV9CisgICAgICovCisgICAgU3RyaW5nIHN0cmluZ1ZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBib29sZWFuLiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJvb2xlYW5WYWx1ZX0KKyAgICAgKi8KKyAgICBib29sZWFuIGJvb2xlYW5WYWx1ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYnl0ZS4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCeXRlVmFsdWV9CisgICAgICovCisgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBzaG9ydC4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYW4gaW50LiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIGxvbmcuICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9LiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEJpZ0ludGVnZXJWYWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgQmlnSW50ZWdlciBiaWdJbnRlZ2VyVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfS4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCaWdEZWNpbWFsVmFsdWV9CisgICAgICovCisgICAgcHVibGljIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBmbG9hdC4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRGbG9hdFZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBkb3VibGUuICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RG91YmxlVmFsdWV9CisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KKyAgICAgKi8KKyAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlfS4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRFbnVtVmFsdWV9CisgICAgICovCisgICAgU3RyaW5nRW51bUFic3RyYWN0QmFzZSBlbnVtVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KKyAgICAgKi8KKyAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0RGF0ZVZhbHVlfQorICAgICAqLworICAgIERhdGUgZGF0ZVZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9LiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9CisgICAgICovCisgICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0uICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0R1cmF0aW9uVmFsdWV9CisgICAgICovCisgICAgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9LiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFFOYW1lVmFsdWV9CisgICAgICovCisgICAgUU5hbWUgcU5hbWVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIGZyaWVuZGx5IEphdmEgb2JqZWN0cyAoU3RyaW5nLCBJbnRlZ2VyLCBCeXRlLCBTaG9ydCwgTG9uZywgQmlnSW50ZWdlciwgRGVjaW1hbCwgRmxvYXQsIERvdWJsZSwgYnl0ZVtdLCBDYWxlbmRhciwgR0R1cmF0aW9uKS4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICovCisgICAgTGlzdCBsaXN0VmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fSBvZiBYbWxBbnlTaW1wbGVUeXBlIG9iamVjdHMuICoKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TGlzdFZhbHVlfQorICAgICAqLworICAgIExpc3QgeGxpc3RWYWx1ZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSB1bmlvbiB2YWx1ZSBhcyBhIGl0cyBuYXR1cmFsIGZyaWVuZGx5IEphdmEgb2JqZWN0IChTdHJpbmcsIEludGVnZXIsIEJ5dGUsIFNob3J0LCBMb25nLCBCaWdJbnRlZ2VyLCBEZWNpbWFsLCBGbG9hdCwgRG91YmxlLCBieXRlW10sIENhbGVuZGFyLCBHRHVyYXRpb24pLiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldE9iamVjdFZhbHVlfQorICAgICAqLworICAgIE9iamVjdCBvYmplY3RWYWx1ZSgpOworCisgICAgLy8gZm9sbG93aW5nIGFyZSBzaW1wbGUgdHlwZSB2YWx1ZSBzZXR0ZXJzCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9LiAqCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFN0cmluZ1ZhbHVlfQorICAgICAqLworICAgIHZvaWQgc2V0KFN0cmluZyBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi4gKgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCb29sZWFuVmFsdWV9CisgICAgICovCisgICAgdm9pZCBzZXQoYm9vbGVhbiB2KTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIGJ5dGUuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJ5dGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoYnl0ZSB2KTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHNob3J0LgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRTaG9ydFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChzaG9ydCB2KTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhbiBpbnQuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChpbnQgdik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSBsb25nLgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRMb25nVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGxvbmcgdik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0uCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0ludGVnZXJWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoQmlnSW50ZWdlciBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0RlY2ltYWxWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoQmlnRGVjaW1hbCBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgZmxvYXQuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEZsb2F0VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGZsb2F0IHYpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgZG91YmxlLgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXREb3VibGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoZG91YmxlIHYpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGJ5dGVbXSBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ0VudW1BYnN0cmFjdEJhc2V9LgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRFbnVtVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KFN0cmluZ0VudW1BYnN0cmFjdEJhc2Ugb2JqKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0uCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KENhbGVuZGFyIG9iaik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0uCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoRGF0ZSBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfS4KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIG9iaik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgR0R1cmF0aW9ufS4KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0R1cmF0aW9uVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gb2JqKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0uCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFFOYW1lVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KFFOYW1lIG9iaik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0uCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldExpc3RWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoTGlzdCBvYmopOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGFuIGFyYml0cmFyeSB7QGxpbmsgT2JqZWN0fS4KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0T2JqZWN0VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgb2JqZWN0U2V0KE9iamVjdCBvYmopOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1N0cmluZ0VudW1BYnN0cmFjdEJhc2UuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TdHJpbmdFbnVtQWJzdHJhY3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiYWQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9TdHJpbmdFbnVtQWJzdHJhY3RCYXNlLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUaGUgYmFzZSBjbGFzcyBmb3IgY29kZS1nZW5lcmF0ZWQgc3RyaW5nIGVudW1lcmF0aW9uIHZhbHVlIGNsYXNzZXMuCisgKiA8cD4KKyAqIFN1YmNsYXNzZXMgYXJlIGludGVuZGVkIHRvIGJlIGZpbmFsIHR5cGVzIHdpdGggYSBmaW5pdGUgc2V0IG9mCisgKiBzaW5nbGV0b24gaW5zdGFuY2VzLiAgRWFjaCBpbnN0YW5jZSBoYXMgYSBzdHJpbmcgdmFsdWUsIHdoaWNoCisgKiBpdCByZXR1cm5zIHZpYSB7QGxpbmsgI3RvU3RyaW5nfSwgYW5kIGFuIGludCB2YWx1ZSBmb3IgdGhlIHB1cnBvc2UKKyAqIG9mIHN3aXRjaGluZyBpbiBjYXNlIHN0YXRlbWVudHMsIHJldHVybmVkIHZpYSB7QGxpbmsgI2ludFZhbHVlfS4KKyAqIDxwPgorICogRWFjaCBzdWJjbGFzcyBtYW5hZ2VzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlLlRhYmxlfSwKKyAqIHdoaWNoIGhvbGRzIGFsbCB0aGUgc2luZ2xldG9uIGluc3RhbmNlcyBmb3IgdGhlIHN1YmNsYXNzLiBBIFRhYmxlCisgKiBjYW4gcmV0dXJuIGEgc2luZ2xldG9uIGluc3RhbmNlIGdpdmVuIGEgU3RyaW5nIG9yIGFuIGludGVnZXIgY29kZS4KKyAqLyAKK3B1YmxpYyBjbGFzcyBTdHJpbmdFbnVtQWJzdHJhY3RCYXNlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBfc3RyaW5nOworICAgIHByaXZhdGUgaW50IF9pbnQ7CisKKyAgICAvKioKKyAgICAgKiBTaW5nbGV0b24gaW5zdGFuY2VzIHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8gCisgICAgcHJvdGVjdGVkIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UoU3RyaW5nIHMsIGludCBpKQorICAgICAgICB7IF9zdHJpbmcgPSBzOyBfaW50ID0gaTsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsgcmV0dXJuIF9zdHJpbmc7IH0KKyAgICAvKiogUmV0dXJucyBhbiBpbnQgY29kZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBzd2l0Y2ggc3RhdGVtZW50cyAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgaW50VmFsdWUoKQorICAgICAgICB7IHJldHVybiBfaW50OyB9CisgICAgLyoqIFJldHVybnMgdGhlIGhhc2ggY29kZSBvZiB0aGUgdW5kZXJseWluZyBzdHJpbmcgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeyByZXR1cm4gX3N0cmluZy5oYXNoQ29kZSgpOyB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIG1hbmFnZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGVudW1lcmF0aW9ucy4KKyAgICAgKiBFYWNoIHN1YmNsYXNzIG9mIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgaGFzIGFuIGluc3RhbmNlCisgICAgICogb2YgYSB0YWJsZSB0byBob2xkIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VzLgorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIE1hcCBfbWFwOworICAgICAgICBwcml2YXRlIExpc3QgX2xpc3Q7CisgICAgICAgIHB1YmxpYyBUYWJsZShTdHJpbmdFbnVtQWJzdHJhY3RCYXNlW10gYXJyYXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9tYXAgPSBuZXcgSGFzaE1hcChhcnJheS5sZW5ndGgpOworICAgICAgICAgICAgX2xpc3QgPSBuZXcgQXJyYXlMaXN0KGFycmF5Lmxlbmd0aCArIDEpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWFwLnB1dChhcnJheVtpXS50b1N0cmluZygpLCBhcnJheVtpXSk7CisgICAgICAgICAgICAgICAgaW50IGogPSBhcnJheVtpXS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHdoaWxlIChfbGlzdC5zaXplKCkgPD0gaikKKyAgICAgICAgICAgICAgICAgICAgX2xpc3QuYWRkKG51bGwpOworICAgICAgICAgICAgICAgIF9saXN0LnNldChqLCBhcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gZm9yIGEge0BsaW5rIFN0cmluZ30sIG9yIG51bGwgaWYgbm9uZS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9yU3RyaW5nKFN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZ0VudW1BYnN0cmFjdEJhc2UpX21hcC5nZXQocyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBmb3IgYW4gaW50IGNvZGUsIG9yIG51bGwgaWYgbm9uZS4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZ0VudW1BYnN0cmFjdEJhc2UgZm9ySW50KGludCBpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA+IF9saXN0LnNpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nRW51bUFic3RyYWN0QmFzZSlfbGlzdC5nZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGxhc3QgdmFsaWQgaW50IGNvZGUgKHRoZSBmaXJzdCBpcyAxOyB6ZXJvIGlzIG5vdCB1c2VkKS4gKi8KKyAgICAgICAgcHVibGljIGludCBsYXN0SW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9saXN0LnNpemUoKSAtIDE7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWE1MU3RyZWFtVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE3ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1hNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhyb3duIGZyb20gYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICogCisgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I25ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbQorICogQHNlZSBTY2hlbWFUeXBlTG9hZGVyI25ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbQorICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgWE1MU3RyZWFtRXhjZXB0aW9uCit7CisgICAgcHVibGljIFhNTFN0cmVhbVZhbGlkYXRpb25FeGNlcHRpb24gKCBYbWxFcnJvciB4bWxFcnJvciApCisgICAgeworICAgICAgICBzdXBlciggeG1sRXJyb3IudG9TdHJpbmcoKSApOworICAgICAgICAKKyAgICAgICAgX3htbEVycm9yID0geG1sRXJyb3I7CisgICAgfQorCisgICAgcHVibGljIFhtbEVycm9yIGdldFhtbEVycm9yICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF94bWxFcnJvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIFhtbEVycm9yIF94bWxFcnJvcjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55U2ltcGxlVHlwZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFlNmVhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVNpbXBsZVR5cGUuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNTaW1wbGVfVHlwZV9EZWZpbml0aW9uIj54czphbnlTaW1wbGVUeXBlPC9hPiB0eXBlLgorICogPHA+CisgKiBBbGwgc2ltcGxlIHR5cGVzIGFyZSBjb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4gCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbEFueVNpbXBsZVR5cGUgZXh0ZW5kcyBYbWxPYmplY3QKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9hbnlTaW1wbGVUeXBlIik7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0U3RyaW5nVmFsdWV9CisgICAgICoqLworICAgIFN0cmluZyBzdHJpbmdWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIFN0cmluZ30KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldFN0cmluZ1ZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChTdHJpbmcgcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBTdHJpbmd9CisgICAgICoqLworICAgIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqKi8KKyAgICB2b2lkIHNldFN0cmluZ1ZhbHVlKFN0cmluZyBzKTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2FueXRoaW5nJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2FueXRoaW5nJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlTaW1wbGVUeXBlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVNpbXBsZVR5cGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVNpbXBsZVR5cGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlTaW1wbGVUeXBlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlTaW1wbGVUeXBlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55U2ltcGxlVHlwZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55U2ltcGxlVHlwZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55U2ltcGxlVHlwZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVNpbXBsZVR5cGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEFueVVSSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQW55VVJJLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYW55VVJJIj54czphbnlVUkk8L2E+IHR5cGUuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBTdHJpbmd9LiAKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sQW55VVJJIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2FueVVSSSIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sQW55VVJJfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxBbnlVUkl9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxBbnlVUkl9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxBbnlVUkl9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7aHR0cDovL3d3dy53My5vcmcvJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O2h0dHA6Ly93d3cudzMub3JnLyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEFueVVSSX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxBbnlVUkkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQW55VVJJfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQW55VVJJIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxBbnlVUkkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQW55VVJJKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxBbnlVUkl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEFueVVSSSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEFueVVSSSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmFzZTY0QmluYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhNGUzZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCYXNlNjRCaW5hcnkuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNiYXNlNjRCaW5hcnkiPnhzOmJhc2U2NEJpbmFyeTwvYT4gdHlwZS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8gYSBieXRlIGFycmF5LiAKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sQmFzZTY0QmluYXJ5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2Jhc2U2NEJpbmFyeSIpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCeXRlQXJyYXlWYWx1ZX0KKyAgICAgKiovCisgICAgYnl0ZVtdIGJ5dGVBcnJheVZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qnl0ZUFycmF5VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGJ5dGVbXSBiYSk7CisKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKiovCisgICAgYnl0ZVtdIGdldEJ5dGVBcnJheVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuICovCisgICAgdm9pZCBzZXRCeXRlQXJyYXlWYWx1ZShieXRlW10gYmEpOworCisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O1ZHaHBjeUJ6ZEhKcCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtWR2hwY3lCemRISnAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCYXNlNjRCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQmFzZTY0QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJhc2U2NEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJhc2U2NEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQmFzZTY0QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJhc2U2NEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQmFzZTY0QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCYXNlNjRCaW5hcnkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCYXNlNjRCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQmVhbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdmNzhhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJlYW5zLmphdmEKQEAgLTAsMCArMSw0NTUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIFByb3ZpZGVzIGFuIGFzc29ydG1lbnQgb2YgdXRpbGl0aWVzCisgKiBmb3IgbWFuYWdpbmcgWE1MIEJlYW4gdHlwZXMsIHR5cGUgc3lzdGVtcywgUU5hbWVzLCBwYXRocywKKyAqIGFuZCBxdWVyaWVzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgWG1sQmVhbnMKK3sKKyAgICAvKioKKyAgICAgKiBUaHJlYWQgbG9jYWwgUU5hbWUgY2FjaGUgZm9yIGdlbmVyYWwgdXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWwgX3RocmVhZExvY2FsTG9hZGVyUU5hbWVDYWNoZSA9CisgICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lQ2FjaGUoIDMyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdGhyZWFkIGxvY2FsIFFOYW1lQ2FjaGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFFOYW1lQ2FjaGUgZ2V0UU5hbWVDYWNoZSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiAoUU5hbWVDYWNoZSkgX3RocmVhZExvY2FsTG9hZGVyUU5hbWVDYWNoZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbmFtZSBmcm9tIHRoZSB0aHJlYWQgbG9jYWwgUU5hbWVDYWNoZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0UU5hbWUgKCBTdHJpbmcgbG9jYWxQYXJ0ICkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRRTmFtZUNhY2hlKCkuZ2V0TmFtZSggIiIsICBsb2NhbFBhcnQgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbmFtZSBmcm9tIHRoZSB0aHJlYWQgbG9jYWwgUU5hbWVDYWNoZQorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRRTmFtZSAoIFN0cmluZyBuYW1lc3BhY2VVcmksIFN0cmluZyBsb2NhbFBhcnQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFFOYW1lQ2FjaGUoKS5nZXROYW1lKCBuYW1lc3BhY2VVcmksICBsb2NhbFBhcnQgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgX2dldENvbnRleHRUeXBlTG9hZGVyTWV0aG9kID0gYnVpbGRHZXRDb250ZXh0VHlwZUxvYWRlck1ldGhvZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfZ2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QgPSBidWlsZEdldEJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtTWV0aG9kKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9nZXROb1R5cGVNZXRob2QgPSBidWlsZEdldE5vVHlwZU1ldGhvZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QgPSBidWlsZFR5cGVMb2FkZXJCdWlsZGVyTWV0aG9kKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIF9jb21waWxhdGlvbk1ldGhvZCA9IGJ1aWxkQ29tcGlsYXRpb25NZXRob2QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFJ1bnRpbWVFeGNlcHRpb24gY2F1c2VkRXhjZXB0aW9uKFJ1bnRpbWVFeGNlcHRpb24gZSwgVGhyb3dhYmxlIGNhdXNlKQorICAgIHsKKyAgICAgICAgZS5pbml0Q2F1c2UoY2F1c2UpOworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBYbWxFeGNlcHRpb24gd3JhcHBlZEV4Y2VwdGlvbihUaHJvd2FibGUgZSkKKyAgICB7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWG1sRXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIChYbWxFeGNlcHRpb24pIGU7CisKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGJ1aWxkR2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0Q29udGV4dFR5cGVMb2FkZXIiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVMb2FkZXJJbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIGJ1aWxkR2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0IiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbTogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRHZXROb1R5cGVNZXRob2QoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLkJ1aWx0aW5TY2hlbWFUeXBlU3lzdGVtIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiZ2V0Tm9UeXBlIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBCdWlsdGluU2NoZW1hVHlwZVN5c3RlbTogdmVyaWZ5IHRoYXQgeGJlYW4uamFyIGlzIG9uIHRoZSBjbGFzc3BhdGgiKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBidWlsZFR5cGVMb2FkZXJCdWlsZGVyTWV0aG9kKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBDbGFzcyByZXNvdXJjZUxvYWRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnNjaGVtYS5SZXNvdXJjZUxvYWRlciIsIGZhbHNlLCBYbWxCZWFucy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc2NoZW1hLlNjaGVtYVR5cGVMb2FkZXJJbXBsIiwgZmFsc2UsIFhtbEJlYW5zLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpLmdldE1ldGhvZCgiYnVpbGQiLCBuZXcgQ2xhc3NbXSB7IFNjaGVtYVR5cGVMb2FkZXJbXS5jbGFzcywgcmVzb3VyY2VMb2FkZXJDbGFzcywgQ2xhc3NMb2FkZXIuY2xhc3MgfSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGxvYWQgU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHhiZWFuLmphciBpcyBvbiB0aGUgY2xhc3NwYXRoIiksIGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgYnVpbGRDb21waWxhdGlvbk1ldGhvZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUltcGwiLCBmYWxzZSwgWG1sQmVhbnMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkuZ2V0TWV0aG9kKCJmb3JTY2hlbWFYbWwiLCBuZXcgQ2xhc3NbXSB7IFhtbE9iamVjdFtdLmNsYXNzLCBTY2hlbWFUeXBlTG9hZGVyLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBsb2FkIFNjaGVtYVR5cGVTeXN0ZW1JbXBsOiB2ZXJpZnkgdGhhdCB4YmVhbi5qYXIgaXMgb24gdGhlIGNsYXNzcGF0aCIpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBpbGVzIGFuIFhQYXRoLCByZXR1cm5pbmcgYSBTdHJpbmcgZXF1YWwgdG8gdGhhdCB3aGljaCB3YXMgcGFzc2VkLAorICAgICAqIGJ1dCB3aG9zZSBpZGVudGl0eSBpcyB0aGF0IG9mIG9uZSB3aGljaCBoYXMgYmVlbiBwcmVjb21waWxlZCBhbmQgY2FjaGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVQYXRoICggU3RyaW5nIHBhdGhFeHByICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVQYXRoKCBwYXRoRXhwciwgbnVsbCApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyBhbiBYUGF0aCwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKKyAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZDsgCisgICAgICogdGFrZXMgYW4gb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHRleHQgdGhhdCBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgY29udGV4dCBub2RlLgorICAgICAqIFRoZSBkZWZhdWx0IGlzICJ0aGlzIiwgYXMgaW4gIiR0aGlzIi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBwYXRoLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjYWxsIAorICAgICAqIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpIFhtbE9wdGlvbnMuc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKX0KKyAgICAgKiBtZXRob2QgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgbmFtZSBmb3IgdGhlIGV4cHJlc3Npb24gCisgICAgICogdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENvbnRleHRUeXBlTG9hZGVyKCkuY29tcGlsZVBhdGgoIHBhdGhFeHByLCBvcHRpb25zICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbXBpbGVzIGFuIFhRdWVyeSwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKKyAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByICkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVRdWVyeSggcXVlcnlFeHByLCBudWxsICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbXBpbGVzIGFuIFhRdWVyeSwgcmV0dXJuaW5nIGEgU3RyaW5nIGVxdWFsIHRvIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCwKKyAgICAgKiBidXQgd2hvc2UgaWRlbnRpdHkgaXMgdGhhdCBvZiBvbmUgd2hpY2ggaGFzIGJlZW4gcHJlY29tcGlsZWQgYW5kIGNhY2hlZDsKKyAgICAgKiB0YWtlcyBhbiBvcHRpb24gZm9yIHNwZWNpZnlpbmcgdGV4dCB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dCBub2RlLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgb3B0aW9ucyAgT3B0aW9ucyBmb3IgdGhlIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjYWxsIAorICAgICAqIHRoZSB7QGxpbmsgWG1sT3B0aW9ucyNzZXRYcXVlcnlDdXJyZW50Tm9kZVZhcihTdHJpbmcpIFhtbE9wdGlvbnMuc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKX0KKyAgICAgKiBtZXRob2QgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIgbmFtZSBmb3IgdGhlIGV4cHJlc3Npb24gCisgICAgICogdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvbnRleHQgbm9kZSBhbmQgdGhlCisgICAgICoge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5VmFyaWFibGVzKE1hcCkgWG1sT3B0aW9ucy5zZXRYcXVlcnlWYXJpYWJsZXMoTWFwKX0KKyAgICAgKiBtZXRob2QgdG8gbWFwIGV4dGVybmFsIHZhcmlhYmxlIG5hbWVzIHRvIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlUXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5jb21waWxlUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBTY2hlbWFUeXBlTG9hZGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbnRleHQKKyAgICAgKiBDbGFzc0xvYWRlci4gVGhpcyBpcyB0aGUgU2NoZW1hVHlwZUxvYWRlciB0aGF0IGlzIHVzZWQgdG8gYXNzaWduCisgICAgICogc2NoZW1hIHR5cGVzIHRvIFhNTCBkb2N1bWVudHMgYnkgZGVmYXVsdC4gVGhlIFNjaGVtYVR5cGVMb2FkZXIgaXMKKyAgICAgKiBhbHNvIGNvbnN1bHRlZCB0byByZXNvbHZlIHdpbGRjYXJkcyBhbmQgeHNpOnR5cGUgYXR0cmlidXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgInBhcnNlIiBtZXRob2RzIG9mIFhtbEJlYW5zIGFsbCBkZWxlZ2F0ZSB0byB0aGUKKyAgICAgKiAicGFyc2VJbnN0YW5jZSIgbWV0aG9kcyBvZiB0aGUgY29udGV4dCB0eXBlIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfZ2V0Q29udGV4dFR5cGVMb2FkZXJNZXRob2QuaW52b2tlKG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBidWlsdGluIHR5cGUgc3lzdGVtLiBUaGlzIFNjaGVtYVR5cGVTeXN0ZW0gY29udGFpbnMKKyAgICAgKiBvbmx5IHRoZSA0NiBidWlsdGluIHR5cGVzIGRlZmluZWQgYnkgdGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbSlfZ2V0QnVpbHRpblNjaGVtYVR5cGVTeXN0ZW1NZXRob2QuaW52b2tlKG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gQnVpbHRpblNjaGVtYVR5cGVTeXN0ZW0uZ2V0KCk6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAorICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQuCisgICAgICogPHA+CisgICAgICogSnVzdCBsaWtlIGNvbXBpbGVUeXBlU3lzdGVtLCBidXQgdXNlcyB0aGUgY29udGV4dCB0eXBlIGxvYWRlciBmb3IKKyAgICAgKiBsaW5raW5nLCBhbmQgcmV0dXJucyBhIHVuaW9uZWQgdHlwZWxvYWRlciB0aGF0IGlzIHN1aXRhYmxlIGZvcgorICAgICAqIGNyZWF0aW5nIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgbG9hZFhzZChYbWxPYmplY3RbXSBzY2hlbWFzKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbG9hZFhzZChzY2hlbWFzLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAorICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQgaW4gPGVtPnNjaGVtYXM8L2VtPi48L3A+CisgICAgICogCisgICAgICogPHA+VGhpcyBpcyBqdXN0IGxpa2UgY29tcGlsZVR5cGVTeXN0ZW0sIGJ1dCB1c2VzIHRoZSBjb250ZXh0IHR5cGUgbG9hZGVyIGZvcgorICAgICAqIGxpbmtpbmcsIGFuZCByZXR1cm5zIGEgdW5pb25lZCB0eXBlbG9hZGVyIHRoYXQgaXMgc3VpdGFibGUgZm9yCisgICAgICogY3JlYXRpbmcgaW5zdGFuY2VzLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5Vc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgb25lIG9yIGJvdGggb2YgdGhlIGZvbGxvd2luZzo8L3A+CisgICAgICogCisgICAgICogPHVsPgorICAgICAqIDxsaT5BIGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBlcnJvciBsaXN0ZW5lciBkdXJpbmcKKyAgICAgKiBjb21waWxhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LjwvbGk+CisgICAgICogPGxpPldoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgbm90IGJlIGRvbmUgd2hlbiBidWlsZGluZyB0aGUgU2NoZW1hVHlwZVN5c3RlbSwKKyAgICAgKiBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0Q29tcGlsZU5vVmFsaWRhdGlvbn0uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzY2hlbWFzIFRoZSBzY2hlbWEgZGVmaW5pdGlvbnMgZnJvbSB3aGljaCB0byBidWlsZCB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLgorICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyBhbiBlcnJvciBsaXN0ZW5lciBhbmQvb3IgdmFsaWRhdGlvbiBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVMb2FkZXIgbG9hZFhzZChYbWxPYmplY3RbXSBzY2hlbWFzLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIHN0cyA9CisgICAgICAgICAgICAgICAgKFNjaGVtYVR5cGVTeXN0ZW0pCisgICAgICAgICAgICAgICAgICAgIF9jb21waWxhdGlvbk1ldGhvZC5pbnZva2UoCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgT2JqZWN0W10geyBzY2hlbWFzLCBnZXRDb250ZXh0VHlwZUxvYWRlcigpLCBvcHRpb25zIH0pOworCisgICAgICAgICAgICBpZiAoc3RzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHR5cGVMb2FkZXJVbmlvbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNjaGVtYVR5cGVMb2FkZXJbXSB7IHN0cywgZ2V0Q29udGV4dFR5cGVMb2FkZXIoKSB9ICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbC5mb3JTY2hlbWFYbWwoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyB3cmFwcGVkRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyB0aGUgU2NoZW1hVHlwZVN5c3RlbSB0aGF0IHJlc3VsdHMgZnJvbSBjb21waWxpbmcgdGhlIFhNTAorICAgICAqIHNjaGVtYSBkZWZpbml0aW9ucyBwYXNzZWQuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBYbWxPYmplY3RzIHBhc3NlZCBpbiBzaG91bGQgYmUgdzNjICZsdDtzY2hlbWEmZ3Q7IGVsZW1lbnRzIHdob3NlIHR5cGUKKyAgICAgKiBpcyBvcmcudzNjLngyMDAxLnhtbFNjaGVtYS5TY2hlbWEuIChUaGF0IGlzLCBzY2hlbWEgZWxlbWVudHMgaW4KKyAgICAgKiB0aGUgWE1MIG5hbWVzcGFjZSBodHRwOi8vd3d3LnczYy5vcmcvMjAwMS9YTUxTY2hlbWEuKSAgQWxzbworICAgICAqIG9yZy53M2MueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50IGlzIHBlcm1pdHRlZC48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyBhIFNjaGVtYVR5cGVMb2FkZXIgd2hpY2ggd2lsbCBiZQorICAgICAqIGNvbnN1bHRlZCBmb3IgYWxyZWFkeS1jb21waWxlZCBzY2hlbWEgdHlwZXMgd2hpY2ggbWF5IGJlIGxpbmtlZAorICAgICAqIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGdpdmVuIHNjaGVtYXMuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBTY2hlbWFUeXBlU3lzdGVtIHRoYXQgaXMgcmV0dXJuZWQgc2hvdWxkIGJlIGNvbWJpbmVkCisgICAgICogKHZpYSB7QGxpbmsgI3R5cGVMb2FkZXJVbmlvbn0pIHdpdGggdGhlIHR5cGVwYXRoIHR5cGVsb2FkZXIgaW4gb3JkZXIKKyAgICAgKiB0byBjcmVhdGUgYSB0eXBlbG9hZGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNyZWF0aW5nIGFuZCB2YWxpZGF0aW5nCisgICAgICogaW5zdGFuY2VzLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5Vc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+CisgICAgICogCisgICAgICogPHVsPgorICAgICAqIDxsaT5BIGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBhbiBlcnJvciBsaXN0ZW5lciBkdXJpbmcKKyAgICAgKiBjb21waWxhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LjwvbGk+CisgICAgICogPGxpPldoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgbm90IGJlIGRvbmUgd2hlbiBidWlsZGluZyB0aGUgU2NoZW1hVHlwZVN5c3RlbSwKKyAgICAgKiBhcyBkZXNjcmliZWQgaW4ge0BsaW5rIFhtbE9wdGlvbnMjc2V0Q29tcGlsZU5vVmFsaWRhdGlvbn0uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIAorICAgICAqIEBwYXJhbSBzY2hlbWFzIFRoZSBzY2hlbWEgZGVmaW5pdGlvbnMgZnJvbSB3aGljaCB0byBidWlsZCB0aGUgc2NoZW1hIHR5cGUgc3lzdGVtLgorICAgICAqIEBwYXJhbSB0eXBlcGF0aCBUaGUgcGF0aCB0byBhbHJlYWR5LWNvbXBpbGVkIHNjaGVtYSB0eXBlcyBmb3IgbGlua2luZyB3aGlsZSBwcm9jZXNzaW5nLgorICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyBhbiBlcnJvciBsaXN0ZW5lciBhbmQvb3IgdmFsaWRhdGlvbiBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNjaGVtYVR5cGVTeXN0ZW0gY29tcGlsZVhzZChYbWxPYmplY3RbXSBzY2hlbWFzLCBTY2hlbWFUeXBlTG9hZGVyIHR5cGVwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICh0eXBlcGF0aCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzdXBwbHkgYSBTY2hlbWFUeXBlTG9hZGVyIGZvciBjb21waWxldGltZSBsaW5raW5nIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZVN5c3RlbSlfY29tcGlsYXRpb25NZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHNjaGVtYXMsIHR5cGVwYXRoLCBvcHRpb25zIH0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbC5mb3JTY2hlbWFYbWwoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IHdyYXBwZWRFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiBhIGxpc3Qgb2YgdHlwZUxvYWRlcnMuIFRoZSByZXR1cm5lZAorICAgICAqIFNjaGVtYVR5cGVMb2FkZXIgc2VhcmNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgU2NoZW1hVHlwZUxvYWRlcnMKKyAgICAgKiBpbiBvcmRlciBmcm9tIGZpcnN0IHRvIGxhc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlTG9hZGVyIHR5cGVMb2FkZXJVbmlvbihTY2hlbWFUeXBlTG9hZGVyW10gdHlwZUxvYWRlcnMpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGVMb2FkZXJzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTG9hZGVyc1swXTsKKworICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlTG9hZGVyKV90eXBlTG9hZGVyQnVpbGRlck1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHt0eXBlTG9hZGVycywgbnVsbCwgbnVsbH0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGw6IHZlcmlmeSB0aGF0IHZlcnNpb24gb2YgeGJlYW4uamFyIGlzIGNvcnJlY3QiKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlLmdldENhdXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFNjaGVtYVR5cGVMb2FkZXIgdGhhdCBzZWFyY2hlcyBmb3IgY29tcGlsZWQgc2NoZW1hIHR5cGVzCisgICAgICogaW4gdGhlIGdpdmVuIENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2NoZW1hVHlwZUxvYWRlciB0eXBlTG9hZGVyRm9yQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZUxvYWRlcilfdHlwZUxvYWRlckJ1aWxkZXJNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bnVsbCwgbnVsbCwgbG9hZGVyfSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgY2F1c2VkRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGFjY2VzcyB0byBTY2hlbWFUeXBlTG9hZGVySW1wbDogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24oIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpLCBlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBTY2hlbWFUeXBlIGZyb20gYSBjb3JyZXNwb25kaW5nIFhtbE9iamVjdCBzdWJjbGFzcywKKyAgICAgKiBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlIHR5cGVGb3JDbGFzcyhDbGFzcyBjKQorICAgIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCAhWG1sT2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYykpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmllbGQgdHlwZUZpZWxkID0gYy5nZXRGaWVsZCgidHlwZSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodHlwZUZpZWxkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAoU2NoZW1hVHlwZSl0eXBlRmllbGQuZ2V0KG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFUeXBlIGdldE5vVHlwZSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChTY2hlbWFUeXBlKV9nZXROb1R5cGVNZXRob2QuaW52b2tlKG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGNhdXNlZEV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY2Nlc3MgdG8gU2NoZW1hVHlwZUxvYWRlckltcGwuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKTogdmVyaWZ5IHRoYXQgdmVyc2lvbiBvZiB4YmVhbi5qYXIgaXMgY29ycmVjdCIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBjYXVzZWRFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSksIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgU2NoZW1hVHlwZSBvYmplY3QgZ2l2ZW4gdG8gYW4gWG1sT2JqZWN0IGluc3RhbmNlIHdoZW4KKyAgICAgKiBubyB0eXBlIGNhbiBiZSBkZXRlcm1pbmVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBOT19UWVBFIGlzIHRoZSB1bml2ZXJzYWwgZGVyaXZlZCB0eXBlLiAgVGhhdCBpcywgaXQgaXMKKyAgICAgKiBkZXJpdmVkIGZyb20gYWxsIG90aGVyIHNjaGVtYSB0eXBlcywgYW5kIG5vIGluc3RhbmNlcyBvZiB0aGUKKyAgICAgKiBOT19UWVBFIGFyZSB2YWxpZC4gKEl0IGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSBhbnlUeXBlLAorICAgICAqIHdoaWNoIGlzIHRoZSB1bml2ZXJzYWwgYmFzZSB0eXBlIGZyb20gd2hpY2ggYWxsIG90aGVyIHR5cGVzCisgICAgICogY2FuIGJlIGRlcml2ZWQsIGFuZCBvZiB3aGljaCBhbGwgaW5zdGFuY2VzIGFyZSB2YWxpZC4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTY2hlbWFUeXBlIE5PX1RZUEUgPSBnZXROb1R5cGUoKTsKKworICAgIHByaXZhdGUgWG1sQmVhbnMgKCApIHsgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJvb2xlYW4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllYzkxOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxCb29sZWFuLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYm9vbGVhbiI+eHM6Ym9vbGVhbjwvYT4gdHlwZS4KKyAqIDxwPgorICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBKYXZhIGJvb2xlYW4uIAorICovIAorcHVibGljIGludGVyZmFjZSBYbWxCb29sZWFuIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2Jvb2xlYW4iKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBib29sZWFuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCb29sZWFuVmFsdWV9CisgICAgICoqLworICAgIGJvb2xlYW4gYm9vbGVhblZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYm9vbGVhbgorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjc2V0Qm9vbGVhblZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChib29sZWFuIHYpOworCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGJvb2xlYW4gKi8KKyAgICBib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBib29sZWFuICovCisgICAgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2KTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sQm9vbGVhbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQm9vbGVhbn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sQm9vbGVhbn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sQm9vbGVhbn0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDt0cnVlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O3RydWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJvb2xlYW59IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQm9vbGVhbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQm9vbGVhbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJvb2xlYW4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJvb2xlYW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCb29sZWFuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCb29sZWFufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCb29sZWFuIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQm9vbGVhbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQnl0ZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJ5dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmViOTYxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEJ5dGUuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNieXRlIj54czpieXRlPC9hPiB0eXBlLgorICogPHA+CisgKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIEphdmEgYnl0ZS4gCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbEJ5dGUgZXh0ZW5kcyBYbWxTaG9ydAoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2J5dGUiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRCeXRlVmFsdWV9CisgICAgICoqLworICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI3NldEJ5dGVWYWx1ZX0KKyAgICAgKiovCisgICAgcHVibGljIHZvaWQgc2V0KGJ5dGUgcyk7CisKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSAqLworICAgIHB1YmxpYyBieXRlIGdldEJ5dGVWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBieXRlICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKGJ5dGUgcyk7CisgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxCeXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxCeXRlfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxCeXRlfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxCeXRlfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEJ5dGV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sQnl0ZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEJ5dGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxCeXRlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxCeXRlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxDYWxlbmRhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmNlMjgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ2FsZW5kYXIuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCisvKioKKyAqIEFuIFhNTCBTY2hlbWEgY29tcGF0aWJsZSBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIEdyZWdvcmlhbkNhbGVuZGFyfS4KKyAqIFhtbENhbGVuZGFyIG1vZGlmaWVzIHNldmVyYWwga2V5IGRldGFpbHMgaW4gdGhlIGJlaGF2aW9yIG9mCisgKiBHcmVnb3JpYW5DYWxlbmRhciB0byBtYWtlIGl0IG1vcmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIFhNTCBkYXRlcy4KKyAqIDxwPgorICogSXQgaXMgZWFzeSB0byBjb252ZXJ0IGJldHdlZW4gWG1sQ2FsZW5kYXIgYW5kIHtAbGluayBHRGF0ZX0sIG9yIHRvCisgKiBwYXJzZSBvciBlbWl0IGFuIFhtbENhbGVuZGFyIHVzaW5nIGEgc3RhbmRhcmQgWE1MIFNjaGVtYQorICogbGV4aWNhbCByZXByZXNlbnRhdGlvbi4KKyAqIDxvbD4KKyAqIDxsaT4KKyAqIFRvIG1hdGNoIFhNTCBTY2hlbWEgZGF0ZXMsIHRoaXMgWG1sQ2FsZW5kYXIgaXMgYSBmdWxseSBwcm9sZXB0aWMKKyAqIEdyZWdvcmlhbiBjYWxlbmRhciBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGF0IEdyZWdvcmlhbiBjYWxlbmRhcgorICogcnVsZXMgYXJlIGFwcGxpZWQgYmFja3dhcmRzIGluIHRpbWUgYXMgaWYgdGhleSBoYWQgYWx3YXlzIGJlZW4gaW4KKyAqIGVmZmVjdCwgYWN0dWFsIGhpc3RvcmljYWwgY2lyY3Vtc3RhbmNlcyBjb25jZXJuaW5nIHRoZSBvYnNlcnZhbmNlCisgKiBvZiB0aGUgMTU4MiBkZWNyZWUgb2YgUG9wZSBHcmVnb3J5IFhJSUkgbm90d2l0aHN0YW5kaW5nLgorICogPC9saT4KKyAqIDxsaT4KKyAqIEluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IHBhcnRpYWxseS1zcGVjaWZpZWQgZGF0ZXMgZm9yIFhNTCBTY2hlbWEsCisgKiB0aGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgc3RhYmxlIGdldChmaWVsZCkgbWV0aG9kCisgKiB0aGF0IGRvZXMgbm90IG1vZGlmeSB0aGUgaW5zdGFuY2UgaWYgeW91IGFyZSBhY2Vzc2luZyBhIGZpZWxkIHJpZ2h0CisgKiBhZnRlciBpdCB3YXMgZXhwbGljaXRseSBzZXQ6IGEgc2V0IGZvbGxvd2VkIGJ5IGEgZ2V0IHdpbGwgYWx3YXlzCisgKiByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYW5kIHdpbGwgbm90IGZpbGwgaW4gYW55IG90aGVyIGZpZWxkcy4gSG93ZXZlciwKKyAqIGlmIHlvdSBnZXQgYSBmaWVsZCB0aGF0IHdhcyBub3QgZXhwbGljaXRseSBzZXQsIHRoZW4gYWxsIHRoZSBmaWVsZHMKKyAqIGFyZSBzdGlsbCBhdXRvbWF0aWNhbGx5IGZpbGxlZCBhbmQgbm9ybWFsaXplZCBmb3IgeW91LCBqdXN0IGxpa2UgYQorICogcmVndWxhciBHcmVnb3JpYW5DYWxlbmRhci4gSWYgeW91IHdpc2ggdG8gZm9yY2UgdGhlIGNvbXBsZXRpb24gYW5kCisgKiBkZWZhdWx0aW5nIG9mIGFsbCB0aGUgZmllbGRzICh3aXRob3V0IGh1bnRpbmcgdG8gZ2V0IG9uZSB0aGF0IGhhcHBlbnMKKyAqIHRvIGJlIHVuc2V0KSwgeW91IGNhbiBhbHdheXMgZG8gc28gYnkgY2FsbGluZyBnZXRUaW1lKCkuCisgKiA8L2xpPgorICogPGxpPgorICogV2hlbiBhIHllYXIgaXMgdW5zcGVjaWZpZWQgYW5kIG5lZWRzIHRvIGJlIGZpbGxlZCBpbiBhdXRvbWF0aWNhbGx5CisgKiAoZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBhIC5nZXQgb3IgLmdldFRpbWUgbWV0aG9kIGFzIGRpc2N1c3NlZCBhYm92ZSksCisgKiB0aGUgeWVhciBpcyBkZWZhdWx0ZWQgdG8geWVhciAwIChhbHNvIGtub3duIGFzIDEgQkMpLiAgVGhpcyBpcyBkaWZmZXJlbnQKKyAqIGZyb20ge0BsaW5rIEdyZWdvcmlhbkNhbGVuZGFyfSwgd2hpY2ggY2hvb3NlcyAxOTcwLiBUaGUgcmVhc29uIDAgaXMgcHJlZmVyYWJsZQorICogaXMgdGhhdCBpdCBpcyBhIGxlYXAgeWVhciBhbmQgc28gaXQgcGVybWl0cyB0aGUgZGF0ZSAtLTItMjkgdG8gYmUgc3BlY2lmaWVkCisgKiBzdGFibHkuIEEgZGlmZmVyZW50IGRlZmF1bHQgeWVhciBjYW4gYmUgY2hvc2VuIHZpYSB0aGUgc3RhdGljIG1ldGhvZAorICoge0BsaW5rICNzZXREZWZhdWx0WWVhcihpbnQpIFhtbENhbGVuZGFyLnNldERlZmF1bHRZZWFyKCl9LCBvciBieSBzZXR0aW5nIHRoZSAKKyAqIHN5c3RlbSBwcm9wZXJ0eSAidXNlci5kZWZhdWx0eWVhciIuIElmIHlvdSBkbyBjaGFuZ2UgdGhpcyB2YWx1ZSwgeW91IHNob3VsZCAKKyAqIHBpY2sgYW5vdGhlciBsZWFwIHllYXIgc3VjaCBhcyAyMDAwIGFuZCBhdm9pZCBub24tbGVhcCB5ZWFycyBzdWNoIGFzIDE5MDAuCisgKiA8L2xpPgorICogPGxpPgorICogV2hlbiBjb25zdHJ1Y3RpbmcgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhbiBYTUwgU2NoZW1hCisgKiBmb3JtYXR0ZWQgZGF0ZSBvciB0aW1lIHN0cmluZyBvciBHRGF0ZSBvYmplY3QsIHRoZSB0aW1lem9uZQorICogZm9yIHRoZSBjYWxlbmRhciBpcyB0YWtlbiBmcm9tIHRoZSBzdHJpbmcgaWYgaXQgaXMgcHJlc2VudCwgb3IKKyAqIHRha2VuIHRvIGJlIHtAbGluayBqYXZhLnV0aWwuVGltZVpvbmUjZ2V0RGVmYXVsdCgpIFRpbWVab25lLmdldERlZmF1bHQoKX0gaWYgbm90LgorICogPHA+CisgKiAgICAgRm9yIGV4YW1wbGUsIHRoZSBYTUwgdGltZXpvbmUgIloiIGlzIHRyYW5zbGF0ZWQgdG8gIkdNVCI7CisgKiAgICAgdGhlIFhNTCB0aW1lem9uZSAiKzA1OjAwIiBpcyB0cmFuc2xhdGVkIHRvICJHTVQrMDU6MDAiLgorICogPC9wPgorICogPC9saT4KKyAqIDxsaT4KKyAqIEZpbmFsbHksIHRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSBTdHJpbmcgY29uc3RydWN0b3IgYW5kIGEKKyAqIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgY29tcGx5IHdpdGggdGhlIFhNTCBTY2hlbWEgY29udmVudGlvbnMKKyAqIGZvciBmb3JtYXR0aW5nIGEgZGF0ZS4gSWYgb25seSBhIHN1YnNldCBvZiBmaWVsZHMgaGF2ZSBiZWVuCisgKiBleHBsaWNpdGx5IHNldCwgdG9TdHJpbmcoKSBwcm9kdWNlcyBhIHN0cmluZyB3aXRoIHRoZSBwcm9wZXIgc3Vic2V0CisgKiBvZiBpbmZvcm1hdGlvbi4KKyAqIDwvbGk+CisgKiA8L29sPgorICovIAorcHVibGljIGNsYXNzIFhtbENhbGVuZGFyIGV4dGVuZHMgR3JlZ29yaWFuQ2FsZW5kYXIKK3sKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZvciBhIHN0YW5kYXJkIFhNTAorICAgICAqIHNjaGVtYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCisgICAgICogCisgICAgICogVGhlIHBhcnNlciBhY2NlcHRzIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisgICAgICogCisgICAgICogWVlZWS1NTS1ERFRoaDptbTpzcyAgICAgICAgICAtIGRhdGVUaW1lCisgICAgICogWVlZWS1NTS1ERCAgICAgICAgICAgICAgICAgICAtIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGhoOm1tOnNzICAgICAgICAgIC0gdGltZQorICAgICAqIFlZWVkgICAgICAgICAgICAgICAgICAgICAgICAgLSBnWWVhcgorICAgICAqICAgIC0tTU0gICAgICAgICAgICAgICAgICAgICAgLSBnTW9udGgKKyAgICAgKiAgICAgIC0tLUREICAgICAgICAgICAgICAgICAgIC0gZ0RheQorICAgICAqIAorICAgICAqIFRoZSBwYXJzZXIgYWN0dWFsbHkgYWNjZXB0cyBhbGwgMTYgY29tYmluYXRpb25zIG9mIHN1YnNldHMgb2YKKyAgICAgKiBmaWVsZHMgKFksIE0sIEQsIFQpIHVzaW5nIHRoZSBzYW1lIHNjaGVtZSwgZXZlbiBmb3IgY29tYmluYXRpb25zCisgICAgICogdGhhdCBhcmUgbm90IGRlZmluZWQgYXMgdHlwZXMgaW4gdGhlIHNjaGVtYSBzcGVjLCBzdWNoIGFzCisgICAgICogeWVhciwgZGF5LCBhbmQgdGltZToKKyAgICAgKiAKKyAgICAgKiBZWVlZLS1ERFRoaDptbTpzcyAgICAgICAgICAgIC0gW2V2ZXJ5dGhpbmcgYnV0IG1vbnRoIHNwZWNpZmllZF0KKyAgICAgKiAKKyAgICAgKiBJbiB0aGUgc3RyaW5nLCBlYWNoIGZpZWxkIG11c3QgYmUgcGFkZGVkIHRvIGl0cyBmdWxsIHdpZHRoLCBmb3IKKyAgICAgKiBleGFtcGxlLCBKYW51YXJ5IG11c3QgYmUgLS0wMSwgbm90IGp1c3QgLS0xLgorICAgICAqIAorICAgICAqIEluIHBhcnRpY3VsYXIsIGEgeWVhciBtdXN0IGJlIHBhZGRlZCB0byBhdCBsZWFzdCBmb3VyIGRpZ2l0cywgc28KKyAgICAgKiAiOTgiIGlzIG5vdCBhIHZhbGlkIHllYXIsIGFsdGhvdWdoICIxOTk4IiBhbmQgIjAwOTgiIGFyZSBib3RoIHZhbGlkCisgICAgICogeWVhcnMsIHVuYW1iaWd1b3VzbHkgMTkgY2VudHVyaWVzIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIuICBBIHllYXIKKyAgICAgKiBtYXkgYWxzbyBiZSBwcmVjZWRlZCBieSBhIG1pbnVzIHN5bWJvbDogMDAwMCBpcyAxIEJDIGFuZCAtMDAwMSBpcworICAgICAqIDIgQkMuCisgICAgICoKKyAgICAgKiBGaW5hbGx5IGEgdGltZXpvbmUgaXMgYWx3YXlzIGFsbG93ZWQgKHlldCBvcHRpb25hbCkgYXQgdGhlIGVuZC4KKyAgICAgKiBUaW1lem9uZXMgbXVzdCBiZSBlaXRoZXIgIloiIChVVEMsIHdoaWNoIHdlIHRyYW5zbGF0ZSB0byBHTVQpLAorICAgICAqIG9yIHNpbXBsZSBvZmZzZXRzIGZyb20gVVRDIGluIHRoZSByYW5nZSAiLTE0OjAwIiB0byAiKzE0OjAwIiwKKyAgICAgKiBmb3IgZXhhbXBsZTogIjE0OjMwOjAwLTA1OjAwIiBzcGVjaWZpZXMgMjozMCBQTSBpbiB0aGUKKyAgICAgKiBhZnRlcm5vb24gYXQgVVRDLTA1OjAwLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBFU1QuCisgICAgICogCisgICAgICogSWYgYSB0aW1lem9uZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBUaW1lWm9uZSBpcyB1c2VkLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoU3RyaW5nIHhtbFNjaGVtYURhdGVTdHJpbmcpCisgICAgeworICAgICAgICB0aGlzKG5ldyBHRGF0ZSh4bWxTY2hlbWFEYXRlU3RyaW5nKSk7IC8vIHVzZSBHRGF0ZSB0byBwYXJzZQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIGZyb20gYSBHRGF0ZS4KKyAgICAgKiAKKyAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGNvbXBsZXRlZCwgeW91IGNhbiByb3VuZC10cmlwIHRvIGFuCisgICAgICogZXF1aXZhbGVudCBHRGF0ZSBieSB3cml0aW5nICJuZXcgR0RhdGUobmV3IFhtbENhbGVuZGFyKGdkYXRlKSkiLgorICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBhY2Nlc3MgYW55IG9mIHRoZSB1bnNldCBmaWVsZHMgb2YgdGhlIGNhbGVuZGFyLCBhbGwKKyAgICAgKiB0aGUgZmllbGRzIHdpbGwgYmUgYXV0b21hdGljYWxseSBmaWxsZWQgaW4sIHNvIHBhcnRpYWwgZGF0ZXMKKyAgICAgKiB3aXRob3V0IHRpbWV6b25lcyBvciBvdGhlciBmaWVsZHMgd2lsbCBub3Qgcm91bmQtdHJpcCBhZnRlciBhY2Nlc3MuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxDYWxlbmRhcihHRGF0ZVNwZWNpZmljYXRpb24gZGF0ZSkKKyAgICB7CisgICAgICAgIHRoaXMoR0RhdGUudGltZVpvbmVGb3JHRGF0ZShkYXRlKSwgZGF0ZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgWG1sQ2FsZW5kYXIoVGltZVpvbmUgdHosIEdEYXRlU3BlY2lmaWNhdGlvbiBkYXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIodHopOworICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYworICAgICAgICBjbGVhcigpOworICAgICAgICAKKyAgICAgICAgaWYgKGRhdGUuaGFzWWVhcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeSA9IGRhdGUuZ2V0WWVhcigpOworICAgICAgICAgICAgaWYgKHkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkFEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7CisgICAgICAgICAgICAgICAgeSA9IDEgLSB5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0KENhbGVuZGFyLllFQVIsIHkpOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRlLmhhc01vbnRoKCkpCisgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuTU9OVEgsIGRhdGUuZ2V0TW9udGgoKSAtIDEpOyAvLyBub3RlISEKKyAgICAgICAgaWYgKGRhdGUuaGFzRGF5KCkpCisgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXRlLmdldERheSgpKTsKKyAgICAgICAgaWYgKGRhdGUuaGFzVGltZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGRhdGUuZ2V0SG91cigpKTsKKyAgICAgICAgICAgIHNldChDYWxlbmRhci5NSU5VVEUsIGRhdGUuZ2V0TWludXRlKCkpOworICAgICAgICAgICAgc2V0KENhbGVuZGFyLlNFQ09ORCwgZGF0ZS5nZXRTZWNvbmQoKSk7CisgICAgICAgICAgICBpZiAoZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPiAwKQorICAgICAgICAgICAgICAgIHNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgZGF0ZS5nZXRNaWxsaXNlY29uZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0ZS5oYXNUaW1lWm9uZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIGRhdGUuZ2V0VGltZVpvbmVTaWduKCkgKiAxMDAwICogNjAgKiAoZGF0ZS5nZXRUaW1lWm9uZUhvdXIoKSAqIDYwICsgZGF0ZS5nZXRUaW1lWm9uZU1pbnV0ZSgpKSk7CisgICAgICAgICAgICBzZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCwgMCk7IC8vIG5vdGUhISAgaWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiBHcmVnb3JpYW5DYWxlbmRhciB3aWxsIHBpY2sgdXAgRFNUIGZyb20gdGhlIHRpbWUgem9uZQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgZnJvbSBhIERhdGUuCisgICAgICogCisgICAgICogVGhlIGRlZmF1bHQgVGltZVpvbmUgaXMgdXNlZCBmb3IgY29tcHV0aW5nIHRoZSB2YXJpb3VzIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sQ2FsZW5kYXIoRGF0ZSBkYXRlKQorICAgIHsKKyAgICAgICAgdGhpcyhUaW1lWm9uZS5nZXREZWZhdWx0KCksIG5ldyBHRGF0ZShkYXRlKSk7CisgICAgICAgIGNvbXBsZXRlKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sQ2FsZW5kYXIgd2l0aCB0aGUgc3BlY2lmaWVkIHllYXIsIG1vbnRoLCBkYXksCisgICAgICogaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIGFuZCBvcHRpb25hbCBmcmFjdGlvbmFsIHNlY29uZHMsIGluCisgICAgICogdGhlIGRlZmF1bHQgdGltZXpvbmUuCisgICAgICovCisgICAgcHVibGljIFhtbENhbGVuZGFyKAorICAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgICBpbnQgbW9udGgsCisgICAgICAgICAgICBpbnQgZGF5LAorICAgICAgICAgICAgaW50IGhvdXIsCisgICAgICAgICAgICBpbnQgbWludXRlLAorICAgICAgICAgICAgaW50IHNlY29uZCwKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24pCisgICAgeworICAgICAgICB0aGlzKFRpbWVab25lLmdldERlZmF1bHQoKSwgbmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbENhbGVuZGFyIHdpdGggdGhlIHNwZWNpZmllZCB5ZWFyLCBtb250aCwgZGF5LAorICAgICAqIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgb3B0aW9uYWwgZnJhY3Rpb25hbCBzZWNvbmRzLCBpbgorICAgICAqIHRoZSBzcGVjaWZpZWQgdGltZXpvbmUuCisgICAgICovCisgICAgcHVibGljIFhtbENhbGVuZGFyKAorICAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgICBpbnQgbW9udGgsCisgICAgICAgICAgICBpbnQgZGF5LAorICAgICAgICAgICAgaW50IGhvdXIsCisgICAgICAgICAgICBpbnQgbWludXRlLAorICAgICAgICAgICAgaW50IHNlY29uZCwKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgZnJhY3Rpb24sCisgICAgICAgICAgICBpbnQgdHpTaWduLAorICAgICAgICAgICAgaW50IHR6SG91ciwKKyAgICAgICAgICAgIGludCB0ek1pbnV0ZSkKKyAgICB7CisgICAgICAgIHRoaXMobmV3IEdEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiwgdHpTaWduLCB0ekhvdXIsIHR6TWludXRlKSk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gdGltZSBmaWVsZC4KKyAgICAgKiAKKyAgICAgKiBVbmxpa2UgdGhlIEdyZWdvcmlhbkNhbGVuZGFyIGltcGxlbWVudGF0aW9uLCB0aGUgZ2V0KCkgZG9lcyBub3QKKyAgICAgKiBmb3JjZSBhIGNvbXBsZXRlIG9mIGFsbCBmaWVsZHMuICBJZiB5b3Ugd2lzaCB0byBmb3JjZSBhIGNvbXBsZXRpb24KKyAgICAgKiBvZiBhbGwgdGhlIGZpZWxkcywgY2FsbCBnZXRUaW1lKCkgZmlyc3QuCisgICAgICovCisgICAgcHVibGljIGludCBnZXQoaW50IGZpZWxkKQorICAgIHsKKyAgICAgICAgaWYgKCFpc1NldChmaWVsZCkgfHwgaXNUaW1lU2V0KQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldChmaWVsZCk7IC8vIGZvcmNlcyBhIGNvbXBsZXRlCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEdldChmaWVsZCk7IC8vIGRvZXMgbm90IGZvcmNlIGEgY29tcGxldGUuCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbnN0YW5jZSB3aXRoIG5vIGZpZWxkcyBzZXQuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxDYWxlbmRhcigpCisgICAgeworICAgICAgICBzZXRHcmVnb3JpYW5DaGFuZ2UoX2JlZ2lubmluZ09mVGltZSk7IC8vIHByb2xlcHRpYworICAgICAgICBjbGVhcigpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVmYXVsdFllYXIgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ERUZBVUxUX1lFQVIgPSAwOyAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHllYXIgdGhhdCBpcyB1c2VkIHdoZW4gbm8geWVhciBpcyBzcGVjaWZpZWQuCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRZZWFyKCkKKyAgICB7CisgICAgICAgIGlmIChkZWZhdWx0WWVhciA9PSBJbnRlZ2VyLk1JTl9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHllYXJzdHJpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGVmYXVsdHllYXIiKTsKKyAgICAgICAgICAgICAgICBpZiAoeWVhcnN0cmluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IEludGVnZXIucGFyc2VJbnQoeWVhcnN0cmluZyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0WWVhciA9IERFRkFVTFRfREVGQVVMVF9ZRUFSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlZmF1bHRZZWFyID0gREVGQVVMVF9ERUZBVUxUX1lFQVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRZZWFyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHllYXIgdG8gYmUgdXNlZCB3aGVuIG5vIHllYXIgaXMgc3BlY2lmaWVkLgorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdFllYXIoaW50IHllYXIpCisgICAgeworICAgICAgICBkZWZhdWx0WWVhciA9IHllYXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyBHcmVnb3JpYW5DYWxlbmRhci5jb21wdXRlVGltZSB0byBhcHBseSBhIGRpZmZlcmVudAorICAgICAqIGRlZmF1bHQgeWVhci4gIChJdCBtdXN0IGJlIGEgbGVhcCB5ZWFyLikKKyAgICAgKi8gCisgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVRpbWUoKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiB1bnNldFllYXIgPSAhaXNTZXQoWUVBUik7CisgICAgICAgIGlmICh1bnNldFllYXIpCisgICAgICAgICAgICBzZXQoWUVBUiwgZ2V0RGVmYXVsdFllYXIoKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5jb21wdXRlVGltZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVuc2V0WWVhcikKKyAgICAgICAgICAgICAgICBjbGVhcihZRUFSKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRGF0ZSBfYmVnaW5uaW5nT2ZUaW1lID0gbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpOworICAgIAorICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgWG1sQ2FsZW5kYXIgdXNpbmcgYSBzdGFuZGFyZCBYTUwgU2NoZW1hCisgICAgICogZm9ybWF0LCBhcyBkZXNjcmliZWQgaW4gWG1sQ2FsZW5kYXIoU3RyaW5nIHMpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChuZXcgR0RhdGUodGhpcykpLnRvU3RyaW5nKCk7IC8vIHVzZSBHRGF0ZSB0byBwcmludAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEN1cnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNGRhMzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sQ3Vyc29yLmphdmEKQEAgLTAsMCArMSwxNzcyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcG9zaXRpb24gYmV0d2VlbiB0d28gbG9naWNhbCB0b2tlbnMgaW4gYW4gWE1MIGRvY3VtZW50LiAKKyAqIAorICogVGhlIHRva2VucyB0aGVtc2VsdmVzIGFyZSBub3QgZXhwb3NlZCBhcyBvYmplY3RzLCBidXQgdGhlaXIgdHlwZSBhbmQgcHJvcGVydGllcworICogYXJlIGRpc2NvdmVyYWJsZSB0aHJvdWdoIG1ldGhvZHMgb24gdGhlIGN1cnNvci4gIEluIHBhcnRpY3VsYXIsIHRoZSBnZW5lcmFsCisgKiBjYXRlZ29yeSBvZiB0b2tlbiBpcyByZXByZXNlbnRlZCBieSBhIHtAbGluayBYbWxDdXJzb3IuVG9rZW5UeXBlIFRva2VuVHlwZX0uPGJyLz48YnIvPgorICogCisgKiBZb3UgdXNlIGFuIFhtbEN1cnNvciBpbnN0YW5jZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGFuZCBtYW5pcHVsYXRlIGFuIFhNTCAKKyAqIGluc3RhbmNlIGRvY3VtZW50LiAKKyAqIE9uY2UgeW91IG9idGFpbiBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gY3JlYXRlIGEgY3Vyc29yIHRvIHJlcHJlc2VudCAKKyAqIGEgc3BlY2lmaWMgcGxhY2UgaW4gdGhlIFhNTC4gQmVjYXVzZSB5b3UgY2FuIHVzZSBhIGN1cnNvciB3aXRoIG9yIAorICogd2l0aG91dCBhIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwsIGN1cnNvcnMgYXJlIGFuIGlkZWFsIAorICogd2F5IHRvIGhhbmRsZSBYTUwgd2l0aG91dCBhIHNjaGVtYS4gWW91IGNhbiBjcmVhdGUgYSBuZXcgY3Vyc29yIGJ5CisgKiBjYWxsaW5nIHRoZSB7QGxpbmsgWG1sVG9rZW5Tb3VyY2UjbmV3Q3Vyc29yKCkgbmV3Q3Vyc29yfSBtZXRob2QgCisgKiBleHBvc2VkIGJ5IGFuIG9iamVjdCByZXByZXNlbnRpbmcKKyAqIHRoZSBYTUwsIHdoZXRoZXIgaXQgd2FzIHBhcnNlZCBpbnRvIGEgc3Ryb25nIHR5cGUgY29tcGlsZWQgZnJvbSAKKyAqIHNjaGVtYSBvciBhbiB7QGxpbmsgWG1sT2JqZWN0IFhtbE9iamVjdH0gKGFzIGluIHRoZSBuby1zY2hlbWEgY2FzZSkuPGJyLz48YnIvPgorICogCisgKiBXaXRoIGFuIFhtbEN1cnNvciwgeW91IGNhbiBhbHNvOiA8YnIvPjxici8+CisgKiAKKyAqIDx1bD4KKyAqIDxsaT5FeGVjdXRlIFhRdWVyeSBhbmQgWFBhdGggZXhwcmVzc2lvbnMgYWdhaW5zdCB0aGUgWE1MIHdpdGggdGhlCisgKiBleGVjUXVlcnkgYW5kIHNlbGVjdFBhdGggbWV0aG9kcy48L2xpPgorICogCisgKiA8bGk+RWRpdCBhbmQgcmVzaGFwZSB0aGUgZG9jdW1lbnQgYnkgaW5zZXJ0aW5nLCBtb3ZpbmcsIGNvcHlpbmcsIGFuZCByZW1vdmluZworICogWE1MLjwvbGk+CisgKiAKKyAqIDxsaT5JbnNlcnQgYm9va21hcmtzIHRoYXQgInN0aWNrIiB0byB0aGUgWE1MIGF0IHRoZSBjdXJzb3IncworICogcG9zaXRpb24gZXZlbiBpZiB0aGUgY3Vyc29yIG9yIFhNTCBtb3Zlcy48L2xpPgorCisgKiA8bGk+R2V0IGFuZCBzZXQgdmFsdWVzIGZvciBjb250YWluZXJzIChlbGVtZW50cyBhbmQgd2hvbGUgZG9jdW1lbnRzKSwKKyAqIGF0dHJpYnV0ZXMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBhbmQgY29tbWVudHMuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEEgY3Vyc29yIG1vdmVzIHRocm91Z2ggWE1MIGJ5IG1vdmluZyBwYXN0IHRva2Vucy4gQQorICogdG9rZW4gcmVwcmVzZW50cyBhIGNhdGVnb3J5IG9mIFhNTCBtYXJrdXAsIHN1Y2ggYXMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQsIAorICogaXRzIGVuZCwgYW4gYXR0cmlidXRlLCBjb21tZW50LCBhbmQgc28gb24uIFhtbEN1cnNvciBtZXRob2RzIHN1Y2ggYXMKKyAqIHRvTmV4dFRva2VuLCB0b05leHRTaWJsaW5nLCB0b1BhcmVudCwgYW5kIHNvIG9uIG1vdmUgdGhlIGN1cnNvciAKKyAqIGFtb25nIHRva2Vucy4gRWFjaCB0b2tlbidzIGNhdGVnb3J5IGlzIG9mIGEgcGFydGljdWxhciA8ZW0+dHlwZTwvZW0+LCByZXByZXNlbnRlZCAKKyAqIGJ5IG9uZSBvZiB0aGUgbmluZSB0eXBlcyBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgWG1sQ3Vyc29yLlRva2VuVHlwZSBUb2tlblR5cGV9IGNsYXNzLiA8YnIvPjxici8+CisgKiAKKyAqIFdoZW4geW91IGdldCBhIG5ldyBjdXJzb3IgZm9yIGEgd2hvbGUgaW5zdGFuY2UgZG9jdW1lbnQsIHRoZSBjdXJzb3IgaXMKKyAqIGludGlhbGx5IGxvY2F0ZWQgYmVmb3JlIHRoZSBTVEFSVERPQyB0b2tlbi4gVGhpcyB0b2tlbiwgd2hpY2ggaGFzIG5vIGFuYWxvZ3kKKyAqIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbiwgaXMgcHJlc2VudCBpbiB0aGlzIGxvZ2ljYWwgbW9kZWwgb2YgWE1MCisgKiBzbyB0aGF0IHlvdSBtYXkgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZG9jdW1lbnQgYXMgYSB3aG9sZQorICogYW5kIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudC4gVGVybWluYXRpbmcgdGhlIGRvY3VtZW50IGlzIGFuIEVORERPQworICogdG9rZW4uIFRoaXMgdG9rZW4gaXMgYWxzbyBub3QgcGFydCBvZiB0aGUgWE1MIHNwZWNpZmljYXRpb24uIEEgY3Vyc29yIAorICogbG9jYXRlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyB0b2tlbiBpcyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LiAKKyAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGFmdGVyIHRoZSBFTkRET0MgdG9rZW4uIAorICogVGh1cywgdGhlIFNUQVJURE9DIGFuZCBFTkRET0MgdG9rZW5zIGFyZSBlZmZlY3RpdmVseSAiYm9va2VuZHMiIGZvciB0aGUgY29udGVudCBvZiAKKyAqIHRoZSBkb2N1bWVudC48YnIvPjxici8+CisgKiAKKyAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBYTUwsIGlmIHlvdSB3ZXJlIHRoZSBuYXZpZ2F0ZSBhIGN1cnNvcgorICogdGhyb3VnaCB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRvTmV4dFRva2VuKCksIHRoZSBsaXN0IG9mIHRva2VuIHR5cGVzIHRoYXQgCisgKiBmb2xsb3dzIHJlcHJlc2VudHMgdGhlIHRva2VuIHNlcXVlbmNlIHlvdSB3b3VsZCBlbmNvdW50ZXIuIDxici8+PGJyLz4KKyAqIAorICogPHByZT4KKyAqICZsdDtzYW1wbGUgeD0neScmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O2ZvbyZsdDsvdmFsdWUmZ3Q7CisgKiAmbHQ7L3NhbXBsZSZndDsKKyAqIDwvcHJlPgorICogCisgKiBTVEFSVERPQyA8YnIvPgorICogU1RBUlQgKHNhbXBsZSkgPGJyLz4KKyAqIEFUVFIgKHg9J3knKSA8YnIvPgorICogVEVYVCAoIlxuICAgICIpIDxici8+CisgKiBTVEFSVCAodmFsdWUpIDxici8+CisgKiBURVhUICgiZm9vIikgPGJyLz4KKyAqIEVORCAodmFsdWUpIDxici8+CisgKiBURVhUICgiXG4iKSA8YnIvPgorICogRU5EIChzYW1wbGUpPGJyLz4KKyAqIEVORERPQyA8YnIvPjxici8+CisgKgorICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0b2tlbnMgYXZhaWxhYmxlLCBoYXNOZXh0VG9rZW4oKSByZXR1cm5zCisgKiBmYWxzZSBhbmQgdG9OZXh0VG9rZW4oKSByZXR1cm5zIHRoZSBzcGVjaWFsIHRva2VuIHR5cGUgTk9ORSBhbmQgZG9lcyBub3QgbW92ZQorICogdGhlIGN1cnNvci4KKyAqIDxici8+PGJyLz4KKyAqIAorICogVGhlIHtAbGluayAjY3VycmVudFRva2VuVHlwZSgpIGN1cnJlbnRUb2tlblR5cGUoKX0gbWV0aG9kIAorICogd2lsbCByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHRva2VuIHRoYXQgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gCisgKiBZb3UgY2FuIGFsc28gdXNlIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgdGhhdCB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgCisgKiB0b2tlbiB0eXBlLiBUaGVzZSBpbmNsdWRlIHRoZSBtZXRob2RzIGlzU3RhcnQoKSwgCisgKiBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAorICogdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0b2tlbiB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvciBpcyB0aGUgdHlwZSAKKyAqIGluIHF1ZXN0aW9uLiAKKyAqIDxici8+PGJyLz4KKyAqIAorICogQSBmZXcgb3RoZXIgbWV0aG9kcyBkZXRlcm1pbmUgd2hldGhlciB0aGUgdG9rZW4gaXMgb2YgYSBraW5kIHRoYXQgbWF5IGluY2x1ZGUgCisgKiBtdWx0aXBsZSB0b2tlbiB0eXBlcy4gVGhlIGlzQW55QXR0cigpIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHJldHVybnMgdHJ1ZSBpZgorICogdGhlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3Vyc29yIGlzIGFueSBraW5kIG9mIGF0dHJpYnV0ZSwgCisgKiBpbmNsdWRpbmcgdGhvc2Ugb2YgdGhlIEFUVFIgdG9rZW4gdHlwZSBhbmQgeG1sbnMgYXR0cmlidXRlcy4KKyAqIDxici8+PGJyLz4KKyAqIAorICogTGVnaXRpbWF0ZSBzZXF1ZW5jZXMgb2YgdG9rZW5zIGZvciBhbiBYTUwgZG9jdW1lbnQgYXJlIGRlc2NyaWJlZAorICogYnkgdGhlIGZvbGxvd2luZyBCYWNrdXMtTmF1ciBGb3JtIChCTkYpOiA8YnIvPgorICogCisgKiA8cHJlPgorICogJmx0O2RvYyZndDsgOjo9IFNUQVJURE9DICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ERE9DCisgKiAmbHQ7ZWxlbWVudCZndDsgOjo9IFNUQVJUICZsdDthdHRyaWJ1dGVzJmd0OyAmbHQ7Y29udGVudCZndDsgRU5ECisgKiAmbHQ7YXR0cmlidXRlcyZndDsgOjo9ICggQVRUUiB8IE5BTUVTUEFDRSApICoKKyAqICZsdDtjb250ZW50Jmd0OyA6Oj0gKCBDT01NRU5UIHwgUFJPQ0lOU1QgfCBURVhUIHwgJmx0O2VsZW1lbnQmZ3Q7ICkgKgorICogPC9wcmU+CisgKiAKKyAqIE5vdGUgdGhhdCBhIGxlZ2l0aW1hdGUgc2VxdWVuY2UgaXMgU1RBUlRET0MgRU5ERE9DLCB0aGUgcmVzdWx0IG9mIAorICogY3JlYXRpbmcgYSBicmFuZCBuZXcgaW5zdGFuY2Ugb2YgYW4gZW1wdHkgZG9jdW1lbnQuIEFsc28gbm90ZSB0aGF0IAorICogYXR0cmlidXRlcyBtYXkgb25seSBmb2xsb3cgY29udGFpbmVyIHRva2VucyAoU1RBUlRET0Mgb3IgU1RBUlQpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sQ3Vyc29yIGV4dGVuZHMgWG1sVG9rZW5Tb3VyY2UKK3sKKyAgICAvKioKKyAgICAgKiBBbiBlbnVtZXJhdGlvbiB0aGF0IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgYW4gWE1MIHRva2VuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVG9rZW5UeXBlCisgICAgeworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKSB7IHJldHVybiBfbmFtZTsgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBvbmUgb2YgdGhlIElOVF8gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUgKCApIHsgcmV0dXJuIF92YWx1ZTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIE5vIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05PTkUgICAgICA9IDA7CisgICAgICAgIC8qKiBUaGUgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfU1RBUlRET0MgID0gMTsKKyAgICAgICAgLyoqIFRoZSBlbmQtZG9jdW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5ERE9DICAgID0gMjsKKyAgICAgICAgLyoqIFRoZSBzdGFydC1lbGVtZW50IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NUQVJUICAgICA9IDM7CisgICAgICAgIC8qKiBUaGUgZW5kLWVsZW1lbnQgdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfRU5EICAgICAgID0gNDsKKyAgICAgICAgLyoqIFRoZSB0ZXh0IHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1RFWFQgICAgICA9IDU7CisgICAgICAgIC8qKiBUaGUgYXR0cmlidXRlIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0FUVFIgICAgICA9IDY7CisgICAgICAgIC8qKiBUaGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAgU2VlIHtAbGluayAjaW50VmFsdWV9LiAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX05BTUVTUEFDRSA9IDc7CisgICAgICAgIC8qKiBUaGUgY29tbWVudCB0b2tlbi4gIFNlZSB7QGxpbmsgI2ludFZhbHVlfS4gKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9DT01NRU5UICAgPSA4OworICAgICAgICAvKiogVGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICBTZWUge0BsaW5rICNpbnRWYWx1ZX0uICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfUFJPQ0lOU1QgID0gOTsKKyAgICAgICAgCisgICAgICAgIC8qKiBUcnVlIGlmIG5vIHRva2VuLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vbmUgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBOT05FOyAgICAgIH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgc3RhcnQtZG9jdW1lbnQgdG9rZW4uICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRkb2MgICggKSB7IHJldHVybiB0aGlzID09IFNUQVJURE9DOyAgfQorICAgICAgICAvKiogVHJ1ZSBpZiBpcyBlbmQtZG9jdW1lbnQgdG9rZW4uICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kZG9jICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQzsgICAgfQorICAgICAgICAvKiogVHJ1ZSBpZiBpcyBzdGFydC1lbGVtZW50IHRva2VuLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBTVEFSVDsgICAgIH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWVsZW1lbnQgdG9rZW4uICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiB0aGlzID09IEVORDsgICAgICAgfQorICAgICAgICAvKiogVHJ1ZSBpZiBpcyB0ZXh0IHRva2VuLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RleHQgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBURVhUOyAgICAgIH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgYXR0cmlidXRlIHRva2VuLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHIgICAgICAoICkgeyByZXR1cm4gdGhpcyA9PSBBVFRSOyAgICAgIH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuLiAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZSAoICkgeyByZXR1cm4gdGhpcyA9PSBOQU1FU1BBQ0U7IH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgY29tbWVudCB0b2tlbi4gKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50ICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gQ09NTUVOVDsgICB9CisgICAgICAgIC8qKiBUcnVlIGlmIGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4uICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiB0aGlzID09IFBST0NJTlNUOyAgfQorCisgICAgICAgIC8qKiBUcnVlIGlmIGlzIHN0YXJ0LWRvY3VtZW50IG9yIHN0YXJ0LWVsZW1lbnQgdG9rZW4gKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIgKCApIHsgcmV0dXJuIHRoaXMgPT0gU1RBUlRET0MgIHx8IHRoaXMgPT0gU1RBUlQ7IH0KKyAgICAgICAgLyoqIFRydWUgaWYgaXMgZW5kLWRvY3VtZW50IG9yIGVuZC1lbGVtZW50IHRva2VuICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRmluaXNoICAgICggKSB7IHJldHVybiB0aGlzID09IEVORERPQyAgICB8fCB0aGlzID09IEVORDsgICB9CisgICAgICAgIC8qKiBUcnVlIGlmIGlzIGF0dHJpYnV0ZSBvciBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG9rZW4gKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyICAgKCApIHsgcmV0dXJuIHRoaXMgPT0gTkFNRVNQQUNFIHx8IHRoaXMgPT0gQVRUUjsgIH0KKworICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBuby10b2tlbiB0eXBlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIE5PTkUgICAgICA9IG5ldyBUb2tlblR5cGUoICJOT05FIiwgICAgICBJTlRfTk9ORSAgICAgICk7CisgICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHN0YXJ0LWRvY3VtZW50IHRva2VuIHR5cGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlRET0MgID0gbmV3IFRva2VuVHlwZSggIlNUQVJURE9DIiwgIElOVF9TVEFSVERPQyAgKTsKKyAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gc3RhcnQtZG9jdW1lbnQgdG9rZW4gdHlwZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkRET0MgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5ERE9DIiwgICAgSU5UX0VORERPQyAgICApOworICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiBzdGFydC1lbGVtZW50IHRva2VuIHR5cGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgU1RBUlQgICAgID0gbmV3IFRva2VuVHlwZSggIlNUQVJUIiwgICAgIElOVF9TVEFSVCAgICAgKTsKKyAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gZW5kLWVsZW1lbnQgdG9rZW4gdHlwZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBFTkQgICAgICAgPSBuZXcgVG9rZW5UeXBlKCAiRU5EIiwgICAgICAgSU5UX0VORCAgICAgICApOworICAgICAgICAvKiogVGhlIHNpbmdsZXRvbiB0ZXh0IHRva2VuIHR5cGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgVEVYVCAgICAgID0gbmV3IFRva2VuVHlwZSggIlRFWFQiLCAgICAgIElOVF9URVhUICAgICAgKTsKKyAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gYXR0cmlidXRlIHRva2VuIHR5cGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgQVRUUiAgICAgID0gbmV3IFRva2VuVHlwZSggIkFUVFIiLCAgICAgIElOVF9BVFRSICAgICAgKTsKKyAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRva2VuIHR5cGUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlblR5cGUgTkFNRVNQQUNFID0gbmV3IFRva2VuVHlwZSggIk5BTUVTUEFDRSIsIElOVF9OQU1FU1BBQ0UgKTsKKyAgICAgICAgLyoqIFRoZSBzaW5nbGV0b24gY29tbWVudCB0b2tlbiB0eXBlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW5UeXBlIENPTU1FTlQgICA9IG5ldyBUb2tlblR5cGUoICJDT01NRU5UIiwgICBJTlRfQ09NTUVOVCAgICk7CisgICAgICAgIC8qKiBUaGUgc2luZ2xldG9uIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdG9rZW4gdHlwZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuVHlwZSBQUk9DSU5TVCAgPSBuZXcgVG9rZW5UeXBlKCAiUFJPQ0lOU1QiLCAgSU5UX1BST0NJTlNUICApOworCisgICAgICAgIHByaXZhdGUgVG9rZW5UeXBlICggU3RyaW5nIG5hbWUsIGludCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgX3ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlYWxsb2NhdGVzIHJlc291cmNlcyBuZWVkZWQgdG8gbWFuYWdlIHRoZSBjdXJzb3IsIHJlbmRlcmluZyB0aGlzIGN1cnNvcgorICAgICAqIGlub3BlcmFibGUuIEJlY2F1c2UgY3Vyc29ycyBhcmUgbWFuYWdlZCBieSBhIG1lY2hhbmlzbSB3aGljaCBzdG9yZXMgdGhlIAorICAgICAqIFhNTCwgc2ltcGx5IGxldHRpbmcgYSBjdXJzb3IgZ28gb3V0IG9mIHNjb3BlIGFuZCBoYXZpbmcgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCisgICAgICogYXR0ZW1wdCB0byByZWNsYWltIGl0IG1heSBub3QgcHJvZHVjZSBkZXNpcmFibGUgcGVyZm9ybWFuY2UuPGJyLz48YnIvPgorICAgICAqCisgICAgICogU28sIGV4cGxpY2l0bHkgZGlzcG9zaW5nIGEgY3Vyc29yIGFsbG93cyB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgorICAgICAqIHRvIHJlbGVhc2UgaXRzIHJlc3BvbnNpYmlsaXR5IG9mIG1haW50YWluaW5nIGl0cyBwb3NpdGlvbi48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBBZnRlciBhIGN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgbWF5IG5vdCBiZSB1c2VkIGFnYWluLiAgSXQgY2FuCisgICAgICogdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG9yIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHVzZWQgYWZ0ZXIKKyAgICAgKiBkaXNwb3NhbC48YnIvPjxici8+CisgICAgICovCisKKyAgICB2b2lkIGRpc3Bvc2UgKCApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBtb3ZlVG8gY3Vyc29yLiAgaWYgdGhlCisgICAgICogbW92ZVRvIGN1cnNvciBpcyBpbiBhIGRpZmZlcmVudCBkb2N1bWVudCBmcm9tIHRoaXMgY3Vyc29yLCB0aGlzIGN1cnNvcgorICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2UgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHBhcmFtICBtb3ZlVG8gIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMgY3Vyc29yCisgICAgICogc2hvdWxkIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9DdXJzb3IgKCBYbWxDdXJzb3IgbW92ZVRvICk7CisgICAgCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhpcyBjdXJzb3Igb24gYW4gaW50ZXJuYWwgc3RhY2sgb2Ygc2F2ZWQKKyAgICAgKiBwb3NpdGlvbnMgKGluZGVwZW5kZW50IG9mIHNlbGVjdGlvbikuIFRoaXMgbG9jYXRpb24gbWF5IGJlIHJlc3RvcmVkCisgICAgICogbGF0ZXIgYnkgY2FsbGluZyB0aGUgcG9wKCkgbWV0aG9kLgorICAgICAqLworCisgICAgdm9pZCBwdXNoICggKTsKKworICAgIC8qKgorICAgICAqIFJlc3RvcmVzIHRoZSBjdXJzb3IgbG9jYXRpb24gbW9zdCByZWNlbnRseSBzYXZlZCB3aXRoIHRoZSBwdXNoKCkgbWV0aG9kLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlcmUgd2FzIGEgbG9jYXRpb24gdG8gcmVzdG9yZTsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gcG9wICggKTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFBhdGggZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBYTUwgdGhhdCB0aGlzIAorICAgICAqIGN1cnNvciBpcyBpbi4gIFRoZSBjdXJzb3JzIHBvc2l0aW9uIGRvZXMgbm90IGNoYW5nZS4gIFRvIG5hdmlnYXRlIHRvIHRoZQorICAgICAqIHNlbGVjdGlvbnMsIHVzZSBoYXNOZXh0U2VsZWN0aW9uIGFuZCB0b05leHRTZWxlY3Rpb24gKHNpbWlsYXIgdG8KKyAgICAgKiBqYXZhLnV0aWwuSXRlcmF0b3IpLjxici8+PGJyLz4KKyAgICAgKiAKKyAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCisgICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246CisgICAgICogPHByZT4KKyAgICAgKiBjdXJzb3Iuc2VsZWN0UGF0aCgiLi9wdXJjaGFzZS1vcmRlci9saW5lLWl0ZW1bcHJpY2UgPD0gMjAuMDBdIik7CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogQHBhcmFtICBwYXRoICBUaGUgcGF0aCBleHByZXNzaW9uIHRvIGV4ZWN1dGUuCisgICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBYUGF0aCBleHByZXNzaW9uIGFnYWluc3QgdGhlIFhNTCB0aGF0IHRoaXMgCisgICAgICogY3Vyc29yIGlzIGluLiBUaGUgY3Vyc29yJ3MgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlLiAgVG8gbmF2aWdhdGUgdG8gdGhlCisgICAgICogc2VsZWN0aW9ucywgdXNlIGhhc05leHRTZWxlY3Rpb24gYW5kIHRvTmV4dFNlbGVjdGlvbiAoc2ltaWxhciB0bworICAgICAqIGphdmEudXRpbC5JdGVyYXRvcikuPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIFRoZSByb290IHJlZmVycmVkIHRvIGJ5IHRoZSBleHByZXNzaW9uIHNob3VsZCBiZSBnaXZlbiBhcyAKKyAgICAgKiBhIGRvdC4gVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIHBhdGggZXhwcmVzc2lvbjoKKyAgICAgKiA8cHJlPgorICAgICAqIGN1cnNvci5zZWxlY3RQYXRoKCIuL3B1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSA8PSAyMC4wMF0iKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHBhdGggIFRoZSBwYXRoIGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KKyAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKKyAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9CisgICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAorICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCisgICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgbmV4dCBzZWxlY3Rpb24uCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQgc2VsZWN0aW9uOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBoYXNOZXh0U2VsZWN0aW9uICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbmV4dCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLCAKKyAgICAgKiBpZiBhbnkuIFNlZSB0aGUgc2VsZWN0UGF0aCgpIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b05leHRTZWxlY3Rpb24gKCApOworICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhpcyBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiB0aGUgc2VsZWN0aW9uLiAKKyAgICAgKiBJZiBpIGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VsZWN0aW9uCisgICAgICogY291bnQsIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UuCisgICAgICogIAorICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgYW5kIGFkZFRvU2VsZWN0aW9uKCkgbWV0aG9kcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGkgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhdGlvbi4KKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b1NlbGVjdGlvbiAoIGludCBpICk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBTZWUgYWxzbyB0aGUgc2VsZWN0UGF0aCgpIAorICAgICAqIGFuZCBhZGRUb1NlbGVjdGlvbigpIG1ldGhvZHMuCisgICAgICogCisgICAgICogWW91IG1heSBleHBlcmllbmNlIGJldHRlciBwZXJmb3JtYW5jZSBpZiB5b3UgdXNlIHRoZSBpdGVyYXRpb24KKyAgICAgKiBtb2RlbCB1c2luZyB0aGUgdG9OZXh0U2VsZWN0aW9uIG1ldGhvZCwgcmF0aGVyIHRoYW4gCisgICAgICogdGhlIGluZGV4aW5nIG1vZGVsIHVzaW5nIHRoZSBnZXRTZWxlY3Rpb25Db3VudCBhbmQgCisgICAgICogdG9TZWxlY3Rpb24gbWV0aG9kcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAgICAgKi8KKworICAgIGludCBnZXRTZWxlY3Rpb25Db3VudCAoICk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IgdG8gdGhlIHNlbGVjdGlvbi4gIAorICAgICAqIFNlZSBhbHNvIHRoZSBzZWxlY3RQYXRoKCkgbWV0aG9kLiBZb3UgY2FuIHVzZSB0aGlzIGFzIGFuIAorICAgICAqIGFsdGVybmF0aXZlIHRvIGNhbGxpbmcgdGhlIHNlbGVjdFBhdGggbWV0aG9kIHdoZW4geW91IHdhbnQKKyAgICAgKiB0byBkZWZpbmUgeW91ciBvd24gc2VsZWN0aW9uLgorICAgICAqLworCisgICAgdm9pZCBhZGRUb1NlbGVjdGlvbiAoICk7CisgICAgCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgY3Vyc29yJ3Mgc2VsZWN0aW9uLCBidXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICk7ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGFzIHRoZSBib29rbWFyay4gIElmIHRoZQorICAgICAqIGJvb2ttYXJrIGlzIGluIGEgZGlmZmVyZW50IGRvY3VtZW50IGZyb20gdGhpcyBjdXJzb3Igb3IgaWYgdGhlIAorICAgICAqIGJvb2ttYXJrIGlzIG9ycGhhbmVkLCB0aGlzIGN1cnNvcgorICAgICAqIHdpbGwgbm90IGJlIG1vdmVkLCBhbmQgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGJvb2ttYXJrICBUaGUgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMKKyAgICAgKiBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9Cb29rbWFyayAoIFhtbEJvb2ttYXJrIGJvb2ttYXJrICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGlzIGN1cnNvciB0byB0aGUgbG9jYXRpb24gYWZ0ZXIgaXRzIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCisgICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCisgICAgICogCisgICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgbmV4dCBib29rbWFyayBhdCB0aGUgbG9jYXRpb24gdG8gCisgICAgICogd2hpY2ggdGhpcyBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4gIFRoZSBuZXh0IGNvcnJlc3BvbmRpbmcgYm9va21hcmssIGlmIGl0IGV4aXN0czsgbnVsbCBpZiB0aGVyZQorICAgICAqIGlzIG5vIG5leHQgYm9va21hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKi8KKworICAgIFhtbEJvb2ttYXJrIHRvTmV4dEJvb2ttYXJrICggT2JqZWN0IGtleSApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbiBiZWZvcmUgaXRzIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgKiB3aGVyZSBhIGJvb2ttYXJrIHdpdGggdGhlIGdpdmVuIGtleSBleGlzdHMuICBSZXR1cm5zIGZhbHNlIGlmIG5vCisgICAgICogc3VjaCBib29rbWFyayBleGlzdHMuCisgICAgICogCisgICAgICogQHBhcmFtICBrZXkgIFRoZSBrZXkgaGVsZCBieSB0aGUgcHJldmlvdXMgYm9va21hcmsgYXQgdGhlIGxvY2F0aW9uIHRvIAorICAgICAqIHdoaWNoIHRoaXMgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KKyAgICAgKiBAcmV0dXJuICBUaGUgcHJldmlvdXMgY29ycmVzcG9uZGluZyBib29rbWFyaywgaWYgaXQgZXhpc3RzOyBudWxsIGlmIAorICAgICAqIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisKKyAgICBYbWxCb29rbWFyayB0b1ByZXZCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRva2VuLiBOYW1lcyBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICogU1RBUlQsIEFUVFIsIE5BTUVTUEFDRSBvciBQUk9DSU5TVC4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vCisgICAgICogbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4uIEZvciBTVEFSVCBhbmQgQVRUUiwgdGhlIAorICAgICAqIG5hbWUgcmV0dXJuZWQgaWRlbnRpZmllcyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBvciBhdHRyaWJ1dGUuIAorICAgICAqIEZvciBOQU1FU1BBQ0UsIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBuYW1lIGlzIHRoZSBwcmVmaXgsIHdoaWxlIAorICAgICAqIHRoZSBVUkkgaXMgdGhlIG5hbWVzcGFjZSBkZWZpbmVkLiBGb3IgUFJPQ0lOU1QsIHRoZSBsb2NhbCBwYXJ0IAorICAgICAqIGlzIHRoZSB0YXJnZXQgYW5kIHRoZSB1cmkgaXMgIiIuCisgICAgICogCisgICAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIFhNTCBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uOyBudWxsIGlmIHRoZXJlCisgICAgICogaXMgbm8gbmFtZS4KKyAgICAgKi8KKworICAgIFFOYW1lIGdldE5hbWUgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIFNUQVJULCBOQU1FU1BBQ0UsCisgICAgICogQVRUUiBvciBQUk9DSU5TVC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuZXcgbmFtZSBmb3IgdGhlIGN1cnJlbnQgdG9rZW4uCisgICAgICovCisKKyAgICB2b2lkIHNldE5hbWUgKCBRTmFtZSBuYW1lICk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIFVSSSBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIHByZWZpeC4gVGhlIGN1cnJlbnQKKyAgICAgKiBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gTmFtZXNwYWNlIHByZWZpeCBtYXBwaW5ncworICAgICAqIGFyZSBxdWVyaWVkIGZvciB0aGUgbWFwcGluZ3MgZGVmaW5lZCBhdCB0aGUgY3VycmVudCBjb250YWluZXIgZmlyc3QsCisgICAgICogdGhlbiBwYXJlbnRzIGFyZSBxdWVyaWVkLiBUaGUgcHJlZml4IGNhbiBiZSAiIiBvciBudWxsIHRvIGluZGljYXRlCisgICAgICogYSBzZWFyY2ggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4gIFRvIGNvbmZvcm0gd2l0aCB0aGUKKyAgICAgKiBYTUwgc3BlYywgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHdpbGwgcmV0dXJuIHRoZSBuby1uYW1lc3BhY2UgKCIiKQorICAgICAqIGlmIGl0IGlzIG5vdCBtYXBwZWQuPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKKyAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCisgICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCisgICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCisgICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgcHJlZml4ICBUaGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBuYW1lc3BhY2UuCisgICAgICogQHJldHVybiAgVGhlIFVSSSBmb3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHByZWZpeCBpZiBpdAorICAgICAqIGV4aXN0czsgb3RoZXJ3aXNlLCBudWxsLgorICAgICAqLworICAgIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJlZml4IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBuYW1lc3BhY2UgVVJJLiAgVGhlCisgICAgICogY3VycmVudCBjb250ZXh0IG11c3QgYmUgYXQgYSBTVEFSVCBvciBTVEFSVERPQy4gIElmIHRoZXJlIGlzIGFuCisgICAgICogZXhpc3RpbmcgcHJlZml4IHRoYXQgaW5kaWNhdGVzIHRoZSBVUkkgaW4gdGhlIGN1cnJlbnQgY29udGV4dCwgdGhhdAorICAgICAqIHByZWZpeCBtYXkgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcgcHJlZml4IGZvciB0aGUgVVJJIHdpbGwgYmUKKyAgICAgKiBkZWZpbmVkIGJ5IGFkZGluZyBhbiB4bWxucyBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgY29udGFpbmVyIG9yIGEKKyAgICAgKiBwYXJlbnQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIHF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvY3VtZW50LiBXaGVuIHRoZSAKKyAgICAgKiBkb2N1bWVudCBpcyBwZXJzaXN0ZWQsIHRoZSBzYXZpbmcgbWVjaGFuaXNtIG1heSBzeW50aGVzaXplIG5hbWVzcGFjZXMgCisgICAgICogKG5zMSwgbnMyLCBhbmQgc28gb24pIGZvciB0aGUgcHVycG9zZXMgb2YgcGVyc2lzdGVuY2UuIFRoZXNlIG5hbWVwYWNlcyBhcmUgCisgICAgICogb25seSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGFuZCBhcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gCisgICAgICogdGhlIGRvY3VtZW50IGJlaW5nIHNhdmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlVVJJICBUaGUgbmFtZXNwYWNlIFVSSSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBwcmVmaXguCisgICAgICogQHJldHVybiAgVGhlIHByZWZpeCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVVJJIGlmIGl0IGV4aXN0czsgCisgICAgICogb3RoZXJ3aXNlLCBhIG5ld2x5IGdlbmVyYXRlZCBwcmVmaXguCisgICAgICovCisgICAgU3RyaW5nIHByZWZpeEZvck5hbWVzcGFjZSAoIFN0cmluZyBuYW1lc3BhY2VVUkkgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIHRvIHRoZSBzcGVjaWZpZWQgbWFwLCBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gc2NvcGUgYXQgdGhlIGNvbnRhaW5lcgorICAgICAqIHdoZXJlIHRoaXMgY3Vyc29yIGlzIHBvc2l0aW9uZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgCisgICAgICogY29udGFpbmVyIHRva2VucyBvbmx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSAgYWRkVG9UaGlzICBUaGUgTWFwIHRvIGFkZCB0aGUgbmFtZXNwYWNlcyB0by4KKyAgICAgKi8KKworICAgIHZvaWQgZ2V0QWxsTmFtZXNwYWNlcyAoIE1hcCBhZGRUb1RoaXMgKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdCBhdCB0aGUgY3VycmVudCBTVEFSVCwKKyAgICAgKiBTVEFSVERPQywgb3IgQVRUUi4gPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIFRoZSBzdHJvbmdseS10eXBlZCBvYmplY3QgY2FuIGJlIGNhc3QgdG8gdGhlIHN0cm9uZ2x5LXR5cGVkCisgICAgICogWEJlYW4gaW50ZXJmYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCBTY2hlbWEgVHlwZSBnaXZlbgorICAgICAqIGJ5IHJlc3VsdC5nZXRTY2hlbWFUeXBlKCkuPGJyLz48YnIvPgorICAgICAqCisgICAgICogSWYgYSBtb3JlIHNwZWNpZmljIHR5cGUgY2Fubm90IGJlIGRldGVybWluZWQsIGFuIFhtbE9iamVjdAorICAgICAqIHdob3NlIHNjaGVtYSB0eXBlIGlzIGFueVR5cGUgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBUaGUgc3Ryb25nbHktdHlwZWQgb2JqZWN0IGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uOworICAgICAqIG51bGwgaWYgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgbm90IGEgU1RBUlQsIFNUQVJURE9DLCBvciBBVFRSLgorICAgICAqLworCisgICAgWG1sT2JqZWN0IGdldE9iamVjdCAoICk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCB0b2tlbi4gQnkgZGVmaW5pdGlvbiwgdGhlIGN1cnJlbnQKKyAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3IuIAorICAgICAqIElmIHlvdSdyZSBpbiB0aGUgbWlkZGxlIG9mIHRleHQsIGJlZm9yZSBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgorICAgICAqIFlvdSBjYW4ndCBkaXZlIGludG8gdGhlIHRleHQgb2YgYW4gQVRUUiwgQ09NTUVOVCBvciBQUk9DSU5TVC48YnIvPjxici8+CisgICAgICogCisgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUsIGl0IG1heSBiZSBtb3JlIGNvbnZlbmllbnQgZm9yIHlvdSB0byB1c2Ugb25lIG9mIHRoZSAKKyAgICAgKiBtZXRob2RzIHRoYXQgdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHRva2VuIHR5cGUuIFRoZXNlIGluY2x1ZGUgdGhlIG1ldGhvZHMgCisgICAgICogaXNTdGFydCgpLCBpc1N0YXJ0ZG9jKCksIGlzVGV4dCgpLCBpc0F0dHIoKSwgYW5kIHNvIG9uLiBFYWNoIHJldHVybnMgYSBib29sZWFuIAorICAgICAqIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdG9rZW4gdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3IgaXMgdGhlIHR5cGUgCisgICAgICogaW4gcXVlc3Rpb24uIAorICAgICAqIDxici8+PGJyLz4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudAorICAgICAqIGxvY2F0aW9uLgorICAgICAqLworCisgICAgVG9rZW5UeXBlIGN1cnJlbnRUb2tlblR5cGUgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYSBTVEFSVERPQyB0b2tlbiB0eXBlLCBtZWFuaW5nIAorICAgICAqIGF0IHRoZSB2ZXJ5IHJvb3Qgb2YgdGhlIGRvY3VtZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJURE9DIHRva2VuIHR5cGU7IAorICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzU3RhcnRkb2MgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZSwgbWVhbmluZyAKKyAgICAgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkRET0MgdG9rZW4gdHlwZTsgCisgICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gaXNFbmRkb2MgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGUsIG1lYW5pbmcgCisgICAgICoganVzdCBiZWZvcmUgYW4gZWxlbWVudCdzIHN0YXJ0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIFNUQVJUIHRva2VuIHR5cGU7IAorICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzU3RhcnQgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZSwgbWVhbmluZyAKKyAgICAgKiBqdXN0IGJlZm9yZSBhbiBlbGVtZW50J3MgZW5kLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBFTkQgdG9rZW4gdHlwZTsgCisgICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gaXNFbmQgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHRoaXMgdG9rZW4gaXMgYSBURVhUIHRva2VuIHR5cGUsIG1lYW5pbmcgCisgICAgICoganVzdCBiZWZvcmUgb3IgaW5zaWRlIHRleHQuCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgVEVYVCB0b2tlbiB0eXBlOyAKKyAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc1RleHQgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGUsIG1lYW5pbmcgCisgICAgICoganVzdCBiZWZvcmUgYW4gYXR0cmlidXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhbiBBVFRSIHRva2VuIHR5cGU7IAorICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzQXR0ciAoICk7CisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGUsIG1lYW5pbmcgCisgICAgICoganVzdCBiZWZvcmUgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgTkFNRVNQQUNFIHRva2VuIHR5cGU7IAorICAgICAqIG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzTmFtZXNwYWNlICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBDT01NRU5UIHRva2VuIHR5cGUsIG1lYW5pbmcgCisgICAgICoganVzdCBiZWZvcmUgYSBjb21tZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIENPTU1FTlQgdG9rZW4gdHlwZTsgCisgICAgICogb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gaXNDb21tZW50ICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlLCBtZWFuaW5nIAorICAgICAqIGp1c3QgYmVmb3JlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBQUk9DSU5TVCB0b2tlbiB0eXBlOyAKKyAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc1Byb2NpbnN0ICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBjb250YWluZXIgdG9rZW4uIFRoZSBTVEFSVERPQyBhbmQgU1RBUlQgCisgICAgICogdG9rZW4gdHlwZXMgYXJlIGNvbnRhaW5lcnMuIENvbnRhaW5lcnMsIGluY2x1ZGluZyBkb2N1bWVudHMgYW5kIGVsZW1lbnRzLAorICAgICAqIGhhdmUgdGhlIHNhbWUgY29udGVudCBtb2RlbC4gSW4gb3RoZXIgd29yZHMsIGEgZG9jdW1lbnQgYW5kIGFuIGVsZW1lbnQgCisgICAgICogbWF5IGhhdmUgdGhlIHNhbWUgY29udGVudHMuIEZvciBleGFtcGxlLCBhIGRvY3VtZW50IG1heSBjb250YWluIGF0dHJpYnV0ZXMgCisgICAgICogb3IgdGV4dCwgd2l0aG91dCBhbnkgY2hpbGQgZWxlbWVudHMuCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgY29udGFpbmVyIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc0NvbnRhaW5lciAoICk7CisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIHRva2VuIGlzIGEgZmluaXNoIHRva2VuLiBBIGZpbmlzaCB0b2tlbiBjYW4gYmUgYW4gRU5ERE9DCisgICAgICogb3IgRU5EIHRva2VuIHR5cGUuCisKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgdG9rZW4gaXMgYSBmaW5pc2ggdG9rZW47IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzRmluaXNoICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoaXMgdG9rZW4gaXMgYW55IGF0dHJpYnV0ZS4gVGhpcyBpbmNsdWRlcyBhbiBBVFRSIHRva2VuIHR5cGUgYW5kCisgICAgICogdGhlIE5BTUVTUEFDRSB0b2tlbiB0eXBlIGF0dHJpYnV0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJyZW50IGN1cnNvciBpcyBhdCBhbnkgYXR0cmlidXRlOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc0FueUF0dHIgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzIHRva2VuLiBCeSBkZWZpbml0aW9uLCB0aGUgcHJldmlvdXMKKyAgICAgKiB0b2tlbiBpcyB0aGUgdG9rZW4gaW1tZWRpYXRlbHkgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBJZiB5b3UncmUgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LCBhZnRlciBhIGNoYXJhY3RlciwgeW91IGdldCBURVhULgorICAgICAqIAorICAgICAqIEByZXR1cm4gIFRoZSBUb2tlblR5cGUgaW5zdGFuY2UgZm9yIHRoZSB0b2tlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIAorICAgICAqIHRva2VuIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50IGxvY2F0aW9uLgorICAgICAqLworCisgICAgVG9rZW5UeXBlIHByZXZUb2tlblR5cGUgKCApOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIGFzIHdoZW4gdGhlIGN1cnNvciBpcworICAgICAqIGF0IHRoZSBFTkRET0MgdG9rZW4sIHRoZSB0b05leHRUb2tlbigpIG1ldGhvZCByZXR1cm5zIE5PTkUgYW5kIGRvZXMgbm90IAorICAgICAqIG1vdmUgdGhlIGN1cnNvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZXJlIGlzIGEgbmV4dCB0b2tlbjsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gaGFzTmV4dFRva2VuICggKTsKKworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuLiBXaGVuIHRoaXMgaXMgZmFsc2UsIHRvUHJldlRva2VuCisgICAgICogcmV0dXJucyBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHRva2VuOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBoYXNQcmV2VG9rZW4gKCApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgdG9rZW4uIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdG9rZW5zIAorICAgICAqIGF2YWlsYWJsZSwgaGFzTmV4dFRva2VuIHJldHVybnMgZmFsc2UgYW5kIHRvTmV4dFRva2VuKCkgcmV0dXJucyAKKyAgICAgKiBOT05FIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IuIFJldHVybnMgdGhlIHRva2VuIHR5cGUgCisgICAgICogb2YgdGhlIHRva2VuIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwb24gYSBzdWNjZXNzZnVsIG1vdmUuCisgICAgICogCisgICAgICogQHJldHVybiAgVGhlIHRva2VuIHR5cGUgZm9yIHRoZSBuZXh0IHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOworICAgICAqIG90aGVyd2lzZSwgTk9ORS4KKyAgICAgKi8KKworICAgIFRva2VuVHlwZSB0b05leHRUb2tlbiAoICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB0b2tlbi4gV2hlbiB0aGVyZSBpcyBubworICAgICAqIHByZXZpb3VzIHRva2VuLCByZXR1cm5zIE5PTkUsIG90aGVyd2lzZSByZXR1cm5zIHRoZSB0b2tlbgorICAgICAqIHRvIHRoZSBsZWZ0IG9mIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBUaGUgdG9rZW4gdHlwZSBmb3IgdGhlIHByZXZpb3VzIHRva2VuIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOworICAgICAqIG90aGVyd2lzZSwgTk9ORS4KKyAgICAgKi8KKworICAgIFRva2VuVHlwZSB0b1ByZXZUb2tlbiAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBTVEFSVCBvciBTVEFSVERPQy4gVGhhdCBpcywgdGhlIGZpcnN0IHRva2VuIGFmdGVyIGFsbCBBVFRSIGFuZCBOQU1FU1BBQ0UKKyAgICAgKiB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU1RBUlQuPGJyLz48YnIvPgorICAgICAqCisgICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90CisgICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuIElmIHRoZSBjdXJyZW50IFNUQVJUIG9yIFNUQVJURE9DCisgICAgICogaGFzIG5vIGNvbnRlbnQsIHRoZSBjdXJzb3IgaXMgbW92ZWQgdG8gdGhlIEVORCBvciBFTkRET0MgdG9rZW4uPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIEByZXR1cm4gIFRoZSBuZXcgY3VycmVudCB0b2tlbiB0eXBlLgorICAgICAqLworCisgICAgVG9rZW5UeXBlIHRvRmlyc3RDb250ZW50VG9rZW4gKCApOworCisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBFTkQgb3IgRU5ERE9DIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICogY3VycmVudCBTVEFSVCBvciBTVEFSVERPQywgYW5kIHJldHVybnMgRU5EIG9yIEVORERPQy4gPGJyLz48YnIvPgorICAgICAqCisgICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IGEgU1RBUlQgb3IgU1RBUlRET0MsIHRoZSBjdXJzb3IgaXMgbm90CisgICAgICogbW92ZWQgYW5kIE5PTkUgaXMgcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiAgVGhlIG5ldyBjdXJyZW50IHRva2VuIHR5cGUuCisgICAgICovCisKKyAgICBUb2tlblR5cGUgdG9FbmRUb2tlbiAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciBmb3J3YXJkIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGFuZAorICAgICAqIHN0b3BzIGF0IHRoZSBuZXh0IG5vbi1URVhUIHRva2VuLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAqIGFjdHVhbGx5IG1vdmVkIGFjcm9zcywgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIAorICAgICAqIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+LiBJZiB0aGVyZSBpcyBubyBmdXJ0aGVyIHRleHQsIG9yIGlmIAorICAgICAqIHRoZXJlIGlzIG5vIHRleHQgYXQgYWxsLCByZXR1cm5zIHplcm8uPGJyLz48YnIvPgorICAgICAqCisgICAgICogTm90ZSB0aGlzIGRvZXMgbm90IGRpdmUgaW50byBhdHRyaWJ1dGUgdmFsdWVzLCBjb21tZW50IGNvbnRlbnRzLAorICAgICAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gY29udGVudHMsIGV0Yy4sIGJ1dCBvbmx5IGNvbnRlbnQgdGV4dC48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBZb3UgY2FuIHBhc3MgbWF4Q2hhcmFjdGVyQ291bnQgJmx0OyAwIHRvIG1vdmUgb3ZlciBhbGwgdGhlIHRleHQgdG8gdGhlIAorICAgICAqIHJpZ2h0LiBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdG9OZXh0VG9rZW4sIGJ1dCByZXR1cm5zIHRoZSBhbW91bnQgCisgICAgICogb2YgdGV4dCBtb3ZlZCBvdmVyLgorICAgICAqCisgICAgICogQHBhcmFtICBtYXhDaGFyYWN0ZXJDb3VudCAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2gKKyAgICAgKiB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZC4KKyAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJ5IHdoaWNoIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyAKKyAgICAgKiAwIGlmIHRoZSBjdXJzb3Igd2FzIG5vdCBtb3ZlZC4KKyAgICAgKi8KKworICAgIGludCB0b05leHRDaGFyICggaW50IG1heENoYXJhY3RlckNvdW50ICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciBiYWNrd2FyZHMgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGdpdmVuLiAgSGFzCisgICAgICogc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgdG8gdGhlIHtAbGluayAjdG9OZXh0Q2hhcihpbnQpIHRvTmV4dENoYXJ9IG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBieSB3aGljaAorICAgICAqIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYnkgd2hpY2ggdGhlIGN1cnNvciB3YXMgbW92ZWQ7IAorICAgICAqIDAgaWYgdGhlIGN1cnNvciB3YXMgbm90IG1vdmVkLgorICAgICAqLworCisgICAgaW50IHRvUHJldkNoYXIgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCisgICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBuZXh0IHNpYmxpbmcKKyAgICAgKiBlbGVtZW50LiAoQnkgZGVmaW5pdGlvbiB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCBpcyB0aGUgc2FtZQorICAgICAqIGFzIHRoZSBwb3NpdGlvbiBvZiBpdHMgU1RBUlQgdG9rZW4uKQorICAgICAqCisgICAgICogSWYgdGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHMgU1RBUlQsIHRoZSBjdXJzb3Igd2lsbCBiZSAKKyAgICAgKiBtb3ZlZCB0byB0aGUgbmV4dCBTVEFSVCB3aXRob3V0IG1vdmluZyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoZSAKKyAgICAgKiBjdXJyZW50IGVsZW1lbnQuCisgICAgICogCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LCBvciByZXR1cm5zCisgICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBzaWJsaW5nCisgICAgICogZWxlbWVudC4gKEJ5IGRlZmluaXRpb24gdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgaXMgdGhlIHNhbWUKKyAgICAgKiBhcyB0aGUgcG9zaXRpb24gb2YgaXRzIFNUQVJUIHRva2VuLikKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b1ByZXZTaWJsaW5nICggKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9yIFNUQVJURE9DLCBvciByZXR1cm5zCisgICAgICogZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBpcyBubyBwYXJlbnQuPGJyLz48YnIvPgorICAgICAqCisgICAgICogV29ya3MgaWYgeW91J3JlIGluIGF0dHJpYnV0ZXMgb3IgY29udGVudC4gUmV0dXJucyBmYWxzZSBvbmx5IGlmIGF0CisgICAgICogU1RBUlRET0MuIE5vdGUgdGhhdCB0aGUgcGFyZW50IG9mIGFuIEVORCB0b2tlbiBpcyB0aGUgY29ycmVzcG9uZGluZworICAgICAqIFNUQVJUIHRva2VuLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IGZhbHNlIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIFNUQVJURE9DCisgICAgICogdG9rZW4uCisgICAgICovCisKKyAgICBib29sZWFuIHRvUGFyZW50ICggKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQsIG9yIHJldHVybnMgZmFsc2UgYW5kCisgICAgICogZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGFyZSBubyBlbGVtZW50IGNoaWxkcmVuLiA8YnIvPjxici8+CisgICAgICoKKyAgICAgKiBJZiB0aGUgY3Vyc29yIGlzIG5vdCBjdXJyZW50bHkgaW4gYW4gZWxlbWVudCwgaXQgbW92ZXMgaW50byB0aGUgCisgICAgICogZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgbmV4dCBlbGVtZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvRmlyc3RDaGlsZCAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbGFzdCBlbGVtZW50IGNoaWxkLCBvciByZXR1cm5zIGZhbHNlIGFuZAorICAgICAqIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8gZWxlbWVudCBjaGlsZHJlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b0xhc3RDaGlsZCAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gCisgICAgICogbm8gbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZSApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSAKKyAgICAgKiBzcGVjaWZpZWQgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIAorICAgICAqIHRvLgorICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0by4KKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIGN1cnNvciB0by4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9DaGlsZCAoIFFOYW1lIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGNoaWxkIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IDxlbT5pbmRleDwvZW0+LgorICAgICAqIAorICAgICAqIEBwYXJhbSAgaW5kZXggIFRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2hpbGQgCisgICAgICogZWxlbWVudHMuCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9DaGlsZCAoIGludCBpbmRleCApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHNwZWNpZmllZCA8ZW0+aW5kZXg8L2VtPiBjaGlsZCBlbGVtZW50IG9mIHRoZSAKKyAgICAgKiBzcGVjaWZpZWQgbmFtZSwgd2hlcmUgdGhhdCBlbGVtZW50IGlzIHRoZSAuCisgICAgICogCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCisgICAgICogQHBhcmFtICBpbmRleCAgVGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBvZiBjaGlsZAorICAgICAqIGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvQ2hpbGQgKCBRTmFtZSBuYW1lLCBpbnQgaW5kZXggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gbm8KKyAgICAgKiBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBuYW1lIAorICAgICAqIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbmFtZXNwYWNlICBUaGUgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yCisgICAgICogdG8uCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBtb3ZlIHRoZSBjdXJzb3IgdG8uCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lICk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCBvZiB0aGUgc3BlY2lmaWVkIAorICAgICAqIHF1YWxpZmllZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgY3Vyc29yIHRvLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBRTmFtZSBuYW1lICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50LCBvcgorICAgICAqIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90IG1vdmUgdGhlIGN1cnNvciBpZiB0aGVyZSBhcmUgbm8KKyAgICAgKiBhdHRyaWJ1dGVzLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgorICAgICAqCisgICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAorICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYSBTVEFSVCBvciBTVEFSVERPQyBmb3IgdGhpcyBtZXRob2QgdG8KKyAgICAgKiBzdWNjZWVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvRmlyc3RBdHRyaWJ1dGUgKCApOworICAgIAorICAgIC8qKgorICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGxhc3QgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCwgb3IKKyAgICAgKiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgYXJlIG5vCisgICAgICogYXR0cmlidXRlcy4gVGhlIG9yZGVyIG9mIGF0dHJpYnV0ZXMgaXMgYXJiaXRyYXJ5LCBidXQgc3RhYmxlLjxici8+PGJyLz4KKyAgICAgKgorICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKKyAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgorICAgICAqCisgICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGEgU1RBUlQgb3IgU1RBUlRET0MgZm9yIHRoaXMgbWV0aG9kCisgICAgICogdG8gc3VjY2VlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b0xhc3RBdHRyaWJ1dGUgKCApOworCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBzaWJsaW5nIGF0dHJpYnV0ZSwgb3IgcmV0dXJucworICAgICAqIGZhbHNlIGFuZCBkb2VzIG5vdCBtb3ZlIHRoZSBjdXJzb3IgaWYgdGhlcmUgaXMgbm8gbmV4dAorICAgICAqIHNpYmxpbmcgYXR0cmlidXRlLiBUaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBpcyBhcmJpdHJhcnksIGJ1dCBzdGFibGUuPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIHhtbG5zIGF0dHJpYnV0ZXMgKG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpIGFyZSBub3QgY29uc2lkZXJlZCAKKyAgICAgKiBhdHRyaWJ1dGVzIGJ5IHRoaXMgZnVuY3Rpb24uPGJyLz48YnIvPgorICAgICAqCisgICAgICogVGhlIGN1cnNvciBtdXN0IGJlIG9uIGFuIGF0dHJpYnV0ZSBmb3IgdGhpcyBtZXRob2QgdG8gc3VjY2VlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjdXJzb3Igd2FzIG1vdmVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiB0b05leHRBdHRyaWJ1dGUgKCApOworCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgc2libGluZyBhdHRyaWJ1dGUsIG9yIHJldHVybnMKKyAgICAgKiBmYWxzZSBhbmQgZG9lcyBub3QgbW92ZSB0aGUgY3Vyc29yIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzCisgICAgICogc2libGluZyBhdHRyaWJ1dGUuIFRoZSBvcmRlciBvZiBhdHRyaWJ1dGVzIGlzIGFyYml0cmFyeSwgYnV0IHN0YWJsZS48YnIvPjxici8+CisgICAgICogCisgICAgICogeG1sbnMgYXR0cmlidXRlcyAobmFtZXNwYWNlIGRlY2xhcmF0aW9ucykgYXJlIG5vdCBjb25zaWRlcmVkIAorICAgICAqIGF0dHJpYnV0ZXMgYnkgdGhpcyBmdW5jdGlvbi48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBUaGUgY3Vyc29yIG11c3QgYmUgb24gYW4gYXR0cmlidXRlIGZvciB0aGlzIG1ldGhvZCB0byBzdWNjZWVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGN1cnNvciB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHRvUHJldkF0dHJpYnV0ZSAoICk7CisgICAgCisgICAgLyoqCisgICAgICogV2hlbiBhdCBhIFNUQVJUIG9yIFNUQVJURE9DLCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdGV4dCBmb3IgdGhlIGdpdmVuCisgICAgICogYXR0cmlidXRlLiBXaGVuIG5vdCBhdCBhIFNUQVJUIG9yIFNUQVJURE9DIG9yIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QKKyAgICAgKiBleGlzdCwgcmV0dXJucyBudWxsLiAgCisgICAgICogCisgICAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyByZXF1ZXN0ZWQuCisgICAgICogQHJldHVybiAgVGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSwgbnVsbC4KKyAgICAgKi8KKworICAgIFN0cmluZyBnZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHNldHMgdGhlIGF0dHJpYnV0ZSB0ZXh0IGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBhdHRyaWJ1dGUuIFdoZW4gbm90IGF0IGEgU1RBUlQgb3IgU1RBUlRET0MgcmV0dXJucyBmYWxzZS4KKyAgICAgKiBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCBvbmUgaXMgY3JlYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgc2V0OyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBzZXRBdHRyaWJ1dGVUZXh0ICggUU5hbWUgYXR0ck5hbWUsIFN0cmluZyB2YWx1ZSApOworICAKKyAgICAvKioKKyAgICAgKiBXaGVuIGF0IGEgU1RBUlQgb3IgU1RBUlRET0MsIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSAoIFFOYW1lIGF0dHJOYW1lICk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCisgICAgICogY29tbWVudCwgcHJvY2luc3Qgb3IgdGV4dCB0b2tlbi4gPGJyLz48YnIvPgorICAgICAqCisgICAgICogV2hlbiBnZXR0aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGVsZW1lbnQsIG5vbi10ZXh0IGNvbnRlbnQgc3VjaAorICAgICAqIGFzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgaWdub3JlZCBhbmQgdGV4dCBpcyBjb25jYXRlbmF0ZWQuCisgICAgICogRm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBuZXN0ZWQgZWxlbWVudCBjaGlsZHJlbiwgdGhpcworICAgICAqIHJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCB0ZXh0IG9mIGFsbCBtaXhlZCBjb250ZW50IGFuZCB0aGUKKyAgICAgKiB0ZXh0IG9mIGFsbCB0aGUgZWxlbWVudCBjaGlsZHJlbiwgcmVjdXJzaW5nIGluIGZpcnN0LXRvLWxhc3QKKyAgICAgKiBkZXB0aGZpcnN0IG9yZGVyLjxici8+PGJyLz4KKyAgICAgKgorICAgICAqIEZvciBhdHRyaWJ1dGVzLCB0aGlzIHJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZS48YnIvPjxici8+CisgICAgICoKKyAgICAgKiBGb3IgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCB0aGlzIHJldHVybnMgdGhlIHRleHQgY29udGVudHMgCisgICAgICogb2YgdGhlIGNvbW1lbnQgb3IgUEksIG5vdCBpbmNsdWRpbmcgdGhlIGRlbGltaXRpbmcgc2VxdWVuY2VzICZsdDshLS0gLS0mZ3Q7LCAmbHQ7PyA/Jmd0Oy4KKyAgICAgKjxici8+PGJyLz4KKyAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgYSBTVEFSVCwgU1RBUlRET0MsIFRFWFQsIEFUVFIsIENPTU1FTlQsIG9yCisgICAgICogUFJPQ0lOU1QsIHRoaXMgcmV0dXJucyBudWxsLiBUaGUgdmFsdWUgb2YgYW4gZW1wdHkgdGFnIGlzIHRoZQorICAgICAqIGVtcHR5IHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBUaGUgdGV4dCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0b2tlbiwgaWYgdGhlIHRva2VuJ3MgdHlwZSBpcworICAgICAqIFNUQVJULCBTVEFSVERPQywgVEVYVCwgQVRUUiwgQ09NTUVOVCwgb3IgUFJPQ0lOU1Q7IG51bGwgaWYgdGhlIHR5cGUgaXMKKyAgICAgKiBFTkQsIEVORERPQywgTk9ORSwgb3IgTkFNRVNQQUNFLgorICAgICAqLworCisgICAgU3RyaW5nIGdldFRleHRWYWx1ZSAoICk7CisgICAgCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LCBlbGVtZW50LCBhdHRyaWJ1dGUsCisgICAgICogY29tbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciB0ZXh0IHRva2VuLCBjb3VudGluZyByaWdodCBmcm9tIAorICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdXAgdG8gPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4sCisgICAgICogYW5kIGNvcGllcyB0aGUgcmV0dXJuZWQgdGV4dCBpbnRvIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4uIDxici8+PGJyLz4KKyAgICAgKiAKKyAgICAgKiBXaGVuIGdldHRpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gZWxlbWVudCwgbm9uLXRleHQgY29udGVudCBzdWNoCisgICAgICogYXMgY29tbWVudHMgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBpZ25vcmVkIGFuZCB0ZXh0IGlzIGNvbmNhdGVuYXRlZC4KKyAgICAgKiBGb3IgZWxlbWVudHMgdGhhdCBoYXZlIG5lc3RlZCBlbGVtZW50IGNoaWxkcmVuLCB0aGlzCisgICAgICogcmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHRleHQgb2YgYWxsIG1peGVkIGNvbnRlbnQgYW5kIHRoZQorICAgICAqIHRleHQgb2YgYWxsIHRoZSBlbGVtZW50IGNoaWxkcmVuLCByZWN1cnNpbmcgaW4gZmlyc3QtdG8tbGFzdAorICAgICAqIGRlcHRoZmlyc3Qgb3JkZXIuPGJyLz48YnIvPgorICAgICAqCisgICAgICogRm9yIGF0dHJpYnV0ZXMsIHRoaXMgcmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlLjxici8+PGJyLz4KKyAgICAgKgorICAgICAqIEZvciBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIHRoaXMgcmV0dXJucyB0aGUgdGV4dCBjb250ZW50cyAKKyAgICAgKiBvZiB0aGUgY29tbWVudCBvciBQSSwgbm90IGluY2x1ZGluZyB0aGUgZGVsaW1pdGluZyBzZXF1ZW5jZXMgJmx0OyEtLSAtLSZndDssICZsdDs/ID8mZ3Q7LgorICAgICAqIDxici8+PGJyLz4KKyAgICAgKiAKKyAgICAgKiBJZiB0aGUgY3VycmVudCB0b2tlbiBpcyBFTkQsIEVORERPQywgb3IgTkFNRVNQQUNFLCB0aGlzIHJldHVybnMgMC4gCisgICAgICogVGhlIHZhbHVlIG9mIGFuIGVtcHR5IHRhZyBpcyB0aGUgZW1wdHkgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgcmV0dXJuZWRDaGFycyAgQSBjaGFyYWN0ZXIgYXJyYXkgdG8gaG9sZCB0aGUgcmV0dXJuZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gIG9mZnNldCAgVGhlIHBvc2l0aW9uIHdpdGhpbiByZXR1cm5lZENoYXJzIHRvIHdoaWNoIHRoZSBmaXJzdCBvZiB0aGUgCisgICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgorICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCisgICAgICogbG9jYXRpb24gdG8gY29weS4KKyAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZDsgMCBpZiBubyBjaGFyYWN0ZXJzIAorICAgICAqIHdlcmUgY29waWVkLgorICAgICAqLworCisgICAgaW50IGdldFRleHRWYWx1ZSAoIGNoYXJbXSByZXR1cm5lZENoYXJzLCBpbnQgb2Zmc2V0LCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBjdXJyZW50IFRFWFQgdG9rZW4uICBJZiB0aGUgY3VycmVudCB0b2tlbgorICAgICAqIGlzIG5vdCBURVhULCByZXR1cm5zICIiLiAgSWYgaW4gdGhlIG1pZGRsZSBvZiBhIFRFWFQgdG9rZW4sIHJldHVybnMKKyAgICAgKiB0aG9zZSBjaGFycyB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciBvZiB0aGUgVEVYVCB0b2tlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIHRleHQ7IGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCB0b2tlbiB0eXBlIGlzCisgICAgICogbm90IFRFWFQuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiBpZiB0aGF0IFhNTCdzCisgICAgICogdG9rZW4gdHlwZSBpcyBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IgUFJPQ0lOU1QuIDxici8+PGJyLz4KKyAgICAgKgorICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKKyAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSB0ZXh0IHRvIHVzZSBhcyBhIG5ldyB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzICBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBJZiB0aGUgdG9rZW4gdHlwZSBhdCB0aGlzCisgICAgICogY3Vyc29yJ3MgbG9jYXRpb24gaXMgbm90IFNUQVJULCBTVEFSVERPQywgQVRUUiwgQ09NTUVOVCBvcgorICAgICAqIFBST0NJTlNULgorICAgICAqLworICAgIHZvaWQgc2V0VGV4dFZhbHVlICggU3RyaW5nIHRleHQgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBYTUwgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiAoaWYgdGhhdCBYTUwncworICAgICAqIHRva2VuIHR5cGUgaXMgU1RBUlQsIFNUQVJURE9DLCBBVFRSLCBDT01NRU5UIG9yIFBST0NJTlNUKSB0byB0aGUgCisgICAgICogY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuIDxici8+PGJyLz4KKyAgICAgKgorICAgICAqIEZvciBlbGVtZW50cyB0aGF0IGhhdmUgbmVzdGVkIGNoaWxkcmVuIHRoaXMgZmlyc3QgcmVtb3ZlcyBhbGwKKyAgICAgKiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4gdGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHNvdXJjZUNoYXJzICBBIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBYTUwncyBuZXcgdmFsdWUuCisgICAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBwb3NpdGlvbiB3aXRoaW4gc291cmNlQ2hhcnMgZnJvbSB3aGljaCB0aGUgZmlyc3Qgb2YgCisgICAgICogdGhlIHNvdXJjZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBjb3BpZWQuCisgICAgICogQHBhcmFtICBsZW5ndGggIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNldCBhcyB0aGUgWE1MJ3MgbmV3CisgICAgICogdmFsdWUuCisgICAgICogQHRocm93cyAgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIHRva2VuIHR5cGUgYXQgdGhpcworICAgICAqIGN1cnNvcidzIGxvY2F0aW9uIGlzIG5vdCBTVEFSVCwgU1RBUlRET0MsIEFUVFIsIENPTU1FTlQgb3IKKyAgICAgKiBQUk9DSU5TVC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFRleHRWYWx1ZSAoIGNoYXJbXSBzb3VyY2VDaGFycywgaW50IG9mZnNldCwgaW50IGxlbmd0aCApOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBjaGFyYWN0ZXJzIHRvIHRoZSByaWdodCBvZiB0aGUgY3Vyc29yIHVwIHRvIHRoZSBuZXh0IHRva2VuLgorICAgICAqLworICAgIFN0cmluZyBnZXRDaGFycyAoICk7CisgICAgCisgICAgLyoqCisgICAgICogQ29waWVzIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlciwgY291bnRpbmcgcmlnaHQgZnJvbSAKKyAgICAgKiB0aGlzIGN1cnNvcidzIGxvY2F0aW9uIHRvIHRoZSBjaGFyYWN0ZXIgYXQgPGVtPm1heENoYXJhY3RlckNvdW50PC9lbT4uICBUaGUgCisgICAgICogcmV0dXJuZWQgY2hhcmFjdGVycyBhcmUgYWRkZWQgdG8gPGVtPnJldHVybmVkQ2hhcnM8L2VtPiwgd2l0aCB0aGUgZmlyc3QKKyAgICAgKiBjaGFyYWN0ZXIgY29waWVkIHRvIHRoZSA8ZW0+b2Zmc2V0PC9lbT4gcG9zaXRpb24uIFRoZSA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPiAKKyAgICAgKiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIDxlbT5yZXR1cm5lZENoYXJzPC9lbT4gCisgICAgICogbWludXMgPGVtPm9mZnNldDwvZW0+LiBDb3BpZXMgYSBudW1iZXIgb2YgY2hhcmFjdGVycywgd2hpY2ggaXMgCisgICAgICogZWl0aGVyIDxlbT5tYXhDaGFyYWN0ZXJDb3VudDwvZW0+IG9yIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgbmV4dCB0b2tlbiwgCisgICAgICogd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogCisgICAgICogQHBhcmFtICByZXR1cm5lZENoYXJzICBBIGNoYXJhY3RlciBhcnJheSB0byBob2xkIHRoZSByZXR1cm5lZCBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSAgb2Zmc2V0ICBUaGUgcG9zaXRpb24gd2l0aGluIHJldHVybmVkQ2hhcnMgYXQgd2hpY2ggdGhlIGZpcnN0IG9mIHRoZSAKKyAgICAgKiByZXR1cm5lZCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAorICAgICAqIGxvY2F0aW9uIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJldHVybmVkOyAwIGlmIG5vIGNoYXJhY3RlcnMgCisgICAgICogd2VyZSByZXR1cm5lZCBvciBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBub3QgVEVYVC4gCisgICAgICovCisKKyAgICBpbnQgZ2V0Q2hhcnMgKCBjaGFyW10gcmV0dXJuZWRDaGFycywgaW50IG9mZnNldCwgaW50IG1heENoYXJhY3RlckNvdW50ICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgU1RBUlRET0MgdG9rZW4sIHdoaWNoIGlzIHRoZSAKKyAgICAgKiByb290IG9mIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKworICAgIHZvaWQgdG9TdGFydERvYyAoICk7CisgICAgCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgRU5ERE9DIHRva2VuLCB3aGljaCBpcyB0aGUgZW5kCisgICAgICogb2YgdGhlIGRvY3VtZW50LgorICAgICAqLworCisgICAgdm9pZCB0b0VuZERvYyAoICk7CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcworICAgICAqIHRoaXMgY3Vyc29yLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHRoYXQgbWF5IGJlIGluIHRoZSBzYW1lIGRvY3VtZW50CisgICAgICogYXMgdGhpcyBjdXJzb3IuCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGN1cnNvciBpcyBpbiB0aGUgc2FtZSBkb2N1bWVudDsKKyAgICAgKiBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc0luU2FtZURvY3VtZW50ICggWG1sQ3Vyc29yIGN1cnNvciApOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGN1cnNvciBpcyBiZWZvcmUsIAorICAgICAqIGFmdGVyLCBvciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvci4gPGJyLz48YnIvPgorICAgICAqIAorICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpIDwgMDwvY29kZT4gbWVhbnMgYSBpcyB0byB0aGUgbGVmdCBvZiBiLjxici8+CisgICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMDwvY29kZT4gbWVhbnMgYSBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBiLjxici8+CisgICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPiAwPC9jb2RlPiBtZWFucyBhIGlzIHRvIHRoZSByaWdodCBvZiBiLjxici8+PGJyLz4KKyAgICAgKgorICAgICAqIFRoZSBzb3J0IG9yZGVyIG9mIGN1cnNvcnMgaW4gdGhlIGRvY3VtZW50IGlzIHRoZSB0b2tlbiBvcmRlci4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgY3Vyc29yICJhIiBpcyBhdCBhIFNUQVJUIHRva2VuIGFuZCB0aGUgY3Vyc29yICJiIgorICAgICAqIGlzIGF0IGEgdG9rZW4gd2l0aGluIHRoZSBjb250ZW50cyBvZiB0aGUgc2FtZSBlbGVtZW50LCB0aGVuCisgICAgICogYS5jb21wYXJlUG9zaXRpb24oYikgd2lsbCByZXR1cm4gLTEsIG1lYW5pbmcgdGhhdCB0aGUgcG9zaXRpb24KKyAgICAgKiBvZiBhIGlzIGJlZm9yZSBiLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAorICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCisgICAgICogQHJldHVybiAgMSBpZiB0aGlzIGN1cnNvciBpcyBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgMCBpZiAKKyAgICAgKiB0aGlzIGN1cnNvciBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgc3BlY2lmaWVkIGN1cnNvcjsgCisgICAgICogLTEgaWYgdGhpcyBjdXJzb3IgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgY3Vyc29yLgorICAgICAqIEB0aHJvd3MgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjdXJzb3IgaXMgbm90IGluIHRoZSBzYW1lIGRvY3VtZW50IGFzIHRoaXMgY3Vyc29yLgorICAgICAqLworCisgICAgaW50IGNvbXBhcmVQb3NpdGlvbiAoIFhtbEN1cnNvciBjdXJzb3IgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIChvciBiZWZvcmUpCisgICAgICogdGhlIHNwZWNpZmllZCBjdXJzb3IuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFzIAorICAgICAqIDxjb2RlPmEuY29tcGFyZVBvc2l0aW9uKGIpICZsdDsgMCA8L2NvZGU+CisgICAgICogCisgICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCisgICAgICogd2l0aCB0aGlzIGN1cnNvci4KKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjdXJzb3I7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisKKyAgICBib29sZWFuIGlzTGVmdE9mICggWG1sQ3Vyc29yIGN1cnNvciApOworICAgIAorICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhpcyBjdXJzb3IgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGN1cnNvci4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgYXMgCisgICAgICogPGNvZGU+YS5jb21wYXJlUG9zaXRpb24oYikgPT0gMCA8L2NvZGU+CisgICAgICogCisgICAgICogQHBhcmFtICBjdXJzb3IgIFRoZSBjdXJzb3Igd2hvc2UgcG9zaXRpb24gc2hvdWxkIGJlIGNvbXBhcmVkCisgICAgICogd2l0aCB0aGlzIGN1cnNvci4KKyAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgY3Vyc29yIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIAorICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiBpc0F0U2FtZVBvc2l0aW9uQXMgKCBYbWxDdXJzb3IgY3Vyc29yICk7CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgKG9yIGFmdGVyKQorICAgICAqIHRoZSBzcGVjaWZpZWQgY3Vyc29yLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyAKKyAgICAgKiA8Y29kZT5hLmNvbXBhcmVQb3NpdGlvbihiKSAmZ3Q7IDAgPC9jb2RlPgorICAgICAqIAorICAgICAqIEBwYXJhbSAgY3Vyc29yICBUaGUgY3Vyc29yIHdob3NlIHBvc2l0aW9uIHNob3VsZCBiZSBjb21wYXJlZAorICAgICAqIHdpdGggdGhpcyBjdXJzb3IuCisgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGlzIGN1cnNvciBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHNwZWNpZmllZAorICAgICAqIGN1cnNvcjsgb3RoZXJ3aXNlLCBmYWxzZS4KKyAgICAgKi8KKworICAgIGJvb2xlYW4gaXNSaWdodE9mICggWG1sQ3Vyc29yIGN1cnNvciApOworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKKyAgICAgKiBjdXJzb3IgaXMgaW4uIDxici8+PGJyLz4KKyAgICAgKiAKKyAgICAgKiBUaGUgcXVlcnkgbWF5IGJlIGEgU3RyaW5nIG9yIGEgY29tcGlsZWQgcXVlcnkuIFlvdSBjYW4gcHJlY29tcGlsZQorICAgICAqIGFuIFhRdWVyeSBleHByZXNzaW9uIHVzaW5nIHRoZSBYbWxCZWFucy5jb21waWxlUXVlcnkgbWV0aG9kLiA8YnIvPjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGUgcm9vdCByZWZlcnJlZCB0byBieSB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgZ2l2ZW4gYXMgCisgICAgICogYSBkb3QuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBwYXRoIGV4cHJlc3Npb246CisgICAgICogPHByZT4KKyAgICAgKiBYbWxDdXJzb3IgcmVzdWx0cyA9IGN1cnNvci5leGVjUXVlcnkoInB1cmNoYXNlLW9yZGVyL2xpbmUtaXRlbVtwcmljZSAmbHQ7PSAyMC4wMF0iKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KKyAgICAgKiBAcmV0dXJuICBBIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS4KKyAgICAgKiBAdGhyb3dzICBYbWxSdW50aW1lRXhjZXB0aW9uICBJZiB0aGUgcXVlcnkgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgorICAgICAqLworCisgICAgWG1sQ3Vyc29yIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApOworICAgIAorICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgWFF1ZXJ5IGV4cHJlc3Npb24gYWdhaW5zdCB0aGUgWE1MIHRoaXMKKyAgICAgKiBjdXJzb3IgaXMgaW4sIGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIDxici8+PGJyLz4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHF1ZXJ5ICBUaGUgWFF1ZXJ5IGV4cHJlc3Npb24gdG8gZXhlY3V0ZS4KKyAgICAgKiBAcGFyYW0gIG9wdGlvbnMgIE9wdGlvbnMgZm9yIHRoZSBxdWVyeS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2FsbCAKKyAgICAgKiB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIoU3RyaW5nKSBYbWxPcHRpb25zLnNldFhxdWVyeUN1cnJlbnROb2RlVmFyKFN0cmluZyl9CisgICAgICogbWV0aG9kIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG5hbWUgZm9yIHRoZSBxdWVyeSBleHByZXNzaW9uIAorICAgICAqIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250ZXh0IG5vZGUuCisgICAgICogQHRocm93cyAgWG1sUnVudGltZUV4Y2VwdGlvbiAgSWYgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gaXMgaW52YWxpZC4KKyAgICAgKi8KKworICAgIFhtbEN1cnNvciBleGVjUXVlcnkgKCBTdHJpbmcgcXVlcnksIFhtbE9wdGlvbnMgb3B0aW9ucyApOworICAgIAorICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgZGNvdW1lbnQgYXQgYSBwYXJ0aWN1bGFyIHBvaW50CisgICAgICogaW4gdGltZS4gIEl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZAorICAgICAqIHNpbmNlIHRoYXQgcG9pbnQgaW4gdGltZS4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgQ2hhbmdlU3RhbXAKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkb2N1bWVudCBhc3NvaWF0ZWQgd2l0aCB0aGlzIENoYW5nZVN0YW1wCisgICAgICAgICAqIGhhcyBiZWVuIGFsdGVyZWQgc2luY2UgdGhlIENoYW5nZVN0YW1wIGhhZCBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkICggKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjaGFuZ2Ugc3RhbXAgZm9yIHRoZSBkb2N1bWVudCB0aGUgY3VycmVudCBjdXJzb3IgaXMgaW4uIAorICAgICAqIFRoaXMgY2hhbmdlIHN0YW1wIGNhbiBiZSBxdWVyaWVkIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZSB0byBmaW5kIG91dAorICAgICAqIGlmIHRoZSBkb2N1bWVudCBoYXMgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBUaGUgY2hhbmdlIHN0YW1wIGZvciB0aGUgZG9jdW1lbnQgdGhlIGN1cnJlbnQgY3Vyc29yIGlzIGluLgorICAgICAqLworICAgIENoYW5nZVN0YW1wIGdldERvY0NoYW5nZVN0YW1wICggKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIG9mIFhtbEJvb2ttYXJrIGNhbiBiZSB1c2VkIHRvIGFubm90YXRlIGFuIFhNTCBkb2N1bWVudC4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIGFic3RyYWN0IHRvIHByZXZlbnQgcGFydGllcyBmcm9tIGluYWR2ZXJ0ZW50bHkgCisgICAgICogaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVycycgYm9va21hcmtzIHdpdGhvdXQgZXhwbGljaXRseQorICAgICAqIHNoYXJpbmcgYSBib29rbWFyayBjbGFzcy4KKyAgICAgKi8KKworICAgIGFic3RyYWN0IGNsYXNzIFhtbEJvb2ttYXJrCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIHN0cm9uZ2x5LXJlZmVyZW5jZWQgYm9va21hcmsuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggKSB7IHRoaXMoIGZhbHNlICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgYm9va21hcmsuCisgICAgICAgICAqIEBwYXJhbSB3ZWFrIHRydWUgaWYgdGhlIGRvY3VtZW50J3MgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyayBzaG91bGQgYmUgYSBXZWFrUmVmZXJlbmNlCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrICggYm9vbGVhbiB3ZWFrICkKKyAgICAgICAgeworICAgICAgICAgICAgX3JlZiA9IHdlYWsgPyBuZXcgV2Vha1JlZmVyZW5jZSggdGhpcyApIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGwgdGhlIGNyZWF0ZUN1cnNvciBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGN1cnNvciB3aGljaCBpcworICAgICAgICAgKiBwb3NpdGlvbmVkIGF0IHRoZSBzYW1lIHNwbGFjZSBhcyB0aGUgYm9va21hcmsuICBJdCBpcyBtdWNoIG1vcmUKKyAgICAgICAgICogZWZmaWNpZW50IHRvIGNhbGwgdG9Cb29rbWFyayBvbiBhbiBleGlzdGluZyBjdXJzb3IgdGhhbiBpdAorICAgICAgICAgKiBpcyB0byBjcmVhdGUgYSBuZXcgY3Vyc29yLiAgSG93ZXZlciwgdG9Cb29rbWFyayBtYXkgZmFpbCBpZiB0aGUKKyAgICAgICAgICogYm9va21hcmsgaXMgaW4gYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgY3Vyc29yLiAgSXQgaXMKKyAgICAgICAgICogdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyB3aGVyZSBjcmVhdGVDdXJzb3IgbmVlZHMgdG8gYmUgY2FsbGVkCisgICAgICAgICAqIG9uIHRoZSBib29rbWFyay4gIFN1YnNlcXVlbnQgbmF2aWdhdGlvbnMgdG8gYm9va21hcmsKKyAgICAgICAgICogcG9zaXRpb25zIHNob3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZSBsYXN0IGN1cnNvciB0bworICAgICAgICAgKiBpbXByb3ZlIHBlcmZvcm1hY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50TWFyayA9PSBudWxsID8gbnVsbCA6IF9jdXJyZW50TWFyay5jcmVhdGVDdXJzb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNb3ZlcyB0aGUgZ2l2ZW4gY3Vyc29yIHRvIHRoaXMgYm9va21hcmssIGFuZCByZXR1cm5zIGl0LgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBmaW5hbCBYbWxDdXJzb3IgdG9Cb29rbWFyayAoIFhtbEN1cnNvciBjICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGMgPT0gbnVsbCB8fCAhYy50b0Jvb2ttYXJrKCB0aGlzICkgPyBjcmVhdGVDdXJzb3IoKSA6IGM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQga2V5IGZvciBib29rbWFya3MgaXMgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMKKyAgICAgICAgICogdGhlbS4gIFRoaXMgd2F5LCBtdWx0aXBsZSBwYXJ0aWVzIHVzaW5nIGJvb2ttYXJrcyBpbiB0aGUKKyAgICAgICAgICogc2FtZSBpbnN0YW5jZSBkb2N1bWVudCB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCBlYWNob3RoZXIuCisgICAgICAgICAqIE9uZSBjYW4sIGhvd2V2ZXIsIG92ZXJyaWRlIGdldEtleSgpIHRvIHVzZSBhIGtleSBvdGhlciB0aGFuCisgICAgICAgICAqIHRoZSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5ICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1hcmsgaXMgc2V0IGJ5IHRoZSBob3N0IGRvY3VtZW50OyBpdCBpcyBjYXBhYmxlIG9mCisgICAgICAgICAqIHJldHVybmluZyBhbiBYbWxDdXJzb3IgaW1wbGVtZW50YXRpb24gYXQgdGhlIGxvY2F0aW9uIG9mCisgICAgICAgICAqIHRoZSBib29rbWFyay4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgICAgICAgWG1sTWFyayAgIF9jdXJyZW50TWFyazsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiBub24tbnVsbCwgdGhlIHJlZiBpcyB1c2VkIGJ5IHRoZSBob3N0IGRvY3VtZW50CisgICAgICAgICAqIHRvIG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBib29rbWFyay4gIElmIGl0IGlzIGEgd2VhaworICAgICAgICAgKiByZWZlcmVuY2UsIHRoZSBob3N0IGRvY3VtZW50IHdpbGwgbm90IHByZXZlbnQgdGhlIEJvb2ttYXJrCisgICAgICAgICAqIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIGZpbmFsIFJlZmVyZW5jZSBfcmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGFic3RyYWN0IHtAbGluayBYbWxDdXJzb3J9IGZhY3RvcnkuCisgICAgICogSW1wbGVtZW50YXRpb25zIG9mIFhtbEN1cnNvciBpbXBsZW1lbnQgWG1sTWFyayB0byBiZSBhYmxlIHRvCisgICAgICogcmVjb25zdGl0dXRlIGEgY3Vyc29yIGZyb20gYSBib29rbWFyay4gV2hlbiBjb250ZW50IG1vdmVzIGJldHdlZW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMsIHRoZSBYbWxNYXJrIGlzIHNldCB0byB0aGUgaW1wbG1lbnRhdGlvbidzIHdoaWNoCisgICAgICogcmVjaWV2ZXMgdGhlIG5ldyBjb250ZW50LgorICAgICAqLworCisgICAgaW50ZXJmYWNlIFhtbE1hcmsKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBib29rbWFyayB0byB0aGUgZG9jdW1lbnQgYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBib29rbWFyayBpcyBhdHRhY2hlZCB0byB0aGUgdG9rZW4gaW4gdGhlIHRyZWUgaW1tZWRpYXRlbHkgCisgICAgICogYWZ0ZXIgdGhlIGN1cnNvci4gSWYgdGhlIHRyZWUgaXMgbWFuaXB1bGF0ZWQgdG8gbW92ZQorICAgICAqIHRoYXQgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHBsYWNlLCB0aGUgYm9va21hcmsgbW92ZXMgd2l0aCBpdC4KKyAgICAgKiBJZiB0aGUgdHJlZSBpcyBtYW5pcHVsYXRlZCB0byBkZWxldGUgdGhhdCB0b2tlbiBmcm9tIHRoZQorICAgICAqIHRyZWUsIHRoZSBib29rbWFyayBpcyBvcnBoYW5lZC4gQ29weSBvcGVyYXRpb25zIGRvIG5vdCBjb3B5CisgICAgICogYm9va21hcmtzLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgYm9va21hcmsgIFRoZSBib29rbWFyayB0byBzZXQuCisgICAgICovCisKKyAgICB2b2lkIHNldEJvb2ttYXJrICggWG1sQm9va21hcmsgYm9va21hcmsgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvb2ttYXJrIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgCisgICAgICogYXQgdGhpcyBjdXJzb3IncyBsb2NhdGlvbi4gSWYgdGhlcmUgaXMgbm8gYm9va21hcmsgd2hvc2Uga2V5IGlzIAorICAgICAqIGdpdmVuIGJ5IHRoZSBzcGVjaWZpZWQga2V5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBudWxsIGlzIHJldHVybmVkLiAKKyAgICAgKiBJZiB0aGUge0BsaW5rIFhtbEN1cnNvci5YbWxCb29rbWFyayNnZXRLZXkoKSBnZXRLZXl9IG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBvbiAKKyAgICAgKiB0aGUgYm9va21hcmssIHRoZW4gdGhlIGJvb2ttYXJrJ3MgY2xhc3MgaXMgdXNlZCBhcyB0aGUga2V5LgorICAgICAqIAorICAgICAqIEBwYXJhbSAga2V5ICBUaGUga2V5IGZvciB0aGUgYm9va21hcmsgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBib29rbWFyazsgbnVsbCBpZiB0aGVyZSBpcyBubyBib29rbWFyaworICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisKKyAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGJvb2ttYXJrIHdob3NlIGtleSBpcyBzcGVjaWZpZWQsIGlmIHRoZSBib29rbWFyaworICAgICAqIGV4aXN0cyBhdCB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSAga2V5ICBUaGUgZm9yIHRoZSBib29rbWFyayB0byBjbGVhci4KKyAgICAgKi8KKworICAgIHZvaWQgY2xlYXJCb29rbWFyayAoIE9iamVjdCBrZXkgKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGJvb2ttYXJrcyBhdCB0aGlzIGxvY2F0aW9uLCBhZGRpbmcgdGhlbSB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gQm9va21hcmtzIGhlbGQgYnkgd2VhayByZWZlcmVuY2VzIGFyZQorICAgICAqIGFkZGVkIHRvIHRoaXMgY29sbGVjdGlvbiBhcyBXZWFrIHJlZmVyZW5jZWQgb2JqZWN0cyBwb2ludGluZyB0byB0aGUKKyAgICAgKiBib29rbWFyay4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGxpc3RUb0ZpbGwgIFRoZSBjb2xsZWN0aW9uIHRoYXQgd2lsbCBjb250YWluIGJvb2ttYXJrcworICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqLworCisgICAgdm9pZCBnZXRBbGxCb29rbWFya1JlZnMgKCBDb2xsZWN0aW9uIGxpc3RUb0ZpbGwgKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIFhNTCB0aGF0IGlzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yLgorICAgICAqIAorICAgICAqIEZvciB0aGUgVEVYVCwgQVRUUiwgTkFNRVNQQUNFLCBDT01NRU5UIGFuZCBQUk9DSU5TVCB0b2tlbnMsIGEgc2luZ2xlIAorICAgICAqIHRva2VuIGlzIHJlbW92ZWQuIEZvciBhIFNUQVJUIHRva2VuLCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGFuZCBhbGwgCisgICAgICogb2YgaXRzIGNvbnRlbnRzIGFyZSByZW1vdmVkLiBGb3IgYWxsIG90aGVyIHRva2VucywgdGhpcyBpcyBhIG5vLW9wLiAKKyAgICAgKiBZb3UgY2Fubm90IHJlbW92ZSBhIFNUQVJURE9DLgorICAgICAqIAorICAgICAqIFRoZSBjdXJzb3JzIGxvY2F0ZWQgaW4gdGhlIFhNTCB0aGF0IHdhcyByZW1vdmVkIGFsbCBjb2xsYXBzZSB0byB0aGUgCisgICAgICogc2FtZSBsb2NhdGlvbi4gQWxsIGJvb2ttYXJrcyBpbiB0aGlzIFhNTCB3aWxsIGJlIG9ycGhhbmVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZDsgZmFsc2Ugb25seSBpZiB0aGUgY3Vyc29yIGlzIAorICAgICAqIGp1c3QgYmVmb3JlIEVORCBvciBFTkRET0MgdG9rZW4uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgY3Vyc29yIGlzIGF0IGEgCisgICAgICogU1RBUlRET0MgdG9rZW4uCisgICAgICovCisKKyAgICBib29sZWFuIHJlbW92ZVhtbCAoICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgWE1MIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBsb2NhdGlvbgorICAgICAqIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvciwgc2hpZnRpbmcgWE1MIGF0IHRoYXQgbG9jYXRpb24gCisgICAgICogdG8gdGhlIHJpZ2h0IHRvIG1ha2Ugcm9vbS4gRm9yIHRoZSBURVhULCBBVFRSLCBOQU1FU1BBQ0UsIAorICAgICAqIENPTU1FTlQgYW5kIFBST0NJTlNUIHRva2VucywgYSBzaW5nbGUgdG9rZW4gaXMgbW92ZWQuIEZvciBhIHN0YXJ0IHRva2VuLCB0aGUKKyAgICAgKiBlbGVtZW50IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBtb3ZlZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKKyAgICAgKiBpcyBhIG5vLW9wLgorICAgICAqIAorICAgICAqIFRoZSBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIG1vdmVkIGFsc28gbW92ZSB0byB0aGUKKyAgICAgKiBuZXcgbG9jYXRpb247IHRoZSBjdXJzb3JzIGRvbid0IG1vdmUgd2l0aCB0aGUgY29udGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKKyAgICAgKiBiZSBtb3ZlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55dGhpbmcgd2FzIG1vdmVkOyBmYWxzZSBvbmx5IGlmIHRoZSBjdXJzb3IgaXMgCisgICAgICoganVzdCBiZWZvcmUgRU5EIG9yIEVORERPQyB0b2tlbi4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICBib29sZWFuIG1vdmVYbWwgKCBYbWxDdXJzb3IgdG9IZXJlICk7CisgICAgCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBYTUwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uCisgICAgICogc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLiBGb3IgdGhlIFRFWFQsIEFUVFIsIE5BTUVTUEFDRSwgCisgICAgICogQ09NTUVOVCBhbmQgUFJPQ0lOU1QgdG9rZW5zLCBhIHNpbmdsZSB0b2tlbiBpcyBjb3BpZWQuICBGb3IgYSBzdGFydCB0b2tlbiwgCisgICAgICogdGhlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgY29udGVudHMgYXJlIGNvcGllZC4gRm9yIGFsbCBvdGhlciB0b2tlbnMsIHRoaXMKKyAgICAgKiBpcyBhIG5vLW9wLgorICAgICAqIAorICAgICAqIFRoZSBjdXJzb3JzIGFuZCBib29rbWFya3MgbG9jYXRlZCBpbiB0aGUgWE1MIHRoYXQgd2FzIGNvcGllZCBhcmUgYWxzbyBjb3BpZWQgCisgICAgICogdG8gdGhlIG5ldyBsb2NhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciBhdCB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlIFhNTCBzaG91bGQKKyAgICAgKiBiZSBjb3BpZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBjb3BpZWQ7IGZhbHNlIGlmIHRoZSB0b2tlbiBzdXBwb3J0cyB0aGUgb3BlcmF0aW9uLAorICAgICAqIGJ1dCBub3RoaW5nIHdhcyBjb3BpZWQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgYm9vbGVhbiBjb3B5WG1sICggWG1sQ3Vyc29yIHRvSGVyZSApOworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgKFNUQVJURE9DIE9SIFNUQVJUKSBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqIHRoaXMgY3Vyc29yLiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMKKyAgICAgKiBub3QgcmVtb3ZlIGF0dHJpYnV0ZXMgb3IgbmFtc3BhY2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworCisgICAgYm9vbGVhbiByZW1vdmVYbWxDb250ZW50cyAoICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciAoU1RBUlRET0MgT1IgU1RBUlQpIGltbWVkaWF0ZWx5IGFmdGVyCisgICAgICogdGhpcyBjdXJzb3IgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgPGVtPnRvSGVyZTwvZW0+IGN1cnNvci4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHNpdHVhdGlvbnMsIHJldHVybnMgZmFsc2UuIERvZXMgbm90IG1vdmUgYXR0cmlidXRlcyBvcgorICAgICAqIG5hbWVzcGFjZXMuCisgICAgICogCisgICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkIGJlIG1vdmVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgbW92ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCisgICAgICovCisgICAgYm9vbGVhbiBtb3ZlWG1sQ29udGVudHMgKCBYbWxDdXJzb3IgdG9IZXJlICk7CisgICAgCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyIChTVEFSVERPQyBPUiBTVEFSVCkgaW1tZWRpYXRlbHkgdG8KKyAgICAgKiB0aGUgcmlnaHQgb2YgdGhlIGN1cnNvciB0byB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSA8ZW0+dG9IZXJlPC9lbT4gY3Vyc29yLgorICAgICAqIEZvciBhbGwgb3RoZXIgc2l0dWF0aW9ucywgcmV0dXJucyBmYWxzZS4gIERvZXMgbm90IGNvcHkgYXR0cmlidXRlcyBvcgorICAgICAqIG5hbWVzcGFjZXMuCisgICAgICogCisgICAgICogQHBhcmFtICB0b0hlcmUgIFRoZSBjdXJzb3IgYXQgdGhlIGxvY2F0aW9uIHRvIHdoaWNoIHRoZSBYTUwgc2hvdWxkCisgICAgICogYmUgY29waWVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyB3YXMgY29waWVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgICAqLworICAgIGJvb2xlYW4gY29weVhtbENvbnRlbnRzICggWG1sQ3Vyc29yIHRvSGVyZSApOworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgY2hhcmFjdGVycyB1cCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLCBjb3VudGluZyByaWdodCBmcm9tIAorICAgICAqIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24gdG8gdGhlIGNoYXJhY3RlciBhdCA8ZW0+bWF4Q2hhcmFjdGVyQ291bnQ8L2VtPi4gVGhlIAorICAgICAqIHNwYWNlIHJlbWFpbmluZyBmcm9tIHJlbW92aW5nIHRoZSBjaGFyYWN0ZXJzIGNvbGxhcHNlcyB1cCB0byB0aGlzIGN1cnNvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG1heENoYXJhY3RlckNvdW50ICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlciB0aGlzIGN1cnNvcidzIAorICAgICAqIGxvY2F0aW9uIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuICBUaGUgYWN0dWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgaW50IHJlbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50ICk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY3Vyc29yIHRvIHRoZSBwb3NpdGlvbiBpbW1lZGlhdGVseSAKKyAgICAgKiBhZnRlciB0aGUgc3BlY2lmaWVkIGN1cnNvci4gQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIG1heGltdW0gbnVtYmVyLiBYTUwgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGN1cnNvciBpcyAKKyAgICAgKiBzaGlmdGVkIHRvIHRoZSByaWdodCB0byBtYWtlIHJvb20uIFRoZSBzcGFjZSByZW1haW5pbmcgZnJvbSBtb3ZpbmcgdGhlIAorICAgICAqIGNoYXJhY3RlcnMgY29sbGFwc2VzIHVwIHRvIHRoaXMgY3Vyc29yLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCisgICAgICogbG9jYXRpb24gdG8gbW92ZS4KKyAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgbW92ZWQuCisgICAgICogQHJldHVybiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBtb3ZlZC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICBpbnQgbW92ZUNoYXJzICggaW50IG1heENoYXJhY3RlckNvdW50LCBYbWxDdXJzb3IgdG9IZXJlICk7CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgY2hhcmFjdGVycyB0byB0aGUgcG9zaXRpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogQ2hhcmFjdGVycyBhcmUgY291bnRlZCB0byB0aGUgcmlnaHQgdXAgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIG51bWJlci4gCisgICAgICogWE1MIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBjdXJzb3IgaXMgc2hpZnRlZCB0byB0aGUgcmlnaHQgdG8gbWFrZSByb29tLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbWF4Q2hhcmFjdGVyQ291bnQgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFmdGVyIHRoaXMgY3Vyc29yJ3MgCisgICAgICogbG9jYXRpb24gdG8gY29weS4KKyAgICAgKiBAcGFyYW0gIHRvSGVyZSAgVGhlIGN1cnNvciB0byB3aGljaCB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgY29waWVkLgorICAgICAqIEByZXR1cm4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIGludCBjb3B5Q2hhcnMgKCBpbnQgbWF4Q2hhcmFjdGVyQ291bnQsIFhtbEN1cnNvciB0b0hlcmUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCB0ZXh0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIHRleHQgdG8gaW5zZXJ0LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgaW5zZXJ0Q2hhcnMgKCBTdHJpbmcgdGV4dCApOworICAgIAorICAgIC8qKgorICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAorICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW4gZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIAorICAgICAqIHRoZSBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydEVsZW1lbnQgKCBTdHJpbmcgbG9jYWxOYW1lICk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKKyAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCBzcGVjaWZpZWQgbmFtZXNwYWNlIAorICAgICAqIAorICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgorICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOworICAgIAorICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAorICAgICAqIHF1YWxpZmllZCBuYW1lLiBBZnRlciB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCwgdGhpcyBjdXJzb3IgaXMgYmV0d2VlbiBpdHMgc3RhcnQgCisgICAgICogYW5kIGVuZC4gVGhpcyBjdXJzb3IgY2FuIHRoZW4gYmUgdXNlZCB0byBpbnNlcnQgYWRkaXRpb25hbCBYTUwgaW50byAKKyAgICAgKiB0aGUgbmV3IGVsZW1lbnQuCisgICAgICogCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFFOYW1lIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAorICAgICAqIGxvY2FsIG5hbWUuIEFmdGVyIHRoZSBlbGVtZW50IGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCAKKyAgICAgKiBhbmQgZW5kLiBUaGlzIGN1cnNvciBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIAorICAgICAqIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBsb2NhbE5hbWUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBhcm91bmQgdGhpcyBjdXJzb3IsIGdpdmluZyB0aGUgZWxlbWVudCB0aGUgc3BlY2lmaWVkIAorICAgICAqIGxvY2FsIG5hbWUgYW5kIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIEFmdGVyIHRoZSBlbGVtZW50IAorICAgICAqIGlzIGluc2VydGVkLCB0aGlzIGN1cnNvciBpcyBiZXR3ZWVuIGl0cyBzdGFydCBhbmQgZW5kLiBUaGlzIGN1cnNvciAKKyAgICAgKiBjYW4gdGhlbiBiZSB1c2VkIHRvIGluc2VydCBhZGRpdGlvbmFsIFhNTCBpbnRvIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBlbGVtZW50J3MgbmFtZXNwYWNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgYmVnaW5FbGVtZW50ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOworICAgIAorICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgZWxlbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIHRoZQorICAgICAqIGVsZW1lbnQgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBhbmQgY29udGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgorICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIGNvbnRlbnQgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyB0aGUKKyAgICAgKiBlbGVtZW50IHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgY29udGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIGxvY2FsTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gIHRleHQgIFRoZSBjb250ZW50IGZvciB0aGUgbmV3IGVsZW1lbnQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgdm9pZCBpbnNlcnRFbGVtZW50V2l0aFRleHQgKCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdGV4dCApOworCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhIG5ldyBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgdGhlCisgICAgICogZWxlbWVudCB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUsIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UsIAorICAgICAqIGFuZCBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50LgorICAgICAqIEBwYXJhbSAgdXJpICBUaGUgVVJJIGZvciB0aGUgbmV3IGVsZW1lbnQncyBuYW1lc3BhY2UuCisgICAgICogQHBhcmFtICB0ZXh0ICBUaGUgY29udGVudCBmb3IgdGhlIG5ldyBlbGVtZW50LgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgaW5zZXJ0RWxlbWVudFdpdGhUZXh0ICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHRleHQgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0CisgICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBTdHJpbmcgbG9jYWxOYW1lICk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgbmV3IGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBjdXJzb3IncyBsb2NhdGlvbiwgZ2l2aW5nIGl0CisgICAgICogdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lIGFuZCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgbG9jYWxOYW1lICBUaGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtICB1cmkgIFRoZSBVUkkgZm9yIHRoZSBuZXcgYXR0cmlidXRlJ3MgbmFtZXNwYWNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgdGhlIGluc2VydGlvbiBpcyBub3QgYWxsb3dlZAorICAgICAqIGF0IHRoZSBjdXJzb3IncyBsb2NhdGlvbi4KKyAgICAgKi8KKworICAgIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHVyaSApOworCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhIG5ldyBhdHRyaWJ1dGUgaW1tZWRpYXRlbHkgYmVmb3JlIHRoaXMgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuZXcgYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSAgTmFtZSAgVGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBuZXcgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBTdHJpbmcgTmFtZSwgU3RyaW5nIHZhbHVlICk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGFuIGF0dHJpYnV0ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCBnaXZpbmcgaXQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLCBhbmQgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gIG5hbWUgIFRoZSBuYW1lIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gIHVyaSAgVGhlIFVSSSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUncyBuYW1lc3BhY2UuCisgICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKTsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW4gYXR0cmlidXRlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY3Vyc29yJ3MgbG9jYXRpb24sIGdpdmluZyBpdAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtICBuYW1lICBUaGUgbmFtZSBmb3IgdGhlIG5ldyBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIGZvciB0aGUgbmV3IGF0dHJpYnV0ZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApOworICAgIAorICAgIC8qKgorICAgICAqIEluc2VydHMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJzb3IncyBsb2NhdGlvbiwgCisgICAgICogZ2l2aW5nIGl0IHRoZSBzcGVjaWZpZWQgcHJlZml4IGFuZCBVUkkuCisgICAgICogCisgICAgICogQHBhcmFtICBwcmVmaXggIFRoZSBwcmVmaXggZm9yIHRoZSBuYW1lc3BhY2UuCisgICAgICogQHBhcmFtICBuYW1lc3BhY2UgIFRoZSBVUkkgZm9yIHRoZSBuYW1lc3BhY2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBJZiB0aGUgaW5zZXJ0aW9uIGlzIG5vdCBhbGxvd2VkCisgICAgICogYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uLgorICAgICAqLworCisgICAgdm9pZCBpbnNlcnROYW1lc3BhY2UgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlICk7CisgICAgCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbiBYTUwgY29tbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKKyAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBjb21tZW50J3MgY29udGVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydENvbW1lbnQgKCBTdHJpbmcgdGV4dCApOworCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbiBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGN1cnNvcidzIGxvY2F0aW9uLCAKKyAgICAgKiBnaXZpbmcgaXQgdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIHRleHQuCisgICAgICogCisgICAgICogQHBhcmFtICB0YXJnZXQgIFRoZSB0YXJnZXQgZm9yIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgorICAgICAqIEBwYXJhbSAgdGV4dCAgVGhlIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uJ3MgdGV4dC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIElmIHRoZSBpbnNlcnRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgKiBhdCB0aGUgY3Vyc29yJ3MgbG9jYXRpb24uCisgICAgICovCisKKyAgICB2b2lkIGluc2VydFByb2NJbnN0ICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRleHQgKTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEYXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWU2YWYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZS5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSI+eHM6ZGF0ZTwvYT4gdHlwZS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIERhdGV9LCBhbmQge0BsaW5rIEdEYXRlfS4KKyAqIAorICogQHNlZSBYbWxDYWxlbmRhcgorICogQHNlZSBHRGF0ZQorICovIAorcHVibGljIGludGVyZmFjZSBYbWxEYXRlIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2RhdGUiKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXREYXRlVmFsdWV9CisgICAgICoqLworICAgIERhdGUgZGF0ZVZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldERhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoRGF0ZSBkKTsKKworICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOworICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCisgICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLworICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7CisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLworICAgIERhdGUgZ2V0RGF0ZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBEYXRlfSAqLworICAgIHZvaWQgc2V0RGF0ZVZhbHVlKERhdGUgZCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbERhdGV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERhdGV9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsyMDAzLTA2LTE0Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRGF0ZVRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdhZWUwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERhdGVUaW1lLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSI+eHM6ZGF0ZVRpbWU8L2E+IHR5cGUuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0sIHtAbGluayBEYXRlfSwgYW5kIHtAbGluayBHRGF0ZX0uCisgKiAKKyAqIEBzZWUgWG1sQ2FsZW5kYXIKKyAqIEBzZWUgR0RhdGUKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sRGF0ZVRpbWUgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZGF0ZVRpbWUiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgRGF0ZSBkYXRlVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgRGF0ZX0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChEYXRlIGQpOworCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7CisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KKyAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCisgICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCisgICAgRGF0ZSBnZXREYXRlVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIERhdGV9ICovCisgICAgdm9pZCBzZXREYXRlVmFsdWUoRGF0ZSBkKTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sRGF0ZVRpbWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGVUaW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERhdGVUaW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERhdGVUaW1lfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYtMTRUMTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNi0xNFQxMjowMDowMCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEYXRlVGltZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEYXRlVGltZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERhdGVUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGF0ZVRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERhdGVUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEYXRlVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGF0ZVRpbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERhdGVUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGF0ZVRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERlY2ltYWwuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEZWNpbWFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyNDJjNgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEZWNpbWFsLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPiB0eXBlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQmlnRGVjaW1hbH0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbERlY2ltYWwgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZGVjaW1hbCIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0gKi8KKyAgICBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWxWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnRGVjaW1hbH0gKi8KKyAgICB2b2lkIHNldEJpZ0RlY2ltYWxWYWx1ZShCaWdEZWNpbWFsIGJkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdEZWNpbWFsfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRCaWdEZWNpbWFsVmFsdWV9CisgICAgICoqLworICAgIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbFZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0RlY2ltYWx9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEJpZ0RlY2ltYWxWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoQmlnRGVjaW1hbCBiZCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbERlY2ltYWx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERlY2ltYWx9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbERlY2ltYWx9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbERlY2ltYWx9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNC41Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0LjU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEZWNpbWFsfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERlY2ltYWwgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERlY2ltYWx9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEZWNpbWFsIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEZWNpbWFsKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRGVjaW1hbCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRGVjaW1hbH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRGVjaW1hbCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERlY2ltYWwpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvY3VtZW50UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjI2NTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRG9jdW1lbnRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgaW5mb3JtYXRpb24gdG8gYW4gWE1MCisgKiBkb2N1bWVudC4gIEl0IGFsc28gZGVmaW5lcyBzZXZlcmFsIHdlbGwta25vd24gdHlwZXMgb2YKKyAqIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGF0dGFjaGVkIG9yIGZvdW5kIG9uIGEgZG9jdW1lbnQuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gYXNzb2NpYXRlIGEgZmlsZW5hbWUKKyAqIHdpdGggdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYW4geG1sIG9iamVjdCAieG9iaiIuICBUaGlzCisgKiBjb3VsZCBiZSBkb25lIHZpYSB0aGUgZm9sbG93aW5nIGNvZGU6CisgKiA8cD4KKyAqIHRva2VuU291cmNlLmRvY3VtZW50UHJvcGVydGllcygpLnNldChYbWxEb2N1bWVudFByb3BlcnRpZXMuTkFNRSwgIk15RmlsZW5hbWUueG1sIik7CisgKiA8cD4KKyAqIFRvIGZldGNoIHRoZSBmaWxlbmFtZSBsYXRlciwgZ2l2ZW4gYW4geG9iajIgYW55d2hlcmUgaW4gdGhlCisgKiBzYW1lIGRvY3VtZW50LCB5b3UgY2FuIHdyaXRlOgorICogPHA+CisgKiBmaWxlbmFtZSA9IChTdHJpbmcpdG9rZW5Tb3VyY2UuZG9jdW1lbnRQcm9wZXJ0aWVzKCkuZ2V0KFhtbERvY3VtZW50UHJvcGVydGllcy5OQU1FKTsKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbERvY3VtZW50UHJvcGVydGllcworeworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5CisgICAgICogYmUgYW55IFN0cmluZy4KKyAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgbmFtZSB0byBzZXQKKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCisgICAgKi8gCisgICAgcHVibGljIHZvaWQgICBzZXRTb3VyY2VOYW1lICggU3RyaW5nIHNvdXJjZU5hbWUgKSB7IHB1dCggU09VUkNFX05BTUUsIHNvdXJjZU5hbWUgKTsgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIFhNTCBkb2N1bWVudCBmaWxlLiAgVHlwaWNhbGx5IGEgVVJMLCBidXQgbWF5CisgICAgICogYmUgYW55IFN0cmluZy4KKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRTb3VyY2VOYW1lCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBTT1VSQ0VfTkFNRSApOyB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgWE1MIGRvY3VtZW50LiAgU2hvdWxkIGJlIGEgdmFsaWQKKyAgICAgKiBYTUwgZW5jb2Rpbmcgc3RyaW5nLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgSVNPIGVuY29kaW5nIG5hbWUKKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2RpbmcKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgICBzZXRFbmNvZGluZyAoIFN0cmluZyBlbmNvZGluZyApIHsgcHV0KCBFTkNPRElORywgZW5jb2RpbmcgKTsgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBYTUwgZG9jdW1lbnQsIGFzIGFuIElTTyBlbmNvZGluZyBuYW1lLgorICAgICAqIEBzZWUgWG1sT3B0aW9ucyNzZXRDaGFyYWN0ZXJFbmNvZGluZworICAgICAqLyAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIEVOQ09ESU5HICk7IH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdG8gdXNlIGluIHRoZSAmbHQmIzYzO3htbCYjNjM7Jmd0OyBkZWNsYXJhdGlvbi4KKyAgICAgKiAoVGhlIFhNTCBzcGVjaWZpY2F0aW9uIGlzIHF1aXRlIHN0YWJsZSBhdCAiMS4wIi4pCisgICAgICogQHBhcmFtIHZlcnNpb24gdGhlIFhNTCB2ZXJzaW9uIHN0cmluZworICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCAgIHNldFZlcnNpb24gKCBTdHJpbmcgdmVyc2lvbiApIHsgcHV0KCBWRVJTSU9OLCB2ZXJzaW9uICk7IH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBYTUwgdmVyc2lvbiBzdHJpbmcgdXNlZCBpbiB0aGUgJmx0JiM2Mzt4bWwmIzYzOyZndDsgZGVjbGFyYXRpb24uCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbiAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBWRVJTSU9OICk7IH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBET0NUWVBFIG5hbWUgdXNlIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgorICAgICAqIEBwYXJhbSBkb2N0eXBlbmFtZSB0aGUgZG9jdHlwZW5hbWUKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlTmFtZSAoIFN0cmluZyBkb2N0eXBlbmFtZSApIHsgcHV0KCBET0NUWVBFX05BTUUsIGRvY3R5cGVuYW1lICk7IH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIG5hbWUgdXNlZCBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KKyAgICAgKi8gCisgICAgcHVibGljIFN0cmluZyBnZXREb2N0eXBlTmFtZSAoICkgeyByZXR1cm4gKFN0cmluZykgZ2V0KCBET0NUWVBFX05BTUUgKTsgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIERPQ1RZUEUgcHVibGljIElEIHRvIHVzZSBpbiB0aGUgJmx0JiMzMztET0NUWVBFJmd0OyBkZWNsYXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcHVibGljaWQgdGhlIHB1YmxpYyBJRAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCAgIHNldERvY3R5cGVQdWJsaWNJZCAoIFN0cmluZyBwdWJsaWNpZCApIHsgcHV0KCBET0NUWVBFX1BVQkxJQ19JRCwgcHVibGljaWQgKTsgfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIERPQ1RZUEUgcHVibGljIElEIHVzZWQgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVB1YmxpY0lkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfUFVCTElDX0lEICk7IH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB0byB1c2UgaW4gdGhlICZsdCYjMzM7RE9DVFlQRSZndDsgZGVjbGFyYXRpb24uCisgICAgICogQHBhcmFtIHN5c3RlbWlkIHRoZSBzeXN0ZW0gSUQKKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgICBzZXREb2N0eXBlU3lzdGVtSWQgKCBTdHJpbmcgc3lzdGVtaWQgKSB7IHB1dCggRE9DVFlQRV9TWVNURU1fSUQsIHN5c3RlbWlkICk7IH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBET0NUWVBFIHN5c3RlbSBJRCB1c2VkIGluIHRoZSAmbHQmIzMzO0RPQ1RZUEUmZ3Q7IGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVN5c3RlbUlkICggKSB7IHJldHVybiAoU3RyaW5nKSBnZXQoIERPQ1RZUEVfU1lTVEVNX0lEICk7IH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lc3NhZ2UgZGlnZXN0IHVzZWQgdG8gc3VtbWFyaXplIHRoZSBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gZGlnZXN0IHRoZSBieXRlcyBvZiB0aGUgZGlnZXN0CisgICAgICogCisgICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0CisgICAgICovIAorICAgIHB1YmxpYyB2b2lkICAgc2V0TWVzc2FnZURpZ2VzdCggYnl0ZVtdIGRpZ2VzdCApIHsgcHV0KCBNRVNTQUdFX0RJR0VTVCwgZGlnZXN0ICk7IH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdCB1c2VkIHRvIHN1bW1hcml6ZSB0aGUgZG9jdW1lbnQuCisgICAgICogCisgICAgICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRNZXNzYWdlRGlnZXN0CisgICAgICovIAorICAgIHB1YmxpYyBieXRlW10gZ2V0TWVzc2FnZURpZ2VzdCggKSB7IHJldHVybiAoYnl0ZVtdKSBnZXQoIE1FU1NBR0VfRElHRVNUICk7IH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIChhIFN0cmluZykgZm9yCisgICAgICogdGhlIHNvdXJjZSBmcm9tIHdoaWNoIHRoZSBYTUwgZG9jdW1lbnQgd2FzIGxvYWRlZC4KKyAgICAgKiBUaGlzIG5hbWUsIGlmIHByZXNlbnQsIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgICAgICogZG9jdW1lbnQgd2hlbiByZXBvcnRpbmcgdmFsaWRhdGlvbiBvciBjb21pbGF0aW9uIGVycm9ycy4KKyAgICAgKgorICAgICAqIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKEZpbGUpIGFuZCBTY2hlbWFUeXBlTG9hZGVyLmxvYWRJbnN0YW5jZShGaWxlKQorICAgICAqIGJvdGggYXV0b21hdGljYWxseSBzZXQgdGhpcyB2YWx1ZSB0byB0aGUgZmlsZW5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU09VUkNFX05BTUUgPSBuZXcgT2JqZWN0KCk7CisgICAgCisgICAgLyoqCisgICAgICogRG9jdW1lbnQgZW5jb2RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBFTkNPRElORyA9IG5ldyBPYmplY3QoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEb2N1bWVudCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVkVSU0lPTiA9IG5ldyBPYmplY3QoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEb2MgdHlwZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRE9DVFlQRV9OQU1FID0gbmV3IE9iamVjdCgpOworICAgIAorICAgIC8qKgorICAgICAqIERvYyB0eXBlIHB1YmxpYyBpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfUFVCTElDX0lEID0gbmV3IE9iamVjdCgpOworICAgIAorICAgIC8qKgorICAgICAqIERvYyB0eXBlIHN5c3RlbSBpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERPQ1RZUEVfU1lTVEVNX0lEID0gbmV3IE9iamVjdCgpOworICAgIAorICAgIC8qKgorICAgICAqIFNIQSBtZXNzYWdlIGRpZ2VzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE1FU1NBR0VfRElHRVNUID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQXR0YWNoZXMgYSB2YWx1ZSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnQgY29udGFpbmluZworICAgICAqIHRoZSBnaXZlbiB0b2tlbiBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhlcmUgY2FuIGJlIG9uZSB2YWx1ZSBmb3IgZWFjaCBrZXkuCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhdHRhY2ggdG8gdGhlIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcHV0ICggT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlICk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKKyAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgIFRoZSBzYXZlZCB2YWx1ZSwgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0ICggT2JqZWN0IGtleSApOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHZhbHVlIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBkb2N1bWVudCB1c2luZyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleTogdGhpcyBpcyB0aGUga2V5IHRoYXQgd2FzIHByZXZpb3VzbHkKKyAgICAgKiAgICAgICAgICAgICAgcGFzc2VkIHRvIHNldCB0byBzdG9yZSB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCByZW1vdmUgKCBPYmplY3Qga2V5ICk7Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEb3VibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDY3ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbERvdWJsZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RvdWJsZSI+eHM6ZG91YmxlPC9hPiB0eXBlLgorICogPHA+CisgKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBkb3VibGUuCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbERvdWJsZSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9kb3VibGUiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlICovCisgICAgZG91YmxlIGdldERvdWJsZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGRvdWJsZSAqLworICAgIHZvaWQgc2V0RG91YmxlVmFsdWUoZG91YmxlIHYpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgZG91YmxlCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldERvdWJsZVZhbHVlfQorICAgICAqKi8KKyAgICBkb3VibGUgZG91YmxlVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBkb3VibGUKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0RG91YmxlVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGRvdWJsZSB2KTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sRG91YmxlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxEb3VibGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxEb3VibGV9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzLjM0ZSs1NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjMuMzRlKzU3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRG91YmxlfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbERvdWJsZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEb3VibGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEb3VibGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbERvdWJsZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEb3VibGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbERvdWJsZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRG91YmxlIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRG91YmxlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbER1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNTNmNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxEdXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIj54czpkdXJhdGlvbjwvYT4gdHlwZS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8gYSB7QGxpbmsgR0R1cmF0aW9ufS4KKyAqIAorICogQHNlZSBHRHVyYXRpb24KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sRHVyYXRpb24gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfZHVyYXRpb24iKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0gKi8KKyAgICBHRHVyYXRpb24gZ2V0R0R1cmF0aW9uVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0gKi8KKyAgICB2b2lkIHNldEdEdXJhdGlvblZhbHVlKEdEdXJhdGlvbiBnZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0R1cmF0aW9ufQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRHVyYXRpb25WYWx1ZX0KKyAgICAgKiovCisgICAgR0R1cmF0aW9uIGdEdXJhdGlvblZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEdXJhdGlvbn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0R1cmF0aW9uVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEdEdXJhdGlvblNwZWNpZmljYXRpb24gZ2QpOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxEdXJhdGlvbn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRHVyYXRpb259ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sRHVyYXRpb259ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sRHVyYXRpb259IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7UDFZMk1UMkgmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7UDFZMk1UMkgmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRHVyYXRpb259IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRHVyYXRpb24gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxEdXJhdGlvbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbER1cmF0aW9uIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxEdXJhdGlvbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRHVyYXRpb24pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbER1cmF0aW9ufSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxEdXJhdGlvbiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbER1cmF0aW9uKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUSUVTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1Mjk5MwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVElFUy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNFTlRJVElFUyI+eHM6RU5USVRJRVM8L2E+IHR5cGUsCisgKiBhIGxpc3QgdHlwZS4KKyAqIDxwPgorICogQSBsaXN0IHR5cGUuCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbEVOVElUSUVTIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX0VOVElUSUVTIik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IHZhbHVlcyAqLworICAgIExpc3QgZ2V0TGlzdFZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBYbWxFTlRJVFl9IHZhbHVlcyAqKi8KKyAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KKyAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICoqLworICAgIExpc3QgbGlzdFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbEVOVElUWX0gdmFsdWVzCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICoqLworICAgIExpc3QgeGxpc3RWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KExpc3QgbCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEVOVElUSUVTfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxFTlRJVElFU30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxFTlRJVElFU30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxFTlRJVElFU30gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRJRVN9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRJRVMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVElFU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUSUVTIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVElFUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRJRVMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUSUVTfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVElFUyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUSUVTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxFTlRJVFkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWFhZDVkCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVOVElUWS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUWSI+eHM6RU5USVRZPC9hPiB0eXBlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sRU5USVRZIGV4dGVuZHMgWG1sTkNOYW1lCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfRU5USVRZIik7CisgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxFTlRJVFl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEVOVElUWX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEVOVElUWX0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxFTlRJVFl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRU5USVRZIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEVOVElUWX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEVOVElUWSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRU5USVRZKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEVOVElUWSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRU5USVRZfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxFTlRJVFkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxFTlRJVFkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJiYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEVycm9yLmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBhdCBhIHNwZWNpZmljIFhNTCBsb2NhdGlvbi4KKyAqIDxwPgorICogVGhlIG1lc3NhZ2UgY2FuIGJlIGFuIGVycm9yLCB3YXJuaW5nLCBvciBzaW1wbGUgaW5mb3JtYXRpb24sIGFuZAorICogaXQgbWF5IG9wdGlvbmFsbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgbG9jYXRpb24gaW4KKyAqIGFuIFhNTCBkb2N1bWVudC4gIFRoZSBjbGFzcyBpbmNsdWRlcyBtZXRob2RzIGZvciBleHRyYWN0aW5nCisgKiB0aGUgbG9jYXRpb24gYXMgYSBsaW5lIG51bWJlciwgWG1sQ3Vyc29yLCBvciBYbWxPYmplY3QsIGFzCisgKiB3ZWxsIGFzIGZvciBvYnRhaW5pbmcgYW5kIG1lc3NhZ2UgYW5kIHNldmVyaXR5IG9mIHRoZQorICogZXJyb3IuIAorICogCisgKiBAc2VlIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcgorICogQHNlZSBYbWxFeGNlcHRpb24KKyAqLworcHVibGljIGNsYXNzIFhtbEVycm9yIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIHByaXZhdGUgU3RyaW5nIF9tZXNzYWdlOworICAgIHByaXZhdGUgU3RyaW5nIF9zb3VyY2U7CisgICAgcHJpdmF0ZSBpbnQgICAgX3NldmVyaXR5ID0gU0VWRVJJVFlfRVJST1I7CisgICAgcHJpdmF0ZSBpbnQgICAgX2xpbmUgPSAtMTsKKyAgICBwcml2YXRlIGludCAgICBfY29sdW1uID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgICAgX29mZnNldCA9IC0xOworICAgIAorICAgIHByaXZhdGUgdHJhbnNpZW50IFhtbEN1cnNvciBfY3Vyc29yOworICAgIAorICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHNyYyBUaGUgb3JpZ2luYWwgWG1sRXJyb3IgdG8gY29weS4KKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sRXJyb3IoWG1sRXJyb3Igc3JjKQorICAgIHsKKyAgICAgICAgX21lc3NhZ2UgPSBzcmMuZ2V0TWVzc2FnZSgpOworICAgICAgICBfc2V2ZXJpdHkgPSBzcmMuZ2V0U2V2ZXJpdHkoKTsKKyAgICAgICAgX3NvdXJjZSA9IHNyYy5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIF9saW5lID0gc3JjLmdldExpbmUoKTsKKyAgICAgICAgX2NvbHVtbiA9IHNyYy5nZXRDb2x1bW4oKTsKKyAgICAgICAgX29mZnNldCA9IHNyYy5nZXRPZmZzZXQoKTsKKyAgICAgICAgX2N1cnNvciA9IHNyYy5nZXRDdXJzb3JMb2NhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKKyAgICAgKiB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgWG1sRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIGludCBvZmZzZXQsIFhtbEN1cnNvciBjdXJzb3IpCisgICAgeworICAgICAgICBfbWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIF9zZXZlcml0eSA9IHNldmVyaXR5OworICAgICAgICBfc291cmNlID0gc291cmNlOworICAgICAgICBfbGluZSA9IGxpbmU7CisgICAgICAgIF9jb2x1bW4gPSBjb2x1bW47CisgICAgICAgIF9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIF9jdXJzb3IgPSBjdXJzb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggbm8gbG9jYXRpb24gYW5kIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JNZXNzYWdlKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgd2l0aCBubyBsb2NhdGlvbiBhbmQgdGhlIGdpdmVuIHNldmVyaXR5LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvclNvdXJjZShtZXNzYWdlLCBzZXZlcml0eSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGZpbGUgYW5kIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHNvdXJjZU5hbWUgdGhlIFVSTCBvciBvdGhlciBuYW1lIGZvciB0aGUgZmlsZQorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvclNvdXJjZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNvdXJjZU5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZm9yTG9jYXRpb24obWVzc2FnZSwgU0VWRVJJVFlfRVJST1IsIHNvdXJjZU5hbWUsIC0xLCAtMSwgLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQorICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JTb3VyY2UoU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZU5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZm9yTG9jYXRpb24obWVzc2FnZSwgc2V2ZXJpdHksIHNvdXJjZU5hbWUsIC0xLCAtMSwgLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBsb2NhdGVkIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhlIGdpdmVuIGZpbGUgYW5kIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHNvdXJjZU5hbWUgdGhlIFVSTCBvciBvdGhlciBuYW1lIGZvciB0aGUgZmlsZQorICAgICAqIEBwYXJhbSBsaW5lIHRoZSAxLWJhc2VkIGxpbmUgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSAxLWJhc2VkIGNvbHVtbiBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIDAtYmFzZSBmaWxlIGNoYXJhY3RlciBvZmZzZXQsIG9yIC0xIGlmIG5vdCBrbm93bgorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckxvY2F0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc291cmNlTmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIGludCBvZmZzZXQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFhtbEVycm9yKG1lc3NhZ2UsIFNFVkVSSVRZX0VSUk9SLCBzb3VyY2VOYW1lLCBsaW5lLCBjb2x1bW4sIG9mZnNldCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LCBsb2NhdGVkIGF0IGEgc3BlY2lmaWMgcG9pbnQgaW4gdGhlIGdpdmVuIGZpbGUuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKKyAgICAgKiBAcGFyYW0gc291cmNlTmFtZSB0aGUgVVJMIG9yIG90aGVyIG5hbWUgZm9yIHRoZSBmaWxlCisgICAgICogQHBhcmFtIGxpbmUgdGhlIDEtYmFzZWQgbGluZSBudW1iZXIsIG9yIC0xIGlmIG5vdCBrbm93bgorICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgMC1iYXNlIGZpbGUgY2hhcmFjdGVyIG9mZnNldCwgb3IgLTEgaWYgbm90IGtub3duCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yTG9jYXRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgU3RyaW5nIHNvdXJjZU5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBpbnQgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYbWxFcnJvcihtZXNzYWdlLCBzZXZlcml0eSwgc291cmNlTmFtZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gcGh5c2NpYWwgbG9jYXRpb24gYW5kIFhtbEN1cnNvci4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgKHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99KQorICAgICAqIEBwYXJhbSBzb3VyY2VOYW1lIHRoZSBVUkwgb3Igb3RoZXIgbmFtZSBmb3IgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgMS1iYXNlZCBsaW5lIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duCisgICAgICogQHBhcmFtIGNvbHVtbiB0aGUgMS1iYXNlZCBjb2x1bW4gbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSAwLWJhc2UgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0LCBvciAtMSBpZiBub3Qga25vd24KKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBYbWxDdXJzb3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBYbWxFcnJvciBmb3JMb2NhdGlvbkFuZEN1cnNvcihTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgc291cmNlTmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIGludCBvZmZzZXQsIFhtbEN1cnNvciBjdXJzb3IpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFhtbEVycm9yKG1lc3NhZ2UsIHNldmVyaXR5LCBzb3VyY2VOYW1lLCBsaW5lLCBjb2x1bW4sIG9mZnNldCwgY3Vyc29yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIFhtbEVycm9yIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSwgbG9jYXRlZCBhdCB0aGUgWG1sT2JqZWN0LCB3aXRoIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHhvYmogdGhlIFhtbE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yT2JqZWN0KFN0cmluZyBtZXNzYWdlLCBYbWxPYmplY3QgeG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JPYmplY3QobWVzc2FnZSwgU0VWRVJJVFlfRVJST1IsIHhvYmopOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSwgbG9jYXRlZCBhdCB0aGUgWG1sT2JqZWN0LgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSAoe0BsaW5rICNTRVZFUklUWV9FUlJPUn0sIHtAbGluayAjU0VWRVJJVFlfV0FSTklOR30sIG9yIHtAbGluayAjU0VWRVJJVFlfSU5GT30pCisgICAgICogQHBhcmFtIHhvYmogdGhlIFhtbE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgWG1sRXJyb3IgZm9yT2JqZWN0KFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFhtbE9iamVjdCB4b2JqKQorICAgIHsKKyAgICAgICAgaWYgKHhvYmogPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmb3JNZXNzYWdlKG1lc3NhZ2UsIHNldmVyaXR5KTsKKworICAgICAgICBYbWxDdXJzb3IgY3VyID0geG9iai5uZXdDdXJzb3IoKTsKKyAgICAgICAgWG1sRXJyb3IgcmVzdWx0ID0gZm9yQ3Vyc29yKG1lc3NhZ2UsIHNldmVyaXR5LCBjdXIpOworICAgICAgICBpZiAoY3VyICE9IG51bGwpCisgICAgICAgICAgICBjdXIuZGlzcG9zZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWG1sRXJyb3IgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBsb2NhdGVkIGF0IHRoZSBYbWxDdXJzb3IsIHdpdGgge0BsaW5rICNTRVZFUklUWV9FUlJPUn0uCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBYbWxDdXJzb3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckN1cnNvcihTdHJpbmcgbWVzc2FnZSwgWG1sQ3Vyc29yIGN1cnNvcikKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JDdXJzb3IobWVzc2FnZSwgU0VWRVJJVFlfRVJST1IsIGN1cnNvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYbWxFcnJvciBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UsIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LCBsb2NhdGVkIGF0IHRoZSBYbWxDdXJzb3IuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5ICh7QGxpbmsgI1NFVkVSSVRZX0VSUk9SfSwge0BsaW5rICNTRVZFUklUWV9XQVJOSU5HfSwgb3Ige0BsaW5rICNTRVZFUklUWV9JTkZPfSkKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBYbWxDdXJzb3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFhtbEVycm9yIGZvckN1cnNvcihTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBYbWxDdXJzb3IgY3Vyc29yKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZvck1lc3NhZ2UobWVzc2FnZSwgc2V2ZXJpdHkpOworCisgICAgICAgIC8vIEh1bnQgZG93biB0aGUgbGluZS9jb2x1bW4vb2Zmc2V0CisKKyAgICAgICAgaW50IGxpbmUgPSAtMTsKKyAgICAgICAgaW50IGNvbHVtbiA9IC0xOworICAgICAgICBpbnQgb2Zmc2V0ID0gLTE7CisgICAgICAgIFN0cmluZyBzb3VyY2UgPSBudWxsOworCisgICAgICAgIHNvdXJjZSA9IGN1cnNvci5kb2N1bWVudFByb3BlcnRpZXMoKS5nZXRTb3VyY2VOYW1lKCk7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSBjdXJzb3IubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgWG1sTGluZU51bWJlciBsbiA9CisgICAgICAgICAgICAoWG1sTGluZU51bWJlcikgYy5nZXRCb29rbWFyayggWG1sTGluZU51bWJlci5jbGFzcyApOworCisgICAgICAgIGlmIChsbiA9PSBudWxsKQorICAgICAgICAgICAgbG4gPSAoWG1sTGluZU51bWJlcikgYy50b1ByZXZCb29rbWFyayggWG1sTGluZU51bWJlci5jbGFzcyApOworCisgICAgICAgIGlmIChsbiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5lID0gbG4uZ2V0TGluZSgpOworICAgICAgICAgICAgY29sdW1uID0gbG4uZ2V0Q29sdW1uKCk7CisgICAgICAgICAgICBvZmZzZXQgPSBsbi5nZXRPZmZzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGMuZGlzcG9zZSgpOworCisgICAgICAgIHJldHVybiBuZXcgWG1sRXJyb3IobWVzc2FnZSwgc2V2ZXJpdHksIHNvdXJjZSwgbGluZSwgY29sdW1uLCBvZmZzZXQsIGN1cnNvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcHJvZHVjZSBhIG5pY2VseSBmb3JtYXR0ZWQgZmlsZW5hbWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZvcm1hdHRlZEZpbGVOYW1lKFN0cmluZyByYXdTdHJpbmcsIFVSSSBiYXNlKQorICAgIHsKKyAgICAgICAgaWYgKHJhd1N0cmluZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVVJJIHVyaSA9IG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIGl0IGxvb2tzIGxpa2UgYW4gYWJzb2x1dGUgVVJJLCB0cmVhdCBpdCBhcyBzdWNoCisgICAgICAgICAgICB1cmkgPSBuZXcgVVJJKHJhd1N0cmluZyk7CisKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdHJlYXQgaXQgbGlrZSBhIGZpbGVuYW1lCisgICAgICAgICAgICBpZiAoIXVyaS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICAgICAgdXJpID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyaSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBsb29rcyBsaWtlIGEgZmlsZW5hbWU7IGNvbnZlcnQgaXQgdG8gdXJpIGZvciByZWxhdGl2aXphdGlvbgorICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICB1cmkgPSBuZXcgRmlsZShyYXdTdHJpbmcpLnRvVVJJKCk7CisKKyAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHVyaSA9IGJhc2UucmVsYXRpdml6ZSh1cmkpOworCisgICAgICAgIC8vIGZpbGVuYW1lcyBnZXQgdGhlaXIgZmlsZTogc3RyaXBwZWQgb2ZmIGFuZCB0aGVpciAvJ3MgdHVybmVkIGludG8gXCdzIChNU0RPUykKKyAgICAgICAgaWYgKHVyaS5pc0Fic29sdXRlKCkgPyB1cmkuZ2V0U2NoZW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZSgiZmlsZSIpID09IDAgOgorICAgICAgICAgICAgYmFzZSAhPSBudWxsICYmIGJhc2UuaXNBYnNvbHV0ZSgpICYmIGJhc2UuZ2V0U2NoZW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZSgiZmlsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEZpbGUodXJpKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge307CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXJyb3IuIFNlZSB7QGxpbmsgI2dldFNldmVyaXR5fS4KKyAgICAgKi8gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWRVJJVFlfRVJST1IgICA9IDA7CisgICAgLyoqCisgICAgICogQSB3YXJuaW5nLiBTZWUge0BsaW5rICNnZXRTZXZlcml0eX0uCisgICAgICovIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX1dBUk5JTkcgPSAxOworICAgIC8qKgorICAgICAqIEFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZS4gU2VlIHtAbGluayAjZ2V0U2V2ZXJpdHl9LgorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9JTkZPICAgID0gMjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNldmVyaXR5LiAgRWl0aGVyIHtAbGluayAjU0VWRVJJVFlfRVJST1J9LCB7QGxpbmsgI1NFVkVSSVRZX1dBUk5JTkd9LCBvciB7QGxpbmsgI1NFVkVSSVRZX0lORk99LgorICAgICAqLyAKKyAgICBwdWJsaWMgaW50ICAgIGdldFNldmVyaXR5ICAgKCApIHsgcmV0dXJuIF9zZXZlcml0eTsgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aG91dCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKi8gCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICAgICggKSB7IHJldHVybiBfbWVzc2FnZTsgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFVSTCAob3Igb3RoZXIgbmFtZSkgb2YgdGhlIGZpbGUgd2l0aCB0aGUgZXJyb3IsIGlmIGF2YWlsYWJsZS4KKyAgICAgKi8gCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lICggKSB7IHJldHVybiBfc291cmNlOyB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGVycm9yLCBpZiBhdmFpbGFibGUsIC0xIGlmIG5vdC4KKyAgICAgKi8gCisgICAgcHVibGljIGludCAgICBnZXRMaW5lICAgICAgICggKSB7IHJldHVybiBfbGluZTsgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVycm9yLCBpZiBhdmFpbGFibGUsIC0xIGlmIG5vdC4KKyAgICAgKi8gCisgICAgcHVibGljIGludCAgICBnZXRDb2x1bW4gICAgICggKSB7IHJldHVybiBfY29sdW1uOyB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0IG9mIHRoZSBlcnJvciwgaWYgYXZhaWxhYmxlLCAtMSBpZiBub3QuCisgICAgICovIAorICAgIHB1YmxpYyBpbnQgICAgZ2V0T2Zmc2V0ICAgICAoICkgeyByZXR1cm4gX29mZnNldDsgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsb2NhdGlvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUuICBYbWxDdXJzb3IuY2xhc3MgYW5kCisgICAgICogWG1sT2JqZWN0LmNsYXNzIGNhbiBiZSBwYXNzZWQsIGZvciBleGFtcGxlLiAgTnVsbCBpZiBub3QgYXZhaWxhYmxlLgorICAgICAqLyAKKyAgICBwdWJsaWMgT2JqZWN0IGdldExvY2F0aW9uICggT2JqZWN0IHR5cGUgKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gWG1sQ3Vyc29yLmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3I7CisgICAgICAgIGlmICh0eXBlID09IFhtbE9iamVjdC5jbGFzcyAmJiBfY3Vyc29yICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gX2N1cnNvci5nZXRPYmplY3QoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxvY2F0aW9uIG9mIHRoZSBlcnJvciBhcyBhbiB7QGxpbmsgWG1sQ3Vyc29yfSwgbnVsbCBpZgorICAgICAqIG5vdCBhdmFpbGFibGUuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxDdXJzb3IgZ2V0Q3Vyc29yTG9jYXRpb24gKCApCisgICAgeworICAgICAgICByZXR1cm4gKFhtbEN1cnNvcikgZ2V0TG9jYXRpb24oIFhtbEN1cnNvci5jbGFzcyApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgYXMgYW4ge0BsaW5rIFhtbE9iamVjdH0sIG51bGwgaWYKKyAgICAgKiBub3QgYXZhaWxhYmxlLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGdldE9iamVjdExvY2F0aW9uICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIGdldExvY2F0aW9uKCBYbWxPYmplY3QuY2xhc3MgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyBhIHN0YW5kYXJkIHN0cmluZyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UsIGNvbXBsZXRlIHdpdGgKKyAgICAgKiBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2Zmc2V0cyBpZiBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoICkKKyAgICB7CisgICAgICAgIHJldHVybiB0b1N0cmluZyggbnVsbCApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgc3RhbmRhcmQgc3RyaW5nIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UuICBJZiBhIG5vbi1udWxsCisgICAgICogVVJJIGlzIHN1cHBsaWVkLCBzb3VyY2UgbmFtZXMgYXJlIHJlbGF0aXZpemVkIGFnYWluc3QgdGhlIGdpdmVuCisgICAgICogVVJJLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCBVUkkgYmFzZSApCisgICAgeworICAgICAgICAvLyBtb2RpZmllZCB0byBjYXJlZnVsbHkgbWF0Y2ggdGhlIElERSdzCisgICAgICAgIC8vIHdvcmtzaG9wLndvcmtzcGFjZS5hbnQuQW50TG9nZ2VyIHJlZ2V4CisgICAgICAgIC8vIHdoaWNoIGFsc28gbWF0Y2hlcyBqYXZhYyAoZGF2aWRiYXUpCisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIFN0cmluZyBzb3VyY2UgPSBmb3JtYXR0ZWRGaWxlTmFtZShnZXRTb3VyY2VOYW1lKCksIGJhc2UpOworCisgICAgICAgIGlmICggc291cmNlICE9IG51bGwgKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIHNvdXJjZSApOworICAgICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lKCk7CisgICAgICAgICAgICBpZiAoIGxpbmUgPCAwICkKKyAgICAgICAgICAgICAgICBsaW5lID0gMDsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCAnOicgKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggbGluZSApOworICAgICAgICAgICAgc2IuYXBwZW5kKCAnOicgKTsKKyAgICAgICAgICAgIGlmIChnZXRDb2x1bW4oKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBnZXRDb2x1bW4oKSApOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJzonICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoIGdldFNldmVyaXR5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNFVkVSSVRZX0VSUk9SICAgOiBzYi5hcHBlbmQoICJlcnJvcjogIiApOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVZFUklUWV9XQVJOSU5HIDogc2IuYXBwZW5kKCAid2FybmluZzogIiApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VWRVJJVFlfSU5GTyA6IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG1zZyA9IGdldE1lc3NhZ2UoKTsKKworICAgICAgICBzYi5hcHBlbmQoIG1zZyA9PSBudWxsID8gIjxVbnNwZWNpZmllZCBtZXNzYWdlPiIgOiBtc2cgKTsKKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzQ3NDgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgY2FuIGJlIHRocm93biB3aGlsZSBwcm9jZXNzaW5nLAorICogcGFyc2luZywgb3IgY29tcGlsaW5nIFhNTC4gIE1heSBjb250YWluIGFueSBudW1iZXIgb2Yge0BsaW5rIFhtbEVycm9yfQorICogb2JqZWN0cy4KKyAqIDxwPgorICogQHNlZSBYbWxFcnJvcgorICogQHNlZSBYbWxSdW50aW1lRXhjZXB0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZS4KKyAgICAgKi8gCisgICAgcHVibGljIFhtbEV4Y2VwdGlvbiAoIFN0cmluZyBtICAgICAgICAgICAgICApIHsgc3VwZXIoIG0gKTsgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlIGFuZCBhIGNhdXNlLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0ICkgeyBzdXBlciggbSwgdCApOyB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIGNhdXNlLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggVGhyb3dhYmxlIHQgICAgICAgICAgICkgeyBzdXBlciggdCApOyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhbiB7QGxpbmsgWG1sRXJyb3J9LgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sRXhjZXB0aW9uICggWG1sRXJyb3IgZXJyb3IgKQorICAgIHsKKyAgICAgICAgdGhpcyggZXJyb3IudG9TdHJpbmcoKSwgbnVsbCwgZXJyb3IgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbEV4Y2VwdGlvbiBmcm9tIGEgbWVzc2FnZSwgYSBjYXVzZSwgYW5kIGFuIHtAbGluayBYbWxFcnJvcn0uCisgICAgICovIAorICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQsIFhtbEVycm9yIGVycm9yICkKKyAgICB7CisgICAgICAgIHRoaXMoIG0sIHQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGVycm9yICkgKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UsIGEgY2F1c2UsIGFuZCBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30uCisgICAgICovIAorICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQsIENvbGxlY3Rpb24gZXJyb3JzICkKKyAgICB7CisgICAgICAgIHN1cGVyKCBtLCB0ICk7CisKKyAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKQorICAgICAgICAgICAgX2Vycm9ycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoIGVycm9ycyApICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxFeGNlcHRpb24gZnJvbSBhbiB7QGxpbmsgWG1sUnVudGltZUV4Y2VwdGlvbn0uCisgICAgICovIAorICAgIHB1YmxpYyBYbWxFeGNlcHRpb24gKCBYbWxSdW50aW1lRXhjZXB0aW9uIHhtbFJ1bnRpbWVFeGNlcHRpb24gKQorICAgIHsKKyAgICAgICAgc3VwZXIoCisgICAgICAgICAgICB4bWxSdW50aW1lRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgeG1sUnVudGltZUV4Y2VwdGlvbi5nZXRDYXVzZSgpICk7CisKKyAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSB4bWxSdW50aW1lRXhjZXB0aW9uLmdldEVycm9ycygpOworCisgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9lcnJvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBuZXcgQXJyYXlMaXN0KCBlcnJvcnMgKSApOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB7QGxpbmsgWG1sRXJyb3IgWG1sRXJyb3JzfSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxFcnJvciBnZXRFcnJvciAoICkKKyAgICB7CisgICAgICAgIGlmIChfZXJyb3JzID09IG51bGwgfHwgX2Vycm9ycy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiAoWG1sRXJyb3IpIF9lcnJvcnMuZ2V0KCAwICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFhtbEVycm9yIFhtbEVycm9yc30gdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LgorICAgICAqLyAKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFcnJvcnMgKCApCisgICAgeworICAgICAgICByZXR1cm4gX2Vycm9yczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgX2Vycm9yczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGYWN0b3J5SG9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTBmOTcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmFjdG9yeUhvb2suamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGhvb2sgZm9yIHRoZSBYTUwgQmVhbiBGYWN0b3J5IG1lY2hhbmlzbS4KKyAqIFByb3ZpZGVkIGZvciBhZHZhbmNlZCB1c2VycyB3aG8gd2lzaCB0byBwcm92aWRlIHRoZWlyIG93bgorICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEZhY3RvcnkucGFyc2UgbWV0aG9kcy4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwKKyAqIHRvIGRlZmVyIHJlYWRpbmcgWE1MIHN0cmVhbXMgdW50aWwgbmVlZGVkLgorICogPHA+CisgKiBUbyB1c2UgdGhlIGhvb2ssIGNhbGwgWG1sRmFjdG9yeUhvb2suVGhyZWFkQ29udGV4dC5zZXRIb29rKCksIHBhc3NpbmcKKyAqIHlvdXIgb3duIFhtbEZhY3RvcnlIb29rIGltcGxlbWVudGF0aW9uLiAgVGhlbiBldmVyeSBjYWxsIHRvIGEgRmFjdG9yeQorICogbWV0aG9kIHdpbGwgYmUgZGVsZ2F0ZWQgdG8geW91ciBob29rLgorICoKKyAqIDxwcmU+CisgKiBNeUhvb2sgaG9vayA9IG5ldyBNeUhvb2soKTsKKyAqIFhtbEZhY3RvcnlIb29rLlRocmVhZENvbnRleHQuc2V0SG9vayhob29rKTsKKyAqIC8vIHRoaXMgcmVzdWx0cyBpbiBhIGNhbGwgdG8gaG9vay5wYXJzZSguLi4pCisgKiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZSgidGVzdC54bWwiKSk7CisgKiA8L3ByZT4KKyAqIAorICogSWYgdGhlIGhvb2sgbmVlZHMgdG8gdHVybiBhcm91bmQgYW5kIGludm9rZSB0aGUgYnVpbHQtaW4gcGFyc2VycywgdGhlbgorICogaXQgc2hvdWxkIGRvIHNvIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBvbiB0aGUgcGFzc2VkCisgKiBTY2hlbWFUeXBlTG9hZGVyLiAgU2luY2UgU2NoZW1hVHlwZUxvYWRlci5wYXJzZSgpIG1ldGhvZHMgZGVsZWdhdGUKKyAqIHRvIHRoZSByZWdpc3RlcmVkIGhvb2ssIGEgaG9vayB0aGF0IHdpc2hlcyB0byBhY3R1YWxseSBpbnZva2UgdGhlCisgKiBkZWZhdWx0IHBhcnNlciB3aXRob3V0IGhhdmluZyBpdHNlbGYgY2FsbGVkIGJhY2sgYWdhaW4gc2hvdWxkCisgKiB1bnJlZ2lzdGVyIGl0c2VsZiBiZWZvcmUgY2FsbGluZyBsb2FkZXIucGFyc2UoKSwgYW5kIHRoZW4gcmUtcmVnaXN0ZXIKKyAqIGl0c2VsZiBhZ2FpbiBhZnRlciB0aGUgY2FsbC4KKyAqIDxwcmU+CisgKiB2b2lkIHBhcnNlKFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCAuLi4pCisgKiB7CisgKiAgICAgWG1sRmFjdG9yeUhvb2sgcmVtZW1iZXIgPSBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LmdldEhvb2soKTsKKyAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2sobnVsbCk7CisgKiAgICAgbG9hZGVyLnBhcnNlKC4uLik7IC8vIGlzbid0IGhvb2tlZC4KKyAqICAgICBYbWxGYWN0b3J5SG9vay5UaHJlYWRDb250ZXh0LnNldEhvb2socmVtZW1iZXIpOworICogfQorICogPC9wcmU+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sRmFjdG9yeUhvb2sKK3sKKyAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdJbnN0YW5jZSBjYWxscyAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKKyAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgU3RyaW5nIHhtbFRleHQsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKKyAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgSW5wdXRTdHJlYW0gamlvaXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgLyoqIEhvb2tzIEZhY3RvcnkucGFyc2UgY2FsbHMgKi8KKyAgICBwdWJsaWMgWG1sT2JqZWN0IHBhcnNlICggU2NoZW1hVHlwZUxvYWRlciBsb2FkZXIsIFJlYWRlciBqaW9yLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIC8qKiBIb29rcyBGYWN0b3J5LnBhcnNlIGNhbGxzICovCisgICAgcHVibGljIFhtbE9iamVjdCBwYXJzZSAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBOb2RlIG5vZGUsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIFhtbEV4Y2VwdGlvbjsKKyAgICAvKiogSG9va3MgRmFjdG9yeS5wYXJzZSBjYWxscyAqLworICAgIHB1YmxpYyBYbWxPYmplY3QgcGFyc2UgKCBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciwgWE1MSW5wdXRTdHJlYW0geGlzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbjsKKyAgICAvKiogSG9va3MgRmFjdG9yeS5uZXdYbWxTYXhIYW5kbGVyIGNhbGxzICovCisgICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBtYW5hZ2UgdGhlIFhtbEZhY3RvcnlIb29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICovIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVGhyZWFkQ29udGV4dAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGhyZWFkSG9vayA9IG5ldyBUaHJlYWRMb2NhbCgpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgaG9vaywgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmFjdG9yeUhvb2sgZ2V0SG9vaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoWG1sRmFjdG9yeUhvb2spdGhyZWFkSG9vay5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBob29rIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEhvb2soWG1sRmFjdG9yeUhvb2sgaG9vaykKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkSG9vay5zZXQoaG9vayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm92aWRlZCB0byBwcmV2ZW50IHVud2FudGVkIGNvbnN0cnVjdGlvbgorICAgICAgICBwcml2YXRlIFRocmVhZENvbnRleHQoKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxGbG9hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWU5YTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sRmxvYXQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNmbG9hdCI+eHM6ZmxvYXQ8L2E+IHR5cGUuCisgKiA8cD4KKyAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gYSBKYXZhIGZsb2F0LgorICovIAorcHVibGljIGludGVyZmFjZSBYbWxGbG9hdCBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9mbG9hdCIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdCAqLworICAgIGZsb2F0IGdldEZsb2F0VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgZmxvYXQgKi8KKyAgICB2b2lkIHNldEZsb2F0VmFsdWUoZmxvYXQgdik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBmbG9hdAorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0RmxvYXRWYWx1ZX0KKyAgICAgKiovCisgICAgZmxvYXQgZmxvYXRWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGZsb2F0CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRGbG9hdFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChmbG9hdCB2KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEZsb2F0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxGbG9hdH0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxGbG9hdH0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMi4zNGUrNSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxGbG9hdH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxGbG9hdCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEZsb2F0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sRmxvYXQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEZsb2F0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxGbG9hdCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sRmxvYXR9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEZsb2F0IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sRmxvYXQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdEYXkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MWQzZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHRGF5LmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5Ij54czpnRGF5PC9hPiB0eXBlLgorICogQSBnRGF5IHNwZWNpZmllcyBvbmx5IGEgZGF5LW9mLW1vbnRoLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LCBvciBhbiBpbnQuCisgKiAKKyAqIEBzZWUgWG1sQ2FsZW5kYXIKKyAqIEBzZWUgR0RhdGUKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sR0RheSBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9nRGF5Iik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7CisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KKyAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCisgICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEgKi8KKyAgICBpbnQgZ2V0SW50VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEgKi8KKyAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KKyAgICAgKiovCisgICAgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoQ2FsZW5kYXIgYyk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIGdkKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KKyAgICAgKiovCisgICAgaW50IGludFZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGludCB2KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEdEYXl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdEYXl9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdEYXl9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEdEYXl9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0tMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0tMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdEYXl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR0RheSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR0RheX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHRGF5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHRGF5IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR0RheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4YjM5MAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGguamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCI+eHM6Z01vbnRoPC9hPiB0eXBlLgorICogQSBnTW9udGggc3BlY2lmaWVzIG9ubHkgYSBtb250aC1vZi15ZWFyLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9LCB7QGxpbmsgR0RhdGV9LCBvciBhbiBpbnQuCisgKiAKKyAqIEBzZWUgWG1sQ2FsZW5kYXIKKyAqIEBzZWUgR0RhdGUKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sR01vbnRoIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dNb250aCIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOworICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCisgICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLworICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7CisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyICovCisgICAgaW50IGdldEludFZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyICovCisgICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMTIKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9CisgICAgICoqLworICAgIGludCBpbnRWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgZnJvbSAxLTEyCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChpbnQgdik7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEdNb250aH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRofSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRofSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR01vbnRofSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGggcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRofSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR01vbnRoRGF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlZjI3YQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHTW9udGhEYXkuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSI+eHM6Z01vbnRoRGF5PC9hPiB0eXBlLgorICogQSBnTW9udGhEYXkgc3BlY2lmaWVzIGEgZGF5IG9mIGEgc3BlY2lmaWMgbW9udGggd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB5ZWFyLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQ2FsZW5kYXJ9IG9yIHtAbGluayBHRGF0ZX0uCisgKiAKKyAqIEBzZWUgWG1sQ2FsZW5kYXIKKyAqIEBzZWUgR0RhdGUKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sR01vbnRoRGF5IGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dNb250aERheSIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgQ2FsZW5kYXIgZ2V0Q2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9ICovCisgICAgdm9pZCBzZXRDYWxlbmRhclZhbHVlKENhbGVuZGFyIGMpOworICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9ICovCisgICAgR0RhdGUgZ2V0R0RhdGVWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufSAqLworICAgIHZvaWQgc2V0R0RhdGVWYWx1ZShHRGF0ZSBnZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIENhbGVuZGFyIGNhbGVuZGFyVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQ2FsZW5kYXJ9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldENhbGVuZGFyVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KENhbGVuZGFyIGMpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgR0RhdGUgZ0RhdGVWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEdEYXRlU3BlY2lmaWNhdGlvbiBnZCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbEdNb250aERheX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sR01vbnRoRGF5fSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sR01vbnRoRGF5fSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0Oy0tMDYtMTQmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LS0wNi0xNCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdNb250aERheX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHTW9udGhEYXkgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR01vbnRoRGF5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR01vbnRoRGF5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHTW9udGhEYXkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR01vbnRoRGF5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHTW9udGhEYXl9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdNb250aERheSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdNb250aERheSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Nzk3NzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sR1llYXIuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIj54czpnWWVhcjwvYT4gdHlwZS4KKyAqIEEgZ1llYXIgc3BlY2lmaWVzIGEgR3JlZ29yaWFuIHllYXIgKEFEKS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIEdEYXRlfSwgb3IgYW4gaW50LgorICogCisgKiBAc2VlIFhtbENhbGVuZGFyCisgKiBAc2VlIEdEYXRlCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbEdZZWFyIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dZZWFyIik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICBDYWxlbmRhciBnZXRDYWxlbmRhclZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0gKi8KKyAgICB2b2lkIHNldENhbGVuZGFyVmFsdWUoQ2FsZW5kYXIgYyk7CisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZX0gKi8KKyAgICBHRGF0ZSBnZXRHRGF0ZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBHRGF0ZVNwZWNpZmljYXRpb259ICovCisgICAgdm9pZCBzZXRHRGF0ZVZhbHVlKEdEYXRlIGdkKTsKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEgKi8KKyAgICBpbnQgZ2V0SW50VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEgKi8KKyAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0Q2FsZW5kYXJWYWx1ZX0KKyAgICAgKiovCisgICAgQ2FsZW5kYXIgY2FsZW5kYXJWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBDYWxlbmRhcn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0Q2FsZW5kYXJWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoQ2FsZW5kYXIgYyk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRHRGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICBHRGF0ZSBnRGF0ZVZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0R0RhdGVWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoR0RhdGVTcGVjaWZpY2F0aW9uIGdkKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50IGZyb20gMS0zMQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRJbnRWYWx1ZX0KKyAgICAgKiovCisgICAgaW50IGludFZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGFuIGludCBmcm9tIDEtMzEKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGludCB2KTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sR1llYXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEdZZWFyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEdZZWFyfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEdZZWFyTW9udGguamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhck1vbnRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNGJiOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxHWWVhck1vbnRoLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhck1vbnRoIj54czpnWWVhck1vbnRoPC9hPiB0eXBlLgorICogQSBnWWVhck1vbnRoIHNwZWNpZmllcyBhIG1vbnRoIGluIGEgc3BlY2lmaWMgeWVhci4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIENhbGVuZGFyfSwge0BsaW5rIEdEYXRlfS4KKyAqIAorICogQHNlZSBYbWxDYWxlbmRhcgorICogQHNlZSBHRGF0ZQorICovIAorcHVibGljIGludGVyZmFjZSBYbWxHWWVhck1vbnRoIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2dZZWFyTW9udGgiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLworICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLworICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLworICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KKyAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxHWWVhck1vbnRofS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhck1vbnRofSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxHWWVhck1vbnRofSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxHWWVhck1vbnRofSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzIwMDMtMDYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MjAwMy0wNiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sR1llYXJNb250aH0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxHWWVhck1vbnRoIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxHWWVhck1vbnRofSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sR1llYXJNb250aCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sR1llYXJNb250aCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEdZZWFyTW9udGgpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEdZZWFyTW9udGh9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEdZZWFyTW9udGggcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxHWWVhck1vbnRoKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxIZXhCaW5hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjBhZjZmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEhleEJpbmFyeS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2hleEJpbmFyeSI+eHM6aGV4QmluYXJ5PC9hPiB0eXBlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byBhIGJ5dGUgYXJyYXkuIAorICovIAorcHVibGljIGludGVyZmFjZSBYbWxIZXhCaW5hcnkgZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfaGV4QmluYXJ5Iik7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldEJ5dGVBcnJheVZhbHVlfQorICAgICAqKi8KKyAgICBieXRlW10gYnl0ZUFycmF5VmFsdWUoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGJ5dGUgYXJyYXkuCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNzZXRCeXRlQXJyYXlWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoYnl0ZVtdIGJhKTsKKworICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBieXRlIGFycmF5LiAqKi8KKyAgICBieXRlW10gZ2V0Qnl0ZUFycmF5VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEgYnl0ZSBhcnJheS4gKi8KKyAgICB2b2lkIHNldEJ5dGVBcnJheVZhbHVlKGJ5dGVbXSBiYSk7CisKKworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxIZXhCaW5hcnl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbEhleEJpbmFyeX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbEhleEJpbmFyeX0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDs2ODY1NmM2YzZmJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzY4NjU2YzZjNmYmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxIZXhCaW5hcnl9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSGV4QmluYXJ5IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEhleEJpbmFyeX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEhleEJpbmFyeSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSGV4QmluYXJ5KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEhleEJpbmFyeSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSGV4QmluYXJ5fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxIZXhCaW5hcnkgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxIZXhCaW5hcnkpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSUQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzcxZTAxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElELmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSUQiPnhzOklEPC9hPiB0eXBlLgorICogPHA+CisgKiBXaGVuIHZhbGlkYXRlZCwgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LiAgQW4gZWxlbWVudAorICogbWF5IG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdob3NlIHR5cGUgaXMgSUQuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIGEge0BsaW5rIFN0cmluZ30uIAorICovIAorcHVibGljIGludGVyZmFjZSBYbWxJRCBleHRlbmRzIFhtbE5DTmFtZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX0lEIik7CisgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxJRH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSUR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sSUR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sSUR9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sSUQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7bjEmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7bjEmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSUR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSUQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSUQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmZWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRi5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0lEUkVGIj54czpJRFJFRjwvYT4gdHlwZS4KKyAqIDxwPgorICogV2hlbiB2YWxpZGF0ZWQsIElEUkVGIHZhbHVlcyBtdXN0IG1hdGNoIGFuIElEIHZhbHVlIHRoYXQgaXMgcHJlc2VudCB3aXRoaW4KKyAqIHRoZSBkb2N1bWVudC4gVGhpcyBydWxlIGlzIG9ubHkgdmVyaWZpZWQgd2hlbiBhIHdob2xlIGRvY3VtZW50IGlzIHZhbGlkYXRlZAorICogYXQgb25jZS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8gYSB7QGxpbmsgU3RyaW5nfS4gCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGIGV4dGVuZHMgWG1sTkNOYW1lCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfSURSRUYiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbElEUkVGfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRFJFRn0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUYgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUYpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJRFJFRlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWUxZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbElEUkVGUy5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiPnhzOklEUkVGUzwvYT4gdHlwZSwKKyAqIGEgbGlzdCB0eXBlLgorICogPHA+CisgKiBXaGVuIHZhbGlkYXRlZCwgSURSRUYgdmFsdWVzIG11c3QgbWF0Y2ggYW4gSUQgdmFsdWUgdGhhdCBpcyBwcmVzZW50IHdpdGhpbgorICogdGhlIGRvY3VtZW50LiBUaGlzIHJ1bGUgaXMgb25seSB2ZXJpZmllZCB3aGVuIGEgd2hvbGUgZG9jdW1lbnQgaXMgdmFsaWRhdGVkCisgKiBhdCBvbmNlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byBhIHtAbGluayBMaXN0fS4gCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGUyBleHRlbmRzIFhtbEFueVNpbXBsZVR5cGUKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9JRFJFRlMiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzICovCisgICAgTGlzdCBnZXRMaXN0VmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMgKi8KKyAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KKyAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICoqLworICAgIExpc3QgbGlzdFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbElEUkVGfSB2YWx1ZXMKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KKyAgICAgKiovCisgICAgTGlzdCB4bGlzdFZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldExpc3RWYWx1ZX0KKyAgICAgKiovCisgICAgdm9pZCBzZXQoTGlzdCBsKTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sSURSRUZTfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJRFJFRlN9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJRFJFRlN9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSURSRUZTfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbElEUkVGUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJRFJFRlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJRFJFRlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbElEUkVGUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJRFJFRlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbElEUkVGU30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSURSRUZTIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSURSRUZTKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTU2NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbEludC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2ludCI+eHM6aW50PC9hPiB0eXBlLgorICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCisgKiA8cD4KKyAqIE5hdHVyYWxseSwgY29udmVydGlibGUgdG8gYSBKYXZhIGludC4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sSW50IGV4dGVuZHMgWG1sTG9uZworeworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2ludCIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCisgICAgaW50IGdldEludFZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQgKi8KKyAgICB2b2lkIHNldEludFZhbHVlKGludCB2KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0SW50VmFsdWV9CisgICAgICoqLworICAgIGludCBpbnRWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhbiBpbnQKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0SW50VmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGludCB2KTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sSW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJbnR9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2NyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50fSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnR9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludH0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxJbnRlZ2VyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50ZWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Mzg2M2YKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sSW50ZWdlci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50ZWdlciI+eHM6aW50ZWdlcjwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBUaGlzIHR5cGUgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ij54czppbnQ8L2E+CisgKiBvciBKYXZhIHtAbGluayBJbnRlZ2VyfS4gIFRoaXMgdHlwZSByZXByZXNlbnRzIGFuIGFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlciB3aXRoCisgKiBhbnkgbnVtYmVyIG9mIGRpZ2l0cywgd2hpbGUgYSBKYXZhIGludCBvciBhbiB4czppbnQgaXMgYSAzMi1iaXQgZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byBhIEphdmEge0BsaW5rIEJpZ0ludGVnZXJ9LgorICovIAorcHVibGljIGludGVyZmFjZSBYbWxJbnRlZ2VyIGV4dGVuZHMgWG1sRGVjaW1hbAoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2ludGVnZXIiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9ICovCisgICAgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEJpZ0ludGVnZXJ9ICovCisgICAgdm9pZCBzZXRCaWdJbnRlZ2VyVmFsdWUoQmlnSW50ZWdlciBiaSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgQmlnSW50ZWdlcn0KKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0QmlnSW50ZWdlclZhbHVlfQorICAgICAqKi8KKyAgICBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBCaWdJbnRlZ2VyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRCaWdJbnRlZ2VyVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KEJpZ0ludGVnZXIgYmkpOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxJbnRlZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnRlZ2VyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxJbnRlZ2VyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxJbnRlZ2VyfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbEludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbEludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbEludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbExhbmd1YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMzlkZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMYW5ndWFnZS5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIj54czpsYW5ndWFnZTwvYT4gdHlwZS4KKyAqIDxwPgorICogVGhpcyB0eXBlIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhbiBzdGFuZGFyZCBJU08gbGFuZ3VhZ2UgY29kZSBzdHJpbmcuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sTGFuZ3VhZ2UgZXh0ZW5kcyBYbWxUb2tlbgoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX2xhbmd1YWdlIik7CisgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxMYW5ndWFnZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTGFuZ3VhZ2V9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7ZW4tdXMmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTGFuZ3VhZ2V9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTGFuZ3VhZ2UgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMYW5ndWFnZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExhbmd1YWdlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMYW5ndWFnZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTGFuZ3VhZ2UpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExhbmd1YWdlfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMYW5ndWFnZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExhbmd1YWdlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMaW5lTnVtYmVyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjJhNGYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTGluZU51bWJlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKKworLyoqCisgKiBBIHN1YmNsYXNzIG9mIFhtbEJvb2ttYXJrIHRoYXQgaG9sZHMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCisgKiBJZiBhIGRvY3VtZW50IGlzIHBhcnNlZCB3aXRoIGxpbmUgbnVtYmVycworICogZW5hYmxlZCwgdGhlc2UgYm9va21hcmtzIHdpbGwgYmUgcGxhY2VkIGF0IGFwcHJvcHJpYXRlIGxvY2F0aW9ucworICogd2l0aGluIHRoZSBkb2N1bWVudC4KKyAqIAorICogQHNlZSBYbWxPcHRpb25zI3NldExvYWRMaW5lTnVtYmVycyAKKyAqLworcHVibGljIGNsYXNzIFhtbExpbmVOdW1iZXIgZXh0ZW5kcyBYbWxCb29rbWFyaworeworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBsaW5lIG51bWJlciB3aXRoIG5vIGNvbHVtbiBvciBvZmZzZXQgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyIC0gdGhlIGZpcnN0IGxpbmUgaXMgMQorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sTGluZU51bWJlciAoIGludCBsaW5lICkgeyB0aGlzKCBsaW5lLCAtMSwgLTEgKTsgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBsaW5lIG51bWJlciBhbmQgY29sdW1uIHdpdGggbm8gZmlsZSBvZmZzZXQgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyIC0gdGhlIGZpcnN0IGxpbmUgaXMgMQorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBjb2x1bW4gbnVtYmVyIC0gdGhlIGZpcnN0IGNvbHVtbiBpcyAxCisgICAgICovCisgICAgcHVibGljIFhtbExpbmVOdW1iZXIgKCBpbnQgbGluZSwgaW50IGNvbHVtbiApIHsgdGhpcyggbGluZSwgY29sdW1uLCAtMSApOyB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gd2l0aCBubyBmaWxlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSBudW1iZXIgLSB0aGUgZmlyc3QgbGluZSBpcyAxCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGNvbHVtbiBudW1iZXIgLSB0aGUgZmlyc3QgY29sdW1uIGlzIDEKKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgZmlsZSBjaGFyYWN0ZXIgb2Zmc2V0IC0gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgZmlsZSBpcyAwCisgICAgICovCisgICAgcHVibGljIFhtbExpbmVOdW1iZXIgKCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCApCisgICAgeworICAgICAgICBzdXBlciggZmFsc2UgKTsKKyAgICAgICAgCisgICAgICAgIF9saW5lID0gbGluZTsKKyAgICAgICAgX2NvbHVtbiA9IGNvbHVtbjsKKyAgICAgICAgX29mZnNldCA9IG9mZnNldDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgMS1iYXNlZCBsaW5lIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duLgorICAgICAqLyAKKyAgICBwdWJsaWMgaW50IGdldExpbmUgICAoICkgeyByZXR1cm4gX2xpbmU7ICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDEtYmFzZWQgY29sdW1uIG51bWJlciwgb3IgLTEgaWYgbm90IGtub3duLgorICAgICAqLyAKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbiAoICkgeyByZXR1cm4gX2NvbHVtbjsgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDAtYmFzZWQgZmlsZSBvZmZzZXQgbnVtYmVyLCBvciAtMSBpZiBub3Qga25vd24uCisgICAgICovIAorICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0ICggKSB7IHJldHVybiBfb2Zmc2V0OyB9CisKKyAgICBwcml2YXRlIGludCBfbGluZSwgX2NvbHVtbiwgX29mZnNldDsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxMb25nLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTG9uZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmQ3YzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTG9uZy5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xvbmciPnhzOmxvbmc8L2E+IHR5cGUuCisgKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KKyAqIDxwPgorICogTmF0dXJhbGx5LCBjb252ZXJ0aWJsZSB0byBhIEphdmEgbG9uZy4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sTG9uZyBleHRlbmRzIFhtbEludGVnZXIKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9sb25nIik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KKyAgICBsb25nIGdldExvbmdWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBsb25nICovCisgICAgdm9pZCBzZXRMb25nVmFsdWUobG9uZyB2KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjZ2V0TG9uZ1ZhbHVlfQorICAgICAqKi8KKyAgICBsb25nIGxvbmdWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0TG9uZ1ZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChsb25nIHYpOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxMb25nfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxMb25nfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxMb25nfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxMb25nfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbExvbmd9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTG9uZyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTG9uZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxMb25nfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxMb25nIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTkNOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwMTMxZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOQ05hbWUuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOYW1lIj54czpOYW1lPC9hPiB0eXBlLgorICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgorICogPHA+CisgKiBUaGlzIGtpbmQgb2Ygc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBub24tY29sb25pemVkIHN0cmluZ3MgdGhhdCBhcmUgdXNlZAorICogZm9yIFhNTCBsb2NhbG5hbWVzIGFuZCBwcmVmaXhlcywgIm15LWhyZWYuMiIuICBJdCBpcyBqdXN0IGEgcGh5c2ljYWwKKyAqIHN0cmluZywgaG93ZXZlciwgYW5kIGl0IHNob3VsZCBOT1QgYmUgY29uZnVzZWQgd2l0aCB7QGxpbmsgWG1sUU5hbWV9LAorICogd2hpY2ggaXMgYSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGxvY2FsbmFtZSBhbmQgbmFtZXNwYWNlIFVSSS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbE5DTmFtZSBleHRlbmRzIFhtbE5hbWUKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9OQ05hbWUiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbE5DTmFtZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTkNOYW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTkNOYW1lfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015LU5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7TXktTmFtZSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5DTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOQ05hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTkNOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTkNOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOQ05hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTkNOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOQ05hbWV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5DTmFtZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5DTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA5MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU4uamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOTVRPS0VOIj54czpOTVRPS0VOPC9hPiB0eXBlLgorICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jc3RyaW5nIj54czpzdHJpbmc8L2E+LgorICogPHA+CisgKiBBbiBOTVRPS0VOIGlzIFhNTCdzIGNsb3Nlc3QgY29uY2VwdCB0byBhbiAiaWRlbnRpZmllciI7IGZvciBleGFtcGxlLAorICogaXQgZG9lcyBub3QgcGVybWl0IHNwYWNlcyBhbmQgb25seSBsaW1pdGVkIHB1bmN0dWF0aW9uLiAgU28gTk1UT0tFTiBpcworICogY29tbW9ubHkgdXNlZCB0byBkZXNjcmliZSBhIHNpbmdsZSB0b2tlbiBvciBlbnVtZXJhdGVkIHN0cmluZyB2YWx1ZS4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbE5NVE9LRU4gZXh0ZW5kcyBYbWxUb2tlbgoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05NVE9LRU4iKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbE5NVE9LRU59LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU59ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbE5NVE9LRU59ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbE5NVE9LRU59IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c2FtcGxlLTEuMiZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4yJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU4gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU5TLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk1UT0tFTlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjZkMTYzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5NVE9LRU5TLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU5TIj54czpOTVRPS0VOUzwvYT4gdHlwZSwKKyAqIGEgbGlzdCB0eXBlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgTGlzdH0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbE5NVE9LRU5TIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX05NVE9LRU5TIik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBTdHJpbmd9IHZhbHVlcyAqLworICAgIExpc3QgZ2V0TGlzdFZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEge0BsaW5rIExpc3R9IG9mIHtAbGluayBYbWxOTVRPS0VOfSB2YWx1ZXMgKi8KKyAgICBMaXN0IHhnZXRMaXN0VmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gKi8KKyAgICB2b2lkIHNldExpc3RWYWx1ZShMaXN0IGwpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gdmFsdWVzCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkge0BsaW5rICNnZXRMaXN0VmFsdWV9CisgICAgICoqLworICAgIExpc3QgbGlzdFZhbHVlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFhtbE5NVE9LRU59IHZhbHVlcworICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0TGlzdFZhbHVlfQorICAgICAqKi8KKyAgICBMaXN0IHhsaXN0VmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhcyBhIHtAbGluayBMaXN0fQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0TGlzdFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChMaXN0IGwpOworCisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbE5NVE9LRU5TfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOU30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOTVRPS0VOU30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOTVRPS0VOU30gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4xIHNhbXBsZS0xLjIgc2FtcGxlLTEuMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzYW1wbGUtMS4xIHNhbXBsZS0xLjIgc2FtcGxlLTEuMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOTVRPS0VOU30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOTVRPS0VOUyBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5NVE9LRU5TfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk1UT0tFTlMgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5NVE9LRU5TKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOTVRPS0VOUykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk1UT0tFTlN9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5NVE9LRU5TIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk1UT0tFTlMpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTk9UQVRJT04uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ1OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5PVEFUSU9OLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk9UQVRJT04iPnhzOk5PVEFUSU9OPC9hPiB0eXBlLgorICogPHA+CisgKiBOT1RBVElPTnMgYXJlIGEgbWVjaGFuaXNtIGluIFhNTCBTY2hlbWEgdGhhdCBpcyBwcm92aWRlZAorICogZm9yIHBhcnRpYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIE5PVEFUSU9OcyBpbiBEVERzLiAgWE1MIFNjaGVtYQorICogdXNlcnMgc2hvdWxkIGFsbW9zdCBuZXZlciBoYXZlIGFueSByZWFzb24gdG8gdXNlIHRoaXMgZGF0YSB0eXBlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sTk9UQVRJT04gZXh0ZW5kcyBYbWxBbnlTaW1wbGVUeXBlCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTk9UQVRJT04iKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbE5PVEFUSU9OfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOT1RBVElPTn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOT1RBVElPTn0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTk9UQVRJT059IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTk9UQVRJT04gcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOT1RBVElPTn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5PVEFUSU9OIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOT1RBVElPTikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTk9UQVRJT04pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5PVEFUSU9OfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOT1RBVElPTiBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5PVEFUSU9OKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTRmOWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmFtZS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05hbWUiPnhzOk5hbWU8L2E+IHR5cGUuCisgKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciPnhzOnN0cmluZzwvYT4uCisgKiA8cD4KKyAqIFRoaXMga2luZCBvZiBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIGxleGljYWwgcmVwcmVzZW50YXRpb24gdXNlZCBmb3IgWE1MIDEuMAorICogZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLCBlLmcuLCAicHJlOmEtYi5jZGVmIi4gIEl0IGlzIGp1c3QgYSBwaHlzaWNhbAorICogc3RyaW5nLCBob3dldmVyLCBhbmQgaXQgc2hvdWxkIE5PVCBiZSBjb25mdXNlZCB3aXRoIHtAbGluayBYbWxRTmFtZX0sCisgKiB3aGljaCBpcyBhIGxvZ2ljYWwgY29tYmluYXRpb24gb2YgbG9jYWxuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sTmFtZSBleHRlbmRzIFhtbFRva2VuCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfTmFtZSIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sTmFtZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTmFtZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTmFtZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTmFtZX0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtNeTpOYW1lJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0O015Ok5hbWUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5hbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5hbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOYW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOYW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTmVnYXRpdmVJbnRlZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViZmU2NAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOZWdhdGl2ZUludGVnZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiPnhzOm5lZ2F0aXZlSW50ZWdlcjwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBWZXJpZmllZCB0byBiZSBuZWdhdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbE5lZ2F0aXZlSW50ZWdlciBleHRlbmRzIFhtbE5vblBvc2l0aXZlSW50ZWdlcgoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX25lZ2F0aXZlSW50ZWdlciIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5lZ2F0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzg2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIj54czpub25OZWdhdGl2ZUludGVnZXI8L2E+IHR5cGUuCisgKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KKyAqIDxwPgorICogVmVyaWZpZWQgdG8gYmUgemVybyBvciBwb3NpdGl2ZSB3aGVuIHZhbGlkYXRpbmcuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBleHRlbmRzIFhtbEludGVnZXIKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9ub25OZWdhdGl2ZUludGVnZXIiKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5MCZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25OZWdhdGl2ZUludGVnZXIgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25OZWdhdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uTmVnYXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25OZWdhdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vbk5lZ2F0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2N2YwOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb25Qb3NpdGl2ZUludGVnZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25Qb3NpdGl2ZUludGVnZXIiPnhzOm5vblBvc2l0aXZlSW50ZWdlcjwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBWZXJpZmllZCB0byBiZSB6ZXJvIG9yIG5lZ2F0aXZlIHdoZW4gdmFsaWRhdGluZy4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIGV4dGVuZHMgWG1sSW50ZWdlcgoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX25vblBvc2l0aXZlSW50ZWdlciIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7LTEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb25Qb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vblBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vblBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9uUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vblBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9uUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb25Qb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE5vcm1hbGl6ZWRTdHJpbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb3JtYWxpemVkU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkZWJlZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxOb3JtYWxpemVkU3RyaW5nLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyI+eHM6bm9ybWFsaXplZFN0cmluZzwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyI+eHM6c3RyaW5nPC9hPi4KKyAqIDxwPgorICogQW4gbm9ybWFsaXplZFN0cmluZyBzaW1wbHkgaXMgYSBzdHJpbmcgd2hlcmUgYWxsIHRoZSBjYXJyaWFnZSByZXR1cm4sCisgKiBsaW5lZmVlZCwgYW5kIHRhYiBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBub3JtYWxpemVkIChzd2l0Y2hlZCB0bykgb3JkaW5hcnkKKyAqIHNwYWNlIGNoYXJhY3RlcnMuICBVc2Ugbm9ybWFsaXplZFN0cmluZyBmb3IgbG9uZyBzdHJpbmdzIHRvIG1ha2UgdGhlbQorICogaW5zZW5zaXRpdmUgdG8gbGluZSBicmVha2luZy4gIElmIHlvdSB3aXNoIHRvIG9mdGVuIGJlIGluc2Vuc2l0aXZlIHRvCisgKiBydW5zIG9mIHdoaXRlc3BhY2UgKGFzIGlzIG9mdGVuIHRoZSBjYXNlKSwgdXNlCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIj54czp0b2tlbjwvYT4KKyAqIChha2Ege0BsaW5rIFhtbFRva2VufSkgaW5zdGVhZC4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIFN0cmluZ30uICBXaGVuIG9idGFpbmluZyB0aGUgc3RyaW5nVmFsdWUsIHRoZQorICogd2hpdGVzcGFjZS1ub3JtYWxpemVkIHZhbHVlIGlzIHJldHVybmVkLgorICovIAorcHVibGljIGludGVyZmFjZSBYbWxOb3JtYWxpemVkU3RyaW5nIGV4dGVuZHMgWG1sU3RyaW5nCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfbm9ybWFsaXplZFN0cmluZyIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsgc3RyaW5nIHRvIG5vcm1hbGl6ZSAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IHN0cmluZyB0byBub3JtYWxpemUgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxOb3JtYWxpemVkU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE5vcm1hbGl6ZWRTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbE5vcm1hbGl6ZWRTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxOb3JtYWxpemVkU3RyaW5nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxOb3JtYWxpemVkU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sTm9ybWFsaXplZFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sTm9ybWFsaXplZFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sTm9ybWFsaXplZFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbE5vcm1hbGl6ZWRTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjhkMTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT2JqZWN0LmphdmEKQEAgLTAsMCArMSw3MjUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2tleS11clR5cGUiPnhzOmFueVR5cGU8L2E+LAorICogdGhlIGJhc2UgdHlwZSBmb3IgYWxsIFhNTCBCZWFucy4KKyAqIDxwPgorICogU2luY2UgYWxsIFhNTCBTY2hlbWEgdHlwZXMgYXJlIHRyYW5zbGF0ZWQgaW50byBjb3JyZXNwb25kaW5nIFhNTCBCZWFuCisgKiBjbGFzc2VzLCBhbmQgYWxsIFNjaGVtYSB0eXBlIGRlcml2YXRpb24gY29ycmVzcG9uZHMgdG8gSmF2YSBjbGFzcworICogaW5oZXJpdGFuY2UsIHRoZSBmYWN0IHRoYXQgYWxsIFNjaGVtYSB0eXBlcyBkZXJpdmUgZnJvbSB4czphbnlUeXBlIG1lYW5zCisgKiB0aGF0IGFsbCBYTUwgQmVhbiBjbGFzc2VzIGRlcml2ZSBmcm9tIFhtbE9iamVjdC4KKyAqIDxwPgorICogT24gdGhpcyBiYXNlIGNsYXNzIHlvdSB3aWxsIGZpbmQgYSBudW1iZXIgb2YgY29tbW9uIGZhY2lsaXRpZXMgdGhhdAorICogYWxsIFhNTCBCZWFuIGNsYXNzZXMgcHJvdmlkZToKKyAqIDxwPgorICogPHVsPgorICogPGxpPkV2ZXJ5IFhNTCBCZWFuIGNsYXNzIGhhcyBhbiBpbm5lciBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBhbmQgcGFyc2luZworICogICAgIGluc3RhbmNlcywgaW5jbHVkaW5nIFhtbE9iamVjdC4gVXNlIHtAbGluayBYbWxPYmplY3QuRmFjdG9yeX0gaXRzZWxmCisgKiAgICAgdG8gcHJvZHVjZSB1bnR5cGVkIFhNTCB0cmVlcyBvciBYTUwgdHJlZXMgdGhhdCBpbXBsZW1lbnQgc3BlY2lmaWMKKyAqICAgICBzdWJ0eXBlcyBvZiBYbWxPYmplY3QgZGVwZW5kaW5nIG9uIGEgcmVjb2duaXplZCByb290IGRvY3VtZW50IGVsZW1lbnQuCisgKiAgICAgSWYgeW91IGRlcGVuZCBvbiB0aGUgYXV0b21hdGljIHR5cGUgaW5mZXJlbmNlLCB5b3Ugd2lsbCB3YW50IHRvIHVuZGVyc3RhbmQKKyAqICAgICB0aGUgdHlwZSBpbmZlcmVuY2UgaXNzdWVzIGRlc2NyaWJlZCBiZWxvdy4KKyAqIDxsaT5UbyB3cml0ZSBvdXQgYW4gYWNjdXJhdGUgWE1MIGZpbGUgZm9yIHRoZSBYTUwgdHJlZSB1bmRlciB0aGlzCisgKiAgICAgWG1sT2JqZWN0LCB1c2Ugb25lIG9mIHRoZSB7QGxpbmsgI3NhdmV9IG1ldGhvZHMsCisgKiAgICAgb3Ige0BsaW5rICNuZXdJbnB1dFN0cmVhbX0gb3Ige0BsaW5rICNuZXdSZWFkZXJ9LgorICogICAgIFVzZSB7QGxpbmsgI3RvU3RyaW5nfSB0byBwcm9kdWNlIGEgcHJldHR5LXByaW50ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiAgICAgWE1MIHN1YnRyZWUgdW5kZXIgdGhpcyBYTUwgT2JqZWN0LiAgSWYgeW91IHNhdmUgaW50ZXJpb3IgcG9ydGlvbnMgb2YKKyAqICAgICBhbiBYTUwgZG9jdW1lbnQsIHlvdSB3aWxsIHdhbnQgdG8gdW5kZXJzdGFuZCB0aGUgaW5uZXIgY29udGVudHMKKyAqICAgICB2ZXJzdXMgb3V0ZXIgY29udGFpbmVyIGlzc3VlcyBkZXNjcmliZWQgYmVsb3cuCisgKiA8bGk+SXQgaXMgYWxzbyBzaW1wbGUgdG8gY29weSBhbiBYbWxPYmplY3QgaW5zdGFuY2UgdG8gb3IgZnJvbSBhIHN0YW5kYXJkCisgKiAgICAgRE9NIHRyZWUgb3IgU0FYIHN0cmVhbS4gIFVzZSB7QGxpbmsgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoTm9kZSl9LAorICogICAgIGZvciBleGFtcGxlLCB0byBsb2FkIGZyb20gRE9NOyB1c2Uge0BsaW5rIFhtbE9iamVjdC5GYWN0b3J5I25ld1htbFNheEhhbmRsZXJ9CisgKiAgICAgdG8gbG9hZCBmcm9tIFNBWDsgdXNlIHtAbGluayAjbmV3RG9tTm9kZSgpfSB0byBzYXZlIHRvIERPTTsgYW5kIHVzZSAKKyAqICAgICB7QGxpbmsgI3NhdmUob3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIsIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcil9CisgKiAgICAgdG8gc2F2ZSB0byBTQVguCisgKiA8bGk+VXNlIHtAbGluayAjdmFsaWRhdGV9IHRvIHZhbGlkYXRlIHRoZSBzdWJ0cmVlIG9mIFhNTCB1bmRlciB0aGlzCisgKiAgICAgWE1MIE9iamVjdC4gIElmIHlvdSB3aXNoIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24KKyAqICAgICBhbmQgcmVhc29uIGZvciB2YWxpZGF0aW9uIGVycm9ycywgc2VlIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LAorICogICAgIGFuZCB1c2Uge0BsaW5rICN2YWxpZGF0ZShYbWxPcHRpb25zKX0uCisgKiA8bGk+VXNlIHtAbGluayAjbmV3Q3Vyc29yfSB0byBhY2Nlc3MgdGhlIGZ1bGwgWE1MIGluZm9zZXQsIGZvciBleGFtcGxlLAorICogICAgIGlmIHlvdSBuZWVkIHRvIGRldGVybWluZSBpbnRlcmxlYXZlZCBlbGVtZW50IG9yZGVyIG9yIG1hbmlwdWxhdGUKKyAqICAgICBhbm5vdGF0aW9ucywgY29tbWVudHMsIG9yIG1peGVkIGNvbnRlbnQuICBTZWUge0BsaW5rIFhtbEN1cnNvcn0uCisgKiA8bGk+VXNlIHtAbGluayAjc2VsZWN0UGF0aH0gdG8gZmluZCBvdGhlciBYbWxPYmplY3RzIGluIHRoZSBzdWJ0cmVlIHVuZGVybmVhdGgKKyAqICAgICB0aGlzIFhtbE9iamVjdCB1c2luZyByZWxhdGl2ZSBYUGF0aHMuICAoSW4gc2VsZWN0UGF0aCwgIi4iIGluZGljYXRlcworICogICAgIHRoZSBjdXJyZW50IGVsZW1lbnQgb3IgYXR0cmlidXRlLikKKyAqIDwvdWw+CisgKiA8cD4KKyAqIFR5cGUgaW5mZXJlbmNlLiAgV2hlbiB1c2luZyB7QGxpbmsgWG1sT2JqZWN0LkZhY3Rvcnl9IHRvIHBhcnNlIFhNTCBkb2N1bWVudHMsCisgKiB0aGUgYWN0dWFsIGRvY3VtZW50IHR5cGUgaXMgbm90IHtAbGluayBYbWxPYmplY3QjdHlwZX0gaXRzZWxmLCBidXQgYSBzdWJ0eXBlCisgKiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHBhcnNlZCBkb2N1bWVudC4gIElmIHRoZSBwYXJzZWQgZG9jdW1lbnQKKyAqIGNvbnRhaW5zIGEgcmVjb2duaXplZCByb290IGRvY3VtZW50IGVsZW1lbnQsIHRoZW4gdGhlIGFjdHVhbCB0eXBlIG9mIHRoZQorICogbG9hZGVkIGluc3RhbmNlIHdpbGwgYmUgdGhlIG1hdGNoaW5nIERvY3VtZW50IHR5cGUuICBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKG15RG9jdW1lbnQpOworICogaWYgKHhvYmogaW5zdGFuY2VvZiBNeU9yZGVyRG9jdW1lbnQpIC8vIHN0YXJ0cyB3LyAmbHQ7bXktb3JkZXImZ3Q7CisgKiB7CisgKiAgICAgTXlPcmRlckRvY3VtZW50IG15ZG9jID0gKE15T3JkZXJEb2N1bWVudCl4b2JqOworICogICAgIGlmICgheG9iai52YWxpZGF0ZSgpKQorICogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdCBhIHZhbGlkIG15LW9yZGVyIGRvY3VtZW50Iik7CisgKiB9CisgKiBlbHNlCisgKiB7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3QgYSBteS1vcmRlciBkb2N1bWVudCIpOworICogfQorICogPC9wcmU+CisgKiBFdmVyeSBYTUwgQmVhbiBjbGFzcyBoYXMgaXRzIG93biBpbm5lciBGYWN0b3J5IGNsYXNzLAorICogc28gaWYgeW91IGFjdHVhbGx5IGtub3cgZXhhY3RseSB3aGljaCBYTUwgQmVhbiBkb2N1bWVudCB0eXBlCisgKiB5b3Ugd2FudCB0byBsb2FkIGFzIGluIHRoZSBleGFtcGxlIGFib3ZlLCB5b3Ugc2hvdWxkIHVzZSB0aGUKKyAqIHRoZSBzcGVjaWZpYyBYTUwgQmVhbiBGYWN0b3J5IGNsYXNzIGluc3RlYWQuIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqIE15T3JkZXJEb2N1bWVudCBteWRvYyA9IE15T3JkZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKG15RG9jdW1lbnQpOworICogPC9wcmU+CisgKiBUaGUgY29kZSBhYm92ZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VkIGRvY3VtZW50CisgKiBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBwcm9wZXIgKG15LW9yZGVyKSBlbGVtZW50LgorICogPHA+CisgKiBJbm5lciB2ZXJzdXMgb3V0ZXIuICBBbiBYbWxPYmplY3QgcmVwcmVzZW50cyB0aGUKKyAqIDxlbT5jb250ZW50czwvZW0+IG9mIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlLCA8ZW0+bm90PC9lbT4gdGhlIGVsZW1lbnQKKyAqIG9yIGF0dHJpYnV0ZSBpdHNlbGYuICBTbyB3aGVuIHlvdSB2YWxpZGF0ZSBvciBzYXZlIGFuIFhtbE9iamVjdCwgeW91CisgKiBhcmUgdmFsaWRhdGluZyBvciBzYXZpbmcgaXRzIGNvbnRlbnRzLCBub3QgaXRzIGNvbnRhaW5lci4gIEZvciBleGFtcGxlLAorICogaWYgdGhlIFhtbE9iamVjdCByZXByZXNlbnRzIHRoZSBjb250ZW50cyBvZiBhbiBlbGVtZW50IHdoaWNoIGhhcHBlbnMKKyAqIHRvIGl0c2VsZiBiZSBpbiB0aGUgd3Jvbmcgb3JkZXIgcmVsYXRpdmUgdG8gaXRzIHNpYmxpbmdzLCB2YWxpZGF0ZSB3aWxsCisgKiBub3QgY29tcGxhaW4gYWJvdXQgdGhlIG1pc3BsYWNlbWVudCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYKKyAqIGVsZW1lbnRzIDxlbT53aXRoaW48L2VtPiB0aGUgWG1sT2JqZWN0IGFyZSBpbiB0aGUgd3Jvbmcgb3JkZXIsIHZhbGlkYXRlCisgKiB3aWxsIGNvbXBsYWluLiAgU2ltaWxhcmx5LCB3aGVuIHNhdmluZyB0aGUgY29udGVudHMgb2YgYW4gaW50ZXJpb3IKKyAqIFhtbE9iamVjdCwgaXQgaXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQsIG5vdCB0aGUgZWxlbWVudCBpdHNlbGYsCisgKiB3aGljaCBpcyBzYXZlZCBieSBkZWZhdWx0LgorICogPHA+CisgKiBSZWFkaW5nIGFuZCB3cml0aW5nIGZyYWdtZW50cy4gV2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGNvbnRlbnRzIG9mIGEKKyAqIHdob2xlIFhNTCBkb2N1bWVudCwgdGhlIHN0YW5kYXJkIFhNTCByZXByZW50YXRpb24gZm9yIGEgZG9jdW1lbnQgaXMgdXNlZC4KKyAqIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHN0YW5kYXJkIGNvbmNyZXRlIFhNTCByZXByZXNlbnRhdGlvbiBmb3IgImp1c3QgdGhlCisgKiBjb250ZW50cyIgb2YgYW4gaW50ZXJpb3IgZWxlbWVudCBvciBhdHRyaWJ1dGUuIFNvIHdoZW4gb25lIGlzIG5lZWRlZCwKKyAqIHRoZSB0YWcgJmx0O3htbC1mcmFnbWVudCZndDsgaXMgdXNlZCB0byB3cmFwIHRoZSBjb250ZW50cy4gIFRoaXMgdGFnIGlzIHVzZWQKKyAqIGNhbiBhbHNvIGJlIHVzZWQgdG8gbG9hZCBqdXN0IHRoZSBjb250ZW50cyBmb3IgYW4gWG1sT2JqZWN0IGRvY3VtZW50IGZyYWdtZW50CisgKiBvZiBhcmJpdHJhcnkgdHlwZS4gSWYgeW91IHdpc2ggdG8gc2F2ZSBvdXQgdGhlIFhtbE9iamVjdCdzIGNvbnRhaW5lciBlbGVtZW50CisgKiBhbG9uZyB3aXRoIGl0cyBjb250ZW50cywgdXNlIHtAbGluayBYbWxPcHRpb25zI3NldFNhdmVPdXRlcn0uCisgKiA8cD4KKyAqIEltcGxlbWVudGluZyBYbWxPYmplY3QuICBUaGUgWE1MQmVhbnMgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IGFyYml0cmFyeQorICogaW1wbGVtZW50YXRpb25zIG9mIFhtbE9iamVjdCAtIGluIGFsbW9zdCBhbGwgY2FzZXMsIHlvdSBzaG91bGQgb25seSB1c2UKKyAqIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgWG1sT2JqZWN0IHByb3ZpZGVkIGJ5IHRoZSBYTUxCZWFucyBjb21waWxlciBpdHNlbGYuCisgKiBJZiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgWG1sT2JqZWN0IHlvdXJzZWxmLCB5b3Ugc2hvdWxkIHN1YmNsYXNzCisgKiBGaWx0ZXJYbWxPYmplY3QgaW4gb3JkZXIgdG8gZGVsZWdhdGUgdG8gYW5vdGhlciB1bmRlcmx5aW5nIFhtbE9iamVjdAorICogaW1wbGVtZW50YXRpb24uIFRoaXMgdGVjaG5pcXVlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB5b3VyIGNvZGUgdW5jaGFuZ2VkCisgKiB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBYTUxCZWFucyB0aGF0IGFkZCBhZGRpdGlvbmFsIG1ldGhvZHMgb24gWG1sT2JqZWN0LiAKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sT2JqZWN0IGV4dGVuZHMgWG1sVG9rZW5Tb3VyY2UKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9hbnlUeXBlIik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1hIHR5cGUgZm9yIHRoaXMgaW5zdGFuY2UuIFRoaXMgaXMgYSBwZXJtYW5lbnQsCisgICAgICogdW5jaGFuZ2luZyBwcm9wZXJ0eSBvZiB0aGUgaW5zdGFuY2UuCisgICAgICovCisgICAgU2NoZW1hVHlwZSBzY2hlbWFUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0IGFyZSB2YWxpZAorICAgICAqIGFjY29yaW5nIHRvIHNjaGVtYVR5cGUoKS4KKyAgICAgKiA8cD4KKyAgICAgKiBEb2VzIGEgZGVlcCB2YWxpZGF0aW9uIG9mIHRoZSBlbnRpcmUgc3VidHJlZSB1bmRlciB0aGUKKyAgICAgKiBvYmplY3QsIGJ1dCBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgcGFyZW50cyBvciBzaWJsaW5ncworICAgICAqIG9mIHRoZSBvYmplY3QgaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgaW50ZXJpb3Igb2YgYW4geG1sCisgICAgICogdHJlZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHZhbGlkYXRlKCk7CisgICAgCisgICAgLyoqCisgICAgICogPHA+SnVzdCBsaWtlIHZhbGlkYXRlKCksIGJ1dCB3aXRoIG9wdGlvbnMuPC9wPgorICAgICAqIDxwPklmIHlvdSB3aXNoIHRvIGNvbGxlY3QgZXJyb3IgbWVzc2FnZXMgYW5kIGxvY2F0aW9ucyB3aGlsZSB2YWxpZGF0aW5nLAorICAgICAqIHVzZSB0aGUge0BsaW5rIFhtbE9wdGlvbnMjc2V0RXJyb3JMaXN0ZW5lcn0gbWV0aG9kLiBXaXRoIHRoYXQgbWV0aG9kLAorICAgICAqIHlvdSBjYW4gc3BlY2lmeSBhbiBvYmplY3QgaW4gd2hpY2ggdG8gc3RvcmUgbWVzc2FnZXMgcmVsYXRlZCB0byB2YWxpZGF0aW9uLgorICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgYSBzaW1wbGUgZXhhbXBsZS48L3A+CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiAvLyBDcmVhdGUgYW4gWG1sT3B0aW9ucyBpbnN0YW5jZSBhbmQgc2V0IHRoZSBlcnJvciBsaXN0ZW5lci4KKyAgICAgKiBYbWxPcHRpb25zIHZhbGlkYXRlT3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICogQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgKiB2YWxpZGF0ZU9wdGlvbnMuc2V0RXJyb3JMaXN0ZW5lcihlcnJvckxpc3QpOworICAgICAqIAorICAgICAqIC8vIFZhbGlkYXRlIHRoZSBYTUwuCisgICAgICogYm9vbGVhbiBpc1ZhbGlkID0gbmV3RW1wLnZhbGlkYXRlKHZhbGlkYXRlT3B0aW9ucyk7CisgICAgICogCisgICAgICogLy8gSWYgdGhlIFhNTCBpc24ndCB2YWxpZCwgbG9vcCB0aHJvdWdoIHRoZSBsaXN0ZW5lcidzIGNvbnRlbnRzLAorICAgICAqIC8vIHByaW50aW5nIGNvbnRhaW5lZCBtZXNzYWdlcy4KKyAgICAgKiBpZiAoIWlzVmFsaWQpCisgICAgICogeworICAgICAqICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckxpc3Quc2l6ZSgpOyBpKyspCisgICAgICogICAgICB7CisgICAgICogICAgICAgICAgWG1sRXJyb3IgZXJyb3IgPSAoWG1sRXJyb3IpZXJyb3JMaXN0LmdldChpKTsKKyAgICAgKiAgICAgICAgICAKKyAgICAgKiAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7CisgICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlOiAiICsgZXJyb3IuZ2V0TWVzc2FnZSgpICsgIlxuIik7CisgICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2NhdGlvbiBvZiBpbnZhbGlkIFhNTDogIiArIAorICAgICAqICAgICAgICAgICAgICBlcnJvci5nZXRDdXJzb3JMb2NhdGlvbigpLnhtbFRleHQoKSArICJcbiIpOworICAgICAqICAgICAgfQorICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb24gCisgICAgICogQ29sbGVjdGlvbn0gaW50ZXJmYWNlLgorICAgICAqLworICAgIGJvb2xlYW4gdmFsaWRhdGUoWG1sT3B0aW9ucyBvcHRpb25zKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgYSBwYXRoLiAgUGF0aCBjYW4gYmUgYSBzdHJpbmcgb3IgcHJlY29tcGlsZWQgcGF0aCBTdHJpbmcuCisgICAgICogPHA+CisgICAgICogVGhlIHBhdGggbXVzdCBiZSBhIHJlbGF0aXZlIHBhdGgsIHdoZXJlICIuIiByZXByZXNlbnRzIHRoZQorICAgICAqIGVsZW1lbnQgb3IgYXR0cmlidXRlIGNvbnRhaW5nIHRoaXMgWG1sT2JqZWN0LCBhbmQgaXQgbXVzdCBzZWxlY3QKKyAgICAgKiBvbmx5IG90aGVyIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMuICBJZiBhIG5vbi1lbGVtZW50IG9yIG5vbi1hdHRyaWJ1dGUKKyAgICAgKiBpcyBzZWxlY3RlZCwgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogPHA+CisgICAgICogVGhlIGFycmF5IHRoYXQgaXMgcmV0dXJuZWQgY29udGFpbnMgYWxsIHRoZSBzZWxlY3RlZAorICAgICAqIFhtbE9iamVjdHMsIHdpdGhpbiB0aGUgc2FtZSBkb2N1bWVudCwgbGlzdGVkIGluIGRvY3VtZW50CisgICAgICogb3JkZXIuICBUaGUgYWN0dWFsIGFycmF5IHR5cGUgb2YgdGhlIHJlc3VsdCBpcyBpbmZlcnJlZAorICAgICAqIGZyb20gdGhlIGNsb3Nlc3QgY29tbW9uIGJhc2UgdHlwZSBvZiBzZWxlY3RlZCByZXN1bHRzLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2FnZS4gIFN1cHBvc2Ugd2UgaGF2ZSBhIGdsb2JhbAorICAgICAqIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgIm93bmVyIiB3aG9zZSB0eXBlIGlzICJwZXJzb24iOgorICAgICAqIDxwcmU+CisgICAgICogICAmbHQ7c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3NhbXBsZSI+CisgICAgICogICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJvd25lciIgdHlwZT0icGVyc29uIi8+CisgICAgICogICAgICAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icGVyc29uIj4KKyAgICAgKiAgICAgICAgIFsuLi5dCisgICAgICogICAgICAmbHQ7L2NvbXBsZXhUeXBlPgorICAgICAqICAgJmx0Oy9zY2hlbWE+CisgICAgICogPC9wcmU+CisgICAgICogYW5kIHN1cHBvc2UgIm93bmVyIiB0YWdzIGNhbiBiZSBzY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUKKyAgICAgKiBkb2N1bWVudC4gIFRoZW4gd2UgY2FuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byBmaW5kCisgICAgICogdGhlbSBhbGw6CisgICAgICogPHByZT4KKyAgICAgKiBpbXBvcnQgb3JnLm9wZW51cmkuc2FtcGxlLlBlcnNvbjsKKyAgICAgKiBpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy4qOworICAgICAqIFsuLi5dCisgICAgICogICBYbWxPYmplY3QgeG9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKG15RmlsZSk7CisgICAgICogICBQZXJzb25bXSByZXN1bHRzOworICAgICAqICAgcmVzdWx0cyA9IChQZXJzb25bXSl4b2JqLnNlbGVjdFBhdGgoCisgICAgICogICAgICAiZGVjbGFyZSBuYW1lc3BhY2Ugcz0naHR0cDovL3d3dy5vcGVudXJpLm9yZy9zYW1wbGUnICIgKworICAgICAqICAgICAgIi4vL3M6b3duZXIiKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBOb3RpY2UgdGhlIHdheSBpbiB3aGljaCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFyZSBkb25lIGluIFhQYXRoIDIuMC4KKyAgICAgKiBTaW5jZSBYUGF0aCBjYW4gb25seSBuYXZpZ2F0ZSB3aXRoaW4gYW4gWE1MIGRvY3VtZW50IC0gaXQgY2Fubm90CisgICAgICogY29uc3RydWN0IG5ldyBYTUwgLSB0aGUgcmVzdWx0aW5nIFhtbE9iamVjdHMgYWxsIHJlc2lkZSBpbgorICAgICAqIHRoZSBzYW1lIFhNTCBkb2N1bWVudCBhcyB0aGlzIFhtbE9iamVjdCBpdHNlbGYuCisgICAgICovCisgICAgWG1sT2JqZWN0W10gc2VsZWN0UGF0aCAoIFN0cmluZyBwYXRoICk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIGEgcGF0aCwgYXBwbHlpbmcgb3B0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZWxlY3RQYXRoKFN0cmluZykKKyAgICAgKi8KKyAgICBYbWxPYmplY3RbXSBzZWxlY3RQYXRoICggU3RyaW5nIHBhdGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApOworICAgIAorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBxdWVyeS4gIFF1ZXJ5IGNhbiBiZSBhIHN0cmluZyBvciBwcmVjb21waWxlZCBxdWVyeSBTdHJpbmcuCisgICAgICogPHA+CisgICAgICogQW4gWFF1ZXJ5IGlzIHZlcnkgc2ltaWxhciB0byBhbiBYUGF0aCwgZXhjZXB0IHRoYXQgaXQgYWxzbyBwZXJtaXRzCisgICAgICogY29uc3RydWN0aW9uIG9mIG5ldyBYTUwuICBBcyBhIHJlc3VsdCwgdGhlIFhtbE9iamVjdHMgdGhhdCBhcmUKKyAgICAgKiByZXR1cm5lZCBmcm9tIGV4ZWNRdWVyeSBhcmUgaW4gbmV3bHkgY3JlYXRlZCBkb2N1bWVudHMsIHNlcGFyYXRlCisgICAgICogZnJvbSB0aGUgWG1sT2JqZWN0IG9uIHdoaWNoIHRoZSBxdWVyeSBpcyBleGVjdXRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTeW50YXggYW5kIHVzYWdlIGlzIG90aGVyd2lzZSBzaW1pbGFyIHRvIHNlbGVjdFBhdGguCisgICAgICogPHA+CisgICAgICogQHNlZSAjc2VsZWN0UGF0aChTdHJpbmcpCisgICAgICovCisgICAgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5ICk7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIHF1ZXJ5IHdpdGggb3B0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBVc2UgdGhlIDxlbT5vcHRpb25zPC9lbT4gcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIGZvbGxvd2luZzo8L3A+CisgICAgICogCisgICAgICogPHRhYmxlPgorICAgICAqIDx0cj48dGg+VG8gc3BlY2lmeSB0aGlzPC90aD48dGg+VXNlIHRoaXMgbWV0aG9kPC90aD48L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGV9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlRvIHJlcGxhY2UgdGhlIGRvY3VtZW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIFFOYW1lIHdoZW4gY29uc3RydWN0aW5nIHRoZQorICAgICAqICByZXN1bHRpbmcgZG9jdW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRSZXBsYWNlRG9jdW1lbnRFbGVtZW50fTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFdoaXRlc3BhY2V9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBjb21tZW50cyB3aGVuIGNvbnN0cnVjdGluZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBDb21tZW50c308L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFByb2NpbnN0c308L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+QSBtYXAgb2YgbmFtZXNwYWNlIFVSSSBzdWJzdGl0dXRpb25zIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXN9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPkFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gY29uc3RydWN0aW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlc308L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VG8gdHJpbSB0aGUgdW5kZXJseWluZyBYTUwgdGV4dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW5nIAorICAgICAqICBhIGRvY3VtZW50LCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRUcmltVGV4dEJ1ZmZlcn08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+V2hldGhlciB2YWx1ZSBmYWNldHMgc2hvdWxkIGJlIGNoZWNrZWQgYXMgdGhleSBhcmUgc2V0LjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRWYWxpZGF0ZU9uU2V0fTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8L3RhYmxlPiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIFhRdWVyeSBleHByZXNzaW9uLgorICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgYXMgZGVzY3JpYmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI2V4ZWNRdWVyeShTdHJpbmcpCisgICAgICovCisgICAgWG1sT2JqZWN0W10gZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5LCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKKyAgICAKKworICAgIC8qKgorICAgICAqIENoYW5nZXMgdGhlIHNjaGVtYSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRhdGEgYW5kCisgICAgICogcmV0dXJucyBhIG5ldyBYbWxPYmplY3QgaW5zdGFuY2Ugd2hvc2Ugc2NoZW1hVHlwZSBpcyB0aGUKKyAgICAgKiBuZXcgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHR5cGUgY2hhbmdlIGlzIG5vdCBhbGxvd2VkLiBDZXJ0YWluCisgICAgICogdHlwZSBjaGFuZ2VzIG1heSBiZSBwcm9oaWJpdGVkIG9uIHRoZSBpbnRlcmlvciBvZiBhbiB4bWwKKyAgICAgKiB0cmVlIGR1ZSB0byBzY2hlbWEgdHlwZSBzeXN0ZW0gY29uc3RyYWludHMgKHRoYXQgaXMsIGR1ZQorICAgICAqIHRvIGEgcGFyZW50IGNvbnRhaW5lciB3aXRoaW4gd2hpY2ggdGhlIG5ld2x5IHNwZWNpZmllZAorICAgICAqIHR5cGUgaXMgbm90IHBlcm1pc3NpYmxlKSwgYnV0IHRoZXJlIGFyZSBubyBjb25zdHJhaW50cworICAgICAqIGF0IHRoZSByb290dHlwZSBjaGFuZ2VzIGFyZSBuZXZlcgorICAgICAqIHByb2hpYml0ZWQgYXQgdGhlIHJvb3Qgb2YgYW4geG1sIHRyZWUuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHR5cGUgY2hhbmdlIGlzIGFsbG93ZWQsIHRoZW4gdGhlIG5ldyBYbWxPYmplY3Qgc2hvdWxkCisgICAgICogYmUgdXNlZCByYXRoZXIgdGhhbiB0aGUgb2xkIG9uZS4gVGhlIG9sZCBYbWxPYmplY3QgaW5zdGFuY2UgYW5kCisgICAgICogYW55IG90aGVyIFhtbE9iamVjdCBpbnN0YW5jZXMgaW4gdGhlIHN1YnRyZWUgYXJlIHBlcm1hbmVudGx5CisgICAgICogaW52YWxpZGF0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gKFRoZXkgd2lsbCByZXR1cm4KKyAgICAgKiBJbnZhbGlkU3RhdGVFeGNlcHRpb24gaWYgeW91IHRyeSB0byB1c2UgdGhlbS4pCisgICAgICoKKyAgICAgKiBJZiBhIHR5cGUgY2hhbmdlIGlzIGRvbmUgb24gdGhlIGludGVyaW9yIG9mIGFuIFhtbAorICAgICAqIHRyZWUsIHRoZW4geHNpOnR5cGUgYXR0cmlidXRlcyBhcmUgdXBkYXRlZCBhcyBuZWVkZWQuCisgICAgICovCisgICAgWG1sT2JqZWN0IGNoYW5nZVR5cGUoU2NoZW1hVHlwZSBuZXdUeXBlKTsKKworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbmlsLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYmUgbmlsLAorICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGluIGFuIGVsZW1lbnQsIGFuZCB0aGUgZWxlbWVudCBjb250YWluaW5nCisgICAgICogdGhlIHZhbHVlIG11c3QgYmUgbWFya2VkIGFzIG5pbGxhYmxlIGluIHRoZSBzY2hlbWEuCisgICAgICovCisgICAgYm9vbGVhbiBpc05pbCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgdG8gbmlsLiBUaGUgZWxlbWVudCBjb250YWluaW5nIHRoZSB2YWx1ZSBtdXN0CisgICAgICogYmUgbWFya2VkIGFzIG5pbGxhYmxlIGluIHRoZSBzY2hlbWEuCisgICAgICovCisgICAgdm9pZCBzZXROaWwoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYTUwgc3RyaW5nIGZvciB0aGlzIFhNTCBvYmplY3QuCisgICAgICogPHA+CisgICAgICogVGhlIHN0cmluZyBpcyBwcmV0dHktcHJpbnRlZC4gIElmIHlvdSB3YW50IGEgbm9uLXByZXR0eS1wcmludGVkCisgICAgICogc3RyaW5nLCBvciBpZiB5b3Ugd2FudCB0byBjb250cm9sIG9wdGlvbnMgcHJlY2lzZWx5LCB1c2UgdGhlCisgICAgICogeG1sVGV4dCgpIG1ldGhvZHMuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHdoZW4gcHJvZHVjaW5nIFhNTCBhbnkgb2JqZWN0IG90aGVyIHRoYW4gdmVyeSByb290IG9mIHRoZQorICAgICAqIGRvY3VtZW50LCB0aGVuIHlvdSBhcmUgZ3VhcmFudGVlZCB0byBiZSBsb29raW5nIGF0IG9ubHkgYSBmcmFnbWVudAorICAgICAqIG9mIFhNTCwgaS5lLiwganVzdCB0aGUgY29udGVudHMgb2YgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUsIGFuZAorICAgICAqIGFuZCB3ZSB3aWxsIHByb2R1Y2UgYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCBhbiA8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzwvY29kZT4gdGFnLgorICAgICAqIFRoZSBYbWxPcHRpb25zLnNldFNhdmVPdXRlcigpIG9wdGlvbiBvbiB4bWxUZXh0IGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UKKyAgICAgKiB0aGUgYWN0dWFsIGVsZW1lbnQgbmFtZSBhYm92ZSB0aGUgb2JqZWN0IGlmIHlvdSB3aXNoLgorICAgICAqLworICAgIFN0cmluZyB0b1N0cmluZygpOworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gaW1tdXRhYmxlIHZhbHVlLiBJbW11dGFibGUgdmFsdWVzIGRvIG5vdAorICAgICAqIGhhdmUgYSBwb3NpdGlvbiBpbiBhIHRyZWU7IHJhdGhlciwgdGhleSBhcmUgc3RhbmQtYWxvbmUgc2ltcGxlIHR5cGUKKyAgICAgKiB2YWx1ZXMuIElmIHRoZSBvYmplY3QgaXMgaW1tdXRhYmxlLCB0aGUgZXF1YWxzKCkgbWV0aG9kcyB0ZXN0cyBmb3IKKyAgICAgKiB2YWx1ZSBlcXVhbGl0eSwgYW5kIHRoZSBvYmplY3QgY2FuIGJlIHVzZWQgYXMgdGhlIGtleSBmb3IgYSBoYXNoLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbW11dGFibGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUvdHlwZSBvZiB0aGlzIFhtbE9iamVjdCB0byBiZSBhIGNvcHkgb2YgdGhlIHNvdXJjZQorICAgICAqIFhtbE9iamVjdC4gIEJlY2F1c2UgdGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhpcworICAgICAqIHRhcmdldCwgdGhpcyBYbWxPYmplY3QgbWF5IGJlY29tZSBkZWZ1bmN0LiAgSW4gdGhpcyBjYXNlIHRoZSBuZXcKKyAgICAgKiBYbWxPYmplY3QgaXMgcmV0dXJuZWQuICBJZiBubyB0eXBlIGNoYW5nZSBoYXBwZW5zLCB0aGUgc2FtZSB0aGlzIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBYbWxPYmplY3Qgc2V0KFhtbE9iamVjdCBzcmNPYmopOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhpcyBYbWxPYmplY3QuICBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyB0aGUKKyAgICAgKiBzYW1lIHR5cGUgYXMgdGhlIGN1cnJlbnQgb2JqZWN0LCBhbmQgaGFzIGFsbCB0aGUgY29udGVudCBvZgorICAgICAqIHRoZSBYTUwgZG9jdW1lbnQgdW5kZXJuZWF0aCB0aGUgY3VycmVudCBvYmplY3QuICBOb3RlIHRoYXQKKyAgICAgKiBhbnkgcGFydHMgb2YgdGhlIFhNTCBkb2N1bWVudCBhYm92ZSBvciBvdXRzaWRlIHRoaXMgWG1sT2JqZWN0IGFyZQorICAgICAqIG5vdCBjb3BpZWQuCisgICAgICovCisgICAgWG1sT2JqZWN0IGNvcHkoKTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIHhtbCB2YWx1ZXMgYXJlIGVxdWFsLiBUd28gZGlmZmVyZW50IG9iamVjdHMKKyAgICAgKiAod2hpY2ggYXJlIGRpc3Rpbmd1aXNoZWQgYnkgZXF1YWxzKG9iaikgPT0gZmFsc2UpIG1heSBvZgorICAgICAqIGNvdXJzZSBoYXZlIGVxdWFsIHZhbHVlcyAodmFsdWVFcXVhbHMob2JqKSA9PSB0cnVlKS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc3VhbGx5IHRoaXMgbWV0aG9kIGNhbiBiZSB0cmVhdGVkIGFzIGFuIG9yZGluYXJ5IGVxdXZhbGVuY2UKKyAgICAgKiByZWxhdGlvbiwgYnV0IGFjdHVhbGx5IGl0IGlzIG5vdCBpcyBub3QgdHJhbnNpdGl2ZS4KKyAgICAgKiBIZXJlIGlzIGEgcHJlY2lzZSBzcGVjaWZpY2F0aW9uOgorICAgICAqIDxwPgorICAgICAqIFRoZXJlIGFyZSB0d28gY2F0ZWdvcmllcyBvZiBYTUwgb2JqZWN0OiBvYmplY3RzIHdpdGggYSBrbm93bgorICAgICAqIGluc3RhbmNlIHR5cGUsIGFuZCBvYmplY3RzIHdob3NlIG9ubHkga25vd24gdHlwZSBpcyBvbmUgb2YgdGhlCisgICAgICogdXItdHlwZXMgKGVpdGhlciBBbnlUeXBlIG9yIEFueVNpbXBsZVR5cGUpLiBUaGUgZmlyc3QgY2F0ZWdvcnkKKyAgICAgKiBpcyBjb21wYXJlZCBpbiB0ZXJtcyBvZiBsb2dpY2FsIHZhbHVlIHNwYWNlcywgYW5kIHRoZSBzZWNvbmQKKyAgICAgKiBjYXRlZ29yeSBpcyBjb21wYXJlZCBsZXhpY2FsbHkuCisgICAgICogPHA+CisgICAgICogV2l0aGluIGVhY2ggb2YgdGhlc2UgdHdvIGNhdGVnb3JpZXMsIHZhbHVlRXF1YWxzIGlzIGEgd2VsbC1iZWhhdmVkCisgICAgICogZXF1aXZhbGVuY2UgcmVsYXRpb24uIEhvd2V2ZXIsIHdoZW4gY29tcGFyaW5nIGFuIG9iamVjdCBvZiBrbm93bgorICAgICAqIHR5cGUgd2l0aCBhbiBvYmplY3Qgd2l0aCB1ci10eXBlLCB0aGUgY29tcGFyaXNvbiBpcyBkb25lIGJ5IGF0dGVtcHRpbmcKKyAgICAgKiB0byBjb252ZXJ0IHRoZSBsZXhpY2FsIGZvcm0gb2YgdGhlIHVyLXR5cGVkIG9iamVjdCBpbnRvIHRoZSBvdGhlcgorICAgICAqIHR5cGUsIGFuZCB0aGVuIGNvbXBhcmluZyB0aGUgcmVzdWx0cy4gVXItdHlwZWQgb2JqZWN0cyBhcmUgdGhlcmVmb3JlCisgICAgICogdHJlYXRlZCBhcyBsZXhpY2FsIHdpbGRjYXJkcyBhbmQgbWF5IGJlIGVxdWFsIHRvIG9iamVjdHMgaW4gZGlmZmVyZW50CisgICAgICogdmFsdWUgc3BhY2VzLCBldmVuIHRob3VnaCB0aGUgb2JqZWN0cyBpbiBkaWZmZXJlbnQgdmFsdWUgc3BhY2VzIGFyZQorICAgICAqIG5vdCBlcXVhbCB0byBlYWNoIG90aGVyLgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgYW55U2ltcGxlVHlwZSB2YWx1ZSAiMSIgd2lsbCBjb21wYXJlIGFzIGFuCisgICAgICogZXF1YWxWYWx1ZSB0byB0aGUgc3RyaW5nICIxIiwgdGhlIGZsb2F0IHZhbHVlICIxLjAiLCB0aGUgZG91YmxlCisgICAgICogdmFsdWUgIjEuMCIsIHRoZSBkZWNpbWFsICIxIiwgYW5kIHRoZSBHWWVhciAiMSIsIGV2ZW4gdGhvdWdoCisgICAgICogYWxsIHRoZXNlIG9iamVjdHMgd2lsbCBjb21wYXJlIHVuZXF1YWwgdG8gZWFjaCBvdGhlciBzaW5jZSB0aGV5CisgICAgICogbGllIGluIGRpZmZlcmVudCB2YWx1ZSBzcGFjZXMuCisgICAgICovCisgICAgYm9vbGVhbiB2YWx1ZUVxdWFscyhYbWxPYmplY3Qgb2JqKTsKKworICAgIGludCB2YWx1ZUhhc2hDb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbXBlbGVtZW50cyB0aGUgQ29tcGFyYWJsZSBpbnRlcmZhY2UgYnkgY29tcGFyaW5nIHR3byBzaW1wbGUKKyAgICAgKiB4bWwgdmFsdWVzIGJhc2VkIG9uIHRoZWlyIHN0YW5kYXJkIFhNTCBzY2hlbWEgb3JkZXJpbmcuCisgICAgICogVGhyb3dzIGEgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIG5vIHN0YW5kYXJkIG9yZGVyaW5nIGFwcGxpZXMsCisgICAgICogb3IgaWYgdGhlIHR3byB2YWx1ZXMgYXJlIGluY29tcGFyYWJsZSB3aXRoaW4gYSBwYXJ0aWFsIG9yZGVyLgorICAgICAqLworICAgIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbXBhcmlzb24gbWV0aG9kIGlzIHNpbWlsYXIgdG8gY29tcGFyZVRvLCBidXQgcmF0aGVyCisgICAgICogdGhhbiB0aHJvd2luZyBhIENsYXNzQ2FzdEV4Y2VwdGlvbiB3aGVuIHR3byB2YWx1ZXMgYXJlIGluY29tcGFyYWJsZSwKKyAgICAgKiBpdCByZXR1cm5zIHRoZSBudW1iZXIgMi4gVGhlIHJlc3VsdCBjb2RlcyBhcmUgLTEgaWYgdGhpcyBvYmplY3QKKyAgICAgKiBpcyBsZXNzIHRoYW4gb2JqLCAxIGlmIHRoaXMgb2JqZWN0IGlzIGdyZWF0ZXIgdGhhbiBvYmosIHplcm8gaWYKKyAgICAgKiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwsIGFuZCAyIGlmIHRoZSBvYmplY3RzIGFyZSBpbmNvbXBhcmFibGUuCisgICAgICovCisgICAgaW50IGNvbXBhcmVWYWx1ZShYbWxPYmplY3Qgb2JqKTsKKyAgICAKKyAgICAvKiogTEVTU19USEFOIGlzIC0xLiBTZWUge0BsaW5rICNjb21wYXJlVmFsdWV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEVTU19USEFOID0gLTE7CisgICAgLyoqIEVRVUFMIGlzIDAuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBFUVVBTCA9IDA7CisgICAgLyoqIEdSRUFURVJfVEhBTiBpcyAxLiBTZWUge0BsaW5rICNjb21wYXJlVmFsdWV9LiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgR1JFQVRFUl9USEFOID0gMTsKKyAgICAvKiogTk9UX0VRVUFMIGlzIDIuIFNlZSB7QGxpbmsgI2NvbXBhcmVWYWx1ZX0uICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT1RfRVFVQUwgPSAyOworCisgICAgLyoqCisgICAgICogU3RhdGljIGZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXMuICBOb3RlIHRoYXQgaWYKKyAgICAgKiBhIHR5cGUgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIFhNTCBiZWluZyBsb2FkZWQgKGZvciBleGFtcGxlLAorICAgICAqIGJ5IHJlY29nbml6aW5nIHRoZSBkb2N1bWVudCBlbGVtZW50IFFOYW1lKSwgdGhlbiB0aGUgaW5zdGFuY2UKKyAgICAgKiByZXR1cm5lZCBieSBhIGZhY3Rvcnkgd2lsbCBoYXZlIHRoZSBpbmZlcnJlZCB0eXBlLiAgT3RoZXJ3aXNlCisgICAgICogdGhlIEZhY3Rvcnkgd2lsbCByZXR1cm5lZCBhbiB1bnR5cGVkIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcsIGNvbXBsZXRlbHkgZW1wdHkgaW5zdGFuY2UuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCApIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggbnVsbCwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldywgY29tcGxldGVseSBlbXB0eSBpbnN0YW5jZSwgc3BlY2lmeWluZyBvcHRpb25zCisgICAgICAgICAqIGZvciB0aGUgcm9vdCBlbGVtZW50J3MgZG9jdW1lbnQgdHlwZSBhbmQvb3Igd2hldGhlciB0byB2YWxpZGF0ZQorICAgICAgICAgKiB2YWx1ZSBmYWNldHMgYXMgdGhleSBhcmUgc2V0LjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIFVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIDx0YWJsZT4KKyAgICAgICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UaGUgZG9jdW1lbnQgdHlwZSBmb3IgdGhlIHJvb3QgZWxlbWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZX08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+V2hldGhlciB2YWx1ZSBmYWNldHMgc2hvdWxkIGJlIGNoZWNrZWQgYXMgdGhleSBhcmUgc2V0LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0VmFsaWRhdGVPblNldH08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8L3RhYmxlPiAKKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3BlY2lmeWluZyByb290IGRvY3VtZW50IHR5cGUgYW5kL29yIHZhbHVlIGZhY2V0IAorICAgICAgICAgKiBjaGVja2luZy4KKyAgICAgICAgICogQHJldHVybiBBIG5ldywgZW1wdHkgaW5zdGFuY2Ugb2YgWG1sT2JqZWN0LjwvbGk+CisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgbmV3SW5zdGFuY2UgKCBYbWxPcHRpb25zIG9wdGlvbnMgKSB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIG51bGwsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW1tdXRhYmxlIHZhbHVlLgorICAgICAgICAgKi8gCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sT2JqZWN0fSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBuZXdWYWx1ZSAoIE9iamVjdCBvYmogKSB7CisgICAgICAgICAgcmV0dXJuIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgU3RyaW5nfSBhcyBYTUwuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBTdHJpbmcgcyApIHRocm93cyBYbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCBudWxsLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBTdHJpbmd9IGFzIFhNTC4KKyAgICAgICAgICogCisgICAgICAgICAqIFVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIDx0YWJsZT4KKyAgICAgICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UaGUgZG9jdW1lbnQgdHlwZSBmb3IgdGhlIHJvb3QgZWxlbWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldERvY3VtZW50VHlwZX08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+VG8gcGxhY2UgbGluZSBudW1iZXIgYW5ub3RhdGlvbnMgaW4gdGhlIHN0b3JlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzfTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UbyByZXBsYWNlIHRoZSBkb2N1bWVudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBRTmFtZSB3aGVuIHBhcnNpbmcuPC90ZD4KKyAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkUmVwbGFjZURvY3VtZW50RWxlbWVudH08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+VG8gc3RyaXAgYWxsIGluc2lnbmlmaWNhbnQgd2hpdGVzcGFjZSB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFdoaXRlc3BhY2V9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPlRvIHN0cmlwIGFsbCBjb21tZW50cyB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcENvbW1lbnRzfTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UbyBzdHJpcCBhbGwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3RyaXBQcm9jaW5zdHN9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPkEgbWFwIG9mIG5hbWVzcGFjZSBVUkkgc3Vic3RpdHV0aW9ucyB0byB1c2Ugd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXN9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPkFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIGJlIGFkZGVkIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzfTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UbyB0cmltIHRoZSB1bmRlcmx5aW5nIFhNTCB0ZXh0IGJ1ZmZlciBpbW1lZGlhdGVseSBhZnRlciBwYXJzaW5nIAorICAgICAgICAgKiAgYSBkb2N1bWVudCwgcmVzdWx0aW5nIGluIGEgc21hbGxlciBtZW1vcnkgZm9vdHByaW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFRyaW1UZXh0QnVmZmVyfTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDwvdGFibGU+IAorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBhcyBzcGVjaWZpZWQuCisgICAgICAgICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2UgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIFhNTC4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFN0cmluZyBzLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgbnVsbCwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0gYXMgWE1MLgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggRmlsZSBmICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCBudWxsLCBudWxsICk7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgRmlsZX0gYXMgWE1MLgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggRmlsZSBmLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIG51bGwsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERvd25sb2FkcyB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubmV0LlVSTH0gYXMgWE1MLgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCBudWxsLCBudWxsICk7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRG93bmxvYWRzIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5uZXQuVVJMfSBhcyBYTUwuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCBudWxsLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVjb2RlcyBhbmQgcGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgSW5wdXRTdHJlYW19IGFzIFhNTC4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIElucHV0U3RyZWFtIGlzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgbnVsbCwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogRGVjb2RlcyBhbmQgcGFyc2VzIHRoZSBnaXZlbiB7QGxpbmsgSW5wdXRTdHJlYW19IGFzIFhNTC4KKyAgICAgICAgICogCisgICAgICAgICAqIFVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIDx0YWJsZT4KKyAgICAgICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSB3aGVuIHBhcnNpbmcgb3Igd3JpdGluZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPlRoZSBkb2N1bWVudCB0eXBlIGZvciB0aGUgcm9vdCBlbGVtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0RG9jdW1lbnRUeXBlfTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5QbGFjZSBsaW5lIG51bWJlciBhbm5vdGF0aW9ucyBpbiB0aGUgc3RvcmUgd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkTGluZU51bWJlcnN9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPlJlcGxhY2UgdGhlIGRvY3VtZW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIFFOYW1lIHdoZW4gcGFyc2luZy48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRSZXBsYWNlRG9jdW1lbnRFbGVtZW50fTwvdGQ+CisgICAgICAgICAqIDwvdHI+CisgICAgICAgICAqIDx0cj4KKyAgICAgICAgICogIDx0ZD5TdHJpcCBhbGwgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwV2hpdGVzcGFjZX08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+U3RyaXAgYWxsIGNvbW1lbnRzIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LjwvdGQ+CisgICAgICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0TG9hZFN0cmlwQ29tbWVudHN9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPlN0cmlwIGFsbCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRTdHJpcFByb2NpbnN0c308L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+U2V0IGEgbWFwIG9mIG5hbWVzcGFjZSBVUkkgc3Vic3RpdHV0aW9ucyB0byB1c2Ugd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuPC90ZD4KKyAgICAgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXN9PC90ZD4KKyAgICAgICAgICogPC90cj4KKyAgICAgICAgICogPHRyPgorICAgICAgICAgKiAgPHRkPlNldCBhZGRpdGlvbmFsIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBiZSBhZGRlZCB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlc308L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8dHI+CisgICAgICAgICAqICA8dGQ+VHJpbSB0aGUgdW5kZXJseWluZyBYTUwgdGV4dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgcGFyc2luZyAKKyAgICAgICAgICogIGEgZG9jdW1lbnQsIHJlc3VsdGluZyBpbiBhIHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludC48L3RkPgorICAgICAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldExvYWRUcmltVGV4dEJ1ZmZlcn08L3RkPgorICAgICAgICAgKiA8L3RyPgorICAgICAgICAgKiA8L3RhYmxlPiAKKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIElucHV0U3RyZWFtIGlzLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCBudWxsLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBSZWFkZXJ9IGFzIFhNTC4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFJlYWRlciByICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCBudWxsLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHtAbGluayBSZWFkZXJ9IGFzIFhNTC4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdCBwYXJzZSAoIFJlYWRlciByLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIG51bGwsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBET00ge0BsaW5rIE5vZGV9IGludG8gYW4gWG1sT2JqZWN0LgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggTm9kZSBub2RlICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIG51bGwsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBET00ge0BsaW5rIE5vZGV9IGludG8gYW4gWG1sT2JqZWN0LgorICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggTm9kZSBub2RlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgbnVsbCwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGdpdmVuIHtAbGluayBYTUxJbnB1dFN0cmVhbX0gaW50byBhbiBYbWxPYmplY3QuCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MworICAgICAgICAgKi8gCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IHBhcnNlICggWE1MSW5wdXRTdHJlYW0geGlzICkgdGhyb3dzIFhtbEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCBudWxsLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4ge0BsaW5rIFhNTElucHV0U3RyZWFtfSBpbnRvIGFuIFhtbE9iamVjdC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3QgcGFyc2UgKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgbnVsbCwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4ge0BsaW5rIFhtbFNheEhhbmRsZXJ9IHRoYXQgY2FuIGxvYWQgYW4gWG1sT2JqZWN0IGZyb20gU0FYIGV2ZW50cy4KKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNheEhhbmRsZXIgbmV3WG1sU2F4SGFuZGxlciAoICkgeworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1htbFNheEhhbmRsZXIoIG51bGwsIG51bGwgKTsgfQorICAgICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBYbWxTYXhIYW5kbGVyfSB0aGF0IGNhbiBsb2FkIGFuIFhtbE9iamVjdCBmcm9tIFNBWCBldmVudHMuCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTYXhIYW5kbGVyIG5ld1htbFNheEhhbmRsZXIgKCBYbWxPcHRpb25zIG9wdGlvbnMgKSB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3WG1sU2F4SGFuZGxlciggbnVsbCwgb3B0aW9ucyApOyB9CisgICAgICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBuZXcgdmFsaWRhdGluZyB7QGxpbmsgWE1MSW5wdXRTdHJlYW19IHRoYXQgdGhyb3dzIGV4Y2VwdGlvbnMgd2hlbiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMKKyAgICAgICAgICovIAorICAgICAgICBwdWJsaWMgc3RhdGljIFhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSAoIFhNTElucHV0U3RyZWFtIHhpcyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIG51bGwsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBuZXcgdmFsaWRhdGluZyB7QGxpbmsgWE1MSW5wdXRTdHJlYW19IHRoYXQgdGhyb3dzIGV4Y2VwdGlvbnMgCisgICAgICAgICAqIHdoZW4gdGhlIGlucHV0IGlzIG5vdCB2YWxpZCwgc3BlY2lmeWluZyBvcHRpb25zCisgICAgICAgICAqIGZvciB0aGUgcm9vdCBlbGVtZW50J3MgZG9jdW1lbnQgdHlwZSBhbmQvb3IgdGhlIGNvbGxlY3Rpb24gb2JqZWN0IHRvIHVzZQorICAgICAgICAgKiBhcyBhbiBlcnJvciBsaXN0ZW5lciB3aGlsZSB2YWxpZGF0aW5nLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIDxwPlVzZSB0aGUgPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPkEgY29sbGVjdGlvbiBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGVycm9yIGxpc3RlbmVyIGR1cmluZworICAgICAgICAgKiBjb21waWxhdGlvbiwgYXMgZGVzY3JpYmVkIGluIHtAbGluayBYbWxPcHRpb25zI3NldEVycm9yTGlzdGVuZXJ9LjwvbGk+CisgICAgICAgICAqIDxsaT5UaGUgZG9jdW1lbnQgdHlwZSBmb3IgdGhlIHJvb3QgZWxlbWVudCwgYXMgZGVzY3JpYmVkIGluIAorICAgICAgICAgKiB7QGxpbmsgWG1sT3B0aW9ucyNzZXREb2N1bWVudFR5cGUoU2NoZW1hVHlwZSl9LjwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0geGlzIFRoZSBiYXNpcyBmb3IgdGhlIG5ldyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzcGVjaWZ5aW5nIHJvb3QgZG9jdW1lbnQgdHlwZSBhbmQvb3IgYW4gZXJyb3IgbGlzdGVuZXIuCisgICAgICAgICAqIEByZXR1cm4gQSBuZXcgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCisgICAgICAgICAqLyAKKyAgICAgICAgcHVibGljIHN0YXRpYyBYTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBYbWxFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIG51bGwsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluc3RhbmNlcyBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgICAgICovIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sT3B0aW9ucy5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmYxOTIwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbE9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDY3NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFVzZWQgdG8gc3VwcGx5IG9wdGlvbnMgZm9yIGxvYWRpbmcsIHNhdmluZywgYW5kIGNvbXBpbGluZywgYW5kIHZhbGlkYXRpbmcuCisgKiA8cD4KKyAqIFRoZXJlIGFyZSB0d28gc3R5bGVzIGZvciB1c2luZyBYbWxPcHRpb25zOiBtdWx0aWxpbmUgc2V0dXAsIGFuZCBzaW5nbGUtbGluZSB1c2UuCisgKiBIZXJlIGFyZSB0d28gZXhhbXBsZXMuICBGaXJzdCwgbXVsdGlsaW5lIHN0eWxlOgorICogPHByZT4KKyAqIFhtbE9wdGlvbnMgb3B0cyA9IG5ldyBYbWxPcHRpb25zKCk7CisgKiBvcHRzLnNldFNhdmVQcmV0dHlQcmludCgpOworICogb3B0cy5zZXRTYXZlUHJldHR5UHJpbnRJbmRlbnQoNCk7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oeG9iai54bWxUZXh0KG9wdHMpKTsKKyAqIDwvcHJlPgorICogCisgKiBUaGUgYWx0ZXJuYXRpdmUgaXMgc2luZ2xlLWxpbmUgdXNhZ2U6CisgKiA8cHJlPgorICogU3lzdGVtLm91dC5wcmludGxuKHhvYmoueG1sVGV4dCgKKyAqICAgICBuZXcgWG1sT3B0aW9ucygpLnNldFNhdmVQcmV0dHlQcmludCgpLnNldFNhdmVQcmV0dHlQcmludEluZGVudCg0KSkpOworICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBYbWxPcHRpb25zIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICBwcml2YXRlIE1hcCBfbWFwID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGJsYW5rIFhtbE9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgKCApIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFhtbE9wdGlvbnMsIGNvcHlpbmcgdGhlIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgKFhtbE9wdGlvbnMgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyICE9IG51bGwpIF9tYXAucHV0QWxsKG90aGVyLl9tYXApOworICAgIH0KKyAgICAgICAgICAgIAorICAgIC8vCisgICAgLy8gSGFuZHktZGFuZHkgaGVscGVyIG1ldGhvZHMgZm9yIHNldHRpbmcgc29tZSBvcHRpb25zCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIHNhdmVyIHRvIHNhdmUgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgZmlyc3QuCisgICAgICogCisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlTmFtZXNwYWNlc0ZpcnN0KCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggU0FWRV9OQU1FU1BBQ0VTX0ZJUlNUICk7IAorICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiB3aWxsIGNhdXNlIHRoZSBzYXZlciB0byByZWZvcm1hdCB3aGl0ZSBzcGFjZSBmb3IgZWFzaWVyIHJlYWRpbmcuCisgICAgICogCisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlUHJldHR5UHJpbnQoKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1BSRVRUWV9QUklOVCApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHVzZWQgd2l0aCA8Y29kZT5zZXRTYXZlUHJldHR5UHJpbnQ8L2NvZGU+IHRoaXMgc2V0cyB0aGUgaW5kZW50CisgICAgICogYW1vdW50IHRvIHVzZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnQgYW1vdW50IHRvIHVzZQorICAgICAqIEBzZWUgI3NldFNhdmVQcmV0dHlQcmludAorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2Ujc2F2ZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSN4bWxUZXh0KFhtbE9wdGlvbnMpCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZVByZXR0eVByaW50SW5kZW50KGludCBpbmRlbnQpIHsgCisgICAgICAgIHJldHVybiBzZXQoIFNBVkVfUFJFVFRZX1BSSU5UX0lOREVOVCwgaW5kZW50ICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gdXNlZCB3aXRoIDxjb2RlPnNldFNhdmVQcmV0dHlQcmludDwvY29kZT4gdGhpcyBzZXRzIHRoZSBvZmZzZXQKKyAgICAgKiBhbW91bnQgdG8gdXNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBhbW91bnQgdG8gdXNlCisgICAgICogQHNlZSAjc2V0U2F2ZVByZXR0eVByaW50CisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlUHJldHR5UHJpbnRPZmZzZXQoaW50IG9mZnNldCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggU0FWRV9QUkVUVFlfUFJJTlRfT0ZGU0VULCBvZmZzZXQgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBwYXJzaW5nIG9yIHdyaXRpbmcgYSBkb2N1bWVudCwgdGhpcyBzZXRzIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBlbmNvZGluZyB0byB1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeyAKKyAgICAgICAgcmV0dXJuIHNldCggQ0hBUkFDVEVSX0VOQ09ESU5HLCBlbmNvZGluZyApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHBhcnNpbmcgYSBkb2N1bWVudCwgdGhpcyBzZXRzIHRoZSB0eXBlIG9mIHRoZSByb290CisgICAgICogZWxlbWVudC4gSWYgdGhpcyBpcyBzZXQsIHRoZSBwYXJzZXIgd2lsbCBub3QgdHJ5IHRvIGd1ZXNzCisgICAgICogdGhlIHR5cGUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgPGNvZGU+UU5hbWU8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlIFRoZSByb290IGVsZW1lbnQncyBkb2N1bWVudCB0eXBlLgorICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldERvY3VtZW50VHlwZShTY2hlbWFUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHNldCggRE9DVU1FTlRfVFlQRSwgdHlwZSApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5TZXRzIGEgY29sbGVjdGlvbiBvYmplY3QgZm9yIGNvbGxlY3Rpbmcge0BsaW5rIFhtbEVycm9yfSBvYmplY3RzIAorICAgICAqIGR1cmluZyBwYXJzaW5nLCB2YWxpZGF0aW9uLCBhbmQgY29tcGlsYXRpb24uIFdoZW4gc2V0LCB0aGUgY29sbGVjdGlvbiAKKyAgICAgKiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBlcnJvcnMgYWZ0ZXIgdGhlIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4gIE5vdGljZSB0aGF0CisgICAgICogdGhlIGVycm9ycyB3aWxsIG9ubHkgaGF2ZSBsaW5lIG51bWJlcnMgaWYgdGhlIGRvY3VtZW50IHdhcworICAgICAqIGxvYWRlZCB3aXRoIGxpbmUgbnVtYmVycyBlbmFibGVkLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9sbG93aW5nIHNpbXBsZSBleGFtcGxlIGlsbHVzdHJhdGVzIHVzaW5nIGFuIGVycm9yIGxpc3RlbmVyCisgICAgICogZHVyaW5nIHZhbGlkYXRpb24uPC9wPgorICAgICAqIAorICAgICAqIDxwcmU+CisgICAgICogLy8gQ3JlYXRlIGFuIFhtbE9wdGlvbnMgaW5zdGFuY2UgYW5kIHNldCB0aGUgZXJyb3IgbGlzdGVuZXIuCisgICAgICogWG1sT3B0aW9ucyB2YWxpZGF0ZU9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAqIEFycmF5TGlzdCBlcnJvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICogdmFsaWRhdGVPcHRpb25zLnNldEVycm9yTGlzdGVuZXIoZXJyb3JMaXN0KTsKKyAgICAgKiAKKyAgICAgKiAvLyBWYWxpZGF0ZSB0aGUgWE1MLgorICAgICAqIGJvb2xlYW4gaXNWYWxpZCA9IG5ld0VtcC52YWxpZGF0ZSh2YWxpZGF0ZU9wdGlvbnMpOworICAgICAqIAorICAgICAqIC8vIElmIHRoZSBYTUwgaXNuJ3QgdmFsaWQsIGxvb3AgdGhyb3VnaCB0aGUgbGlzdGVuZXIncyBjb250ZW50cywKKyAgICAgKiAvLyBwcmludGluZyBjb250YWluZWQgbWVzc2FnZXMuCisgICAgICogaWYgKCFpc1ZhbGlkKQorICAgICAqIHsKKyAgICAgKiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXJyb3JMaXN0LnNpemUoKTsgaSsrKQorICAgICAqICAgICAgeworICAgICAqICAgICAgICAgIFhtbEVycm9yIGVycm9yID0gKFhtbEVycm9yKWVycm9yTGlzdC5nZXQoaSk7CisgICAgICogICAgICAgICAgCisgICAgICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOworICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZTogIiArIGVycm9yLmdldE1lc3NhZ2UoKSArICJcbiIpOworICAgICAqICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9jYXRpb24gb2YgaW52YWxpZCBYTUw6ICIgKyAKKyAgICAgKiAgICAgICAgICAgICAgZXJyb3IuZ2V0Q3Vyc29yTG9jYXRpb24oKS54bWxUZXh0KCkgKyAiXG4iKTsKKyAgICAgKiAgICAgIH0KKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogQHBhcmFtIGMgQSBjb2xsZWN0aW9uIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMgCisgICAgICogdmlhIHtAbGluayBDb2xsZWN0aW9uI2FkZH0KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbEVycm9yCisgICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCisgICAgICogQHNlZSBYbWxPYmplY3QjdmFsaWRhdGUoWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMjc2V0TG9hZExpbmVOdW1iZXJzCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RXJyb3JMaXN0ZW5lciAoQ29sbGVjdGlvbiBjKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBFUlJPUl9MSVNURU5FUiwgYyApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIHNhdmVyIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG5hbWVzcGFjZSBwcmVmaXggZGVjbGFyYXRpb25zLgorICAgICAqIFRoZSBzYXZlciB3aWxsIGRvIHRoaXMgYnkgcGFzc2luZyBvdmVyIHRoZSBkb2N1bWVudCB0d2ljZSwgZmlyc3QgdG8KKyAgICAgKiBjb2xsZWN0IHRoZSBzZXQgb2YgbmVlZGVkIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIGFuZCB0aGVuIHNlY29uZAorICAgICAqIHRvIGFjdHVhbGx5IHNhdmUgdGhlIGRvY3VtZW50IHdpdGggdGhlIGRlY2xhcmF0aW9ucyBjb2xsZWN0ZWQKKyAgICAgKiBhdCB0aGUgcm9vdC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzKCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gY2F1c2VzIHRoZSBzYXZlciB0byB3cmFwIHRoZSBjdXJyZW50IGZyYWdtZW50IGluCisgICAgICogYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIHRvcCBsZXZlbCBlbGVtZW50CisgICAgICogCisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRTYXZlU3ludGhldGljRG9jdW1lbnRFbGVtZW50IChRTmFtZSBuYW1lKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5ULCBuYW1lICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIHNhdmVyIHdpbGwgdHJ5IHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAqIG5hbWVzcGFjZSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBVUkkuIElmIGl0IGlzIG5vdCBzZXQKKyAgICAgKiB0aGUgc2F2ZXIgd2lsbCBhbHdheXMgY3JlYXRlZCBuYW1lZCBwcmVmaXhlcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFVzZURlZmF1bHROYW1lc3BhY2UgKCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggU0FWRV9VU0VfREVGQVVMVF9OQU1FU1BBQ0UgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgbmFtZXNwYWNlcyBoYXZlIGFscmVhZHkgYmVlbiBkZWNsYXJlZCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUKKyAgICAgKiBmcmFnbWVudCBiZWluZyBzYXZlZCwgdGhpcyBhbGxvd3MgdGhvc2UgbWFwcGluZ3MgdG8gYmUgcGFzc2VkCisgICAgICogZG93biB0byB0aGUgc2F2ZXIsIHNvIHRoZSBwcmVmaXhlcyBhcmUgbm90IHJlLWRlY2xhcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbXBsaWNpdE5hbWVzcGFjZXMgYSBtYXAgb2YgcHJlZml4ZXMgdG8gdXJpcyB0aGF0IGNhbiBiZQorICAgICAqICB1c2VkIGJ5IHRoZSBzYXZlciB3aXRob3V0IGJlaW5nIGRlY2xhcmVkCisgICAgICogCisgICAgICogQHNlZSBYbWxUb2tlblNvdXJjZSNzYXZlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3htbFRleHQoWG1sT3B0aW9ucykKKyAgICAgKi8gCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0U2F2ZUltcGxpY2l0TmFtZXNwYWNlcyAoTWFwIGltcGxpY2l0TmFtZXNwYWNlcykgeyAKKyAgICAgICAgcmV0dXJuIHNldCggU0FWRV9JTVBMSUNJVF9OQU1FU1BBQ0VTLCBpbXBsaWNpdE5hbWVzcGFjZXMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtYXAgb2YgaGludHMgdG8gcGFzcyB0byB0aGUgc2F2ZXIgZm9yIHdoaWNoIHByZWZpeGVzIHRvIHVzZQorICAgICAqIGZvciB3aGljaCBuYW1lc3BhY2UgVVJJLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdWdnZXN0ZWRQcmVmaXhlcyBhIG1hcCBmcm9tIFVSSXMgdG8gcHJlZml4ZXMKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVTdWdnZXN0ZWRQcmVmaXhlcyAoTWFwIHN1Z2dlc3RlZFByZWZpeGVzKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1NVR0dFU1RFRF9QUkVGSVhFUywgc3VnZ2VzdGVkUHJlZml4ZXMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gY2F1c2VzIHRoZSBzYXZlciB0byBmaWx0ZXIgYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uCisgICAgICogd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0CisgICAgICogCisgICAgICogQHBhcmFtIGZpbHRlclByb2NpbnN0IHRoZSBuYW1lIG9mIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiB0byBmaWx0ZXIKKyAgICAgKiAgIG9uIHNhdmUKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVGaWx0ZXJQcm9jaW5zdCAoU3RyaW5nIGZpbHRlclByb2NpbnN0KSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0ZJTFRFUl9QUk9DSU5TVCwgZmlsdGVyUHJvY2luc3QgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBzYXZpbmcgYSBmcmFnbWVudCwgdGhpcyBvcHRpb24gY2hhbmdlcyB0aGUgcW5hbWUgb2YgdGhlIHN5bnRoZXNpemVkCisgICAgICogcm9vdCBlbGVtZW50LiAgTm9ybWFsbHkgJmx0O3htbC1mcmFnbWVudCZndDsgaXMgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVVc2VPcGVuRnJhZyAoKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGNvbnRyb2xzIHdoZXRoZXIgc2F2aW5nIGJlZ2lucyBvbiB0aGUgZWxlbWVudCBvciBpdHMgY29udGVudHMKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVPdXRlciAoKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX09VVEVSICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGNvbnRyb2xzIHdoZXRoZXIgc2F2aW5nIGJlZ2lucyBvbiB0aGUgZWxlbWVudCBvciBpdHMgY29udGVudHMKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbFRva2VuU291cmNlI3NhdmUoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqIEBzZWUgWG1sVG9rZW5Tb3VyY2UjeG1sVGV4dChYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldFNhdmVJbm5lciAoKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBTQVZFX0lOTkVSICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIGRvY3VtZW50IGVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKKyAgICAgKiBnaXZlbiBRTmFtZSB3aGVuIHBhcnNpbmcuICBJZiBudWxsIGlzIHN1cHBsaWVkLCB0aGUgZG9jdW1lbnQgZWxlbWVudAorICAgICAqIGlzIHJlbW92ZWQuCisgICAgICogCisgICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZFJlcGxhY2VEb2N1bWVudEVsZW1lbnQgKCBRTmFtZSByZXBsYWNlbWVudCApIHsgCisgICAgICAgIHJldHVybiBzZXQoIExPQURfUkVQTEFDRV9ET0NVTUVOVF9FTEVNRU5ULCByZXBsYWNlbWVudCApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIGFsbCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQKKyAgICAgKiB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4gIENhbiBiZSB1c2VkIHRvIHNhdmUgbWVtb3J5IG9uIGxhcmdlCisgICAgICogZG9jdW1lbnRzIHdoZW4geW91IGtub3cgdGhlcmUgaXMgbm8gbWl4ZWQgY29udGVudC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkU3RyaXBXaGl0ZXNwYWNlICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIExPQURfU1RSSVBfV0hJVEVTUEFDRSk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIGNvbW1lbnRzIGFyZSBzdHJpcHBlZCB3aGVuIHBhcnNpbmcKKyAgICAgKiBhIGRvY3VtZW50LgorICAgICAqIAorICAgICAqIEBzZWUgWG1sT2JqZWN0LkZhY3RvcnkjcGFyc2UoamF2YS5pby5GaWxlLCBYbWxPcHRpb25zKQorICAgICAqLworICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldExvYWRTdHJpcENvbW1lbnRzKCkgeworICAgICAgICByZXR1cm4gc2V0KCBMT0FEX1NUUklQX0NPTU1FTlRTICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIAorICAgICAqIGFyZSBzdHJpcHBlZCB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkU3RyaXBQcm9jaW5zdHMgKCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggTE9BRF9TVFJJUF9QUk9DSU5TVFMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCBsaW5lIG51bWJlciBhbm5vdGF0aW9ucyBhcmUgcGxhY2VkCisgICAgICogaW4gdGhlIHN0b3JlIHdoZW4gcGFyc2luZyBhIGRvY3VtZW50LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKKyAgICAgKiB1c2VmdWwgd2hlbiB5b3Ugd2FudCB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMgdG8gY29udGFpbgorICAgICAqIGxpbmUgbnVtYmVycy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKiBAc2VlIFhtbEVycm9yCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZExpbmVOdW1iZXJzICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIExPQURfTElORV9OVU1CRVJTICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIHNldHMgYSBtYXAgb2YgbmFtZXNwYWNlIHVyaSBzdWJzdGl0dXRpb25zIHRoYXQgaGFwcGVuCisgICAgICogd2hlbiBwYXJzaW5nIGEgZG9jdW1lbnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHlvdQorICAgICAqIGhhdmUgZG9jdW1lbnRzIHRoYXQgdXNlIG5vIG5hbWVzcGFjZSwgYnV0IHlvdSB3aXNoIHRvIGF2b2lkCisgICAgICogdGhlIG5hbWUgY29sbGlzaW9uIHByb2JsZW1zIHRoYXQgb2NjdXIgd2hlbiB5b3UgaW50cm9kdWNlCisgICAgICogc2NoZW1hIGRlZmluaXRpb25zIHdpdGhvdXQgYSB0YXJnZXQgbmFtZXNwYWNlLgorICAgICAqIDxwPgorICAgICAqIEJ5IG1hcHBpbmcgdGhlIGVtcHR5IHN0cmluZyAiIiAodGhlIGFic2VuY2Ugb2YgYSBVUkkpIHRvIGEgc3BlY2lmaWMKKyAgICAgKiBuYW1lc3BhY2UsIHlvdSBjYW4gZm9yY2UgdGhlIHBhcnNlciB0byBiZWhhdmUgYXMgaWYgYSBuby1uYW1lc3BhY2UKKyAgICAgKiBkb2N1bWVudCB3ZXJlIGFjdHVhbGx5IGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLiBUaGlzIGFsbG93cyB5b3UKKyAgICAgKiB0byB0eXBlIHRoZSBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gYSBzY2hlbWEgaW4gYSBub25lbXB0eSBuYW1lc3BhY2UsCisgICAgICogYW5kIHRoZXJlZm9yZSBhdm9pZCB0aGUgcHJvYmxlbWF0aWMgcHJhY3RpY2Ugb2YgdXNpbmcgc2NoZW1hCisgICAgICogZGVmaW5pdGlvbnMgd2l0aG91dCBhIHRhcmdldCBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHN1YnN0TmFtZXNwYWNlcyBhIG1hcCBvZiBkb2N1bWVudCBVUklzIHRvIHJlcGxhY2VtZW50IFVSSXMKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkU3Vic3RpdHV0ZU5hbWVzcGFjZXMgKE1hcCBzdWJzdE5hbWVzcGFjZXMpIHsgCisgICAgICAgIHJldHVybiBzZXQoIExPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTLCBzdWJzdE5hbWVzcGFjZXMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgdW5kZXJseWluZyB4bWwgdGV4dCBidWZmZXIgaXMgdHJpbW1lZAorICAgICAqIGltbWVkaWF0ZWx5IGFmdGVyIHBhcnNpbmcgYSBkb2N1bWVudCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIG1lbW9yeQorICAgICAqIGZvb3RwcmludC4gIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxvYWRpbmcgYSBsYXJnZSBudW1iZXIKKyAgICAgKiBvZiB1bmNoYW5naW5nIGRvY3VtZW50cyB0aGF0IHdpbGwgc3RheSBpbiBtZW1vcnkgZm9yIHNvbWUgdGltZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRMb2FkVHJpbVRleHRCdWZmZXIgKCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggTE9BRF9UUklNX1RFWFRfQlVGRkVSICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhZGRpdGlvbmFsIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBiZSBhZGRlZCB3aGVuIHBhcnNpbmcKKyAgICAgKiBhIGRvY3VtZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuc2VzIGFkZGl0aW9uYWwgbmFtZXNwYWNlIG1hcHBpbmdzCisgICAgICogCisgICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzIChNYXAgbnNlcykgeyAKKyAgICAgICAgcmV0dXJuIHNldCggTE9BRF9BRERJVElPTkFMX05BTUVTUEFDRVMsIG5zZXMgKTsgCisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHdoZW4gbG9hZGluZyBmcm9tIGFuIElucHV0U3RyZWFtIG9yIEZpbGUsIHRoZW4KKyAgICAgKiB0aGUgbG9hZGVyIHdpbGwgY29tcHV0ZSBhIDE2MC1iaXQgU0hBLTEgbWVzc2FnZSBkaWdlc3Qgb2YgdGhlIFhNTAorICAgICAqIGZpbGUgd2hpbGUgbG9hZGluZyBpdCBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdmlhCisgICAgICogWG1sT2JqZWN0LmRvY3VtZW50UHJvcGVydGllcygpLmdldE1lc3NhZ2VEaWdlc3QoKTsKKyAgICAgKiA8YnI+CisgICAgICogVGhlIHNjaGVtYSBjb21waWxlciB1c2VzIG1lc3NhZ2UgZGlnZXN0cyB0byBkZXRlY3QgYW5kIGVsaW1pbmF0ZQorICAgICAqIGR1cGxpY2F0ZSBpbXBvcnRlZCB4c2QgZmlsZXMuCisgICAgICogCisgICAgICogQHNlZSBYbWxPYmplY3QuRmFjdG9yeSNwYXJzZShqYXZhLmlvLkZpbGUsIFhtbE9wdGlvbnMpCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0TG9hZE1lc3NhZ2VEaWdlc3QgKCkgeyAKKyAgICAgICAgcmV0dXJuIHNldCggTE9BRF9NRVNTQUdFX0RJR0VTVCApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHJlcHJlc2VudHMKKyAgICAgKiB0aGUgY3VycmVudCBub2RlIGluIGEgcXVlcnkgZXhwcmVzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFyTmFtZSBUaGUgbmV3IHZhcmlhYmxlIG5hbWUgdG8gdXNlIGZvciB0aGUgcXVlcnkuCisgICAgICogCisgICAgICogQHNlZSBYbWxPYmplY3QjZXhlY1F1ZXJ5CisgICAgICogQHNlZSBYbWxDdXJzb3IjZXhlY1F1ZXJ5CisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0WHF1ZXJ5Q3VycmVudE5vZGVWYXIgKFN0cmluZyB2YXJOYW1lKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBYUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiwgdmFyTmFtZSApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgZXh0ZXJuYWwgdmFyaWFibGVzIGluIGFuIHhxdWVyeQorICAgICAqIGV4cHJlc3Npb24uICBUaGUga2V5cyBvZiB0aGUgbWFwIGFyZSB0aGUgdmFyaWFibGUgbmFtZXMKKyAgICAgKiBpbiB0aGUgcXVlcnkgd2l0aG91dCB0aGUgJyQnIHByZWZpeC4gIFRoZSB2YWx1ZXMgb2YgdGhlIG1hcAorICAgICAqIGFyZSBvYmplY3RzIGFuZCBjYW4gYmUgYW55IG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBjbGFzc2VzLAorICAgICAqIFN0cmluZywgWG1sT2JqZWN0LCBvciBYbWxDdXJzb3IuIFRoZSBtYXBwaW5nIG9ubHkgYXBwbGllcyB0bworICAgICAqIHhxdWVyeSBhbmQgaGFzIG5vIGVmZmVjdCBvbiB4cGF0aCBleHByZXNzaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXJNYXAgYSBtYXAgZnJvbSA8Y29kZT5TdHJpbmc8L2NvZGU+cyB0byB2YXJpYWJsZSBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAc2VlIFhtbE9iamVjdCNleGVjUXVlcnkKKyAgICAgKiBAc2VlIFhtbEN1cnNvciNleGVjUXVlcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRYcXVlcnlWYXJpYWJsZXMgKE1hcCB2YXJNYXApIHsgCisgICAgICAgIHJldHVybiBzZXQoIFhRVUVSWV9WQVJJQUJMRV9NQVAsIHZhck1hcCApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBzZXRzIHRoZSBkb2N1bWVudCBzb3VyY2UgbmFtZSBpbnRvIHRoZSB4bWwgc3RvcmUKKyAgICAgKiB3aGVuIHBhcnNpbmcgYSBkb2N1bWVudC4gIElmIGEgZG9jdW1lbnQgaXMgcGFyc2VkIGZyb20gYQorICAgICAqIEZpbGUgb3IgVVJJLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgVVJJIG9mIHRoZQorICAgICAqIHNvdXJjZTsgb3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBwYXJzaW5nIGEgU3RyaW5nLAorICAgICAqIHlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHNvdXJjZSBuYW1lIHlvdXJzZWxmLiAKKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEubGFuZy5TdHJpbmcsIFhtbE9wdGlvbnMpCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RG9jdW1lbnRTb3VyY2VOYW1lIChTdHJpbmcgZG9jdW1lbnRTb3VyY2VOYW1lKSB7IAorICAgICAgICByZXR1cm4gc2V0KCBET0NVTUVOVF9TT1VSQ0VfTkFNRSwgZG9jdW1lbnRTb3VyY2VOYW1lICk7IAorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3B0aW9uIGFsbG93cyBmb3IgPGNvZGU+UU5hbWU8L2NvZGU+IHN1YnN0aXR1dGlvbiBkdXJpbmcgc2NoZW1hIGNvbXBpbGF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lTWFwIGEgbWFwIGZyb20gPGNvZGU+UU5hbWU8L2NvZGU+cyB0byBzdWJzdGl0dXRlIDxjb2RlPlFOYW1lPC9jb2RlPnMuCisgICAgICogCisgICAgICogQHNlZSBYbWxCZWFucyNjb21waWxlWHNkCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0Q29tcGlsZVN1YnN0aXR1dGVOYW1lcyAoTWFwIG5hbWVNYXApIHsgCisgICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfU1VCU1RJVFVURV9OQU1FUywgbmFtZU1hcCApOyAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0LCB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIG9uIHRoZSBTY2hlbWEgWG1sQmVhbnMKKyAgICAgKiB3aGVuIGJ1aWxkaW5nIGEgPGNvZGU+U2NoZW1hVHlwZVN5c3RlbTwvY29kZT4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlTm9WYWxpZGF0aW9uICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTk9fVkFMSURBVElPTiApOyAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZSB1bmlxdWUgcGFydGljbGUgYXR0cmlidXRpb24gcnVsZSBpcyBub3QKKyAgICAgKiBlbmZvcmNlZCB3aGVuIGJ1aWxkaW5nIGEgPGNvZGU+U2NoZW1hVHlwZVN5c3RlbTwvY29kZT4uIFNlZQorICAgICAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jbm9uLWFtYmlnIj5BcHBlbmRpeCBIIG9mIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb248L2E+CisgICAgICogZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBVUEEgcnVsZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlTm9VcGFSdWxlICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTk9fVVBBX1JVTEUgKTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlIHBhcnRpY2xlIHZhbGlkIChyZXN0cmljaXRvbikgcnVsZSBpcyBub3QKKyAgICAgKiBlbmZvcmNlZCB3aGVuIGJ1aWxkaW5nIGEgPGNvZGU+U2NoZW1hVHlwZVN5c3RlbTwvY29kZT4uIFNlZQorICAgICAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jY29zLXBhcnRpY2xlLXJlc3RyaWN0Ij5TZWN0aW9uIDMuOS42IG9mIHRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb248L2E+CisgICAgICogZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBQVlIgcnVsZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlTm9QdnJSdWxlICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfTk9fUFZSX1JVTEUgKTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCwgdGhlbiB0aGUgc2NoZW1hIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIGRvd25sb2FkCisgICAgICogc2NoZW1hcyB0aGF0IGFwcGVhciBpbiBpbXBvcnRzIGFuZCBpbmNsdWRlcyBmcm9tIG5ldHdvcmsgYmFzZWQgVVJMcy4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbEJlYW5zI2NvbXBpbGVYc2QKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRDb21waWxlRG93bmxvYWRVcmxzICgpIHsgCisgICAgICAgIHJldHVybiBzZXQoIENPTVBJTEVfRE9XTkxPQURfVVJMUyk7IAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQsIHRoZW4gdGhlIHNjaGVtYSBjb21waWxlciB3aWxsIHBlcm1pdCBhbmQKKyAgICAgKiBpZ25vcmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgY29tcG9uZW50IChlbGVtZW50LCBhdHRyaWJ1dGUsCisgICAgICogdHlwZSwgZXRjKSBuYW1lcyBpbiB0aGUgZ2l2ZW4gbmFtZXNwYWNlcy4gIElmIG11bHRpcGxlIGRlZmluaXRpb25zCisgICAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFwcGVhciwgdGhlIGRlZmluaXRpb25zIHRoYXQgaGFwcGVuIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIGxhc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZGVmTmFtZXNwYWNlcyBhIHNldCBvZiBuYW1lc3BhY2UgVVJJcyBhcyBTdHJpbmdzCisgICAgICogCisgICAgICogQHNlZSBYbWxCZWFucyNjb21waWxlWHNkCisgICAgICovIAorICAgIHB1YmxpYyBYbWxPcHRpb25zIHNldENvbXBpbGVNZGVmTmFtZXNwYWNlcyhTZXQgbWRlZk5hbWVzcGFjZXMpCisgICAgeworICAgICAgICByZXR1cm4gc2V0KCBDT01QSUxFX01ERUZfTkFNRVNQQUNFUywgbWRlZk5hbWVzcGFjZXMgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgd2hlbiBhbiBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0aGVuIHZhbHVlCisgICAgICogZmFjZXRzIHdpbGwgYmUgY2hlY2tlZCBvbiBlYWNoIGNhbGwgdG8gYSBzZXR0ZXIgb3IgZ2V0dGVyCisgICAgICogbWV0aG9kIG9uIGluc3RhbmNlcyBvZiBYbWxPYmplY3Qgd2l0aGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC4KKyAgICAgKiBJZiB0aGUgZmFjZXRzIGFyZSBub3Qgc2F0aXNmaWVkLCB0aGVuIGFuIHVuY2hlY2tlZCBleGNlcHRpb24gaXMKKyAgICAgKiB0aHJvd24gaW1tZWRpYXRlbHkuICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgY29kZSB0aGF0CisgICAgICogaXMgaW50cm9kdWNpbmcgaW52YWxpZCB2YWx1ZXMgaW4gYW4gWE1MIGRvY3VtZW50LCBidXQgaXQKKyAgICAgKiBzbG93cyBwZXJmb3JtYW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I3BhcnNlKGphdmEuaW8uRmlsZSwgWG1sT3B0aW9ucykKKyAgICAgKi8KKyAgICBwdWJsaWMgWG1sT3B0aW9ucyBzZXRWYWxpZGF0ZU9uU2V0KCkgeworICAgICAgICByZXR1cm4gc2V0KCBWQUxJREFURV9PTl9TRVQgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBzZXQgd2hlbiBjb21waWxpbmcgYSBzY2hlbWEsIHRoZW4gdGhlIGdpdmVuCisgICAgICogRW50aXR5UmVzb2x2ZXIgd2lsbCBiZSBjb25zdWx0ZWQgaW4gb3JkZXIgdG8gcmVzb2x2ZSBhbnkKKyAgICAgKiBVUklzIHdoaWxlIGRvd25sb2FkaW5nIGltcG9ydGVkIHNjaGVtYXMuCisgICAgICoKKyAgICAgKiBFbnRpdHlSZXNvbHZlcnMgYXJlIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgY29tcGlsZVhzZDsgdGhleQorICAgICAqIGFyZSBub3QgY29uc3VsdGVkIGJ5IG90aGVyIGZ1bmN0aW9ucywgZm9yIGV4YW1wbGUsIHBhcnNlLgorICAgICAqIFRoaXMgd2lsbCBsaWtlbHkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisgICAgICogCisgICAgICogQHNlZSBYbWxCZWFucyNjb21waWxlWHNkCisgICAgICovCisgICAgcHVibGljIFhtbE9wdGlvbnMgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHNldCggRU5USVRZX1JFU09MVkVSLCByZXNvbHZlciApOworICAgIH0KKworCisgICAgLy8KKyAgICAvLyBDb21wbGV0ZSBzZXQgb2YgWG1sT3B0aW9uJ3MKKyAgICAvLworICAgICAgICAgICAgCisgICAgLy8gVE9ETyAtIEFkZCBzZWxlY3RQYXRoIG9wdGlvbiB0byB0cmFjayB0aGUgc2VsZXRpb24gKGRlYXVsdCBpcyB0byBjbGVhbiBzZWxlY3Rpb25zIGZhc3QpLiAKKyAgICAKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX05BTUVTUEFDRVNfRklSU1QgICAgICAgICAgID0gICJTQVZFX05BTUVTUEFDRVNfRklSU1QiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQgPSAgIlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUFJFVFRZX1BSSU5UICAgICAgICAgICAgICAgPSAgIlNBVkVfUFJFVFRZX1BSSU5UIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BSRVRUWV9QUklOVF9JTkRFTlQgICAgICAgID0gICJTQVZFX1BSRVRUWV9QUklOVF9JTkRFTlQiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUFJFVFRZX1BSSU5UX09GRlNFVCAgICAgICAgPSAgIlNBVkVfUFJFVFRZX1BSSU5UX09GRlNFVCI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMgICAgICA9ICAiU0FWRV9BR0dSRVNTSVZFX05BTUVTUEFDRVMiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICAgICAgPSAgIlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMgICAgICAgID0gICJTQVZFX0lNUExJQ0lUX05BTUVTUEFDRVMiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTICAgICAgICAgPSAgIlNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZJTFRFUl9QUk9DSU5TVCAgICAgICAgICAgID0gICJTQVZFX0ZJTFRFUl9QUk9DSU5TVCI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9VU0VfT1BFTl9GUkFHTUVOVCAgICAgICAgICA9ICAiU0FWRV9VU0VfT1BFTl9GUkFHTUVOVCI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9PVVRFUiAgICAgICAgICAgICAgICAgICAgICA9ICAiU0FWRV9PVVRFUiI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9JTk5FUiAgICAgICAgICAgICAgICAgICAgICA9ICAiU0FWRV9JTk5FUiI7CisgICAgCisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQgICA9ICAiTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfU1RSSVBfV0hJVEVTUEFDRSAgICAgICAgICAgPSAgIkxPQURfU1RSSVBfV0hJVEVTUEFDRSI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9TVFJJUF9DT01NRU5UUyAgICAgICAgICAgICA9ICAiTE9BRF9TVFJJUF9DT01NRU5UUyI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9TVFJJUF9QUk9DSU5TVFMgICAgICAgICAgICA9ICAiTE9BRF9TVFJJUF9QUk9DSU5TVFMiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURfTElORV9OVU1CRVJTICAgICAgICAgICAgICAgPSAgIkxPQURfTElORV9OVU1CRVJTIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX1NVQlNUSVRVVEVfTkFNRVNQQUNFUyAgICAgID0gICJMT0FEX1NVQlNUSVRVVEVfTkFNRVNQQUNFUyI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9UUklNX1RFWFRfQlVGRkVSICAgICAgICAgICA9ICAiTE9BRF9UUklNX1RFWFRfQlVGRkVSIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUyAgICAgID0gICJMT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUyI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9NRVNTQUdFX0RJR0VTVCAgICAgICAgICAgICA9ICAiTE9BRF9NRVNTQUdFX0RJR0VTVCI7CisKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiAgICAgICAgID0gICJYUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFFVRVJZX1ZBUklBQkxFX01BUCAgICAgICAgICAgICA9ICAiWFFVRVJZX1ZBUklBQkxFX01BUCI7CisKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfRU5DT0RJTkcgICAgICAgICAgICAgID0gICJDSEFSQUNURVJfRU5DT0RJTkciOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0xJU1RFTkVSICAgICAgICAgICAgICAgICAgPSAgIkVSUk9SX0xJU1RFTkVSIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFICAgICAgICAgICAgICAgICAgID0gICJET0NVTUVOVF9UWVBFIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9TT1VSQ0VfTkFNRSAgICAgICAgICAgID0gICJET0NVTUVOVF9TT1VSQ0VfTkFNRSI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9TVUJTVElUVVRFX05BTUVTICAgICAgICA9ICAiQ09NUElMRV9TVUJTVElUVVRFX05BTUVTIjsKKyAgICAvKiogQGV4Y2x1ZGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX05PX1ZBTElEQVRJT04gICAgICAgICAgID0gICJDT01QSUxFX05PX1ZBTElEQVRJT04iOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfTk9fVVBBX1JVTEUgICAgICAgICAgICAgPSAgIkNPTVBJTEVfTk9fVVBBX1JVTEUiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfTk9fUFZSX1JVTEUgICAgICAgICAgICAgPSAgIkNPTVBJTEVfTk9fUFZSX1JVTEUiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBJTEVfRE9XTkxPQURfVVJMUyAgICAgICAgICAgPSAgIkNPTVBJTEVfRE9XTkxPQURfVVJMUyI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRV9NREVGX05BTUVTUEFDRVMgICAgICAgICA9ICAiQ09NUElMRV9NREVGX05BTUVTUEFDRVMiOworICAgIC8qKiBAZXhjbHVkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX09OX1NFVCAgICAgICAgICAgICAgICAgPSAgIlZBTElEQVRFX09OX1NFVCI7CisgICAgLyoqIEBleGNsdWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1JFU09MVkVSICAgICAgICAgICAgICAgICA9ICAiRU5USVRZX1JFU09MVkVSIjsKKyAgICAKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhtbE9wdGlvbnMgRU1QVFlfT1BUSU9OUzsKKyAgICBzdGF0aWMgeworICAgICAgICBFTVBUWV9PUFRJT05TID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgRU1QVFlfT1BUSU9OUy5fbWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKEVNUFRZX09QVElPTlMuX21hcCk7CisgICAgfQorCisgICAgLyoqIElmIHBhc3NlZCBudWxsLCByZXR1cm5zIGFuIGVtcHR5IG9wdGlvbnMgb2JqZWN0LiAgT3RoZXJ3aXNlLCByZXR1cm5zIGl0cyBhcmd1bWVudC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFhtbE9wdGlvbnMgbWFza051bGwoWG1sT3B0aW9ucyBvKSB7CisgICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/IEVNUFRZX09QVElPTlMgOiBvOworICAgIH0KKworICAgIAorICAgIC8qKiBVc2VkIHRvIHNldCBhIGdlbmVyaWMgb3B0aW9uICovCisgICAgcHVibGljIHZvaWQgIHB1dCAoIE9iamVjdCBvcHRpb24gICAgICAgICAgICAgICApIHsgcHV0KCBvcHRpb24sIG51bGwgKTsgfQorICAgIC8qKiBVc2VkIHRvIHNldCBhIGdlbmVyaWMgb3B0aW9uICovCisgICAgcHVibGljIHZvaWQgIHB1dCAoIE9iamVjdCBvcHRpb24sIE9iamVjdCB2YWx1ZSApIHsgX21hcC5wdXQob3B0aW9uLCB2YWx1ZSk7IH0KKyAgICAvKiogVXNlZCB0byBzZXQgYSBnZW5lcmljIG9wdGlvbiAqLworICAgIHB1YmxpYyB2b2lkIHB1dCAgKCBPYmplY3Qgb3B0aW9uLCBpbnQgdmFsdWUgICAgKSB7IHB1dCggb3B0aW9uLCBuZXcgSW50ZWdlciggdmFsdWUgKSApOyB9CisKKyAgICBwcml2YXRlIFhtbE9wdGlvbnMgc2V0KE9iamVjdCBvcHRpb24pICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0KG9wdGlvbiwgbnVsbCk7IH0KKyAgICBwcml2YXRlIFhtbE9wdGlvbnMgc2V0KE9iamVjdCBvcHRpb24sIE9iamVjdCB2YWx1ZSkgeyBfbWFwLnB1dChvcHRpb24sIHZhbHVlKTsgcmV0dXJuIHRoaXM7fQorICAgIHByaXZhdGUgWG1sT3B0aW9ucyBzZXQoT2JqZWN0IG9wdGlvbiwgaW50IHZhbHVlKSAgICB7IHJldHVybiBzZXQob3B0aW9uLCBuZXcgSW50ZWdlcih2YWx1ZSkpOyB9CisKKyAgICAvKiogVXNlZCB0byB0ZXN0IGEgZ2VuZXJpYyBvcHRpb24gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb24gICAoIE9iamVjdCBvcHRpb24gKSB7IHJldHVybiBfbWFwLmNvbnRhaW5zS2V5KCBvcHRpb24gKTsgfQorICAgIC8qKiBVc2VkIHRvIGdldCBhIGdlbmVyaWMgb3B0aW9uICovCisgICAgcHVibGljIE9iamVjdCAgZ2V0ICAgICAgICAgKCBPYmplY3Qgb3B0aW9uICkgeyByZXR1cm4gX21hcC5nZXQoIG9wdGlvbiApOyB9CisKKyAgICAvKiogVXNlZCB0byB0ZXN0IGEgZ2VuZXJpYyBvcHRpb24gb24gYW4gb3B0aW9ucyBvYmplY3QgdGhhdCBtYXkgYmUgbnVsbCAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHNhZmVHZXQoWG1sT3B0aW9ucyBvLCBPYmplY3Qgb3B0aW9uKSB7CisgICAgICAgIHJldHVybiBvID09IG51bGwgPyBudWxsIDogby5nZXQob3B0aW9uKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxQb3NpdGl2ZUludGVnZXIuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxQb3NpdGl2ZUludGVnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQxMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFBvc2l0aXZlSW50ZWdlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciI+eHM6cG9zaXRpdmVJbnRlZ2VyPC9hPiB0eXBlLgorICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCisgKiA8cD4KKyAqIFZlcmlmaWVkIHRvIGJlIHBvc2l0aXZlIHdoZW4gdmFsaWRhdGluZy4KKyAqIDxwPgorICogQ29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sUG9zaXRpdmVJbnRlZ2VyIGV4dGVuZHMgWG1sTm9uTmVnYXRpdmVJbnRlZ2VyCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfcG9zaXRpdmVJbnRlZ2VyIik7CisgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3ODkwJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OTAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBmLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgbnVsbCApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggdSwgdHlwZSwgb3B0aW9ucyApOyB9CisKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxQb3NpdGl2ZUludGVnZXJ9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFBvc2l0aXZlSW50ZWdlcn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFBvc2l0aXZlSW50ZWdlciBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUG9zaXRpdmVJbnRlZ2VyKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFBvc2l0aXZlSW50ZWdlcikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUG9zaXRpdmVJbnRlZ2VyfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxQb3NpdGl2ZUludGVnZXIgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxQb3NpdGl2ZUludGVnZXIpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUmV0dXJucyBhIHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSBuZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0ob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeyB9IC8vIE5vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYWxsb3dlZAorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUU5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGFhZGNiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFFOYW1lLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisKKy8qKgorICogQ29ycmVzcG9uZHMgdG8gdGhlIFhNTCBTY2hlbWEKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiPnhzOlFOYW1lPC9hPiB0eXBlLgorICogPHA+CisgKiBBIFFOYW1lIGlzIHRoZSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFuIFhNTCBuYW1lc3BhY2UgVVJJIGFuZCBhIGxvY2FsTmFtZS4KKyAqIEFsdGhvdWdoIGluIGFuIFhNTCBpbnN0YW5jZSBkb2N1bWVudCwgYSBRTmFtZSBhcHBlYXJzIGFzICJwcmVmaXg6bG9jYWxOYW1lIiwKKyAqIHRoZSBsb2dpY2FsIHZhbHVlIG9mIGEgUU5hbWUgZG9lcyBOT1QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBwcmVmaXgsIG9ubHkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gd2hpY2ggdGhlIHByZWZpeCBtYXBzLiAgRm9yIGV4YW1wbGUsCisgKiB0d28gUU5hbWVzICJhOmhlbGxvIiBhbmQgImI6aGVsbG8iIGFyZSBwZXJmZWN0bHkgZXF1aXZhbGVudCBpZiAiYToiIGluCisgKiB0aGUgZmlyc3QgaW5zdGFuY2UgbWFwcyB0byB0aGUgc2FtZSBVUkkgYXMgImI6IiBpbiB0aGUgc2Vjb25kIGluc3RhbmNlLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZX0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbFFOYW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX1FOYW1lIik7CisgICAgCisgICAgLyoqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KKyAgICBRTmFtZSBnZXRRTmFtZVZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHtAbGluayBRTmFtZX0gKi8KKyAgICB2b2lkIHNldFFOYW1lVmFsdWUoUU5hbWUgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFFOYW1lVmFsdWV9CisgICAgICoqLworICAgIFFOYW1lIHFOYW1lVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgUU5hbWV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFFOYW1lVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KFFOYW1lIG5hbWUpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sUU5hbWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFFOYW1lfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFFOYW1lfSB2YWx1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50IHhtbG5zOng9Imh0dHA6Ly9vcGVudXJpLm9yZy8iJmd0O3g6c2FtcGxlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFFOYW1lfSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFFOYW1lIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sUU5hbWV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxRTmFtZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sUU5hbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFFOYW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxRTmFtZX0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sUU5hbWUgcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxRTmFtZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2FmNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFJ1bnRpbWVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFuIHVuY2hlY2tlZCBYTUwgZXhjZXB0aW9uLgorICogTWF5IGNvbnRhaW4gYW55IG51bWJlciBvZiB7QGxpbmsgWG1sRXJyb3J9IG9iamVjdHMuCisgKiAKKyAqIEBzZWUgWG1sRXJyb3IKKyAqIEBzZWUgWG1sRXhjZXB0aW9uCisgKi8gCitwdWJsaWMgY2xhc3MgWG1sUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFhtbFJ1bnRpbWVFeGNlcHRpb24gZnJvbSBhIG1lc3NhZ2UuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0gICAgICAgICAgICAgICkgeyBzdXBlciggbSApOyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlIGFuZCBhIGNhdXNlLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFN0cmluZyBtLCBUaHJvd2FibGUgdCApIHsgc3VwZXIoIG0sIHQgKTsgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGEgY2F1c2UuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggVGhyb3dhYmxlIHQgICAgICAgICAgICkgeyBzdXBlciggdCApOyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLCBhIGNhdXNlLCBhbmQgYSBjb2xsZWN0aW9uIG9mIFhtbEVycm9ycy4KKyAgICAgKi8gCisgICAgcHVibGljIFhtbFJ1bnRpbWVFeGNlcHRpb24gKCBTdHJpbmcgbSwgVGhyb3dhYmxlIHQsIENvbGxlY3Rpb24gZXJyb3JzICkKKyAgICB7CisgICAgICAgIHN1cGVyKCBtLCB0ICk7CisKKyAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKQorICAgICAgICAgICAgX2Vycm9ycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoZXJyb3JzKSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGFuIFhtbEVycm9yLgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFhtbEVycm9yIGVycm9yICkKKyAgICB7CisgICAgICAgIHRoaXMoIGVycm9yLnRvU3RyaW5nKCksIG51bGwsIGVycm9yICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBYbWxSdW50aW1lRXhjZXB0aW9uIGZyb20gYSBtZXNzYWdlLCBhIGNhdXNlLCBhbmQgYW4gWG1sRXJyb3IuCisgICAgICovIAorICAgIHB1YmxpYyBYbWxSdW50aW1lRXhjZXB0aW9uICggU3RyaW5nIG0sIFRocm93YWJsZSB0LCBYbWxFcnJvciBlcnJvciApCisgICAgeworICAgICAgICB0aGlzKCBtLCB0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBlcnJvciApICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWG1sUnVudGltZUV4Y2VwdGlvbiBmcm9tIGFuIHtAbGluayBYbWxFeGNlcHRpb259LgorICAgICAqLyAKKyAgICBwdWJsaWMgWG1sUnVudGltZUV4Y2VwdGlvbiAoIFhtbEV4Y2VwdGlvbiB4bWxFeGNlcHRpb24gKQorICAgIHsKKyAgICAgICAgc3VwZXIoIHhtbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHhtbEV4Y2VwdGlvbi5nZXRDYXVzZSgpICk7CisKKyAgICAgICAgQ29sbGVjdGlvbiBlcnJvcnMgPSB4bWxFeGNlcHRpb24uZ2V0RXJyb3JzKCk7CisKKyAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKQorICAgICAgICAgICAgX2Vycm9ycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIG5ldyBBcnJheUxpc3QoIGVycm9ycyApICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHtAbGluayBYbWxFcnJvcn0gdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24sIGlmIGFueS4KKyAgICAgKi8gCisgICAgcHVibGljIFhtbEVycm9yIGdldEVycm9yICggKQorICAgIHsKKyAgICAgICAgaWYgKF9lcnJvcnMgPT0gbnVsbCB8fCBfZXJyb3JzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIChYbWxFcnJvcikgX2Vycm9ycy5nZXQoIDAgKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgWG1sRXJyb3IgWG1sRXJyb3JzfSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiwgaWYgYW55LgorICAgICAqLyAKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRFcnJvcnMgKCApCisgICAgeworICAgICAgICByZXR1cm4gX2Vycm9yczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgX2Vycm9yczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2F4SGFuZGxlci5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWE0NWZjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNheEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworCisvKioKKyAqIEEgaG9sZGVyIGZvciBhIFNBWCB7QGxpbmsgQ29udGVudEhhbmRsZXJ9IGFuZCB7QGxpbmsgTGV4aWNhbEhhbmRsZXJ9IHRoYXQgYXJlCisgKiBjYXBhYmxlIG9mIGxvYWRpbmcgYW4ge0BsaW5rIFhtbE9iamVjdH0gaW5zdGFuY2UuICBPbmNlIGFsbCB0aGUgU0FYIGV2ZW50cyBhcmUgcHVzaGVkCisgKiB0byB0aGUgaGFuZGxlcnMsIGNhbGwge0BsaW5rICNnZXRPYmplY3QoKX0gdG8gZ2V0IHRoZSBsb2FkZWQgWG1sT2JqZWN0LgorICogCisgKiBAc2VlIFhtbE9iamVjdC5GYWN0b3J5I25ld1htbFNheEhhbmRsZXIKKyAqIEBzZWUgU2NoZW1hVHlwZUxvYWRlciNuZXdYbWxTYXhIYW5kbGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgWG1sU2F4SGFuZGxlcgoreworICAgIC8qKgorICAgICAqIFRoZSBDb250ZW50SGFuZGxlciBleHBlY3RpbmcgU0FYIGNvbnRlbnQgZXZlbnRzLgorICAgICAqIEBzZWUgQ29udGVudEhhbmRsZXIKKyAgICAgKi8gCisgICAgQ29udGVudEhhbmRsZXIgZ2V0Q29udGVudEhhbmRsZXIgKCApOworICAgIC8qKgorICAgICAqIFRoZSBMZXhpY2FsSGFuZGxlciBleHBlY3RpbmcgU0FYIGxleGljYWwgZXZlbnRzLgorICAgICAqIEBzZWUgTGV4aWNhbEhhbmRsZXIKKyAgICAgKi8gCisgICAgTGV4aWNhbEhhbmRsZXIgZ2V0TGV4aWNhbEhhbmRsZXIgKCApOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoZSBsb2FkZWQgWG1sT2JqZWN0IGFmdGVyIGFsbCB0aGUgU0FYIGV2ZW50cyBoYXZlIGJlZW4gZmluaXNoZWQgKi8KKyAgICBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKSB0aHJvd3MgWG1sRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFNob3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzM2M3YgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaG9ydC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Nob3J0Ij54czpzaG9ydDwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBOYXR1cmFsbHksIGNvbnZlcnRpYmxlIHRvIGEgSmF2YSBzaG9ydC4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sU2hvcnQgZXh0ZW5kcyBYbWxJbnQKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV9zaG9ydCIpOworICAgIAorICAgIC8qKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydFZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0ICovCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRWYWx1ZShzaG9ydCBzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldFNob3J0VmFsdWV9CisgICAgICoqLworICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCB3aXRoIHtAbGluayAjc2V0U2hvcnRWYWx1ZX0KKyAgICAgKiovCisgICAgcHVibGljIHZvaWQgc2V0KHNob3J0IHMpOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB3aXRoIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcworICAgICAqIG9mIHtAbGluayBYbWxTaG9ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sU2hvcnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiB7QGxpbmsgWG1sU2hvcnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgbmV3SW5zdGFuY2Uob3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGltbXV0YWJsZSB7QGxpbmsgWG1sU2hvcnR9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgbmV3VmFsdWUoT2JqZWN0IG9iaikgeworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIHR5cGUubmV3VmFsdWUoIG9iaiApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU2hvcnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFNob3J0IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTaG9ydCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTaW1wbGVMaXN0LmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2ltcGxlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTk2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU2ltcGxlTGlzdC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKKy8qKgorICogVGhlIGltbXV0YWJsZSB7QGxpbmsgTGlzdH0gcmV0dXJuZWQgZm9yIFhNTCBzaW1wbGUgbGlzdCB2YWx1ZXMuCisgKiAKKyAqIFhtbFNpbXBsZUxpc3QgaW1wbGVtZW50cyBhbiBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSB0aGF0IGNvbXBhcmUgbGlzdAorICogY29udGVudHMsIHNvIHR3byBYbWxTaW1wbGVMaXN0cyBhcmUgdGhlIHNhbWUgaWYgdGhleSBoYXZlIHRoZSBzYW1lCisgKiB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIuCisgKi8gCitwdWJsaWMgY2xhc3MgWG1sU2ltcGxlTGlzdCBpbXBsZW1lbnRzIExpc3QsIGphdmEuaW8uU2VyaWFsaXphYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgCisJcHJpdmF0ZSBMaXN0IHVuZGVybHlpbmc7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpbW11dGFibGUgWG1sU2ltcGxlTGlzdCB0aGF0IHdyYXBzIChkb2VzIG5vdCBjb3B5KQorICAgICAqIHRoZSBnaXZlbiB7QGxpbmsgTGlzdH0uICBBbGwgbm9uLW11dGF0aW5nIG1ldGhvZHMgZGVsZWdhdGUgdG8KKyAgICAgKiB0aGUgdW5kZXJseWluZyBMaXN0IGluc3RhbmNlLgorICAgICAqLyAKKwlwdWJsaWMgWG1sU2ltcGxlTGlzdChMaXN0IGxpc3QpICAgICB7IHRoaXMudW5kZXJseWluZyA9IGxpc3Q7IH0KKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbGlzdC4gKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSAJCSAgICAgICAgICAgIHsgcmV0dXJuIHVuZGVybHlpbmcuc2l6ZSgpOyB9CisgICAgLyoqIFRydWUgaWYgdGhlIGxpc3QgaXMgZW1wdHkuICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIAkgICAgICAgIHsgcmV0dXJuIHVuZGVybHlpbmcuaXNFbXB0eSgpOyB9CisgICAgLyoqIFRydWUgaWYgdGhlIGxpc3QgaXMgY29udGFpbnMgYW4gb2JqZWN0IGVxdWFsIHRvIG8uICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pICAgeyByZXR1cm4gdW5kZXJseWluZy5jb250YWlucyhvKTsgfQorICAgIC8qKiBUcnVlIGlmIHRoZSBsaXN0IGlzIGNvbnRhaW5zIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGwpIHsgcmV0dXJuIHVuZGVybHlpbmcuY29udGFpbnNBbGwoY29sbCk7IH0KKyAgICAvKiogQ29waWVzIHRoZSBjb2xsZWN0aW9uIHRvIGFuIGFycmF5LiAqLworICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgCSAgICAgICAgeyByZXR1cm4gdW5kZXJseWluZy50b0FycmF5KCk7IH0KKyAgICAvKiogQ29waWVzIHRoZSBjb2xsZWN0aW9uIHRvIGFuIGFycmF5IG9mIGEgc3BlY2lmaWVkIHR5cGUuICovCisgICAgcHVibGljIE9iamVjdFtdIHRvQXJyYXkoT2JqZWN0W10gYSkgeyByZXR1cm4gdW5kZXJseWluZy50b0FycmF5KGEpOyB9CisgICAgCisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG8pICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjb2xsKSB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpICAgICAgICAgICAgICAgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LiAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgICAgICAgIHsgcmV0dXJuIHVuZGVybHlpbmcuZ2V0KGluZGV4KTsgfQorICAgIC8qKiBVbnN1cHBvcnRlZCBiZWNhdXNlIHRoaXMgbGlzdCBpcyBpbW11dGFibGUuICovCisgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQorICAgIC8qKiBVbnN1cHBvcnRlZCBiZWNhdXNlIHRoaXMgbGlzdCBpcyBpbW11dGFibGUuICovCisgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KKyAgICAvKiogVW5zdXBwb3J0ZWQgYmVjYXVzZSB0aGlzIGxpc3QgaXMgaW1tdXRhYmxlLiAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgICAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KKyAgICAvKiogUmV0dXJucyBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGFuIG9iamVjdCBlcXVhbCB0byBvLiAqLworICAgIHB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgICAgICAgIHsgcmV0dXJuIHVuZGVybHlpbmcuaW5kZXhPZihvKTsgfQorICAgIC8qKiBSZXR1cm5zIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VyYW5jZSBvZiBhbiBvYmplY3QgZXF1YWwgdG8gby4gKi8KKyAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSAgICB7IHJldHVybiB1bmRlcmx5aW5nLmxhc3RJbmRleE9mKG8pOyB9CisgICAgLyoqIFVuc3VwcG9ydGVkIGJlY2F1c2UgdGhpcyBsaXN0IGlzIGltbXV0YWJsZS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KKyAgICAvKiogUmV0dXJucyBhIHZpZXcgb2YgdGhlIHBvcnRpb24gb2YgdGhpcyBsaXN0IGJldHdlZW4gdGhlIHNwZWNpZmllZCBmcm9tSW5kZXgsIGluY2x1c2l2ZSwgYW5kIHRvSW5kZXgsIGV4Y2x1c2l2ZS4gKi8KKyAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tLCBpbnQgdG8pIHsgcmV0dXJuIG5ldyBYbWxTaW1wbGVMaXN0KHVuZGVybHlpbmcuc3ViTGlzdChmcm9tLCB0bykpOyB9CisKKyAgICAvKiogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QgaW4gcHJvcGVyIHNlcXVlbmNlLiAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCisgICAgeyAKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpCisgICAgICAgIHsgCisgICAgICAgICAgICBJdGVyYXRvciBpID0gdW5kZXJseWluZy5pdGVyYXRvcigpOworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpICAgIHsgcmV0dXJuIGkuaGFzTmV4dCgpOyB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSAJICAgIHsgcmV0dXJuIGkubmV4dCgpOyB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSAgICAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBsaXN0IGluIHByb3BlciBzZXF1ZW5jZS4gKi8KKyAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGxpc3RJdGVyYXRvcigpIAl7IHJldHVybiBsaXN0SXRlcmF0b3IoMCk7IH0KKyAgICAvKiogUmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXIgc2VxdWVuY2UsIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LiAqLworICAgIHB1YmxpYyBMaXN0SXRlcmF0b3IgbGlzdEl0ZXJhdG9yKGZpbmFsIGludCBpbmRleCkKKyAgICB7IAorICAgICAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcigpCisgICAgICAgIHsgCisgICAgICAgICAgICBMaXN0SXRlcmF0b3IgaSA9IHVuZGVybHlpbmcubGlzdEl0ZXJhdG9yKGluZGV4KTsKKyAgICAKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSAgICB7IHJldHVybiBpLmhhc05leHQoKTsgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgICAgICAgIHsgcmV0dXJuIGkubmV4dCgpOyB9CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpeyByZXR1cm4gaS5oYXNQcmV2aW91cygpOyB9CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHByZXZpb3VzKCkgICAgeyByZXR1cm4gaS5wcmV2aW91cygpOyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpICAgICAgeyByZXR1cm4gaS5uZXh0SW5kZXgoKTsgfQorICAgICAgICAgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgIHsgcmV0dXJuIGkucHJldmlvdXNJbmRleCgpOyB9CisgICAgCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSAgICAgICAgeyB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KE9iamVjdCBvKSAgIHsgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgICB7IHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyB9CisgICAgICAgIH07CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZ1ZhbHVlKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTaW1wbGVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybiAoKFNpbXBsZVZhbHVlKW8pLnN0cmluZ1ZhbHVlKCk7CisgICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBhbGwKKyAgICAgKiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICBGb3IgbW9zdCBsaXN0cywgdGhpcyBpcyBhIHZhbGlkIHhtbCBsZXhpY2FsCisgICAgICogdmFsdWUgZm9yIHRoZSBsaXN0LiAoVGhlIG5vdGFibGUgZXhjZXB0aW9uIGlzIGEgbGlzdCBvZiBRTmFtZXMuKQorICAgICAqLyAKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gdW5kZXJseWluZy5zaXplKCk7CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIFN0cmluZyBmaXJzdCA9IHN0cmluZ1ZhbHVlKHVuZGVybHlpbmcuZ2V0KDApKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZmlyc3QpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdHJpbmdWYWx1ZSh1bmRlcmx5aW5nLmdldChpKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVHdvIFhtbFNpbXBsZUxpc3RzIGFyZSBlcXVhbCBpZiBhbGwgdGhlaXIgaXRlbXMgYXJlIGVxdWFsLgorICAgICAqIChUaGV5IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMsIGFuZCB0aGUgaXRlbXMgbXVzdCBiZSBpbgorICAgICAqIHRoZSBzYW1lIG9yZGVyLikKKyAgICAgKi8gCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgIHsgCisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgWG1sU2ltcGxlTGlzdCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZmluYWwgWG1sU2ltcGxlTGlzdCB4bWxTaW1wbGVMaXN0ID0gKFhtbFNpbXBsZUxpc3QpbzsKKyAgICAgICAgTGlzdCB1bmRlcmx5aW5nMiA9IHhtbFNpbXBsZUxpc3QudW5kZXJseWluZzsKKyAgICAgICAgaW50IHNpemUgPSB1bmRlcmx5aW5nLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgIT0gdW5kZXJseWluZzIuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeyAKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gdW5kZXJseWluZy5nZXQoaSk7CisgICAgICAgICAgICBPYmplY3QgaXRlbTIgPSB1bmRlcmx5aW5nMi5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsID8gaXRlbTIgIT0gbnVsbCA6ICFpdGVtLmVxdWFscyhpdGVtMikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb21iaW5lcyB0aGUgaGFzaCBjb2RlcyBvZiBhbGwgdGhlIGxpc3QgaXRlbXMuCisgICAgICovIAorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgIHsgCisgICAgICAgIGludCBzaXplID0gdW5kZXJseWluZy5zaXplKCk7CisgICAgICAgIGludCBoYXNoID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsgCisgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHVuZGVybHlpbmcuZ2V0KGkpOworICAgICAgICAgICAgaGFzaCAqPSAxOTsKKyAgICAgICAgICAgIGhhc2ggKz0gaXRlbS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNmFiMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxTdHJpbmcuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciPnhzOnN0cmluZzwvYT4gdHlwZS4KKyAqIDxwPgorICogQSBiYXNpYyBzdHJpbmcgaW4gWE1MIHNjaGVtYSBpcyBub3Qgd2hpdGVzcGFjZSBub3JtYWxpemVkLiAgSWYgeW91CisgKiB3YW50IHlvdXIgc3RyaW5nIHR5cGUgdG8gYmUgaW5zZW5zaXRpdmUgdG8gdmFyaWF0aW9ucyBpbiBydW5zIG9mCisgKiB3aGl0ZXNwYWNlLCBjb25zaWRlciB1c2luZyAKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iPnhzOnRva2VuPC9hPgorICogKGFrYSB7QGxpbmsgWG1sVG9rZW59KSBpbnN0ZWFkLgorICogVG8gZm9yYmlkIHdoaXRlc3BhY2UgYW5kIHBlcm1pdCBqdXN0IGFscGhhbnVtZXJpYyBhbmQgb3RoZXIKKyAqIGNvbW1vbiBpZGVudGlmaWVyIGNoYXJhY3RlcnMgY29uc2lkZXIKKyAqIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiI+eHM6Tk1UT0tFTjwvYT4KKyAqIChha2Ege0BsaW5rIFhtbE5NVE9LRU59KSBpbnN0ZWFkLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sU3RyaW5nIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3N0cmluZyIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sU3RyaW5nfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxTdHJpbmd9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxTdHJpbmd9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxTdHJpbmd9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7IGFyYml0cmFyeSBzdHJpbmcgJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OyBhcmJpdHJhcnkgc3RyaW5nICZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFN0cmluZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxTdHJpbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sU3RyaW5nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sU3RyaW5nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxTdHJpbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sU3RyaW5nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxTdHJpbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFN0cmluZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFN0cmluZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVGltZS5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFRpbWUuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKKworCisvKioKKyAqIENvcnJlc3BvbmRzIHRvIHRoZSBYTUwgU2NoZW1hCisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUiPnhzOnRpbWU8L2E+IHR5cGUuCisgKiBBIGdEYXkgc3BlY2lmaWVzIG9ubHkgYSBkYXktb2YtbW9udGguCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIHtAbGluayBDYWxlbmRhcn0gb3Ige0BsaW5rIEdEYXRlfS4KKyAqIAorICogQHNlZSBYbWxDYWxlbmRhcgorICogQHNlZSBHRGF0ZQorICovIAorcHVibGljIGludGVyZmFjZSBYbWxUaW1lIGV4dGVuZHMgWG1sQW55U2ltcGxlVHlwZQoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3RpbWUiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLworICAgIENhbGVuZGFyIGdldENhbGVuZGFyVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfSAqLworICAgIHZvaWQgc2V0Q2FsZW5kYXJWYWx1ZShDYWxlbmRhciBjKTsKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlfSAqLworICAgIEdEYXRlIGdldEdEYXRlVmFsdWUoKTsKKyAgICAvKiogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIEdEYXRlU3BlY2lmaWNhdGlvbn0gKi8KKyAgICB2b2lkIHNldEdEYXRlVmFsdWUoR0RhdGUgZ2QpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICBDYWxlbmRhciBjYWxlbmRhclZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEge0BsaW5rIENhbGVuZGFyfQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRDYWxlbmRhclZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChDYWxlbmRhciBjKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGV9CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEdEYXRlVmFsdWV9CisgICAgICoqLworICAgIEdEYXRlIGdEYXRlVmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSB7QGxpbmsgR0RhdGVTcGVjaWZpY2F0aW9ufQorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRHRGF0ZVZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChHRGF0ZVNwZWNpZmljYXRpb24gZ2QpOworCisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbFRpbWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFRpbWV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFRpbWV9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTI6MDA6MDAmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRpbWV9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVGltZSBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVGltZX0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRpbWUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRpbWUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUaW1lKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUaW1lfSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUaW1lIHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVGltZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Yjg5MDUKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW4uamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0b2tlbiI+eHM6dG9rZW48L2E+IHR5cGUuCisgKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzdHJpbmciPnhzOnN0cmluZzwvYT4uCisgKiA8cD4KKyAqIEEgdG9rZW4gaXMgWE1MJ3MgYmVzdCByZXByZXNlbnRhdGlvbiBmb3IgYSAid2hpdGVzcGFjZSBpbnNlbnNpdGl2ZSBzdHJpbmcuIgorICogQWxsIGNhcnJpYWdlIHJldHVybnMsIGxpbmVmZWVkcywgYW5kIHRhYnMgYXJlIGNvbnZlcnRlZCB0byBvcmRpbmFyeSBzcGFjZQorICogY2hhcmFjdGVycyAoYXMgd2l0aCA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciPnhzOm5vcm1hbGl6ZWRTdHJpbmc8L2E+KSwKKyAqIGFuZCBmdXJ0aGVybW9yZSwgYWxsIGNvbnRpZ3VvdXMgcnVucyBvZiBzcGFjZSBhcmUgY29sbGFwc2VkIHRvIHNpbmdsZSBzcGFjZXMsCisgKiBhbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZSB0cmltbWVkLgorICogPHA+CisgKiBJZiB5b3Ugd2FudCA8Y29kZT4iJm5ic3A7Jm5ic3A7aGlnaCZuYnNwOyZuYnNwO3ByaW9yaXR5Jm5ic3A7Jm5ic3A7IjwvY29kZT4KKyAqIHRvIGJlIGVxdWl2YWxlbnQgdG8gPGNvZGU+ImhpZ2ggcHJpb3JpdHkiPC9jb2RlPiwgeW91IHNob3VsZCBjb25zaWRlcgorICogdXNpbmcgeHM6dG9rZW4gb3IgYSBzdWJ0eXBlIG9mIHhzOnRva2VuLgorICogPHA+CisgKiBXaGVuIHRoZSB7QGxpbmsgI3N0cmluZ1ZhbHVlfSBpcyBvYnRhaW5lZCBmcm9tIGFuIFhtbFRva2VuLCB0aGUgbm9ybWFsaXplZCwKKyAqIHRyaW1tZWQsIHdoaXRlc3BhY2UgY29sbGFwc2VkIHZhbHVlIGlzIHJldHVybmVkLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgU3RyaW5nfS4KKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sVG9rZW4gZXh0ZW5kcyBYbWxOb3JtYWxpemVkU3RyaW5nCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfdG9rZW4iKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbFRva2VufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxUb2tlbn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxUb2tlbn0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxUb2tlbn0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDtzdHJpbmcgdG8gY29sbGFwc2UmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7c3RyaW5nIHRvIGNvbGxhcHNlJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uRmlsZSBmKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2UoamF2YS5pby5GaWxlIGYsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLm5ldC5VUkwgdSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEubmV0LlVSTCB1LCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFRva2VufSBmcmFnbWVudCBmcm9tIGEgUmVhZGVyLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKGphdmEuaW8uUmVhZGVyIHIsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFRva2VuIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVG9rZW59IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxUb2tlbiBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVG9rZW4pIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFRva2VuKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxUb2tlbn0gZnJhZ21lbnQgZnJvbSBhbiBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVG9rZW4gcGFyc2Uob3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIHhpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxUb2tlbikgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW5Tb3VyY2UuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxUb2tlblNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOGNiMzcKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVG9rZW5Tb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgaG9sZGVyIG9mIFhNTCB0aGF0IGNhbiByZXR1cm4gYW4ge0BsaW5rIFhtbEN1cnNvcn0KKyAqIG9yIGNvcHkgaXRzZWxmIHRvIHZhcmlvdXMgbWVkaWEgc3VjaCBhcworICoge0BsaW5rIFdyaXRlciBXcml0ZXJzfSBvciB7QGxpbmsgRmlsZSBGaWxlc30uCisgKiBCb3RoIHtAbGluayBYbWxPYmplY3R9CisgKiAoYW5kIHRodXMgYWxsIFhNTCBCZWFucykgYW5kIHtAbGluayBYbWxDdXJzb3J9IGFyZQorICogWG1sVG9rZW5Tb3VyY2UgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBAc2VlIFhtbE9iamVjdAorICogQHNlZSBYbWxDdXJzb3IKKyAqLyAKK3B1YmxpYyBpbnRlcmZhY2UgWG1sVG9rZW5Tb3VyY2UKK3sKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQuICBJZiBjb25jdXJyZW50CisgICAgICogbXVsdGl0aHJlYWRlZCBhY2Nlc3MgdG8gYSBkb2N1bWVudCBpcyByZXF1aXJlZCwgdGhlIGFjY2VzcyBzaG91bGQgc2hvdWxkCisgICAgICogYmUgcHJvdGVjdGVkIGJ5IHN5bmNocm9uaXppbmcgb24gdGhpcyBtb25pdG9yKCkgb2JqZWN0LiAgVGhlcmUgaXMgb25lCisgICAgICogbW9uaXRvciBwZXIgWE1MIGRvY3VtZW50IHRyZWUuCisgICAgICovCisgICAgT2JqZWN0IG1vbml0b3IoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBYbWxEb2N1bWVudFByb3BlcnRpZXMgb2JqZWN0IGZvciB0aGUgZG9jdW1lbnQgdGhpcyB0b2tlbgorICAgICAqIHNvdXJjZSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgWG1sRG9jdW1lbnRQcm9wZXJ0aWVzIGRvY3VtZW50UHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBYTUwgY3Vyc29yLgorICAgICAqCisgICAgICogQSBjdXJzb3IgcHJvdmlkZXMgcmFuZG9tIGFjY2VzcyB0byBhbGwgdGhlIHRva2VucyBpbiB0aGUgWE1MCisgICAgICogZGF0YSwgcGx1cyB0aGUgYWJpbGl0eSB0byBleHRyYWN0IHN0cm9uZ2x5LXR5cGVkIFhtbE9iamVjdHMKKyAgICAgKiBmb3IgdGhlIGRhdGEuIElmIHRoZSBkYXRhIGlzIG5vdCByZWFkLW9ubHksIHRoZSBYTUwgY3Vyc29yCisgICAgICogYWxzbyBhbGxvd3MgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YS4KKyAgICAgKgorICAgICAqIFVzaW5nIGEgY3Vyc29yIGZvciB0aGUgZmlyc3QgdGltZSB0eXBpY2FsbHkgZm9yY2VzIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudCBpbnRvIG1lbW9yeS4KKyAgICAgKi8KKyAgICBYbWxDdXJzb3IgbmV3Q3Vyc29yKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFhtbElucHV0U3RyZWFtLgorICAgICAqCisgICAgICogVGhlIHN0cmVhbSBzdGFydHMgYXQgdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50CisgICAgICogcG9zaXRpb24gYW5kIGVuZHMgYXQgdGhlIG1hdGNoaW5nIGVuZC10YWcgb3IgZW5kLWRvY3VtZW50LgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCBzdHJlYW0sIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAorICAgICAqIHdoaWxlIHRoZSBzdHJlYW0gaXMgYmVpbmcgcmVhZCwgdGhlIHN0cmVhbSB0aHJvd3MgYQorICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKKyAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKKyAgICAgKiBhbiBhdHRyaWJ1dGUpLgorICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MworICAgICAqLworICAgIFhNTElucHV0U3RyZWFtIG5ld1hNTElucHV0U3RyZWFtKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBzdGFuZGFyZCBYTUwgdGV4dC4KKyAgICAgKgorICAgICAqIFRoZSB0ZXh0IHJldHVybmVkIHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IGNvbnRlbnRzIHN0YXJ0aW5nIGF0CisgICAgICogdGhlIGN1cnJlbnQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IGFuZCBlbmRpbmcgYXQgdGhlIG1hdGNoaW5nCisgICAgICogZW5kLXRhZyBvciBlbmQtZG9jdW1lbnQuIFRoaXMgaXMgc2FtZSBjb250ZW50IGFzIG5ld1JlYWRlciwgYnV0CisgICAgICogaXQgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgc3RyaW5nLgorICAgICAqCisgICAgICogVGhyb3dzIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgWG1sVG9rZW5Tb3VyY2UgaXMgbm90CisgICAgICogcG9zaXRpb25lZCBhdCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgKGUuZy4sIGlmIGl0IGlzIGF0CisgICAgICogYW4gYXR0cmlidXRlKS4KKyAgICAgKi8KKyAgICBTdHJpbmcgeG1sVGV4dCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBzdHJlYW0gY29udGFpbmluZyBzdGFuZGFyZCBYTUwgdGV4dCwgZW5jb2RlZAorICAgICAqIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBUaGUgYnl0ZSBzdHJlYW0gY29udGFpbnMgY29udGVudHMgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdCB0aGUgbWF0Y2hpbmcKKyAgICAgKiBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIFRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaXMgdXNlZAorICAgICAqIGFuZCBhbHNvIGVtaXR0ZWQgaW4gYSBQSSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgZmFpbC1mYXN0IHN0cmVhbSwgc28gaWYgdGhlIHVuZGVybHlpbmcgZGF0YSBpcyBjaGFuZ2VkCisgICAgICogd2hpbGUgdGhlIHN0cmVhbSBpcyBiZWluZyByZWFkLCB0aGUgc3RyZWFtIHRocm93cyBhCisgICAgICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIFRocm93cyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIFhtbFRva2VuU291cmNlIGlzIG5vdAorICAgICAqIHBvc2l0aW9uZWQgYXQgYmVnaW4tdGFnIG9yIGJlZ2luLWRvY3VtZW50IChlLmcuLCBpZiBpdCBpcyBhdAorICAgICAqIGFuIGF0dHJpYnV0ZSkuCisgICAgICovCisgICAgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgY2hhcmFjdGVyIHJlYWRlciBjb250YWluaW5nIFhNTCB0ZXh0LgorICAgICAqCisgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkZXIgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgY29udGVudHMKKyAgICAgKiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBiZWdpbi10YWcgb3IgYmVnaW4tZG9jdW1lbnQgYW5kIGVuZGluZyBhdAorICAgICAqIHRoZSBtYXRjaGluZyBlbmQtdGFnIG9yIGVuZC1kb2N1bWVudC4gIE5vIGVuY29kaW5nIGFubm90YXRpb24KKyAgICAgKiB3aWxsIGJlIG1hZGUgaW4gdGhlIHRleHQgaXRzZWxmLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGZhaWwtZmFzdCByZWFkZXIsIHNvIGlmIHRoZSB1bmRlcmx5aW5nIGRhdGEgaXMgY2hhbmdlZAorICAgICAqIHdoaWxlIHRoZSByZWFkZXIgaXMgYmVpbmcgcmVhZCwgdGhlIHJlYWRlciB0aHJvd3MgYQorICAgICAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBYbWxUb2tlblNvdXJjZSBpcyBub3QKKyAgICAgKiBwb3NpdGlvbmVkIGF0IGJlZ2luLXRhZyBvciBiZWdpbi1kb2N1bWVudCAoZS5nLiwgaWYgaXQgaXMgYXQKKyAgICAgKiBhbiBhdHRyaWJ1dGUpLgorICAgICAqLworICAgIFJlYWRlciBuZXdSZWFkZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVzNDIERPTSBOb2RlIGNvbnRhaW5pbmcgdGhlIFhNTAorICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFhNTCwgaXQgaXMKKyAgICAgKiBub3QgYSBsaXZlIHdpdGggdGhlIHVuZGVybHlpbmcgc3RvcmUgb2YgdGhpcyB0b2tlbiBzb3VyY2UuCisgICAgICogSWYgdGhpcyBpcyB0aGUgZG9jdW1lbnQgbm9kZSwgdGhlbiBhIERvY3VtZW50IGlzIHJldHVybmVkLCBlbHNlCisgICAgICogYSBEb2N1bWVudEZyYWdtZW50IGlzIHJldHVybmVkLgorICAgICAqLworICAgIE5vZGUgbmV3RG9tTm9kZSgpOworCisvLyAgICAvKioKKy8vICAgICAqIFJldHVybnMgYSBXM0MgRE9NIE5vZGUgY29udGFpbmluZyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlLgorLy8gICAgICogVGhpcyBpcyBhIGxpdmUgRE9NIG5vZGUsIG5vdCBhIGNvcHkuICBBbnkgY2hhbmdlcyBtYWRlIHRocm91Z2ggdGhpcyBub2RlCisvLyAgICAgKiBhcmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0b2tlbgorLy8gICAgICogc291cmNlLiAgRGVwZW5kaW5nIG9uIHRoZSBraW5kIG9mIHRva2VuIHRoaXMgWG1sVG9rZW5Tb3VyY2UgcmVwcmVzZW50cywKKy8vICAgICAqIGFuIGFwcHJvcHJpYXRlIG5vZGUgd2lsbCBiZSByZXR1cm5lZC4KKy8vICAgICAqLworLy8gICAgTm9kZSBnZXREb21Ob2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCisgICAgICogbGV4aWNhbCBoYW5kbGVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGggKSB0aHJvd3MgU0FYRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgWE1MIHJlcHJlc2VudGVkIGJ5IHRoaXMgc291cmNlIHRvIHRoZSBnaXZlbiBGaWxlLgorICAgICAqLworICAgIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSApIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICB2b2lkIHNhdmUgKCBPdXRwdXRTdHJlYW0gb3MgKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgorICAgICAqLworICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3ICkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+SnVzdCBsaWtlIG5ld1hNTElucHV0U3RyZWFtKCkgYnV0IHdpdGggYW55IG9mIGEgbnVtYmVyIG9mIG9wdGlvbnMuIFVzZSB0aGUgCisgICAgICogPGVtPm9wdGlvbnM8L2VtPiBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgZm9sbG93aW5nOjwvcD4KKyAgICAgKiAKKyAgICAgKiA8dGFibGU+CisgICAgICogPHRyPjx0aD5UbyBzcGVjaWZ5IHRoaXM8L3RoPjx0aD5Vc2UgdGhpcyBtZXRob2Q8L3RoPjwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiAgZGF0YSBpbiB0aGUgWE1MIHRvIGJ5dGVzcy48L3RkPgorICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlByZWZpeC10by1uYW1lc3BhY2UgbWFwcGluZ3MgdGhhdCBzaG91bGQgYmUgYXNzdW1lZAorICAgICAqICB3aGVuIHNhdmluZyB0aGlzIFhNTC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgcmVzdWx0aW5nCisgICAgICogIFhNTCB3aWxsIGJlIHBhcnQgb2YgYSBsYXJnZXIgWE1MIGRvY3VtZW50LCBlbnN1cmluZyB0aGF0IHRoaXMgCisgICAgICogIGlubmVyIGRvY3VtZW50IHdpbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgbmFtZXNwYWNlcyBkZWZpbmVkIGluIAorICAgICAqICB0aGUgb3V0ZXIgZG9jdW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbXBsaWNpdE5hbWVzcGFjZXN9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlN1Z2dlc3RlZCBuYW1lc3BhY2UgcHJlZml4ZXMgdG8gdXNlIHdoZW4gc2F2aW5nLiBVc2VkIG9ubHkKKyAgICAgKiAgd2hlbiBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUgbmVlZHMgdG8gYmUgc3ludGhlc2l6ZWQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTdWdnZXN0ZWRQcmVmaXhlc308L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VGhhdCBuYW1lc3BhY2UgYXR0cmlidXRlcyBzaG91bGQgb2NjdXIgZmlyc3QgaW4gZWxlbWVudHMgd2hlbgorICAgICAqIHRoZSBYTUwgaXMgc2F2ZWQuIEJ5IGRlZmF1bHQsIHRoZXkgb2NjdXIgbGFzdC48L3RkPgorICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZU5hbWVzcGFjZXNGaXJzdH08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VGhlIFhNTCBzaG91bGQgYmUgcHJldHR5IHByaW50ZWQgd2hlbiBzYXZlZC4gTm90ZSB0aGF0IHRoaXMgCisgICAgICogIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZy48L3RkPgorICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVByZXR0eVByaW50fTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogIDx0ZD5UaGUgbnVtYmVyIG9mIHNwYWNlcyB0byB1c2Ugd2hlbiBpbmRlbnRpbmcgZm9yIHByZXR0eSBwcmludGluZy4gCisgICAgICogIFRoZSBkZWZhdWx0IGlzIDIuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludEluZGVudH08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIHNwYWNlcyBpbmRlbnRlZCBmcm9tIHRoZSBsZWZ0CisgICAgICogIGZvciBwcmV0dHkgcHJpbnRlZCBYTUwuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVQcmV0dHlQcmludE9mZnNldH08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+VG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBuYW1lc3BhY2UgYXR0cmlidXRlcyBnZW5lcmF0ZWQgZm9yIHRoZSAKKyAgICAgKiAgc2F2ZWQgWE1MLiBOb3RlIHRoYXQgdGhpcyBjYW4gcmVkdWNlIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVBZ2dyZXNpdmVOYW1lc3BhY2VzfTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogIDx0ZD5UbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHNhdmVkIGRvY3VtZW50CisgICAgICogIGJ5IGFsbG93aW5nIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLiBOb3RlIHRoYXQgdGhpcyBjYW4gCisgICAgICogIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgc2VtYW50aWMgbWVhbmluZyBvZiB0aGUgWE1MIGlmIHVucHJlZml4ZWQgUU5hbWVzIGFyZSAKKyAgICAgKiAgcHJlc2VudCBhcyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG9yIGVsZW1lbnQuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFVzZURlZmF1bHROYW1lc3BhY2V9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlRvIGZpbHRlciBvdXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc3BlY2lmaWVkIHRhcmdldCBuYW1lLjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlRmlsdGVyUHJvY2luc3R9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPkNoYW5nZSB0aGUgUU5hbWUgb2YgdGhlIHN5bnRoZXNpemVkIHJvb3QgZWxlbWVudCB3aGVuIHNhdmluZy4gVGhpcyAKKyAgICAgKiAgcmVwbGFjZXMgInhtbC1mcmFnbWVudCIgd2l0aCAiZnJhZ21lbnQiIGluIHRoZSBuYW1lc3BhY2UgCisgICAgICogIGh0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQ8L3RkPgorICAgICAqICA8dGQ+e0BsaW5rIFhtbE9wdGlvbnMjc2V0U2F2ZVVzZU9wZW5GcmFnfTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogIDx0ZD5TYXZpbmcgc2hvdWxkIGJlZ2luIG9uIHRoZSBlbGVtZW50J3MgY29udGVudHMuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVJbm5lcn08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqICA8dGQ+U2F2aW5nIHNob3VsZCBiZWdpbiBvbiB0aGUgZWxlbWVudCwgcmF0aGVyIHRoYW4gaXRzIGNvbnRlbnRzLjwvdGQ+CisgICAgICogIDx0ZD57QGxpbmsgWG1sT3B0aW9ucyNzZXRTYXZlT3V0ZXJ9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDx0cj4KKyAgICAgKiAgPHRkPlRvIHJlbmFtZSB0aGUgZG9jdW1lbnQgZWxlbWVudCwgb3IgdG8gc3BlY2lmeSB0aGUgZG9jdW1lbnQgZWxlbWVudAorICAgICAqICBmb3IgdGhpcyBYTUwuPC90ZD4KKyAgICAgKiAgPHRkPntAbGluayBYbWxPcHRpb25zI3NldFNhdmVTeW50aGV0aWNEb2N1bWVudEVsZW1lbnR9PC90ZD4KKyAgICAgKiA8L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICogCisgICAgICogQHNlZSBYbWxPcHRpb25zCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQW55IG9mIHRoZSBkZXNjcmliZWQgb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIEEgbmV3IHZhbGlkYXRpbmcgWE1MSW5wdXRTdHJlYW0uCisgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczCisgICAgICovCisgICAgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0oWG1sT3B0aW9ucyBvcHRpb25zKTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB4bWxUZXh0KCkgYnV0IHdpdGggb3B0aW9ucy4KKyAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMKKyAgICAgKi8KKyAgICBTdHJpbmcgeG1sVGV4dChYbWxPcHRpb25zIG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogSnVzdCBsaWtlIG5ld0lucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgYnV0IHdpdGggb3B0aW9ucy4KKyAgICAgKiBPcHRpb25zIG1hcCBtYXkgYmUgbnVsbC4KKyAgICAgKiBAc2VlIFhtbE9wdGlvbnMKKyAgICAgKi8KKyAgICBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShYbWxPcHRpb25zIG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSBuZXdSZWFkZXIoKSBidXQgd2l0aCBvcHRpb25zLgorICAgICAqIE9wdGlvbnMgbWFwIG1heSBiZSBudWxsLgorICAgICAqIEBzZWUgWG1sT3B0aW9ucworICAgICAqLworICAgIFJlYWRlciBuZXdSZWFkZXIoWG1sT3B0aW9ucyBvcHRpb25zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2UgbmV3RG9tTm9kZSgpIGJ1dCB3aXRoIG9wdGlvbnMuCisgICAgICogT3B0aW9ucyBtYXAgbWF5IGJlIG51bGwuCisgICAgICogQHNlZSBYbWxPcHRpb25zCisgICAgICovCisKKyAgICBOb2RlIG5ld0RvbU5vZGUoWG1sT3B0aW9ucyBvcHRpb25zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gU0FYIGNvbnRlbnQgYW5kCisgICAgICogbGV4aWNhbCBoYW5kbGVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNhdmUgKCBDb250ZW50SGFuZGxlciBjaCwgTGV4aWNhbEhhbmRsZXIgbGgsIFhtbE9wdGlvbnMgb3B0aW9ucyApIHRocm93cyBTQVhFeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIEZpbGUuCisgICAgICovCisgICAgdm9pZCBzYXZlICggRmlsZSBmaWxlLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBYTUwgcmVwcmVzZW50ZWQgYnkgdGhpcyBzb3VyY2UgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIFhNTCByZXByZXNlbnRlZCBieSB0aGlzIHNvdXJjZSB0byB0aGUgZ2l2ZW4gd3JpdGVyLgorICAgICAqLworICAgIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRCeXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3YTdjNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZEJ5dGUuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiPnhzOnVuc2lnbmVkQnl0ZTwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uMjU1IHdoZW4gdmFsaWRhdGluZy4KKyAqIDxwPgorICogQXMgc3VnZ2VzdGVkIGJ5IEpBWEIsIGNvbnZlcnRpYmxlIHRvIEphdmEgc2hvcnQuCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkQnl0ZSBleHRlbmRzIFhtbFVuc2lnbmVkU2hvcnQKK3sKKyAgICAvKiogVGhlIGNvbnN0YW50IHtAbGluayBTY2hlbWFUeXBlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgc2NoZW1hIHR5cGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTY2hlbWFUeXBlIHR5cGUgPSBYbWxCZWFucy5nZXRCdWlsdGluVHlwZVN5c3RlbSgpLnR5cGVGb3JIYW5kbGUoIl9CSV91bnNpZ25lZEJ5dGUiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgc2hvcnQgKi8KKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnRWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYSBzaG9ydCAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0VmFsdWUoc2hvcnQgcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYSBzaG9ydAorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRTaG9ydFZhbHVlfQorICAgICAqKi8KKyAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpOworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIHNob3J0CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldFNob3J0VmFsdWV9CisgICAgICoqLworICAgIHB1YmxpYyB2b2lkIHNldChzaG9ydCBzKTsKKworICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzJmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMyZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkQnl0ZX0gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEJ5dGUgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRCeXRlfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRCeXRlIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEJ5dGUpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRCeXRlKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEJ5dGV9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkQnl0ZSBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkQnl0ZSkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZEludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRJbnQuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCI+eHM6dW5zaWduZWRJbnQ8L2E+IHR5cGUuCisgKiBPbmUgb2YgdGhlIGRlcml2ZWQgdHlwZXMgYmFzZWQgb24gPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIj54czpkZWNpbWFsPC9hPi4KKyAqIDxwPgorICogVmVyaWZpZWQgdG8gYmUgaW4gdGhlIHJhbmdlIDAuLjQyOTQ5NjcyOTUgd2hlbiB2YWxpZGF0aW5nLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byBKYXZhIGxvbmcuCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkSW50IGV4dGVuZHMgWG1sVW5zaWduZWRMb25nCit7CisgICAgLyoqIFRoZSBjb25zdGFudCB7QGxpbmsgU2NoZW1hVHlwZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIHNjaGVtYSB0eXBlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2NoZW1hVHlwZSB0eXBlID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKS50eXBlRm9ySGFuZGxlKCJfQklfdW5zaWduZWRJbnQiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZyAqLworICAgIGxvbmcgZ2V0TG9uZ1ZhbHVlKCk7CisgICAgLyoqIFNldHMgdGhpcyB2YWx1ZSBhcyBhIGxvbmcgKi8KKyAgICB2b2lkIHNldExvbmdWYWx1ZShsb25nIHYpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRMb25nVmFsdWV9CisgICAgICoqLworICAgIGxvbmcgbG9uZ1ZhbHVlKCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIHZhbHVlIGFzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNzZXRMb25nVmFsdWV9CisgICAgICoqLworICAgIHZvaWQgc2V0KGxvbmcgdik7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbFVuc2lnbmVkSW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEludH0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZEludH0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZEludH0gdmFsdWUgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBTdHJpbmcuIEZvciBleGFtcGxlOiAiPGNvZGU+Jmx0O3htbC1mcmFnbWVudCZndDsxMjM0NTY3Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5sYW5nLlN0cmluZyBzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1NjcmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggZiwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG51bGwgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHUsIHR5cGUsIG9wdGlvbnMgKTsgfQorCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCByLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRJbnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRJbnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZEludH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkSW50IHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZEludCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggbm9kZSwgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRJbnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHhpcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkSW50fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZEludCBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkSW50KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFJldHVybnMgYSB2YWxpZGF0aW5nIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0gbmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsgfSAvLyBObyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuamF2YSBiL3YxL3NyYy94bWxwdWJsaWMvb3JnL2FwYWNoZS94bWxiZWFucy9YbWxVbnNpZ25lZExvbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGFkOTQyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkTG9uZy5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciPnhzOnVuc2lnbmVkTG9uZzwvYT4gdHlwZS4KKyAqIE9uZSBvZiB0aGUgZGVyaXZlZCB0eXBlcyBiYXNlZCBvbiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RlY2ltYWwiPnhzOmRlY2ltYWw8L2E+LgorICogPHA+CisgKiBWZXJpZmllZCB0byBiZSBpbiB0aGUgcmFuZ2UgMC4uMjxzdXBlcj42NDwvc3VwZXI+LTEgd2hlbiB2YWxpZGF0aW5nLgorICogPHA+CisgKiBDb252ZXJ0aWJsZSB0byB7QGxpbmsgQmlnSW50ZWdlcn0uCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkTG9uZyBleHRlbmRzIFhtbE5vbk5lZ2F0aXZlSW50ZWdlcgoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkTG9uZyIpOworICAgIAorICAgIC8qKgorICAgICAqIEEgY2xhc3Mgd2l0aCBtZXRob2RzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMKKyAgICAgKiBvZiB7QGxpbmsgWG1sVW5zaWduZWRMb25nfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld0luc3RhbmNlKCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBYbWxVbnNpZ25lZExvbmd9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld0luc3RhbmNlKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIG5ld1ZhbHVlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgdHlwZS5uZXdWYWx1ZSggb2JqICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDU2Nzg5Jmx0Oy94bWwtZnJhZ21lbnQmZ3Q7PC9jb2RlPiIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggcywgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFN0cmluZy4gRm9yIGV4YW1wbGU6ICI8Y29kZT4mbHQ7eG1sLWZyYWdtZW50Jmd0OzEyMzQ1Njc4OSZsdDsveG1sLWZyYWdtZW50Jmd0OzwvY29kZT4iLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmxhbmcuU3RyaW5nIHMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5GaWxlIGYpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBGaWxlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShqYXZhLmlvLkZpbGUgZiwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEubmV0LlVSTCB1KSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFVSTC4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5uZXQuVVJMIHUsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhbiBJbnB1dFN0cmVhbS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKGphdmEuaW8uSW5wdXRTdHJlYW0gaXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgcikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkTG9uZ30gZnJhZ21lbnQgZnJvbSBhIFJlYWRlci4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2UoamF2YS5pby5SZWFkZXIgciwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYSBET00gTm9kZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZExvbmcgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRMb25nfSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRMb25nIHBhcnNlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZExvbmcpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRMb25nKSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZExvbmd9IGZyYWdtZW50IGZyb20gYW4gWE1MSW5wdXRTdHJlYW0uCisgICAgICAgICAqIEBkZXByZWNhdGVkIFN1cGVyY2VkZWQgYnkgSlNSIDE3MyAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkTG9uZyBwYXJzZShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkTG9uZykgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvWG1sVW5zaWduZWRTaG9ydC5qYXZhIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkU2hvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTRlNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL1htbFVuc2lnbmVkU2hvcnQuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFuczsKKworLyoqCisgKiBDb3JyZXNwb25kcyB0byB0aGUgWE1MIFNjaGVtYQorICogPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZFNob3J0Ij54czp1bnNpZ25lZFNob3J0PC9hPiB0eXBlLgorICogT25lIG9mIHRoZSBkZXJpdmVkIHR5cGVzIGJhc2VkIG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGVjaW1hbCI+eHM6ZGVjaW1hbDwvYT4uCisgKiA8cD4KKyAqIFZlcmlmaWVkIHRvIGJlIGluIHRoZSByYW5nZSAwLi42NTUzNSB3aGVuIHZhbGlkYXRpbmcuCisgKiA8cD4KKyAqIENvbnZlcnRpYmxlIHRvIGEgSmF2YSBpbnQuCisgKi8gCitwdWJsaWMgaW50ZXJmYWNlIFhtbFVuc2lnbmVkU2hvcnQgZXh0ZW5kcyBYbWxVbnNpZ25lZEludAoreworICAgIC8qKiBUaGUgY29uc3RhbnQge0BsaW5rIFNjaGVtYVR5cGV9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBzY2hlbWEgdHlwZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNjaGVtYVR5cGUgdHlwZSA9IFhtbEJlYW5zLmdldEJ1aWx0aW5UeXBlU3lzdGVtKCkudHlwZUZvckhhbmRsZSgiX0JJX3Vuc2lnbmVkU2hvcnQiKTsKKyAgICAKKyAgICAvKiogUmV0dXJucyB0aGlzIHZhbHVlIGFzIGFuIGludCAqLworICAgIGludCBnZXRJbnRWYWx1ZSgpOworICAgIC8qKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50ICovCisgICAgdm9pZCBzZXRJbnRWYWx1ZShpbnQgdik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgdmFsdWUgYXMgYW4gaW50CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI2dldEludFZhbHVlfQorICAgICAqKi8KKyAgICBpbnQgaW50VmFsdWUoKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgdmFsdWUgYXMgYW4gaW50CisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgd2l0aCB7QGxpbmsgI3NldEludFZhbHVlfQorICAgICAqKi8KKyAgICB2b2lkIHNldChpbnQgdik7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHdpdGggbWV0aG9kcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzCisgICAgICogb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQorICAgIHsKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkubmV3SW5zdGFuY2UoIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIENyZWF0ZXMgYW4gZW1wdHkgaW5zdGFuY2Ugb2Yge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdJbnN0YW5jZShvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgeworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdJbnN0YW5jZSggdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogQ3JlYXRlcyBhbiBpbW11dGFibGUge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IHZhbHVlICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBuZXdWYWx1ZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSB0eXBlLm5ld1ZhbHVlKCBvYmogKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgU3RyaW5nLiBGb3IgZXhhbXBsZTogIjxjb2RlPiZsdDt4bWwtZnJhZ21lbnQmZ3Q7MTIzNDUmbHQ7L3htbC1mcmFnbWVudCZndDs8L2NvZGU+Ii4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEubGFuZy5TdHJpbmcgcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIEZpbGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLkZpbGUgZikgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRmlsZS4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKGphdmEuaW8uRmlsZSBmLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIGYsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgVVJMLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5uZXQuVVJMIHUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBudWxsICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBVUkwuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLm5ldC5VUkwgdSwgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB1LCB0eXBlLCBvcHRpb25zICk7IH0KKworICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYW4gSW5wdXRTdHJlYW0uICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggaXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIElucHV0U3RyZWFtLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YS5pby5JbnB1dFN0cmVhbSBpcywgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIG9wdGlvbnMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggciwgdHlwZSwgbnVsbCApOyB9CisgICAgICAgIAorICAgICAgICAvKiogUGFyc2VzIGEge0BsaW5rIFhtbFVuc2lnbmVkU2hvcnR9IGZyYWdtZW50IGZyb20gYSBSZWFkZXIuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShqYXZhLmlvLlJlYWRlciByLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIHIsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGEgRE9NIE5vZGUuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sVW5zaWduZWRTaG9ydCBwYXJzZShvcmcudzNjLmRvbS5Ob2RlIG5vZGUpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCBub2RlLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBQYXJzZXMgYSB7QGxpbmsgWG1sVW5zaWduZWRTaG9ydH0gZnJhZ21lbnQgZnJvbSBhIERPTSBOb2RlLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbFVuc2lnbmVkU2hvcnQgcGFyc2Uob3JnLnczYy5kb20uTm9kZSBub2RlLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gKFhtbFVuc2lnbmVkU2hvcnQpIFhtbEJlYW5zLmdldENvbnRleHRUeXBlTG9hZGVyKCkucGFyc2UoIG5vZGUsIHR5cGUsIG9wdGlvbnMgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMpIHRocm93cyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbiwgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgcmV0dXJuIChYbWxVbnNpZ25lZFNob3J0KSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLnBhcnNlKCB4aXMsIHR5cGUsIG51bGwgKTsgfQorICAgICAgICAKKyAgICAgICAgLyoqIFBhcnNlcyBhIHtAbGluayBYbWxVbnNpZ25lZFNob3J0fSBmcmFnbWVudCBmcm9tIGFuIFhNTElucHV0U3RyZWFtLgorICAgICAgICAgKiBAZGVwcmVjYXRlZCBTdXBlcmNlZGVkIGJ5IEpTUiAxNzMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxVbnNpZ25lZFNob3J0IHBhcnNlKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbSB4aXMsIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucyBvcHRpb25zKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiAoWG1sVW5zaWduZWRTaG9ydCkgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5wYXJzZSggeGlzLCB0eXBlLCBvcHRpb25zICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzKSB0aHJvd3Mgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb24sIG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgIHJldHVybiBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLm5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbSggeGlzLCB0eXBlLCBudWxsICk7IH0KKyAgICAgICAgCisgICAgICAgIC8qKiBSZXR1cm5zIGEgdmFsaWRhdGluZyBYTUxJbnB1dFN0cmVhbS4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgU3VwZXJjZWRlZCBieSBKU1IgMTczICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtIG5ld1ZhbGlkYXRpbmdYTUxJbnB1dFN0cmVhbShvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW0geGlzLCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgICByZXR1cm4gWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKS5uZXdWYWxpZGF0aW5nWE1MSW5wdXRTdHJlYW0oIHhpcywgdHlwZSwgb3B0aW9ucyApOyB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7IH0gLy8gTm8gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbGxvd2VkCisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS9zcmMveG1scHVibGljL29yZy9hcGFjaGUveG1sYmVhbnMvcGFja2FnZS5odG1sIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJmNzhjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHB1YmxpYy9vcmcvYXBhY2hlL3htbGJlYW5zL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDYwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKK1Byb3ZpZGVzIGNsYXNzZXMgZm9yIFhNTCBCZWFucyBzY2hlbWEsIGluZm9zZXQsIHhwYXRoLCBhbmQgeHF1ZXJ5IGhhbmRsaW5nLgorCis8cD4KK1RoZSBYTUwgQmVhbnMgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgWE1MIEJlYW5zIDxlbT5zY2hlbWEgY29tcGlsZXI8L2VtPi4KK1RoZSBzY2hlbWEgY29tcGlsZXIgcHJvZHVjZXMgWE1MIEJlYW4gY2xhc3NlcyB0aGF0IGV4dGVuZCBhbmQgaW50ZXJhY3QKK3dpdGggdGhlIGJhc2ljIFhNTCBCZWFuIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgaW4gdGhpcyBwYWNrYWdlLiAgSXQgaXMKK2Fsc28gcG9zc2libGUgdG8gdXNlIFhNTCBCZWFucyB3aXRob3V0IHRoZSBzY2hlbWEgY29tcGlsZXIgdG8gbWFuaXB1bGF0ZQorYW5kIHZhbGlkYXRlIFhNTCBpbiBhIGxhdGUtYm91bmQgd2F5ICh3aXRoIG5vIHR5cGVzLCBvciB3aXRoCitydW50aW1lLWxvYWRlZCB0eXBlcyBvbmx5KS4KKworPHA+CitUaGlzIHBhY2thZ2UgY29udGFpbnM6Cis8b2w+Cis8bGk+QWxsIHRoZSBidWlsdC1pbiBYTUwgQmVhbiBjbGFzc2VzIAorc3VjaCBhcyB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9LCB7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlfSwgYW5kCit7QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxJbnR9Cisob25lIGZvciBlYWNoIG9mIHRoZSAKKzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnVpbHQtaW4tZGF0YXR5cGVzIj40NiBidWlsdC1pbiBYTUwgU2NoZW1hIHR5cGVzPC9hPikuCis8bGk+U3VwcG9ydCBmb3IgZnVsbCBYTUwgaW5mb3NldCwgWFBhdGgsIGFuZCBYUXVlcnkKKyh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yfSwge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0I3NlbGVjdFBhdGh9IGFuZCByZWxhdGVkIG1ldGhvZHMpLgorPGxpPlN1cHBvcnQgZm9yIGNvbXB1dGF0aW9uIHVzaW5nIFhNTCBTY2hlbWEgZGF0YSB0eXBlcyAodmlhIGRhdGF0eXBlCitjbGFzc2VzIHN1Y2ggYXMge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuR0R1cmF0aW9ufSkuCis8bGk+U3VwcG9ydCBmb3Igd29ya2luZyB3aXRoIFhNTCBTY2hlbWEgdHlwZSBtZXRhZGF0YSBpdHNlbGYKKyh2aWEge0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0sIHtAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVTeXN0ZW19LCBhbmQgcmVsYXRlZCBjbGFzc2VzKS4KKzwvb2w+CisKKzxwPgorVGhlIHBsYWNlIHRvIGJlZ2luIHdoZW4gd29ya2luZyB3aXRoIHRoZSBYTUwgQmVhbnMgQVBJIGlzIHRoZSBmb2xsb3dpbmcKK2Z1bmRhbWVudGFsIGNsYXNzZXM6CisKKzxvbD4KKzxsaT57QGxpbmsgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3R9IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWE1MIEJlYW5zLgorPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdC5GYWN0b3J5fSBpcyB1c2VkIHRvIGxvYWQgYW5kIGNyZWF0ZSBYTUwgQmVhbiBpbnN0YW5jZXMuCitFYWNoIFhNTCBCZWFuIGNsYXNzIGhhcyBpdHMgb3duIG5lc3RlZCBmYWN0b3J5IGNsYXNzLgorPGxpPntAbGluayBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcn0gaXMgYW4gZWZmaWNpZW50IHRyZWV3YWxraW5nIEFQSSBmb3IgdGhlIGZ1bGwgWE1MIGluZm9zZXQuCis8bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZX0gaXMgdGhlIHR5cGUgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBYTUwgU2NoZW1hIHR5cGVzCis8bGk+e0BsaW5rIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnN9IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB1dGlsaXR5IGZ1bmN0aW9ucy4KKzwvb2w+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL1hNTC54c2QgYi92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS9YTUwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjUzN2MKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS9YTUwueHNkCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgorPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgorCisgPHhzOmFubm90YXRpb24+CisgIDx4czpkb2N1bWVudGF0aW9uPgorICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAorICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCisgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAKKyAgICAgICAgc3VpdGFibGUgZm9yIHVzZSBieQorICAgICAgICBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgeG1sOmJhc2UsIHhtbDpsYW5nIG9yIHhtbDpzcGFjZSBhdHRyaWJ1dGVzCisgICAgICAgIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgorCisgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCisgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgorICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuPgorICAgICAgICAgLiAuIC4KKyAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiLz4KKworICAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzCisgICAgICAgIG9yIHRoZSBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KKworICAgICAgICAmbHQ7dHlwZSAuIC4gLj4KKyAgICAgICAgIC4gLiAuCisgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8+CisKKyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQorICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphbm5vdGF0aW9uPgorICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCisgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgorICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKKyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KKyAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCisgICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCisgICBvZiB0aGlzIGRvY3VtZW50IGF0CisgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKKyAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KKyAgPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCisgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmF0dHJpYnV0ZT4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KKyAgPHhzOnNpbXBsZVR5cGU+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgorICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KKyAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+CisgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+CisgPC94czphdHRyaWJ1dGVHcm91cD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS93M2MteG1sLWxpY2Vuc2UuaHRtbCBiL3YxL3NyYy94bWxzY2hlbWEvc2NoZW1hL3czYy14bWwtbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGQzMWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc2NoZW1hL3NjaGVtYS93M2MteG1sLWxpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDExMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKyAgPHRpdGxlPlczQyBTb2Z0d2FyZSBMaWNlbnNlPC90aXRsZT4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iL1N0eWxlU2hlZXRzL2Jhc2UuY3NzIiAvPgorICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorIDwhLS0KK2gzI3ZlcnNpb24geyBtYXJnaW4tdG9wOiAtMC44ZW07fQorLS0+CisgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNGRkZGRkYiPgorCis8aDE+VzNDIFhNTCBOYW1lc3BhY2UgU2NoZW1hOiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiPmh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZDwvYT48L2gxPgorPGRsPgorICAgIDxkZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2lwci1ub3RpY2UiPkNvcHlyaWdodDwvYT4KKyAgICAgIKkgMjAwMSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkIFdpZGUgV2ViCisgICAgICBDb25zb3J0aXVtPC9hPiwgKDxhIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzCisgICAgICBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuZXJjaW0ub3JnLyI+RXVyb3BlYW4KKyAgICAgIFJlc2VhcmNoIENvbnNvcnRpdW0gZm9yIEluZm9ybWF0aWNzIGFuZCBNYXRoZW1hdGljczwvYT4sIDxhCisgICAgICBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cworICAgICAgUmVzZXJ2ZWQuIFRoaXMgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgPGEKKyAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPlczQzxzdXA+rjwvc3VwPgorICAgICAgU29mdHdhcmUgTGljZW5zZTwvYT4gWzFdIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICAgICAgPHA+WzFdIDxhCisgICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxLmh0bWwiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+PC9wPgorICAgIDwvZGQ+Cis8L2RsPgorCisKKzxoci8+CisKKzxoMT5XM0M8c3VwPq48L3N1cD4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPC9oMT4KKworPGgzIGlkPSJ2ZXJzaW9uIj48YQoraHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMSI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMTwvYT48L2gzPgorCis8cD5UaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCityZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZworbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKQorYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nCit0ZXJtcyBhbmQgY29uZGl0aW9ucy48L3A+CisKKzxwPlBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sJm5ic3A7Zm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uCitBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcKK21vZGlmaWNhdGlvbnM6PC9wPgorPG9sPgorICA8bGk+VGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZQorICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLjwvbGk+CisgIDxsaT5BbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMKKyAgICBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgdGhlIDxhCisgICAgaHJlZj0iY29weXJpZ2h0LXNvZnR3YXJlLXNob3J0LW5vdGljZS0yMDAyMTIzMS5odG1sIj5XM0MgU29mdHdhcmUgU2hvcnQKKyAgICBOb3RpY2U8L2E+IHNob3VsZCBiZSBpbmNsdWRlZCAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwgdGV4dCBpcyBwZXJtaXR0ZWQpCisgICAgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZS48L2xpPgorICA8bGk+Tm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUKKyAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCisgICAgd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pPC9saT4KKzwvb2w+CisKKzxwPlRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTCitNQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCitMSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUgorUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UKK0FOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy48L3A+CisKKzxwPkNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUgorRE9DVU1FTlRBVElPTi48L3A+CisKKzxwPlRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbgorYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KK3ByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZAorZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+CisKKzxwPjwvcD4KKworPHA+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9wPgorCis8cD5UaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uIERlY2VtYmVyIDMxCisyMDAyLiBUaGlzIHZlcnNpb24gcmVtb3ZlcyB0aGUgY29weXJpZ2h0IG93bmVyc2hpcCBub3RpY2Ugc3VjaCB0aGF0IHRoaXMKK2xpY2Vuc2UgY2FuIGJlIHVzZWQgd2l0aCBtYXRlcmlhbHMgb3RoZXIgdGhhbiB0aG9zZSBvd25lZCBieSB0aGUgVzNDLAorcmVmbGVjdHMgdGhhdCBFUkNJTSBpcyBub3cgYSBob3N0IG9mIHRoZSBXM0MsIGluY2x1ZGVzIHJlZmVyZW5jZXMgdG8gdGhpcworc3BlY2lmaWMgZGF0ZWQgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSwgYW5kIHJlbW92ZXMgdGhlIGFtYmlndW91cyBncmFudCBvZgorInVzZSIuIE90aGVyd2lzZSwgdGhpcyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAiPnByZXZpb3VzCit2ZXJzaW9uPC9hPiBhbmQgaXMgd3JpdHRlbiBzbyBhcyB0byBwcmVzZXJ2ZSB0aGUgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L2xpY2Vuc2UtbGlzdC5odG1sI0dQTENvbXBhdGlibGVMaWNlbnNlcyI+RnJlZQorU29mdHdhcmUgRm91bmRhdGlvbidzIGFzc2Vzc21lbnQgb2YgR1BMIGNvbXBhdGliaWxpdHk8L2E+IGFuZCA8YQoraHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9XM0MucGhwIj5PU0kncyBjZXJ0aWZpY2F0aW9uPC9hPgordW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvZG9jcy9kZWZpbml0aW9uLnBocCI+T3BlbiBTb3VyY2UKK0RlZmluaXRpb248L2E+LiBQbGVhc2Ugc2VlIG91ciA8YQoraHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRIj5Db3B5cmlnaHQgRkFRPC9hPiBmb3IKK2NvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYwordGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIKK3F1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gPGEKK2hyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZzwvYT4uPGJyIC8+CismbmJzcDs8L3A+Cis8YWRkcmVzcz4KKyAgSm9zZXBoIFJlYWdsZSAmbHQ7PGEKKyAgaHJlZj0ibWFpbHRvOnNpdGUtcG9saWN5QHczLm9yZyI+c2l0ZS1wb2xpY3lAdzMub3JnJmd0OzwvYT4KKzwvYWRkcmVzcz4KKworPHA+TGFzdCByZXZpc2VkIGJ5IFJlYWdsZSAkRGF0ZSQ8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0N1cnNvci5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTExOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3IuamF2YQpAQCAtMCwwICsxLDMzMTIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uWE1MQ2hhcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkdsb2JhbExvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3QuQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNhdmVyLlhtbElucHV0U3RyZWFtSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQXR0cjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQmVnaW47CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkN1cnNvckdvb2JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuR29vYmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Qcm9jaW5zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuWG1sbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuQ2hhbmdlU3RhbXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRG9jdW1lbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDdXJzb3IgaW1wbGVtZW50cyBYbWxDdXJzb3IsIENoYW5nZUxpc3RlbmVyCit7CisgICAgQ3Vyc29yICggUm9vdCByLCBTcGxheSBzICkgICAgICAgIHsgYXNzZXJ0IHMgIT0gbnVsbDsgX2RhdGEgPSBDdXJzb3JEYXRhLmdldE9uZSggciApOyBzZXQoIHMgKTsgfQorICAgIEN1cnNvciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKSB7IGFzc2VydCBzICE9IG51bGw7IF9kYXRhID0gQ3Vyc29yRGF0YS5nZXRPbmUoIHIgKTsgc2V0KCBzLCBwICk7IH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCk7CisgICAgfQorCisgICAgUm9vdCAgZ2V0Um9vdCAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRSb290KCk7IH0KKworICAgIFNwbGF5IGdldFNwbGF5ICggKSB7IHJldHVybiBfZGF0YS5fZ29vYmVyLmdldFNwbGF5KCk7IH0KKyAgICBpbnQgICBnZXRQb3MgICAoICkgeyByZXR1cm4gX2RhdGEuX2dvb2Jlci5nZXRQb3MoKTsgfQorICAgIAorICAgIHZvaWQgc2V0ICggU3BsYXkgcywgaW50IHAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBzLCBwICk7IH0KKyAgICB2b2lkIHNldCAoIFNwbGF5IHMgICAgICAgICkgeyBfZGF0YS5fZ29vYmVyLnNldCggcywgMCApOyB9CisgICAgdm9pZCBzZXQgKCBpbnQgcCAgICAgICAgICApIHsgX2RhdGEuX2dvb2Jlci5zZXQoIHAgKTsgfQorICAgIHZvaWQgc2V0ICggR29vYmVyIGcgICAgICAgKSB7IF9kYXRhLl9nb29iZXIuc2V0KCBnICk7IH0KKworICAgIGludCBnZXRQb3N0Q2NoICggKQorICAgIHsKKyAgICAgICAgaW50IHAgPSBnZXRQb3MoKTsKKworICAgICAgICBpZiAocCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgIAorICAgICAgICBpbnQgcGEgPSBzLmdldFBvc0FmdGVyKCk7CisKKyAgICAgICAgYXNzZXJ0IHAgPj0gcGEgfHwgcy5pc0xlYWYoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBwID49IHBhID8gcy5nZXRDY2hBZnRlcigpIC0gcCArIHBhIDogcy5nZXRQb3NMZWFmRW5kKCkgLSBwOworICAgIH0KKyAgICAKKyAgICBpbnQgZ2V0UHJlQ2NoICggKQorICAgIHsKKyAgICAgICAgLy8gVE9ETyAtIHF1aWNrIGFuZCBkaXJ0eSBpbXBsLCBpbXByb3ZlCisKKyAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOworICAgICAgICBpbnQgICBwT3JpZyA9IGdldFBvcygpOworCisgICAgICAgIGludCBuID0gdG9QcmV2Q2hhciggLTEgKTsKKworICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOworCisgICAgICAgIHJldHVybiBuOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEaXNwb3NlZCAoICkKKyAgICB7CisgICAgICAgIGNoZWNrRGlzcG9zZWQoIHRoaXMgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0Rpc3Bvc2VkICggQ3Vyc29yIGMgKQorICAgIHsKKyAgICAgICAgaWYgKGMuaXNEaXNwb3NlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkN1cnNvciBoYXMgYmVlbiBkaXNwb3NlZCIgKTsKKyAgICB9CisgICAgCisgICAgYm9vbGVhbiBpc0Rpc3Bvc2VkICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9kYXRhID09IG51bGw7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBYbWxDdXJzb3IgTWV0aG9kcworICAgIC8vCisKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc0Rpc3Bvc2VkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RhdGEucmVsZWFzZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBfZGF0YSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGdldE9iamVjdCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICBpZiAoIXMuaXNUeXBlYWJsZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgVHlwZSB0ID0gcy5nZXRUeXBlKCByICk7CisgICAgCisgICAgICAgICAgICBhc3NlcnQgdCAhPSBudWxsOworICAgIAorICAgICAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IHQuZ2V0WG1sT2JqZWN0KCk7CisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHRvQ3Vyc29yICggWG1sQ3Vyc29yIG1vdmVUbyApCisgICAgeworICAgICAgICBpZiAobW92ZVRvID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBjdXJzb3IiICk7CisKKyAgICAgICAgaWYgKG1vbml0b3IoKSA9PSBtb3ZlVG8ubW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b0N1cnNvckltcGwoIG1vdmVUbyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vdmVUby5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvQ3Vyc29ySW1wbCggbW92ZVRvICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gdG9DdXJzb3JJbXBsICggWG1sQ3Vyc29yIG1vdmVUbyApCisgICAgeworICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgIAorICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAobW92ZVRvIGluc3RhbmNlb2YgQ3Vyc29yKQorICAgICAgICB7CisgICAgICAgICAgICBjID0gKEN1cnNvcikgbW92ZVRvOworCisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCBjICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjLmdldFJvb3QoKSAhPSBnZXRSb290KCkpCisgICAgICAgICAgICAgICAgYyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgc2V0KCBjLl9kYXRhLl9nb29iZXIgKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFhtbERvY3VtZW50UHJvcGVydGllcyBkb2N1bWVudFByb3BlcnRpZXMgKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLmRvY3VtZW50UHJvcGVydGllcygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYbWxDdXJzb3IgbmV3Q3Vyc29yICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiB0b0Jvb2ttYXJrICggWG1sQm9va21hcmsgYm0gKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBpZiAoIShibS5fY3VycmVudE1hcmsgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgYm0uX2N1cnJlbnRNYXJrOworICAgIAorICAgICAgICAgICAgaWYgKGEuZ2V0Um9vdCgpICE9IGdldFJvb3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBhc3NlcnQgYS5nZXRTcGxheSgpICE9IG51bGw7CisgICAgCisgICAgICAgICAgICBzZXQoIGEgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYbWxCb29rbWFyayB0b05leHRCb29rbWFyayAoIE9iamVjdCBrZXkgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgaW50ICAgcE9yaWcgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IGN1cnJlbnRUb2tlblR5cGUoKTsKKyAgICAKKyAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIGN1cnNvciBwYXN0IHRoZSBjdXJyZW50IHNwb3QgYnkgdGhlIG1pbmltdW4gYW1vdW50CisgICAgCisgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9OZXh0Q2hhciggMSApOworICAgICAgICAgICAgICAgIHR0ID0gY3VycmVudFRva2VuVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHR0ID0gdG9OZXh0VG9rZW4oKSkuaXNOb25lKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgYm0gPSBnZXRCb29rbWFyaygga2V5ICk7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBibTsKKyAgICAKKyAgICAgICAgICAgICAgICBpbnQgcG9zdENjaDsKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkgJiYgKHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCkpID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgICAgICAgICAgICAgICAgIGludCAgIGQgPSBwb3N0Q2NoOworICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBzLm5leHRHb29iZXIoIGcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgbWFyazsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLmlzQW5ub3RhdGlvbigpICYmIChkaXN0ID0gZy5nZXRQb3MoKSAtIHApID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0IDwgZCAmJiAobWFyayA9IGcuZ2V0Qm9va21hcmsoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay5nZXRLZXkoKS5lcXVhbHMoIGtleSApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gbWFyazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCBwICsgZCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgodHQgPSB0b05leHRUb2tlbigpKS5pc05vbmUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNldCggc09yaWcsIHBPcmlnICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYbWxCb29rbWFyayB0b1ByZXZCb29rbWFyayAoIE9iamVjdCBrZXkgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgc09yaWcgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgaW50ICAgcE9yaWcgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IHByZXZUb2tlblR5cGUoKTsKKyAgICAKKyAgICAgICAgICAgIC8vIFJldHJlYXQgdGhlIGN1cnNvciBwYXN0IHRoZSBjdXJyZW50IHNwb3QgYnkgdGhlIG1pbmltdW4gYW1vdW50CisgICAgCisgICAgICAgICAgICBpZiAodHQuaXNUZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9QcmV2Q2hhciggMSApOworICAgICAgICAgICAgICAgIHR0ID0gcHJldlRva2VuVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodG9QcmV2VG9rZW4oKS5pc05vbmUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXQoIHNPcmlnLCBwT3JpZyApOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR0ID0gcHJldlRva2VuVHlwZSgpOworICAgIAorICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxCb29rbWFyayBibSA9IGdldEJvb2ttYXJrKCBrZXkgKTsKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOworICAgIAorICAgICAgICAgICAgICAgIGludCBwcmVDY2g7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKHR0LmlzVGV4dCgpICYmIChwcmVDY2ggPSBnZXRQcmVDY2goKSkgPiAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgczsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgcDsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFBvcygpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBnZXRTcGxheSgpLnByZXZOb25BdHRyU3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBzLmdldEVuZFBvcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gZ2V0UG9zKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGludCBkID0gcHJlQ2NoOworICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBzLm5leHRHb29iZXIoIGcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgbWFyazsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLmlzQW5ub3RhdGlvbigpICYmIChkaXN0ID0gcCAtIGcuZ2V0UG9zKCkpID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0IDwgZCAmJiAobWFyayA9IGcuZ2V0Qm9va21hcmsoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay5nZXRLZXkoKS5lcXVhbHMoIGtleSApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gbWFyazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoYm0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCBwIC0gZCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIGlmICh0dC5pc1RleHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRvUHJldkNoYXIoIC0xICk7CisgICAgICAgICAgICAgICAgICAgIHR0ID0gcHJldlRva2VuVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0b1ByZXZUb2tlbigpLmlzTm9uZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0KCBzT3JpZywgcE9yaWcgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHQgPSBwcmV2VG9rZW5UeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFRva2VuVHlwZSBjdXJyZW50VG9rZW5UeXBlICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5nZXRUb2tlblR5cGUoIGdldFBvcygpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGFydGRvYyAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCk7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZGRvYyAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzRW5kZG9jKCk7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0ICAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5kICAgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNFbmQoKTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dCAgICAgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNUZXh0KCk7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHIgICAgICAoICkgeyByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpLmlzQXR0cigpOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2UgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc05hbWVzcGFjZSgpOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50ICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0NvbW1lbnQoKTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2luc3QgICggKSB7IHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCkuaXNQcm9jaW5zdCgpOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0NvbnRhaW5lcigpOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2ggICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0ZpbmlzaCgpOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyICAgKCApIHsgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKS5pc0FueUF0dHIoKTsgfQorICAgIAorICAgIHB1YmxpYyBUb2tlblR5cGUgcHJldlRva2VuVHlwZSAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIC8vIFRPRE8gLSBxdWljayBhbmQgZGlydHkgaW1wbGVtZW50YXRpb24sIGltcHJvdmUKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHNPcmlnID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHBPcmlnID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBUb2tlblR5cGUgdHQ7CisgICAgCisgICAgICAgICAgICBpZiAodG9QcmV2Q2hhciggMSApID09IDEpCisgICAgICAgICAgICAgICAgdHQgPSBUb2tlblR5cGUuVEVYVDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCEodHQgPSB0b1ByZXZUb2tlbigpKS5pc05vbmUoKSkKKyAgICAgICAgICAgICAgICB0dCA9IGN1cnJlbnRUb2tlblR5cGUoKTsKKyAgICAKKyAgICAgICAgICAgIHNldCggc09yaWcsIHBPcmlnICk7CisgICAgCisgICAgICAgICAgICByZXR1cm4gdHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFRva2VuVHlwZSB0b05leHRUb2tlbiAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3BsYXkgb3MgPSBnZXRTcGxheSgpOyAvLyBPcmlnbmFsIHNwbGF5CisgICAgICAgICAgICBTcGxheSBzID0gb3M7CisgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBpZiAocCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzUm9vdCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7CisgICAgCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBMb29rIHNlZSBpZiB0aGVyZSBpcyBhbiBhdHRyIHdlIHNob3VsZCB2aXNpdCBiZWZvcmUgdmlzaXRpbmcKKyAgICAgICAgICAgICAgICAvLyBhbnkgZm9sbG93aW5nIGNvbnRlbnQgaW4gdGhpcyBjb250YWluZXIuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMubmV4dFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoIHQsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UncmUgZ29pbmcgaW50byB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRhaW5lci4gIEZsdXNoCisgICAgICAgICAgICAgICAgICAgIC8vIG91dCBhbnkgY2FjaGVkIHR5cGUgdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgCisgICAgICAgICAgICAgICAgICAgIHMuZW5zdXJlQ29udGVudFZhbGlkKCk7CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIGlmIChzLmdldE1heFBvcygpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIHAgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzUm9vdCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChwID49IHMuZ2V0UG9zQWZ0ZXIoKSAmJiBzLmdldENjaEFmdGVyKCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIHAgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPCBzLmdldFBvc0FmdGVyKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChwICE9IHMuZ2V0UG9zTGVhZkVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ2V0UG9zTGVhZkVuZCgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ2V0UG9zQWZ0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSB0cmFuc2l0aW9uaW5nIGZyb20gYW4gYXR0ciB0byBhIG5vbiBhdHRyLCBzZWUgaWYgdGhlcmUKKyAgICAgICAgICAgIC8vIGlzIGNvbnRlbnQgaW4gYSBET0Mgb3IgQkVHSU4gd2hpY2ggbmVlZHMgdG8gYmUgdmlzaXRlZCBhZnRlcgorICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQWxzbywgaWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBhbiBhdHRyIGNvbnRhaW5lciAoQkVHSU4gb3IKKyAgICAgICAgICAgIC8vIERPQykgdG8gYW4gYXR0ciwgd2hlcmUgdGhlIGF0dHIgY29udGFpbmVyIGhhcyBpbnRlcmlvciBjb250ZW50LAorICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbHJlYWR5IHZpc2l0ZWQgdGhlIGF0dHJzIGFuZCBtdXN0IHNraXAgdGhlbSBub3cuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQWxzbywgaWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBwb3MgMCB0byBwb3MgMSBvbiBhbiBhdHRyCisgICAgICAgICAgICAvLyBjb250YWluZXIsIHdlIG5lZWQgdG8gdmlzaXQgYW55IGF0dHJpYnV0ZXMgYmVmb3JlIHZpc2l0aW5nIHRoZQorICAgICAgICAgICAgLy8gaW50ZXJpb3IgY29udGVudCBvZiB0aGUgYXR0ciBjb250YWluZXIuCisgICAgICAgICAgICAvLworICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkgJiYgb3MuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTcGxheSB0ID0gb3MucHJldk5vbkF0dHJTcGxheSgpOworICAgIAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOworICAgIAorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBuYXZpZ2F0aW5nIHRvIHRoZSBjb250ZW50IG9mIGEgY29udGFpbmVyLiAgRmx1c2gKKyAgICAgICAgICAgICAgICAgICAgLy8gb3V0IGFueSBjYWNoZWQgdHlwZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHQuZW5zdXJlQ29udGVudFZhbGlkKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh0LmdldE1heFBvcygpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQXR0cigpICYmICFvcy5pc0F0dHIoKSAmJiBvcy5nZXRNYXhQb3MoKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgb3MuaXNDb250YWluZXIoKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dE5vbkF0dHJTcGxheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHNldCggcywgcCApOworICAgIAorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBUb2tlblR5cGUgdG9QcmV2VG9rZW4gKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAvLyBUT0RPIC0gVGhpcyBjb2RlIGlzIG5vdCBhcyBjb21wYWN0IGFzIGl0IGNhbiBiZSwgdGhlcmUgaXMgc29tZSByZWR1bmRhbmN5CisgICAgLy8gLS0gcmV0aGluayBpdCBsYXRlciAuLi4KKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOworICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMSAmJiBzLmlzSW52YWxpZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpOworICAgICAgICAgICAgICAgIHAgKz0gcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmIChwID09IDEgJiYgcy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBzLm5leHRTcGxheSgpOworICAgIAorICAgICAgICAgICAgICAgIGlmICh0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgKCB0ID0gdC5uZXh0U3BsYXkoKSA7IHQuaXNBdHRyKCkgOyB0ID0gdC5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gdDsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRva2VuVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmIChwID09IDAgJiYgIXMuaXNBdHRyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5OT05FOworICAgIAorICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBzLnByZXZTcGxheSgpOworICAgIAorICAgICAgICAgICAgICAgIGlmICh0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IHQucHJldk5vbkF0dHJTcGxheSgpOworICAgIAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdC5pc0NvbnRhaW5lcigpOworICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0RvYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgdC5lbnN1cmVDb250ZW50VmFsaWQoKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0TWF4UG9zKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENjaEFmdGVyKCkgPiAwID8gdC5nZXRQb3NBZnRlcigpIDogdC5nZXRNYXhQb3MoKSApOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmIChzLmlzQXR0cigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBwID09IDA7CisgICAgCisgICAgICAgICAgICAgICAgU3BsYXkgdCA9IHMucHJldlNwbGF5KCk7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKCF0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHQuaXNDb250YWluZXIoKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgc2V0KCB0LCAwICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7CisgICAgCisgICAgICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKKyAgICAKKyAgICAgICAgICAgICAgICBwID0gcy5nZXRDY2hBZnRlcigpID4gMCA/IHMuZ2V0UG9zQWZ0ZXIoKSA6IHMuZ2V0TWF4UG9zKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPiAwOworICAgICAgICAgICAgICAgIGFzc2VydCAhcy5pc1Jvb3QoKTsKKyAgICAKKyAgICAgICAgICAgICAgICBpbnQgcG9zQWZ0ZXIgPSBzLmdldFBvc0FmdGVyKCk7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKHAgPj0gcG9zQWZ0ZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgcCA9IHBvc0FmdGVyIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNWYWxpZCgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHAgPSBwID4gMSAmJiBwID09IHBvc0FmdGVyIC0gMSA/IDEgOiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHNldCggcywgcCApOworICAgIAorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUb2tlblR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydENoYXJzICggU3RyaW5nIHRleHQgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpIHx8IHMuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJJbnZhbGlkIGxvY2F0aW9uIGZvciB0ZXh0IiApOworICAgIAorICAgICAgICAgICAgICAgIHMgPSBzLnByZXZOb25BdHRyU3BsYXkoKTsKKyAgICAgICAgICAgICAgICBwID0gcy5nZXRFbmRQb3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgIAorICAgICAgICAgICAgaW50IGNjaCA9IHRleHQubGVuZ3RoKCk7CisgICAgCisgICAgICAgICAgICBpZiAoY2NoID4gMCkKKyAgICAgICAgICAgICAgICBzLmluc2VydENoYXJzKCBwLCBnZXRSb290KCksIHRleHQsIDAsIGNjaCApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUxvY2FsTmFtZSAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJRTmFtZSBpcyBudWxsIiApOworICAgICAgICAKKyAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTG9jYWxOYW1lICggU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOYW1lIGlzIG51bGwiICk7CisKKyAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOYW1lIGlzIGVtcHR5IiApOworCisgICAgICAgIGlmICghWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKCBuYW1lICkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiTmFtZSBpcyBub3QgdmFsaWQiICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVByZWZpeCAoIFN0cmluZyBuYW1lICkKKyAgICB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiUHJlZml4IGlzIG51bGwiICk7CisKKyAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggaXMgZW1wdHkiICk7CisKKyAgICAgICAgaWYgKFNwbGF5LmJlZ2luc1dpdGhYbWwoIG5hbWUgKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggYmVnaW5zIHdpdGggJ3htbCciICk7CisKKyAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWROQ05hbWUoIG5hbWUgKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcmVmaXggaXMgbm90IHZhbGlkIiApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnNlcnRBdHRyaWJ1dGUgKCBRTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQXR0ciggbmFtZSApLCB2YWx1ZSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBuYW1lLCBudWxsLCBudWxsICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0cmlidXRlICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkgKQorICAgIHsKKyAgICAgICAgaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBuYW1lLCB1cmksIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlICkKKyAgICB7CisgICAgICAgIGluc2VydEF0dHJpYnV0ZVdpdGhWYWx1ZSggbmFtZSwgbnVsbCwgdmFsdWUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKAorICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIHZhbHVlICkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBuYW1lICk7CisKKyAgICAgICAgaW5zZXJ0QXR0cmlidXRlKCBuZXcgUU5hbWUoIHVyaSwgbmFtZSApLCB2YWx1ZSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydEF0dHJpYnV0ZSAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUgKTsKKworICAgICAgICBpbnNlcnRBdHRyaWJ1dGUoIG5hbWUsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRBdHRyaWJ1dGVXaXRoVmFsdWUgKCBRTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUgKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVMb2NhbE5hbWUoIG5hbWUgKTsKKworICAgICAgICBpbnNlcnRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0TmFtZXNwYWNlICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCisgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHZhbGlkYXRlUHJlZml4KCBwcmVmaXggKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKKyAgICAKKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbWFwIGEgcHJlZml4IHRvIG5vIG5hbWVzcGFjZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICkgKSwgbnVsbCApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0Q29tbWVudCAoIFN0cmluZyB2YWx1ZSApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBpbnNlcnQoIG5ldyBDb21tZW50KCksIHZhbHVlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRQcm9jSW5zdCAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyB2YWx1ZSApCisgICAgeworICAgICAgICB2YWxpZGF0ZUxvY2FsTmFtZSggdGFyZ2V0ICk7IC8vIHVzZWQgYmVjdWFzZSAiPD94bWwuLi4/PiBpcyBkaXNhbGxvd2VkCisKKyAgICAgICAgaWYgKFNwbGF5LmJlZ2luc1dpdGhYbWwoIHRhcmdldCApICYmIHRhcmdldC5sZW5ndGgoKSA9PSAzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlRhcmdldCBiZWdpbnMgd2l0aCAneG1sJyIgKTsKKyAgICAKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaW5zZXJ0KCBuZXcgUHJvY2luc3QoIHRhcmdldCApLCB2YWx1ZSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFN0cmluZyBuYW1lICkKKyAgICB7CisgICAgICAgIGluc2VydEVsZW1lbnRXaXRoVGV4dCggbmFtZSwgbnVsbCwgbnVsbCApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdGV4dCApCisgICAgeworICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5hbWUsIG51bGwsIHRleHQgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRFbGVtZW50ICggU3RyaW5nIG5hbWUsIFN0cmluZyB1cmkgKQorICAgIHsKKyAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCB1cmksIG51bGwgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudCAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgaW5zZXJ0RWxlbWVudFdpdGhUZXh0KCBuYW1lLCBudWxsICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgaW5zZXJ0RWxlbWVudCggbmFtZSApOworICAgICAgICB0b1ByZXZUb2tlbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBiZWdpbkVsZW1lbnQgKCBTdHJpbmcgbmFtZSApCisgICAgeworICAgICAgICBpbnNlcnRFbGVtZW50KCBuYW1lICk7CisgICAgICAgIHRvUHJldlRva2VuKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGJlZ2luRWxlbWVudCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpICkKKyAgICB7CisgICAgICAgIGluc2VydEVsZW1lbnQoIG5hbWUsIHVyaSApOworICAgICAgICB0b1ByZXZUb2tlbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFFOYW1lIG5hbWUsIFN0cmluZyB0ZXh0ICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgCisgICAgICAgICAgICBCZWdpbiBiID0gbmV3IEJlZ2luKCBuYW1lLCBudWxsICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGIudG9nZ2xlSXNMZWFmKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGluc2VydCggYiwgdGV4dCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGluc2VydEVsZW1lbnRXaXRoVGV4dCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdXJpLCBTdHJpbmcgdGV4dCApCisgICAgeworICAgICAgICBpbnNlcnRFbGVtZW50V2l0aFRleHQoIG5ldyBRTmFtZSggdXJpLCBuYW1lICksIHRleHQgKTsKKyAgICB9CisKKyAgICB2b2lkIGluc2VydCAoIFNwbGF5IHNJbnNlcnQsIFN0cmluZyB2YWx1ZSApCisgICAgeworICAgICAgICBhc3NlcnQgIWlzRGlzcG9zZWQoKTsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNJbnNlcnQuZ2V0Um9vdFNsb3coKSA9PSBudWxsOworICAgICAgICBhc3NlcnQgc0luc2VydC5nZXRDY2goKSA9PSAwOworCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgc0luc2VydC5hZGp1c3RDY2goIHZhbHVlLmxlbmd0aCgpICk7CisKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKworICAgICAgICBzSW5zZXJ0LmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHMsIHAsIGZhbHNlICk7CisKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICBzLmluc2VydCggZ2V0Um9vdCgpLCBwLCBzSW5zZXJ0LCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCksIHRydWUgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy5pbnNlcnQoIGdldFJvb3QoKSwgcCwgc0luc2VydCwgbnVsbCwgMCwgMCwgdHJ1ZSApOworCisgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dFZhbHVlICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8IHMuaXNGaW5pc2goKSB8fCBzLmlzWG1sbnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRleHQoIGdldFJvb3QoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUZXh0VmFsdWUgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKKyAgICB7CisvLyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKy8vICAgIAorLy8gICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKy8vICAgIAorLy8gICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8IHMuaXNGaW5pc2goKSB8fCBzLmlzWG1sbnMoKSkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKy8vICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHRleHQgdmFsdWUsIGN1cnJlbnQgdG9rZW4gY2FuIGhhdmUgbm8gdGV4dCB2YWx1ZSIgKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgCisvLyAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldFRleHQoIGdldFJvb3QoKSApOworLy8gICAgICAgIH0KKworICAgICAgICAvLyBIYWNrIGltcGwgZm9yIG5vdworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHMgPSBnZXRUZXh0VmFsdWUoKTsKKworICAgICAgICBpbnQgbiA9IHMubGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKG4gPiBjY2gpCisgICAgICAgICAgICBuID0gY2NoOworCisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBzLmdldENoYXJzKCAwLCBuLCBidWYsIG9mZiApOworCisgICAgICAgIHJldHVybiBuOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0VmFsdWUgKCBTdHJpbmcgdGV4dCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChwID4gMCB8fCBzLmlzWG1sbnMoKSB8fCBzLmlzRmluaXNoKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB0ZXh0IHZhbHVlLCBjdXJyZW50IHRva2VuIGNhbiBoYXZlIG5vIHRleHQgdmFsdWUiICk7CisgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICBzLnNldFRleHQoIGdldFJvb3QoKSwgdGV4dCwgMCwgdGV4dCA9PSBudWxsID8gMCA6IHRleHQubGVuZ3RoKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZSAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBsZW4gKQorICAgIHsKKyAgICAgICAgc2V0VGV4dFZhbHVlKCBTdHJpbmcuY29weVZhbHVlT2YoIGJ1Ziwgb2ZmLCBsZW4gKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJzICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaW50IGNjaCA9IC0xOworICAgIAorICAgICAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCk7CisgICAgCisgICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQorICAgICAgICAgICAgICAgIGNjaCA9IHBvc3RDY2g7CisgICAgCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIGdldFNwbGF5KCkuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgZ2V0UG9zKCkgKSwgY2NoICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENoYXJzICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBpbnQgcG9zdENjaCA9IGdldFBvc3RDY2goKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IHBvc3RDY2gpCisgICAgICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKKyAgICAKKyAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBvZmYgPj0gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAgICAgICAgIGlmIChidWYubGVuZ3RoIC0gb2ZmIDwgY2NoKQorICAgICAgICAgICAgICAgIGNjaCA9IGJ1Zi5sZW5ndGggLSBvZmY7CisgICAgCisgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgYnVmLCBvZmYsIGdldFNwbGF5KCkuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgZ2V0UG9zKCkgKSwgY2NoICk7CisgICAgCisgICAgICAgICAgICByZXR1cm4gY2NoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9va21hcmsgKCBYbWxCb29rbWFyayBhbm5vdGF0aW9uICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgIAorICAgICAgICAgICAgY2xlYXJCb29rbWFyayggYW5ub3RhdGlvbi5nZXRLZXkoKSApOworICAgIAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhID0gbmV3IEFubm90YXRpb24oIGdldFJvb3QoKSwgYW5ub3RhdGlvbiApOworICAgIAorICAgICAgICAgICAgaWYgKGEuX2tleSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBbm5vdGF0aW9uIGtleSBpcyBudWxsIiApOworICAgIAorICAgICAgICAgICAgYS5zZXQoIF9kYXRhLl9nb29iZXIgKTsKKyAgICAgICAgICAgIGFubm90YXRpb24uX2N1cnJlbnRNYXJrID0gYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoIE9iamVjdCBrZXkgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBzLm5leHRHb29iZXIoIGcgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFNwbGF5LkFOTk9UQVRJT04gJiYgZy5nZXRQb3MoKSA9PSBwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhID0gKEFubm90YXRpb24pIGc7CisgICAgCisgICAgICAgICAgICAgICAgICAgIFhtbEJvb2ttYXJrIHhhID0gYS5nZXRYbWxCb29rbWFyaygpOworICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoeGEgIT0gbnVsbCAmJiBhLl9rZXkuZXF1YWxzKCBrZXkgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyQm9va21hcmsgKCBPYmplY3Qga2V5ICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IHMubmV4dEdvb2JlciggZyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gU3BsYXkuQU5OT1RBVElPTiAmJiBnLmdldFBvcygpID09IHApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZzsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgWG1sQm9va21hcmsgeGEgPSBhLmdldFhtbEJvb2ttYXJrKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICh4YSAhPSBudWxsICYmIGEuX2tleS5lcXVhbHMoIGtleSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggbnVsbCwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0QWxsQm9va21hcmtSZWZzICggQ29sbGVjdGlvbiBsaXN0VG9GaWxsICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChsaXN0VG9GaWxsID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBzLm5leHRHb29iZXIoIGcgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFNwbGF5LkFOTk9UQVRJT04gJiYgZy5nZXRQb3MoKSA9PSBwKQorICAgICAgICAgICAgICAgICAgICBsaXN0VG9GaWxsLmFkZCggKChBbm5vdGF0aW9uKSBnKS5nZXRYbWxCb29rbWFyaygpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0VG9rZW4gKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBhc3NlcnQgIWdldFNwbGF5KCkuaXNSb290KCkgfHwgZ2V0UG9zKCkgPT0gMDsKKyAgICAgICAgICAgIHJldHVybiAhZ2V0U3BsYXkoKS5pc1Jvb3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZUb2tlbiAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKworICAgICAgICAgICAgcmV0dXJuICFnZXRTcGxheSgpLmlzRG9jKCkgfHwgZ2V0UG9zKCkgPiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFFOYW1lIGdldE5hbWUgKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKKyAgICAgICAgICAgIGNhc2UgU3BsYXkuQVRUUiA6CisgICAgICAgICAgICBjYXNlIFNwbGF5LlBST0NJTlNUIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBRTmFtZSBuYW1lICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk5hbWUgaXMgbnVsbCIgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIShzLmlzQmVnaW4oKSB8fCBzLmlzQXR0cigpIHx8IHMuaXNQcm9jaW5zdCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCBuYW1lIGhlcmU6ICIgKyBjdXJyZW50VG9rZW5UeXBlKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmIChzLmlzUHJvY2luc3QoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVByZWZpeCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOworICAgIAorICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jaW5zdCBuYW1lIG11c3QgaGF2ZSBubyBVUkkiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocy5pc1htbG5zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVByZWZpeCggbmFtZS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgCisgICAgICAgICAgICBzLnNldE5hbWUoIGdldFJvb3QoKSwgbmFtZSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgdG9OZXh0Q2hhciAoIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBpbnQgbWF4Q2NoID0gZ2V0UG9zdENjaCgpOworICAgIAorICAgICAgICAgICAgaWYgKG1heENjaCA9PSAwIHx8IGNjaCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gbWF4Q2NoKQorICAgICAgICAgICAgICAgIGNjaCA9IG1heENjaDsKKyAgICAKKyAgICAgICAgICAgIGFzc2VydCBwICsgY2NoIDw9IHMuZ2V0RW5kUG9zKCk7CisgICAgCisgICAgICAgICAgICBpZiAocCArIGNjaCA9PSBzLmdldEVuZFBvcygpKQorICAgICAgICAgICAgICAgIHRvTmV4dFRva2VuKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0KCBwICsgY2NoICk7CisgICAgCisgICAgICAgICAgICByZXR1cm4gY2NoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCB0b1ByZXZDaGFyICggaW50IGNjaCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHNUZXh0ID0gczsgIC8vIFRoZSBzcGxheSBhbmQgcG9zIHdoZXJlIHRoZSB0ZXh0IGV4aXN0cworICAgICAgICAgICAgaW50ICAgcFRleHQgPSBwOworICAgICAgICAgICAgaW50ICAgbWF4Q2NoID0gMDsgLy8gTWF4IGNoYXJzIHRvIG1vdmUgb3ZlcgorICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXMuaXNEb2MoKSAmJiAhcy5pc0F0dHIoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNUZXh0ID0gcy5wcmV2Tm9uQXR0clNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIHBUZXh0ID0gc1RleHQuZ2V0RW5kUG9zKCk7CisgICAgICAgICAgICAgICAgICAgIG1heENjaCA9IHNUZXh0LmdldENjaEFmdGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocy5pc0xlYWYoKSAmJiBwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBkQ2NoID0gcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKKyAgICAgICAgICAgICAgICBwICs9IGRDY2g7CisgICAgICAgICAgICAgICAgcFRleHQgPSBwOworICAgICAgICAgICAgICAgIG1heENjaCA9IHAgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1heENjaCA9IHAgLSBzLmdldFBvc0FmdGVyKCk7CisgICAgCisgICAgICAgICAgICBhc3NlcnQgcFRleHQgPD0gc1RleHQuZ2V0RW5kUG9zKCk7CisgICAgCisgICAgICAgICAgICBpZiAobWF4Q2NoID09IDAgfHwgY2NoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBtYXhDY2gpCisgICAgICAgICAgICAgICAgY2NoID0gbWF4Q2NoOworICAgIAorICAgICAgICAgICAgc2V0KCBzVGV4dCwgcFRleHQgLSBjY2ggKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiBjY2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b0VuZERvYyAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIHNldCggZ2V0Um9vdCgpLCAwICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b1N0YXJ0RG9jICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgc2V0KCBnZXRSb290KCkuX2RvYywgMCApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRva2VuVHlwZSB0b0ZpcnN0Q29udGVudFRva2VuICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwIHx8ICFzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5OT05FOworICAgIAorICAgICAgICAgICAgcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChzLmdldENjaCgpID4gMCB8fCBzLmlzTGVhZigpKQorICAgICAgICAgICAgICAgIHNldCggMSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNldCggcy5uZXh0Tm9uQXR0clNwbGF5KCksIDAgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVG9rZW5UeXBlIHRvRW5kVG9rZW4gKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW5UeXBlLk5PTkU7CisgICAgCisgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSkKKyAgICAgICAgICAgICAgICBzZXQoIHMuZ2V0UG9zTGVhZkVuZCgpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0KCBzLmdldEZpbmlzaFNwbGF5KCkgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50VG9rZW5UeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0b1BhcmVudCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOworICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCAmJiBzLmlzRG9jKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgc2V0KCBzLmdldENvbnRhaW5lciggcCApLCAwICk7CisgICAgCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHAgPSBnZXRQb3MoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChwID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNEb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKS5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSAmJiBwIDw9IHMuZ2V0UG9zTGVhZkVuZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBmb3IgKCA7ICFzLmlzQmVnaW4oKSA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBzZXQoIHMsIDAgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2libGluZyAoIFN0cmluZyBuYW1lICkKKyAgICB7CisgICAgICAgIHJldHVybiB0b05leHRTaWJsaW5nKCBuZXcgUU5hbWUoIG5hbWUgKSApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSApCisgICAgeworICAgICAgICByZXR1cm4gdG9OZXh0U2libGluZyggbmV3IFFOYW1lKCBuYW1lc3BhY2UsIG5hbWUgKSApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvTmV4dFNpYmxpbmcgKCBRTmFtZSBuYW1lICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghdG9OZXh0U2libGluZygpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAoZ2V0TmFtZSgpLmVxdWFscyggbmFtZSApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gdG9QcmV2U2libGluZyAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOworICAgIAorICAgICAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0RvYygpIHx8IHMuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgICAgICBzID0gcy5wcmV2U3BsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDA7CisgICAgCisgICAgICAgICAgICAgICAgaWYgKHMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA8PSBzLmdldFBvc0xlYWZFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoIDAgKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzRW5kKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzID0gcy5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIGlmIChzLmlzTGVhZigpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAocy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBzZXQoIHMsIDAgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTcGxheSBnZXRTdGFydCAoICkKKyAgICB7CisgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSB8fCBnZXRQb3MoKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwdXNoKCk7CisKKyAgICAgICAgICAgIGlmICh0b05leHRTaWJsaW5nKCkpCisgICAgICAgICAgICAgICAgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcyA9IG51bGw7CisKKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdG9GaXJzdENoaWxkICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIChRTmFtZSkgbnVsbCApOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGQgKCBTdHJpbmcgbmFtZSApCisgICAgeworICAgICAgICByZXR1cm4gdG9DaGlsZCggbmV3IFFOYW1lKCBuYW1lICkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvQ2hpbGQoIG5ldyBRTmFtZSggbmFtZXNwYWNlLCBuYW1lICkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0b0NoaWxkICggUU5hbWUgbmFtZSApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbiggZ2V0U3RhcnQoKSwgbmFtZSwgbnVsbCwgMCApOworICAgIAorICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBzZXQoIHMsIDAgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIGludCBuICkKKyAgICB7CisgICAgICAgIHJldHVybiB0b0NoaWxkKCBudWxsLCBuICk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZCAoIFFOYW1lIG5hbWUsIGludCBuICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRSb290KCkuZmluZE50aEJlZ2luKCBnZXRTdGFydCgpLCBuYW1lLCBudWxsLCBuICk7CisgICAgCisgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIHNldCggcywgMCApOworICAgIAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0b0xhc3RDaGlsZCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHNPcmlnaW5hbCA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwT3JpZ2luYWwgPSBnZXRQb3MoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzT3JpZ2luYWwuaXNDb250YWluZXIoKSB8fCBwT3JpZ2luYWwgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRvTmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYgKCF0b0VuZFRva2VuKCkuaXNOb25lKCkgJiYgdG9QcmV2U2libGluZygpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB0b0ZpcnN0QXR0cmlidXRlICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgU3BsYXkgc09yaWdpbmFsID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgIGludCAgIHBPcmlnaW5hbCA9IGdldFBvcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXNPcmlnaW5hbC5pc0NvbnRhaW5lcigpIHx8IHBPcmlnaW5hbCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBzT3JpZ2luYWwubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHNldCggc09yaWdpbmFsLCBwT3JpZ2luYWwgKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvTGFzdEF0dHJpYnV0ZSAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHNPcmlnaW5hbCA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwT3JpZ2luYWwgPSBnZXRQb3MoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzT3JpZ2luYWwuaXNDb250YWluZXIoKSB8fCBwT3JpZ2luYWwgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBTcGxheSBsYXN0Tm9ybWFsQXR0ciA9IG51bGw7CisgICAgCisgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gc09yaWdpbmFsLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKKyAgICAgICAgICAgICAgICAgICAgbGFzdE5vcm1hbEF0dHIgPSBzOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYgKGxhc3ROb3JtYWxBdHRyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0KCBsYXN0Tm9ybWFsQXR0ciwgMCApOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgc2V0KCBzT3JpZ2luYWwsIHBPcmlnaW5hbCApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdG9OZXh0QXR0cmlidXRlICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgZm9yICggcyA9IHMubmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0KCBzLCAwICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHRvUHJldkF0dHJpYnV0ZSAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgIAorICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIGZvciAoIHMgPSBzLnByZXZTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLnByZXZTcGxheSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNldCggcywgMCApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVRleHQgKCBRTmFtZSBhdHRyTmFtZSApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXR0ciBuYW1lIGlzIG51bGwiICk7CisgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCkuZ2V0QXR0ciggYXR0ck5hbWUgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiBzID09IG51bGwgPyBudWxsIDogcy5nZXRUZXh0KCBnZXRSb290KCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNldEF0dHJpYnV0ZVRleHQgKCBRTmFtZSBhdHRyTmFtZSwgU3RyaW5nIHZhbHVlICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJBdHRyIG5hbWUgaXMgbnVsbCIgKTsKKyAgICAKKyAgICAgICAgICAgIHZhbGlkYXRlTG9jYWxOYW1lKCBhdHRyTmFtZS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZ2V0UG9zKCkgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgIAorICAgICAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAKKyAgICAgICAgICAgIHMgPSBnZXRTcGxheSgpLmdldEF0dHIoIGF0dHJOYW1lICk7CisgICAgCisgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7CisgICAgCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBhdHRyIGF0IHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIGMuaXNBbnlBdHRyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGMuaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCBhdHRyTmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMuc2V0VGV4dCggZ2V0Um9vdCgpLCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCkgKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlICggUU5hbWUgYXR0ck5hbWUgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkF0dHIgbmFtZSBpcyBudWxsIiApOworICAgIAorICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBhdHRyTmFtZSApOworICAgIAorICAgICAgICAgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHMucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKKyAgICAKKyAgICAgICAgICAgICAgICByZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCByZW1vdmVDaGFycyAoIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaW50IHBvc3RDY2ggPSBnZXRQb3N0Q2NoKCk7CisgICAgCisgICAgICAgICAgICBpZiAocG9zdENjaCA9PSAwIHx8IGNjaCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIAorICAgICAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gcG9zdENjaCkKKyAgICAgICAgICAgICAgICBjY2ggPSBwb3N0Q2NoOworICAgIAorICAgICAgICAgICAgcmV0dXJuIGdldFNwbGF5KCkucmVtb3ZlQ2hhcnMoIGdldFJvb3QoKSwgZ2V0UG9zKCksIGNjaCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgbW92ZUNoYXJzICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCisgICAgeworICAgICAgICBpZiAoZHN0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAobW9uaXRvcigpID09IGRzdC5tb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVDaGFyc0ltcGwoIGNjaCwgZHN0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZHN0Lm1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW92ZUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IG1vdmVDaGFyc0ltcGwgKCBpbnQgY2NoLCBYbWxDdXJzb3IgZHN0ICkKKyAgICB7CisgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKworICAgICAgICBpZiAoZHN0ID09IG51bGwgfHwgIShkc3QgaW5zdGFuY2VvZiBDdXJzb3IpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkludmFsaWQgZGVzdGluYXRpb24gY3Vyc29yIiApOworCisgICAgICAgIEN1cnNvciBjRHN0ID0gKEN1cnNvcikgZHN0OworCisgICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKKworICAgICAgICBSb290ICByRHN0ID0gY0RzdC5nZXRSb290KCk7CisgICAgICAgIFNwbGF5IHNEc3QgPSBjRHN0LmdldFNwbGF5KCk7CisgICAgICAgIGludCAgIHBEc3QgPSBjRHN0LmdldFBvcygpOworCisgICAgICAgIGlmIChwRHN0ID09IDAgJiYgKHNEc3QuaXNEb2MoKSB8fCBzRHN0LmlzQXR0cigpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIiApOworCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgZ2V0U3BsYXkoKS5tb3ZlQ2hhcnMoCisgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRQb3MoKSwgY2NoLCByRHN0LCBzRHN0LCBwRHN0LCBmYWxzZSApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29weUNoYXJzICggaW50IGNjaCwgWG1sQ3Vyc29yIGRzdCApCisgICAgeworICAgICAgICBpZiAoZHN0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiRGVzdGluYXRpb24gaXMgbnVsbCIgKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkc3QubW9uaXRvcigpID09IG1vbml0b3IoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29weUNoYXJzSW1wbCggY2NoLCBkc3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBjY2gsIGRzdCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgY29weUNoYXJzSW1wbCAoIGludCBjY2gsIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworCisgICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBjdXJzb3IiICk7CisKKyAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7CisKKyAgICAgICAgY2hlY2tEaXNwb3NlZCggY0RzdCApOworCisgICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKKyAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKKyAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7CisKKyAgICAgICAgaWYgKHBEc3QgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNEc3QuaXNEb2MoKSB8fCBzRHN0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJJbnZhbGlkIGRlc3RpbmF0aW9uIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBzRHN0ID0gc0RzdC5wcmV2Tm9uQXR0clNwbGF5KCk7CisgICAgICAgICAgICBwRHN0ID0gc0RzdC5nZXRFbmRQb3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgZ2V0U3BsYXkoKS5jb3B5Q2hhcnMoIGdldFJvb3QoKSwgZ2V0UG9zKCksIGNjaCwgckRzdCwgc0RzdCwgcERzdCApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTm90IG9uIGEgY29udGFpbmVyIiApOworICAgIAorICAgICAgICAgICAgcmV0dXJuIHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXgsIHRydWUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJlZml4Rm9yTmFtZXNwYWNlICggU3RyaW5nIG5zICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChucyA9PSBudWxsIHx8IG5zLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIk11c3Qgc3BlY2lmeSBhIG5hbWVzcGFjZSIgKTsKKyAgICAKKyAgICAgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgIAorICAgICAgICAgICAgaWYgKGdldFBvcygpID4gMCB8fCAhcy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJOb3Qgb24gYSBjb250YWluZXIiICk7CisgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcy5wcmVmaXhGb3JOYW1lc3BhY2UoIGdldFJvb3QoKSwgbnMsIG51bGwsIHRydWUpOworCisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRBbGxOYW1lc3BhY2VzICggTWFwIGFkZFRvVGhpcyApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChnZXRQb3MoKSA+IDAgfHwgIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTm90IG9uIGEgY29udGFpbmVyIiApOworICAgIAorICAgICAgICAgICAgLy8gRG8gdGhpcyB3aXRoIGN1cnNvciBmb3Igbm93Li4uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFhtbEN1cnNvciBjID0gbmV3Q3Vyc29yKCk7CisgICAgCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBjLmlzQ29udGFpbmVyKCk7CisgICAgCisgICAgICAgICAgICAgICAgUU5hbWUgY05hbWUgPSBjLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB3aGlsZSAoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgJiYgYy5pc0FueUF0dHIoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYy5pc05hbWVzcGFjZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpICAgID0gYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIEkgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgd2hpY2ggaXMgbm90IGVtcHR5IG9uIGEgbm9uIHJvb3QgY29udGFpbmVyIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpbiBhIG5hbWVzcGFjZS4gIFRoaXMgdGhpcyBjYXNlLCBJIGRvIG5vdCB3YW50IHRvIGFkZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtYXBwaW5nIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIHBlcnNpc3RlZCBvdXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LgorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDAgJiYgdXJpLmxlbmd0aCgpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjTmFtZSAhPSBudWxsICYmIGNOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpPjApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZFRvVGhpcy5jb250YWluc0tleSggcHJlZml4ICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9UaGlzLnB1dCggcHJlZml4LCB1cmkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBjLnRvUGFyZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoIGMudG9QYXJlbnQoKSApOworICAgIAorICAgICAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuczoKKyAgICAgKgorICAgICAqICAgLTEgaXMgdGhpcyBpcyBsZWZ0IG9mIHRoYXQKKyAgICAgKiAgICAwIGlzIHRoaXMgaXMgbGVmdCBpcyBhdCBzYW1lIHBvc2l0aW9uIGFzIHRoYXQKKyAgICAgKiAgICAxIGlzIHRoaXMgaXMgcmlnaHQgb2YgdGhhdAorICAgICAqLworCisgICAgcHVibGljIGludCBjb21wYXJlUG9zaXRpb24gKCBYbWxDdXJzb3IgeHRoYXQgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoeHRoYXQgPT0gbnVsbCB8fCAhKHh0aGF0IGluc3RhbmNlb2YgQ3Vyc29yKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiSW52YWxpZCB0aGF0IGN1cnNvciIgKTsKKyAgICAKKyAgICAgICAgICAgIEN1cnNvciB0aGF0ID0gKEN1cnNvcikgeHRoYXQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChyICE9IHRoYXQuZ2V0Um9vdCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDdXJzb3JzIG5vdCBpbiBzYW1lIGRvY3VtZW50IiApOworICAgIAorICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCggdGhhdCApOworICAgIAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZ2V0U3BsYXkoKS5jb21wYXJlKCByLCBnZXRQb3MoKSwgdGhhdC5nZXRTcGxheSgpLCB0aGF0LmdldFBvcygpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWZ0T2YgKCBYbWxDdXJzb3IgdGhhdCApCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPCAwOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0U2FtZVBvc2l0aW9uQXMgKCBYbWxDdXJzb3IgdGhhdCApCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9uKCB0aGF0ICkgPT0gMDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNSaWdodE9mICggWG1sQ3Vyc29yIHRoYXQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVQb3NpdGlvbiggdGhhdCApID4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0gKCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBuZXcgU2F2ZXIuSW5wdXRTdHJlYW1TYXZlcigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXdJbnB1dFN0cmVhbSggbnVsbCApOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkZXIgbmV3UmVhZGVyICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ld1JlYWRlciggbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUmVhZGVyIG5ld1JlYWRlciAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZXIuVGV4dFJlYWRlciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucyApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYTUxJbnB1dFN0cmVhbSBuZXdYTUxJbnB1dFN0cmVhbSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIG5ldyBYbWxJbnB1dFN0cmVhbUltcGwoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksIG9wdGlvbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgWE1MSW5wdXRTdHJlYW0gbmV3WE1MSW5wdXRTdHJlYW0gKCApCisgICAgeworICAgICAgICByZXR1cm4gbmV3WE1MSW5wdXRTdHJlYW0oIG51bGwgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBfdG9TdHJpbmdPcHRpb25zID0KKyAgICAgICAgYnVpbGRQcmV0dHlPcHRpb25zKCk7CisKKyAgICBzdGF0aWMgZmluYWwgWG1sT3B0aW9ucyBidWlsZFByZXR0eU9wdGlvbnMgKCApCisgICAgeworICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVCApOworICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApOworICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5TQVZFX1VTRV9ERUZBVUxUX05BTUVTUEFDRSApOworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggICkKKyAgICB7CisgICAgICAgIHJldHVybiB4bWxUZXh0KCBfdG9TdHJpbmdPcHRpb25zICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgeG1sVGV4dCAoICApCisgICAgeworICAgICAgICByZXR1cm4geG1sVGV4dCggbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHhtbFRleHQgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgU2F2ZXIuVGV4dFNhdmVyIHNhdmVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNhdmVyID0gbmV3IFNhdmVyLlRleHRTYXZlcigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucywgbnVsbCApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYXZlci5zYXZlVG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ2hhbmdlU3RhbXBJbXBsIGltcGxlbWVudHMgQ2hhbmdlU3RhbXAKKyAgICB7CisgICAgICAgIENoYW5nZVN0YW1wSW1wbCAoIFJvb3QgciApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yb290ID0gcjsKKyAgICAgICAgICAgIF92ZXJzaW9uU3RhbXAgPSBfcm9vdC5nZXRWZXJzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3ZlcnNpb25TdGFtcCAhPSBfcm9vdC5nZXRWZXJzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIFJvb3QgX3Jvb3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBfdmVyc2lvblN0YW1wOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2hhbmdlU3RhbXAgZ2V0RG9jQ2hhbmdlU3RhbXAgKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTdGFtcEltcGwoIGdldFJvb3QoKSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZVhtbCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICBpbnQgICBwID0gZ2V0UG9zKCk7CisgICAgCisgICAgICAgICAgICBhc3NlcnQgcCA8IHMuZ2V0RW5kUG9zKCk7CisgICAgCisgICAgICAgICAgICBpZiAocCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkgJiYgcCA9PSBzLmdldFBvc0xlYWZFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgICAgIGludCBjY2hSZW1vdmUgPSByZW1vdmVDaGFycyggZ2V0UG9zdENjaCgpICk7CisgICAgCisgICAgICAgICAgICAgICAgYXNzZXJ0IGNjaFJlbW92ZSA+IDA7CisgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzLmlzRG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCByZW1vdmUgYSB3aG9sZSBkb2N1bWVudC4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzLmlzRmluaXNoKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgICAgICAgICAgcy5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOworICAgIAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gbW92ZVhtbCAoIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7CisgICAgICAgIAorICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxJbXBsKCBkc3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3ZlWG1sSW1wbCAoIGRzdCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1vdmVYbWxJbXBsICAoIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsIHx8ICEoZHN0IGluc3RhbmNlb2YgQ3Vyc29yKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cKKyAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbW92ZSB0byBhIGZvcmVpZ24gZG9jdW1lbnQiICk7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBDdXJzb3IgY0RzdCA9IChDdXJzb3IpIGRzdDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNoZWNrRGlzcG9zZWQoIGNEc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFJvb3QgIHJEc3QgPSBjRHN0LmdldFJvb3QoKTsKKyAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKKyAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7CisgICAgICAgICAgICAKKyAgICAgICAgUm9vdCAgclNyYyA9IGdldFJvb3QoKTsKKyAgICAgICAgU3BsYXkgc1NyYyA9IGdldFNwbGF5KCk7CisgICAgICAgIGludCAgIHBTcmMgPSBnZXRQb3MoKTsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoc1NyYy5jaGVja0luc2VydGlvblZhbGlkaXR5KCBwU3JjLCBzRHN0LCBwRHN0LCB0cnVlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNTcmMubW92ZUNoYXJzKAorICAgICAgICAgICAgICAgICAgICByU3JjLCBwU3JjLCBnZXRQb3N0Q2NoKCksIHJEc3QsIHNEc3QsIHBEc3QsIGZhbHNlICkgPiAwOworICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBhc3NlcnQgcFNyYyA9PSAwOworICAgICAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciBhIG1vdmVtZW50IG9mIHN0dWZmIGludG8gaXRzZWxmISAgVGhpcyBjYXNlIGlzIGJhc2ljYWxseQorICAgICAgICAvLyBhIG5vLW9wCisgICAgICAgICAgICAKKyAgICAgICAgaWYgKHJTcmMgPT0gckRzdCAmJiBzRHN0LmJldHdlZW4oIHJEc3QsIHBEc3QsIHNTcmMgKSkKKyAgICAgICAgeworLy8gVE9ETyAtIEkgbWlnaHQgaGF2ZSB0byBvcnBoYW4gdHlwZXMgaW4gdGhlIHJhbmdlIGhlcmUgLi4uLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHBTcmMgPT0gMDsKKyAgICAgICAgICAgIAorICAgICAgICBzU3JjLm1vdmUoIHJTcmMsIGNEc3QuZ2V0Um9vdCgpLCBjRHN0LmdldFNwbGF5KCksIGNEc3QuZ2V0UG9zKCksIHRydWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gY29weVhtbCAoIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7CisgICAgICAgIAorICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlYbWxJbXBsKCBkc3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sSW1wbCggZHN0ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFjcXVpcmVkKQorICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gY29weVhtbEltcGwgKCBYbWxDdXJzb3IgZHN0ICkKKyAgICB7CisgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIChkc3QgPT0gbnVsbCB8fCAhKGRzdCBpbnN0YW5jZW9mIEN1cnNvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkNhbid0IGNvcHkgdG8gYSBmb3JlaWduIGRvY3VtZW50IiApOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgQ3Vyc29yIGNEc3QgPSAoQ3Vyc29yKSBkc3Q7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjaGVja0Rpc3Bvc2VkKCBjRHN0ICk7CisgICAgICAgICAgICAKKyAgICAgICAgU3BsYXkgc0RzdCA9IGNEc3QuZ2V0U3BsYXkoKTsKKyAgICAgICAgaW50ICAgcERzdCA9IGNEc3QuZ2V0UG9zKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgaW50ICAgcCA9IGdldFBvcygpOworICAgICAgICAgICAgCisgICAgICAgIGlmIChzLmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIHAsIHNEc3QsIHBEc3QsIHRydWUgKSkKKyAgICAgICAgICAgIHJldHVybiBjb3B5Q2hhcnNJbXBsKCBnZXRQb3N0Q2NoKCksIGRzdCApID4gMDsKKyAgICAgICAgICAgIAorICAgICAgICBhc3NlcnQgcCA9PSAwOworICAgICAgICAgICAgCisgICAgICAgIC8vIE5lZWQgdG8gbWFrZSBhIHNwbGF5IGNvcHkgYmVmb3JlIGdldHRpbmcgdGhlIHRleHQgYmVjYXVzZSB0aGUgY29weQorICAgICAgICAvLyB3aWxsIHZhbGlkYXRlIGludmFsaWQgY29udGVudHMvdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgIFJvb3QgckRzdCA9IGNEc3QuZ2V0Um9vdCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU3BsYXkgY29weSA9IHMuY29weVNwbGF5KCk7CisKKyAgICAgICAgT2JqZWN0IHR4dCA9IHIuX3RleHQ7CisgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHMgKTsKKyAgICAgICAgaW50IGNjaCA9IGNvcHkuZ2V0Q2NoTGVmdCgpICsgY29weS5nZXRDY2goKTsKKworICAgICAgICAvLworICAgICAgICAvLyBSZW1vdmUgdGV4dCBhZnRlciB3aGljaCBtaWdodCBiZSBiZXR3ZWVuIGxlYWYgdmFsdWUgYW5kIGZpcnN0IGF0dHIgdmFsdWUKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIGlmIChzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IHMuZ2V0Q2NoVmFsdWUoKTsKKyAgICAgICAgICAgIGludCBjY2hBZnRlciA9IHMuZ2V0Q2NoQWZ0ZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNjaFZhbHVlID09IDApCisgICAgICAgICAgICAgICAgY3AgKz0gY2NoQWZ0ZXI7CisgICAgICAgICAgICBlbHNlIGlmIChzLm5leHRTcGxheSgpLmlzQXR0cigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhciBbIGNjaCBdOworICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goIGJ1ZiwgMCwgY3AsIGNjaFZhbHVlICk7CisgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggYnVmLCBjY2hWYWx1ZSwgY3AgKyBjY2hWYWx1ZSArIGNjaEFmdGVyLCBjY2ggLSBjY2hWYWx1ZSApOworCisgICAgICAgICAgICAgICAgdHh0ID0gYnVmOworICAgICAgICAgICAgICAgIGNwID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHNEc3QuaW5zZXJ0KCByRHN0LCBwRHN0LCBjb3B5LCB0eHQsIGNwLCBjY2gsIHRydWUgKTsKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlWG1sQ29udGVudHMgKCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRPRE8gLSBzaG91bGQgaW1wbGVtZW50IHRoaXMgd2l0aCBpbnRlcm5hbHMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFpc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIFRva2VuVHlwZSB0dCA9IHRvRmlyc3RDb250ZW50VG9rZW4oKTsKKyAgICAgICAgICAgIGFzc2VydCAhdHQuaXNOb25lKCk7CisgICAgCisgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSAhaXNGaW5pc2goKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAhaXNGaW5pc2goKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSByZW1vdmVYbWwoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvUGFyZW50KCk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyAoIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW5TYW1lRG9jdW1lbnQoIGRzdCApKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QucHVzaCgpOworCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkc3QuaXNBdFNhbWVQb3NpdGlvbkFzKCB0aGlzICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3QucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZHN0LnRvUGFyZW50KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3QucG9wKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIG1vdmVYbWxDb250ZW50cyAoIFhtbEN1cnNvciBkc3QgKQorICAgIHsKKyAgICAgICAgaWYgKGRzdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkRlc3RpbmF0aW9uIGlzIG51bGwiICk7CisgICAgICAgIAorICAgICAgICBpZiAoZHN0Lm1vbml0b3IoKSA9PSBtb25pdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxDb250ZW50c0ltcGwoIGRzdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiBhY3F1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRzdC5tb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vdmVYbWxDb250ZW50c0ltcGwoIGRzdCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhY3F1aXJlZCkKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1vdmVYbWxDb250ZW50c0ltcGwgKCBYbWxDdXJzb3IgZHN0ICkKKyAgICB7CisgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmICghaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZHN0IGlzIGluIHNyYyEgIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm90aGluZyB0bworICAgICAgICAvLyBkby4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIChjb250YWlucyggZHN0ICkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOworICAgICAgICBhc3NlcnQgIXR0LmlzTm9uZSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBtb3ZlZCA9ICFpc0ZpbmlzaCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbW92ZVhtbEltcGwoIGRzdCApKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKCAhaXNGaW5pc2goKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gbW92ZVhtbEltcGwoIGRzdCApOworICAgICAgICAgICAgICAgIGFzc2VydCBiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgdG9QYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBtb3ZlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb3B5WG1sQ29udGVudHMgKCBYbWxDdXJzb3IgZHN0ICkKKyAgICB7CisgICAgICAgIGlmIChkc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJEZXN0aW5hdGlvbiBpcyBudWxsIiApOworICAgICAgICAKKyAgICAgICAgaWYgKGRzdC5tb25pdG9yKCkgPT0gbW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sQ29udGVudHNJbXBsKCBkc3QgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdsb2JhbExvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChkc3QubW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5WG1sQ29udGVudHNJbXBsKCBkc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWNxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBjb3B5WG1sQ29udGVudHNJbXBsICggWG1sQ3Vyc29yIGRzdCApCisgICAgeworICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGRzdCBpcyBpbiBzcmMhICBJbiB0aGlzIGNhc2UsIGNvcHkgdGhlIHNyYyB0byBhIG5ldworICAgICAgICAvLyBkb2N1bWVudCBhbmQgdGhlbiBtb3ZlIHRoZSBjb3BpZWQgY29udGVudHMgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAgICAgICAgCisgICAgICAgIGlmIChjb250YWlucyggZHN0ICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbEN1cnNvciBjVG1wID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY1RtcC50b05leHRUb2tlbigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWNvcHlYbWxDb250ZW50c0ltcGwoIGNUbXAgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjVG1wLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNUbXAudG9TdGFydERvYygpOworICAgICAgICAgICAgKChDdXJzb3IpY1RtcCkubW92ZVhtbENvbnRlbnRzSW1wbCggZHN0ICk7CisgICAgICAgICAgICBjVG1wLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgVG9rZW5UeXBlIHR0ID0gdG9GaXJzdENvbnRlbnRUb2tlbigpOworICAgICAgICBhc3NlcnQgIXR0LmlzTm9uZSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjb3BpZWQgPSAhaXNGaW5pc2goKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNvcHlYbWxJbXBsKCBkc3QgKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzU3RhcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgdG9FbmRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRvTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGlzRmluaXNoKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gY29weVhtbEltcGwoIGRzdCApOworICAgICAgICAgICAgICAgIGFzc2VydCBiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgdG9QYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBjb3BpZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblNhbWVEb2N1bWVudCAoIFhtbEN1cnNvciB4dGhhdCApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgCisgICAgICAgICAgICBpZiAoeHRoYXQgPT0gbnVsbCB8fCAhKHh0aGF0IGluc3RhbmNlb2YgQ3Vyc29yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBDdXJzb3IgdGhhdCA9IChDdXJzb3IpIHh0aGF0OworICAgIAorICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCggdGhhdCApOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpID09IHRoYXQuZ2V0Um9vdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHVzaCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKF9kYXRhLl9zdGFjayA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9kYXRhLl9zdGFjayA9IG5ldyBTZWxlY3Rpb25zKCk7CisgICAgCisgICAgICAgICAgICBfZGF0YS5fc3RhY2suYWRkKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpICk7CisgICAgCisgICAgICAgICAgICBnZXRSb290KCkucmVnaXN0ZXJGb3JDaGFuZ2UoIHRoaXMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKF9kYXRhLl9zdGFjayA9PSBudWxsIHx8IF9kYXRhLl9zdGFjay5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBfZGF0YS5fc3RhY2suc2V0Q3Vyc29yKCB0aGlzLCBfZGF0YS5fc3RhY2suc2l6ZSgpIC0gMSApOworICAgIAorICAgICAgICAgICAgX2RhdGEuX3N0YWNrLnBvcCgpOworICAgIAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRTZWxlY3Rpb25Db3VudCAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIF9kYXRhLl9zZWxlY3Rpb25zID09IG51bGwgPyAwIDogX2RhdGEuX3NlbGVjdGlvbnMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIHRvU2VsZWN0aW9uICggaW50IGkgKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zICE9IG51bGwgJiYgaSA+PSAwICYmIF9kYXRhLl9zZWxlY3Rpb25zLnNldEN1cnNvciggdGhpcywgaSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0U2VsZWN0aW9uICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgcHVzaCgpOworICAgICAgICAgICAgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSBfZGF0YS5fY3VycmVudFNlbGVjdGlvbjsKKyAgICAKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0b05leHRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gdG9OZXh0U2VsZWN0aW9uICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgIAorICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zID09IG51bGwgfHwgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPCAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgICAgICAgICBpbnQgbmV4dFNlbGVjdGlvbiA9IF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uICsgMTsKKyAgICAKKyAgICAgICAgICAgIGlmICghX2RhdGEuX3NlbGVjdGlvbnMuc2V0Q3Vyc29yKCB0aGlzLCBuZXh0U2VsZWN0aW9uICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBfZGF0YS5fY3VycmVudFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247CisgICAgCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICApCisgICAgeworICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICBfZGF0YS5jbGVhclNlbGVjdGlvbnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvU2VsZWN0aW9uICggKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tEaXNwb3NlZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2RhdGEuX3NlbGVjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfZGF0YS5fc2VsZWN0aW9ucyA9IFBhdGgubmV3U2VsZWN0aW9ucygpOworICAgIAorICAgICAgICAgICAgLy8gRm9yY2UgYW55IHNlbGVjdGlvbiBlbmdpbmUgdG8gc2VhcmNoIGFsbC4uLgorICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuc2l6ZSgpOworICAgIAorICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuYWRkKCBnZXRSb290KCksIGdldFNwbGF5KCksIGdldFBvcygpICk7CisgICAgCisgICAgICAgICAgICBnZXRSb290KCkucmVnaXN0ZXJGb3JDaGFuZ2UoIHRoaXMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VOb3RpZmljYXRpb24gKCApCisgICAgeworICAgICAgICBpZiAoIWlzRGlzcG9zZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuc2l6ZSgpOyAgLy8gRm9yY2UgYSBmdWxsIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgIF9kYXRhLl9zZWxlY3Rpb25zLmN1cnNpZnkoIGdldFJvb3QoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2RhdGEuX3N0YWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgX2RhdGEuX3N0YWNrLmN1cnNpZnkoIGdldFJvb3QoKSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChfZGF0YS5fc2VsZWN0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9kYXRhLl9zZWxlY3Rpb25zID0gUGF0aC5uZXdTZWxlY3Rpb25zKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuZGlzcG9zZSgpOworICAgIAorICAgICAgICAgICAgX2RhdGEuX3NlbGVjdGlvbnMuaW5pdCggCisgICAgICAgICAgICAgICAgUGF0aC5zZWxlY3QoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksIHBhdGgsIG9wdGlvbnMgKSApOworICAgIAorICAgICAgICAgICAgcHVzaCgpOworICAgIAorICAgICAgICAgICAgaWYgKF9kYXRhLl9zZWxlY3Rpb25zLnNldEN1cnNvciggdGhpcywgMCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldFJvb3QoKS5yZWdpc3RlckZvckNoYW5nZSggdGhpcyApOworICAgICAgICAgICAgICAgIF9kYXRhLl9jdXJyZW50U2VsZWN0aW9uID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2RhdGEuX2N1cnJlbnRTZWxlY3Rpb24gPSAtMjsKKyAgICAKKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNlbGVjdFBhdGggKCBTdHJpbmcgcGF0aCApCisgICAgeworICAgICAgICBzZWxlY3RQYXRoKCBwYXRoLCBudWxsICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYbWxDdXJzb3IgZXhlY1F1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIG1vbml0b3IoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrRGlzcG9zZWQoKTsKKyAgICAKKyAgICAgICAgICAgIHJldHVybiBQYXRoLnF1ZXJ5KCB0aGlzLCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgWG1sQ3Vyc29yIGV4ZWNRdWVyeSAoIFN0cmluZyBxdWVyeSApCisgICAgeworICAgICAgICByZXR1cm4gZXhlY1F1ZXJ5KCBxdWVyeSwgbnVsbCApOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlIG5ld0RvbU5vZGUgKCApCisgICAgeworICAgICAgICByZXR1cm4gbmV3RG9tTm9kZSggbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTm9kZSBuZXdEb21Ob2RlICggWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTYXZlci5Eb21TYXZlciBzYXZlcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3luY2hyb25pemVkICggbW9uaXRvcigpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2F2ZXIgPSBuZXcgU2F2ZXIuRG9tU2F2ZXIoCisgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgZ2V0UG9zKCksICFpc0ZyYWdtZW50KCksIG9wdGlvbnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHNhdmVyLmV4cG9ydERvbSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KCkKKyAgICB7CisgICAgICAgIGlmICghIGlzU3RhcnRkb2MoKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGJvb2xlYW4gc2VlbkVsZW1lbnQgPSBmYWxzZTsKKworICAgICAgICBYbWxDdXJzb3IgYyA9IG5ld0N1cnNvcigpOworICAgICAgICBpbnQgdG9rZW4gPSBjLnRvTmV4dFRva2VuKCkuaW50VmFsdWUoKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBMT09QOgorICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1dJVENIOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbkVsZW1lbnQpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbkVsZW1lbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBjLnRvRW5kVG9rZW4oKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9URVhUOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgU3BsYXkuaXNXaGl0ZVNwYWNlKGMuZ2V0Q2hhcnMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGMudG9OZXh0VG9rZW4oKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgU1dJVENIOworCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9FTkRET0M6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBMT09QOworCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX0FUVFI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklOVF9OQU1FU1BBQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfRU5EOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSU5UX1BST0NJTlNUOgorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBjLnRvTmV4dFRva2VuKCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIFNXSVRDSDsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5JTlRfU1RBUlRET0M6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBMT09QOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGMuZGlzcG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICEgc2VlbkVsZW1lbnQ7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlICggQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoICkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc2F2ZSggY2gsIGxoLCBudWxsICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNhdmUgKCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNhdmUoIGZpbGUsIG51bGwgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2F2ZSAoIE91dHB1dFN0cmVhbSBvcyApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc2F2ZSggb3MsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlICggV3JpdGVyIHcgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNhdmUoIHcsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzYXZlICggQ29udGVudEhhbmRsZXIgY2gsIExleGljYWxIYW5kbGVyIGxoLCBYbWxPcHRpb25zIG9wdGlvbnMpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHRvZG86IGRvbid0IGhvbGQgdGhlIG1vbml0b3IgYWxsIHRoaXMgbG9uZy4KKyAgICAgICAgLy8gSWRlYWxseSwgd2UnZCByZWxlYXNlIHRoZSBtb25pdG9yIGVhY2ggdGltZSB3ZSdyZSBhYm91dCB0byBjYWxsIHRoZQorICAgICAgICAvLyBjaCBvciBsaCBvYmplY3RzLiAgSG93ZXZlciwgdGhlIHNhdmVyIGNvZGUgaXNuJ3QgX3F1aXRlXyBzdHJ1Y3R1cmUKKyAgICAgICAgLy8ganVzdCByaWdodCB0byBkbyB0aGF0LiAgU28gaW5zdGVhZCwgdGhlIGN1cnJlbnQgdmVyc2lvbiB3aWxsIGhvbGQKKyAgICAgICAgLy8gdGhlIG1vbml0b3IgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZW50aXJlIFNBWCBzYXZlLgorICAgICAgICBzeW5jaHJvbml6ZWQgKCBtb25pdG9yKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja0Rpc3Bvc2VkKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5ldyBTYXZlci5TYXhTYXZlciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSwgb3B0aW9ucywgY2gsIGxoICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2F2ZSAoIEZpbGUgZmlsZSwgWG1sT3B0aW9ucyBvcHRpb25zICkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZSApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzYXZlKCBvcywgb3B0aW9ucyApOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzYXZlICggT3V0cHV0U3RyZWFtIG9zLCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyBub3QgaG9sZCB0aGUgbW9uaXRvciBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgc2F2ZS4KKyAgICAgICAgLy8gSW5zdGVhZCwgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZQorICAgICAgICAvLyBkb2N1bWVudCBpcyBtb2RpZmllZCB3aGlsZSB0aGUgc2F2ZSBpcyBpbiBwcm9ncmVzcy4gSWYgdGhlIHVzZXIKKyAgICAgICAgLy8gd2lzaGVzIHRvIHByb3RlY3QgYWdhaW5zdCB0aGlzLCBoZSBjYW4gc3luY2hyb25pemUgb24gdGhlIG1vbml0b3IKKyAgICAgICAgLy8gaGltc2VsZi4KKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXdJbnB1dFN0cmVhbSggb3B0aW9ucyApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsgODE5MiBdOworCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZCggYnl0ZXMgKTsKKworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBvcy53cml0ZSggYnl0ZXMsIDAsIG4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2F2ZSAoIFdyaXRlciB3LCBYbWxPcHRpb25zIG9wdGlvbnMgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByID0gbmV3UmVhZGVyKCBvcHRpb25zICk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWyA4MTkyIF07CisKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG4gPSByLnJlYWQoIGNoYXJzICk7CisKKyAgICAgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgdy53cml0ZSggY2hhcnMsIDAsIG4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfZGF0YS5fZ29vYmVyLmdldFJvb3QoKS52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wICggKSB7IF9kYXRhLl9nb29iZXIuZ2V0Um9vdCgpLmR1bXAoKTsgfQorICAgIHB1YmxpYyB2b2lkIGR1bXAgKCBib29sZWFuIHZlcmJvc2UgKSB7IF9kYXRhLl9nb29iZXIuZ2V0Um9vdCgpLmR1bXAoIHZlcmJvc2UgKTsgfQorCisgICAgaW50ZXJmYWNlIFBhdGhFbmdpbmUKKyAgICB7CisgICAgICAgIGJvb2xlYW4gbmV4dCAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25zCisgICAgeworICAgICAgICB2b2lkIGluaXQgKCBQYXRoRW5naW5lIHBhdGhFbmdpbmUgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNwb3NlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9wYXRoRW5naW5lID0gcGF0aEVuZ2luZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBhZGQgKCBSb290IHIsIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBhZGQoIHIsIHMsIDAgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBhZGQgKCBSb290IHIsIFNwbGF5IHMsIGludCBwICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JHb29iZXIgZyA9IG5ldyBDdXJzb3JHb29iZXIoIHIgKTsKKworICAgICAgICAgICAgICAgIGcuc2V0KCBzLCBwICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX2N1cnNvcnMuYWRkKCBnICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChfc3BsYXlzID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9jb3VudCA9PSAwOworICAgICAgICAgICAgICAgIF9zcGxheXMgPSBuZXcgU3BsYXkgWyAxNiBdOworICAgICAgICAgICAgICAgIF9wb3NpdGlvbnMgPSBuZXcgaW50IFsgMTYgXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9jb3VudCA9PSBfc3BsYXlzLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTcGxheVtdIG5ld1NwbGF5cyA9IG5ldyBTcGxheSBbIF9jb3VudCAqIDIgXTsKKyAgICAgICAgICAgICAgICBpbnRbXSAgIG5ld1Bvc2l0aW9ucyA9IG5ldyBpbnQgWyBfY291bnQgKiAyIF07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX3NwbGF5cywgMCwgbmV3U3BsYXlzLCAwLCBfY291bnQgKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfcG9zaXRpb25zLCAwLCBuZXdQb3NpdGlvbnMsIDAsIF9jb3VudCApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9zcGxheXMgPSBuZXdTcGxheXM7CisgICAgICAgICAgICAgICAgX3Bvc2l0aW9ucyA9IG5ld1Bvc2l0aW9uczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3NwbGF5c1sgX2NvdW50IF0gPSBzOworICAgICAgICAgICAgX3Bvc2l0aW9uc1sgX2NvdW50IF0gPSBwOworCisgICAgICAgICAgICBfY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcG9wICggKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgc2l6ZSgpID4gMDsKKworICAgICAgICAgICAgaWYgKF9jdXJzb3JzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGkgPSBfY3Vyc29ycy5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgICgoQ3Vyc29yR29vYmVyKSBfY3Vyc29ycy5nZXQoIGkgKSkuc2V0KCBudWxsLCAwICk7CisgICAgICAgICAgICAgICAgX2N1cnNvcnMucmVtb3ZlKCBpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX2NvdW50LS07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGN1cnNpZnkgKCBSb290IHIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCB8fCBfY291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIF9jdXJzb3JzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2NvdW50IDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JHb29iZXIgZyA9IG5ldyBDdXJzb3JHb29iZXIoIHIgKTsKKworICAgICAgICAgICAgICAgIGcuc2V0KCBfc3BsYXlzWyBpIF0sIF9wb3NpdGlvbnNbIGkgXSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9jdXJzb3JzLmFkZCggZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfY291bnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfcGF0aEVuZ2luZSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICggX3BhdGhFbmdpbmUubmV4dCggdGhpcyApICkKKyAgICAgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICAgICAgX3BhdGhFbmdpbmUgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY3VycmVudFNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjdXJyZW50U2l6ZSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9jdXJzb3JzICE9IG51bGwgPyBfY3Vyc29ycy5zaXplKCkgOiBfY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHNldEN1cnNvciAoIEN1cnNvciBjLCBpbnQgaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBpID49IDA7CisKKyAgICAgICAgICAgIHdoaWxlICggX3BhdGhFbmdpbmUgIT0gbnVsbCAmJiBjdXJyZW50U2l6ZSgpIDw9IGkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX3BhdGhFbmdpbmUubmV4dCggdGhpcyApKQorICAgICAgICAgICAgICAgICAgICBfcGF0aEVuZ2luZSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpID49IGN1cnJlbnRTaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoX2N1cnNvcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jdXJzb3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBjLnNldCggKEN1cnNvckdvb2JlcikgX2N1cnNvcnMuZ2V0KCBpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IF9jb3VudDsKKyAgICAgICAgICAgICAgICBjLnNldCggX3NwbGF5c1sgaSBdLCBfcG9zaXRpb25zWyBpIF0gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRpc3Bvc2UgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3Vyc29ycyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBfY3Vyc29ycy5zaXplKCkgOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAoKEN1cnNvckdvb2JlcikgX2N1cnNvcnMuZ2V0KCBpICkpLnNldCggbnVsbCwgMCApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9jdXJzb3JzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX2N1cnNvcnMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBfY291bnQgPSAwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVE9ETyAtIGNhY2hlIHVudXNlZCBTZWxlY2l0b24gb2JqZWN0cyBmb3IgbGF0ZXIgcmV1c2UKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3BsYXlbXSBfc3BsYXlzOworICAgICAgICBwcml2YXRlIGludFtdICAgX3Bvc2l0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgIF9jb3VudDsKKworICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBfY3Vyc29yczsKKworICAgICAgICBwcml2YXRlIFBhdGhFbmdpbmUgX3BhdGhFbmdpbmU7CisgICAgfQorICAgIAorICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgQ3Vyc29yRGF0YSBfZGF0YTsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yRGF0YS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9DdXJzb3JEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1YmQwOAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvQ3Vyc29yRGF0YS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5DdXJzb3JHb29iZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgZmluYWwgY2xhc3MgQ3Vyc29yRGF0YQoreworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yRGF0YSBnZXRPbmUgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0IGRhdGFDYWNoZSA9IChBcnJheUxpc3QpIHRsX0NhY2hlZEN1cnNvckRhdGEuZ2V0KCk7CisKKyAgICAgICAgQ3Vyc29yRGF0YSBjZDsKKworICAgICAgICBpZiAoZGF0YUNhY2hlLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgY2QgPSBuZXcgQ3Vyc29yRGF0YSggciApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNkID0gKEN1cnNvckRhdGEpIGRhdGFDYWNoZS5yZW1vdmUoIGRhdGFDYWNoZS5zaXplKCkgLSAxICk7CisgICAgICAgICAgICBjZC5fZ29vYmVyLnNldCggciApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBDdXJzb3JEYXRhICggUm9vdCByICkKKyAgICB7CisgICAgICAgIF9nb29iZXIgPSBuZXcgQ3Vyc29yR29vYmVyKCByICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfQ2FjaGVkQ3Vyc29yRGF0YSA9CisgICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpIHsgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7IHJldHVybiBuZXcgQXJyYXlMaXN0KCk7IH0gfTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlICggYm9vbGVhbiBjYWNoZSApCisgICAgeworICAgICAgICBpZiAoX2dvb2Jlci5nZXRTcGxheSgpICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsZWFyU2VsZWN0aW9ucygpOworCisgICAgICAgICAgICBpZiAoX3N0YWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgX3N0YWNrLmRpc3Bvc2UoKTsKKworICAgICAgICAgICAgX2dvb2Jlci5yZWxlYXNlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjYWNoZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3QgZGF0YUNhY2hlID0gKEFycmF5TGlzdCkgdGxfQ2FjaGVkQ3Vyc29yRGF0YS5nZXQoKTsKKworICAgICAgICAgICAgICAgIGlmIChkYXRhQ2FjaGUuc2l6ZSgpIDwgMTI4KQorICAgICAgICAgICAgICAgICAgICBkYXRhQ2FjaGUuYWRkKCB0aGlzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUgKCApCisgICAgeworICAgICAgICBTcGxheSBzID0gX2dvb2Jlci5nZXRTcGxheSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3luY2hyb25pemVkICggX2dvb2Jlci5nZXRSb290KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbGVhc2UoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkICB2b2lkIGNsZWFyU2VsZWN0aW9ucyAoICApCisgICAgeworICAgICAgICBpZiAoX3NlbGVjdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgIF9zZWxlY3Rpb25zLmRpc3Bvc2UoKTsKKworICAgICAgICBfY3VycmVudFNlbGVjdGlvbiA9IC0yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZmluYWwgQ3Vyc29yR29vYmVyIF9nb29iZXI7CisKKyAgICBwcm90ZWN0ZWQgQ3Vyc29yLlNlbGVjdGlvbnMgIF9zdGFjazsKKworICAgIHByb3RlY3RlZCBDdXJzb3IuU2VsZWN0aW9ucyAgX3NlbGVjdGlvbnM7CisgICAgcHJvdGVjdGVkIGludCAgICAgICAgICAgICAgICBfY3VycmVudFNlbGVjdGlvbjsKK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvR29vYmVycy5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Hb29iZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxNmQxZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvR29vYmVycy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5Hb29iZXI7CisKK3B1YmxpYyBjbGFzcyBHb29iZXJzCit7CisgICAgR29vYmVyIF9nb29iZXJzOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9KYXhlblhCZWFuc0RlbGVnYXRlLmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL0pheGVuWEJlYW5zRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRmNTRhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9KYXhlblhCZWFuc0RlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQorICogRGF0ZTogTm92IDYsIDIwMDMKKyAqCisgKiBIZWxwIGNsYXNzIHRvIGRlY291cGxlIGZyb20geGJlYW5feHBhdGguamFyIGFuZCBqYXhlbi5qYXIgKHZlcnNpb24gdjEuMSBiZXRhMikKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpheGVuWEJlYW5zRGVsZWdhdGUKK3sKKyAgICBwcml2YXRlIEpheGVuWEJlYW5zRGVsZWdhdGUoKQorICAgIHt9CisKKyAgICBzdGF0aWMgU2VsZWN0UGF0aEludGVyZmFjZSBjcmVhdGVJbnN0YW5jZShTdHJpbmcgeHBhdGgpCisgICAgeworICAgICAgICBpZiAoX2NvbnN0cnVjdG9yPT1udWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5TZWxlY3RQYXRoSW50ZXJmYWNlKV9jb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge3hwYXRofSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gTG9vc2UgY291cGxpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHhxcmwuamFyCisKKyAgICBwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3RvciBfY29uc3RydWN0b3I7CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIGJvb2xlYW4gaGFzVGhlSmFycyA9IGZhbHNlOworICAgICAgICBDbGFzcyBqYXhlblhQYXRoSW1wbCA9IG51bGw7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmcm9tIGpheGVuLmphcgorICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggIm9yZy5qYXhlbi5CYXNlWFBhdGgiICk7CisgICAgICAgICAgICAvLyBmcm9tIHhiZWFuX3hwYXRoLmphcgorICAgICAgICAgICAgamF4ZW5YUGF0aEltcGwgPSBDbGFzcy5mb3JOYW1lKCAib3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuLlhCZWFuc1hQYXRoQWR2IiApOworCisgICAgICAgICAgICBoYXNUaGVKYXJzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc1RoZUphcnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNUaGVKYXJzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFzVGhlSmFycykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbnN0cnVjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgamF4ZW5YUGF0aEltcGwuZ2V0Q29uc3RydWN0b3IoIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTZWxlY3RQYXRoSW50ZXJmYWNlCisgICAgeworICAgICAgICBwdWJsaWMgTGlzdCBzZWxlY3RQYXRoKE9iamVjdCBub2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTRiMWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1BhdGguamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhQYXRoOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5DdXJzb3IuUGF0aEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuQ3Vyc29yLlNlbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcHJlY29tcGlsZWQgcGF0aCBleHByZXNzaW9uCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdGgKK3sKKyAgICBzdGF0aWMgU2VsZWN0aW9ucyBuZXdTZWxlY3Rpb25zICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25zKCk7CisgICAgfQorCisgICAgc3RhdGljIFBhdGhFbmdpbmUgc2VsZWN0ICgKKyAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgU3RyaW5nIHBhdGhFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgUGF0aCBwYXRoID0gZ2V0UGF0aCggcGF0aEV4cHIsIG9wdGlvbnMgKTsKKyAgICAgICAgcmV0dXJuIChwYXRoID09IG51bGwpID8gbnVsbCA6IHBhdGguZXhlY3V0ZSggciwgcywgcCwgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF91c2VYcXJsRm9yWHBhdGggPSAidXNlIHhxcmwgZm9yIHhwYXRoIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF91c2VYYmVhbkZvclhwYXRoID0gInVzZSB4YmVhbiBmb3IgeHBhdGgiOworCisgICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGggKCBTdHJpbmcgcGF0aEV4cHIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFBhdGgoIHBhdGhFeHByLCBmYWxzZSwgbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFBhdGggZ2V0UGF0aCAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgZ2V0UGF0aCgKKyAgICAgICAgICAgICAgICBwYXRoRXhwciwKKyAgICAgICAgICAgICAgICBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICkuaGFzT3B0aW9uKCBfdXNlWHFybEZvclhwYXRoICksCisgICAgICAgICAgICAgICAgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBnZXRQYXRoICggU3RyaW5nIHBhdGhFeHByLCBib29sZWFuIHhxcmwsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBPYmplY3QgcGF0aCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBzeW5jaHJvbml6ZWQgKCBfeGJlYW5QYXRoQ2FjaGUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXhxcmwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aCA9IF94YmVhblBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICAgICAgcGF0aCA9IF94cXJsUGF0aENhY2hlLmdldCggcGF0aEV4cHIgKTsKKworICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aFN0ciA9IGdldENvbXBpbGVkUGF0aCggcGF0aEV4cHIsIHhxcmwsIG9wdGlvbnMgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwYXRoID0KKyAgICAgICAgICAgICAgICAgICAgKHBhdGhTdHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRQYXRoKCBwYXRoRXhwciwgeHFybCwgb3B0aW9ucyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChQYXRoKSBwYXRoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q29tcGlsZWRQYXRoKCBwYXRoRXhwciwgZmFsc2UsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVudE5vZGVWYXIgKCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gInRoaXMiOworCisgICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7CisgICAgICAgIAorICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuWFFVRVJZX0NVUlJFTlRfTk9ERV9WQVIgKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudE5vZGVWYXIgPSAoU3RyaW5nKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUiApOworCisgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJPbWl0IHRoZSAnJCcgcHJlZml4IGZvciB0aGUgY3VycmVudCBub2RlIHZhcmlhYmxlIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlVmFyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFBhdGggKCBTdHJpbmcgcGF0aEV4cHIsIGJvb2xlYW4geHFybCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIFBhdGggcGF0aCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOworICAgICAgICAKKyAgICAgICAgLy8gZW5zdXJlIG9wdGlvbnMgZG9lc24ndCBjb250YWluIFhRdWVyeSB2YXJpYWJsZSBtYXBwaW5nLgorICAgICAgICAvLyBzb21lZGF5IHdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbiBhbGwgdGhlIHBhdGhpbmcgZW5naW5lcworICAgICAgICAvLyBidXQgZm9yIG5vdyBpdCBvbmx5IGFwcGxpZXMgdG8gdGhlIHhxcmwuCisgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5YUVVFUllfVkFSSUFCTEVfTUFQICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJYbWxPcHRpb25zLlhRVUVSWV9WQVJJQUJMRV9NQVAgaXMgbm90IGFsbG93ZWQgaW4gWFBhdGggZXhwcmVzc2lvbnMuIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY3VycmVudE5vZGVWYXIgPSBnZXRDdXJyZW50Tm9kZVZhciggb3B0aW9ucyApOworCisgICAgICAgIHN5bmNocm9uaXplZCAoIF94YmVhblBhdGhDYWNoZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAoeHFybCB8PSBvcHRpb25zLmhhc09wdGlvbiggX3VzZVhxcmxGb3JYcGF0aCApKSB8fCB0cnVlOworCisgICAgICAgICAgICBpZiAoIXhxcmwgfHwgb3B0aW9ucy5oYXNPcHRpb24oIF91c2VYYmVhbkZvclhwYXRoICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aCA9IChQYXRoKSBfeGJlYW5QYXRoQ2FjaGUuZ2V0KCBwYXRoRXhwciApOworCisgICAgICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBYYmVhblBhdGhJbXBsLmNyZWF0ZSggcGF0aEV4cHIsIGN1cnJlbnROb2RlVmFyICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF94YmVhblBhdGhDYWNoZS5wdXQoIHBhdGguZ2V0UGF0aEV4cHIoKSwgcGF0aCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IEpheGVuUGF0aEltcGwuY3JlYXRlKCBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX3hiZWFuUGF0aENhY2hlLnB1dCggcGF0aC5nZXRQYXRoRXhwcigpLCBwYXRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCAhIG9wdGlvbnMuaGFzT3B0aW9uKCBfdXNlWGJlYW5Gb3JYcGF0aCApOworCisgICAgICAgICAgICAgICAgcGF0aCA9IChQYXRoKSBfeHFybFBhdGhDYWNoZS5nZXQoIHBhdGhFeHByICk7CisKKyAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFhxcmxQYXRoSW1wbC5jcmVhdGUoIHBhdGhFeHByLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF94cXJsUGF0aENhY2hlLnB1dCggcGF0aC5nZXRQYXRoRXhwcigpLCBwYXRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhdGggPT0gbnVsbCA/IG51bGwgOiBwYXRoLmdldFBhdGhFeHByKCk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBRdWVyeQorICAgIHsKKyAgICAgICAgUGF0aEVuZ2luZSAgZXhlY3V0ZVBhdGggICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICk7CisgICAgICAgIFhtbEN1cnNvciAgIGV4ZWN1dGVRdWVyeSAoIEN1cnNvciBjLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKKyAgICAgICAgWG1sT2JqZWN0W10gZXhlY3V0ZVF1ZXJ5ICggVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKTsKKyAgICAgICAgU3RyaW5nICAgICAgZ2V0UXVlcnlFeHByICggKTsKKyAgICB9CisKKy8vICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgZ2V0UXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByICkKKy8vICAgIHsKKy8vICAgICAgICByZXR1cm4gZ2V0UXVlcnkoIHF1ZXJ5RXhwciwgbnVsbCApOworLy8gICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgUXVlcnkgZ2V0UXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgT2JqZWN0IHF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAoIF94cXJsUXVlcnlDYWNoZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1ZXJ5ID0gX3hxcmxRdWVyeUNhY2hlLmdldCggcXVlcnlFeHByICk7CisKKyAgICAgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9IGdldENvbXBpbGVkUXVlcnkoIHF1ZXJ5RXhwciwgb3B0aW9ucyApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHF1ZXJ5ID0KKyAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5U3RyID09IG51bGwpID8gbnVsbCA6IGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoUXVlcnkpIHF1ZXJ5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlZFF1ZXJ5ICggU3RyaW5nIHF1ZXJ5RXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIFF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAoIF94cXJsUXVlcnlDYWNoZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1ZXJ5ID0gKFF1ZXJ5KSBfeHFybFF1ZXJ5Q2FjaGUuZ2V0KCBxdWVyeUV4cHIgKTsKKworICAgICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcXVlcnkgPSBYcXJsRGVsZWdhdGUuY29tcGlsZVF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKKworICAgICAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBfeHFybFF1ZXJ5Q2FjaGUucHV0KCBxdWVyeS5nZXRRdWVyeUV4cHIoKSwgcXVlcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBxdWVyeSA9PSBudWxsID8gbnVsbCA6IHF1ZXJ5LmdldFF1ZXJ5RXhwcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWG1sQ3Vyc29yIHF1ZXJ5ICgKKyAgICAgICAgQ3Vyc29yIGMsIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBRdWVyeSBxdWVyeSA9IGdldFF1ZXJ5KCBxdWVyeUV4cHIsIG9wdGlvbnMgKTsKKyAgICAgICAgcmV0dXJuIChxdWVyeSA9PSBudWxsKSA/IG51bGwgOiBxdWVyeS5leGVjdXRlUXVlcnkoIGMsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdFtdIHF1ZXJ5ICgKKyAgICAgICAgVHlwZSB0eXBlLCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgUXVlcnkgcXVlcnkgPSBnZXRRdWVyeSggcXVlcnlFeHByLCBvcHRpb25zICk7CisgICAgICAgIHJldHVybiAocXVlcnkgPT0gbnVsbCkgPyBudWxsIDogcXVlcnkuZXhlY3V0ZVF1ZXJ5KCB0eXBlLCBvcHRpb25zICk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFBhdGhFbmdpbmUgZXhlY3V0ZSAoCisgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXRoRXhwciAoICk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYcXJsUGF0aEltcGwgZXh0ZW5kcyBQYXRoCisgICAgeworICAgICAgICBwcml2YXRlIFhxcmxQYXRoSW1wbCAoIFN0cmluZyBwYXRoRXhwciwgUXVlcnkgY29tcGlsZWRQYXRoICkKKyAgICAgICAgeworICAgICAgICAgICAgX3BhdGhFeHByID0gcGF0aEV4cHI7CisgICAgICAgICAgICBfY29tcGlsZWRQYXRoID0gY29tcGlsZWRQYXRoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3BhdGhFeHByOworICAgICAgICBwcml2YXRlIFF1ZXJ5ICBfY29tcGlsZWRQYXRoOworCisgICAgICAgIHN0YXRpYyBQYXRoIGNyZWF0ZSAoIFN0cmluZyBwYXRoRXhwciwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYcXJsUGF0aEltcGwoCisgICAgICAgICAgICAgICAgcGF0aEV4cHIsCisgICAgICAgICAgICAgICAgWHFybERlbGVnYXRlLmNvbXBpbGVQYXRoKCBwYXRoRXhwciwgb3B0aW9ucyApICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgUGF0aEVuZ2luZSBleGVjdXRlICgKKyAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfY29tcGlsZWRQYXRoLmV4ZWN1dGVQYXRoKCByLCBzLCBwLCBvcHRpb25zICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aEV4cHIgKCApIHsgcmV0dXJuIF9wYXRoRXhwcjsgfQorICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgWGJlYW5QYXRoSW1wbCBleHRlbmRzIFBhdGgKKyAgICB7CisgICAgICAgIHByaXZhdGUgWGJlYW5QYXRoSW1wbCAoCisgICAgICAgICAgICBYUGF0aCB4cGF0aCwgU3RyaW5nIHBhdGhFeHByLCBTdHJpbmcgY3VycmVudE5vZGVWYXIgKQorICAgICAgICB7CisgICAgICAgICAgICBfcGF0aEV4cHIgPSBwYXRoRXhwcjsKKyAgICAgICAgICAgIF94cGF0aCA9IHhwYXRoOworICAgICAgICAgICAgX2N1cnJlbnROb2RlVmFyID0gY3VycmVudE5vZGVWYXI7CisgICAgICAgIH0KKworLy8gICAgICAgICAgICB0cnkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnROb2RlVmFyID0gInRoaXMiOworLy8gICAgICAgICAgICAgICAgCisvLyAgICAgICAgICAgICAgICBpZiAoWG1sT3B0aW9ucy5YUVVFUllfQ1VSUkVOVF9OT0RFX1ZBUi5oYXMoIG9wdGlvbnMgKSkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZVZhciA9CisvLyAgICAgICAgICAgICAgICAgICAgICAgICIkIiArIFhtbE9wdGlvbnMuWFFVRVJZX0NVUlJFTlRfTk9ERV9WQVIuZ2V0KCBvcHRpb25zICk7CisvLworLy8gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCQiICkpCisvLyAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT21pdCB0aGUgJyRwJyByZWZpeCBmb3IgdGhlIGN1cnJlbnQgIiArCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub2RlIHZhcmlhYmxlIiApOworLy8gICAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgUGF0aCBjcmVhdGUgKCBTdHJpbmcgcGF0aEV4cHIsIFN0cmluZyBjdXJyZW50Tm9kZVZhciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhY3VycmVudE5vZGVWYXIuc3RhcnRzV2l0aCggIiQiICk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBuZXcgWGJlYW5QYXRoSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoLmNvbXBpbGVYUGF0aCggcGF0aEV4cHIsIGN1cnJlbnROb2RlVmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoRXhwciwgY3VycmVudE5vZGVWYXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggWFBhdGguWFBhdGhDb21waWxlRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoRXhwciAoICkgeyByZXR1cm4gX3BhdGhFeHByOyB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgUGF0aEVuZ2luZSBleGVjdXRlICgKKyAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBidWlsdGluIFhQYXRoIGVuZ2luZSB3b3JrcyBvbmx5IG9uIGNvbnRhaW5lcnMuICBEZWxlZ2F0ZSB0bworICAgICAgICAgICAgLy8geHFybCBvdGhlcndpc2UuICBBbHNvLCBpZiB0aGUgcGF0aCBoYWQgYSAvLy4gYXQgdGhlIGVuZCwgdGhlCisgICAgICAgICAgICAvLyBzaW1wbGUgeHBhdGggZW5naW5lIGNhbid0IGRvIHRoZSBnZW5lcmF0ZSBjYXNlLCBpdCBvbmx5IGhhbmRsZXMKKyAgICAgICAgICAgIC8vIGF0dHJzIGFuZCBlbGVtZW50cy4KKworICAgICAgICAgICAgaWYgKHAgIT0gMCB8fCAhcy5pc0NvbnRhaW5lcigpIHx8IF94cGF0aC5zYXdEZWVwRG90KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHhiZWFuIHBhdGggY29tcGlsZXIgY291bGQgY291bGQgaGFuZGxlIHRoZSBwYXRoLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIHhxcmwgY29tcGlsZXIgYmV0dGVyIGJlIGFibGUgdG8hCisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCggX3BhdGhFeHByLCB0cnVlLCBudWxsICkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSggciwgcywgcCwgb3B0aW9ucyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgY29tcGlsZSBwYXRoIiwgZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYQmVhblBhdGhFbmdpbmUoIF94cGF0aCwgciwgcyApOworICAgICAgICB9CisKKy8vIFRPRE8gLSBiZWNhdXNlIHRoaXMgeHBhdGggZW5naW5lIGRvZXMgbm90IHVzZSBhIHNhdmVyLCBhbnkgYXR0cmlidXRlcyBpbiB0aGUKKy8vIHBhdGggd2hpY2ggcmVmZXIgdG8gbmFtZXNhcGNlIGF0dHJpYnV0ZXMgd2lsbCByZXF1aXJlIHVzIHRvIHJ1biB0aGUgWFFSTAorLy8gcGF0aCBlbmdpbmUgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHNhdmVyLgorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhCZWFuUGF0aEVuZ2luZQorICAgICAgICAgICAgZXh0ZW5kcyBYUGF0aC5FeGVjdXRpb25Db250ZXh0IGltcGxlbWVudHMgUGF0aEVuZ2luZQorICAgICAgICB7CisgICAgICAgICAgICBYQmVhblBhdGhFbmdpbmUgKCBYUGF0aCB4cGF0aCwgUm9vdCByLCBTcGxheSBzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworCisgICAgICAgICAgICAgICAgX3Jvb3QgPSByOworICAgICAgICAgICAgICAgIF9jdXJyID0gX3RvcCA9IHM7CisgICAgICAgICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKKworICAgICAgICAgICAgICAgIGluaXQoIHhwYXRoICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG5leHQgKCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpbml0aWFsU2l6ZSA9IHNlbGVjdGlvbnMuY3VycmVudFNpemUoKTsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3Jvb3QuZ2V0VmVyc2lvbigpICE9IF92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSggc2VsZWN0aW9ucyApOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsU2l6ZSA8IHNlbGVjdGlvbnMuY3VycmVudFNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTcGxheSBkb0F0dHJzICggaW50IHJldCwgU3BsYXkgcywgU2VsZWN0aW9ucyBzZWxlY3Rpb25zICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEFUVFJTKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgICAgIGZvciAoIHMgPSBfY3Vyci5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOworICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmIGF0dHIoIHMuZ2V0TmFtZSgpICkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIHMgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UgKCBTZWxlY3Rpb25zIHNlbGVjdGlvbnMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfY3VyciA9PSBfdG9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IHN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgJiBISVQpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIF9jdXJyICk7CisKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGRvQXR0cnMoIHJldCwgX2N1cnIsIHNlbGVjdGlvbnMgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIERFU0NFTkQpID09IDAgfHwgX2N1cnIuaXNMZWFmKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyID0gcyA9PSBudWxsID8gX2N1cnIubmV4dE5vbkF0dHJTcGxheSgpIDogczsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2N1cnIuZ2V0Q29udGFpbmVyKCkgPT0gX3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBfY3Vyci5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9jdXJyLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IGVsZW1lbnQoIF9jdXJyLmdldE5hbWUoKSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCAmIEhJVCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLmFkZCggX3Jvb3QsIF9jdXJyICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBkb0F0dHJzKCByZXQsIF9jdXJyLCBzZWxlY3Rpb25zICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfY3Vyci5pc0xlYWYoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9IHMgPT0gbnVsbCA/IF9jdXJyLm5leHROb25BdHRyU3BsYXkoKSA6IHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocmV0ICYgREVTQ0VORCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY3VyciA9ICgoU3BsYXkuQ29udGFpbmVyKSBfY3VycikuZ2V0RmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnIgPSBzID09IG51bGwgPyBfY3Vyci5uZXh0Tm9uQXR0clNwbGF5KCkgOiBzOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBfY3VyciA9IF9jdXJyLm5leHRTcGxheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBSb290ICBfcm9vdDsKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247CisgICAgICAgICAgICBwcml2YXRlIFNwbGF5IF90b3A7CisgICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9jdXJyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3BhdGhFeHByOworICAgICAgICBwcml2YXRlIFhQYXRoICBfeHBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIF9jdXJyZW50Tm9kZVZhcjsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEpheGVuUGF0aEltcGwgZXh0ZW5kcyBQYXRoCisgICAgeworICAgICAgICBwcml2YXRlIFN0cmluZyBfcGF0aEV4cHI7CisgICAgICAgIHByaXZhdGUgSmF4ZW5YQmVhbnNEZWxlZ2F0ZS5TZWxlY3RQYXRoSW50ZXJmYWNlIF94cGF0aEltcGw7CisKKyAgICAgICAgcHJpdmF0ZSBKYXhlblBhdGhJbXBsICgKKyAgICAgICAgICAgIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSB4cGF0aEltcGwsIFN0cmluZyBwYXRoRXhwciApCisgICAgICAgIHsKKyAgICAgICAgICAgIF94cGF0aEltcGwgPSB4cGF0aEltcGw7CisgICAgICAgICAgICBfcGF0aEV4cHIgPSBwYXRoRXhwcjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBQYXRoIGNyZWF0ZSAoIFN0cmluZyBwYXRoRXhwciwgU3RyaW5nIGN1cnJlbnROb2RlVmFyICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFjdXJyZW50Tm9kZVZhci5zdGFydHNXaXRoKCAiJCIgKTsgLy8gY2V6YXIgcmV2aWV3IHdpdGggZXJpY3ZhcworCisgICAgICAgICAgICBKYXhlblhCZWFuc0RlbGVnYXRlLlNlbGVjdFBhdGhJbnRlcmZhY2UgaW1wbCA9IEpheGVuWEJlYW5zRGVsZWdhdGUuY3JlYXRlSW5zdGFuY2UoIHBhdGhFeHByICk7CisgICAgICAgICAgICBpZiAoaW1wbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGVuUGF0aEltcGwoIGltcGwgLCBwYXRoRXhwciApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoRXhwciAoICkgeyByZXR1cm4gX3BhdGhFeHByOyB9CisKKyAgICAgICAgcHJvdGVjdGVkIFBhdGhFbmdpbmUgZXhlY3V0ZSAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF4ZW5QYXRoRW5naW5lKCBfeHBhdGhJbXBsLCByLCBzLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpheGVuUGF0aEVuZ2luZQorICAgICAgICAgICAgZXh0ZW5kcyBYUGF0aC5FeGVjdXRpb25Db250ZXh0IGltcGxlbWVudHMgUGF0aEVuZ2luZQorICAgICAgICB7CisgICAgICAgICAgICBKYXhlblBhdGhFbmdpbmUoIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSB4cGF0aEltcGwsIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9qYXhlblhwYXRoSW1wbCA9IHhwYXRoSW1wbDsKKyAgICAgICAgICAgICAgICBfcm9vdCA9IHI7CisgICAgICAgICAgICAgICAgX3NwbGF5ID0gczsKKyAgICAgICAgICAgICAgICBfcCA9IHA7CisgICAgICAgICAgICAgICAgX3ZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbmV4dCAoIFNlbGVjdGlvbnMgc2VsZWN0aW9ucyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfZmlyc3RDYWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBfZmlyc3RDYWxsID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoX3Jvb3QuZ2V0VmVyc2lvbigpICE9IF92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCIgKTsKKworICAgICAgICAgICAgICAgIExpc3QgcmVzdWx0c0xpc3Q7CisgICAgICAgICAgICAgICAgQ3Vyc29yIGN1ciA9IG5ldyBDdXJzb3IoX3Jvb3QsIF9zcGxheSwgX3ApOworICAgICAgICAgICAgICAgIHJlc3VsdHNMaXN0ID0gX2pheGVuWHBhdGhJbXBsLnNlbGVjdFBhdGgoY3VyKTsKKworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8cmVzdWx0c0xpc3Quc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3IuWG1sQm9va21hcmsgYiA9IChYbWxDdXJzb3IuWG1sQm9va21hcmspcmVzdWx0c0xpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBTcGxheS5Bbm5vdGF0aW9uIGFubiA9ICgoU3BsYXkuQW5ub3RhdGlvbiliLl9jdXJyZW50TWFyayk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnMuYWRkKF9yb290LCBhbm4uZ2V0U3BsYXkoKSwgYW5uLmdldFBvcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfcm9vdCA9IG51bGw7CisgICAgICAgICAgICAgICAgX3NwbGF5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfamF4ZW5YcGF0aEltcGwgPSBudWxsOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZSBfamF4ZW5YcGF0aEltcGw7CisgICAgICAgICAgICBwcml2YXRlIFJvb3QgIF9yb290OworICAgICAgICAgICAgcHJpdmF0ZSBTcGxheSBfc3BsYXk7CisgICAgICAgICAgICBwcml2YXRlIGludCBfcDsKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2ZpcnN0Q2FsbCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94cXJsUGF0aENhY2hlID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIF94YmVhblBhdGhDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBfeHFybFF1ZXJ5Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Sb290LmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1Jvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWEwMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9Sb290LmphdmEKQEAgLTAsMCArMSwzNDM5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkVuY29kaW5nTWFwOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YTUxOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5TcGxheS5GaW5pc2g7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlFOYW1lU2V0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERvY3VtZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU2F4SGFuZGxlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkF0dHJpYnV0ZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5DaGFyYWN0ZXJEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Mb2NhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uUHJvY2Vzc2luZ0luc3RydWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5TcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnREb2N1bWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSb290IGV4dGVuZHMgRmluaXNoIGltcGxlbWVudHMgWG1sU3RvcmUKK3sKKyAgICBwdWJsaWMgUm9vdCAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBzdXBlciggUk9PVCApOworCisgICAgICAgIGFzc2VydCBzdGwgIT0gbnVsbDsKKworICAgICAgICBfc2NoZW1hVHlwZVN5c3RlbSA9IHN0bDsKKworICAgICAgICBfbGVmdE9ubHkgPSB0cnVlOworCisgICAgICAgIF9wcm9wcyA9IG5ldyBEb2NQcm9wcygpOworCisgICAgICAgIF9kb2MgPSBuZXcgRG9jKCB0aGlzLCBudWxsICk7CisKKyAgICAgICAgX2xlZnRTcGxheSA9IF9kb2M7CisgICAgICAgIF9kb2MuX3BhcmVudFNwbGF5ID0gdGhpczsKKyAgICAgICAgYWRqdXN0Q2RvY0JlZ2luTGVmdCggX2RvYy5nZXRDZG9jQmVnaW4oKSApOworCisgICAgICAgIF90ZXh0ID0gbmV3IFRleHQoKTsKKworICAgICAgICBTY2hlbWFUeXBlIHNUeXBlID0gbnVsbDsKKworICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbCggb3B0aW9ucyApOworICAgICAgICAKKyAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKSkKKyAgICAgICAgICAgIHNUeXBlID0gKFNjaGVtYVR5cGUpIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKKworICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNUeXBlID0gdHlwZTsKKworICAgICAgICBpZiAoc1R5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNUeXBlID0gWG1sT2JqZWN0LnR5cGU7CisKKyAgICAgICAgX3ZhbGlkYXRlT25TZXQgPSBvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5WQUxJREFURV9PTl9TRVQgKTsKKworICAgICAgICBfZmFjdG9yeSA9IChUeXBlU3RvcmVGYWN0b3J5KSBvcHRpb25zLmdldCggVHlwZVN0b3JlRmFjdG9yeS5LRVkgKTsKKworICAgICAgICBfZG9jLnNldFR5cGUoIHRoaXMsIHNUeXBlICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYbWxTdG9yZSBuZXdTdG9yZSAoIFNjaGVtYVR5cGVMb2FkZXIgc3RsLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFJvb3QoIHN0bCwgdHlwZSwgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBYbWxEb2N1bWVudFByb3BlcnRpZXMgZG9jdW1lbnRQcm9wZXJ0aWVzICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9wcm9wczsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sQ3Vyc29yIGNyZWF0ZUN1cnNvciAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggdGhpcywgX2RvYyApOworICAgIH0KKworICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIF9kb2M7IH0KKworICAgIGJvb2xlYW4gdmFsaWRhdGVPblNldCAoICkgeyByZXR1cm4gX3ZhbGlkYXRlT25TZXQ7IH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgZ2V0T2JqZWN0ICggKQorICAgIHsKKyAgICAgICAgVHlwZSB0ID0gX2RvYy5wZWVrVHlwZSgpOworCisgICAgICAgIHJldHVybiB0ID09IG51bGwgPyBudWxsIDogdC5nZXRYbWxPYmplY3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRTY2hlbWFUeXBlTG9hZGVyICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9zY2hlbWFUeXBlU3lzdGVtOworICAgIH0KKworICAgIGJvb2xlYW4gaXNFbXB0eSAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfbGVmdFNwbGF5ID09IF9kb2MgJiYgX2RvYy5fcmlnaHRTcGxheSA9PSBudWxsICYmIF9kb2MuaXNWYWxpZCgpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNMZWZ0T25seSAoICkgeyByZXR1cm4gX2xlZnRPbmx5OyB9CisKKyAgICB2b2lkIGVuc3VyZUVtcHR5ICggKQorICAgIHsKKyAgICAgICAgaWYgKCFpc0VtcHR5KCkpCisgICAgICAgICAgICBfZG9jLnJlbW92ZUNvbnRlbnQoIHRoaXMsIHRydWUgKTsKKworICAgICAgICBhc3NlcnQgaXNFbXB0eSgpOworICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICAgICAgYXNzZXJ0IF9sZWZ0T25seTsKKyAgICAgICAgYXNzZXJ0IGdldENjaExlZnQoKSA9PSAwOworICAgICAgICBhc3NlcnQgX3RleHQubGVuZ3RoKCkgPT0gMDsKKyAgICAgICAgYXNzZXJ0IGdldENkb2NCZWdpbkxlZnQoKSA9PSAxOworICAgICAgICBhc3NlcnQgX2RvYyAhPSBudWxsICYmIF9sZWZ0U3BsYXkgPT0gX2RvYzsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUNjaCAoIFNwbGF5IHMsIGludCBkZWx0YUNjaCApCisgICAgeworICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7CisKKyAgICAgICAgaWYgKGRlbHRhQ2NoICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKKworICAgICAgICAgICAgcy5hZGp1c3RDY2goIGRlbHRhQ2NoICk7CisgICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaCApOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldENwICggU3BsYXkgcyApCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBBIGxlZnQgb25seSB0cmVlIGhhcyB0aGUgbmljZSBwcm9wZXJ0eSB0aGF0IF9jY2hMZWZ0IGlzCisgICAgICAgIC8vIGFsc28gdGhlIGNwIQorICAgICAgICAvLworCisgICAgICAgIGlmICghX2xlZnRPbmx5ICYmIHMgIT0gdGhpcykKKyAgICAgICAgICAgIHMuc3BsYXkoIHRoaXMsIHRoaXMgKTsKKworICAgICAgICByZXR1cm4gcy5nZXRDY2hMZWZ0KCk7CisgICAgfQorCisgICAgaW50IGdldERvY0JlZ2luSW5kZXggKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEEgbGVmdCBvbmx5IHRyZWUgaGFzIHRoZSBuaWNlIHByb3BlcnR5IHRoYXQgY2RvY0JlZ2luTGVmdCBpcworICAgICAgICAvLyBhbHNvIHRoZSBwb3MhCisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKCFfbGVmdE9ubHkpCisgICAgICAgICAgICBzLnNwbGF5KCB0aGlzLCB0aGlzICk7CisKKyAgICAgICAgcmV0dXJuIHMuZ2V0Q2RvY0JlZ2luTGVmdCgpOworICAgIH0KKyAgICAKKyAgICBCZWdpbiBmaW5kTnRoQmVnaW4gKCBTcGxheSBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgaW50IG4gKQorICAgIHsKKyAgICAgICAgLy8gb25seSBvbmUgb2YgKHNldCBvciBuYW1lKSBpcyBub3QgbnVsbAorICAgICAgICAvLyBvciBib3RoIGFyZSBudWxsIGZvciBhIHdpbGRjYXJkCisgICAgICAgIGFzc2VydCAoIG5hbWUgPT0gbnVsbCB8fCBzZXQgPT0gbnVsbCApOworICAgICAgICBhc3NlcnQgbiA+PSAwOworCisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuaXNMZWFmKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgZGEgPSBfbnRoQ2FjaGVfQS5kaXN0YW5jZSggcGFyZW50LCBuYW1lLCBzZXQsIG4gKTsKKyAgICAgICAgaW50IGRiID0gX250aENhY2hlX0IuZGlzdGFuY2UoIHBhcmVudCwgbmFtZSwgc2V0LCBuICk7CisKKyAgICAgICAgQmVnaW4gYiA9CisgICAgICAgICAgICBkYSA8PSBkYgorICAgICAgICAgICAgICAgID8gX250aENhY2hlX0EuZmV0Y2goIHBhcmVudCwgbmFtZSwgc2V0LCBuICkKKyAgICAgICAgICAgICAgICA6IF9udGhDYWNoZV9CLmZldGNoKCBwYXJlbnQsIG5hbWUsIHNldCwgbiApOworCisgICAgICAgIGlmIChkYSA9PSBkYikKKyAgICAgICAgeworICAgICAgICAgICAgbnRoQ2FjaGUgdGVtcCA9IF9udGhDYWNoZV9BOworICAgICAgICAgICAgX250aENhY2hlX0EgPSBfbnRoQ2FjaGVfQjsKKyAgICAgICAgICAgIF9udGhDYWNoZV9CID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIGludCBjb3VudCAoIENvbnRhaW5lciBwYXJlbnQsIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCApCisgICAgeworICAgICAgICBTcGxheSBzID0gZmluZE50aEJlZ2luKCBwYXJlbnQsIG5hbWUsIHNldCwgMCApOworCisgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpbnQgbiA9IDA7CisKKyAgICAgICAgZm9yICggOyA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMuaXNGaW5pc2goKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKCFzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHNldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHN0cm9uZyB0eXBlIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoaXMgc2NoZW1hIHR5cGUgc3lzdGVtLgorICAgICAqLworCisgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZXNTYW1lICggUU5hbWUgbjEsIFFOYW1lIG4yICkKKyAgICB7CisgICAgICAgIGlmIChuMSA9PSBuMikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGlmIChuMSA9PSBudWxsIHx8IG4yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG4yLmdldE5hbWVzcGFjZVVSSSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKG4xLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwgfHwgbjIuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gbjEuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCBuMi5nZXROYW1lc3BhY2VVUkkoKSApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2UgKCBTdHJpbmdCdWZmZXIgc2IsIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCggIjxubyBuYW1lc3BhY2U+IiApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggIlwiIiApOworICAgICAgICAgICAgc2IuYXBwZW5kKCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7CisgICAgICAgICAgICBzYi5hcHBlbmQoICJcIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFhtbE9iamVjdCBhdXRvVHlwZWREb2N1bWVudCAoCisgICAgICAgIFNjaGVtYVR5cGUgZmFjdG9yeVR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBUaGUgdHlwZSBpbiB0aGUgb3B0aW9ucyBoYXMgaGlnaGVzdCBwcmVjaWRlbmNlIGJlY2F1c2UgaXQgaXMKKyAgICAgICAgLy8gc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisgICAgICAgIAorICAgICAgICBTY2hlbWFUeXBlIG92ZXJyaWRlVHlwZSA9CisgICAgICAgICAgICAoU2NoZW1hVHlwZSkgWG1sT3B0aW9ucy5zYWZlR2V0KCBvcHRpb25zLCBYbWxPcHRpb25zLkRPQ1VNRU5UX1RZUEUgKTsKKworICAgICAgICAvLyBwcmVjZWRlbmNlIGlzIGdpdmVuIHRvIHRoZSBvdmVycmlkZSBhYm92ZSBhbGwKKyAgICAgICAgCisgICAgICAgIFNjaGVtYVR5cGUgdGhlVHlwZSA9IG92ZXJyaWRlVHlwZTsKKworICAgICAgICAvLyBEb2N1bWVudCBhbmQgYXR0cmlidXRlIHR5cGVzIGhhdmUgbm8gbmFtZQorICAgICAgICAKKyAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICghZmFjdG9yeVR5cGUuaXNEb2N1bWVudFR5cGUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzQXR0cmlidXRlVHlwZSgpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGluZmVyIHR5cGUgZnJvbSB4c2k6dHlwZQorICAgICAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBfZG9jLmdldFhzaVR5cGVOYW1lKCB0aGlzICk7CisKKyAgICAgICAgICAgIFNjaGVtYVR5cGUgc25pZmZlZFR5cGUgPQorICAgICAgICAgICAgICAgIHR5cGVOYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgIDogX3NjaGVtYVR5cGVTeXN0ZW0uZmluZFR5cGUoIHR5cGVOYW1lICk7CisKKyAgICAgICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlLmlzQXNzaWduYWJsZUZyb20oIHNuaWZmZWRUeXBlICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhlVHlwZSA9IHNuaWZmZWRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdG9kbzoKKyAgICAgICAgLy8gdXNlIHRoZSBmb2xsb3dpbmcgd2hlbiBpbXBsZW1lbnRpbmcgc3Vic3QgZ3JvdXBzOgorICAgICAgICAvLyAgICAgZmFjdG9yeVR5cGUgPT0gbnVsbCB8fCBleHBlY3RlZFR5cGUuaXNEb2N1bWVudFR5cGUoKQorCisgICAgICAgIGlmIChmYWN0b3J5VHlwZSA9PSBudWxsIHx8IGZhY3RvcnlUeXBlLmlzRG9jdW1lbnRUeXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGVUeXBlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaW5mZXIgdHlwZSBiYXNlZCBvbiByb290IGVsdAorCisgICAgICAgICAgICAgICAgUU5hbWUgZG9jRWxlbU5hbWUgPSBudWxsOworCisgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKKworICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RDaGlsZCgpICYmICFjLnRvTmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgZG9jRWxlbU5hbWUgPSBjLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kRG9jdW1lbnRUeXBlKCBkb2NFbGVtTmFtZSApOworCisgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGVsdCBpbmhlcml0YW5jZSB3aGVuIGltcGxlbWVudGluZyBzdWJzdCBncm91cHMKKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiB0aGVUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBRTmFtZSBmYWN0b3J5RWxlbU5hbWUgPSBmYWN0b3J5VHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWN0b3J5RWxlbU5hbWUuZXF1YWxzKGRvY0VsZW1OYW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWZhY3RvcnlUeXBlLmlzVmFsaWRTdWJzdGl0dXRpb24oZG9jRWxlbU5hbWUpKQorCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCJFbGVtZW50ICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZG9jRWxlbU5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIHZhbGlkICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoZmFjdG9yeUVsZW1OYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2N1bWVudCBvciBhIHZhbGlkIHN1YnN0aXR1dGlvbi4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBpbmZlciB0eXBlIGJhc2VkIG9uIHJvb3QgYXR0cgorCisgICAgICAgICAgICAgICAgUU5hbWUgYXR0ck5hbWUgPSBudWxsOworCisgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSBjcmVhdGVDdXJzb3IoKTsKKworICAgICAgICAgICAgICAgIGlmIChjLnRvRmlyc3RBdHRyaWJ1dGUoKSAmJiAhYy50b05leHRBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBjLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGMuZGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUgPSBfc2NoZW1hVHlwZVN5c3RlbS5maW5kQXR0cmlidXRlVHlwZSggYXR0ck5hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNuaWZmaW5nIGRvZXNuJ3Qgc2F5IGFueXRoaW5nOiBhc3N1bWUgdGhlIGV4cGVjdGVkIHR5cGUKKyAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoZVR5cGUgPSBmYWN0b3J5VHlwZTsKKworICAgICAgICAvLyBTdGlsbCBub3RoaW5nOiB0aGUgbm8gdHlwZS4KKyAgICAgICAgaWYgKHRoZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRoZVR5cGUgPSBYbWxCZWFucy5OT19UWVBFOworCisgICAgICAgIC8vIGFzc2lnbiB0eXBlCisgICAgICAgIF9kb2Muc2V0VHlwZSggdGhpcywgdGhlVHlwZSApOworCisgICAgICAgIC8vIHRvZG86IEhhdmUgYSBzaW1pbGFyIGF0dHJpYnV0ZSB0eXBlIGNoZWNrCisgICAgICAgIGlmIChmYWN0b3J5VHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGhlVHlwZS5pc0RvY3VtZW50VHlwZSgpKQorICAgICAgICAgICAgICAgIHZlcmlmeURvY3VtZW50VHlwZSggdGhlVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkgKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRoZVR5cGUuaXNBdHRyaWJ1dGVUeXBlKCkpCisgICAgICAgICAgICAgICAgdmVyaWZ5QXR0cmlidXRlVHlwZSggdGhlVHlwZS5nZXRBdHRyaWJ1dGVUeXBlQXR0cmlidXRlTmFtZSgpICk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHBhc3NlZCBpbiwgdXN1YWxseSBmcm9tIGdlbmVyYXRlZCBjb2RlIHdoaWNoIG5lZWRzIHRoZQorICAgICAgICAvLyB0eXBlIHRvIGJlIHNvbWV0aGluZyBzcGVjaWZpYyBiZWNhdXNlIG9mIGEgcGVuZGluZyBjYXN0LCB0aGVuIGNoZWNrCisgICAgICAgIC8vIHRoZSByZXN1bHRpbmcgdHlwZSBhbmQgdGhyb3cgYSBuaWNlIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8KKworICAgICAgICBpZiAoZmFjdG9yeVR5cGUgIT0gbnVsbCAmJiAhZmFjdG9yeVR5cGUuaXNBc3NpZ25hYmxlRnJvbSh0aGVUeXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFjdG9yeSB0eXBlID0gIiArIGZhY3RvcnlUeXBlKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHR5cGUgPSAiICsgdGhlVHlwZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2V0eXBlIG9mIHRoZSB0eXBlID0gIiArIHRoZVR5cGUuZ2V0QmFzZVR5cGUoKSk7CisgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgIG5ldyBYbWxFeGNlcHRpb24oICJYTUwgb2JqZWN0IGlzIG5vdCBvZiB0eXBlICIgKyBmYWN0b3J5VHlwZSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEb2N1bWVudFR5cGUgKCBRTmFtZSBkb2NFbGVtTmFtZSApCisgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisKKyAgICAgICAgICAgIGlmICghYy50b0ZpcnN0Q2hpbGQoKSB8fCBjLnRvTmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGRvY0VsZW1OYW1lICkgKTsKKworICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gZG9jdW1lbnQgZWxlbWVudCIgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgZG9jdW1lbnQgZWxlbWVudHMiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGMuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyggZG9jRWxlbU5hbWUgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBkb2NFbGVtTmFtZSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyggbmFtZS5nZXRMb2NhbFBhcnQoKSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbmFtZXNwYWNlIG1pc21hdGNoICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImV4cGVjdGVkICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZSggc2IsIGRvY0VsZW1OYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZShzYiwgIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lc3BhY2VzU2FtZSggZG9jRWxlbU5hbWUsIG5hbWUgKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiOiBkb2N1bWVudCBlbGVtZW50IGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGRvY0VsZW1OYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGRvY3VtZW50IGVsZW1lbnQgbWlzbWF0Y2ggIiApOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZ290ICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggUU5hbWVIZWxwZXIucHJldHR5KCBuYW1lICkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNiICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0gWG1sRXJyb3IuZm9yQ3Vyc29yKHNiLnRvU3RyaW5nKCksIGMubmV3Q3Vyc29yKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGMuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUF0dHJpYnV0ZVR5cGUgKCBRTmFtZSBhdHRyTmFtZSApCisgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gY3JlYXRlQ3Vyc29yKCk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisKKyAgICAgICAgICAgIGlmICghYy50b0ZpcnN0QXR0cmlidXRlKCkgfHwgYy50b05leHRBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIlRoZSBkb2N1bWVudCBpcyBub3QgYSAiICk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKKworICAgICAgICAgICAgICAgIGlmIChjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbm8gYXR0cmlidXRlcyIgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogbXVsdGlwbGUgYXR0cmlidXRlcyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gYy5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCBhdHRyTmFtZSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiVGhlIGRvY3VtZW50IGlzIG5vdCBhICIgKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBRTmFtZUhlbHBlci5wcmV0dHkoIGF0dHJOYW1lICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCBuYW1lLmdldExvY2FsUGFydCgpICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIG5hbWVzcGFjZSBtaXNtYXRjaCAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICJleHBlY3RlZCAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2UoIHNiLCBhdHRyTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiIGdvdCAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2Uoc2IsICBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZXNwYWNlc1NhbWUoIGF0dHJOYW1lLCBuYW1lICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIjogYXR0cmlidXRlIGxvY2FsIG5hbWUgbWlzbWF0Y2ggIiApOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAiZXhwZWN0ZWQgIiArIGF0dHJOYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgZ290ICIgKyBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICI6IGF0dHJpYnV0ZSBlbGVtZW50IG1pc21hdGNoICIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggImdvdCAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIFFOYW1lSGVscGVyLnByZXR0eSggbmFtZSApICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvckN1cnNvcihzYi50b1N0cmluZygpLCBjLm5ld0N1cnNvcigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlcnIudG9TdHJpbmcoKSwgbnVsbCwgZXJyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWwgdGxfU2F4TG9hZGVycyA9CisgICAgICAgIG5ldyBUaHJlYWRMb2NhbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgaW5pdGlhbFZhbHVlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYXhMb2FkZXIgc2wgPSBQaWNjb2xvU2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2wgPSBEZWZhdWx0U2F4TG9hZGVyLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJDYW4ndCBmaW5kIGFuIFhNTCBwYXJzZXIiICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2w7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBTYXhMb2FkZXIgZ2V0U2F4TG9hZGVyICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTYXhMb2FkZXIpIHRsX1NheExvYWRlcnMuZ2V0KCk7CisgICAgfQorICAgIAorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGljY29sb1NheExvYWRlciBleHRlbmRzIFNheExvYWRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsYXNzIHBjID0gQ2xhc3MuZm9yTmFtZSggImNvbS5ibHVlY2FzdC54bWwuUGljY29sbyIgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBYTUxSZWFkZXIgeHIgPSAoWE1MUmVhZGVyKSBwYy5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0RW5jb2RpbmcgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0RW5jb2RpbmciLCBudWxsICk7CisgICAgICAgICAgICAgICAgTWV0aG9kIG1fZ2V0VmVyc2lvbiAgICAgID0gcGMuZ2V0TWV0aG9kKCAiZ2V0VmVyc2lvbiIsIG51bGwgKTsKKyAgICAgICAgICAgICAgICBNZXRob2QgbV9nZXRTdGFydExvY2F0b3IgPSBwYy5nZXRNZXRob2QoICJnZXRTdGFydExvY2F0b3IiLCBudWxsICk7CisKKyAgICAgICAgICAgICAgICBMb2NhdG9yIHN0YXJ0TG9jYXRvciA9CisgICAgICAgICAgICAgICAgICAgIChMb2NhdG9yKSBtX2dldFN0YXJ0TG9jYXRvci5pbnZva2UoIHhyLCBudWxsICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBpY2NvbG9TYXhMb2FkZXIoIHhyLCBzdGFydExvY2F0b3IsIG1fZ2V0RW5jb2RpbmcsIG1fZ2V0VmVyc2lvbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvc3RMb2FkICggUm9vdCByICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgci5fcHJvcHMuc2V0RW5jb2RpbmcoIChTdHJpbmcpIF9tX2dldEVuY29kaW5nLmludm9rZSggX3hyLCBudWxsICkgKTsKKyAgICAgICAgICAgICAgICByLl9wcm9wcy5zZXRWZXJzaW9uICggKFN0cmluZykgX21fZ2V0VmVyc2lvbiAuaW52b2tlKCBfeHIsIG51bGwgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgUGljY29sb1NheExvYWRlciAoCisgICAgICAgICAgICBYTUxSZWFkZXIgeHIsIExvY2F0b3Igc3RhcnRMb2NhdG9yLCBNZXRob2QgbV9nZXRFbmNvZGluZywgTWV0aG9kIG1fZ2V0VmVyc2lvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCB4ciwgc3RhcnRMb2NhdG9yICk7CisKKyAgICAgICAgICAgIF9tX2dldEVuY29kaW5nID0gbV9nZXRFbmNvZGluZzsKKyAgICAgICAgICAgIF9tX2dldFZlcnNpb24gPSBtX2dldFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE1ldGhvZCBfbV9nZXRFbmNvZGluZzsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgX21fZ2V0VmVyc2lvbjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdFNheExvYWRlciBleHRlbmRzIFNheExvYWRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTYXhMb2FkZXIgbmV3SW5zdGFuY2UgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFNheExvYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIERlZmF1bHRTYXhMb2FkZXIgKCBYTUxSZWFkZXIgeHIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlciggeHIsIG51bGwgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNheExvYWRlcgorICAgICAgICBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyLCBMZXhpY2FsSGFuZGxlciwgRXJyb3JIYW5kbGVyLCBFbnRpdHlSZXNvbHZlcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFNheExvYWRlciAoIFhNTFJlYWRlciB4ciwgTG9jYXRvciBzdGFydExvY2F0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBfeHIgPSB4cjsKKyAgICAgICAgICAgIF9zdGFydExvY2F0b3IgPSBzdGFydExvY2F0b3I7CisKKyAgICAgICAgICAgIGlmICh4ciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7CisgICAgICAgICAgICAgICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKKworCisgICAgICAgICAgICAgICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyApOworICAgICAgICAgICAgICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggdGhpcyApOworICAgICAgICAgICAgICAgICAgICB4ci5zZXRFcnJvckhhbmRsZXIoIHRoaXMgKTsKKyAgICAgICAgICAgICAgICAgICAgeHIuc2V0RW50aXR5UmVzb2x2ZXIoIHRoaXMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0ICggTG9hZENvbnRleHQgY29udGV4dCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgX2NvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgICAgICBfd2FudExpbmVOdW1iZXJzID0KKyAgICAgICAgICAgICAgICBYbWxPcHRpb25zLm1hc2tOdWxsKAorICAgICAgICAgICAgICAgICAgICBvcHRpb25zICkuaGFzT3B0aW9uKCBYbWxPcHRpb25zLkxPQURfTElORV9OVU1CRVJTICkgJiYKKyAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvciAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdExvYWQgKCBSb290IHIgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkICggUm9vdCByLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHIsIG9wdGlvbnMgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2V0Q29udGV4dCggY29udGV4dCwgb3B0aW9ucyApOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgci5kaXNhYmxlU3RvcmVWYWxpZGF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBfeHIucGFyc2UoIGlucHV0U291cmNlICk7CisKKyAgICAgICAgICAgICAgICBwb3N0TG9hZCggciApOworCisvLyAgICAgICAgICAgICAgICAvLyBQaWNjb2xvIHNwZWNpZmljIGFjY2VzcyB0byBlbmNvZGluZyBhbmQgdmVyc2lvbgorLy8gICAgICAgICAgICAgICAgX3Byb3BzLnNldEVuY29kaW5nKCBwaWNjb2xvLmdldEVuY29kaW5nKCkgKTsKKy8vICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRWZXJzaW9uKCBwaWNjb2xvLmdldFZlcnNpb24oKSApOworCisgICAgICAgICAgICAgICAgY29udGV4dC5maW5pc2goKTsKKworICAgICAgICAgICAgICAgIHIuYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBYbWxSdW50aW1lRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sRXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKKworICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9CisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvckxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuRE9DVU1FTlRfU09VUkNFX05BTUUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TGluZU51bWJlcigpLCBlLmdldENvbHVtbk51bWJlcigpLCAtMSApOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9IFhtbEVycm9yLmZvck1lc3NhZ2UoIGUuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIGUsIGVyciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBSdW50aW1lRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCByLmVuYWJsZVN0b3JlVmFsaWRhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2F4IENvbnRlbnRIYW5kbGVyCisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBTZXQgY29udGV4dCB0byBudWxsCisgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyICh3aGljaCBpcyBoZWxkIGluIFRMUyBmcm9tIGtlZXBpbmcKKyAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgZG9jdW1lbnQgaW4gbWVtb3J5CisgICAgICAgICAgICBfY29udGV4dCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQgKAorICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRzICkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBxTmFtZTsKKworICAgICAgICAgICAgLy8gT3V0IGN1cnJlbnQgcGFyc2VyIChQaWNjb2xvKSBkb2VzIG5vdCBlcnJvciB3aGVuIGEKKyAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBpcyB1c2VkIGFuZCBub3QgZGVmaW5lZC4gIENoZWNrIGZvciB0aGVzZSBoZXJlCisKKyAgICAgICAgICAgIGlmIChxTmFtZS5pbmRleE9mKCAnOicgKSA+PSAwICYmIG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9CisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIG9mIHVuZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5zdWJzdHJpbmcoIDAsIHFOYW1lLmluZGV4T2YoICc6JyApICkpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oIGVyci50b1N0cmluZygpLCBudWxsLCBlcnIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2NvbnRleHQuYmVnaW4oIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJICk7CisKKyAgICAgICAgICAgIC8vIEJVR0JVRyAtIGRvIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB0byBnZXQgbGluZSBudW1iZXIgZm9yCisgICAgICAgICAgICAvLyBhcyBtYW55IHBhcnRzIG9mIHRoZSBYTUwgYXMgd2UgY2FuCisgICAgICAgICAgICBpZiAoX3dhbnRMaW5lTnVtYmVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgX3N0YXJ0TG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIF9zdGFydExvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIC0xICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCwgbGVuID0gYXR0cy5nZXRMZW5ndGgoKSA7IGkgPCBsZW4gOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcW4gPSBhdHRzLmdldFFOYW1lKCBpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXFuLmVxdWFscyggInhtbG5zIiApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoICIiLCBhdHRzLmdldFZhbHVlKCBpICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXFuLnN0YXJ0c1dpdGgoICJ4bWxuczoiICkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXFuLnN1YnN0cmluZyggNiApOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5mb3JNZXNzYWdlKCAiUHJlZml4IG5vdCBzcGVjaWZpZWQiLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGF0dHMuZ2V0VmFsdWUoIGkgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuZm9yTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZpeCBjYW4ndCBiZSBtYXBwZWQgdG8gbm8gbmFtZXNwYWNlOiAiICsgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQueG1sbnMoIHByZWZpeCwgdXJpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJMb2NhbCA9IGF0dHMuZ2V0TG9jYWxOYW1lKCBpICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJMb2NhbC5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ckxvY2FsID0gYXFuOworCisvLyBnaXZlbiB0aGUgZG9jIDxhIHg6eT0neicvPiwgcGljY29sbyB3aWxsIHJlcG9ydCB0aGUgdXJpIG9mIHRoZSB5CisvLyBhdHRyaWJ1dGUgYXMgJ3gnISAgQmFkIFBpY2NvbG8uICBUaHVzLCBJIGNhbid0IHBlcmZvcm0gdGhlIHVuZGVmaW5lZAorLy8gcHJlZml4IGNoZWNrIGhlcmUuCisvLworLy8gICAgICAgICAgICAgICAgICAgIGlmIChhcW4uaW5kZXhPZiggJzonICkgPj0gMCAmJiBhdHRyVXJpLmxlbmd0aCgpID09IDApCisvLyAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEN1cnNvclhtbEVycm9yKAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugb2YgdW5kZWZpbmVkIG5hbWVzcGFjZSBwcmVmaXg6ICIgKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcW4uc3Vic3RyaW5nKCAwLCBhcW4uaW5kZXhPZiggJzonICkgKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7CisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFJ1bnRpbWVFeGNlcHRpb24oCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOworLy8gICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5hdHRyKCBhdHRyTG9jYWwsIGF0dHJVcmksIGF0dHMuZ2V0VmFsdWUoIGkgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQgKAorICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lICkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZXh0LmVuZCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCisKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgX2NvbnRleHQudGV4dCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZXh0LnRleHQoIGNoLCBzdGFydCwgbGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb21tZW50ICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBfY29udGV4dC5jb21tZW50KCBjaCwgc3RhcnQsIGxlbmd0aCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uICggU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEgKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBfY29udGV4dC5wcm9jaW5zdCggdGFyZ2V0LCBkYXRhICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCApCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jb250ZXh0LmRvY3R5cGUoIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVycm9yIEhhbmRsaW5nCisgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZXJyb3IgKCBTQVhQYXJzZUV4Y2VwdGlvbiBlICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBYbWxFcnJvciBlcnIgPQorICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoICJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBYbWxFcnJvci5TRVZFUklUWV9FUlJPUiApOworCisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUnVudGltZUV4Y2VwdGlvbiggZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyAoIFNBWFBhcnNlRXhjZXB0aW9uIGUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRocm93IGF3YXkgd2FyaW5ncyBmb3Igbm93CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnRpdHkgUmVzb2x2ZXIKKyAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwdWJsaWMgaWQgPSAiICsgcHVibGljSWQpOworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW0gaWQgPSAiICsgc3lzdGVtSWQpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiIiApICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKCBMb2NhdG9yIGxvY2F0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBfbG9jYXRvciA9IGxvY2F0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJlZ2luc1dpdGhYbWwoIHByZWZpeCApICYmCisgICAgICAgICAgICAgICAgISAoICJ4bWwiLmVxdWFscyggcHJlZml4ICkgJiYgX3htbDE5OThVcmkuZXF1YWxzKCB1cmkgKSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhtbEVycm9yIGVyciA9CisgICAgICAgICAgICAgICAgICAgIFhtbEVycm9yLmZvck1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZml4IGNhbid0IGJlZ2luIHdpdGggWE1MOiAiICsgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgWG1sRXJyb3IuU0VWRVJJVFlfRVJST1IgKTsKKworICAgICAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nKCksIG51bGwsIGVyciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWdub3JlZAorICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24ge30KKyAgICAgICAgcHVibGljIHZvaWQgc2tpcHBlZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkgKCBTdHJpbmcgbmFtZSApIHRocm93cyBTQVhFeGNlcHRpb24geyB9CisgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eSAoIFN0cmluZyBuYW1lICkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7IH0KKworICAgICAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIF94cjsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgTG9jYXRvciAgICAgX2xvY2F0b3I7CisgICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgX3dhbnRMaW5lTnVtYmVyczsKKyAgICAgICAgcHJpdmF0ZSBMb2NhdG9yICAgICBfc3RhcnRMb2NhdG9yOworICAgIH0KKyAgICAKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIElucHV0U3RyZWFtIGluLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgZW5jb2RpbmdPdmVycmlkZSA9CisgICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoIG9wdGlvbnMsIFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HICk7CisKKyAgICAgICAgaWYgKGVuY29kaW5nT3ZlcnJpZGUgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIGVuY29kaW5nT3ZlcnJpZGUgKTsKKworICAgICAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGphdmFFbmNvZGluZyA9IGVuY29kaW5nT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIHJldHVybiBsb2FkWG1sKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGluLCBqYXZhRW5jb2RpbmcgKSwgdHlwZSwgb3B0aW9ucyApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvYWRYbWwoIG5ldyBJbnB1dFNvdXJjZSggaW4gKSwgdHlwZSwgb3B0aW9ucyApOworICAgIH0KKworICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFJlYWRlciByLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbG9hZFhtbCggbmV3IElucHV0U291cmNlKCByICksIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKCBJbnB1dFNvdXJjZSBpcywgU2NoZW1hVHlwZSB0eXBlLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaXMuc2V0U3lzdGVtSWQoICJmaWxlOi8vIiApOworCisgICAgICAgIGdldFNheExvYWRlcigpLmxvYWQoIHRoaXMsIGlzLCBvcHRpb25zICk7CisKKyAgICAgICAgcmV0dXJuIGF1dG9UeXBlZERvY3VtZW50KCB0eXBlLCBvcHRpb25zICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBYbWxPYmplY3QgbG9hZFhtbCAoIFN0cmluZyBzLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByID0gbmV3IFN0cmluZ1JlYWRlciggcyApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbG9hZFhtbCggciwgdHlwZSwgb3B0aW9ucyApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlN0cmluZ1JlYWRlciBzaG91bGQgbm90IHRocm93IElPRXhjZXB0aW9uIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBYbWxFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0cnkgeyByLmNsb3NlKCk7IH0gY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkgeyB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzb2NpYXRlU291cmNlTmFtZSAoIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICBTdHJpbmcgc291cmNlTmFtZSA9CisgICAgICAgICAgICAoU3RyaW5nKSBYbWxPcHRpb25zLnNhZmVHZXQoCisgICAgICAgICAgICAgICAgb3B0aW9ucywgWG1sT3B0aW9ucy5ET0NVTUVOVF9TT1VSQ0VfTkFNRSApOworCisgICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICBfcHJvcHMuc2V0U291cmNlTmFtZSggc291cmNlTmFtZSApOworICAgIH0KKworICAgIC8vCisgICAgLy8gWG1sU2F4SGFuZGxlciBpcyByZXR1cm5lZCB0byBhIHVzZXIgc28gdGhhdCB1c2VyIG1heSBvYnRhaW4gdGhlIGNvbnRlbnQKKyAgICAvLyBhbmQgbGV4aWNhbCBoYW5kbGVycyB0byBwdXNoIGNvbnRlbnQgYW5kIHRoZW4gZ2V0IHRoZSBYbWxPYmplY3QgYXQgdGhlCisgICAgLy8gZW5kIG9mIHRoZSBwYXJzZSBwdXNoLgorICAgIC8vCisKKyAgICBwcml2YXRlIGNsYXNzIFhtbFNheEhhbmRsZXJJbXBsIGV4dGVuZHMgU2F4TG9hZGVyIGltcGxlbWVudHMgWG1sU2F4SGFuZGxlcgorICAgIHsKKyAgICAgICAgWG1sU2F4SGFuZGxlckltcGwgKCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCBudWxsLCBudWxsICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydCBpc0VtcHR5KCk7CisKKyAgICAgICAgICAgIF9vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgICAgIF90eXBlID0gdHlwZTsKKworICAgICAgICAgICAgX2NvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIFJvb3QudGhpcywgb3B0aW9ucyApOworCisgICAgICAgICAgICBzZXRDb250ZXh0KCBfY29udGV4dCwgb3B0aW9ucyApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRlbnRIYW5kbGVyIGdldENvbnRlbnRIYW5kbGVyICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbE9iamVjdCBnZXRPYmplY3QgKCApIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIF9jb250ZXh0LmZpbmlzaCgpOworCisgICAgICAgICAgICBfY29udGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIFJvb3QudGhpcy5hc3NvY2lhdGVTb3VyY2VOYW1lKCBfb3B0aW9ucyApOworCisgICAgICAgICAgICByZXR1cm4gUm9vdC50aGlzLmF1dG9UeXBlZERvY3VtZW50KCBfdHlwZSwgX29wdGlvbnMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTG9hZENvbnRleHQgX2NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgU2NoZW1hVHlwZSAgX3R5cGU7CisgICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyAgX29wdGlvbnM7CisgICAgfQorCisgICAgcHVibGljIFhtbFNheEhhbmRsZXIgbmV3U2F4SGFuZGxlciAoIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgWG1sU2F4SGFuZGxlckltcGwoIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHByaXZhdGUgdm9pZCBuZXdQYXJzZVNheCAoIElucHV0U291cmNlIGluLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgTG9hZENvbnRleHQgY29udGV4dCA9IG5ldyBMb2FkQ29udGV4dCggdGhpcywgb3B0aW9ucyApOworICAgIH0KKworICAgIC8vCisgICAgLy8gSGVscGVyIG9iamVjdCBmb3IgY3JlYXRpbmcgZG9jdW1lbnRzIGluIGEgImxvYWQiIGtpbmRhIHdheQorICAgIC8vCisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZENvbnRleHQKKyAgICB7CisgICAgICAgIExvYWRDb250ZXh0ICggUm9vdCByb290LCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcm9vdCAhPSBudWxsOworCisgICAgICAgICAgICBfb3B0aW9ucyA9IG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIF9xbmFtZUNhY2hlID0gWG1sQmVhbnMuZ2V0UU5hbWVDYWNoZSgpOworCisgICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9SRVBMQUNFX0RPQ1VNRU5UX0VMRU1FTlQgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCApOworCisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZCBSZXBsYWNlIERvY3VtZW50IEVsZW1lbnQ6IEludmFsaWQgbmFtZSwgbG9jYWwgcGFydCBlbXB0eSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgX2Rpc2NhcmREb2NFbGVtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfcmVwbGFjZURvY0VsZW0gPSBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc3RyaXBXaGl0ZXNwYWNlID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1dISVRFU1BBQ0UpOworICAgICAgICAgICAgX3N0cmlwQ29tbWVudHMgPSBvcHRpb25zLmhhc09wdGlvbihYbWxPcHRpb25zLkxPQURfU1RSSVBfQ09NTUVOVFMpOworICAgICAgICAgICAgX3N0cmlwUHJvY2luc3RzID0gb3B0aW9ucy5oYXNPcHRpb24oWG1sT3B0aW9ucy5MT0FEX1NUUklQX1BST0NJTlNUUyk7CisKKyAgICAgICAgICAgIF9zdWJzdGl0dXRlTmFtZXNwYWNlcyA9CisgICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX1NVQlNUSVRVVEVfTkFNRVNQQUNFUyk7CisKKyAgICAgICAgICAgIF9hZGRpdGlvbmFsTmFtZXNwYWNlcyA9CisgICAgICAgICAgICAgICAgKE1hcCkgb3B0aW9ucy5nZXQoWG1sT3B0aW9ucy5MT0FEX0FERElUSU9OQUxfTkFNRVNQQUNFUyk7CisKKyAgICAgICAgICAgIF9yb290ID0gcm9vdDsKKyAgICAgICAgICAgIF9yb290LmVuc3VyZUVtcHR5KCk7CisKKyAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IF9yb290Ll9kb2M7CisgICAgICAgICAgICBfbGFzdFNwbGF5ID0gX3Jvb3QuX2RvYzsKKyAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKKworICAgICAgICAgICAgX2Zyb250aWVyID0gX3Jvb3QuX2RvYzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUm9vdCBnZXRSb290ICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3Jvb3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBnZXRDcCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgX3Jvb3QuaXNMZWZ0T25seSgpOworICAgICAgICAgICAgYXNzZXJ0IGR2ID4gMCB8fCBzLmdldENwU2xvdygpID09IHMuZ2V0Q2NoTGVmdCgpOworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoTGVmdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkanVzdENjaCAoIFNwbGF5IHMsIGludCBkZWx0YSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBfcm9vdC5pc0xlZnRPbmx5KCk7CisKKyAgICAgICAgICAgIHMuYWRqdXN0Q2NoKCBkZWx0YSApOworCisgICAgICAgICAgICAvLyBUaGVyZSBtYXkgYmUgYXR0cnMgYWZ0ZXIgdGhpcyBzcGxheSB3aGljaCBuZWVkIHRoZWlyIGNjaExlZnQncworICAgICAgICAgICAgLy8gdG8gYmUgdXBkYXRlZC4gIFRvIGF2b2lkIHNwbGF5aW5nLCB1cGRhdGUgdGhlbSBieSBoYW5kLgorCisgICAgICAgICAgICBmb3IgKCBzID0gcy5uZXh0U3BsYXkoKSA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0F0dHIoKSB8fCBzLmlzUm9vdCgpOworICAgICAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggZGVsdGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBpbnNlcnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOworCisgICAgICAgICAgICBfcm9vdC5pbnNlcnRTcGxheSggcywgX3Jvb3QuX2xlZnRTcGxheSApOworCisgICAgICAgICAgICBfbGFzdFNwbGF5ID0gczsKKyAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKKworICAgICAgICAgICAgaWYgKCFzLmlzQXR0cigpKQorICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ciA9IHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0ICggU3BsYXkgcywgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhX2ZpbmlzaGVkOworICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoKCkgPT0gMDsKKyAgICAgICAgICAgIGluc2VydCggcyApOworICAgICAgICAgICAgX3Jvb3QuX3RleHQuaW5zZXJ0KCBnZXRDcCggcyApLCBidWYsIG9mZiwgY2NoICk7CisgICAgICAgICAgICBhZGp1c3RDY2goIHMsIGNjaCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydCAoIFNwbGF5IHMsIFN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2goKSA9PSAwOworICAgICAgICAgICAgaW5zZXJ0KCBzICk7CisgICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoIGdldENwKCBzICksIHRleHQgKTsKKyAgICAgICAgICAgIGFkanVzdENjaCggcywgdGV4dC5sZW5ndGgoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2hBZnRlciA9IF9sYXN0Tm9uQXR0ci5nZXRDY2hBZnRlcigpOworCisgICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjY2ggPSBjY2hBZnRlcjsKKworICAgICAgICAgICAgICAgIGludCBjcEFmdGVyID0KKyAgICAgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmdldENwRm9yUG9zKAorICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3QsIF9sYXN0Tm9uQXR0ci5nZXRQb3NBZnRlcigpICk7CisKKyAgICAgICAgICAgICAgICBpbnQgb2ZmID0gX3Jvb3QuX3RleHQudW5PYnNjdXJlKCBjcEFmdGVyLCBjY2ggKTsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgY2NoID4gMCA7IGNjaC0tICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBfcm9vdC5fdGV4dC5fYnVmWyBvZmYgKyBjY2ggLSAxIF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gY2NoIC0gY2NoQWZ0ZXI7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcEFmdGVyICsgY2NoQWZ0ZXIgKyBkZWx0YSwgLSBkZWx0YSApOworICAgICAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGRlbHRhICk7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBkZWx0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWJvcnQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBzaGl0IG11c3QgaGF2ZSBoaXQgdGhlIGZhbiAuLi4KKworICAgICAgICAgICAgLy8gQ2xvc2UgYWxsIGVsZW1lbnRzCisKKyAgICAgICAgICAgIHdoaWxlICggX2Zyb250aWVyICE9IF9yb290Ll9kb2MgKQorICAgICAgICAgICAgICAgIGVuZCgpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmluaXNoICggKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyaXBXaGl0ZXNwYWNlKQorICAgICAgICAgICAgICAgIHN0cmlwTGVhZGluZ1doaXRlc3BhY2UoKTsKKworICAgICAgICAgICAgLy8gVE9ETzogZGVhbCB3aXRoIHVudGVybWluYXRlZCBiZWdpbnMgaGVyZQorCisgICAgICAgICAgICBpZiAoX2Zyb250aWVyICE9IF9yb290Ll9kb2MpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbEV4Y2VwdGlvbiggIkRvY3VtZW50IG5vdCBlbmRlZCIgKTsKKworICAgICAgICAgICAgYXNzZXJ0IF9yb290Ll9sZWZ0T25seTsKKworICAgICAgICAgICAgX2ZpbmlzaGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9yb290OworICAgICAgICAgICAgX2xhc3RQb3MgPSAwOworCisgICAgICAgICAgICBpZiAoX29wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuTE9BRF9UUklNX1RFWFRfQlVGRkVSKSkKKyAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC50cmltKCk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYWRkaXRpb25hbCBuYW1lc3BhY2VzLCBhZGQgdGhlbSBub3csIG1ha2luZyBzdXJlIHdlCisgICAgICAgICAgICAvLyBkb25lIG92ZXIgcmlkZSBleGlzaXRuZyBvbmVzLgorCisgICAgICAgICAgICBpZiAoX2FkZGl0aW9uYWxOYW1lc3BhY2VzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3BsYXkgcyA9IF9yb290Ll9kb2M7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoICFzLmlzUm9vdCgpICYmICFzLmlzQmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIHMgPSBzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPQorICAgICAgICAgICAgICAgICAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXN1YWxseSwgdGhpcyBpcyB0aGUgcHJlZGVmaW5lZCB4bWwgbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCggInhtbCIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX2FkZGl0aW9uYWxOYW1lc3BhY2VzLmdldCggcHJlZml4ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLm5hbWVzcGFjZUZvclByZWZpeCggcHJlZml4LCBmYWxzZSApID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jvb3QuaW5zZXJ0U2luZ2xlU3BsYXlTYW5zU3BsYXlJbkxlZnRPbmx5VHJlZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbG5zKCBuZXcgUU5hbWUoIG5hbWVzcGFjZSwgcHJlZml4ICkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFib3ZlIGluc2VydCBzaG91bGQgbm90IHNwbGF5IHRoZSB0cmVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIG1vc3Qgb2YgbG9hZGluZywgSSBkb24ndCBpbnZhbGlkYXRlIHRoZSBkb2N1bWVudAorICAgICAgICAgICAgLy8gdmVyc2lvbiBiZWNhdXNlIG5vdGhpbmcgc2hvdWxkIGJlIHNlbnNpdGl2ZSB0byBpdCB3aGlsZQorICAgICAgICAgICAgLy8gbG9hZGluZy4gIFdoZW4gZmluaXNoZWQgbG9hZGluZywgYnVtcCBpdC4KKworICAgICAgICAgICAgX3Jvb3QuaW52YWxpZGF0ZVZlcnNpb24oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0IF9yb290LmlzTGVmdE9ubHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBzdWJzdGl0dXRlVXJpID0KKyAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggdXJpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggc3Vic3RpdHV0ZVVyaSwgbG9jYWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIF9xbmFtZUNhY2hlLmdldE5hbWUoIHVyaSwgbG9jYWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUU5hbWUgY2hlY2tOYW1lICggUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZVVyaSA9CisgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3Vic3RpdHV0ZVVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBfcW5hbWVDYWNoZS5nZXROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGVVcmksIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWVBdHRyICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdWJzdGl0dXRlTmFtZXNwYWNlcyAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQorICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfc3Vic3RpdHV0ZU5hbWVzcGFjZXMuZ2V0KCB1cmkgKTsKKworICAgICAgICAgICAgICAgIGlmIChzdWJzdGl0dXRlVXJpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcW5hbWVDYWNoZS5nZXROYW1lKCBzdWJzdGl0dXRlVXJpLCBsb2NhbCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gX3FuYW1lQ2FjaGUuZ2V0TmFtZSggdXJpLCBsb2NhbCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSBjaGVja05hbWVBdHRyICggUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3Vic3RpdHV0ZU5hbWVzcGFjZXMgIT0gbnVsbCAmJiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVVcmkgPQorICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzLmdldCggbmFtZS5nZXROYW1lc3BhY2VVUkkoKSApOworCisgICAgICAgICAgICAgICAgaWYgKHN1YnN0aXR1dGVVcmkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgX3FuYW1lQ2FjaGUuZ2V0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRlVXJpLCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZG9jdHlwZSAoIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yb290Ll9wcm9wcy5zZXREb2N0eXBlTmFtZSggbmFtZSApOworICAgICAgICAgICAgX3Jvb3QuX3Byb3BzLnNldERvY3R5cGVQdWJsaWNJZCggcHVibGljSUQgKTsKKyAgICAgICAgICAgIF9yb290Ll9wcm9wcy5zZXREb2N0eXBlU3lzdGVtSWQoIHN5c3RlbUlEICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QmVnaW4gKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCisgICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOworCisgICAgICAgICAgICBpZiAoX2Zyb250aWVyLmlzRG9jKCkgJiYgIV9kb2NFbGVtRGlzY2FyZGVkICYmCisgICAgICAgICAgICAgICAgICAgIChfZGlzY2FyZERvY0VsZW0gfHwgaXNYbWxGcmFnbWVudCggbmFtZSApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZG9jRWxlbURpc2NhcmRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAoX3JlcGxhY2VEb2NFbGVtID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGNvbnRlbnQgdXAgdG8gbm93IGJlY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50IGVsZW1lbnQgaXMgdG8gYmUgcmVtb3ZlZCwgYW5kIEkgZG9udAorICAgICAgICAgICAgICAgICAgICAvLyB3YW50IHRoYXQgY29udGVudCB0byBtaXggd2l0aCB0aGUgcmVhbCBjb250ZW50LgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgX3Jvb3QuZW5zdXJlRW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyID0gX3Jvb3QuX2RvYzsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9yb290Ll9kb2M7CisgICAgICAgICAgICAgICAgICAgIF9sYXN0UG9zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgX2Zyb250aWVyID0gX3Jvb3QuX2RvYzsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuYW1lID0gX3JlcGxhY2VEb2NFbGVtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnNlcnQoIF9mcm9udGllciA9IG5ldyBCZWdpbiggbmFtZSwgX2Zyb250aWVyICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYmVnaW4gKCBTdHJpbmcgbG9jYWwsIFN0cmluZyB1cmkgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnRCZWdpbiggY2hlY2tOYW1lKCBsb2NhbCwgdXJpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYmVnaW4gKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0QmVnaW4oIGNoZWNrTmFtZSggbmFtZSApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVuZCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UpCisgICAgICAgICAgICAgICAgc3RyaXBMZWFkaW5nV2hpdGVzcGFjZSgpOworCisgICAgICAgICAgICBpZiAoX2Zyb250aWVyLmlzRG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfZG9jRWxlbURpc2NhcmRlZCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIlRvbyBtYW55IGVuZCBlbGVtZW50cyIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKKyAgICAgICAgICAgICAgICBhc3NlcnQgX2Zyb250aWVyLmlzQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIV9mcm9udGllci5pc0xlYWYoKTsKKworICAgICAgICAgICAgICAgIGlmIChfbGFzdE5vbkF0dHIgPT0gX2Zyb250aWVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9mcm9udGllcjsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSAxICsgX2Zyb250aWVyLmdldENjaCgpOworICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIudG9nZ2xlSXNMZWFmKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfZnJvbnRpZXIuZ2V0Q2NoQWZ0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgX2Zyb250aWVyLmFkanVzdENjaEFmdGVyKCAtIGNjaCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBfZnJvbnRpZXI7CisgICAgICAgICAgICAgICAgICAgIEVuZCBlID0gbmV3IEVuZCggYiApOworICAgICAgICAgICAgICAgICAgICBiLl9lbmQgPSBlOworICAgICAgICAgICAgICAgICAgICBpbnNlcnQoIGUgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfZnJvbnRpZXIgPSBfZnJvbnRpZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGF0dHIgKCBRTmFtZSBuYW1lLCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0KCBuZXcgQXR0ciggY2hlY2tOYW1lQXR0ciggbmFtZSApICksIGJ1Ziwgb2ZmLCBjY2ggKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYXR0ciAoIFFOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc2VydCggbmV3IEF0dHIoIGNoZWNrTmFtZUF0dHIoIG5hbWUgKSApLCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhdHRyICggU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpLCBTdHJpbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcnQoIG5ldyBBdHRyKCBjaGVja05hbWVBdHRyKCBsb2NhbCwgdXJpICkgKSwgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNjYXJkWG1sbnMgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgX2RvY0VsZW1EaXNjYXJkZWQgJiYgX2Zyb250aWVyLmlzRG9jKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoIF9vcGVuRnJhZ1VyaSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB4bWxucyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQorICAgICAgICB7CisgICAgICAgICAgICBRTmFtZSBuYW1lID0gY2hlY2tOYW1lKCBwcmVmaXgsIHVyaSApOworCisgICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQorICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgeG1sbnMgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgbmFtZSA9IGNoZWNrTmFtZSggbmFtZSApOworCisgICAgICAgICAgICBpZiAoIWRpc2NhcmRYbWxucyggbmFtZSApKQorICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFhtbG5zKCBuYW1lICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29tbWVudCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9zdHJpcENvbW1lbnRzKQorICAgICAgICAgICAgICAgIGluc2VydCggbmV3IENvbW1lbnQoKSwgYnVmLCBvZmYsIGNjaCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb21tZW50ICggU3RyaW5nIHZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfc3RyaXBDb21tZW50cykKKyAgICAgICAgICAgICAgICBpbnNlcnQoIG5ldyBDb21tZW50KCksIHZhbHVlICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByb2NpbnN0ICggU3RyaW5nIHRhcmdldCwgY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQorICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgYnVmLCBvZmYsIGNjaCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcm9jaW5zdCAoIFN0cmluZyB0YXJnZXQsIFN0cmluZyB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX3N0cmlwUHJvY2luc3RzKQorICAgICAgICAgICAgICAgIGluc2VydCggbmV3IFByb2NpbnN0KCB0YXJnZXQgKSwgdmFsdWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIHJldHVybnMgdGhlIGNwIHdoZXJlIG5ldyB0ZXh0IHNob3VsZCBnby4KKyAgICAgICAgLy8KKworICAgICAgICBpbnQgcHJlVGV4dCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFfZmluaXNoZWQ7CisKKyAgICAgICAgICAgIHJldHVybiBnZXRDcCggX2xhc3ROb25BdHRyICkgKyBfbGFzdE5vbkF0dHIuZ2V0Q2NoKCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBOZXcgdGV4dCBoYXMgYmVlbiBwbGFjZWQsIGFkanVzdC4uLgorICAgICAgICAvLworCisgICAgICAgIHZvaWQgcG9zdFRleHQgKCBpbnQgY3AsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBvZmYgPSBfcm9vdC5fdGV4dC51bk9ic2N1cmUoIGNwLCBjY2ggKTsKKworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgICAgIHdoaWxlICggaSA8IGNjaCAmJiBpc1doaXRlU3BhY2UoIF9yb290Ll90ZXh0Ll9idWZbIG9mZiArIGkgXSApICkKKyAgICAgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3Jvb3QuX3RleHQucmVtb3ZlKCBjcCwgaSApOworICAgICAgICAgICAgICAgICAgICBjY2ggLT0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjY2ggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7CisgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7CisgICAgICAgICAgICAgICAgX2xhc3ROb25BdHRyLmFkanVzdENjaEFmdGVyKCBjY2ggKTsKKworICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2ggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdGV4dCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKKworICAgICAgICAgICAgaW50IHN0YXJ0ID0gb2ZmOworICAgICAgICAgICAgaW50IGVuZCA9IG9mZiArIGNjaDsKKworICAgICAgICAgICAgaWYgKF9zdHJpcFdoaXRlc3BhY2UgJiYgX2xhc3ROb25BdHRyLmdldENjaEFmdGVyKCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIHN0YXJ0IDwgZW5kICYmIGlzV2hpdGVTcGFjZSggYnVmWyBzdGFydCBdICkgKQorICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY2NoVGV4dCA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgICAgICBpZiAoY2NoVGV4dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2xhc3RTcGxheSA9IF9sYXN0Tm9uQXR0cjsKKyAgICAgICAgICAgICAgICBfbGFzdFBvcyA9IF9sYXN0Tm9uQXR0ci5nZXRFbmRQb3MoKTsKKworICAgICAgICAgICAgICAgIF9yb290Ll90ZXh0Lmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q3AoIF9sYXN0Tm9uQXR0ciApICsgX2xhc3ROb25BdHRyLmdldENjaCgpLAorICAgICAgICAgICAgICAgICAgICBidWYsIHN0YXJ0LCBjY2hUZXh0ICk7CisKKyAgICAgICAgICAgICAgICBfbGFzdE5vbkF0dHIuYWRqdXN0Q2NoQWZ0ZXIoIGNjaFRleHQgKTsKKyAgICAgICAgICAgICAgICBhZGp1c3RDY2goIF9sYXN0Tm9uQXR0ciwgY2NoVGV4dCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0ZXh0ICggU3RyaW5nIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgIV9maW5pc2hlZDsKKworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGludCBlbmQgPSB0ZXh0Lmxlbmd0aCgpOworCisgICAgICAgICAgICBpZiAoX3N0cmlwV2hpdGVzcGFjZSAmJiBfbGFzdE5vbkF0dHIuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICggc3RhcnQgPCBlbmQgJiYgaXNXaGl0ZVNwYWNlKCB0ZXh0LmNoYXJBdCggc3RhcnQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNjaFRleHQgPSBlbmQgLSBzdGFydDsKKworICAgICAgICAgICAgaWYgKGNjaFRleHQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9sYXN0U3BsYXkgPSBfbGFzdE5vbkF0dHI7CisgICAgICAgICAgICAgICAgX2xhc3RQb3MgPSBfbGFzdE5vbkF0dHIuZ2V0RW5kUG9zKCk7CisKKyAgICAgICAgICAgICAgICBfcm9vdC5fdGV4dC5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgIGdldENwKCBfbGFzdE5vbkF0dHIgKSArIF9sYXN0Tm9uQXR0ci5nZXRDY2goKSwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCwgc3RhcnQsIGNjaFRleHQgKTsKKworICAgICAgICAgICAgICAgIF9sYXN0Tm9uQXR0ci5hZGp1c3RDY2hBZnRlciggY2NoVGV4dCApOworICAgICAgICAgICAgICAgIGFkanVzdENjaCggX2xhc3ROb25BdHRyLCBjY2hUZXh0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBbm5vdGF0ZXMgdGhlIGxhc3QgdGhpbmcgaW5zZXJ0ZWQKKyAgICAgICAgdm9pZCBhbm5vdGF0ZSAoIFhtbEJvb2ttYXJrIHhtbEJvb2ttYXJrICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEFubm90YXRpb24oIF9yb290LCB4bWxCb29rbWFyayApLgorICAgICAgICAgICAgICAgIHNldCggX2xhc3RTcGxheSwgX2xhc3RQb3MgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbGluZU51bWJlckFubm90YXRpb24gKCBpbnQgbGluZSwgaW50IGNvbHVtbiwgaW50IG9mZnNldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFubm90YXRlKCBuZXcgWG1sTGluZU51bWJlciggbGluZSwgY29sdW1uLCBvZmZzZXQgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBsaW5lTnVtYmVyQW5ub3RhdGlvbiAoIFhNTEV2ZW50IHhlICkKKyAgICAgICAgeworICAgICAgICAgICAgTG9jYXRpb24gbG9jID0geGUuZ2V0TG9jYXRpb24oKTsKKworICAgICAgICAgICAgaWYgKGxvYyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJBbm5vdGF0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2MuZ2V0TGluZU51bWJlcigpLCBsb2MuZ2V0Q29sdW1uTnVtYmVyKCksIC0xICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGphdmVsaW5Bbm5vdGF0aW9uICggWG1sQ3Vyc29yLlhtbEJvb2ttYXJrIGphICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGphICE9IG51bGwpCisgICAgICAgICAgICAgICBhbm5vdGF0ZSggamEgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUm9vdCAgICAgICBfcm9vdDsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0Tm9uQXR0cjsKKyAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgIF9mcm9udGllcjsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgIF9sYXN0U3BsYXk7CisgICAgICAgIHByaXZhdGUgaW50ICAgICAgICBfbGFzdFBvczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9maW5pc2hlZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kaXNjYXJkRG9jRWxlbTsKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSAgICAgIF9yZXBsYWNlRG9jRWxlbTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFdoaXRlc3BhY2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICBfc3RyaXBDb21tZW50czsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9zdHJpcFByb2NpbnN0czsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgIF9kb2NFbGVtRGlzY2FyZGVkOworICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX3N1YnN0aXR1dGVOYW1lc3BhY2VzOworICAgICAgICBwcml2YXRlIE1hcCAgICAgICAgX2FkZGl0aW9uYWxOYW1lc3BhY2VzOworICAgICAgICBwcml2YXRlIFFOYW1lQ2FjaGUgX3FuYW1lQ2FjaGU7CisgICAgICAgIHByaXZhdGUgWG1sT3B0aW9ucyBfb3B0aW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGVDaGlsZHJlbiAoIE5vZGUgbiwgTG9hZENvbnRleHQgY29udGV4dCApCisgICAgeworICAgICAgICBmb3IgKCBOb2RlIGMgPSBuLmdldEZpcnN0Q2hpbGQoKSA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldE5leHRTaWJsaW5nKCkgKQorICAgICAgICAgICAgbG9hZE5vZGUoIGMsIGNvbnRleHQgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZE5vZGUgKCBOb2RlIG4sIExvYWRDb250ZXh0IGNvbnRleHQgKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggbi5nZXROb2RlVHlwZSgpICkKKyAgICAgICAgeworICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6CisgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFIDoKKyAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvYWROb2RlQ2hpbGRyZW4oIG4sIGNvbnRleHQgKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuLmdldExvY2FsTmFtZSgpOworCisgICAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gbi5nZXROb2RlTmFtZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb250ZXh0LmJlZ2luKCBsb2NhbE5hbWUsIG4uZ2V0TmFtZXNwYWNlVVJJKCkgKTsKKworICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKSA7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTm9kZSBhID0gYXR0cnMuaXRlbSggaSApOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGEuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gYS5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhLmdldE5vZGVWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gYS5nZXROb2RlTmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5lcXVhbHMoIF94bWxuc1VyaSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInhtbG5zIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC54bWxucyggIiIsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmF0dHIoIGxvY2FsLCB1cmksIHZhbHVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2FkTm9kZUNoaWxkcmVuKCBuLCBjb250ZXh0ICk7CisKKyAgICAgICAgICAgIGNvbnRleHQuZW5kKCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgorICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC50ZXh0KCBuLmdldE5vZGVWYWx1ZSgpICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5jb21tZW50KCBuLmdldE5vZGVWYWx1ZSgpICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5wcm9jaW5zdCggbi5nZXROb2RlTmFtZSgpLCBuLmdldE5vZGVWYWx1ZSgpICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKKyAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9OT0RFIDoKKyAgICAgICAgY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgorICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVuZXhwZWN0ZWQgbm9kZSIgKTsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdCBsb2FkWG1sICggTm9kZSBub2RlLCBTY2hlbWFUeXBlIHR5cGUsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKKworICAgICAgICBsb2FkTm9kZSggbm9kZSwgY29udGV4dCApOworCisgICAgICAgIGFzc29jaWF0ZVNvdXJjZU5hbWUoIG9wdGlvbnMgKTsKKworICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sT2JqZWN0IGxvYWRYbWwgKAorICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMsIFNjaGVtYVR5cGUgdHlwZSwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9hZFhtbElucHV0U3RyZWFtKCB4aXMsIG9wdGlvbnMgKTsKKworICAgICAgICByZXR1cm4gYXV0b1R5cGVkRG9jdW1lbnQoIHR5cGUsIG9wdGlvbnMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkWG1sSW5wdXRTdHJlYW0gKCBYTUxJbnB1dFN0cmVhbSB4aXMsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgb3B0aW9ucyA9IFhtbE9wdGlvbnMubWFza051bGwoIG9wdGlvbnMgKTsKKworICAgICAgICBYTUxFdmVudCB4ID0geGlzLnBlZWsoKTsKKyAgICAgICAgCisgICAgICAgIGlmICh4ICE9IG51bGwgJiYgeC5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfRUxFTUVOVCkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwIG5zTWFwID0gKChTdGFydEVsZW1lbnQpIHgpLmdldE5hbWVzcGFjZU1hcCgpOworCisgICAgICAgICAgICBpZiAobnNNYXAgIT0gbnVsbCAmJiBuc01hcC5zaXplKCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnB1dEFsbCggbnNNYXAgKTsKKworICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucyggb3B0aW9ucyApOworCisgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXQoIFhtbE9wdGlvbnMuTE9BRF9BRERJVElPTkFMX05BTUVTUEFDRVMsIG5hbWVzcGFjZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb250ZXh0IGNvbnRleHQgPSBuZXcgTG9hZENvbnRleHQoIHRoaXMsIG9wdGlvbnMgKTsKKworICAgICAgICBib29sZWFuIGxpbmVOdW1zID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuTE9BRF9MSU5FX05VTUJFUlMgKTsKKworICAgICAgICBldmVudHM6CisgICAgICAgIGZvciAoIFhNTEV2ZW50IHhlID0geGlzLm5leHQoKSA7IHhlICE9IG51bGwgOyB4ZSA9IHhpcy5uZXh0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCB4ZS5nZXRUeXBlKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9ET0NVTUVOVCA6CisgICAgICAgICAgICAgICAgLy8gQlVHQlVHIChlcmljdmFzKSAxMjI1OCAtIEZJWEVEIGJlbG93CisgICAgICAgICAgICAgICAgU3RhcnREb2N1bWVudCBkb2MgPSAoU3RhcnREb2N1bWVudCkgeGU7CisKKy8vICAgICAgICAgICAgICAgIGNvbnRleHQuZG9jdHlwZSgKKy8vICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0bmFtZSgpLmdldExvY2FsTmFtZSgpLAorLy8gICAgICAgICAgICAgICAgICAgICIiLCBkb2MuZ2V0UHVibGljSWQoKQorCisgICAgICAgICAgICAgICAgX3Byb3BzLnNldERvY3R5cGVTeXN0ZW1JZCggZG9jLmdldFN5c3RlbUlkKCkgKTsKKy8vICAgICAgICAgICAgICAgIF9wdWJsaWNJRCA9IGRvYy5nZXRQdWJsaWNJZCgpOworICAgICAgICAgICAgICAgIF9wcm9wcy5zZXRFbmNvZGluZyggZG9jLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgKTsKKyAgICAgICAgICAgICAgICBfcHJvcHMuc2V0VmVyc2lvbiggZG9jLmdldFZlcnNpb24oKSApOworICAgICAgICAgICAgICAgIF9zdGFuZEFsb25lID0gZG9jLmlzU3RhbmRhbG9uZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuRU5EX0RPQ1VNRU5UIDoKKyAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGluZU51bWJlckFubm90YXRpb24oIHhlICk7CisKKyAgICAgICAgICAgICAgICBicmVhayBldmVudHM7CisKKyAgICAgICAgICAgIGNhc2UgWE1MRXZlbnQuTlVMTF9FTEVNRU5UIDoKKyAgICAgICAgICAgICAgICBpZiAoIXhpcy5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV2ZW50czsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIDoKKyAgICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luKCBYTUxOYW1lSGVscGVyLmdldFFOYW1lKCB4ZS5nZXROYW1lKCkgKSApOworCisgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOworCisgICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSXRlcmF0b3IgYWkgPSAoKFN0YXJ0RWxlbWVudCkgeGUpLmdldEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgIDsgYWkuaGFzTmV4dCgpIDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgWE1MTmFtZUhlbHBlci5nZXRRTmFtZSggYXR0ci5nZXROYW1lKCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0VmFsdWUoKSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoIEF0dHJpYnV0ZUl0ZXJhdG9yIGFpID0gKChTdGFydEVsZW1lbnQpIHhlKS5nZXROYW1lc3BhY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgICA7IGFpLmhhc05leHQoKSA7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYWkubmV4dCgpOworCisgICAgICAgICAgICAgICAgICAgIFhNTE5hbWUgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldFByZWZpeCgpID09IG51bGwgJiYgbG9jYWwuZXF1YWxzKCAieG1sbnMiICkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9ICIiOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQueG1sbnMoIGxvY2FsLCBhdHRyLmdldFZhbHVlKCkgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5FTkRfRUxFTUVOVCA6CisgICAgICAgICAgICAgICAgY29udGV4dC5lbmQoKTsKKworICAgICAgICAgICAgICAgIGlmIChsaW5lTnVtcykKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlNQQUNFIDoKKyAgICAgICAgICAgICAgICBpZiAoKChTcGFjZSkgeGUpLmlnbm9yYWJsZSgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorCisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBIDoKKyAgICAgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhIGNkID0gKENoYXJhY3RlckRhdGEpIHhlOworCisgICAgICAgICAgICAgICAgaWYgKGNkLmhhc0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGV4dCggY2QuZ2V0Q29udGVudCgpICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5saW5lTnVtYmVyQW5ub3RhdGlvbiggeGUgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5DT01NRU5UIDoKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ29tbWVudCBjb21tZW50ID0KKyAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Db21tZW50KSB4ZTsKKworICAgICAgICAgICAgICAgIGlmIChjb21tZW50Lmhhc0NvbnRlbnQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY29tbWVudCggY29tbWVudC5nZXRDb250ZW50KCkgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bXMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT04gOgorICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwcm9jSW5zdHIgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSB4ZTsKKworICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2luc3QoIHByb2NJbnN0ci5nZXRUYXJnZXQoKSwgcHJvY0luc3RyLmdldERhdGEoKSApOworCisgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW1zKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVOdW1iZXJBbm5vdGF0aW9uKCB4ZSApOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBpZ25vcmVkCisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVOVElUWV9SRUZFUkVOQ0UgOgorICAgICAgICAgICAgY2FzZSBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORyA6CisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkVORF9QUkVGSVhfTUFQUElORyA6CisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORyA6CisgICAgICAgICAgICBjYXNlIFhNTEV2ZW50LlhNTF9FVkVOVCA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIHhtbCBldmVudCB0eXBlOiAiICsgeGUuZ2V0VHlwZUFzU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQuZmluaXNoKCk7CisKKyAgICAgICAgYXNzb2NpYXRlU291cmNlTmFtZSggb3B0aW9ucyApOworCisgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgICAgICBhc3NlcnQgaXNMZWZ0T25seSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sT2JqZWN0IHggKQorICAgIHsKKyAgICAgICAgZHVtcCggeCwgU3lzdGVtLm91dCApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sT2JqZWN0IHgsIFByaW50U3RyZWFtIHBzICkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciB4YyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIFJvb3QgciA9ICgoQ3Vyc29yKSB4YykuZ2V0Um9vdCgpOworICAgICAgICByLmR1bXAoIHBzLCBudWxsLCAoKEN1cnNvcikgeGMpLmdldFNwbGF5KCksIGZhbHNlICk7CisgICAgICAgIHhjLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbEN1cnNvciB4YyApCisgICAgeworICAgICAgICBkdW1wKCB4YywgU3lzdGVtLm91dCApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wICggWG1sQ3Vyc29yIHhjLCBQcmludFN0cmVhbSBwcyApCisgICAgeworICAgICAgICBSb290IHIgPSAoKEN1cnNvcikgeGMpLmdldFJvb3QoKTsKKyAgICAgICAgci5kdW1wKCBwcywgbnVsbCwgKChDdXJzb3IpIHhjKS5nZXRTcGxheSgpLCBmYWxzZSApOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBUZXh0ICggUHJpbnRTdHJlYW0gcHMsIGludCBjcCwgaW50IGNjaCwgU3BsYXkgcywgaW50IHAgKQorICAgIHsKKyAgICAgICAgaWYgKGNwID49IDAgJiYgY3AgKyBjY2ggPD0gX3RleHQubGVuZ3RoKCkpCisgICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgX3RleHQuZmV0Y2goIGNwLCBjY2ggKSwgcywgcCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcy5wcmludCggIltzdHJpbmc6IGNwPSIgKyBjcCArICIsIGNjaD0iICsgY2NoICsgIiBdIiApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wVGV4dCAoIFByaW50U3RyZWFtIHBzLCBpbnQgY3AsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgaWYgKGNwID49IDAgJiYgY3AgKyBjY2ggPD0gX3RleHQubGVuZ3RoKCkpCisgICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgX3RleHQuZmV0Y2goIGNwLCBjY2ggKSwgbnVsbCwgMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcy5wcmludCggIltzdHJpbmc6IGNwPSIgKyBjcCArICIsIGNjaD0iICsgY2NoICsgIiBdIiApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wU3RyaW5nICggUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBzICkKKyAgICB7CisgICAgICAgIGR1bXBTdHJpbmcoIHBzLCBzLCBudWxsLCAwICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBHb29iZXJzSW5saW5lICggUHJpbnRTdHJlYW0gcHMsIFNwbGF5IHMsIGludCBwICkKKyAgICB7CisgICAgICAgIGZvciAoIEdvb2JlciBnID0gcy5maXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsKKyAgICAgICAgICAgICAgZyA9IHMubmV4dEdvb2JlciggZyApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUiAmJiBnLmdldFBvcygpID09IHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3Vyc29yR29vYmVyIGNnID0gKEN1cnNvckdvb2JlcikgZzsKKworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiWyIgKyAoKEN1cnNvckdvb2JlcikgZykuZ2V0RGVidWdJZCgpICsgIl0iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcFN0cmluZyAoIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgc3RyLCBTcGxheSBzLCBpbnQgcCApCisgICAgeworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc3RyLmxlbmd0aCgpIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkdW1wR29vYmVyc0lubGluZSggcHMsIHMsIGkgKyBwICk7CisKKyAgICAgICAgICAgIGlmIChpID09IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLi4uIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdCggaSApOworCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcbiIgKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdccicpCisgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcXHIiICk7CisgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKQorICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXFx0IiApOworICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1wiJykKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIlxcXCIiICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHMucHJpbnQoIGNoICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEdvb2JlcnMgKCBQcmludFN0cmVhbSBwcywgR29vYmVyIGcgKQorICAgIHsKKyAgICAgICAgaWYgKGcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoZy5nZXRLaW5kKCkgPT0gQUdHUkVHQVRFKQorICAgICAgICB7CisgICAgICAgICAgICBwcy5wcmludCggIiB7IiApOworICAgICAgICAgICAgZHVtcEdvb2JlcnMoIHBzLCBnLl9nb29iZXJzICk7CisgICAgICAgICAgICBwcy5wcmludCggIn0iICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHMucHJpbnQoICIgLSAiICsgZy5nZXRLaW5kTmFtZSgpICsgIiBwb3M6ICIgKyBnLmdldFBvcygpICk7CisKKyAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IENVUlNPUikKKyAgICAgICAgICAgIHBzLnByaW50KCAiIGlkOiAiICsgKChDdXJzb3JHb29iZXIpIGcpLmdldERlYnVnSWQoKSApOworCisgICAgICAgIGlmIChnLl9uZXh0ICE9IGcuX3BhcmVudC5fZ29vYmVycykKKyAgICAgICAgICAgIGR1bXBHb29iZXJzKCBwcywgZy5fbmV4dCApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wU3BsYXlUcmVlKCBTcGxheSBzLCBQcmludFN0cmVhbSBwcyApCisgICAgeworICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChzLl9yaWdodFNwbGF5ICE9IG51bGwpCisgICAgICAgICAgICBkdW1wU3BsYXlUcmVlKCBzLl9yaWdodFNwbGF5LCBwcyApOworCisgICAgICAgIGZvciAoIFNwbGF5IHQgPSBzLl9wYXJlbnRTcGxheSA7IHQgIT0gbnVsbCA7IHQgPSB0Ll9wYXJlbnRTcGxheSApCisgICAgICAgICAgICBwcy5wcmludCggIiAgIiApOworCisgICAgICAgIHBzLnByaW50KCAiWyIgKyBzLmdldERlYnVnSWQoKSApOworICAgICAgICBwcy5wcmludCggIiBjOiIgKyBzLmdldENjaExlZnQoKSArICIoIiArIHMuZ2V0Q2NoKCkgKyAiKSIpOworICAgICAgICBwcy5wcmludCggIiBiOiIgKyBzLmdldENkb2NCZWdpbkxlZnQoKSArICIoIiArIHMuZ2V0Q2RvY0JlZ2luKCkgKyAiKSIpOworCisgICAgICAgIGlmIChzLl9wYXJlbnRTcGxheSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBwcy5wcmludCggIiBwOiIgKyBzLl9wYXJlbnRTcGxheS5nZXREZWJ1Z0lkKCkgKTsKKyAgICAgICAgICAgIHBzLnByaW50KCBzLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID09IHMgPyAiTCIgOiAiUiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHBzLnByaW50bG4oICJdIiApOworCisgICAgICAgIGlmIChzLl9sZWZ0U3BsYXkgIT0gbnVsbCkKKyAgICAgICAgICAgIGR1bXBTcGxheVRyZWUoIHMuX2xlZnRTcGxheSwgcHMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcCAoIFhtbEN1cnNvciBjLCBib29sZWFuIHZlcmJvc2UgKQorICAgIHsKKyAgICAgICAgKChDdXJzb3IpIGMpLmR1bXAoIHZlcmJvc2UgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wICggKQorICAgIHsKKyAgICAgICAgZHVtcCggU3lzdGVtLm91dCwgbnVsbCwgdGhpcywgZmFsc2UgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wICggYm9vbGVhbiB2ZXJib3NlICkKKyAgICB7CisgICAgICAgIGR1bXAoIFN5c3RlbS5vdXQsIG51bGwsIHRoaXMsIHZlcmJvc2UgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wICggUHJpbnRTdHJlYW0gcHMgKQorICAgIHsKKyAgICAgICAgZHVtcCggcHMsIG51bGwsIHRoaXMsIGZhbHNlICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcCAoIFByaW50U3RyZWFtIHBzLCBTdHJpbmcgbXNnLCBPYmplY3Qgc3JjLCBib29sZWFuIHZlcmJvc2UgKQorICAgIHsKKyAgICAgICAgLy8gVW5kZXIgSW50ZWxsaUosIGlmIHlvdSBjYWxsIGEgZnVuY3Rpb24gZnJvbSB0aGUgZXhwcmVzc2lvbgorICAgICAgICAvLyBldmFsdWF0b3IgYW5kIGl0IHByb2R1Y2VzIHRvbyBtdWNoIG91dHB1dCwgSW50ZWxsaUogd2lsbCBub3QKKyAgICAgICAgLy8gc2hvdyB5b3UgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uICBTbywgSSBkdW1wIHRvIGEgZmlsZQorICAgICAgICAvLyBoZXJlIGFzIHdlbGwgYW5kIHRoZSBnaXZlbiBwcmludCBzdHJlYW0hCisKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoICJjOlxcIiApOworCisgICAgICAgIGlmIChmLmV4aXN0cygpKQorICAgICAgICB7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoIGYsICJ4YmVhbi5kbXAiICk7CisKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgICAgICBQcmludFN0cmVhbSBwczIgPSBudWxsOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBmICk7CisgICAgICAgICAgICAgICAgcHMyID0gbmV3IFByaW50U3RyZWFtKCBvcyApOworCisgICAgICAgICAgICAgICAgZG9EdW1wKCBwczIsIG1zZywgc3JjLCB2ZXJib3NlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHMyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwczIucHJpbnRsbiggIkV4Y2VwdGlvbiBkdXJpbmcgZHVtcC4iICk7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCBwczIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeSB7IG9zLmNsb3NlKCk7IH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGRvRHVtcCggcHMsIG1zZywgc3JjLCB2ZXJib3NlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4Y2VwdGlvbiBkdXJpbmcgZHVtcC4iICk7CisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSggU3lzdGVtLm91dCApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIER1bXBOc01hbmFnZXIgaW1wbGVtZW50cyBOYW1lc3BhY2VNYW5hZ2VyCisgICAgeworICAgICAgICBEdW1wTnNNYW5hZ2VyICggUHJpbnRTdHJlYW0gcHMgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBzID0gcHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbmRfcHJlZml4X2Zvcl9uc3VyaSAoIFN0cmluZyB1cmksIFN0cmluZyBzdWdnZXN0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJkZWJ1Z19wcmVmaXhfIiArIGkrKzsKKworICAgICAgICAgICAgcHMucHJpbnQoICIgW2ZpbmRfcHJlZml4X2Zvcl9uc3VyaTogIiApOworICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKyB1cmkgKyAiXCIgKCIgKyBzdWdnZXN0aW9uICsgIikgLT4gIiArIHByZWZpeCApOworICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOworCisgICAgICAgICAgICByZXR1cm4gcHJlZml4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoICJ4bWwiICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF94bWwxOTk4VXJpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gImRlYnVnX25zXyIgKyBpKys7CisKKyAgICAgICAgICAgIHBzLnByaW50KCAiIFtsb29rdXBfbnN1cmlfZm9yX3ByZWZpeDogIiApOworICAgICAgICAgICAgcHMucHJpbnQoIHByZWZpeCArICIgLT4gXCIiICsgdXJpICsgIlwiIiApOworICAgICAgICAgICAgcHMucHJpbnQoICJdIiApOworCisgICAgICAgICAgICByZXR1cm4gdXJpOworICAgICAgICB9CisKKyAgICAgICAgUHJpbnRTdHJlYW0gcHM7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9EdW1wICgKKyAgICAgICAgUHJpbnRTdHJlYW0gcHMsIFN0cmluZyBtc2csIE9iamVjdCBzcmMsIGJvb2xlYW4gdmVyYm9zZSApCisgICAgeworICAgICAgICBpZiAoIV9hc3NlcnRFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBwcy5wcmludGxuKCAiTm8gZHVtcCBwcm9kdWNlZCAoYXNzZXJ0IG5lZWRzIHRvIGJlIGVuYWJsZWQpIiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTmFtZXNwYWNlTWFuYWdlciBuc20gPSBuZXcgRHVtcE5zTWFuYWdlciggcHMgKTsKKworICAgICAgICBpZiAobXNnICE9IG51bGwpCisgICAgICAgICAgICBwcy5wcmludGxuKCBtc2cgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHMucHJpbnRsbiggIkR1bXA6IiApOworCisgICAgICAgIGlmIChzcmMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIEN1cnNvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcy5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiICBmcm9tIGN1cnNvciAiICsgKChDdXJzb3JHb29iZXIpKChDdXJzb3IpIHNyYykuX2RhdGEuX2dvb2JlcikuZ2V0RGVidWdJZCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBTcGxheSkKKyAgICAgICAgICAgICAgICBwcy5wcmludGxuKCAiICBmcm9tIHNwbGF5ICIgKyAoKFNwbGF5KSBzcmMpLmdldERlYnVnSWQoKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBzLnByaW50bG4oICIgIGZyb20gc3JjICIgKyBzcmMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBkZXB0aCA9IDA7CisKKyAgICAgICAgZm9yICggU3BsYXkgcyA9IF9kb2MgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBraW5kID0gcy5nZXRLaW5kKCk7CisKKyAgICAgICAgICAgIFN0cmluZyBpZHMgPSAiIiArIHMuZ2V0RGVidWdJZCgpOworICAgICAgICAgICAgaWRzID0gIiAgICAgICAgIi5zdWJzdHJpbmcoIDAsIDYgLSBpZHMubGVuZ3RoKCkgKSArIGlkczsKKyAgICAgICAgICAgIHBzLnByaW50KCBpZHMgKyAiOiAiICk7CisKKyAgICAgICAgICAgIGlmIChraW5kID09IEVORCkKKyAgICAgICAgICAgICAgICBkZXB0aC0tOworCisgICAgICAgICAgICBpZiAoIXMuaXNSb290KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGRlcHRoIDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIgICIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCAwICk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBET0MgOgorICAgICAgICAgICAgICAgIHBzLnByaW50KCAiRE9DIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEJFR0lOIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCZWdpbiBiID0gKEJlZ2luKSBzOworCisgICAgICAgICAgICAgICAgaWYgKCFiLmlzTGVhZigpKQorICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOworCisgICAgICAgICAgICAgICAgcHMucHJpbnQoICI8IiApOworICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS50b1N0cmluZygpICk7CisgICAgICAgICAgICAgICAgcHMucHJpbnQoICI+IiApOworCisgICAgICAgICAgICAgICAgaWYgKGIuaXNMZWFmKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYi5nZXRDY2hWYWx1ZSgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgYi5nZXRDY2hWYWx1ZSgpLCBzLCAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZHVtcEdvb2JlcnNJbmxpbmUoIHBzLCBzLCBzLmdldFBvc0xlYWZFbmQoKSApOworCisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPC8iICk7CisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIi8+IiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFUVFIgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiI3htbG5zOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIHMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICk7CisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPVwiIiApOworICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICJAIiApOworICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggcy5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICI9XCIiICk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBUZXh0KCBwcywgcy5nZXRDcFNsb3coKSwgcy5nZXRDY2hWYWx1ZSgpICk7CisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgRU5EIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbmQgZXMgPSAoRW5kKSBzOworICAgICAgICAgICAgICAgIEJlZ2luIGIgPSBlcy5fYmVnaW47CisKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIjwvIiApOworICAgICAgICAgICAgICAgIHBzLnByaW50KCBiLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSApOworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiLz4iICk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDT01NRU5UIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0ZyYWdtZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIkZSQUciICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCAiPCEtLSIgKTsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBzLmdldENjaFZhbHVlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICItLT4iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFBST0NJTlNUIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIjw/IiApOworICAgICAgICAgICAgICAgIHBzLnByaW50KCBzLmdldExvY2FsKCkgKTsKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIiAiICk7CisgICAgICAgICAgICAgICAgZHVtcFRleHQoIHBzLCBzLmdldENwU2xvdygpLCBzLmdldENjaFZhbHVlKCkgKTsKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIj8+IiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIFJPT1QgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiUk9PVCIgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlVua25vd24gc3BsYXkga2luZCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMuZ2V0Q2NoQWZ0ZXIoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKKworICAgICAgICAgICAgICAgIGR1bXBUZXh0KAorICAgICAgICAgICAgICAgICAgICBwcywgcy5nZXRDcFNsb3coKSArIHMuZ2V0Q2NoVmFsdWUoKSwgcy5nZXRDY2hBZnRlcigpLAorICAgICAgICAgICAgICAgICAgICBzLCBzLmdldFBvc0FmdGVyKCkgKTsKKworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXCIiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR1bXBHb29iZXJzSW5saW5lKCBwcywgcywgcy5nZXRFbmRQb3MoKSApOworCisgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLnBlZWtUeXBlKCkuYnVpbGRfdGV4dCggbnNtICk7CisKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIiBbaW52YWxpZDoiICk7CisgICAgICAgICAgICAgICAgcHMucHJpbnQoICJcIiIgKTsKKyAgICAgICAgICAgICAgICBkdW1wU3RyaW5nKCBwcywgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBwcy5wcmludCggIlwiIiApOworICAgICAgICAgICAgICAgIHBzLnByaW50KCAiXSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHVtcEdvb2JlcnMoIHBzLCBzLl9nb29iZXJzICk7CisKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGtpbmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIuZ2V0RmluaXNoKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoICIgW2VuZDogIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIGIuZ2V0RmluaXNoKCkuZ2V0RGVidWdJZCgpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIl0iICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYi5nZXRDb250YWluZXIoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFtjb250YWluZXI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmdldENvbnRhaW5lcigpLmdldERlYnVnSWQoKSArICJdIiApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBFTkQgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRW5kIGVzID0gKEVuZCkgczsKKyAgICAgICAgICAgICAgICAgICAgQmVnaW4gYiA9IGVzLl9iZWdpbjsKKworICAgICAgICAgICAgICAgICAgICBwcy5wcmludCggIiBbYmVnaW46ICIgKyBiLmdldERlYnVnSWQoKSArICJdIiApOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHBzLnByaW50bG4oKTsKKworICAgICAgICBpZiAoZ2V0Q2NoTGVmdCgpID4gX3RleHQubGVuZ3RoKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzLnByaW50bG4oCisgICAgICAgICAgICAgICAgIlRleHQgYnVmZmVyIGhhcyB0b28gZmV3IGNoYXJhY3RlcnMgKCIgKworICAgICAgICAgICAgICAgICAgICAoZ2V0Q2NoTGVmdCgpIC0gX3RleHQubGVuZ3RoKCkpICsgIikiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZ2V0Q2NoTGVmdCgpIDwgX3RleHQubGVuZ3RoKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzLnByaW50bG4oCisgICAgICAgICAgICAgICAgIlRleHQgYnVmZmVyIGhhcyB0b28gbWFueSBjaGFyYWN0ZXJzICgiICsKKyAgICAgICAgICAgICAgICAgICAgKF90ZXh0Lmxlbmd0aCgpIC0gZ2V0Q2NoTGVmdCgpKSArICIpOiAiICk7CisKKyAgICAgICAgICAgIGR1bXBTdHJpbmcoCisgICAgICAgICAgICAgICAgcHMsCisgICAgICAgICAgICAgICAgX3RleHQuZmV0Y2goIGdldENjaExlZnQoKSwgX3RleHQubGVuZ3RoKCkgLSBnZXRDY2hMZWZ0KCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzLnByaW50bG4oICJTcGxheSB0cmVlOiIgKTsKKworICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgaXNMZWZ0T25seTogIiArIF9sZWZ0T25seSApOworICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgdmVyc2lvbjogIiArIGdldFZlcnNpb24oKSApOworICAgICAgICAgICAgcHMucHJpbnRsbiggIiAgZmlyc3Q6ICIgKyBfZG9jLmdldERlYnVnSWQoKSApOworCisgICAgICAgICAgICBwcy5wcmludGxuKCk7CisgICAgICAgICAgICBkdW1wU3BsYXlUcmVlKCB0aGlzLCBwcyApOworICAgICAgICAgICAgcHMucHJpbnRsbigpOworICAgICAgICAgICAgcHMucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgcHMucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydCBhIHNwbGF5IChvciBzcGxheXMpIGludG8gdGhlIHRyZWUuICBUaGlzIGlzIGEgbG93IGxldmVsCisgICAgICogb3BlcmF0aW9uLCBhbmQgb3BlcmF0ZXMgb25seSBvbiB0aGUgc3BsYXkgYXNwZWN0IG9mIHRoZSB0cmVlLgorICAgICAqIEFueSBpbnZhbGlkYXRpb24gbWFpbnRlbmFuY2UgbXVzdCBiZSBoYW5kbGVkIGJ5IGNhbGxlcnMuCisgICAgICovCisKKyAgICB2b2lkIGluc2VydFNwbGF5ICggU3BsYXkgcywgU3BsYXkgYSApCisgICAgeworICAgICAgICBhc3NlcnQgcyAhPSBudWxsOworICAgICAgICBhc3NlcnQgIXMuaXNSb290KCk7CisgICAgICAgIGFzc2VydCBhICE9IG51bGw7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCB2YWxpZGF0ZVNwbGF5VHJlZSgpOworICAgICAgICBhc3NlcnQgIWEuaXNSb290KCk7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBhLmdldFJvb3RTbG93KCkgPT0gdGhpczsKKyAgICAgICAgYXNzZXJ0IHMuX3BhcmVudFNwbGF5ID09IG51bGw7CisgICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGw7CisgICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCB8fCBzLmdldENjaExlZnQoKSA9PSAwOworICAgICAgICBhc3NlcnQgcy5fbGVmdFNwbGF5ICE9IG51bGwgfHwgcy5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKKworICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2goKTsKKyAgICAgICAgaW50IGNiZWdpbiA9IHMuZ2V0Q2RvY0JlZ2luKCk7CisKKyAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjY2ggKz0gcy5nZXRDY2hMZWZ0KCk7CisgICAgICAgICAgICBjYmVnaW4gKz0gcy5nZXRDZG9jQmVnaW5MZWZ0KCk7CisgICAgICAgICAgICBfbGVmdE9ubHkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfbGVmdE9ubHkgJiYgYSA9PSBfbGVmdFNwbGF5KQorICAgICAgICB7CisgICAgICAgICAgICBzLl9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5OworICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSB0aGlzOworCisgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hMZWZ0KCkgPT0gMDsKKyAgICAgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCgKKyAgICAgICAgICAgICAgICBfbGVmdFNwbGF5LmdldENjaExlZnQoKSArIF9sZWZ0U3BsYXkuZ2V0Q2NoKCkgKTsKKworICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7CisgICAgICAgICAgICBzLmFkanVzdENkb2NCZWdpbkxlZnQoCisgICAgICAgICAgICAgICAgX2xlZnRTcGxheS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfbGVmdFNwbGF5LmdldENkb2NCZWdpbigpICk7CisKKyAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gczsKKyAgICAgICAgICAgIF9sZWZ0U3BsYXkgPSBzOworCisgICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBjY2ggKTsKKyAgICAgICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIGNiZWdpbiApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9sZWZ0T25seSAmJiBjY2ggPT0gMCAmJiBjYmVnaW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZSBzcGxheSB0byBpbnNlcnQgaGFzIG5vIGNjaCBvciBjYmVnaW4sIHRoZW4gd2hlbgorICAgICAgICAgICAgLy8gdGhlIHRyZWUgaXMgbGVmdCBvbmx5IGNoaWxkcmVuLCBJIG5lZWQgbm90IHNwbGF5LgorICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBhLl9wYXJlbnRTcGxheTsKKyAgICAgICAgICAgIHMuX2xlZnRTcGxheSA9IGE7CisgICAgICAgICAgICBhLl9wYXJlbnRTcGxheSA9IHM7CisgICAgICAgICAgICBzLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID0gczsKKworICAgICAgICAgICAgcy5hZGp1c3RDY2hMZWZ0KCBhLmdldENjaExlZnQoKSArIGEuZ2V0Q2NoKCkgKTsKKworICAgICAgICAgICAgcy5hZGp1c3RDZG9jQmVnaW5MZWZ0KAorICAgICAgICAgICAgICAgIGEuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgYS5nZXRDZG9jQmVnaW4oKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU3BsYXkgcDsKKworICAgICAgICAgICAgaWYgKGEuX3JpZ2h0U3BsYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAocCA9IGEpLl9yaWdodFNwbGF5ID0gczsKKyAgICAgICAgICAgICAgICBfbGVmdE9ubHkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBwID0gYS5fcmlnaHRTcGxheSA7IHAuX2xlZnRTcGxheSAhPSBudWxsIDsgKQorICAgICAgICAgICAgICAgICAgICBwID0gcC5fbGVmdFNwbGF5OworCisgICAgICAgICAgICAgICAgcC5fbGVmdFNwbGF5ID0gczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy5fcGFyZW50U3BsYXkgPSBwOworCisgICAgICAgICAgICBmb3IgKCBwID0gcyA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBwLl9wYXJlbnRTcGxheTsKKworICAgICAgICAgICAgICAgIGlmICh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKHQuX2xlZnRTcGxheSA9PSBwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5hZGp1c3RDY2hMZWZ0KCBjY2ggKTsKKyAgICAgICAgICAgICAgICAgICAgdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBjYmVnaW4gKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwID0gdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy5zcGxheSggdGhpcywgdGhpcyApOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHZhbGlkYXRlU3BsYXlUcmVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbCBpbnNlcnQgdG8gaW5zZXJ0IGEgc2luZ2xlIHNwbGF5IGludG8gYSBsZWZ0b25seSB0cmVlIHdpdGhvdXQKKyAgICAgKiBjYXVzaW5nIHRoZSB0cmVlIHRvIGdvIG5vbiBsZWZ0IG9ubHkuICBCZWNhdXNlIHRoaXMgZG9lcyBub3Qgc3BsYXksCisgICAgICogZG9pbmcgdGhpcyB0b28gbWFueSB0aW1lcyBjYW4gYmUgdmVyeSBpbmVmZmljaWVudC4KKyAgICAgKi8KKyAgICAKKyAgICB2b2lkIGluc2VydFNpbmdsZVNwbGF5U2Fuc1NwbGF5SW5MZWZ0T25seVRyZWUgKCBTcGxheSBzLCBTcGxheSBhICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfbGVmdE9ubHk7CisgICAgICAgIGFzc2VydCBzLl9yaWdodFNwbGF5ID09IG51bGw7CisgICAgICAgIGFzc2VydCBzLl9sZWZ0U3BsYXkgPT0gbnVsbDsKKworICAgICAgICBzLl9sZWZ0U3BsYXkgPSBhOworICAgICAgICBzLl9wYXJlbnRTcGxheSA9IGEuX3BhcmVudFNwbGF5OworICAgICAgICBhLl9wYXJlbnRTcGxheS5fbGVmdFNwbGF5ID0gczsKKyAgICAgICAgYS5fcGFyZW50U3BsYXkgPSBzOworCisgICAgICAgIHMuYWRqdXN0Q2NoTGVmdCggYS5nZXRDY2hMZWZ0KCkgKyBhLmdldENjaCgpICk7CisgICAgICAgIHMuYWRqdXN0Q2RvY0JlZ2luTGVmdCggYS5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBhLmdldENkb2NCZWdpbigpICk7CisgICAgICAgIAorICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2goKTsKKyAgICAgICAgaW50IGNiZWdpbiA9IHMuZ2V0Q2RvY0JlZ2luKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKCBTcGxheSBwID0gcy5fcGFyZW50U3BsYXkgOyBwICE9IG51bGwgOyBwID0gcC5fcGFyZW50U3BsYXkgKQorICAgICAgICB7CisgICAgICAgICAgICBwLmFkanVzdENjaExlZnQoIGNjaCApOworICAgICAgICAgICAgcC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBjYmVnaW4gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBbIGZpcnN0LCBsYXN0ICkgc3BsYXlzIGZyb20gdG90YWwgc2VxdWVuY2U6CisgICAgICoKKyAgICAgKiAgICAgQSAtIGZpcnN0IC0gQiAtIHggLSBsYXN0IC0gQworICAgICAqCisgICAgICogd2hlcmUgZmlyc3QsIGxhc3QgYW5kIHggYXJlIGluZGl2aWR1YWwgc3BsYXlzIGFuZCBBLCBCIGFuZCBDIGFyZQorICAgICAqIG11bHRpcGxlLCBpbnRlcnZlbmluZyBzcGxheXMuICBSZXR1cm4gdGhlIHJlc3VsdCB3aXRoIHggYXQgdGhlIHRvcAorICAgICAqIGFuZCBmaXJzdCBoaXMgbGVmdCBjaGlsZC4gIFRoaXMgYWxsb3dzIHggdG8gaGF2ZSB0aGUgc3BsYXkKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3MgZm9yIHRoZSB3aG9sZSByZW1vdmVkIHRyZWUuCisgICAgICovCisKKyAgICBTcGxheSByZW1vdmVTcGxheXMgKCBTcGxheSBmaXJzdCwgU3BsYXkgbGFzdCApCisgICAgeworICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKKyAgICAgICAgYXNzZXJ0IGZpcnN0ICE9IGxhc3Q7OworICAgICAgICBhc3NlcnQgIWZpcnN0LmlzUm9vdCgpOworICAgICAgICBhc3NlcnQgIWZpcnN0LmlzRG9jKCk7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBmaXJzdC5nZXRSb290U2xvdygpID09IHRoaXM7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBsYXN0LmdldFJvb3RTbG93KCkgPT0gdGhpczsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGZpcnN0LmNvbXBhcmVTbG93KCBsYXN0ICkgPT0gLTE7CisgICAgICAgIGFzc2VydCAhbGFzdC5pc1Jvb3QoKSB8fCBsYXN0ID09IHRoaXM7CisKKyAgICAgICAgU3BsYXkgeCA9IGxhc3QucHJldlNwbGF5KCk7CisKKyAgICAgICAgaWYgKHggPT0gZmlyc3QpCisgICAgICAgICAgICByZXR1cm4geC5yZW1vdmVTcGxheSggdGhpcyApOworCisgICAgICAgIC8vIE1ha2UgdGhlIGRvZyBsZWchCisKKyAgICAgICAgaWYgKGxhc3QgIT0gdGhpcykKKyAgICAgICAgICAgIGxhc3Quc3BsYXkoIHRoaXMsIHRoaXMgKTsKKworICAgICAgICB4LnNwbGF5KCB0aGlzLCBsYXN0ICk7CisgICAgICAgIGZpcnN0LnNwbGF5KCB0aGlzLCB4ICk7CisKKyAgICAgICAgYXNzZXJ0IHRoaXMgPT0gbGFzdCB8fCB0aGlzLl9sZWZ0U3BsYXkgPT0gbGFzdDsKKyAgICAgICAgYXNzZXJ0IGxhc3QuX2xlZnRTcGxheSA9PSB4OworICAgICAgICBhc3NlcnQgeC5fbGVmdFNwbGF5ID09IGZpcnN0OworICAgICAgICBhc3NlcnQgeC5fcmlnaHRTcGxheSA9PSBudWxsOworICAgICAgICBhc3NlcnQgZmlyc3QuX2xlZnRTcGxheSAhPSBudWxsOworCisgICAgICAgIGludCBmaXJzdENjaExlZnQgPSBmaXJzdC5nZXRDY2hMZWZ0KCk7CisgICAgICAgIGludCBmaXJzdENiZWdpbkxlZnQgPSBmaXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCk7CisKKyAgICAgICAgaW50IGRlbHRhQ2NoTGVmdCA9IGZpcnN0Q2NoTGVmdCAtIGxhc3QuZ2V0Q2NoTGVmdCgpOworICAgICAgICBpbnQgZGVsdGFDYmVnaW5MZWZ0ID0gZmlyc3RDYmVnaW5MZWZ0IC0gbGFzdC5nZXRDZG9jQmVnaW5MZWZ0KCk7CisKKyAgICAgICAgbGFzdC5hZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaExlZnQgKTsKKyAgICAgICAgbGFzdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCBkZWx0YUNiZWdpbkxlZnQgKTsKKworICAgICAgICBpZiAobGFzdCAhPSB0aGlzKQorICAgICAgICB7CisgICAgICAgICAgICBhZGp1c3RDY2hMZWZ0KCBkZWx0YUNjaExlZnQgKTsKKyAgICAgICAgICAgIGFkanVzdENkb2NCZWdpbkxlZnQoIGRlbHRhQ2JlZ2luTGVmdCApOworICAgICAgICB9CisKKyAgICAgICAgeC5hZGp1c3RDY2hMZWZ0KCAtIGZpcnN0Q2NoTGVmdCApOworICAgICAgICB4LmFkanVzdENkb2NCZWdpbkxlZnQoIC0gZmlyc3RDYmVnaW5MZWZ0ICk7CisKKyAgICAgICAgZmlyc3QuYWRqdXN0Q2NoTGVmdCggLSBmaXJzdENjaExlZnQgKTsKKyAgICAgICAgZmlyc3QuYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBmaXJzdENiZWdpbkxlZnQgKTsKKworICAgICAgICBhc3NlcnQgZmlyc3QuZ2V0Q2NoTGVmdCgpID09IDA7CisgICAgICAgIGFzc2VydCBmaXJzdC5nZXRDZG9jQmVnaW5MZWZ0KCkgPT0gMDsKKworICAgICAgICBhc3NlcnQgeC5nZXRDY2hMZWZ0KCkgKyBkZWx0YUNjaExlZnQgKyB4LmdldENjaCgpID09IDA7CisgICAgICAgIGFzc2VydCB4LmdldENkb2NCZWdpbkxlZnQoKSArIGRlbHRhQ2JlZ2luTGVmdCArIHguZ2V0Q2RvY0JlZ2luKCkgPT0gMDsKKworICAgICAgICBmaXJzdC5fbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IGxhc3Q7CisgICAgICAgIGxhc3QuX2xlZnRTcGxheSA9IGZpcnN0Ll9sZWZ0U3BsYXk7CisgICAgICAgIHguX3BhcmVudFNwbGF5ID0gbnVsbDsKKworICAgICAgICBmaXJzdC5fbGVmdFNwbGF5ID0gbnVsbDsKKyAgICAgICAgZmlyc3QuX3BhcmVudFNwbGF5ID0gbnVsbDsKKworICAgICAgICBhc3NlcnQgdmFsaWRhdGVTcGxheVRyZWUoKTsKKworICAgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2FibGVTdG9yZVZhbGlkYXRpb24gKCApCisgICAgICAgIHsgZHYrKzsgcmV0dXJuIHRydWU7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlU3RvcmVWYWxpZGF0aW9uICAoICkKKyAgICAgICAgeyBkdi0tOyByZXR1cm4gdHJ1ZTsgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZHY7CisKKyAgICB7CisgICAgICAgIGlmICghInRydWUiLmVxdWFscyggU3lzdGVtLmdldFByb3BlcnR5KCAidHJlZWFzc2VydHMiICkpKQorICAgICAgICAgICAgZGlzYWJsZVN0b3JlVmFsaWRhdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlICggKQorICAgIHsKKyAgICAgICAgaWYgKGR2ICE9IDApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRvVmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gcnRlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRG9jdW1lbnQgaW52YWxpZDogIiArIHJ0ZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgIHJ0ZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGR1bXAoIHRydWUgKTsKKyAgICAgICAgICAgIHRocm93IHJ0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUmVjdXJzaXZlIGRlc2NlbnQgdmFsaWRhdGlvbiBvZiB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQKKyAgICAvLworICAgIC8vIEdyYW1tZXIgZm9yIHZhbGlkIGNvbnRlbnQgb2YgYSBkb2N1bWVudAorICAgIC8vCisgICAgLy8gPGRvYz4gICAgICAgIDo6PSBET0MgPGF0dHJpYnV0ZXM+IDxjb250ZW50PiBST09UCisgICAgLy8gPGF0dHJpYnV0ZXM+IDo6PSAoIEFUVFIgKSoKKyAgICAvLyA8Y29udGVudD4gICAgOjo9ICggKCBDT01NRU5UIHwgUFJPQ0lOU1QgfCA8ZWxlbWVudD4pICkqCisgICAgLy8gPGVsZW1lbnQ+ICAgIDo6PSAoIExFQUYgIDxhdHRyaWJ1dGVzPiApIHwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgKCBCRUdJTiA8YXR0cmlidXRlcz4gPGNvbnRlbnQ+IEVORCApCisgICAgLy8KKworICAgIHByaXZhdGUgU3BsYXkgdmFsaWRhdGVBdHRyaWJ1dGVzICggU3BsYXkgcyApCisgICAgeworICAgICAgICB3aGlsZSAoIHMuZ2V0S2luZCgpID09IEFUVFIgKQorICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTcGxheSB2YWxpZGF0ZUNvbnRlbnQgKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrID0gcy5nZXRLaW5kKCk7CisKKyAgICAgICAgICAgIGlmIChrID09IENPTU1FTlQgfHwgayA9PSBQUk9DSU5TVCkKKyAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTcGxheSBxID0gczsKKyAgICAgICAgICAgICAgICBzID0gdmFsaWRhdGVFbGVtZW50KCBzICk7CisKKyAgICAgICAgICAgICAgICBpZiAocSA9PSBzKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHByaXZhdGUgU3BsYXkgdmFsaWRhdGVFbGVtZW50ICggU3BsYXkgcyApCisgICAgeworICAgICAgICBpZiAocy5nZXRLaW5kKCkgPT0gQkVHSU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFNwbGF5IGIgPSBzOworCisgICAgICAgICAgICBzID0gdmFsaWRhdGVBdHRyaWJ1dGVzKCBzLm5leHRTcGxheSgpICk7CisKKyAgICAgICAgICAgIGlmICghYi5pc0xlYWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gdmFsaWRhdGVDb250ZW50KCBzICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0VuZCgpOiAiTWlzc2luZyBFTkQsIHNwbGF5OiAiICsgcy5nZXREZWJ1Z0lkKCk7CisKKyAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZURvYyAoICkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBfZG9jLm5leHRTcGxheSgpOworCisgICAgICAgIHMgPSB2YWxpZGF0ZUF0dHJpYnV0ZXMoIHMgKTsKKworICAgICAgICBzID0gdmFsaWRhdGVDb250ZW50KCBzICk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNSb290KCk6ICJFeHBlY3RlZCByb290IjsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUNvbnRleHQKKyAgICB7CisgICAgICAgIGludCBfbnVtU3BsYXlUeXBlczsKKyAgICAgICAgaW50IF9jSW52YWxpZGF0YWJsZVR5cGVzOworICAgICAgICBpbnQgX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVHb29iZXIgKCBHb29iZXIgZywgU3BsYXkgcywgVmFsaWRhdGVDb250ZXh0IGNvbnRleHQgKQorICAgIHsKKyAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gVFlQRTsKKyAgICAgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKworICAgICAgICAgICAgY29udGV4dC5fbnVtU3BsYXlUeXBlcysrOworCisgICAgICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgZzsKKworICAgICAgICAgICAgaWYgKHR5cGUudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5fY0ludmFsaWRhdGFibGVUeXBlcysrOworCisgICAgICAgICAgICBpZiAodHlwZS5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuX2NFbGVtT3JkZXJTZW5zaXRpdmVUeXBlcysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGcuZ2V0S2luZCgpICE9IFRZUEU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgZy5nZXRTcGxheSgpID09IHM7CisgICAgICAgIGFzc2VydCBnLmdldFJvb3QoKSA9PSB0aGlzOworICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA+PSAwOworICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA8PSBzLmdldE1heFBvcygpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBkb1ZhbGlkYXRlICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZhbGlkYXRlRG9jKCk7CisgICAgICAgIGFzc2VydCB2YWxpZGF0ZVNwbGF5VHJlZSgpOworICAgICAgICBhc3NlcnQgZ2V0Q2NoTGVmdCgpID09IF90ZXh0Lmxlbmd0aCgpOworCisgICAgICAgIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSgpOworCisvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IGlzIHRoZSByb290IHR5cGUgaXMgbnVsbCwgdGhlcmUgYXJlIG5vIHR5cGVzIGluCisvLyB0cmVlIGF0IGFsbAorCisvLyBUT0RPOiBDaGVjayB0aGUgaW52YXJpZW50IHRoYXQgaWYgdGhlcmUgaXMgYSBUeXBlIGFueXdoZXJlCisvLyBpbiB0aGUgZG9jdW1lbnQsIHRoYXQgdGhlcmUgaXMgYW4gZXhpc3RpbmcgY2hhaW4gb2YgdHlwZXMKKy8vIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IGFuZCBpc19va19lbGVtZW50X3VzZXIgb3IgaXNfb2tfYXR0cmlidXRlX3VzZXIsCisvLyBkZXBlbmRpbmcgb24gdGhlIGNhc2UsIHJldHVybnMgb2suCisKKyAgICAgICAgVmFsaWRhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgVmFsaWRhdGVDb250ZXh0KCk7CisKKyAgICAgICAgQ29udGFpbmVyIHJlY2VudENvbnRhaW5lciA9IG51bGw7CisKKyAgICAgICAgZm9yICggU3BsYXkgcyA9IF9kb2MgOyBzICE9IG51bGwgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzLmlzUm9vdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENjaEFmdGVyKCkgPT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNCZWdpbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHM7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgYi5nZXROYW1lKCkgIT0gbnVsbDsKKworICAgICAgICAgICAgICAgIGFzc2VydAorICAgICAgICAgICAgICAgICAgICBiLmdldEZpbmlzaCgpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuZ2V0RmluaXNoKCkuZ2V0Q29udGFpbmVyKCkgPT0gYjsKKworICAgICAgICAgICAgICAgIGlmIChiLmlzTGVhZigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0RmluaXNoKCkuZ2V0Q29udGFpbmVyKCkgPT0gYjsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGIuZ2V0Q2NoVmFsdWUoKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHMuaXNBdHRyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpICE9IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoQWZ0ZXIoKSA9PSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy5pc1Byb2NpbnN0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q29udGFpbmVyKCkgPT0gcmVjZW50Q29udGFpbmVyOworCisgICAgICAgICAgICAgICAgaWYgKCFzLmlzTGVhZigpKQorICAgICAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSAoQ29udGFpbmVyKSBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IHJlY2VudENvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICByZWNlbnRDb250YWluZXIgPSByZWNlbnRDb250YWluZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQuX251bVNwbGF5VHlwZXMgPSAwOworCisgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7CisgICAgICAgICAgICAgICAgICBnID0gcy5uZXh0R29vYmVyKCBnICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlR29vYmVyKCBnLCBzLCBjb250ZXh0ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc0ludmFsaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMucGVla1R5cGUoKSAhPSBudWxsOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQuX251bVNwbGF5VHlwZXMgPT0gMTsKKworICAgICAgICAgICAgICAgIGlmIChzLmlzRG9jKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRDY2hBZnRlcigpID09IDA7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IG4gPSBzLm5leHROb25BdHRyU3BsYXkoKTsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbi5pc1Jvb3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5pc0JlZ2luKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoVmFsdWUoKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoVmFsdWUoKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgY29udGV4dC5fbnVtU3BsYXlUeXBlcyA8PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IGNvbnRleHQuX2NJbnZhbGlkYXRhYmxlVHlwZXMgPT0gX2NJbnZhbGlkYXRhYmxlVHlwZXM7CisgICAgICAgIGFzc2VydCBjb250ZXh0Ll9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMgPT1fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzOworCisgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIGluZGljZXMKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIHZhbGlkYXRlU3BsYXlUcmVlICggKQorICAgIHsKKyAgICAgICAgaWYgKGR2ICE9IDApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRvVmFsaWRhdGVTcGxheVRyZWUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFJ1bnRpbWVFeGNlcHRpb24gcnRlICkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiU3BsYXkgdHJlZSBpbnZhbGlkOiAiICsgcnRlICk7CisKKyAgICAgICAgICAgIGR1bXAoIHRydWUgKTsKKworICAgICAgICAgICAgdGhyb3cgcnRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRhdGVTdGF0cyBleHRlbmRzIEhhc2hNYXAKKyAgICB7CisgICAgICAgIGludCBnZXRDY2ggKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzKCBzICkuX2NjaDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRqdXN0Q2NoICggU3BsYXkgcywgaW50IGNjaERlbHRhICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSBnZXRTdGF0cyggcyApOworICAgICAgICAgICAgc3RhdHMuX2NjaCArPSBjY2hEZWx0YTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDYmVnaW4gKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRzKCBzICkuX2NiZWdpbjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRqdXN0Q2JlZ2luICggU3BsYXkgcywgaW50IGNiZWdpbkRlbHRhICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSBnZXRTdGF0cyggcyApOworICAgICAgICAgICAgc3RhdHMuX2NiZWdpbiArPSBjYmVnaW5EZWx0YTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RhdHMgZ2V0U3RhdHMgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHMgc3RhdHMgPSAoU3RhdHMpIGdldCggcyApOworCisgICAgICAgICAgICBpZiAoc3RhdHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwdXQoIHMsIHN0YXRzID0gbmV3IFN0YXRzKCkgKTsKKworICAgICAgICAgICAgcmV0dXJuIHN0YXRzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdHMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBfY2NoOworICAgICAgICAgICAgcHVibGljIGludCBfY2JlZ2luOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBkb1ZhbGlkYXRlU3BsYXlUcmVlICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOworCisgICAgICAgIFZhbGlkYXRlU3RhdHMgc3RhdHMgPSBuZXcgVmFsaWRhdGVTdGF0cygpOworCisgICAgICAgIGFzc2VydCBfcGFyZW50U3BsYXkgPT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ICA9PSBudWxsOworICAgICAgICBhc3NlcnQgX2RvYy5fbGVmdFNwbGF5ID09IG51bGw7CisKKyAgICAgICAgU3BsYXkgcyA9IHRoaXM7CisKKyAgICAgICAgaWYgKHMuX2xlZnRTcGxheSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OworCisgICAgICAgICAgICB3aGlsZSAoIHMgIT0gbnVsbCAmJiBzLl9sZWZ0U3BsYXkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBzID09IF9kb2M7CisKKyAgICAgICAgbG9vcDoKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMuX2xlZnRTcGxheSA9PSBudWxsICYmIHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHMuZ2V0Q2NoKCkgKTsKKyAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oIHMsIHMuZ2V0Q2RvY0JlZ2luKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMuX3JpZ2h0U3BsYXkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBzID0gcy5fcmlnaHRTcGxheSA7IHMuX2xlZnRTcGxheSAhPSBudWxsIDsgKQorICAgICAgICAgICAgICAgICAgICBzID0gcy5fbGVmdFNwbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTcGxheSBwID0gcy5fcGFyZW50U3BsYXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBwLl9yaWdodFNwbGF5ID09IHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHMuZ2V0Q2NoKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkanVzdENiZWdpbiggcywgcy5nZXRDZG9jQmVnaW4oKSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRqdXN0Q2NoKCBzLCBzdGF0cy5nZXRDY2goIHMuX2xlZnRTcGxheSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHN0YXRzLmdldENiZWdpbiggcy5fbGVmdFNwbGF5ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuX3JpZ2h0U3BsYXkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDY2goIHMsIHN0YXRzLmdldENjaCggcy5fcmlnaHRTcGxheSApICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5hZGp1c3RDYmVnaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHN0YXRzLmdldENiZWdpbiggcy5fcmlnaHRTcGxheSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fbGVmdFNwbGF5ID09IHM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSAhPSBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcC5fcmlnaHRTcGxheTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBzLl9sZWZ0U3BsYXkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuX2xlZnRTcGxheTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCBzID0gX2RvYyA7IHMgIT0gbnVsbCA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFfbGVmdE9ubHkgfHwgcy5fcmlnaHRTcGxheSA9PSBudWxsOiAiIiArIHMuZ2V0RGVidWdJZCgpOworICAgICAgICAgICAgYXNzZXJ0IHMuX2xlZnRTcGxheSAgPT0gbnVsbCB8fCBzLl9sZWZ0U3BsYXkgLl9wYXJlbnRTcGxheSA9PSBzOworICAgICAgICAgICAgYXNzZXJ0IHMuX3JpZ2h0U3BsYXkgPT0gbnVsbCB8fCBzLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9PSBzOworCisgICAgICAgICAgICBpZiAocy5fbGVmdFNwbGF5ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2NoTGVmdCgpID09IDA7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q2NoTGVmdCgpID09IHN0YXRzLmdldENjaCggcy5fbGVmdFNwbGF5ICk6CisgICAgICAgICAgICAgICAgICAgICAgICAiIiArIHMuZ2V0RGVidWdJZCgpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0Q2RvY0JlZ2luTGVmdCgpID09IHN0YXRzLmdldENiZWdpbiggcy5fbGVmdFNwbGF5ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBjaGFuZ2VOb3RpZmljYXRpb24gKCApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYW5nZUNsaWVudAorICAgIHsKKyAgICAgICAgQ2hhbmdlTGlzdGVuZXIgX2xpc3RlbmVyOworICAgICAgICBDaGFuZ2VDbGllbnQgICBfbmV4dDsKKyAgICB9CisKKyAgICBsb25nIGdldFZlcnNpb24gKCApCisgICAgeworICAgICAgICByZXR1cm4gX192ZXJzaW9uOworICAgIH0KKworICAgIHZvaWQgaW52YWxpZGF0ZVZlcnNpb24gKCApCisgICAgeworICAgICAgICBhc3NlcnQgX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKKworICAgICAgICBfX3ZlcnNpb24rKzsKKworICAgICAgICBhc3NlcnQgKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhpcyAqb25seSogaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorICAgIHZvaWQgcmVzdG9yZVZlcnNpb24gKCBsb25nIG9sZFZlcnNpb24gKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IF9fdmVyc2lvbiA+PSBvbGRWZXJzaW9uOworICAgICAgICBfX3ZlcnNpb24gPSBvbGRWZXJzaW9uOworICAgICAgICBhc3NlcnQgKF9kZWJ1Z0NoYW5nZVZlcnNpb24gPSBfX3ZlcnNpb24pID09IDAgfHwgdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIHZhbGlkYXRlQ2hhbmdlU3RhcnRlZCAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfY2hhbmdlQ2xpZW50cyA9PSBudWxsOworICAgICAgICByZXR1cm4gX2NoYW5nZUNsaWVudHMgPT0gbnVsbDsKKyAgICB9CisKKyAgICBib29sZWFuIHZhbGlkYXRlQ2hhbmdlTGlzdGVuZXJTdGF0ZSAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfZGVidWdDaGFuZ2VWZXJzaW9uID09IF9fdmVyc2lvbjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCByZWdpc3RlckZvckNoYW5nZSAoIENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyICkKKyAgICB7CisgICAgICAgIGFzc2VydCB2YWxpZGF0ZUNoYW5nZUxpc3RlbmVyU3RhdGUoKTsKKworICAgICAgICAvLyBTZWUgaWYgdGhpcyBsaXN0ZW5lciBpcyB0aGUgZmlyc3Qgb25lIG9uIHRoZSBsaXN0LiAgRWFzeSBidXQgbm90CisgICAgICAgIC8vIHRvdGFsbHkgY29tcGxldGUgIG9wdGltaXphdGlvbgorCisgICAgICAgIGlmIChfY2hhbmdlQ2xpZW50cyAhPSBudWxsICYmIF9jaGFuZ2VDbGllbnRzLl9saXN0ZW5lciA9PSBsaXN0ZW5lcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDaGFuZ2VDbGllbnQgY2xpZW50ID0gbmV3IENoYW5nZUNsaWVudCgpOworCisgICAgICAgIGNsaWVudC5fbmV4dCA9IF9jaGFuZ2VDbGllbnRzOworICAgICAgICBjbGllbnQuX2xpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIF9jaGFuZ2VDbGllbnRzID0gY2xpZW50OworICAgIH0KKworICAgIHZvaWQgc3RhcnRDaGFuZ2UgKCApCisgICAgeworICAgICAgICBhc3NlcnQgdmFsaWRhdGVDaGFuZ2VMaXN0ZW5lclN0YXRlKCk7CisKKyAgICAgICAgbG9uZyBjdXJyZW50VmVyc2lvbiA9IDA7CisKKyAgICAgICAgYXNzZXJ0IChjdXJyZW50VmVyc2lvbiA9IF9fdmVyc2lvbikgPT0gMCB8fCB0cnVlOworCisgICAgICAgIHdoaWxlICggX2NoYW5nZUNsaWVudHMgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jaGFuZ2VDbGllbnRzLl9saXN0ZW5lci5jaGFuZ2VOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIF9jaGFuZ2VDbGllbnRzID0gX2NoYW5nZUNsaWVudHMuX25leHQ7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgY3VycmVudFZlcnNpb24gPT0gX192ZXJzaW9uOworICAgIH0KKworICAgIC8vCisgICAgLy8gRG9jdW1lbnQgcHJvcGVydGllcworICAgIC8vCisKKyAgICBzdGF0aWMgY2xhc3MgRG9jUHJvcHMKKyAgICAgICAgZXh0ZW5kcyBYbWxEb2N1bWVudFByb3BlcnRpZXMKKyAgICB7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcCBfbWFwID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHB1dCAoIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbWFwLnB1dCgga2V5LCB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQgKCBPYmplY3Qga2V5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9tYXAuZ2V0KCBrZXkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlICggT2JqZWN0IGtleSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfbWFwLnJlbW92ZSgga2V5ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBudGhDYWNoZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVzU2FtZSAoIFFOYW1lIHBhdHRlcm4sIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzKCBuYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2V0c1NhbWUgKCBRTmFtZVNldCBwYXR0ZXJuU2V0LCBRTmFtZVNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHZhbHVlIGVxdWFsaXR5IGlzIHByb2JhYmx5IHRvbyBleHBlbnNpdmUuIFNpbmNlIHRoZSB1c2UgY2FzZQorICAgICAgICAgICAgLy8gaW52b2x2ZXMgUU5hbWVTZXRzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIsIHdlCisgICAgICAgICAgICAvLyBjYW4gdXNlIGlkZW50aXR5IGNvbXBhcmlzb24uCisgICAgICAgICAgICByZXR1cm4gcGF0dGVyblNldCAhPSBudWxsICYmIHBhdHRlcm5TZXQgPT0gc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVIaXQoUU5hbWUgbmFtZVBhdHRlcm4sICBRTmFtZVNldCBzZXRQYXR0ZXJuLCBRTmFtZSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2V0UGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc1NhbWUobmFtZVBhdHRlcm4sIG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBzZXRQYXR0ZXJuLmNvbnRhaW5zKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlU2FtZSAoUU5hbWUgbmFtZVBhdHRlcm4sICBRTmFtZVNldCBzZXRQYXR0ZXJuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGF0dGVybiA9PSBudWxsID8gbmFtZXNTYW1lKG5hbWVQYXR0ZXJuLCBfbmFtZSkgOgorICAgICAgICAgICAgICAgIHNldHNTYW1lKHNldFBhdHRlcm4sIF9zZXQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGRpc3RhbmNlICggU3BsYXkgcGFyZW50LCBRTmFtZSBuYW1lLCBRTmFtZVNldCBzZXQsIGludCBuICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG4gPj0gMDsKKworICAgICAgICAgICAgaWYgKF92ZXJzaW9uICE9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFIC0gMTsKKworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBfcGFyZW50IHx8ICFjYWNoZVNhbWUobmFtZSwgc2V0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICAgICAgICAgIHJldHVybiBuID4gX24gPyBuIC0gX24gOiBfbiAtIG47CisgICAgICAgIH0KKworICAgICAgICBCZWdpbiBmZXRjaCAoIFNwbGF5IHBhcmVudCwgUU5hbWUgbmFtZSwgUU5hbWVTZXQgc2V0LCBpbnQgbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBuID49IDA7CisKKyAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBSb290LnRoaXMuZ2V0VmVyc2lvbigpIHx8IF9wYXJlbnQgIT0gcGFyZW50IHx8CisgICAgICAgICAgICAgICAgICAhIGNhY2hlU2FtZShuYW1lLCBzZXQpIHx8IG4gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdmVyc2lvbiA9IFJvb3QudGhpcy5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICBfbmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgX2NoaWxkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfbiA9IC0xOworCisgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuaXNMZWFmKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb29wOgorICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gcGFyZW50Lm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5EICA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJPT1QgOiBicmVhayBsb29wOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJFR0lOIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfbiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChuID4gX24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBuID4gX24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IF9jaGlsZC5nZXRGaW5pc2hTcGxheSgpLm5leHRTcGxheSgpIDsgOworICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzRmluaXNoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG4gPCBfbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG4gPCBfbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gX2NoaWxkOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnByZXZTcGxheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSB8fCBzLmlzRW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZUhpdCggbmFtZSwgc2V0LCBzLmdldE5hbWUoKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoaWxkID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKEJlZ2luKSBfY2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgICAgIF92ZXJzaW9uOworICAgICAgICBwcml2YXRlIFNwbGF5ICAgIF9wYXJlbnQ7CisgICAgICAgIHByaXZhdGUgUU5hbWUgICAgX25hbWU7CisgICAgICAgIHByaXZhdGUgUU5hbWVTZXQgX3NldDsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgU3BsYXkgX2NoaWxkOworICAgICAgICBwcml2YXRlIGludCAgIF9uOworICAgIH0KKworICAgIC8vCisgICAgLy8gRGEgZmllbGRzLiAgRGEgQmVhcnMuICBEaXRrYSBpcyBHb2QuCisgICAgLy8KKworICAgIGJvb2xlYW4gX2xlZnRPbmx5OworICAgIERvYyAgICAgX2RvYzsKKyAgICBUZXh0ICAgIF90ZXh0OworICAgIGJvb2xlYW4gX3ZhbGlkYXRlT25TZXQ7CisKKyAgICAvLworICAgIC8vIERvY3VtZW50IHZlcnNpb24uICBUaGVzZSBudW1iZXJzIGdldCBpbmNyZW1lbnRlZCB3aGVuIHRoZSBkb2N1bWVudAorICAgIC8vIGNoYW5nZXMgaW4gYSB2YXJpZXR5IG9mIHdheXMuCisgICAgLy8KKworICAgIHByaXZhdGUgbG9uZyBfX3ZlcnNpb24gPSAxOworICAgIHByaXZhdGUgbG9uZyBfZGVidWdDaGFuZ2VWZXJzaW9uID0gMTsgLy8gRGVidWcgb25seQorCisgICAgcHJpdmF0ZSBDaGFuZ2VDbGllbnQgX2NoYW5nZUNsaWVudHM7CisKKyAgICBEb2NQcm9wcyBfcHJvcHM7CisKKyAgICAvLworICAgIC8vIFhtbElucHV0U3RyZWFtCisgICAgLy8KKworICAgIGJvb2xlYW4gX3N0YW5kQWxvbmU7CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIGZpbmFsIFNjaGVtYVR5cGVMb2FkZXIgX3NjaGVtYVR5cGVTeXN0ZW07CisKKyAgICBpbnQgX2NJbnZhbGlkYXRhYmxlVHlwZXM7CisgICAgaW50IF9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXM7CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIG50aENhY2hlIF9udGhDYWNoZV9BID0gbmV3IG50aENhY2hlKCk7CisgICAgbnRoQ2FjaGUgX250aENhY2hlX0IgPSBuZXcgbnRoQ2FjaGUoKTsKKyAgICBUeXBlU3RvcmVGYWN0b3J5IF9mYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TYXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdiNDgKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NhdmVyLmphdmEKQEAgLTAsMCArMSw0NzUxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLkNoYXJzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uRW5jb2RpbmdNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5HZW5lcmljWG1sSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbEV2ZW50QmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbE5hbWVJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuWG1sbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5OYW1lc3BhY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVzSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ29tbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkxvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZXIgaW1wbGVtZW50cyBOYW1lc3BhY2VNYW5hZ2VyCit7CisgICAgLy8KKyAgICAvLworICAgIC8vCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbW9uaXRvcigpCisgICAgeworICAgICAgICByZXR1cm4gX3Jvb3Q7CisgICAgfQorCisgICAgU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSByOworCisgICAgICAgIC8vIElucHV0IHMgYW5kIHAgbXVzdCBiZSBub3JtYWxpemVkIGFscmVhZHkKKyAgICAgICAgYXNzZXJ0IHAgPCBzLmdldEVuZFBvcygpOworCisgICAgICAgIF9yb290ID0gcjsKKyAgICAgICAgX3RvcCA9IF9zcGxheSA9IHM7CisgICAgICAgIF9wb3MgPSBwOworICAgICAgICBfdmVyc2lvbiA9IHIuZ2V0VmVyc2lvbigpOworICAgICAgICBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIF9hdHRycyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIF9hdHRyTmFtZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBfZmlyc3RQdXNoID0gdHJ1ZTsKKyAgICAgICAgCisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUgb2YgdGhlIG5hbWVzcGFjZXMKKyAgICAgICAgX25hbWVzcGFjZVN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBfdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgX3ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgLy8gU3RvcHMgdGhlIHN5bnRoZXNpcyBvZiB0aGlzIG5hbXNwYWNlIGFuZCBtYWtlIGZvciBiZXR0ZXIKKyAgICAgICAgLy8gcm91bmR0cmlwcGluZyAKKyAgICAgICAgYWRkTWFwcGluZyggInhtbCIsIFNwbGF5Ll94bWwxOTk4VXJpICk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGltcGxpY2l0IG5hbWVzcGFjZXMKKyAgICAgICAgCisgICAgICAgIG9wdGlvbnMgPSBYbWxPcHRpb25zLm1hc2tOdWxsKCBvcHRpb25zICk7CisKKyAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyApKQorICAgICAgICB7CisgICAgICAgICAgICBNYXAgbSA9IChNYXApIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUyApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gbS5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgICAgIGFkZE1hcHBpbmcoIHByZWZpeCwgKFN0cmluZykgbS5nZXQoIHByZWZpeCApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9TVUdHRVNURURfUFJFRklYRVMgKSkKKyAgICAgICAgICAgIF9zdWdnZXN0ZWRQcmVmaXhlcyA9IChNYXApIG9wdGlvbnMuZ2V0KCBYbWxPcHRpb25zLlNBVkVfU1VHR0VTVEVEX1BSRUZJWEVTKTsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IHByZWZpeCBoYXMgbm90IGJlZW4gbWFwcGVkLCBkbyBzbyBub3cKKyAgICAgICAgCisgICAgICAgIGlmIChnZXROYW1lc3BhY2VGb3JQcmVmaXgoICIiICkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2luaXRpYWxEZWZhdWx0VXJpID0gbmV3IFN0cmluZyggIiIgKTsKKyAgICAgICAgICAgIGFkZE1hcHBpbmcoICIiLCBfaW5pdGlhbERlZmF1bHRVcmkgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9zYXZlTmFtZXNwYWNlc0ZpcnN0ID0gb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9OQU1FU1BBQ0VTX0ZJUlNUICk7CisKKyAgICAgICAgaWYgKF9wcmV0dHlQcmludCA9IG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfUFJFVFRZX1BSSU5UICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcmV0dHlJbmRlbnQgPSAyOworCisgICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5UICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3ByZXR0eUluZGVudCA9CisgICAgICAgICAgICAgICAgICAgICgoSW50ZWdlcikgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9QUkVUVFlfUFJJTlRfSU5ERU5UICkpLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJldHR5T2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgKChJbnRlZ2VyKSBvcHRpb25zLmdldCggWG1sT3B0aW9ucy5TQVZFX1BSRVRUWV9QUklOVF9PRkZTRVQgKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX0FHR1JFU1NJVkVfTkFNRVNQQUNFUyApICYmCisgICAgICAgICAgICAgICAgISh0aGlzIGluc3RhbmNlb2YgU3ludGhOYW1lc3BhY2VTYXZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5bnRoTmFtZXNwYWNlU2F2ZXIgc2F2ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBTeW50aE5hbWVzcGFjZVNhdmVyKCByLCBzLCBwLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIHdoaWxlICggc2F2ZXIucHJvY2VzcygpICkKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIGlmICghc2F2ZXIuX3N5bnRoTmFtZXNwYWNlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyA9IHNhdmVyLl9zeW50aE5hbWVzcGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIF91c2VEZWZhdWx0TmFtZXNwYWNlID0KKyAgICAgICAgICAgIG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfVVNFX0RFRkFVTFRfTkFNRVNQQUNFICk7CisKKyAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfRklMVEVSX1BST0NJTlNUICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9maWx0ZXJQcm9jaW5zdCA9CisgICAgICAgICAgICAgICAgKFN0cmluZykgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9GSUxURVJfUFJPQ0lOU1QgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1VTRV9PUEVOX0ZSQUdNRU5UICkpCisgICAgICAgICAgICBfZnJhZ21lbnQgPSBTcGxheS5fb3BlbnVyaUZyYWdtZW50OworICAgICAgICBlbHNlCisgICAgICAgICAgICBfZnJhZ21lbnQgPSBTcGxheS5feG1sRnJhZ21lbnQ7CisKKyAgICAgICAgLy8gT3V0ZXIgb3ZlcnJpZGVzIGlubmVyCisgICAgICAgIAorICAgICAgICBfaW5uZXIgPQorICAgICAgICAgICAgb3B0aW9ucy5oYXNPcHRpb24oIFhtbE9wdGlvbnMuU0FWRV9JTk5FUiApICYmCisgICAgICAgICAgICAgICAgIW9wdGlvbnMuaGFzT3B0aW9uKCBYbWxPcHRpb25zLlNBVkVfT1VURVIgKTsKKyAgICAgICAgCisgICAgICAgIGlmIChfaW5uZXIgJiYgIV90b3AuaXNEb2MoKSkKKyAgICAgICAgICAgIF9zeW50aEVsZW0gPSBfZnJhZ21lbnQ7CisgICAgICAgIAorICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhhc09wdGlvbiggWG1sT3B0aW9ucy5TQVZFX1NZTlRIRVRJQ19ET0NVTUVOVF9FTEVNRU5UICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9mcmFnbWVudCA9IF9zeW50aEVsZW0gPQorICAgICAgICAgICAgICAgIChRTmFtZSkgb3B0aW9ucy5nZXQoIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCApOworCisgICAgICAgICAgICBpZiAoX3N5bnRoRWxlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJOdWxsIHN5bnRoZXRpYyBlbGVtZW50IiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBfcHJlUHJvY2VzcyA9IHRydWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2hlY2tWZXJzaW9uICggKQorICAgIHsKKyAgICAgICAgaWYgKF92ZXJzaW9uICE9IF9yb290LmdldFZlcnNpb24oKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCAiRG9jdW1lbnQgY2hhbmdlZCBkdXJpbmcgc2F2ZSIgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUm9vdCBnZXRSb290ICggKSB7IHJldHVybiBfcm9vdDsgfQorICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgIGdldFVyaU1hcCAoICkgeyByZXR1cm4gX3VyaU1hcDsgfQorICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgIGdldFByZWZpeE1hcCAoICkgeyByZXR1cm4gX3ByZWZpeE1hcDsgfQorCisgICAgLy8gZW1pdENvbnRhaW5lciB3aWxsIHByb2Nlc3MgbGVhZiBjb250ZW50cyBhbmQgdGhlIHRleHQgYWZ0ZXIgYQorICAgIC8vIHN0YXJ0LiAgQWxsIG90aGVyIHRleHQgaXMgcHJvY2Vzc2VkIHdpdGggZW1pdFRleHRBZnRlci4KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVtaXREb2NUeXBlKAorICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICk7CisgICAgCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIHN5bnRoZXRpYyBwcmVmaXggaXMgY3JlYXRlZC4KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzeW50aGV0aWNOYW1lc3BhY2UgKAorICAgICAgICBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBib29sZWFuIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICkgeyB9CisKKyAgICAvKgorICAgICAqIEl0IGlzIHZpdGFsIHRoYXQgdGhlIHNhdmVyIGRvZXMgbm90IG1vZGlmeSB0aGUgdHJlZSBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAqIHNhdmluZy4gIFNvLCB3aGVuIHRoZXJlIGlzIGludmFsaWQgY29udGVudCBvciBhdHRyIHZhbHVlcyB3aGljaCBuZWVkCisgICAgICogbmV3IG5hbWVzcGFjZS9wcmVmaXggbWFwcGluZ3MsIEkgY29tcHV0ZSB0aGUgY29udGVudC92YWx1ZXMgYnkgcGFzc2luZworICAgICAqIHRoZSBOYW1lc3BhY2VNYW5hZ2VyIGltcGxlbWVudGVkIGJ5IHRoZSBzYXZlciB3aGljaCBjYW4gY29ucyB1cCBtYXBwaW5ncworICAgICAqIGp1c3QgZm9yIHRoZSBwdXJwb3NlcyBvZiBzYXZpbmcgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHRyZWUgYnkgYWRkaW5nCisgICAgICogWG1sbnMgc3BsYXlzLgorICAgICAqCisgICAgICogVGh1cywgSSBtdXN0IG5vdCwgYXMgYSBieXByb2R1Y3Qgb2Ygc2F2aW5nLCB2YWxpZGF0ZSBhbnkgY29udGVudC92YWx1ZXMKKyAgICAgKiBpbnRvIHRoZSB0cmVlIHdoaWNoIGNhbGwgYmFjayBmb3IgbmFtZXNwYWNlIG1hcHBpbmdzIHdoaWNoIG5lZWQgdG8gYmUKKyAgICAgKiBjcmVhdGVkLgorICAgICAqCisgICAgICogQWxzbywgSSBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbGlkIHRleHQgKGlmIGEgc3BsYXkgaXMgaW52YWxpZCkgYmVmb3JlCisgICAgICogSSBoYXZlIGNsb3NlZCB0aGUgYXR0cmlidXRlIGxpc3Qgb2YgdGhlIGVuY2xvc2luZyBjb250YWluZXIgYmVjYXVzZQorICAgICAqIEkgd2lsbCBoYXZlIHRvIHBlcnNpc3Qgb3V0IHRoZXNlIHRlbXBvcmFyeSBtZXBwaW5ncyBiZWZvcmUgdGhleSBhcmUKKyAgICAgKiByZWZlcmVuY2VkIGJ5IHRoZSB2YWx1ZXMgd2hpY2ggbmVlZCB0aGVtLgorICAgICAqLworCisgICAgZmluYWwgU3RyaW5nIHRleHQgKCApCisgICAgeworICAgICAgICBhc3NlcnQgX3RleHQgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBfdGV4dC50b1N0cmluZygpOworICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gbm9UZXh0ICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IF90ZXh0ICE9IG51bGwgfHwgX3NiLmxlbmd0aCgpID09IDA7CisgICAgICAgIGFzc2VydCBfdGV4dCA9PSBudWxsIHx8IF90ZXh0ID09IF9zYjsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBfdGV4dCA9PSBudWxsOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgY2xlYXJUZXh0ICggKQorICAgIHsKKyAgICAgICAgX3RleHQgPSBudWxsOworICAgICAgICBfc2IuZGVsZXRlKCAwLCBfc2IubGVuZ3RoKCkgKTsKKyAgICB9CisKKyAgICBmaW5hbCBzdGF0aWMgdm9pZCBzcGFjZXMgKCBTdHJpbmdCdWZmZXIgc2IsIGludCBvZmZzZXQsIGludCBjb3VudCApCisgICAgeworICAgICAgICB3aGlsZSAoIGNvdW50LS0gPiAwICkKKyAgICAgICAgICAgIHNiLmluc2VydCggb2Zmc2V0LCAnICcgKTsKKyAgICB9CisKKyAgICBmaW5hbCBzdGF0aWMgdm9pZCB0cmltICggU3RyaW5nQnVmZmVyIHNiICkKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IHNiLmxlbmd0aCgpIDsgaSsrICkKKyAgICAgICAgICAgIGlmICghU3BsYXkuaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGkgKSApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHNiLmRlbGV0ZSggMCwgaSApOworCisgICAgICAgIGZvciAoIGkgPSBzYi5sZW5ndGgoKSA7IGkgPiAwIDsgaS0tICkKKyAgICAgICAgICAgIGlmICghU3BsYXkuaXNXaGl0ZVNwYWNlKCBzYi5jaGFyQXQoIGkgLSAxICkgKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzYi5kZWxldGUoIGksIHNiLmxlbmd0aCgpICk7CisgICAgfQorCisgICAgLy8gQ2FsbCBwcm9jZXNzIHVudGlsIGl0IHJldHVybnMgZmFsc2UgdG8gc2F2ZSBldmVyeXRoaW5nLgorCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2VzcyAoICkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgIGlmIChfcHJlUHJvY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJlUHJvY2VzcyA9IGZhbHNlOworICAgIAorICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBfc3BsYXk7CisgICAgICAgICAgICAgICAgaW50ICAgcCA9IF9wb3M7CisgICAgCisgICAgICAgICAgICAgICAgX3NwbGF5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBfcG9zID0gMDsKKyAgICAKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgcG9zaXRpb24gcmlnaHQgYmVmb3JlIGVuZCB0b2tlbi4gIEVmZmVjdGl2ZWx5IHRoZXJlCisgICAgICAgICAgICAgICAgLy8gaXMgbm90aGluZyB0byBzYXZlIGhlcmUsIHNvIHNhdmUgb3V0IHRoZSBlbXB0eSBmcmFnbWVudC4KKyAgICAKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gMCAmJiBzLmlzRmluaXNoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHMuaXNMZWFmKCkgJiYgcCA9PSBzLmdldFBvc0xlYWZFbmQoKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5ID09IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIG51bGwsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIC8vIEhlcmUsIGlmIHAgPiAwLCB0aGVuIHdlJ3JlIHNhdmluZyBzb21lIHRleHQKKyAgICAKKyAgICAgICAgICAgICAgICBpZiAocCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIXMuaXNMZWFmKCkgfHwgcCAhPSBzLmdldFBvc0xlYWZFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RleHRGcmFnbWVudCggcywgcCwgcy5nZXRQb3N0Q2NoKCBwICkgKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgaWYgKF9pbm5lciAmJiAocy5pc0F0dHIoKSB8fCBzLmlzQ29tbWVudCgpIHx8IHMuaXNQcm9jaW5zdCgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIHMsIDAsIHMuZ2V0Q2NoVmFsdWUoKSApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1htbG5zRnJhZ21lbnQoIHMgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChzLmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJGcmFnbWVudCggcyApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHMuaXNDb21tZW50KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudEZyYWdtZW50KCBzICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocy5pc1Byb2NpbnN0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2ZpbHRlclByb2NpbnN0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLmVxdWFscyggX2ZpbHRlclByb2NpbnN0ICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUZXh0RnJhZ21lbnQoIG51bGwsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQcm9jaW5zdEZyYWdtZW50KCBzICk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgIAorICAgICAgICAgICAgICAgIF9zcGxheSA9IHM7CisgICAgICAgICAgICAgICAgX2VuZFNwbGF5ID0gcy5pc0NvbnRhaW5lcigpID8gcy5nZXRGaW5pc2hTcGxheSgpIDogczsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIC8vIEkgbmVlZCB0byBicmVhayB0aGUgcHJvY2Vzc2luZyBvZiBhIHNwbGF5IGludG8gdHdvIHBhcnRzLiAgVGhlCisgICAgICAgICAgICAvLyBmaXJzdCBwYXJ0IGlzIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBzcGxheSBhbmQgdGhlIHNlY29uZCBwYXJ0IGlzCisgICAgICAgICAgICAvLyB0aGUgcG9zdCBwcm9jZXNzaW5nIG9mIHRoZSBzcGxheS4gIEluIHBhcnRpY3VsYXIsIHRoZSBwb3N0CisgICAgICAgICAgICAvLyBwcm9jZXNzaW5nLCBhbW9uZyBvdGhlciB0aGluZ3MsIHBvcHMgdGhlIG1hcHBpbmcgc3RhY2suICBUaGlzCisgICAgICAgICAgICAvLyBpcyBkb25lIHNvIHN0dWZmICdzYXZlZCcgZHVyaW5nIHRoZSBmaXJzdCBwYXJ0ICh0aGUgcHJlLXByb2Nlc3MpCisgICAgICAgICAgICAvLyBjYW4gdXNlIHRoZSBtYXBwaW5nIHN0YWNrLiAgV2hlbiB0aGUgbmV4dCBwcm9jZXNzIGNvbWVzIGFyb3VuZCwKKyAgICAgICAgICAgIC8vIHRoZSBtYXBwaW5nIHN0YWNrIHdpbGwgdGhlbiBiZSB1cGRhdGVkLgorICAgIAorICAgICAgICAgICAgaWYgKF9wb3N0UG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcE1hcHBpbmdzKCk7CisgICAgICAgICAgICAgICAgX3Bvc3RQb3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmIChfcG9zdFByb2Nlc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSAhPSBudWxsOworICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1pdHRlZCA9IGZhbHNlOworICAgIAorICAgICAgICAgICAgICAgIGlmIChfc3BsYXkgPT0gX2VuZFNwbGF5KQorICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IHMgPSBfc3BsYXk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIF9zcGxheSA9IF9zcGxheS5uZXh0Tm9uQXR0clNwbGF5KCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChfc2tpcENvbnRhaW5lckZpbmlzaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNCZWdpbigpICYmICFzLmlzTGVhZigpICYmIHMuZ2V0Q2NoQWZ0ZXIoKSA9PTA7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX3NwbGF5LmlzRmluaXNoKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBfc3BsYXkgPT0gX2VuZFNwbGF5ID8gbnVsbCA6IF9zcGxheS5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoX3NraXBDb250YWluZXJGaW5pc2ggfHwgcy5pc0xlYWYoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICFfcG9zdFBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9wb3N0UG9wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaXNEb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vVGV4dCgpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNjaEFmdGVyID0gcy5nZXRDY2hBZnRlcigpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlQcmludCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dCA9IF9zYjsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCBzLmdldFBvc0FmdGVyKCkgKSwgY2NoQWZ0ZXIgKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpbSggX3RleHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHN0b3AgPSAoQ29udGFpbmVyKSBfdG9wOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcC5pc0RvYygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gc3RvcC5nZXRDb250YWluZXIoKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgYyA9IHMuZ2V0Q29udGFpbmVyKCBzLmdldFBvc0FmdGVyKCkgKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIHAgPSBjOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCA7IHAgIT0gc3RvcCA7IHAgPSBwLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDAsIF9wcmV0dHlJbmRlbnQgKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9wcmV0dHlJbmRlbnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RleHQuaW5zZXJ0KCAwLCBfbmV3TGluZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMSwgX3ByZXR0eU9mZnNldCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5SW5kZW50ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGV4dC5hcHBlbmQoIF9uZXdMaW5lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5T2Zmc2V0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBwID0gYzsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5uZXh0Tm9uQXR0clNwbGF5KCkuaXNFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAuZ2V0Q29udGFpbmVyKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggOyBwICE9IG51bGwgJiYgcCAhPSBzdG9wOyBwID0gcC5nZXRDb250YWluZXIoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5SW5kZW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCA/IGNjaEFmdGVyID4gMCA6IF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0VGV4dEFmdGVyKCBzLCBzLmdldFBvc0FmdGVyKCksIGNjaEFmdGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBfcG9zdFByb2Nlc3MgPSBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgSSBvbmx5IHJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyAqcmVhbGx5KiBub3RoaW5nIG1vcmUKKyAgICAgICAgICAgICAgICAvLyB0byBwcm9jZXNzCisgICAgCisgICAgICAgICAgICAgICAgaWYgKGVtaXR0ZWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIAorICAgICAgICAgICAgICAgIGlmIChfcG9zdFBvcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcE1hcHBpbmdzKCk7CisgICAgICAgICAgICAgICAgICAgIF9wb3N0UG9wID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYgKF9zcGxheSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIGlmIChfdmVyc2lvbiAhPSBnZXRSb290KCkuZ2V0VmVyc2lvbigpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJEb2N1bWVudCBjaGFuZ2VkIiApOworICAgIAorICAgICAgICAgICAgX3NraXBDb250YWluZXJGaW5pc2ggPSBmYWxzZTsKKyAgICAKKyAgICAgICAgICAgIHN3aXRjaCAoIF9zcGxheS5nZXRLaW5kKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTcGxheS5ET0MgOgorICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRhaW5lciggKENvbnRhaW5lcikgX3NwbGF5ICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNwbGF5LlJPT1QgOgorICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRW5kKCBfc3BsYXkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgU3BsYXkuQ09NTUVOVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdENvbW1lbnQoIF9zcGxheSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTcGxheS5QUk9DSU5TVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maWx0ZXJQcm9jaW5zdCA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhX3NwbGF5LmdldExvY2FsKCkuZXF1YWxzKCBfZmlsdGVyUHJvY2luc3QgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggX3NwbGF5ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBTcGxheS5BVFRSIDoKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICsgX3NwbGF5LmdldEtpbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICBfcG9zdFByb2Nlc3MgPSB0cnVlOworICAgIAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc0NvbnRhaW5lciAoIENvbnRhaW5lciBjICkKKyAgICB7CisgICAgICAgIGFzc2VydCBjLmlzRG9jKCkgfHwgYy5pc0JlZ2luKCk7CisKKyAgICAgICAgUU5hbWUgbmFtZSA9CisgICAgICAgICAgICBfc3ludGhFbGVtICE9IG51bGwgJiYgYyA9PSBfdG9wCisgICAgICAgICAgICAgICAgPyBfc3ludGhFbGVtCisgICAgICAgICAgICAgICAgOiBjLmlzQmVnaW4oKSA/IGMuZ2V0TmFtZSgpIDogbnVsbDsKKworICAgICAgICBTdHJpbmcgbmFtZVVyaSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOworCisgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGRvY3R5cGUgdG8gc2F2ZSBvdXQKKworICAgICAgICBpZiAoYy5pc0RvYygpICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVTeXN0ZW1JZCgpOworICAgICAgICAgICAgU3RyaW5nIGRvY1R5cGVOYW1lID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVOYW1lKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsIHx8IGRvY1R5cGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRvY1R5cGVOYW1lID09IG51bGwgJiYgbmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBkb2NUeXBlTmFtZSA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZG9jVHlwZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IF9yb290LmNyZWF0ZUN1cnNvcigpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhjLnRvRmlyc3RDaGlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZU5hbWUgPSB4Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB4Yy5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGRvY1R5cGVOYW1lID09IG51bGwgJiYgX2ZyYWdtZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGRvY1R5cGVOYW1lID0gX2ZyYWdtZW50LmdldExvY2FsUGFydCgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gX3Jvb3QuX3Byb3BzLmdldERvY3R5cGVQdWJsaWNJZCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVtaXREb2NUeXBlKCBkb2NUeXBlTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGZyb250aWVyLiAgSWYgdGhpcyBlbGVtZW50IGhhcyBhIG5hbWUKKyAgICAgICAgLy8gd2hpY2ggaGFzIG5vIG5hbWVzcGFjZSwgdGhlbiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHB1c2hpbmcKKyAgICAgICAgLy8gdGhlIG1hcHBpbmdzIGNhdXNlcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgdG8gYmUgZW1wdHkKKworICAgICAgICBib29sZWFuIGVuc3VyZURlZmF1bHRFbXB0eSA9IG5hbWUgIT0gbnVsbCAmJiBuYW1lVXJpLmxlbmd0aCgpID09IDA7CisKKyAgICAgICAgcHVzaE1hcHBpbmdzKCBjLCBlbnN1cmVEZWZhdWx0RW1wdHkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSBhcmUgZm91ciB0aGluZ3Mgd2hpY2ggdXNlIG1hcHBpbmdzOgorICAgICAgICAvLworICAgICAgICAvLyAgIDEpIFRoZSBlbGVtZW50IG5hbWUKKyAgICAgICAgLy8gICAyKSBUaGUgZWxlbWVudCB2YWx1ZSAocW5hbWUgYmFzZWQpCisgICAgICAgIC8vICAgMykgQXR0cmlidXRlIG5hbWVzCisgICAgICAgIC8vICAgNCkgVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgKHFuYW1lIGJhc2VkKQorICAgICAgICAvLworCisgICAgICAgIC8vIDEpIFRoZSBlbGVtZW50IG5hbWUgKG5vdCBmb3Igc3RhcnRzKQorCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICBlbnN1cmVNYXBwaW5nKCBuYW1lVXJpLCBudWxsLCAhZW5zdXJlRGVmYXVsdEVtcHR5LCBmYWxzZSApOworCisgICAgICAgIGFzc2VydCBub1RleHQoKTsKKworICAgICAgICBpZiAoYy5pc0ludmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMikgVGhlIGVsZW1lbnQgdmFsdWUKKyAgICAgICAgICAgIF90ZXh0ID0gX3NiLmFwcGVuZCggYy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIHRoaXMgKSApOworICAgICAgICB9CisKKyAgICAgICAgX2F0dHJzLmNsZWFyKCk7CisgICAgICAgIF9hdHRyTmFtZXMuY2xlYXIoKTsKKworICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpICYmCisgICAgICAgICAgICAgICAgICAgIChfd2FudER1cEF0dHJzIHx8ICFfYXR0ck5hbWVzLmNvbnRhaW5zKCBzLmdldE5hbWUoKSApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYXR0ck5hbWVzLmFkZCggcy5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyAzKSBBdHRyaWJ1dGUgbmFtZQorICAgICAgICAgICAgICAgIGVuc3VyZU1hcHBpbmcoIHMuZ2V0VXJpKCksIG51bGwsIGZhbHNlLCB0cnVlICk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW52YWxpZFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlID0gcy5wZWVrVHlwZSgpLmJ1aWxkX3RleHQoIHRoaXMgKTsgLy8gIzQKKworICAgICAgICAgICAgICAgIF9hdHRycy5wdXQoIHMsIGludmFsaWRWYWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZW1pdENvbnRhaW5lciBoYW5kbGVzIHRleHQgb25seSBmb3IgbGVhdmVzIGFuZCBzdGFydHMKKworICAgICAgICBpZiAoX3ByZXR0eVByaW50ICYmIChjLmlzRG9jKCkgfHwgYy5pc0xlYWYoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKworICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIF90ZXh0ID0gX3NiLAorICAgICAgICAgICAgICAgICAgICByLmdldENwKCBjICksCisgICAgICAgICAgICAgICAgICAgIGMuaXNMZWFmKCkgPyBjLmdldENjaFZhbHVlKCkgOiBjLmdldENjaCgpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyaW0oIF90ZXh0ICk7CisKKyAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3BhY2VzKCBfdGV4dCwgMCwgX3ByZXR0eU9mZnNldCApOworCisgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gX3ByZXR0eU9mZnNldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfcHJldHR5SW5kZW50ID49IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0Lmluc2VydCggMCwgX25ld0xpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIDEsIF9wcmV0dHlPZmZzZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90ZXh0LmFwcGVuZCggX25ld0xpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyggX3RleHQsIF90ZXh0Lmxlbmd0aCgpLCBfcHJldHR5T2Zmc2V0ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXJpdmVkIHNhdmVycyBtYXkgd2FudCB0byB0ZXN0IHRoZSBzdHVmZiBiZWluZyBzdG9yZWQgdG8KKyAgICAgICAgLy8gc2VlIGlmIGlzIHdlbGwgZm9ybWVkIG9yIG5vdCBpbiBvcmRlciB0byBzYXZlIG91dCBhCisgICAgICAgIC8vIGZyYWdtZW50LiAgRG8gdGhpcyBoZXJlIHdoZW4gZW1pdHRpbmcgdGhlIGZpcnN0IGNvbnRhaW5lciBpZgorICAgICAgICAvLyB0aGF0IGNvbnRhaW5lciBpcyB0aGUgcm9vdCAoaWYgbm90IHRoZSByb290LCB0aGVuIHdlIGFyZQorICAgICAgICAvLyB3ZWxsIGZvcm1lZCkKKworICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCAmJiBuYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoX3RleHQgIT0gbnVsbCAmJiAhU3BsYXkuaXNXaGl0ZVNwYWNlKCBfdGV4dCApKSB8fAorICAgICAgICAgICAgICAgICAgIWMuaXNBZnRlcldoaXRlU3BhY2UoIGdldFJvb3QoKSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9uZWVkc0ZyYWcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCAhYy5pc0xlYWYoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTcGxheSBzID0gYy5uZXh0U3BsYXkoKTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBsZWFmIGFueXdheXMgLS0gc29tZXRpbWVzIGl0IGhhcHBlbnMhCisgICAgICAgICAgICAgICAgaWYgKGMuaXNMZWFmKCkgfHwgcy5pc0F0dHIoKSB8fCBoYXNNYXBwaW5ncygpKQorICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNhd0JlZ2luID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IGNFbmQgPSBjLmdldEZpbmlzaFNwbGF5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBzICE9IGNFbmQgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QmVnaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmVlZHNGcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F3QmVnaW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLmdldEZpbmlzaFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5pc0FmdGVyV2hpdGVTcGFjZSggZ2V0Um9vdCgpICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd0JlZ2luKQorICAgICAgICAgICAgICAgICAgICAgICAgX25lZWRzRnJhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgSSBhbSBkb2luZyBhZ2dyZXNzaXZlIG5hbWVzcGFjZXMgYW5kIHdlJ3JlIGVtaXR0aW5nIGEKKyAgICAgICAgLy8gY29udGFpbmVyIHdoaWNoIGNhbiBjb250YWluIGNvbnRlbnQsIGFkZCB0aGUgbmFtZXNwYWNlcworICAgICAgICAvLyB3ZSd2ZSBjb21wdXRlZC4gIEJhc2ljYWxseSwgSSdtIG1ha2luZyBzdXJlIHRoZSBwcmUtY29tcHV0ZWQKKyAgICAgICAgLy8gbmFtZXNwYWNlcyBhcmUgbWFwcGVkIG9uIHRoZSBmaXJzdCBjb250YWluZXIgd2hpY2ggaGFzIGEgbmFtZS4KKworICAgICAgICBpZiAoX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyAhPSBudWxsICYmIChuYW1lICE9IG51bGwgfHwgX25lZWRzRnJhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZW5zdXJlTWFwcGluZygKKyAgICAgICAgICAgICAgICAgICAgdXJpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBfcHJlQ29tcHV0ZWROYW1lc3BhY2VzLmdldCggdXJpICkgIT0gbnVsbCAmJiAhZW5zdXJlRGVmYXVsdEVtcHR5LCBmYWxzZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgdG8gbnVsbCBzbyB3ZSBkbyB0aGlzIG9uY2UgYXQgdGhlIHRvcAorICAgICAgICAgICAgX3ByZUNvbXB1dGVkTmFtZXNwYWNlcyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2VlIGlmIEkgbmVlZCB0byBnZW4gYSBmcmFnbWVudCBmb3IgdGhlIGRvY3VtZW50CisKKyAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGwgfHwgKGMuaXNEb2MoKSAmJiBfc3ludGhFbGVtID09IG51bGwpOworCisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfbmVlZHNGcmFnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlRnJhZ21lbnROYW1lc3BhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX2RvY0VsZW0gPSBuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMuaXNEb2MoKSkKKyAgICAgICAgICAgICAgICBfZG9jRWxlbSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBlbWl0Q29udGFpbmVyKCBjLCBuYW1lICk7CisKKyAgICAgICAgY2xlYXJUZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmQgKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKKyAgICAgICAgCisgICAgICAgIFFOYW1lIG5hbWUgPQorICAgICAgICAgICAgX3N5bnRoRWxlbSAhPSBudWxsICYmIGMgPT0gX3RvcAorICAgICAgICAgICAgICAgID8gX3N5bnRoRWxlbQorICAgICAgICAgICAgICAgIDogYy5pc0JlZ2luKCkgPyBjLmdldE5hbWUoKSA6IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAoX3dhbnRGcmFnVGVzdCAmJiBuYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNSb290ID0gcy5pc1Jvb3QoKTsKKworICAgICAgICAgICAgaWYgKCFpc1Jvb3QgfHwgX2RvY0VsZW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gCisgICAgICAgICAgICAgICAgICAgIGlzUm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgPyBfZG9jRWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgOiAocy5pc0VuZCgpID8gcy5nZXRDb250YWluZXIoKSA6IHMgKS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbWl0RW5kKCBfc3BsYXksIG5hbWUgKTsKKworICAgICAgICBhc3NlcnQgIV9wb3N0UG9wOworCisgICAgICAgIF9wb3N0UG9wID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHVzaEZyYWdtZW50TWFwcGluZ3MgKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIC8vIG1hc2sgdGhlIGluaXRpYWwgZnJhbWUgdG8gaGlkZSBkZWZhdWx0IG1hcHBpbmdzCisgICAgICAgIAorICAgICAgICBwdXNoTWFwcGluZ3MoCisgICAgICAgICAgICBzID09IG51bGwgPyBudWxsIDogcy5nZXRDb250YWluZXIoKSwKKyAgICAgICAgICAgIF9mcmFnbWVudC5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7CisgICAgICAgIAorICAgICAgICBlbnN1cmVGcmFnbWVudE5hbWVzcGFjZSgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzWG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgIHsKKyAgICAgICAgLy8gU2F2aW5nIGEgZGVmYXVsdCB4bWxucyBtYXBwaW5nIGlzIGRhbmdlcm91cywganVzdCBzcGl0IG91dCBlbXB0eQorICAgICAgICAvLyB0ZXh0CisgICAgICAgIAorICAgICAgICBpZiAocy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7CisgICAgICAgICAgICBfdGV4dCA9IF9zYjsKKyAgICAgICAgICAgIGVtaXRUZXh0RnJhZ21lbnQoIHMsIDAsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7CisgICAgICAgICAgICBlbnN1cmVNYXBwaW5nKCBzLmdldFVyaSgpLCBzLmdldExvY2FsKCksIGZhbHNlLCB0cnVlICk7CisgICAgICAgICAgICBlbWl0WG1sbnNGcmFnbWVudCggcyApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByb2Nlc3NDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7CisgICAgICAgIGVtaXRDb21tZW50RnJhZ21lbnQoIHMgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcHJvY2Vzc1Byb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICB7CisgICAgICAgIHB1c2hGcmFnbWVudE1hcHBpbmdzKCBudWxsICk7CisgICAgICAgIGVtaXRQcm9jaW5zdEZyYWdtZW50KCBzICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiBhIHNpbmdsZSBhdHRyIGlzIGJlaW5nIHNhdmVkLiAgSXQgaXMgbm90IGNhbGxlZAorICAgICAqIGFzIGEgY29uc2VxdWVuY2Ugb2Ygc2F2aW5nIG91dCBhIGNvbnRhaW5lci4KKyAgICAgKi8KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzQXR0ckZyYWdtZW50ICggU3BsYXkgcyApCisgICAgeworICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKKworICAgICAgICBwdXNoRnJhZ21lbnRNYXBwaW5ncyggcyApOworCisgICAgICAgIGVuc3VyZU1hcHBpbmcoIHMuZ2V0VXJpKCksIG51bGwsIGZhbHNlLCB0cnVlICk7CisKKyAgICAgICAgYXNzZXJ0IG5vVGV4dCgpOworCisgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIC0gcGFzcyBTdHJpbmdCdWZmZXIgdG8gYnVpbGRUZXh0IHRvIHNhdmUgb2JqZWN0IGNyZWF0aW9uCisgICAgICAgICAgICBfdGV4dCA9IF9zYi5hcHBlbmQoIHMucGVla1R5cGUoKS5idWlsZF90ZXh0KCB0aGlzICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGVtaXRBdHRyRnJhZ21lbnQoIHMgKTsKKworICAgICAgICBjbGVhclRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gYSBzaW5nbGUgY2h1bmsgb2YgdGV4dCBpcyB0byBiZSBzYXZlZC4KKyAgICAgKiBJdCBpcyBub3QgY2FsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2Ygc2F2aW5nIG91dCBhIGNvbnRhaW5lci4KKyAgICAgKi8KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcm9jZXNzVGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgLy8gT25seSBuZWVkIHRvIHNhdmUgYW5jZXN0b3IgbmFtZXNwYWNlIG1hcHBpbmdzIGlmIHRoZXJlIGNvdWxkIGJlIGEKKyAgICAgICAgLy8gcW5hbWUgaGVyZS4gIElmIHRoZSB0ZXh0IGlzIG9mIGxlbmd0aCAwLCB0aGVuIHRoZXJlIGlzIG5vIHFuYW1lLgorCisgICAgICAgIFNwbGF5IGMgPSBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKChfdGV4dCAhPSBudWxsICYmIF90ZXh0Lmxlbmd0aCgpID4gMCkgfHwgKHMgIT0gbnVsbCAmJiBjY2ggPiAwKSkKKyAgICAgICAgICAgIGMgPSBzLmdldENvbnRhaW5lciggcCApOworICAgICAgICAKKyAgICAgICAgcHVzaEZyYWdtZW50TWFwcGluZ3MoIGMgKTsKKworICAgICAgICBlbWl0VGV4dEZyYWdtZW50KCBzLCBwLCBjY2ggKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIExheW91dCBvZiBuYW1lc3BhY2Ugc3RhY2s6CisgICAgLy8KKyAgICAvLyAgICBVUkkgVW5kbworICAgIC8vICAgIFVSSSBSZW5hbWUKKyAgICAvLyAgICBQcmVmaXggVW5kbworICAgIC8vICAgIE1hcHBpbmcKKyAgICAvLworCisgICAgYm9vbGVhbiBoYXNNYXBwaW5ncyAoICkKKyAgICB7CisgICAgICAgIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKKworICAgICAgICByZXR1cm4gaSA+IDAgJiYgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSAhPSBudWxsOworICAgIH0KKworICAgIHZvaWQgaXRlcmF0ZU1hcHBpbmdzICggKQorICAgIHsKKyAgICAgICAgX2N1cnJlbnRNYXBwaW5nID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKKworICAgICAgICB3aGlsZSAoIF9jdXJyZW50TWFwcGluZyA+IDAgJiYKKyAgICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyAtIDEgKSAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgX2N1cnJlbnRNYXBwaW5nIC09IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGhhc01hcHBpbmcgKCApCisgICAgeworICAgICAgICByZXR1cm4gX2N1cnJlbnRNYXBwaW5nIDwgX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKKyAgICB9CisKKyAgICB2b2lkIG5leHRNYXBwaW5nICggKQorICAgIHsKKyAgICAgICAgX2N1cnJlbnRNYXBwaW5nICs9IDg7CisgICAgfQorCisgICAgU3RyaW5nIG1hcHBpbmdQcmVmaXggKCApCisgICAgeworICAgICAgICBhc3NlcnQgaGFzTWFwcGluZygpOworICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNiApOworICAgIH0KKworICAgIFN0cmluZyBtYXBwaW5nVXJpICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGhhc01hcHBpbmcoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9uYW1lc3BhY2VTdGFjay5nZXQoIF9jdXJyZW50TWFwcGluZyArIDcgKTsKKyAgICB9CisKKyAgICBTdHJpbmcgbWFwcGluZ1ByZXZQcmVmaXhVcmkgKCApCisgICAgeworICAgICAgICBhc3NlcnQgaGFzTWFwcGluZygpOworICAgICAgICByZXR1cm4gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggX2N1cnJlbnRNYXBwaW5nICsgNSApOworICAgIH0KKworICAgIC8vCisgICAgLy8KKyAgICAvLworCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHB1c2hNYXBwaW5ncyAoIENvbnRhaW5lciBjLCBib29sZWFuIGVuc3VyZURlZmF1bHRFbXB0eSApCisgICAgeworICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBudWxsICk7CisKKyAgICAgICAgZm9yICggOyBjICE9IG51bGwgOyBjID0gYy5nZXRDb250YWluZXIoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWVzcGFjZXM6CisgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sbnMgeCA9IChYbWxucykgczsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHguZ2V0TG9jYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHguZ2V0VXJpKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuc3VyZURlZmF1bHRFbXB0eSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeC5sZW5ndGgoKSA9PSAwICYmIHVyaS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcmVmaXggaXMgbm90IGFscmVhZHkgbWFwcGVkIGluCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZnJhbWUKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmdQcmVmaXgoKS5lcXVhbHMoIHByZWZpeCApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG5hbWVzcGFjZXM7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkTWFwcGluZyggcHJlZml4LCB1cmkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFB1c2ggYWxsIGFuY2VzdG9ycyB0aGUgZmlyc3QgdGltZQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIV9maXJzdFB1c2gpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5zdXJlRGVmYXVsdEVtcHR5KQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFVyaSA9IChTdHJpbmcpIF9wcmVmaXhNYXAuZ2V0KCAiIiApOworCisgICAgICAgICAgICAvLyBJIG1hcCB0aGUgZGVmYXVsdCB0byAiIiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGFzc2VydCBkZWZhdWx0VXJpICE9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChkZWZhdWx0VXJpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICBhZGRNYXBwaW5nKCAiIiwgIiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9maXJzdFB1c2ggPSBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgZHVtcE1hcHBpbmdzICggKQorICAgIHsKKyAgICAgICAgZm9yICggaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpIDsgaSA+IDAgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMSApID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiLS0tLS0tLS0tLS0tLS0tLSIgKTsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJNYXBwaW5nOiAiICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gMiApICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiUHJlZml4IFVuZG86ICIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA0ICkgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICIgLT4gIiApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDMgKSApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoICJVcmkgUmVuYW1lOiAiICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNSApICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiIC0+ICIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA2ICkgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCAiVXJpVW5kbzogIiApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDcgKSApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCggIiAtPiAiICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisKKyAgICAgICAgICAgIGkgLT0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGRNYXBwaW5nICggU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSApCisgICAgeworICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7CisgICAgICAgIGFzc2VydCBwcmVmaXggIT0gbnVsbDsKKworICAgICAgICAvLyBJZiB0aGUgcHJlZml4IGJlaW5nIG1hcHBlZCBoZXJlIGlzIGFscmVhZHkgbWFwcGVkIHRvIGEgdXJpLAorICAgICAgICAvLyB0aGF0IHVyaSB3aWxsIGVpdGhlciBnbyBvdXQgb2Ygc2NvcGUgb3IgYmUgbWFwcGVkIHRvIGFub3RoZXIKKyAgICAgICAgLy8gcHJlZml4LgorCisgICAgICAgIFN0cmluZyByZW5hbWVVcmkgPSAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ICk7CisgICAgICAgIFN0cmluZyByZW5hbWVQcmVmaXggPSBudWxsOworCisgICAgICAgIGlmIChyZW5hbWVVcmkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2VlIGlmIHRoaXMgcHJlZml4IGlzIGFscmVhZHkgbWFwcGVkIHRvIHRoaXMgdXJpLiAgSWYKKyAgICAgICAgICAgIC8vIHNvLCB0aGVuIGFkZCB0byB0aGUgc3RhY2ssIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHJlbmFtZQorICAgICAgICAKKyAgICAgICAgICAgIGlmIChyZW5hbWVVcmkuZXF1YWxzKCB1cmkgKSkKKyAgICAgICAgICAgICAgICByZW5hbWVVcmkgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpID0gX25hbWVzcGFjZVN0YWNrLnNpemUoKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICggaSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSAxICkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDcgKS5lcXVhbHMoIHJlbmFtZVVyaSApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcmVmaXggPSAoU3RyaW5nKSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuYW1lUHJlZml4ID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZW5hbWVQcmVmaXguZXF1YWxzKCBwcmVmaXggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGkgLT0gODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgaSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBfdXJpTWFwLmdldCggdXJpICkgKTsKKyAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggdXJpICk7CisKKyAgICAgICAgaWYgKHJlbmFtZVVyaSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCBfdXJpTWFwLmdldCggcmVuYW1lVXJpICkgKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHJlbmFtZVVyaSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggbnVsbCApOworICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgX25hbWVzcGFjZVN0YWNrLmFkZCggcHJlZml4ICk7CisgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIF9wcmVmaXhNYXAuZ2V0KCBwcmVmaXggKSApOworCisgICAgICAgIF9uYW1lc3BhY2VTdGFjay5hZGQoIHByZWZpeCApOworICAgICAgICBfbmFtZXNwYWNlU3RhY2suYWRkKCB1cmkgKTsKKworICAgICAgICBfdXJpTWFwLnB1dCggdXJpLCBwcmVmaXggKTsKKyAgICAgICAgX3ByZWZpeE1hcC5wdXQoIHByZWZpeCwgdXJpICk7CisKKyAgICAgICAgaWYgKHJlbmFtZVVyaSAhPSBudWxsKQorICAgICAgICAgICAgX3VyaU1hcC5wdXQoIHJlbmFtZVVyaSwgcmVuYW1lUHJlZml4ICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBvcE1hcHBpbmdzICggKQorICAgIHsKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSBfbmFtZXNwYWNlU3RhY2suc2l6ZSgpOworCisgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDEgKSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAxICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdCBvbGRVcmkgPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gNyApOyAKKyAgICAgICAgICAgIE9iamVjdCBvbGRQcmVmaXggPSBfbmFtZXNwYWNlU3RhY2suZ2V0KCBpIC0gOCApOyAKKworICAgICAgICAgICAgaWYgKG9sZFByZWZpeCA9PSBudWxsKSAKKyAgICAgICAgICAgICAgICBfdXJpTWFwLnJlbW92ZSggb2xkVXJpICk7IAorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBfdXJpTWFwLnB1dCggb2xkVXJpLCBvbGRQcmVmaXggKTsgCisKKyAgICAgICAgICAgIG9sZFByZWZpeCA9IF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA0ICk7IAorICAgICAgICAgICAgb2xkVXJpID0gX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDMgKTsgCisKKyAgICAgICAgICAgIGlmIChvbGRVcmkgPT0gbnVsbCkgCisgICAgICAgICAgICAgICAgX3ByZWZpeE1hcC5yZW1vdmUoIG9sZFByZWZpeCApOyAKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgX3ByZWZpeE1hcC5wdXQoIG9sZFByZWZpeCwgb2xkVXJpICk7IAorCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgX25hbWVzcGFjZVN0YWNrLmdldCggaSAtIDUgKTsKKworICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF91cmlNYXAucHV0KCB1cmksIF9uYW1lc3BhY2VTdGFjay5nZXQoIGkgLSA2ICkgKTsKKworICAgICAgICAgICAgLy8gSGFoYWhhaGFoYWhhIC0tIDotKAorICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDEgKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSAyICk7CisgICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gMyApOworICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDQgKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA1ICk7CisgICAgICAgICAgICBfbmFtZXNwYWNlU3RhY2sucmVtb3ZlKCBpIC0gNiApOworICAgICAgICAgICAgX25hbWVzcGFjZVN0YWNrLnJlbW92ZSggaSAtIDcgKTsKKyAgICAgICAgICAgIF9uYW1lc3BhY2VTdGFjay5yZW1vdmUoIGkgLSA4ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFVyaU1hcHBpbmcgKCBTdHJpbmcgdXJpICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfdXJpTWFwLmdldCggdXJpICkgIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIF91cmlNYXAuZ2V0KCB1cmkgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB0cnlQcmVmaXggKCBTdHJpbmcgcHJlZml4ICkKKyAgICB7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBTcGxheS5iZWdpbnNXaXRoWG1sKCBwcmVmaXggKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgZXhpc3RpbmdVcmkgPSAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ICk7CisKKyAgICAgICAgLy8gSWYgdGhlIHByZWZpeCBpcyBjdXJyZW50bHkgbWFwcGVkLCB0aGVuIHRyeSBhbm90aGVyIHByZWZpeC4gIEEKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGlzIHRoYXQgb2YgdHJ5aW5nIHRvIG1hcCB0aGUgZGVmYXVsdCBwcmVmaXggKCIiKS4KKyAgICAgICAgLy8gSGVyZSwgdGhlcmUgYWx3YXlzIGV4aXN0cyBhIGRlZmF1bHQgbWFwcGluZy4gIElmIHRoaXMgaXMgdGhlCisgICAgICAgIC8vIG1hcHBpbmcgd2UgZm91bmQsIHRoZW4gcmVtYXAgaXQgYW55d2F5cy4gSSB1c2UgIT0gdG8gY29tcGFyZQorICAgICAgICAvLyBzdHJpbmdzIGJlY2F1c2UgSSB3YW50IHRvIHRlc3QgZm9yIHRoZSBzcGVjaWZpYyBpbml0aWFsIGRlZmF1bHQKKyAgICAgICAgLy8gdXJpIEkgYWRkZWQgd2hlbiBJIGluaXRpYWxpemVkIHRoZSBzYXZlci4KKworICAgICAgICBpZiAoZXhpc3RpbmdVcmkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAocHJlZml4Lmxlbmd0aCgpID4gMCB8fCBleGlzdGluZ1VyaSAhPSBfaW5pdGlhbERlZmF1bHRVcmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVuc3VyZU1hcHBpbmcgKAorICAgICAgICBTdHJpbmcgdXJpLCBTdHJpbmcgY2FuZGlkYXRlUHJlZml4LAorICAgICAgICBib29sZWFuIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0LCBib29sZWFuIG11c3RIYXZlUHJlZml4ICkKKyAgICB7CisgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGNhbmRpZGF0ZVByZWZpeCA9PSBudWxsIHx8IGNhbmRpZGF0ZVByZWZpeC5sZW5ndGgoKSA+IDA7CisKKyAgICAgICAgLy8gQ2FuIGJlIGNhbGxlZCBmb3Igbm8tbmFtZXNwYWNlZCB0aGluZ3MKKworICAgICAgICBpZiAodXJpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgX3VyaU1hcC5nZXQoIHVyaSApOworCisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiAocHJlZml4Lmxlbmd0aCgpID4gMCB8fCAhbXVzdEhhdmVQcmVmaXgpKQorICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKKworICAgICAgICAvLworICAgICAgICAvLyBJIHRyeSBwcmVmaXhlcyBmcm9tIGEgbnVtYmVyIG9mIHBsYWNlcywgaW4gb3JkZXI6CisgICAgICAgIC8vCisgICAgICAgIC8vICAxKSBXaGF0IHdhcyBwYXNzZWQgaW4KKyAgICAgICAgLy8gIDIpIFRoZSBvcHRpb25hbCBzdWdnZXN0aW9ucyAoZm9yIHVyaSdzKQorICAgICAgICAvLyAgMykgVGhlIGRlZmF1bHQgbWFwcGluZyBpcyBhbGxvd2VkCisgICAgICAgIC8vICA0KSBucyMrKworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgaWYgKGNhbmRpZGF0ZVByZWZpeCA9PSBudWxsIHx8ICF0cnlQcmVmaXgoIGNhbmRpZGF0ZVByZWZpeCApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3N1Z2dlc3RlZFByZWZpeGVzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgX3N1Z2dlc3RlZFByZWZpeGVzLmNvbnRhaW5zS2V5KCB1cmkgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5UHJlZml4KCAoU3RyaW5nKSBfc3VnZ2VzdGVkUHJlZml4ZXMuZ2V0KCB1cmkgKSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9IChTdHJpbmcpIF9zdWdnZXN0ZWRQcmVmaXhlcy5nZXQoIHVyaSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgJiYgX3VzZURlZmF1bHROYW1lc3BhY2UgJiYgdHJ5UHJlZml4KCAiIiApKQorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVByZWZpeCA9ICIiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gUU5hbWVIZWxwZXIuc3VnZ2VzdFByZWZpeCggdXJpICk7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gYmFzZVByZWZpeDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyA7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJ5UHJlZml4KCBjYW5kaWRhdGVQcmVmaXggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlUHJlZml4ID0gYmFzZVByZWZpeCArIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IGNhbmRpZGF0ZVByZWZpeCAhPSBudWxsOworCisgICAgICAgIHN5bnRoZXRpY05hbWVzcGFjZSggY2FuZGlkYXRlUHJlZml4LCB1cmksIGNvbnNpZGVyQ3JlYXRpbmdEZWZhdWx0ICk7CisKKyAgICAgICAgYWRkTWFwcGluZyggY2FuZGlkYXRlUHJlZml4LCB1cmkgKTsKKworICAgICAgICByZXR1cm4gY2FuZGlkYXRlUHJlZml4OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICggU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCApCisgICAgeworICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7CisgICAgICAgIGFzc2VydCBwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPiAwOworCisgICAgICAgIGJvb2xlYW4gZW1wdHlVcmkgPSB1cmkubGVuZ3RoKCkgPT0gMDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBlbnN1cmVNYXBwaW5nKCB1cmksIHByZWZpeCwgZW1wdHlVcmksICFlbXB0eVVyaSApOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCisgICAgeworICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyggInhtbCIgKSkKKyAgICAgICAgICAgIHJldHVybiBTcGxheS5feG1sMTk5OFVyaTsKKworICAgICAgICByZXR1cm4gKFN0cmluZykgX3ByZWZpeE1hcC5nZXQoIHByZWZpeCApOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZW5zdXJlRnJhZ21lbnROYW1lc3BhY2UgKCApCisgICAgeworICAgICAgICBpZiAoX2ZyYWdtZW50LmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZW5zdXJlTWFwcGluZyggX2ZyYWdtZW50LmdldE5hbWVzcGFjZVVSSSgpLCAiZnJhZyIsIGZhbHNlLCBmYWxzZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgU2F2ZXIgd2hpY2ggcmVjb3JkcyBzeW50aGV0aWMgbmFtZXNwYWNlcworICAgICAqLworICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW50aE5hbWVzcGFjZVNhdmVyIGV4dGVuZHMgU2F2ZXIKKyAgICB7CisgICAgICAgIExpbmtlZEhhc2hNYXAgX3N5bnRoTmFtZXNwYWNlcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgIAorICAgICAgICBTeW50aE5hbWVzcGFjZVNhdmVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3ludGhldGljTmFtZXNwYWNlICgKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIGJvb2xlYW4gY29uc2lkZXJDcmVhdGluZ0RlZmF1bHQgKQorICAgICAgICB7CisgICAgICAgICAgICBfc3ludGhOYW1lc3BhY2VzLnB1dCggdXJpLCBjb25zaWRlckNyZWF0aW5nRGVmYXVsdCA/ICJ1c2VEZWZhdWx0IiA6IG51bGwgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkgeyB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkgeyB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApIHsgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApIHsgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKSB7IH0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnQgKCBTcGxheSBzICkgeyB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApIHsgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApIHsgfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkgeyB9CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApIHsgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdERvY1R5cGUoCisgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEICkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBTYXZlciB3aGljaCBnZW5lcmF0ZXMgY2hhcmFjdGVycy4KKyAgICAgKi8KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0U2F2ZXIgZXh0ZW5kcyBTYXZlcgorICAgIHsKKyAgICAgICAgVGV4dFNhdmVyICgKKyAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFhtbE9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIGVuY29kaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKKworICAgICAgICAgICAgX3dhbnRGcmFnVGVzdCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gci5fcHJvcHMuZ2V0VmVyc2lvbigpOworCisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9ICIxLjAiOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVtaXQoICI8P3htbCB2ZXJzaW9uPVwiIiApOworICAgICAgICAgICAgICAgIGVtaXQoIHZlcnNpb24gKTsKKyAgICAgICAgICAgICAgICBlbWl0KCAiXCIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIgKyBfbmV3TGluZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGMuaXNCZWdpbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwsIGZhbHNlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoYy5pc0xlYWYoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBfdGV4dCA9PSBudWxsID8gYy5nZXRDY2hWYWx1ZSgpIDogX3RleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICc+JyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIGMgKSwgY2NoICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoICI8LyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXROYW1lKCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJy8nICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAhYy5pc0xlYWYoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYy5nZXRDY2hBZnRlcigpID09IDAgJiYgYy5uZXh0Tm9uQXR0clNwbGF5KCkuaXNFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdCggJy8nICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc2tpcENvbnRhaW5lckZpbmlzaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbWl0KCAnPicgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgYy5pc0RvYygpOworCisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggYywgbmFtZSwgbnVsbCwgbnVsbCwgdHJ1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVtaXQoIGdldFJvb3QoKS5nZXRDcCggYyApLCBjLmdldENjaCgpICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlbWl0KCBfdGV4dCApOworCisgICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgaW52YWxpZFZhbHVlICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHMuaXNOb3JtYWxBdHRyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVtaXQoICcgJyApOworICAgICAgICAgICAgZW1pdE5hbWUoIHMuZ2V0TmFtZSgpICk7CisgICAgICAgICAgICBlbWl0KCAiPVwiIiApOworCisgICAgICAgICAgICBpZiAoaW52YWxpZFZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW1pdCggaW52YWxpZFZhbHVlICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoKCkgKTsKKworICAgICAgICAgICAgZW50aXRpemVBdHRyVmFsdWUoKTsKKworICAgICAgICAgICAgZW1pdCggJyInICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWVzcGFjZXNIZWxwZXIgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdCggJyAnICk7CisgICAgICAgICAgICAgICAgZW1pdFhtbG5zKCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q29udGFpbmVySGVscGVyICgKKyAgICAgICAgICAgIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lLAorICAgICAgICAgICAgU3BsYXkgZXh0cmFBdHRyLCBTdHJpbmdCdWZmZXIgZXh0cmFBdHRyVGV4dCwKKyAgICAgICAgICAgIGJvb2xlYW4gY2xvc2UgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOworCisgICAgICAgICAgICBlbWl0KCAnPCcgKTsKKyAgICAgICAgICAgIGVtaXROYW1lKCBuYW1lICk7CisKKyAgICAgICAgICAgIGlmIChfc2F2ZU5hbWVzcGFjZXNGaXJzdCkKKyAgICAgICAgICAgICAgICBlbWl0TmFtZXNwYWNlc0hlbHBlcigpOworCisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBfYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKSA7IGkuaGFzTmV4dCgpIDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGVtaXRBdHRySGVscGVyKCBzLCAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChleHRyYUF0dHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0QXR0ckhlbHBlcigKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyLAorICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJUZXh0ID09IG51bGwgPyBudWxsIDogZXh0cmFBdHRyVGV4dC50b1N0cmluZygpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghX3NhdmVOYW1lc3BhY2VzRmlyc3QpCisgICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKKworICAgICAgICAgICAgaWYgKGNsb3NlKQorICAgICAgICAgICAgICAgIGVtaXQoICc+JyApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXQoIHMuZ2V0Q3BGb3JQb3MoIGdldFJvb3QoKSwgcCApLCBjY2ggKTsKKyAgICAgICAgICAgIGVudGl0aXplQ29udGVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQoIF90ZXh0ICk7CisgICAgICAgICAgICAgICAgZW50aXRpemVDb250ZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIGZhbHNlICk7CisKKyAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbWl0KCAiPiIgKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCggX3RleHQgKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdEVuZEhlbHBlciggX2ZyYWdtZW50ICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNjaCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbWl0KCAiPiIgKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOworICAgICAgICAgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZW1pdCggIi8+IiApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIHMsIF90ZXh0LCBmYWxzZSApOworICAgICAgICAgICAgZW1pdCggIi8+IiApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFhtbG5zRnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsLCBmYWxzZSApOworICAgICAgICAgICAgZW1pdCggIi8+IiApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwsIHRydWUgKTsKKyAgICAgICAgICAgIGVtaXRDb21tZW50KCBzICk7CisgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIG51bGwsIF9mcmFnbWVudCwgbnVsbCwgbnVsbCwgdHJ1ZSApOworICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBzICk7CisgICAgICAgICAgICBlbWl0RW5kSGVscGVyKCBfZnJhZ21lbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxucyAoIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgdXJpICE9IG51bGw7CisKKyAgICAgICAgICAgIGVtaXQoICJ4bWxucyIgKTsKKworICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdCggIjoiICk7CisgICAgICAgICAgICAgICAgZW1pdCggcHJlZml4ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtaXQoICI9XCIiICk7CisKKyAgICAgICAgICAgIC8vIFRPRE8gLSBtdXN0IGVuY29kZSB1cmkgcHJvcGVybHkKKworICAgICAgICAgICAgZW1pdCggdXJpICk7CisgICAgICAgICAgICBlbnRpdGl6ZUF0dHJWYWx1ZSgpOworCisgICAgICAgICAgICBlbWl0KCAnIicgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmRIZWxwZXIgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCggIjwvIiApOworICAgICAgICAgICAgZW1pdE5hbWUoIG5hbWUgKTsKKyAgICAgICAgICAgIGVtaXQoICc+JyApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEVuZCAoIFNwbGF5IHMsIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGVtaXRFbmRIZWxwZXIoIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0TGl0ZXJhbCAoIFN0cmluZyBsaXRlcmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxpdGVyYWwuaW5kZXhPZiggIlwiIiApIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0KCAiXCIiICk7CisgICAgICAgICAgICAgICAgZW1pdCggbGl0ZXJhbCApOworICAgICAgICAgICAgICAgIGVtaXQoICJcIiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0KCAiJyIgKTsKKyAgICAgICAgICAgICAgICBlbWl0KCBsaXRlcmFsICk7CisgICAgICAgICAgICAgICAgZW1pdCggIiciICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZG9jdHlwZU5hbWUgIT0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZW1pdCggIjwhRE9DVFlQRSAiICk7CisgICAgICAgICAgICBlbWl0KCBkb2N0eXBlTmFtZSApOworCisgICAgICAgICAgICBpZiAocHVibGljSUQgPT0gbnVsbCAmJiBzeXN0ZW1JRCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXQoICIgU1lTVEVNICIgKTsKKyAgICAgICAgICAgICAgICBlbWl0TGl0ZXJhbCggc3lzdGVtSUQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHB1YmxpY0lEICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdCggIiBQVUJMSUMgIiApOworICAgICAgICAgICAgICAgIGVtaXRMaXRlcmFsKCBwdWJsaWNJRCApOworICAgICAgICAgICAgICAgIGVtaXQoICIgIiApOworICAgICAgICAgICAgICAgIGVtaXRMaXRlcmFsKCBzeXN0ZW1JRCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbWl0KCAiPiIgKyBfbmV3TGluZSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcy5pc0NvbW1lbnQoKTsKKyAgICAgICAgICAgIGVtaXQoICI8IS0tIiApOworICAgICAgICAgICAgZW1pdCggZ2V0Um9vdCgpLmdldENwKCBzICksIHMuZ2V0Q2NoVmFsdWUoKSApOworICAgICAgICAgICAgZW50aXRpemVDb21tZW50KCk7CisgICAgICAgICAgICBlbWl0KCAiLS0+IiApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBzLmlzUHJvY2luc3QoKTsKKyAgICAgICAgICAgIGVtaXQoICI8PyIgKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBlbmNvZGluZyBpc3N1ZXMgaGVyZT8KKyAgICAgICAgICAgIGVtaXQoIHMuZ2V0TG9jYWwoKSApOworCisgICAgICAgICAgICBpZiAocy5nZXRDY2hWYWx1ZSgpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbWl0KCAiICIgKTsKKyAgICAgICAgICAgICAgICBlbWl0KCBnZXRSb290KCkuZ2V0Q3AoIHMgKSwgcy5nZXRDY2hWYWx1ZSgpICk7CisgICAgICAgICAgICAgICAgZW50aXRpemVQcm9jaW5zdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbWl0KCAiPz4iICk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRW5zdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IGNjaCBjaGFycyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgICogUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlLiAgSWYgbGVzcyB0aGFuIGNjaCwKKyAgICAgICAgICogdGhlbiB0aGF0J3MgYWxsIHdoaWNoIHdpbGwgZXZlciBiZWNvbWUgYXZhaWxhYmxlLgorICAgICAgICAgKi8KKworICAgICAgICBwcml2YXRlIGludCBlbnN1cmUgKCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXZlbiBpZiB3ZSdyZSBhc2tlZCB0byBlbnN1cmUgbm90aGluZywgc3RpbGwgdHJ5IHRvIGVuc3VyZQorICAgICAgICAgICAgLy8gYXRsZWFzdCBvbmUgY2hhcmFjdGVyIHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgYXQgdGhlCisgICAgICAgICAgICAvLyBlbmQgb2YgdGhlIHN0cmVhbS4KKworICAgICAgICAgICAgaWYgKGNjaCA8PSAwKQorICAgICAgICAgICAgICAgIGNjaCA9IDE7CisKKyAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKTsKKworICAgICAgICAgICAgZm9yICggOyBhdmFpbGFibGUgPCBjY2ggOyBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKSApCisgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBhc3NlcnQgYXZhaWxhYmxlID09IGdldEF2YWlsYWJsZSgpOworCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdE5hbWUgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7CisKKyAgICAgICAgICAgIGFzc2VydCB1cmkgIT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRVcmlNYXBwaW5nKCB1cmkgKTsKKworICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdCggcHJlZml4ICk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoICI6IiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0IG5hbWUuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwOworCisgICAgICAgICAgICBlbWl0KCBuYW1lLmdldExvY2FsUGFydCgpICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJlRW1pdCAoIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgY2NoID49IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF9sYXN0RW1pdENjaCA9IGNjaDsKKworICAgICAgICAgICAgaWYgKGNjaCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZiAoX2ZyZWUgPCBjY2gpCisgICAgICAgICAgICAgICAgcmVzaXplKCBjY2gsIC0xICk7CisKKyAgICAgICAgICAgIGFzc2VydCBjY2ggPD0gX2ZyZWU7CisKKyAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBhYm91dCB0byBlbWl0IGFuZCB0aGVyZSBpcyBub3RpbmcgaW4gdGhlIGJ1ZmZlciwgcmVzZXQKKyAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBzbyBhcyB0byBub3QgZ3JvdyBpdCBhbnltb3JlCisgICAgICAgICAgICAvLyB0aGFuIG5lZWRlZC4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHVzZWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgX2luID09IF9vdXQ7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID09IF9idWYubGVuZ3RoOworICAgICAgICAgICAgICAgIF9pbiA9IF9vdXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEVtaXRJbiA9IF9pbjsKKworICAgICAgICAgICAgX2ZyZWUgLT0gY2NoOworICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBTdHJpbmcgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2ggPSBzID09IG51bGwgPyAwIDogcy5sZW5ndGgoKTsKKworICAgICAgICAgICAgaWYgKHByZUVtaXQoIGNjaCApKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGNodW5rOworCisgICAgICAgICAgICBpZiAoX2luIDw9IF9vdXQgfHwgY2NoIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMuZ2V0Q2hhcnMoIDAsIGNjaCwgX2J1ZiwgX2luICk7CisgICAgICAgICAgICAgICAgX2luICs9IGNjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLmdldENoYXJzKCAwLCBjaHVuaywgX2J1ZiwgX2luICk7CisgICAgICAgICAgICAgICAgcy5nZXRDaGFycyggY2h1bmssIGNjaCwgX2J1ZiwgMCApOworICAgICAgICAgICAgICAgIF9pbiA9IChfaW4gKyBjY2gpICUgX2J1Zi5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIFN0cmluZ0J1ZmZlciBzYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2ggPSBzYiA9PSBudWxsID8gMCA6IHNiLmxlbmd0aCgpOworCisgICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgY2h1bms7CisKKyAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjY2ggPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuZ2V0Q2hhcnMoIDAsIGNjaCwgX2J1ZiwgX2luICk7CisgICAgICAgICAgICAgICAgX2luICs9IGNjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggMCwgY2h1bmssIF9idWYsIF9pbiApOworICAgICAgICAgICAgICAgIHNiLmdldENoYXJzKCBjaHVuaywgY2NoLCBfYnVmLCAwICk7CisgICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNjaCkgJSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0ICggaW50IGNwLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdCgKKyAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQuX2J1ZiwKKyAgICAgICAgICAgICAgICBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCisgICAgICAgICAgICAgICAgY2NoICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdCAoIGNoYXIgY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVFbWl0KCAxICk7CisKKyAgICAgICAgICAgIF9idWZbIF9pbiBdID0gY2g7CisKKyAgICAgICAgICAgIF9pbiA9IChfaW4gKyAxKSAlIF9idWYubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOworCisgICAgICAgICAgICBpZiAocHJlRW1pdCggY2NoICkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgY2h1bms7CisKKyAgICAgICAgICAgIGlmIChfaW4gPD0gX291dCB8fCBjY2ggPCAoY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9pbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2NoICk7CisgICAgICAgICAgICAgICAgX2luICs9IGNjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjaHVuayApOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGJ1Ziwgb2ZmICsgY2h1bmssIF9idWYsIDAsIGNjaCAtIGNodW5rICk7CisgICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNjaCkgJSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBlbnRpdGl6ZUNvbnRlbnQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbGFzdEVtaXRDY2ggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGludCBpID0gX2xhc3RFbWl0SW47CisgICAgICAgICAgICBmaW5hbCBpbnQgbiA9IF9idWYubGVuZ3RoOworCisgICAgICAgICAgICBib29sZWFuIGhhc091dE9mUmFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoIGludCBjY2ggPSBfbGFzdEVtaXRDY2ggOyBjY2ggPiAwIDsgY2NoLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBfYnVmWyBpIF07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzwnIHx8IGNoID09ICcmJykKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0JhZENoYXIoIGNoICkpCisgICAgICAgICAgICAgICAgICAgIGhhc091dE9mUmFuZ2UgPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKCsraSA9PSBuKQorICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvdW50ID09IDAgJiYgIWhhc091dE9mUmFuZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpID0gX2xhc3RFbWl0SW47CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIZXVyaXN0aWMgZm9yIGtub3dpbmcgd2hlbiB0byBzYXZlIG91dCBzdHVmZiBhcyBhIENEQVRBLgorICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA+IDMyICYmIGNvdW50ID4gNSAmJgorICAgICAgICAgICAgICAgICAgY291bnQgKiAxMDAgLyBfbGFzdEVtaXRDY2ggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFzdFdhc0JyYWNrZXQgPSBfYnVmWyBpIF0gPT0gJ10nOworCisgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI8IVtDREFUQVsiICsgX2J1ZlsgaSBdICk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIHNlY29uZFRvTGFzdFdhc0JyYWNrZXQgPSBsYXN0V2FzQnJhY2tldDsKKworICAgICAgICAgICAgICAgIGxhc3RXYXNCcmFja2V0ID0gX2J1ZlsgaSBdID09ICddJzsKKworICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gX2J1Zi5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPicgJiYgc2Vjb25kVG9MYXN0V2FzQnJhY2tldCAmJiBsYXN0V2FzQnJhY2tldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmd0OyIgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNCYWRDaGFyKCBjaCApKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI/IiApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kVG9MYXN0V2FzQnJhY2tldCA9IGxhc3RXYXNCcmFja2V0OworICAgICAgICAgICAgICAgICAgICBsYXN0V2FzQnJhY2tldCA9IGNoID09ICddJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBfYnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVtaXQoICJdXT4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiZsdDsiICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICcmJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJmFtcDsiICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzQmFkQ2hhciggY2ggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPyIgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IF9idWYubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplQXR0clZhbHVlICggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2xhc3RFbWl0Q2NoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgaSA9IF9sYXN0RW1pdEluOworCisgICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc8JykKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImbHQ7IiApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICcmJykKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICImYW1wOyIgKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnIicpCisgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiJnF1b3Q7IiApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gX2J1Zi5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVudGl0aXplQ29tbWVudCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKKworICAgICAgICAgICAgYm9vbGVhbiBsYXN0V2FzRGFzaCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKCBpbnQgY2NoID0gX2xhc3RFbWl0Q2NoIDsgY2NoID4gMCA7IGNjaC0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gX2J1ZlsgaSBdOworCisgICAgICAgICAgICAgICAgaWYgKGlzQmFkQ2hhciggY2ggKSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIGksICI/IiApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICctJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0V2FzRGFzaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSAiLS0iIHdpdGggIi0gIiB0byBtYWtlIHdlbGwgZm9ybWVkCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiAiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FzRGFzaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0Rhc2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNEYXNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBfYnVmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJlY2F1c2UgSSBoYXZlIG9ubHkgcmVwbGFjZWQgY2hhcnMgd2l0aCBzaW5nbGUgY2hhcnMsCisgICAgICAgICAgICAvLyBfbGFzdEVtaXRJbiB3aWxsIHN0aWxsIGJlIG9rCisKKyAgICAgICAgICAgIGlmIChfYnVmWyBfbGFzdEVtaXRJbiArIF9sYXN0RW1pdENjaCAtIDEgXSA9PSAnLScpCisgICAgICAgICAgICAgICAgaSA9IHJlcGxhY2UoIF9sYXN0RW1pdEluICsgX2xhc3RFbWl0Q2NoIC0gMSwgIiAiICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW50aXRpemVQcm9jaW5zdCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9sYXN0RW1pdENjaCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IGkgPSBfbGFzdEVtaXRJbjsKKworICAgICAgICAgICAgYm9vbGVhbiBsYXN0V2FzUXVlc3Rpb24gPSBmYWxzZTsKKworICAgICAgICAgICAgZm9yICggaW50IGNjaCA9IF9sYXN0RW1pdENjaCA7IGNjaCA+IDAgOyBjY2gtLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IF9idWZbIGkgXTsKKworICAgICAgICAgICAgICAgIGlmIChpc0JhZENoYXIoIGNoICkpCisgICAgICAgICAgICAgICAgICAgIGkgPSByZXBsYWNlKCBpLCAiPyIgKTsKKworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPicpCisgICAgICAgICAgICAgICAgeworICAgIC8vIFRPRE8gLSBIYWQgdG8gY29udmVydCB0byBhIHNwYWNlIGhlcmUgLi4uIGltcGxlcyBub3Qgd2VsbCBmb3JtZWQgWE1MCisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0V2FzUXVlc3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVwbGFjZSggaSwgIiAiICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgICAgICBsYXN0V2FzUXVlc3Rpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFdhc1F1ZXN0aW9uID0gY2ggPT0gJz8nOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gX2J1Zi5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCBpZiBhIGNoYXJhY3RlciBpcyB2YWxpZCBpbiB4bWwgY2hhcmFjdGVyIGNvbnRlbnQuIFNlZQorICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUNoYXIKKyAgICAgICAgICovCisgICAgICAgIAorICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYWRDaGFyICggY2hhciBjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAhICgKKyAgICAgICAgICAgICAgICAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweEQ3RkYgKSB8fAorICAgICAgICAgICAgICAgIChjaCA+PSAweEUwMDAgJiYgY2ggPD0gMHhGRkZEKSB8fAorICAgICAgICAgICAgICAgIChjaCA+PSAweDEwMDAwICYmIGNoIDw9IDB4MTBGRkZGKSB8fAorICAgICAgICAgICAgICAgIChjaCA9PSAweDkpIHx8IChjaCA9PSAweEEpIHx8IChjaCA9PSAweEQpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHJlcGxhY2UgKCBpbnQgaSwgU3RyaW5nIHJlcGxhY2VtZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHJlcGxhY2VtZW50Lmxlbmd0aCgpID4gMDsKKworICAgICAgICAgICAgaW50IGRDY2ggPSByZXBsYWNlbWVudC5sZW5ndGgoKSAtIDE7CisKKyAgICAgICAgICAgIGlmIChkQ2NoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2J1ZlsgaSBdID0gcmVwbGFjZW1lbnQuY2hhckF0KCAwICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKKworICAgICAgICAgICAgaWYgKGRDY2ggPiBfZnJlZSkKKyAgICAgICAgICAgICAgICBpID0gcmVzaXplKCBkQ2NoLCBpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOworCisgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gZENjaDsKKyAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA+IDA7CisKKyAgICAgICAgICAgIGlmIChfb3V0ID4gX2luICYmIGkgPj0gX291dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBfYnVmLCBfb3V0IC0gZENjaCwgaSAtIF9vdXQgKTsKKyAgICAgICAgICAgICAgICBfb3V0IC09IGRDY2g7CisgICAgICAgICAgICAgICAgaSAtPSBkQ2NoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgX2luOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIGksIF9idWYsIGkgKyBkQ2NoLCBfaW4gLSBpICk7CisgICAgICAgICAgICAgICAgX2luICs9IGRDY2g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcGxhY2VtZW50LmdldENoYXJzKCAwLCBkQ2NoICsgMSwgX2J1ZiwgaSApOworCisgICAgICAgICAgICBfZnJlZSAtPSBkQ2NoOworICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPj0gMDsKKworICAgICAgICAgICAgcmV0dXJuIGkgKyBkQ2NoICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRBdmFpbGFibGUgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGggLSBfZnJlZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIGNjaCBjaGFycyBpbiB0aGUgYnVmZmVyCisgICAgICAgICAqLworCisgICAgICAgIHByaXZhdGUgaW50IHJlc2l6ZSAoIGludCBjY2gsIGludCBpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisgICAgICAgICAgICBhc3NlcnQgY2NoID4gMDsKKyAgICAgICAgICAgIGFzc2VydCBjY2ggPiBfZnJlZTsKKworICAgICAgICAgICAgaW50IG5ld0xlbiA9IF9idWYgPT0gbnVsbCA/IF9pbml0aWFsQnVmU2l6ZSA6IF9idWYubGVuZ3RoICogMjsKKyAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIHdoaWxlICggbmV3TGVuIC0gdXNlZCA8IGNjaCApCisgICAgICAgICAgICAgICAgbmV3TGVuICo9IDI7CisKKyAgICAgICAgICAgIGNoYXJbXSBuZXdCdWYgPSBuZXcgY2hhciBbIG5ld0xlbiBdOworCisgICAgICAgICAgICBpZiAodXNlZCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9pbiA+IF9vdXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMSB8fCAoaSA+PSBfb3V0ICYmIGkgPCBfaW4pOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgaSAtPSBfb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMSB8fCAoaSA+PSBfb3V0IHx8IGkgPCBfaW4pOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBuZXdCdWYsIDAsIHVzZWQgLSBfaW4gKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgbmV3QnVmLCB1c2VkIC0gX2luLCBfaW4gKTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkgPj0gX291dCA/IGkgLSBfb3V0IDogaSArIF9vdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9vdXQgPSAwOworICAgICAgICAgICAgICAgIF9pbiA9IHVzZWQ7CisgICAgICAgICAgICAgICAgX2ZyZWUgKz0gbmV3QnVmLmxlbmd0aCAtIF9idWYubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGg7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9pbiA9PSAwICYmIF9vdXQgPT0gMDsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaSA9PSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKKworICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID49IDA7CisKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkICggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW5zdXJlKCAxICkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA+IDA7CisKKyAgICAgICAgICAgIGludCBjaCA9IF9idWZbIF9vdXQgXTsKKworICAgICAgICAgICAgX291dCA9IChfb3V0ICsgMSkgJSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgIF9mcmVlKys7CisKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzdHJlYW0gZXZlbiBpZiB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuCisgICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhlIFJlYWRlciBkb2Mgc2F5cyB0byByZXR1cm4gLTEgYXQgZW5kIG9mCisgICAgICAgICAgICAvLyBzdHJlYW0uCisKKyAgICAgICAgICAgIGludCBuOworCisgICAgICAgICAgICBpZiAoKG4gPSBlbnN1cmUoIGxlbiApKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgaWYgKGNidWYgPT0gbnVsbCB8fCBsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaWYgKG4gPCBsZW4pCisgICAgICAgICAgICAgICAgbGVuID0gbjsKKworICAgICAgICAgICAgaWYgKF9vdXQgPCBfaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgY2J1Ziwgb2ZmLCBsZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2h1bmsgPSBfYnVmLmxlbmd0aCAtIF9vdXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmsgPj0gbGVuKQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBjYnVmLCBvZmYsIGxlbiApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGNidWYsIG9mZiwgY2h1bmsgKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgMCwgY2J1Ziwgb2ZmICsgY2h1bmssIGxlbiAtIGNodW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyBsZW4pICUgX2J1Zi5sZW5ndGg7CisgICAgICAgICAgICBfZnJlZSArPSBsZW47CisKKyAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOworCisgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCB3cml0ZSAoIFdyaXRlciB3cml0ZXIsIGludCBjY2hNaW4gKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIGdldEF2YWlsYWJsZSgpIDwgY2NoTWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghcHJvY2VzcygpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNoYXJzQXZhaWxhYmxlID0gZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIGlmIChjaGFyc0F2YWlsYWJsZSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCB0aGUgY2lyY3VsYXIgY2FzZXMKKworICAgICAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IDA7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSggX2J1ZiwgMCwgY2hhcnNBdmFpbGFibGUgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9mcmVlICs9IGNoYXJzQXZhaWxhYmxlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFzc2VydCBfZnJlZSA+PSAwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIF9pbiA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjaGFyc0F2YWlsYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFbnN1cmUgYWxsIHRleHQgYW5kIHJldHVybiBpdCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIFN0cmluZyBzYXZlVG9TdHJpbmcgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGdvbm5hIGJ1aWxkIGEgc3RyaW5nLiAgSW5zdGVhZCBvZiB1c2luZyBTdHJpbmdCdWZmZXIsIG1heQorICAgICAgICAgICAgLy8gYXMgd2VsbCB1c2UgbXkgYnVmZmVyIGhlcmUuICBGaWxsIHRoZSB3aG9sZSBzdWNrZXIgdXAgYW5kCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmchCisKKyAgICAgICAgICAgIHdoaWxlICggcHJvY2VzcygpICkKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIGFzc2VydCBfb3V0ID09IDA7CisKKyAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBnZXRBdmFpbGFibGUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZSA9PSAwID8gIiIgOiBuZXcgU3RyaW5nKCBfYnVmLCBfb3V0LCBhdmFpbGFibGUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfaW5pdGlhbEJ1ZlNpemUgPSA0MDk2OworCisgICAgICAgIHByaXZhdGUgaW50IF9sYXN0RW1pdEluOworICAgICAgICBwcml2YXRlIGludCBfbGFzdEVtaXRDY2g7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgX2ZyZWU7CisgICAgICAgIHByaXZhdGUgaW50ICAgIF9pbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgX291dDsKKyAgICAgICAgcHJpdmF0ZSBjaGFyW10gX2J1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFJlYWRlciB3aGljaCBleHBvc2VzIHRoZSB0ZXh0IG9mIGEgcGFydCBvZiB0aGUgdHJlZS4KKyAgICAgKi8KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0UmVhZGVyIGV4dGVuZHMgUmVhZGVyCisgICAgeworICAgICAgICBUZXh0UmVhZGVyICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgX3RleHRTYXZlciA9IG5ldyBUZXh0U2F2ZXIoIHIsIHMsIHAsIG9wdGlvbnMsIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlICggKSB0aHJvd3MgSU9FeGNlcHRpb24geyB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVhZHkgKCApIHRocm93cyBJT0V4Y2VwdGlvbiB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkICggKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90ZXh0U2F2ZXIucmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCByZWFkICggY2hhcltdIGNidWYgKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90ZXh0U2F2ZXIucmVhZCggY2J1ZiwgMCwgY2J1ZiA9PSBudWxsID8gMCA6IGNidWYubGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHJlYWQgKCBjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbiApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3RleHRTYXZlci5yZWFkKCBjYnVmLCBvZmYsIGxlbiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUZXh0U2F2ZXIgX3RleHRTYXZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqLworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIElucHV0U3RyZWFtU2F2ZXIgZXh0ZW5kcyBJbnB1dFN0cmVhbQorICAgIHsKKyAgICAgICAgSW5wdXRTdHJlYW1TYXZlciAoCisgICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBvcHRpb25zID0gWG1sT3B0aW9ucy5tYXNrTnVsbChvcHRpb25zKTsKKyAgICAgICAgICAgIF9ieXRlQnVmZmVyID0gbmV3IE91dHB1dFN0cmVhbUltcGwoKTsKKworICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHIuX3Byb3BzLmdldEVuY29kaW5nKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoIHIuX3Byb3BzLmdldEVuY29kaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG9wdGlvbnMuZ2V0KFhtbE9wdGlvbnMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlhbmFFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoIGVuY29kaW5nICk7CisKKyAgICAgICAgICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gaWFuYUVuY29kaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldEphdmEySUFOQU1hcHBpbmcoICJVVEY4IiApOworCisgICAgICAgICAgICBTdHJpbmcgamF2YUVuY29kaW5nID0gRW5jb2RpbmdNYXAuZ2V0SUFOQTJKYXZhTWFwcGluZyggZW5jb2RpbmcgKTsKKworICAgICAgICAgICAgaWYgKGphdmFFbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb252ZXJ0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBfYnl0ZUJ1ZmZlciwgamF2YUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfdGV4dFNhdmVyID0gbmV3IFRleHRTYXZlciggciwgcywgcCwgb3B0aW9ucywgZW5jb2RpbmcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlQnVmZmVyLnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCAoIGJ5dGVbXSBiYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlQnVmZmVyLnJlYWQgKCBiYnVmLCBvZmYsIGxlbiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZW5zdXJlICggaW50IGNieXRlICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXZlbiBpZiB3ZSdyZSBhc2tlZCB0byBlbnN1cmUgbm90aGluZywgc3RpbGwgdHJ5IHRvIGVuc3VyZQorICAgICAgICAgICAgLy8gYXRsZWFzdCBvbmUgYnl0ZSBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGF0IHRoZQorICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBzdHJlYW0uCisKKyAgICAgICAgICAgIGlmIChjYnl0ZSA8PSAwKQorICAgICAgICAgICAgICAgIGNieXRlID0gMTsKKworICAgICAgICAgICAgaW50IGJ5dGVzQXZhaWxhYmxlID0gX2J5dGVCdWZmZXIuZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIGZvciAoIDsgYnl0ZXNBdmFpbGFibGUgPCBjYnl0ZSA7CisgICAgICAgICAgICAgICAgICBieXRlc0F2YWlsYWJsZSA9IF9ieXRlQnVmZmVyLmdldEF2YWlsYWJsZSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3RleHRTYXZlci53cml0ZSggX2NvbnZlcnRlciwgMjA0OCApIDwgMjA0OCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVzQXZhaWxhYmxlID0gX2J5dGVCdWZmZXIuZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgIGlmIChieXRlc0F2YWlsYWJsZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICByZXR1cm4gYnl0ZXNBdmFpbGFibGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE91dHB1dFN0cmVhbUltcGwgZXh0ZW5kcyBPdXRwdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJlYWQgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtU2F2ZXIudGhpcy5lbnN1cmUoIDEgKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgZ2V0QXZhaWxhYmxlKCkgPiAwOworCisgICAgICAgICAgICAgICAgaW50IGJpdGUgPSBfYnVmWyBfb3V0IF07CisKKyAgICAgICAgICAgICAgICBfb3V0ID0gKF9vdXQgKyAxKSAlIF9idWYubGVuZ3RoOworICAgICAgICAgICAgICAgIF9mcmVlKys7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJlYWQgKCBieXRlW10gYmJ1ZiwgaW50IG9mZiwgaW50IGxlbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzdHJlYW0gZXZlbiBpZiB0aGVyZSBpcyBubyB3YXkgdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyBiZWNhdXNlIHRoZSBSZWFkZXIgZG9jIHNheXMgdG8gcmV0dXJuIC0xIGF0IGVuZCBvZgorICAgICAgICAgICAgICAgIC8vIHN0cmVhbS4KKworICAgICAgICAgICAgICAgIGludCBuOworCisgICAgICAgICAgICAgICAgaWYgKChuID0gZW5zdXJlKCBsZW4gKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgaWYgKGJidWYgPT0gbnVsbCB8fCBsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICBpZiAobiA8IGxlbikKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gbjsKKworICAgICAgICAgICAgICAgIGlmIChfb3V0IDwgX2luKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX291dCwgYmJ1Ziwgb2ZmLCBsZW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rID0gX2J1Zi5sZW5ndGggLSBfb3V0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuayA+PSBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCBfb3V0LCBiYnVmLCBvZmYsIGxlbiApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIGJidWYsIG9mZiwgY2h1bmsgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYnVmLCAwLCBiYnVmLCBvZmYgKyBjaHVuaywgbGVuIC0gY2h1bmsgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9vdXQgPSAoX291dCArIGxlbikgJSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBfZnJlZSArPSBsZW47CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZ2V0QXZhaWxhYmxlICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGggLSBfZnJlZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUgKCBpbnQgYml0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9mcmVlID09IDApCisgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSggMSApOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IF9mcmVlID4gMDsKKworICAgICAgICAgICAgICAgIF9idWZbIF9pbiBdID0gKGJ5dGUpIGJpdGU7CisKKyAgICAgICAgICAgICAgICBfaW4gPSAoX2luICsgMSkgJSBfYnVmLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBfZnJlZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBjYnl0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNieXRlID49IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoY2J5dGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgaWYgKF9mcmVlIDwgY2J5dGUpCisgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSggY2J5dGUgKTsKKworICAgICAgICAgICAgICAgIGlmIChfaW4gPT0gX291dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBnZXRBdmFpbGFibGUoKSA9PSAwOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgX2ZyZWUgPT0gX2J1Zi5sZW5ndGggLSBnZXRBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgX2luID0gX291dCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGNodW5rOworCisgICAgICAgICAgICAgICAgaWYgKF9pbiA8PSBfb3V0IHx8IGNieXRlIDwgKGNodW5rID0gX2J1Zi5sZW5ndGggLSBfaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggYnVmLCBvZmYsIF9idWYsIF9pbiwgY2J5dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgX2luICs9IGNieXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBidWYsIG9mZiwgX2J1ZiwgX2luLCBjaHVuayApOworCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBidWYsIG9mZiArIGNodW5rLCBfYnVmLCAwLCBjYnl0ZSAtIGNodW5rICk7CisKKyAgICAgICAgICAgICAgICAgICAgX2luID0gKF9pbiArIGNieXRlKSAlIF9idWYubGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9mcmVlIC09IGNieXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHJlc2l6ZSAoIGludCBjYnl0ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNieXRlID4gX2ZyZWU7CisKKyAgICAgICAgICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gX2luaXRpYWxCdWZTaXplIDogX2J1Zi5sZW5ndGggKiAyOworICAgICAgICAgICAgICAgIGludCB1c2VkID0gZ2V0QXZhaWxhYmxlKCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG5ld0xlbiAtIHVzZWQgPCBjYnl0ZSApCisgICAgICAgICAgICAgICAgICAgIG5ld0xlbiAqPSAyOworCisgICAgICAgICAgICAgICAgYnl0ZVtdIG5ld0J1ZiA9IG5ldyBieXRlIFsgbmV3TGVuIF07CisKKyAgICAgICAgICAgICAgICBpZiAodXNlZCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX291dCA9PSBfaW4pCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBfYnVmLCAwLCBuZXdCdWYsIDAsIHVzZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2luID4gX291dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIF9vdXQsIG5ld0J1ZiwgMCwgdXNlZCApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZiwgX291dCwgbmV3QnVmLCAwLCB1c2VkIC0gX2luICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2J1ZiwgMCwgbmV3QnVmLCB1c2VkIC0gX2luLCBfaW4gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIF9vdXQgPSAwOworICAgICAgICAgICAgICAgICAgICBfaW4gPSB1c2VkOworICAgICAgICAgICAgICAgICAgICBfZnJlZSArPSBuZXdCdWYubGVuZ3RoIC0gX2J1Zi5sZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9mcmVlICs9IG5ld0J1Zi5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBfaW4gPT0gMCAmJiBfb3V0ID09IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9pbml0aWFsQnVmU2l6ZSA9IDQwOTY7CisKKyAgICAgICAgICAgIGludCAgICBfZnJlZTsKKyAgICAgICAgICAgIGludCAgICBfaW47CisgICAgICAgICAgICBpbnQgICAgX291dDsKKyAgICAgICAgICAgIGJ5dGVbXSBfYnVmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW1JbXBsICAgX2J5dGVCdWZmZXI7CisgICAgICAgIHByaXZhdGUgVGV4dFNhdmVyICAgICAgICAgIF90ZXh0U2F2ZXI7CisgICAgICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtV3JpdGVyIF9jb252ZXJ0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKi8KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWxJbnB1dFN0cmVhbVNhdmVyIGV4dGVuZHMgU2F2ZXIKKyAgICB7CisgICAgICAgIFhtbElucHV0U3RyZWFtU2F2ZXIgKCBSb290IHIsIFNwbGF5IHMsIGludCBwLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOworICAgICAgICB9CisKKyAgICAgICAgWE1MRXZlbnQgZGVxdWV1ZSAoICkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX291dCA9PSBudWxsICYmICFwcm9jZXNzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChfb3V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFhtbEV2ZW50SW1wbCBlID0gX291dDsKKworICAgICAgICAgICAgaWYgKChfb3V0ID0gX291dC5fbmV4dCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfaW4gPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBlbnF1ZXVlICggWG1sRXZlbnRJbXBsIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZS5fbmV4dCA9PSBudWxsOworCisgICAgICAgICAgICBpZiAoX2luID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IF9vdXQgPT0gbnVsbDsKKyAgICAgICAgICAgICAgICBfb3V0ID0gX2luID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW4uX25leHQgPSBlOworICAgICAgICAgICAgICAgIF9pbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLworICAgICAgICAvLworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oICJDYW4ndCBzdHJlYW0gYW4gYXR0cmlidXRlIiApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICAgICAgZW5xdWV1ZSggbmV3IENoYXJhY3RlckRhdGFJbXBsKCBnZXRSb290KCksIHMsIHAsIG51bGwgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQlVHQlVHIC0gdGhlcmUgY291bGQgYmUgbmFtZXNwYWNlcyBwdXNoZWQgZm9yIHRoaXMgdGV4dCwgbm90CisgICAgICAgICAgICAvLyBzdXJlIGhvdyB0byBjb21tdW5pY2F0ZSB0aG9zZSwgaG93ZXZlcgorCisgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3RleHQubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICBlbWl0VGV4dCggcywgcCwgY2NoICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIGNjaCA+IDApCisgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRBZnRlciAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgZW1pdFRleHQoIHMsIHAsIGNjaCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggZ2V0Um9vdCgpLCBzLCAtMSwgdGV4dCgpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmRQcmVmaXhNYXBwaW5ncyAoICkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmV2UHJlZml4VXJpID0gbWFwcGluZ1ByZXZQcmVmaXhVcmkoKTsKKworICAgICAgICAgICAgICAgIGlmIChwcmV2UHJlZml4VXJpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBFbmRQcmVmaXhNYXBwaW5nSW1wbCggciwgbWFwcGluZ1ByZWZpeCgpICkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYW5nZVByZWZpeE1hcHBpbmdJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpLCBwcmV2UHJlZml4VXJpICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKworICAgICAgICAgICAgaWYgKHMuaXNSb290KCkpCisgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZERvY3VtZW50SW1wbCggciwgcyApICk7CisgICAgICAgICAgICBlbHNlIGlmIChzLmlzRW5kKCkpCisgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZEVsZW1lbnRJbXBsKCByLCBzLCBuYW1lLCBnZXRVcmlNYXAoKSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCk7CisgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IEVuZEVsZW1lbnRJbXBsKCByLCBzLCBuYW1lLCBnZXRVcmlNYXAoKSApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtaXRFbmRQcmVmaXhNYXBwaW5ncygpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29tbWVudCggcyApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdFByb2NpbnN0KCBzICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVucXVldWUoIG5ldyBDb21tZW50SW1wbCggZ2V0Um9vdCgpLCBzICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCggZ2V0Um9vdCgpLCBzICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkNhbid0IHN0cmVhbSBhbiBhdHRyaWJ1dGUiICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29udGFpbmVyICggQ29udGFpbmVyIGMsIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisKKyAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5xdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICByLCBtYXBwaW5nUHJlZml4KCksIG1hcHBpbmdVcmkoKSApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCisgICAgICAgICAgICAgICAgZW5xdWV1ZSggbmV3IFN0YXJ0RG9jdW1lbnRJbXBsKCByLCBjICkgKTsKKworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbnF1ZXVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhcnRFbGVtZW50SW1wbCggciwgYywgbmFtZSwgdGhpcyApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKKworICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgLTEsIHRleHQoKSApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIDEsIG51bGwgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYy5pc0xlYWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgQ2hhcmFjdGVyRGF0YUltcGwoIHIsIGMsIC0xLCB0ZXh0KCkgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoVmFsdWUoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGVucXVldWUoIG5ldyBDaGFyYWN0ZXJEYXRhSW1wbCggciwgYywgMSwgbnVsbCApICk7CisKKyAgICAgICAgICAgICAgICBlbnF1ZXVlKCBuZXcgRW5kRWxlbWVudEltcGwoIHIsIGMsIG5hbWUsIGdldFVyaU1hcCgpICkgKTsKKworICAgICAgICAgICAgICAgIGVtaXRFbmRQcmVmaXhNYXBwaW5ncygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLworICAgICAgICAvLworICAgICAgICAvLworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFhNTE5hbWUgY29tcHV0ZU5hbWUgKCBRTmFtZSBuLCBNYXAgdXJpTWFwICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7CisKKyAgICAgICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICB1cmkgPSBudWxsOworCisgICAgICAgICAgICBhc3NlcnQgbi5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDA7CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0IG1heSBmaXJlIGlmIHNvbWVvbmUgY29tcHV0ZXMgYSBuYW1lCisgICAgICAgICAgICAvLyBvZiBhbiBlbGVtZW50L2F0dHIgdG9vIGxhdGUgKGFmdGVyIG90aGVyIGV2ZW50cyBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIGVucXVldWVkIGFuZCB0aGUgdXJpIG1hcCBoYXMgYmVlbiB1cGRhdGVkLiAgSSBjaGVjayBsYXRlcgorICAgICAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNyYXNoLCBob3dldmVyLgorCisgICAgICAgICAgICBhc3NlcnQgdXJpID09IG51bGwgfHwgdXJpTWFwLmNvbnRhaW5zS2V5KCB1cmkgKSA6ICJQcm9ibGVtIHVyaSAiICsgdXJpOworCisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZWZpeCA9IChTdHJpbmcpIHVyaU1hcC5nZXQoIHVyaSApOworCisgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbE5hbWVJbXBsKCB1cmksIG4uZ2V0TG9jYWxQYXJ0KCksIHByZWZpeCApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgWG1sRXZlbnRJbXBsIGV4dGVuZHMgWG1sRXZlbnRCYXNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbW9uaXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBYbWxFdmVudEltcGwgKCBpbnQgdHlwZSwgUm9vdCByLCBTcGxheSBzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdXBlciggdHlwZSApOworICAgICAgICAgICAgICAgIF9yb290ID0gcjsKKyAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOworICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gX3Jvb3QuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0U2NoZW1hVHlwZSAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIk5ZSSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGZpbmFsIExvY2F0aW9uIGdldExvY2F0aW9uICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBwZXJoYXBzIEkgY2FuIHNhdmUgYSBsb2NhdGlvbiBnb29iZXIgc29tZXRpbWVzPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNoZWNrVmVyc2lvbiAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBmaW5hbCBSb290IGdldFJvb3QgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yb290OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3BsYXkgZ2V0U3BsYXkgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zcGxheTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBSb290ICBfcm9vdDsKKyAgICAgICAgICAgIHByaXZhdGUgU3BsYXkgX3NwbGF5OworICAgICAgICAgICAgcHJpdmF0ZSBsb25nICBfdmVyc2lvbjsKKworICAgICAgICAgICAgWG1sRXZlbnRJbXBsIF9uZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhcnREb2N1bWVudEltcGwKKyAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgU3RhcnREb2N1bWVudAorICAgICAgICB7CisgICAgICAgICAgICBTdGFydERvY3VtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5ULCByLCBzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fcHJvcHMuZ2V0RG9jdHlwZVN5c3RlbUlkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb290KCkuX3Byb3BzLmdldEVuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5fc3RhbmRBbG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbiAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpLl9wcm9wcy5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhcnRFbGVtZW50SW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBTdGFydEVsZW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgU3RhcnRFbGVtZW50SW1wbCAoIFJvb3QgciwgU3BsYXkgcywgUU5hbWUgbmFtZSwgU2F2ZXIgc2F2ZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5TVEFSVF9FTEVNRU5ULCByLCBzICk7CisKKyAgICAgICAgICAgICAgICBfbmFtZSA9IGNvbXB1dGVOYW1lKCBuYW1lLCBzYXZlci5nZXRVcmlNYXAoKSApOworCisgICAgICAgICAgICAgICAgX3ByZWZpeE1hcCA9IHNhdmVyLmdldFByZWZpeE1hcCgpOworCisgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBsYXN0QXR0ciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpID0gc2F2ZXIuX2F0dHJzLmtleVNldCgpLml0ZXJhdG9yKCkgOworICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpIDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgYSA9IChTcGxheSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGF0dHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vcm1hbEF0dHJpYnV0ZUltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgYSwgKFN0cmluZykgc2F2ZXIuX2F0dHJzLmdldCggYSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVyLmdldFVyaU1hcCgpICk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIuX25leHQgPSBhdHRyOworCisgICAgICAgICAgICAgICAgICAgIGxhc3RBdHRyID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsYXN0QXR0ciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBzYXZlci5pdGVyYXRlTWFwcGluZ3MoKSA7CisgICAgICAgICAgICAgICAgICAgICAgc2F2ZXIuaGFzTWFwcGluZygpIDsgc2F2ZXIubmV4dE1hcHBpbmcoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVJbXBsIGF0dHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbG5zQXR0cmlidXRlSW1wbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBzYXZlci5tYXBwaW5nUHJlZml4KCksIHNhdmVyLm1hcHBpbmdVcmkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlci5nZXRVcmlNYXAoKSApOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZXNwYWNlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBhdHRyOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ci5fbmV4dCA9IGF0dHI7CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHIgPSBhdHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVJdGVyYXRvciBnZXRBdHRyaWJ1dGVzICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZUl0ZXJhdG9ySW1wbCggZ2V0Um9vdCgpLCBfYXR0cmlidXRlcywgbnVsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEF0dHJpYnV0ZUl0ZXJhdG9yIGdldE5hbWVzcGFjZXMgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSXRlcmF0b3JJbXBsKCBnZXRSb290KCksIG51bGwsIF9uYW1lc3BhY2VzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlSXRlcmF0b3IgZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlSXRlcmF0b3JJbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKSwgX2F0dHJpYnV0ZXMsIF9uYW1lc3BhY2VzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQXR0cmlidXRlIGdldEF0dHJpYnV0ZUJ5TmFtZSAoIFhNTE5hbWUgeG1sTmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yICggQXR0cmlidXRlSW1wbCBhID0gX2F0dHJpYnV0ZXMgOyBhICE9IG51bGwgOyBhID0gYS5fbmV4dCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxOYW1lLmVxdWFscyggYS5nZXROYW1lKCkgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVXJpICggU3RyaW5nIHByZWZpeCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBfcHJlZml4TWFwLmdldCggcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE1hcCBnZXROYW1lc3BhY2VNYXAgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXhNYXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVJdGVyYXRvckltcGwKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEF0dHJpYnV0ZUl0ZXJhdG9yCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQXR0cmlidXRlSXRlcmF0b3JJbXBsICgKKyAgICAgICAgICAgICAgICAgICAgUm9vdCByLCBBdHRyaWJ1dGVJbXBsIGF0dHJpYnV0ZXMsIEF0dHJpYnV0ZUltcGwgbmFtZXNwYWNlcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcm9vdCA9IHI7CisgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgbmV4dCAoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwgYXR0ciA9IG51bGw7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2F0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gX2F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBhdHRyLl9uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX25hbWVzcGFjZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyID0gX25hbWVzcGFjZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBhdHRyLl9uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0ICggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVzICE9IG51bGwgfHwgX25hbWVzcGFjZXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBBdHRyaWJ1dGUgcGVlayAoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9uYW1lc3BhY2VzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lc3BhY2VzOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBza2lwICggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9hdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMgPSBfYXR0cmlidXRlcy5fbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9uYW1lc3BhY2VzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZXMgPSBfbmFtZXNwYWNlcy5fbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBSb290ICAgICAgICAgIF9yb290OworICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgICAgICAgICBfdmVyc2lvbjsKKyAgICAgICAgICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZUltcGwgX2F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVJbXBsIF9uYW1lc3BhY2VzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgQXR0cmlidXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBtb25pdG9yKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcm9vdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCAoIFJvb3QgciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfcm9vdCA9IHI7CisgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uID0gci5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIFhNTE5hbWUgZ2V0TmFtZSAoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSAoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAvLyBUT0RPIC0gTWFrZSBzdXJlIHRocm93aW5nIGF3YXkgdGhpcyBEVEQgaW5mbyBpcyBvay4KKyAgICAvLyBJcyB0aGVyZSBzY2hlbWEgaW5mbyB3aGljaCBjYW4gcmV0dXJuIG1vcmUgdXNlZnVsIGluZm8/CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNEQVRBIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBYTUxOYW1lIGdldFNjaGVtYVR5cGUgKCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgLy8gVE9ETyAtIENhbiBJIHJldHVybiBzb21ldGhpbmcgcmVhc29uYWJsZSBoZXJlPworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1ZlcnNpb24gKCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX3ZlcnNpb24gIT0gX3Jvb3QuZ2V0VmVyc2lvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiggIkRvY3VtZW50IGNoYW5nZWQiICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCBfbmV4dDsKKworICAgICAgICAgICAgICAgIHByb3RlY3RlZCBYTUxOYW1lIF9uYW1lOworCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJvb3QgIF9yb290OworICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyAgX3ZlcnNpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhtbG5zQXR0cmlidXRlSW1wbCBleHRlbmRzIEF0dHJpYnV0ZUltcGwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxuc0F0dHJpYnV0ZUltcGwgKAorICAgICAgICAgICAgICAgICAgICBSb290IHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIE1hcCB1cmlNYXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIoIHIgKTsKKworICAgICAgICAgICAgICAgICAgICBfdXJpID0gdXJpOworCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9ICJ4bWxucyI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IHByZWZpeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJ4bWxucyI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBfbmFtZSA9IG5ldyBYbWxOYW1lSW1wbCggbnVsbCwgbG9jYWwsIHByZWZpeCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUgKCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VyaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF91cmk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vcm1hbEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBBdHRyaWJ1dGVJbXBsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTm9ybWFsQXR0cmlidXRlSW1wbCAoCisgICAgICAgICAgICAgICAgICAgIFJvb3QgciwgU3BsYXkgcywgU3RyaW5nIHZhbHVlLCBNYXAgdXJpTWFwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKCByICk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOworICAgICAgICAgICAgICAgICAgICBfc3BsYXkgPSBzOworICAgICAgICAgICAgICAgICAgICBfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgX25hbWUgPSBjb21wdXRlTmFtZSggcy5nZXROYW1lKCksIHVyaU1hcCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUgKCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlICE9IG51bGwgPyBfdmFsdWUgOiBfc3BsYXkuZ2V0VGV4dCggX3Jvb3QgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF92YWx1ZTsgLy8gSWYgaW52YWxpZCBpbiB0aGUgc3RvcmUKKyAgICAgICAgICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBYTUxOYW1lIF9uYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBNYXAgICAgIF9wcmVmaXhNYXA7CisKKyAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfYXR0cmlidXRlczsKKyAgICAgICAgICAgIHByaXZhdGUgQXR0cmlidXRlSW1wbCBfbmFtZXNwYWNlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwKKyAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgU3RhcnRQcmVmaXhNYXBwaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YXJ0UHJlZml4TWFwcGluZ0ltcGwgKCBSb290IHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5TVEFSVF9QUkVGSVhfTUFQUElORywgciwgbnVsbCApOworCisgICAgICAgICAgICAgICAgX3ByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgICAgICAgICBfdXJpID0gdXJpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVyaSAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VyaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcHJlZml4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeCwgX3VyaTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYW5nZVByZWZpeE1hcHBpbmdJbXBsCisgICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIENoYW5nZVByZWZpeE1hcHBpbmcKKyAgICAgICAgeworICAgICAgICAgICAgQ2hhbmdlUHJlZml4TWFwcGluZ0ltcGwgKAorICAgICAgICAgICAgICAgIFJvb3QgciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG9sZFVyaSwgU3RyaW5nIG5ld1VyaSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkNIQU5HRV9QUkVGSVhfTUFQUElORywgciwgbnVsbCApOworCisgICAgICAgICAgICAgICAgX29sZFVyaSA9IG9sZFVyaTsKKyAgICAgICAgICAgICAgICBfbmV3VXJpID0gbmV3VXJpOworICAgICAgICAgICAgICAgIF9wcmVmaXggPSBwcmVmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkTmFtZXNwYWNlVXJpICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2xkVXJpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROZXdOYW1lc3BhY2VVcmkgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdVcmk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3ByZWZpeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIF9vbGRVcmksIF9uZXdVcmksIF9wcmVmaXg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmRQcmVmaXhNYXBwaW5nSW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmRQcmVmaXhNYXBwaW5nCisgICAgICAgIHsKKyAgICAgICAgICAgIEVuZFByZWZpeE1hcHBpbmdJbXBsICggUm9vdCByLCBTdHJpbmcgcHJlZml4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuRU5EX1BSRUZJWF9NQVBQSU5HLCByLCBudWxsICk7CisgICAgICAgICAgICAgICAgX3ByZWZpeCA9IHByZWZpeDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXggKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wcmVmaXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJlZml4OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwKKyAgICAgICAgICAgIGV4dGVuZHMgWG1sRXZlbnRJbXBsIGltcGxlbWVudHMgQ2hhcmFjdGVyRGF0YQorICAgICAgICB7CisgICAgICAgICAgICBDaGFyYWN0ZXJEYXRhSW1wbCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIFN0cmluZyBjaGFyRGF0YSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LkNIQVJBQ1RFUl9EQVRBLCByLCBzICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDAgfHwgKGNoYXJEYXRhICE9IG51bGwgJiYgY2hhckRhdGEubGVuZ3RoKCkgPiAwKTsKKworICAgICAgICAgICAgICAgIF9wb3MgPSBwOworICAgICAgICAgICAgICAgIF9jaGFyRGF0YSA9IGNoYXJEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChfcG9zID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFyRGF0YTsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgX3BvcyApLCBzLmdldFBvc3RDY2goIF9wb3MgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50ICAgIF9wb3M7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBfY2hhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmRFbGVtZW50SW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmRFbGVtZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIEVuZEVsZW1lbnRJbXBsICggUm9vdCByLCBTcGxheSBzLCBRTmFtZSBuYW1lLCBNYXAgdXJpTWFwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdXBlciggWE1MRXZlbnQuRU5EX0VMRU1FTlQsIHIsIHMgKTsKKworICAgICAgICAgICAgICAgIGFzc2VydCBzLmlzTGVhZigpIHx8IHMuaXNFbmQoKTsKKworICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0VuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBuYW1lID0gcy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX25hbWUgPSBjb21wdXRlTmFtZSggbmFtZSwgdXJpTWFwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWE1MTmFtZSBnZXROYW1lICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgWE1MTmFtZSBfbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVuZERvY3VtZW50SW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBFbmREb2N1bWVudAorICAgICAgICB7CisgICAgICAgICAgICBFbmREb2N1bWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5FTkRfRE9DVU1FTlQsIHIsIHMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1lbnRJbXBsCisgICAgICAgICAgICBleHRlbmRzIFhtbEV2ZW50SW1wbCBpbXBsZW1lbnRzIENvbW1lbnQKKyAgICAgICAgeworICAgICAgICAgICAgQ29tbWVudEltcGwgKCBSb290IHIsIFNwbGF5IHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKCBYTUxFdmVudC5DT01NRU5ULCByLCBzICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb21tZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudCAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgIAorICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Q2NoKCkgPT0gMCA/IG51bGwgOiBzLmdldFRleHQoIGdldFJvb3QoKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCAoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1vbml0b3IoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5nZXRDY2goKSA+IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbAorICAgICAgICAgICAgZXh0ZW5kcyBYbWxFdmVudEltcGwgaW1wbGVtZW50cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKyAgICAgICAgeworICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCAoIFJvb3QgciwgU3BsYXkgcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3VwZXIoIFhNTEV2ZW50LlBST0NFU1NJTkdfSU5TVFJVQ1RJT04sIHIsIHMgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5pc1Byb2NpbnN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0ICggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTcGxheSgpLmdldExvY2FsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEgKCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtb25pdG9yKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGVja1ZlcnNpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldENjaCgpID09IDAgPyBudWxsIDogcy5nZXRUZXh0KCBnZXRSb290KCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhtbEV2ZW50SW1wbCBfaW4sIF9vdXQ7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFhtbElucHV0U3RyZWFtSW1wbCBleHRlbmRzIEdlbmVyaWNYbWxJbnB1dFN0cmVhbQorICAgIHsKKyAgICAgICAgWG1sSW5wdXRTdHJlYW1JbXBsICggUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zICkKKyAgICAgICAgeworICAgICAgICAgICAgX3htbElucHV0U3RyZWFtU2F2ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBYbWxJbnB1dFN0cmVhbVNhdmVyKCByLCBzLCBwLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHNhdmVyIGdyaW5kIGF3YXkganVzdCBhIGJpdCB0byB0aHJvdyBhbnkgZXhjZXB0aW9ucworICAgICAgICAgICAgLy8gcmVsYXRlZCB0byB0aGUgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIHN0cmVhbSBvbiB0aGlzIHhtbAorICAgICAgICAgICAgCisgICAgICAgICAgICBfeG1sSW5wdXRTdHJlYW1TYXZlci5wcm9jZXNzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgWE1MRXZlbnQgbmV4dEV2ZW50ICggKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfeG1sSW5wdXRTdHJlYW1TYXZlci5kZXF1ZXVlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhtbElucHV0U3RyZWFtU2F2ZXIgX3htbElucHV0U3RyZWFtU2F2ZXI7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vCisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVmFsaWRhdG9yU2F2ZXIKKyAgICAgICAgZXh0ZW5kcyBTYXZlciBpbXBsZW1lbnRzIFZhbGlkYXRvckxpc3RlbmVyLkV2ZW50CisgICAgeworICAgICAgICBWYWxpZGF0b3JTYXZlciAoCisgICAgICAgICAgICBSb290IHIsIFNwbGF5IHMsIGludCBwLAorICAgICAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zLCBWYWxpZGF0b3JMaXN0ZW5lciB2RXZlbnRTaW5rICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoIHIsIHMsIHAsIG9wdGlvbnMgKTsKKworICAgICAgICAgICAgX3dhbnREdXBBdHRycyA9IHRydWU7CisKKyAgICAgICAgICAgIGFzc2VydCBwID09IDA7CisKKyAgICAgICAgICAgIF9zdGFydFNwbGF5ID0gczsKKyAgICAgICAgICAgIF92RXZlbnRTaW5rID0gdkV2ZW50U2luazsKKworICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQorICAgICAgICAgICAgICAgIDsgIC8vIEVtcHR5CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0VGV4dEZyYWdtZW50ICggU3BsYXkgcywgaW50IHAsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudEZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRQcm9jaW5zdEZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOworICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgcCwgbnVsbCwgcywgcCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgcCwgbnVsbCwgdGV4dCgpICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuRU5ELCBzLCAwICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RG9jVHlwZSgKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSwgU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQorICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgcywgMSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzLmdldENjaEFmdGVyKCkgPiAwKQorICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgcywgMSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEF0dHJGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOLCBzLCAwLCBudWxsICk7CisKKyAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgcywgMCwgbnVsbCwgdGV4dCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzLmdldENjaCgpID4gMCkKKyAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIHMsIDAsIG51bGwsIHMsIDAgKTsKKworICAgICAgICAgICAgZW1pdEV2ZW50KCBWYWxpZGF0b3JMaXN0ZW5lci5FTkQsIHMsIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb250YWluZXIgKCBDb250YWluZXIgYywgUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBfeHNpTm9Mb2MgPT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBfeHNpTG9jID09IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgX3hzaVR5cGUgPT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBfeHNpTmlsID09IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocy5pc1hzaUF0dHIoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbCA9IHMuZ2V0TG9jYWwoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwuZXF1YWxzKCAidHlwZSIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIF94c2lUeXBlID0gczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobG9jYWwuZXF1YWxzKCAibmlsIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgX3hzaU5pbCA9IHM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggInNjaGVtYUxvY2F0aW9uIiApKQorICAgICAgICAgICAgICAgICAgICAgICAgX3hzaUxvYyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCisgICAgICAgICAgICAgICAgICAgICAgICBfeHNpTm9Mb2MgPSBzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW1pdEV2ZW50KAorICAgICAgICAgICAgICAgIFZhbGlkYXRvckxpc3RlbmVyLkJFR0lOLCBjLCAwLAorICAgICAgICAgICAgICAgIGMgPT0gX3N0YXJ0U3BsYXkgPyBudWxsIDogbmFtZSApOworCisgICAgICAgICAgICBfeHNpTm9Mb2MgPSBfeHNpTG9jID0gX3hzaVR5cGUgPSBfeHNpTmlsID0gbnVsbDsKKworICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHMuaXNYc2lBdHRyKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBzLmdldExvY2FsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsLmVxdWFscyggInR5cGUiICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLmVxdWFscyggIm5pbCIgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwuZXF1YWxzKCAic2NoZW1hTG9jYXRpb24iICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLmVxdWFscyggIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGludmFsaWRBdHRyVmFsdWUgPSAoU3RyaW5nKSBfYXR0cnMuZ2V0KCBzICk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW52YWxpZEF0dHJWYWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiwgcywgMCwgcy5nZXROYW1lKCksIHMsIDAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW1pdEV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiwgcywgMCwgcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQXR0clZhbHVlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVOREFUVFJTLCBjLCAwICk7CisKKyAgICAgICAgICAgIGlmIChjLmlzRG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKKworICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCggVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCwgYywgMSwgbnVsbCwgdGV4dCgpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLlRFWFQsIGMsIDEsIG51bGwsIGMsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMuaXNMZWFmKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNjaCA9IF90ZXh0ICE9IG51bGwgPyBfdGV4dC5sZW5ndGgoKSA6IGMuZ2V0Q2NoVmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChjY2ggPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCB0ZXh0KCkgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JMaXN0ZW5lci5URVhULCBjLCAxLCBudWxsLCBjLCAxICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbWl0RXZlbnQoIFZhbGlkYXRvckxpc3RlbmVyLkVORCwgYywgYy5nZXRQb3NMZWFmRW5kKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFdmVudCAoIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYyApCisgICAgICAgICAgICB7IGVtaXRFdmVudCgga2luZCwgc0xvYywgcExvYywgbnVsbCwgbnVsbCwgMCwgbnVsbCApOyB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICggaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lICkKKyAgICAgICAgICAgIHsgZW1pdEV2ZW50KCBraW5kLCBzTG9jLCBwTG9jLCBuYW1lLCBudWxsLCAwLCBudWxsICk7IH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKAorICAgICAgICAgICAgaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lLCBTdHJpbmcgdGV4dCApCisgICAgICAgICAgICAgICAgeyBlbWl0RXZlbnQgKCBraW5kLCBzTG9jLCBwTG9jLCBuYW1lLCBudWxsLCAwLCB0ZXh0ICk7IH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RXZlbnQgKAorICAgICAgICAgICAgaW50IGtpbmQsIFNwbGF5IHNMb2MsIGludCBwTG9jLCBRTmFtZSBuYW1lLCBTcGxheSBzVGV4dCwgaW50IHBUZXh0ICkKKyAgICAgICAgICAgICAgICB7IGVtaXRFdmVudCAoIGtpbmQsIHNMb2MsIHBMb2MsIG5hbWUsIHNUZXh0LCBwVGV4dCwgbnVsbCApOyB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdEV2ZW50ICgKKyAgICAgICAgICAgIGludCBraW5kLCBTcGxheSBzTG9jLCBpbnQgcExvYywgUU5hbWUgbmFtZSwKKyAgICAgICAgICAgIFNwbGF5IHNUZXh0LCBpbnQgcFRleHQsIFN0cmluZyB0ZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCAmJiBfZW1pdHRlZFRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGhhc1RleHQgPSB0ZXh0ICE9IG51bGwgfHwgc1RleHQgIT0gbnVsbDsKKworICAgICAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICAgICAgIWhhc1RleHQgfHwKKyAgICAgICAgICAgICAgICAgICAgKGtpbmQgPT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUKTsKKworICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuQVRUUiB8fCBoYXNUZXh0OworICAgICAgICAgICAgYXNzZXJ0IGtpbmQgIT0gVmFsaWRhdG9yTGlzdGVuZXIuVEVYVCB8fCBoYXNUZXh0OworCisgICAgICAgICAgICBhc3NlcnQga2luZCAhPSBWYWxpZGF0b3JMaXN0ZW5lci5BVFRSIHx8IG5hbWUgIT0gbnVsbDsKKworICAgICAgICAgICAgX25hbWUgPSBuYW1lOworICAgICAgICAgICAgX3NUZXh0ID0gc1RleHQ7CisgICAgICAgICAgICBfcFRleHQgPSBwVGV4dDsKKyAgICAgICAgICAgIF9ldmVudFRleHQgPSB0ZXh0OworICAgICAgICAgICAgX2hhc1RleHQgPSBoYXNUZXh0OworICAgICAgICAgICAgX3NMb2MgPSBzTG9jOworICAgICAgICAgICAgX3BMb2MgPSBwTG9jOworCisgICAgICAgICAgICBfdkV2ZW50U2luay5uZXh0RXZlbnQoIGtpbmQsIHRoaXMgKTsKKworICAgICAgICAgICAgX2VtaXR0ZWRUZXh0ID0ga2luZCA9PSBWYWxpZGF0b3JMaXN0ZW5lci5URVhUOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8KKyAgICAgICAgLy8KKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yIGdldExvY2F0aW9uQXNDdXJzb3IgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgX3NMb2MsIF9wTG9jICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRYc2lUeXBlICggQ2hhcnMgY2hhcnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3hzaVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgUFJFU0VSVkUsIG51bGwsIF94c2lUeXBlLCAwICk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTmlsICggQ2hhcnMgY2hhcnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3hzaU5pbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworCisgICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpTmlsLCAwICk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0WHNpTG9jICggQ2hhcnMgY2hhcnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3hzaUxvYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgc2V0Q2hhcnMoIGNoYXJzLCBQUkVTRVJWRSwgbnVsbCwgX3hzaUxvYywgMCApOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFhzaU5vTG9jICggQ2hhcnMgY2hhcnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3hzaU5vTG9jID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBzZXRDaGFycyggY2hhcnMsIFBSRVNFUlZFLCBudWxsLCBfeHNpTm9Mb2MsIDAgKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9uYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldENoYXJzICgKKyAgICAgICAgICAgIENoYXJzIGNoYXJzLCBpbnQgd3NyLCBTdHJpbmcgc3RyaW5nLCBTcGxheSBzVGV4dCwgaW50IHBUZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHN0cmluZyAhPSBudWxsIHx8IHNUZXh0ICE9IG51bGw7CisKKyAgICAgICAgICAgIGNoZWNrVmVyc2lvbigpOworCisgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisKKyAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICBjaGFycy5zdHJpbmcgPSBudWxsOworCisgICAgICAgICAgICBpZiAoc3RyaW5nICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcnMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocFRleHQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSByLl90ZXh0Ll9idWY7CisgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc1RleHQuZ2V0Q2NoKCk7CisKKyAgICAgICAgICAgICAgICBjaGFycy5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuZ2V0Q3AoIHNUZXh0ICksIGNoYXJzLmxlbmd0aCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocFRleHQgPT0gMSAmJiBzVGV4dC5pc0xlYWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFycy5idWZmZXIgPSByLl90ZXh0Ll9idWY7CisgICAgICAgICAgICAgICAgY2hhcnMubGVuZ3RoID0gc1RleHQuZ2V0Q2NoVmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgIHIuX3RleHQudW5PYnNjdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRDcCggc1RleHQgKSwgY2hhcnMubGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHBUZXh0ID09IHNUZXh0LmdldFBvc0FmdGVyKCk7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIG1vcmVUZXh0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSB0ID0gc1RleHQubmV4dE5vbkF0dHJTcGxheSgpIDsgOworICAgICAgICAgICAgICAgICAgICAgIHQgPSB0Lm5leHRTcGxheSgpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdC5pc0NvbW1lbnQoKSAmJiAhdC5pc1Byb2NpbnN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRDY2hBZnRlcigpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9yZVRleHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW1vcmVUZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gci5fdGV4dC5fYnVmOworICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzVGV4dC5nZXRDY2hBZnRlcigpOworCisgICAgICAgICAgICAgICAgICAgIGNoYXJzLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICByLl90ZXh0LnVuT2JzY3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGV4dC5nZXRDcEZvclBvcyggciwgcFRleHQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgICAgICAgICAgICAgIGludCBjY2ggPSBzVGV4dC5nZXRDY2hBZnRlcigpOworCisgICAgICAgICAgICAgICAgICAgIGludCBvZmYgPQorICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RleHQuZ2V0Q3BGb3JQb3MoIHIsIHBUZXh0ICksIGNjaCApOworCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggci5fdGV4dC5fYnVmLCBvZmYsIGNjaCApOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIFNwbGF5IHQgPSBzVGV4dC5uZXh0Tm9uQXR0clNwbGF5KCkgOyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0Lm5leHRTcGxheSgpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmlzQ29tbWVudCgpICYmICF0LmlzUHJvY2luc3QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZ2V0Q2NoQWZ0ZXIoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NoID0gdC5nZXRDY2hBZnRlcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENwRm9yUG9zKCByLCAxICksIGNjaCApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCByLl90ZXh0Ll9idWYsIG9mZiwgY2NoICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjaGFycy5sZW5ndGggPSBzYi5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcnMuYnVmZmVyID0gbmV3IGNoYXIgWyBjaGFycy5sZW5ndGggXTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcnMub2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICBzYi5nZXRDaGFycyggMCwgY2hhcnMubGVuZ3RoLCBjaGFycy5idWZmZXIsIDAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3c3IgIT0gUFJFU0VSVkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgcXVpY2ssIGRpcnR5IGFuZCB2ZXJ5IGluZWZmaWNpZW50CisgICAgICAgICAgICAgICAgLy8gICAgICAgIG1ha2UgaXQgZmFzdGVyIQorCisgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IGNoYXJzLmFzU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IC0xLCBuU3BhY2VzID0gMCwgY2NoID0gc3RyLmxlbmd0aCgpOworCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGNjaCA7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdCggaSApOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJyAnOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3c3IgPT0gQ09MTEFQU0UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnICcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TcGFjZXMrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoblNwYWNlcyA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgblNwYWNlcyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgblNwYWNlcyA+IDAgOyBuU3BhY2VzLS0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJyAnICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggY2ggKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGFycy5zdHJpbmcgPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGNoYXJzLmJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBnZXRUZXh0ICggQ2hhcnMgY2hhcnMgKQorICAgICAgICB7CisgICAgICAgICAgICBnZXRUZXh0KCBjaGFycywgUFJFU0VSVkUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFRleHQgKCBDaGFycyBjaGFycywgaW50IHdzciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2hhc1RleHQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJObyB0ZXh0IGZvciB0aGlzIGV2ZW50Iik7CisKKyAgICAgICAgICAgIHNldENoYXJzKCBjaGFycywgd3NyLCBfZXZlbnRUZXh0LCBfc1RleHQsIF9wVGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyAtIHJhdGhlciBleHBlbnNpdmUgdG8gbWFrZSBDaGFycyBhbmQgZ2V0VGV4dCBhbmQgZ2V0CisgICAgICAgIC8vIFN0cmluZworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0ZXh0SXNXaGl0ZXNwYWNlICggKQorICAgICAgICB7CisgICAgICAgICAgICBDaGFycyBjaGFycyA9IG5ldyBDaGFycygpOworICAgICAgICAgICAgZ2V0VGV4dCggY2hhcnMgKTsKKyAgICAgICAgICAgIFN0cmluZyBzID0gY2hhcnMuYXNTdHJpbmcoKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IHMubGVuZ3RoKCkgOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoIHMuY2hhckF0KCBpICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0b3JMaXN0ZW5lciBfdkV2ZW50U2luazsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgICAgICAgICBfc3RhcnRTcGxheTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBfZW1pdHRlZFRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSAgIF9uYW1lOworICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaVR5cGU7CisgICAgICAgIHByaXZhdGUgU3BsYXkgICBfeHNpTmlsOworICAgICAgICBwcml2YXRlIFNwbGF5ICAgX3hzaUxvYzsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgIF94c2lOb0xvYzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIF9ldmVudFRleHQ7CisgICAgICAgIHByaXZhdGUgU3BsYXkgICBfc1RleHQ7CisgICAgICAgIHByaXZhdGUgaW50ICAgICBfcFRleHQ7CisgICAgICAgIHByaXZhdGUgU3BsYXkgICBfc0xvYzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgICAgIF9wTG9jOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gX2hhc1RleHQ7CisgICAgfQorCisgICAgLy8KKyAgICAvLworICAgIC8vCisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU2F4U2F2ZXIgZXh0ZW5kcyBTYXZlcgorICAgIHsKKyAgICAgICAgU2F4U2F2ZXIgKAorICAgICAgICAgICAgUm9vdCByLCBTcGxheSBzLCBpbnQgcCwgWG1sT3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIsIExleGljYWxIYW5kbGVyIGxleGljYWxoYW5kbGVyICkKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCByLCBzLCBwLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIF9hdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIF93YW50RnJhZ1Rlc3QgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBfY29udGVudEhhbmRsZXIgPSBjb250ZW50SGFuZGxlcjsKKyAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlciA9IGxleGljYWxoYW5kbGVyOworCisvLyAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoIGhobW1tbSAgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCBwcm9jZXNzKCkgKQorICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFNhdmVyU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IGUuX3NheEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZERvY3VtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFNhdmVyU0FYRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBTYXZlclNBWEV4Y2VwdGlvbiAoIFNBWEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2F4RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU0FYRXhjZXB0aW9uIF9zYXhFeGNlcHRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGhyb3dTYXhFeGNlcHRpb24gKCBTQVhFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTYXZlclNBWEV4Y2VwdGlvbiggZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGMuaXNCZWdpbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwgKTsKKworICAgICAgICAgICAgICAgIGlmIChjLmlzTGVhZigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNjaCA9IF90ZXh0ID09IG51bGwgPyBjLmdldENjaFZhbHVlKCkgOiBfdGV4dC5sZW5ndGgoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2NoID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIGMsIDAsIGNjaCApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggYy5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNEb2MoKTsKKworICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVtaXRDb250YWluZXJIZWxwZXIoIGMsIG5hbWUsIG51bGwsIG51bGwgKTsKKworICAgICAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggYywgMCwgYy5nZXRDY2goKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIF90ZXh0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdEF0dHJIZWxwZXIgKCBTcGxheSBzLCBTdHJpbmcgdmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcy5pc05vcm1hbEF0dHIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gcy5nZXRMb2NhbCgpOworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHMuZ2V0VXJpKCk7CisKKyAgICAgICAgICAgIF9hdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICBzLmdldFVyaSgpLCBzLmdldExvY2FsKCksCisgICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBzLmdldE5hbWUoKSApLAorICAgICAgICAgICAgICAgICJDREFUQSIsCisgICAgICAgICAgICAgICAgdmFsdWUgPT0gbnVsbCA/IHMuZ2V0VGV4dCggZ2V0Um9vdCgpICkgOiB2YWx1ZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZUF0dHIgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyggcHJlZml4LCB1cmkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICBfYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoICIiLCAiIiwgInhtbG5zIiwgIkNEQVRBIiwgdXJpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXMuYWRkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICJ4bWxuczoiICsgcHJlZml4LCAiQ0RBVEEiLCB1cmkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXROYW1lc3BhY2VzSGVscGVyICggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQorICAgICAgICAgICAgICAgIGFkZE5hbWVzcGFjZUF0dHIoIG1hcHBpbmdQcmVmaXgoKSwgbWFwcGluZ1VyaSgpICk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENvbnRhaW5lckhlbHBlciAoCisgICAgICAgICAgICBDb250YWluZXIgYywgUU5hbWUgbmFtZSwKKyAgICAgICAgICAgIFNwbGF5IGV4dHJhQXR0ciwgU3RyaW5nQnVmZmVyIGV4dHJhQXR0clRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICBfYXR0cmlidXRlcy5jbGVhcigpOworCisgICAgICAgICAgICBpZiAoX3NhdmVOYW1lc3BhY2VzRmlyc3QpCisgICAgICAgICAgICAgICAgZW1pdE5hbWVzcGFjZXNIZWxwZXIoKTsKKworICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3BsYXkgcyA9IChTcGxheSkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoIHMsIChTdHJpbmcpIF9hdHRycy5nZXQoIHMgKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXh0cmFBdHRyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1pdEF0dHJIZWxwZXIoCisgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyVGV4dCA9PSBudWxsID8gbnVsbCA6IGV4dHJhQXR0clRleHQudG9TdHJpbmcoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIV9zYXZlTmFtZXNwYWNlc0ZpcnN0KQorICAgICAgICAgICAgICAgIGVtaXROYW1lc3BhY2VzSGVscGVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVtaXRFbGVtZW50KCBuYW1lLCBnZXRQcmVmaXhlZE5hbWUoIG5hbWUgKSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVtaXRDaGFyYWN0ZXJzICggY2hhcltdIGJ1ZiwgaW50IG9mZiwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jb250ZW50SGFuZGxlci5jaGFyYWN0ZXJzKCBidWYsIG9mZiwgY2NoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgZW1pdENoYXJhY3RlcnMgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBzLmdldENwRm9yUG9zKCBnZXRSb290KCksIHAgKSwgY2NoICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIGludCBjcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKAorICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLCBnZXRSb290KCkuX3RleHQudW5PYnNjdXJlKCBjcCwgY2NoICksCisgICAgICAgICAgICAgICAgY2NoICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0Q2hhcmFjdGVycyAoIFN0cmluZ0J1ZmZlciBzYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzYi50b1N0cmluZygpOyAvLyBJbmVmZmljaWVudCwgdXNlIGEgc2hhcmVkIGNoYXJbXQorICAgICAgICAgICAgCisgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggdGV4dC50b0NoYXJBcnJheSgpLCAwLCB0ZXh0Lmxlbmd0aCgpICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0RW5kRWxlbWVudCAoIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZml4ZWROYW1lKCBuYW1lICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGl0ZXJhdGVNYXBwaW5ncygpIDsgaGFzTWFwcGluZygpIDsgbmV4dE1hcHBpbmcoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuZW5kUHJlZml4TWFwcGluZyggbWFwcGluZ1ByZWZpeCgpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBlbmROYW1lc3BhY2VzICggKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2F0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgOyBpICsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbiA9IF9hdHRyaWJ1dGVzLmdldFFOYW1lKCBpICk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIXFuLnN0YXJ0c1dpdGgoICJ4bWxucyIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGludCBqID0gcW4uaW5kZXhPZiggJzonICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW4uc3Vic3RyaW5nKCBqICsgMSApICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoICIiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBTQVhFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRQcmVmaXhlZE5hbWUgKCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5zID0gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIFN0cmluZyBscCA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7CisKKyAgICAgICAgICAgIGlmIChucy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBscDsKKworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFVyaU1hcHBpbmcoIG5zICk7CisKKyAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbHA7CisKKyAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBscDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBlbWl0RWxlbWVudCAoIFFOYW1lIG5hbWUsIFN0cmluZyBwcmVmaXhlZE5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpLAorICAgICAgICAgICAgICAgICAgICBnZXRQcmVmaXhlZE5hbWUoIG5hbWUgKSwgX2F0dHJpYnV0ZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93U2F4RXhjZXB0aW9uKCBlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0RW5kICggU3BsYXkgcywgUU5hbWUgbmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfdGV4dCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBzLCBwLCBjY2ggKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbWl0Q2hhcmFjdGVycyggX3RleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAorICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbGV4aWNhbGhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9sZXhpY2FsaGFuZGxlci5zdGFydERURCggZG9jdHlwZU5hbWUsIHB1YmxpY0lELCBzeXN0ZW1JRCApOworICAgICAgICAgICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIuZW5kRFREKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbGV4aWNhbGhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3AgPSBnZXRSb290KCkuZ2V0Q3AoIHMgKTsKKyAgICAgICAgICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2hWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGV4aWNhbGhhbmRsZXIuY29tbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3QoKS5fdGV4dC5fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdCgpLl90ZXh0LnVuT2JzY3VyZSggY3AsIGNjaCApLAorICAgICAgICAgICAgICAgICAgICAgICAgY2NoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoICggU0FYRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dTYXhFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NvbnRlbnRIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcy5nZXRMb2NhbCgpLCBzLmdldFRleHQoIGdldFJvb3QoKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoIFNBWEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd1NheEV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFRleHRGcmFnbWVudCAoIFNwbGF5IHMsIGludCBwLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBudWxsLCBudWxsICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfdGV4dC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGVtaXRDaGFyYWN0ZXJzKCBfdGV4dCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocyAhPSBudWxsICYmIGNjaCA+IDApCisgICAgICAgICAgICAgICAgZW1pdENoYXJhY3RlcnMoIHMsIHAsIGNjaCApOworCisgICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0WG1sbnNGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKKyAgICAgICAgICAgIGVtaXRFbmRFbGVtZW50KCBfZnJhZ21lbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRBdHRyRnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgZW1pdENvbnRhaW5lckhlbHBlciggbnVsbCwgX2ZyYWdtZW50LCBzLCBfdGV4dCApOworICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbW1lbnRGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKKyAgICAgICAgICAgIGVtaXRDb21tZW50KCBzICk7CisgICAgICAgICAgICBlbWl0RW5kRWxlbWVudCggX2ZyYWdtZW50ICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3RGcmFnbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBlbWl0Q29udGFpbmVySGVscGVyKCBudWxsLCBfZnJhZ21lbnQsIG51bGwsIG51bGwgKTsKKyAgICAgICAgICAgIGVtaXRQcm9jaW5zdCggcyApOworICAgICAgICAgICAgZW1pdEVuZEVsZW1lbnQoIF9mcmFnbWVudCApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIEF0dHJpYnV0ZXNJbXBsIF9hdHRyaWJ1dGVzOworCisgICAgICAgIHByaXZhdGUgU0FYRXhjZXB0aW9uIF9zYXhFeGNlcHRpb247CisgICAgICAgIAorICAgICAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIF9jb250ZW50SGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBMZXhpY2FsSGFuZGxlciBfbGV4aWNhbGhhbmRsZXI7CisgICAgfQorCisgICAgICAgICAgICAKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsIF90aHJlYWREb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0KKyAgICAgICAgbmV3IFRocmVhZExvY2FsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEb21TYXZlciBleHRlbmRzIFNhdmVyCisgICAgeworICAgICAgICBEb21TYXZlciAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAsIGJvb2xlYW4gY3JlYXRlRG9jLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlciggciwgcywgcCwgb3B0aW9ucyApOworICAgICAgICAgICAgX2NyZWF0ZURvYyA9IGNyZWF0ZURvYzsKKyAgICAgICAgfQorCisgICAgICAgIE5vZGUgZXhwb3J0RG9tICggKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPIC0gYWRkIGFuIG9wdGlvbnMgd2hpY2ggc3BlY2lmaWVzIGEgRG9jdW1lbnQgd2l0aCB3aGljaAorICAgICAgICAgICAgLy8gdG8gY3JlYXRlIHRoZSBmcmFnbWVudAorCisgICAgICAgICAgICBfZG9jID0gKChEb2N1bWVudEJ1aWxkZXIpIF90aHJlYWREb2N1bWVudEJ1aWxkZXJGYWN0b3J5LmdldCgpKS5uZXdEb2N1bWVudCgpOworCisgICAgICAgICAgICBOb2RlIHJlc3VsdDsKKworICAgICAgICAgICAgaWYgKF9jcmVhdGVEb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2N1cnJlbnROb2RlID0gX2RvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IGZyYWcgPSBfZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBfY3VycmVudE5vZGUgPSBmcmFnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIHByb2Nlc3MoKSApCisgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdENvbnRhaW5lciAoIENvbnRhaW5lciBjLCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICBpZiAoYy5pc0RvYygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoYXNNYXBwaW5ncygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lc3BhY2UgYXR0cmlidXRlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChfdGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gci5fdGV4dC5mZXRjaCggMCwgYy5nZXRDY2goKSApOworCisgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCAmJiBfY3VycmVudE5vZGUgIT0gX2RvYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCisgICAgICAgICAgICAgICAgICAgICAgICBfZG9jLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICksIG51bGwgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGMuaXNCZWdpbigpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lID0gYy5nZXRMb2NhbCgpOworCisgICAgICAgICAgICAgICAgaWYgKGMuZ2V0VXJpKCkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFVyaU1hcHBpbmcoIGMuZ2V0VXJpKCkgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gcHJlZml4ICsgIjoiICsgcW5hbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRWxlbWVudCBlID0gX2RvYy5jcmVhdGVFbGVtZW50TlMoIGMuZ2V0VXJpKCksIHFuYW1lICk7CisKKyAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlLCBudWxsICk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpdGVyYXRlTWFwcGluZ3MoKSA7IGhhc01hcHBpbmcoKSA7IG5leHRNYXBwaW5nKCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG1hcHBpbmdQcmVmaXgoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9ICJ4bWxucyI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gInhtbG5zOiIgKyBwcmVmaXg7CisKKyAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyggU3BsYXkuX3htbG5zVXJpLCBxbmFtZSwgbWFwcGluZ1VyaSgpICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IF9hdHRycy5rZXlTZXQoKS5pdGVyYXRvcigpIDsgaS5oYXNOZXh0KCkgOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTcGxheSBzID0gKFNwbGF5KSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gcy5nZXRMb2NhbCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLmdldFVyaSgpLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFVyaU1hcHBpbmcoIHMuZ2V0VXJpKCkgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBwcmVmaXggKyAiOiIgKyBxbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnZhbGlkQXR0clZhbHVlID0gKFN0cmluZykgX2F0dHJzLmdldCggcyApOworCisgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlTlMoCisgICAgICAgICAgICAgICAgICAgICAgICBzLmdldFVyaSgpLCBxbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRBdHRyVmFsdWUgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcy5nZXRUZXh0KCByICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRBdHRyVmFsdWUgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYy5pc0xlYWYoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3RleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuZ2V0Q2NoVmFsdWUoKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Q3BGb3JQb3MoIHIsIDEgKSwgYy5nZXRDY2hWYWx1ZSgpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgZS5pbnNlcnRCZWZvcmUoIF9kb2MuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSwgbnVsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRFbmQgKCBTcGxheSBzLCBRTmFtZSBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgX2N1cnJlbnROb2RlID0gX2N1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0QWZ0ZXIgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjY2ggPiAwOworCisgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKF90ZXh0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF90ZXh0Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNjaCA+IDApCisgICAgICAgICAgICAgICAgdGV4dCA9IHIuX3RleHQuZmV0Y2goIHMuZ2V0Q3BGb3JQb3MoIHIsIHAgKSwgY2NoICk7CisKKyAgICAgICAgICAgIGlmIChfY3VycmVudE5vZGUgIT0gX2RvYykKKyAgICAgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBfZG9jLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICksIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXREb2NUeXBlKAorICAgICAgICAgICAgU3RyaW5nIGRvY3R5cGVOYW1lLCBTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0Q29tbWVudCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisKKyAgICAgICAgICAgIF9jdXJyZW50Tm9kZS5pbnNlcnRCZWZvcmUoCisgICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVDb21tZW50KAorICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRDcEZvclBvcyggciwgMCApLCBzLmdldENjaFZhbHVlKCkgKSApLCBudWxsICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0UHJvY2luc3QgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAorICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCksCisgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCAwICksIHMuZ2V0Q2NoVmFsdWUoKSApICksIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRYbWxuc0ZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBub2RlIGZvciBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUiICk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlbWl0QXR0ckZyYWdtZW50ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBub2RlIGZvciBhIGF0dHJpYnV0ZSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRUZXh0RnJhZ21lbnQgKCBTcGxheSBzLCBpbnQgcCwgaW50IGNjaCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEJVR0JVRyAtIHRoZXJlIGNvdWxkIGJlIG5hbWVzcGFjZXMgcHVzaGVkIGZvciB0aGlzIHRleHQsIGJ1dCBub3QKKyAgICAgICAgICAgIC8vIHN1cmUgaG93IHRvIHJlcHJlc2VudCB0aGVtIGhlcmUuLi4uICBJIHNob3VsZCByZWFsbHkgcHV0IHRoZQorICAgICAgICAgICAgLy8gZnJhZ21lbnQgbG9naWMgaW4gdGhlIGJhc2Ugc2F2ZXIgYW5kIGhhdmUgdGhlIGJhc2Ugc2F2ZXIKKyAgICAgICAgICAgIC8vIHN5bnRoZXNpemUgd2VsbCBmb3JtZWQgb3V0cHV0Li4uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICAgICAgX2N1cnJlbnROb2RlLmluc2VydEJlZm9yZSgKKyAgICAgICAgICAgICAgICAgICAgX2RvYy5jcmVhdGVUZXh0Tm9kZSgKKyAgICAgICAgICAgICAgICAgICAgX3RleHQgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBfdGV4dC50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICA6IHMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gci5fdGV4dC5mZXRjaCggcy5nZXRDcEZvclBvcyggciwgcCApLCBjY2ggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiICksCisgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVtaXRDb21tZW50RnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAorICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlQ29tbWVudCgKKyAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0Q3BGb3JQb3MoIHIsIDAgKSwgcy5nZXRDY2hWYWx1ZSgpICkgKSwgbnVsbCApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW1pdFByb2NpbnN0RnJhZ21lbnQgKCBTcGxheSBzICkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworCisgICAgICAgICAgICBfY3VycmVudE5vZGUuaW5zZXJ0QmVmb3JlKAorICAgICAgICAgICAgICAgIF9kb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCksCisgICAgICAgICAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBzLmdldENwRm9yUG9zKCByLCAwICksIHMuZ2V0Q2NoVmFsdWUoKSApICksIG51bGwgKTsKKyAgICAgICAgfQorCisgICAgICAgIERvY3VtZW50IF9kb2M7CisgICAgICAgIE5vZGUgICAgIF9jdXJyZW50Tm9kZTsKKyAgICAgICAgYm9vbGVhbiAgX2NyZWF0ZURvYzsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgIF90ZXh0OworICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgIF9zYjsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiAgICAgICBfc2tpcENvbnRhaW5lckZpbmlzaDsKKyAgICBwcm90ZWN0ZWQgTGlua2VkSGFzaE1hcCBfYXR0cnM7CisgICAgCisgICAgcHJpdmF0ZSBIYXNoU2V0IF9hdHRyTmFtZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2lubmVyOworICAgIHByaXZhdGUgZmluYWwgUm9vdCAgICBfcm9vdDsKKyAgICBwcml2YXRlIGZpbmFsIFNwbGF5ICAgX3RvcDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgICAgX3ZlcnNpb247CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfd2FudER1cEF0dHJzOworICAgIHByb3RlY3RlZCBib29sZWFuIF93YW50RnJhZ1Rlc3Q7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX25lZWRzRnJhZzsKKyAgICBwcm90ZWN0ZWQgUU5hbWUgICBfZnJhZ21lbnQ7CisgICAgcHJvdGVjdGVkIFFOYW1lICAgX2RvY0VsZW07CisgICAgCisgICAgcHJvdGVjdGVkIFFOYW1lIF9zeW50aEVsZW07CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfc2F2ZU5hbWVzcGFjZXNGaXJzdDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfdXNlRGVmYXVsdE5hbWVzcGFjZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBfcHJldHR5UHJpbnQ7CisgICAgcHJpdmF0ZSBpbnQgICAgIF9wcmV0dHlJbmRlbnQ7CisgICAgcHJpdmF0ZSBpbnQgICAgIF9wcmV0dHlPZmZzZXQ7CisKKyAgICBwcml2YXRlIFNwbGF5ICAgX3NwbGF5OworICAgIHByaXZhdGUgaW50ICAgICBfcG9zOworICAgIHByaXZhdGUgYm9vbGVhbiBfcHJlUHJvY2VzczsKKyAgICBwcml2YXRlIGJvb2xlYW4gX3Bvc3RQcm9jZXNzOworICAgIHByaXZhdGUgYm9vbGVhbiBfcG9zdFBvcDsKKyAgICBwcml2YXRlIFNwbGF5ICAgX2VuZFNwbGF5OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgX25hbWVzcGFjZVN0YWNrOworICAgIHByaXZhdGUgaW50ICAgICAgIF9jdXJyZW50TWFwcGluZzsKKyAgICBwcml2YXRlIEhhc2hNYXAgICBfdXJpTWFwOworICAgIHByaXZhdGUgSGFzaE1hcCAgIF9wcmVmaXhNYXA7CisgICAgcHJpdmF0ZSBib29sZWFuICAgX2ZpcnN0UHVzaDsKKyAgICBwcml2YXRlIFN0cmluZyAgICBfaW5pdGlhbERlZmF1bHRVcmk7CisgICAgCisgICAgcHJpdmF0ZSBIYXNoTWFwIF9wcmVDb21wdXRlZE5hbWVzcGFjZXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgIF9maWx0ZXJQcm9jaW5zdDsKKyAgICBwcml2YXRlIE1hcCAgICAgX3N1Z2dlc3RlZFByZWZpeGVzOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgIF9uZXdMaW5lOworCisgICAgc3RhdGljCisgICAgeworICAgICAgICBfbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOworICAgICAgICBpZiAoX25ld0xpbmUgPT0gbnVsbCkKKyAgICAgICAgICAgIF9uZXdMaW5lID0gIlxuIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1NwbGF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiOWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvU3BsYXkuamF2YQpAQCAtMCwwICsxLDQyMTkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVXNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlFOYW1lSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sTWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNwbGF5IGV4dGVuZHMgR29vYmVycworeworICAgIC8vCisgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBraW5kIG9mIGEgYmFzZSB0b2tlbgorICAgIC8vCisKKyAgICBTcGxheSAoIGludCBraW5kLCBib29sZWFuIGlzICkKKyAgICB7CisgICAgICAgIF9iaXRzID0ga2luZDsKKworICAgICAgICBpZiAoaXMpCisgICAgICAgICAgICBfYml0cyArPSAweDg7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTcGxheSBraW5kcworICAgIC8vCisKKyAgICBzdGF0aWMgZmluYWwgaW50IERPQyAgICAgID0gIDA7IC8vIERPQyBtdXN0IGJlIDAKKyAgICBzdGF0aWMgZmluYWwgaW50IEJFR0lOICAgID0gIDE7IC8vIEJFR0lOIG11c3QgYmUgMQorICAgIHN0YXRpYyBmaW5hbCBpbnQgQVRUUiAgICAgPSAgMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IENPTU1FTlQgID0gIDM7CisgICAgc3RhdGljIGZpbmFsIGludCBQUk9DSU5TVCA9ICA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUk9PVCAgICAgPSAgNTsgLy8gUk9PVCBtdXN0IGJlIHNlY29uZCB0byBsYXN0CisgICAgc3RhdGljIGZpbmFsIGludCBFTkQgICAgICA9ICA2OyAvLyBFTkQgbXVzdCBiZSBsYXN0CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIGZpbmFsIGludCBnZXRLaW5kICggKSB7IHJldHVybiBfYml0cyAmIDB4NzsgfQorCisgICAgZmluYWwgYm9vbGVhbiBpc0RvYyAgICAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IERPQzsgICAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc1Jvb3QgICAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IFJPT1Q7ICAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc0JlZ2luICAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEJFR0lOOyAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc0VuZCAgICAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEVORDsgICAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc0F0dHIgICAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEFUVFI7ICAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc0NvbW1lbnQgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IENPTU1FTlQ7ICB9CisgICAgZmluYWwgYm9vbGVhbiBpc1Byb2NpbnN0ICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IFBST0NJTlNUOyB9CisgICAgZmluYWwgYm9vbGVhbiBpc0NvbnRhaW5lciAoICkgeyByZXR1cm4gZ2V0S2luZCgpIDw9IEJFR0lOOyAgICB9CisgICAgZmluYWwgYm9vbGVhbiBpc0ZpbmlzaCAgICAoICkgeyByZXR1cm4gZ2V0S2luZCgpID49IFJPT1Q7ICAgICB9CisKKyAgICBmaW5hbCBpbnQgZ2V0Q2NoICAgICAgICAgICAoICkgeyByZXR1cm4gX2NjaDsgICAgICAgICAgICAgIH0KKworICAgIGZpbmFsIGludCBnZXRDZG9jQmVnaW4gICAgICggKSB7IHJldHVybiAxOyAgICAgICAgICAgICAgICAgfQorICAgIGZpbmFsIGludCBnZXRDY2hMZWZ0ICAgICAgICggKSB7IHJldHVybiBfY2NoTGVmdDsgICAgICAgICAgfQorICAgIGZpbmFsIGludCBnZXRDZG9jQmVnaW5MZWZ0ICggKSB7IHJldHVybiBfYml0cyA+PiA1OyAgICAgICAgfQorICAgIGZpbmFsIGludCBnZXRDY2hBZnRlciAgICAgICggKSB7IHJldHVybiBfY2NoQWZ0ZXI7ICAgICAgICAgfQorICAgIGZpbmFsIGludCBnZXRDY2hWYWx1ZSAgICAgICggKSB7IHJldHVybiBfY2NoIC0gX2NjaEFmdGVyOyAgfQorCisgICAgUU5hbWUgIGdldE5hbWUgICggKSB7IHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgfQorICAgIFN0cmluZyBnZXRVcmkgICAoICkgeyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IH0KKyAgICBTdHJpbmcgZ2V0TG9jYWwgKCApIHsgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyB9CisKKyAgICAvLyBGb3VydGggYml0IGluIF9iaXRzIGhhcyBzZXZlcmFsIG1lYW5pbmdzLCBkZXBlbmRpbmcgb24gc3BsYXkga2luZAorCisgICAgZmluYWwgYm9vbGVhbiBpc05vcm1hbEF0dHIgKCApIHsgcmV0dXJuIChfYml0cyAmIDB4RikgPT0gKDB4MCArIEFUVFIpOyB9CisgICAgZmluYWwgYm9vbGVhbiBpc1htbG5zICAgICAgKCApIHsgcmV0dXJuIChfYml0cyAmIDB4RikgPT0gKDB4OCArIEFUVFIpOyB9CisgICAgZmluYWwgYm9vbGVhbiBpc0xlYWYgICAgICAgKCApIHsgcmV0dXJuIChfYml0cyAmIDB4RikgPT0gKDB4OCArIEJFR0lOKTsgfQorICAgIGZpbmFsIGJvb2xlYW4gaXNGcmFnbWVudCAgICggKSB7IHJldHVybiAoX2JpdHMgJiAweEYpID09ICgweDggKyBDT01NRU5UKTsgfQorICAgIGZpbmFsIGJvb2xlYW4gaXNYc2lBdHRyICAgICggKSB7IHJldHVybiBpc05vcm1hbEF0dHIoKSAmJiBnZXRVcmkoKS5lcXVhbHMoIF94c2kgKTsgfQorICAgIGZpbmFsIGJvb2xlYW4gaXNYc2lOaWwgICAgICggKSB7IHJldHVybiBpc05vcm1hbEF0dHIoKSAmJiBnZXROYW1lKCkuZXF1YWxzKF94c2lOaWwgKTsgfQorICAgIGZpbmFsIGJvb2xlYW4gaXNYc2lUeXBlICAgICggKSB7IHJldHVybiBpc05vcm1hbEF0dHIoKSAmJiBnZXROYW1lKCkuZXF1YWxzKCBfeHNpVHlwZSApOyB9CisgICAgZmluYWwgYm9vbGVhbiBpc1R5cGVhYmxlICAgKCApIHsgcmV0dXJuIGlzQ29udGFpbmVyKCkgfHwgaXNOb3JtYWxBdHRyKCk7IH0KKworICAgIGZpbmFsIHZvaWQgdG9nZ2xlSXNMZWFmICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKTsKKyAgICAgICAgX2JpdHMgXj0gMHg4OworICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gaXNWYWxpZCAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCAoKF9iaXRzICYgMHgxMCkgPT0gMCkgfHwgaXNUeXBlYWJsZSgpOworICAgICAgICByZXR1cm4gKF9iaXRzICYgMHgxMCkgPT0gMDsKKyAgICB9CisKKyAgICBmaW5hbCBib29sZWFuIGlzSW52YWxpZCAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCAoKF9iaXRzICYgMHgxMCkgPT0gMCkgfHwgaXNUeXBlYWJsZSgpOworICAgICAgICByZXR1cm4gKF9iaXRzICYgMHgxMCkgIT0gMDsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHRvZ2dsZUlzSW52YWxpZCAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisgICAgICAgIF9iaXRzIF49IDB4MTA7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBhZGp1c3RDY2ggKCBpbnQgZGVsdGEgKQorICAgIHsKKyAgICAgICAgX2NjaCArPSBkZWx0YTsKKyAgICAgICAgYXNzZXJ0IF9jY2ggPj0gMDsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIGFkanVzdENjaEFmdGVyICggaW50IGRlbHRhICkKKyAgICB7CisgICAgICAgIF9jY2hBZnRlciArPSBkZWx0YTsKKyAgICAgICAgYXNzZXJ0IF9jY2hBZnRlciA+PSAwOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgYWRqdXN0Q2NoTGVmdCAoIGludCBkZWx0YSApCisgICAgeworICAgICAgICBfY2NoTGVmdCArPSBkZWx0YTsKKyAgICAgICAgYXNzZXJ0IF9jY2hMZWZ0ID49IDA7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBhZGp1c3RDZG9jQmVnaW5MZWZ0ICggaW50IGQgKQorICAgIHsKKyAgICAgICAgX2JpdHMgKz0gZCAqIDMyOworICAgICAgICBhc3NlcnQgZ2V0Q2RvY0JlZ2luTGVmdCgpID49IDA7CisgICAgfQorCisgICAgZmluYWwgU3BsYXkgZ2V0RmluaXNoU3BsYXkgKCApCisgICAgeworICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKyAgICAgICAgcmV0dXJuIGlzTGVhZigpID8gdGhpcyA6ICgoQ29udGFpbmVyKSB0aGlzKS5nZXRGaW5pc2goKTsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgZ2V0UG9zQWZ0ZXIgKCApCisgICAgeworICAgICAgICByZXR1cm4gZ2V0RW5kUG9zKCkgLSBnZXRDY2hBZnRlcigpOworICAgIH0KKworICAgIGZpbmFsIGludCBnZXRQb3NMZWFmRW5kICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzTGVhZigpOworICAgICAgICByZXR1cm4gMSArIGdldENjaFZhbHVlKCk7CisgICAgfQorCisgICAgZmluYWwgaW50IGdldENwRm9yUG9zICggUm9vdCByLCBpbnQgcCApCisgICAgeworICAgICAgICBpbnQgY3AgPSByLmdldENwKCB0aGlzICk7CisKKyAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjcDsKKworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlzTGVhZigpCisgICAgICAgICAgICAgICAgPyBwIC0gKHAgPD0gZ2V0UG9zTGVhZkVuZCgpID8gMSA6IDIpICsgY3AKKyAgICAgICAgICAgICAgICA6IHAgLSAxICsgZ2V0Q2NoVmFsdWUoKSArIGNwOworICAgIH0KKworICAgIGZpbmFsIGludCBnZXRQb3N0Q2NoICggaW50IHAgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHAgPj0gMCAmJiBwIDw9IGdldEVuZFBvcygpOworCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgaXNMZWFmKCkgJiYgcCA8PSBnZXRQb3NMZWFmRW5kKCkKKyAgICAgICAgICAgICAgICA/IGdldFBvc0xlYWZFbmQoKSAtIHAKKyAgICAgICAgICAgICAgICA6IGdldEVuZFBvcygpIC0gcDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIF94c2kgPQorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBfc2NoZW1hID0KKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgX29wZW5GcmFnVXJpID0KKyAgICAgICAgImh0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQiOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBfeG1sMTk5OFVyaSA9CisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBfeG1sbnNVcmkgPQorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOworCisgICAgc3RhdGljIGZpbmFsIFFOYW1lIF94c2lOaWwgID0gbmV3IFFOYW1lKCBfeHNpLCAibmlsIiApOworICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBfeHNpVHlwZSA9IG5ldyBRTmFtZSggX3hzaSwgInR5cGUiICk7CisgICAgc3RhdGljIGZpbmFsIFFOYW1lIF9vcGVudXJpRnJhZ21lbnQgPSBuZXcgUU5hbWUoIF9vcGVuRnJhZ1VyaSwgImZyYWdtZW50IiApOworICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBfeG1sRnJhZ21lbnQgPSBuZXcgUU5hbWUoICIiLCAieG1sLWZyYWdtZW50IiApOworCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNYbWxGcmFnbWVudCAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9vcGVudXJpRnJhZ21lbnQuZXF1YWxzKCBuYW1lICkgfHwgX3htbEZyYWdtZW50LmVxdWFscyggbmFtZSApOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGJlZ2luc1dpdGhYbWwgKCBTdHJpbmcgbmFtZSApCisgICAgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDMpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2hhciBjaDsKKworICAgICAgICBpZiAoKChjaCA9IG5hbWUuY2hhckF0KCAwICkpID09ICd4JyB8fCBjaCA9PSAnWCcpICYmCisgICAgICAgICAgICAgICAgKChjaCA9IG5hbWUuY2hhckF0KCAxICkpID09ICdtJyB8fCBjaCA9PSAnTScpICYmCisgICAgICAgICAgICAgICAgKChjaCA9IG5hbWUuY2hhckF0KCAyICkpID09ICdsJyB8fCBjaCA9PSAnTCcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIHBvcyBvZiB0aGUgdmVyeSBlbmQgb2YgdGhlIHNwbGF5LiAgVGhpcyBpcyBub3QKKyAgICAgKiBnZW5lcmFsbHkgYSB2YWxpZCBwb3NpdGlvbiB0byBleGlzdCBiZWNhdXNlIGluIHRoZXNlIGNhc2VzLCBJCisgICAgICogZm9yY2UgdGhlIHBvc2l0aW9uIHRvIGJlIDAgb24gdGhlIG5leHQgc3BsYXkuCisgICAgICovCisKKyAgICBmaW5hbCBpbnQgZ2V0RW5kUG9zICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldE1heFBvcygpICsgMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIGxhcmdlc3QgcG9zIHBvc3NpYmxlIHdpdGhvdXQgYWN0dWFsbHkgYmVpbmcgYXQKKyAgICAgKiB0aGUgZW5kIG9mIHRoZSBzcGxheS4KKyAgICAgKi8KKworICAgIGZpbmFsIGludCBnZXRNYXhQb3MgKCApCisgICAgeworICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQVRUUiAgICAgOgorICAgICAgICBjYXNlIFJPT1QgICAgIDogcmV0dXJuIDA7CisgICAgICAgIGNhc2UgQkVHSU4gICAgOiByZXR1cm4gKGlzTGVhZigpID8gMSA6IDApICsgZ2V0Q2NoKCk7CisgICAgICAgIGNhc2UgRE9DICAgICAgOgorICAgICAgICBjYXNlIENPTU1FTlQgIDoKKyAgICAgICAgY2FzZSBQUk9DSU5TVCA6CisgICAgICAgIGNhc2UgRU5EICAgICAgOiByZXR1cm4gZ2V0Q2NoQWZ0ZXIoKTsKKworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQgc3BsYXkga2luZCAiICtnZXRLaW5kKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzV2hpdGVTcGFjZSAoIGNoYXIgY2ggKQorICAgIHsKKyAgICAgICAgc3dpdGNoICggY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaGl0ZVNwYWNlICggU3RyaW5nIHMgKQorICAgIHsKKyAgICAgICAgaW50IGwgPSBzLmxlbmd0aCgpOworCisgICAgICAgIHdoaWxlICggbC0tID4gMCkKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCBzLmNoYXJBdCggbCApKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1doaXRlU3BhY2UgKCBTdHJpbmdCdWZmZXIgc2IgKQorICAgIHsKKyAgICAgICAgaW50IGwgPSBzYi5sZW5ndGgoKTsKKworICAgICAgICB3aGlsZSAoIGwtLSA+IDApCisgICAgICAgICAgICBpZiAoIWlzV2hpdGVTcGFjZSggc2IuY2hhckF0KCBsICkpKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZpbmFsIGJvb2xlYW4gaXNBZnRlcldoaXRlU3BhY2UgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgaW50IGNjaEFmdGVyID0gZ2V0Q2NoQWZ0ZXIoKTsKKworICAgICAgICBpZiAoY2NoQWZ0ZXIgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGludCBvZmYgPQorICAgICAgICAgICAgci5fdGV4dC51bk9ic2N1cmUoCisgICAgICAgICAgICAgICAgci5nZXRDcCggdGhpcyApICsgZ2V0Q2NoKCkgLSBjY2hBZnRlciwgY2NoQWZ0ZXIgKTsKKworICAgICAgICB3aGlsZSAoIGNjaEFmdGVyLS0gPiAwICkKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKCByLl90ZXh0Ll9idWZbIG9mZiArIGNjaEFmdGVyIF0gKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBzZXROYW1lICggUm9vdCByLCBRTmFtZSBuZXdOYW1lICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc0JlZ2luKCkgfHwgaXNBdHRyKCkgfHwgaXNQcm9jaW5zdCgpOworCisgICAgICAgIC8vIEJVR0JVRyAtIGRlYWwgd2l0aCB4c2k6bmlsIGhlcmUgdG9vCisKKyAgICAgICAgUU5hbWUgb2xkTmFtZSA9IGdldE5hbWUoKTsKKworICAgICAgICBpZiAoIW5ld05hbWUuZXF1YWxzKCBvbGROYW1lICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKKworICAgICAgICAgICAgKChRTmFtZVNwbGF5KSB0aGlzKS5jaGFuZ2VOYW1lKCBuZXdOYW1lICk7CisKKyAgICAgICAgICAgIGlmICghaXNQcm9jaW5zdCgpICYmICFpc1htbG5zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzQXR0cigpIHx8IGlzQmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciApOworCisgICAgICAgICAgICAgICAgaWYgKF94c2lUeXBlLmVxdWFscyggb2xkTmFtZSApIHx8IF94c2lUeXBlLmVxdWFscyggbmV3TmFtZSApKQorICAgICAgICAgICAgICAgICAgICBnZXRDb250YWluZXIoKS5kaXNjb25uZWN0VHlwZXMoIHIgKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChfeHNpTmlsLmVxdWFscyggb2xkTmFtZSApIHx8IF94c2lOaWwuZXF1YWxzKCBuZXdOYW1lICkpCisgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmludmFsaWRhdGVOaWwoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RUeXBlcyggciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGlzIGFuIGludmFsaWQgbGVhZiwgdGhlbiByZWZyZXNoIGl0J3MgdmFsdWUgYW5kIHJldHVybiB0aGUKKyAgICAgKiBudW1iZXIgb2YgY2hhcmFjdGVycyBhZGRlZC4KKyAgICAgKi8KKworICAgIGZpbmFsIGludCBlbnN1cmVDb250ZW50VmFsaWQgKCApCisgICAgeworICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKworICAgICAgICBpZiAoaXNWYWxpZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKKworICAgICAgICByZXR1cm4gdC52YWxpZGF0ZUNvbnRlbnQoIHRoaXMsIHQgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICogRW5zdXJlIHRoYXQgdGhlIHZhbHVlIChBVFRSLCBDT01NRU5UIGFuZCBQUk9DSU5TVCkgaXMgdmFsaWQuICBSZWFsbHkKKyAgICAgICogb25seSBkb2VzIGFueXRoaW5nIGZvciBhdHRycy4KKyAgICAgICovCisKKyAgICBmaW5hbCB2b2lkIGVuc3VyZVZhbHVlVmFsaWQgKCApCisgICAgeworICAgICAgICBhc3NlcnQgaXNOb3JtYWxBdHRyKCk7CisKKyAgICAgICAgaWYgKGlzSW52YWxpZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOworICAgICAgICAgICAgdC52YWxpZGF0ZVZhbHVlKCB0aGlzLCB0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHBvc2l0aW9uIGluIHRoaXMgc3BsYXksIHJldHVybiB0aGUgVG9rZW5UeXBlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBjb250ZW50IHRvIHRoZSBsZWZ0IG9mIHRoZSBwb3NpdGlvbi4KKyAgICAgKi8KKworICAgIGZpbmFsIFRva2VuVHlwZSBnZXRUb2tlblR5cGUgKCBpbnQgcCApCisgICAgeworICAgICAgICBhc3NlcnQgcCA+PSAwICYmIHAgPD0gZ2V0TWF4UG9zKCk7CisKKyAgICAgICAgLy8gTm8gbmVlZCB0byByZXZhbGlkYXRlIHRleHQgdmFsdWUgaGVyZSBiZWNhdXNlIHRoZXJlIGNhbiBiZSBubyBwb3MKKyAgICAgICAgLy8gd2hpY2ggY291bGQgZXhpc3RzIHdoZW4gdGhpcyBzcGxheSBpcyBpbnZhbGlkIHdoaWNoIGNvdWxkIGJlIG9uCisgICAgICAgIC8vIHRleHQuCisKKyAgICAgICAgLy8gRmlyc3QsIHNlZSBpZiB3ZSdyZSBpbi9hdCB0aGUgdGV4dCBhZnRlciB0aGUgc3BsYXkKKworICAgICAgICBpZiAocCA+PSBnZXRQb3NBZnRlcigpKQorICAgICAgICAgICAgcmV0dXJuIFRva2VuVHlwZS5URVhUOworCisgICAgICAgIHN3aXRjaCAoIGdldEtpbmQoKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBBVFRSIDoKKyAgICAgICAgICAgIHJldHVybiBpc1htbG5zKCkgPyBUb2tlblR5cGUuTkFNRVNQQUNFIDogVG9rZW5UeXBlLkFUVFI7CisKKyAgICAgICAgY2FzZSBCRUdJTiA6CisgICAgICAgICAgICBpZiAocCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuU1RBUlQ7CisKKyAgICAgICAgICAgIGFzc2VydCBpc0xlYWYoKTsKKworICAgICAgICAgICAgcmV0dXJuIHAgPT0gZ2V0UG9zTGVhZkVuZCgpID8gVG9rZW5UeXBlLkVORCA6IFRva2VuVHlwZS5URVhUOworCisgICAgICAgIGNhc2UgUk9PVCAgICAgOiByZXR1cm4gVG9rZW5UeXBlLkVORERPQzsKKyAgICAgICAgY2FzZSBET0MgICAgICA6IHJldHVybiBUb2tlblR5cGUuU1RBUlRET0M7CisgICAgICAgIGNhc2UgQ09NTUVOVCAgOiByZXR1cm4gVG9rZW5UeXBlLkNPTU1FTlQ7CisgICAgICAgIGNhc2UgUFJPQ0lOU1QgOiByZXR1cm4gVG9rZW5UeXBlLlBST0NJTlNUOworICAgICAgICBjYXNlIEVORCAgICAgIDogcmV0dXJuIFRva2VuVHlwZS5FTkQ7CisKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U6ICJVbmV4cGVjdGVkIHNwbGF5IGtpbmQgIiArIGdldEtpbmQoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2F1c2UgdGhpcyBzcGxheSB0byBiZWNvbWUgYSBsZWFmLiAgVGhpcyBkb2VzIG5vdCBsb2dpY2FsbHkKKyAgICAgKiBhbHRlciB0aGUgZG9jdW1lbnQsIGJ1dCBkb2VzIGFsdGVyIHRoZSBwaHlzaWNhbCBzcGxheSB0cmVlIHdoaWNoCisgICAgICogZGVtYW5kcyB0aGF0IEkgaXNzdWUgYSBjaGFuZ2Ugbm90aWNlLgorICAgICAqLworCisgICAgZmluYWwgdm9pZCBmb2xpYXRlICggUm9vdCByICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc0JlZ2luKCk7CisgICAgICAgIGFzc2VydCAhaXNMZWFmKCk7CisKKyAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdGhpczsKKyAgICAgICAgU3BsYXkgZSA9IGIuZ2V0RmluaXNoKCk7CisKKyAgICAgICAgYXNzZXJ0IGIubmV4dE5vbkF0dHJTcGxheSgpID09IGU7CisgICAgICAgIGFzc2VydCBiLl9lbmQgPT0gZTsKKyAgICAgICAgYXNzZXJ0IGUuaXNFbmQoKTsKKyAgICAgICAgYXNzZXJ0ICFiLmlzTGVhZigpOworCisgICAgICAgIC8vIENhbGxlciBtdXN0IGluaXRpYXRlIGNoYW5nZQorICAgICAgICBhc3NlcnQgci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKTsKKworICAgICAgICBpbnQgY2NoQmVmb3JlID0gZ2V0Q2NoKCk7CisKKyAgICAgICAgZS5zYXZlVGV4dEFmdGVyKCByICk7CisKKyAgICAgICAgYi5fZW5kID0gbnVsbDsKKyAgICAgICAgYi50b2dnbGVJc0xlYWYoKTsKKworICAgICAgICBiLmFkanVzdENjaEFmdGVyKCAtIGNjaEJlZm9yZSApOworCisgICAgICAgIC8vIE1vdmUgdGhlIGdvb2JlcnMgZnJvbSB0aGUgZW5kIHRvIHRoZSBiZWdpbgorCisgICAgICAgIEdvb2JlciBuZXh0R29vYmVyOworICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGUuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEdvb2JlciA9IGUubmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICBhc3NlcnQgZy5nZXRQb3MoKSA9PSAwOworICAgICAgICAgICAgZy5zZXQoIHRoaXMsIGNjaEJlZm9yZSArIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEdvb2JlciA9IG5leHRHb29iZXIoIGcgKTsKKworICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKKworICAgICAgICAgICAgaWYgKGdwID4gY2NoQmVmb3JlICsgMSkKKyAgICAgICAgICAgICAgICBnLnNldCggdGhpcywgZ3AgKyAxICk7CisgICAgICAgIH0KKworICAgICAgICBlLnJlbW92ZVNwbGF5KCByICk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBkZWZvbGlhdGUgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzTGVhZigpOworCisgICAgICAgIC8vIENhbGxlciBtdXN0IGluaXRpYXRlIGNoYW5nZQorICAgICAgICBhc3NlcnQgci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKTsKKworICAgICAgICAvLyBDYWxsZXIgbXVzdCBlbnN1cmUgbGVhZiBpcyB2YWxpZAorICAgICAgICBhc3NlcnQgaXNWYWxpZCgpOworCisgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIHRoaXM7CisKKyAgICAgICAgaW50IHBvc0xlYWZFbmQgPSBnZXRQb3NMZWFmRW5kKCk7CisgICAgICAgIGludCBjY2hBZnRlciA9IGdldENjaEFmdGVyKCk7CisgICAgICAgIGludCBjY2hWYWx1ZSA9IGdldENjaFZhbHVlKCk7CisKKyAgICAgICAgU3BsYXkgYSA9IHRoaXM7CisKKyAgICAgICAgaW50IGNjaEF0dHIgPSAwOworCisgICAgICAgIGZvciAoIFNwbGF5IHQgPSBuZXh0U3BsYXkoKSA7IHQuaXNBdHRyKCkgOyB0ID0gdC5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNjaEF0dHIgKz0gdC5nZXRDY2goKTsKKyAgICAgICAgICAgIGEgPSB0OworICAgICAgICB9CisKKyAgICAgICAgci5pbnNlcnRTcGxheSggYi5fZW5kID0gbmV3IEVuZCggKEJlZ2luKSB0aGlzICksIGEgKTsKKworICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOworCisgICAgICAgIGIuYWRqdXN0Q2NoQWZ0ZXIoIGNjaFZhbHVlIC0gY2NoQWZ0ZXIgKTsKKyAgICAgICAgYi5fZW5kLmFkanVzdENjaEFmdGVyKCBjY2hBZnRlciApOworCisgICAgICAgIHIudXBkYXRlQ2NoKCBiLCAtIGNjaEFmdGVyICk7CisgICAgICAgIHIudXBkYXRlQ2NoKCBiLl9lbmQsIGNjaEFmdGVyICk7CisKKyAgICAgICAgaWYgKGNjaEF0dHIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY3AgPSByLmdldENwKCBiICk7CisKKyAgICAgICAgICAgIHIuX3RleHQubW92ZSgKKyAgICAgICAgICAgICAgICBjcCArIGNjaFZhbHVlICsgY2NoQWZ0ZXIgKyBjY2hBdHRyLAorICAgICAgICAgICAgICAgIHIuX3RleHQsIGNwICsgY2NoVmFsdWUsIGNjaEFmdGVyICk7CisgICAgICAgIH0KKworICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKKyAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOworCisgICAgICAgICAgICBpZiAoZ3AgPj0gcG9zTGVhZkVuZCkKKyAgICAgICAgICAgICAgICBnLnNldCggYi5fZW5kLCBncCAtIHBvc0xlYWZFbmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdGV4dCBhZnRlciAqdGhpcyogc3BsYXkuCisgICAgICogTm8gdmFsaWRhdGlvbiBpcyBkb25lLCBjYWxsZXIgbXVzdCBkbyB0aGF0CisgICAgICovCisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgcmVtb3ZlVGV4dEFmdGVyICggUm9vdCByICkKKyAgICB7CisgICAgICAgIGFzc2VydCByICE9IG51bGw7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7CisgICAgICAgIGFzc2VydCAhaXNSb290KCkgJiYgIWlzQXR0cigpOworCisgICAgICAgIC8vIENhbGxlciBtdXN0IGluaXRpYXRlIGNoYW5nZQorICAgICAgICBhc3NlcnQgci52YWxpZGF0ZUNoYW5nZVN0YXJ0ZWQoKTsKKworICAgICAgICBpbnQgY2NoVGV4dEFmdGVyID0gZ2V0Q2NoQWZ0ZXIoKTsKKworICAgICAgICBpZiAoY2NoVGV4dEFmdGVyID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGNwVGV4dEFmdGVyID0gci5nZXRDcCggdGhpcyApICsgZ2V0Q2NoKCkgLSBjY2hUZXh0QWZ0ZXI7CisgICAgICAgIGludCBwb3NUZXh0QWZ0ZXIgPSBnZXRQb3NBZnRlcigpOworCisgICAgICAgIGFkanVzdENjaEFmdGVyKCAtIGNjaFRleHRBZnRlciApOworCisgICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaFRleHRBZnRlciApOworCisgICAgICAgIHIuX3RleHQucmVtb3ZlKCBjcFRleHRBZnRlciwgY2NoVGV4dEFmdGVyICk7CisKKyAgICAgICAgR29vYmVyIG5leHRHb29iZXI7CisgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEdvb2JlciA9IG5leHRHb29iZXIoIGcgKTsKKworICAgICAgICAgICAgaW50IGsgPSBnLmdldEtpbmQoKTsKKworICAgICAgICAgICAgaWYgKGcuZ2V0UG9zKCkgPj0gcG9zVGV4dEFmdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChrID09IEFOTk9UQVRJT04pCisgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGsgPT0gQ1VSU09SKQorICAgICAgICAgICAgICAgICAgICBnLnNldCggbmV4dFNwbGF5KCksIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB2YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVycyB0aGUgdGV4dCBhZnRlciB0aGlzICJub2RlIiB0byBiZSBhZnRlciB0aGUgIm5vZGUiIGJlZm9yZSBpdC4KKyAgICAgKiBObyB0eXBlIGludmFsaWRhdGlvbiBpcyBkb25lIGhlcmUuICBObyBjaGVja2luZyBmb3IgaXNJbnZhbGlkIGlzIG5lZWRlZAorICAgICAqIGVpdGhlci4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZSwgY2FsbGVyIG11c3QgZG8gdGhhdC4KKyAgICAgKi8KKworICAgIHByaXZhdGUgZmluYWwgaW50IHNhdmVUZXh0QWZ0ZXIgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKKworICAgICAgICAvLyBDYWxsZXIgbXVzdCBpbml0aWF0ZSBjaGFuZ2UKKyAgICAgICAgYXNzZXJ0IHIudmFsaWRhdGVDaGFuZ2VTdGFydGVkKCk7CisKKyAgICAgICAgU3BsYXkgZW5kVGV4dCA9IHRoaXM7CisKKyAgICAgICAgaWYgKGlzQmVnaW4oKSAmJiAhaXNMZWFmKCkpCisgICAgICAgICAgICBlbmRUZXh0ID0gZ2V0RmluaXNoU3BsYXkoKTsKKworICAgICAgICBpbnQgY2NoRW5kVGV4dCA9IGVuZFRleHQuZ2V0Q2NoQWZ0ZXIoKTsKKworICAgICAgICBpZiAoY2NoRW5kVGV4dCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKSAmJiAhaXNEb2MoKSAmJiAhaXNBdHRyKCk7CisKKyAgICAgICAgU3BsYXkgZ2V0c1RleHQgPSBwcmV2Tm9uQXR0clNwbGF5KCk7CisgICAgICAgIGludCBnZXRzVGV4dExhc3RQb3MgPSBnZXRzVGV4dC5nZXRFbmRQb3MoKTsKKworICAgICAgICBpbnQgY3BHZXRzVGV4dCA9IHIuZ2V0Q3AoIGdldHNUZXh0ICkgKyBnZXRzVGV4dC5nZXRDY2goKTsKKyAgICAgICAgaW50IGNwRW5kVGV4dCA9IHIuZ2V0Q3AoIGVuZFRleHQgKSArIGVuZFRleHQuZ2V0Q2NoKCkgLSBjY2hFbmRUZXh0OworCisgICAgICAgIGdldHNUZXh0LmFkanVzdENjaEFmdGVyKCBjY2hFbmRUZXh0ICk7CisgICAgICAgIGVuZFRleHQuYWRqdXN0Q2NoQWZ0ZXIoIC0gY2NoRW5kVGV4dCApOworCisgICAgICAgIHIudXBkYXRlQ2NoKCBnZXRzVGV4dCwgY2NoRW5kVGV4dCApOworICAgICAgICByLnVwZGF0ZUNjaCggZW5kVGV4dCwgLSBjY2hFbmRUZXh0ICk7CisKKyAgICAgICAgYXNzZXJ0IGNwR2V0c1RleHQgPD0gY3BFbmRUZXh0OworCisgICAgICAgIGlmIChjcEdldHNUZXh0ICE9IGNwRW5kVGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgci5fdGV4dC5pbnNlcnQoIGNwR2V0c1RleHQsIHIuX3RleHQsIGNwRW5kVGV4dCwgY2NoRW5kVGV4dCApOworICAgICAgICAgICAgci5fdGV4dC5yZW1vdmUoIGNwRW5kVGV4dCArIGNjaEVuZFRleHQsIGNjaEVuZFRleHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwb3NFbmRUZXh0ID0gZW5kVGV4dC5nZXRQb3NBZnRlcigpOworCisgICAgICAgIEdvb2JlciBuZXh0R29vYmVyOworICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGVuZFRleHQuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEdvb2JlciA9IGVuZFRleHQubmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOworCisgICAgICAgICAgICBpZiAoZ3AgPj0gcG9zRW5kVGV4dCkKKyAgICAgICAgICAgICAgICBnLnNldCggZ2V0c1RleHQsIGdldHNUZXh0TGFzdFBvcyArIGdwIC0gcG9zRW5kVGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisKKyAgICAgICAgcmV0dXJuIGNjaEVuZFRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZXMgdGhpcyBzcGxheSwgYWxsIG9mIGl0cyBjb250ZW50IGFuZCBhdHRyaWJ1dGVzLiAgSWYgbm8gZGVzdGluYXRpb24KKyAgICAgKiBpcyBwcm92aWRlZCwgdGhlbiBvbmx5IGEgcmVtb3ZhbCBpcyBwZXJmb3JtZWQuCisgICAgICovCisKKyAgICBmaW5hbCB2b2lkIG1vdmUgKAorICAgICAgICBSb290IHIsIFJvb3QgckRzdCwgU3BsYXkgc0RzdCwgaW50IHBEc3QsIGJvb2xlYW4gaW52YWxpZGF0ZSApCisgICAgeworICAgICAgICBhc3NlcnQgciAhPSBudWxsOworICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICBhc3NlcnQgIWlzRG9jKCkgJiYgIWlzRmluaXNoKCk7CisKKyAgICAgICAgYXNzZXJ0IHJEc3QgPT0gbnVsbCB8fCAociAhPSByRHN0IHx8ICFzRHN0LmJldHdlZW4oIHIsIHBEc3QsIHRoaXMgKSApOworICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IHNEc3QgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IHJEc3QgPT0gbnVsbCB8fCBSb290LmR2ID4gMCB8fCBzRHN0LmdldFJvb3RTbG93KCkgPT0gckRzdDsKKyAgICAgICAgYXNzZXJ0IHJEc3QgPT0gbnVsbCB8fCBwRHN0ID49IDAgJiYgcERzdCA8IHNEc3QuZ2V0RW5kUG9zKCk7CisKKyAgICAgICAgYXNzZXJ0CisgICAgICAgICAgICByRHN0ID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAodHJ1ZSB8fCBjaGVja0luc2VydGlvblZhbGlkaXR5KCAwLCBzRHN0LCBwRHN0LCBmYWxzZSApKTsKKworICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CisKKyAgICAgICAgaWYgKHJEc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHJEc3Quc3RhcnRDaGFuZ2UoKTsKKworICAgICAgICAvLyBUaGUgdGV4dCBhZnRlciB0aGUgbG9naWNhbCBlbnRpdHkgdG8gbW92ZS9yZW1vdmUgaXMgbm90IHBhcnQgb2YKKyAgICAgICAgLy8gdGhpcyBvcGVyYXRpb24uICBUcmFuc2ZlciBpdCB0byBhIHByZXZpb3VzIHNwbGF5LiAgTm8gbmVlZCB0bworICAgICAgICAvLyBmcmV0IGFib3V0IGludmFsaWRpdHkgaGVyZSwgYmVjYXVzZSBpdCdzIHRleHQgKmFmdGVyKi4KKworICAgICAgICBpbnQgY2NoU2F2ZWQgPSBzYXZlVGV4dEFmdGVyKCByICk7CisKKyAgICAgICAgLy8gSWYgYW55IHRleHQgd2FzIHNhdmVkLCBJIG5lZWQgdG8gbW92ZSB0aGUgY3Vyc29ycyBhdCB0aGUgYmVnaW5uaW5nCisgICAgICAgIC8vIG9mIHRoaXMgc3BsYXkgdG8gd2hlcmUgdGhlIHRleHQgd2FzIHNhdmVkLiAgSSBkbyB0aGlzIGJlY2F1c2UgdGhpcworICAgICAgICAvLyBjb250ZW50IGlzIGdvaW5nIGF3YXkgYW5kIGN1cnNvcnMgbmVlZCB0byBjb2xsYXBzZSB0byB0aGUgcmlnaHQKKyAgICAgICAgLy8gbG9jYXRpb24gd2hpY2gsIGluIHRoaXMgY2FzZSwgaXMgYmVmb3JlIHRoZSBhZnRlciB0ZXh0LgorICAgICAgICAvLworICAgICAgICAvLyBObyBuZWVkIHRvIGRlYWwgd2l0aCBnb29iZXJzIG90aGVyIHRoYW4gY3Vyc29yIGJlY2F1c2UgYW5ub3RhdGlvbnMKKyAgICAgICAgLy8gYW5kIHR5cGVzIHdpbGwgYmUgZGVhbHQgd2l0aCBhcHByb3ByaWF0ZWx5IGxhdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBBbHNvLCB1cGRhdGUgdGhlIHRhcmdldCBpZiBpdCB3YXMgaW4gdGhlIG1vdmVkIHRleHQhCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE8gLSBpZiBtb3ZpbmcgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCisKKyAgICAgICAgaWYgKGNjaFNhdmVkID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgU3BsYXkgZ290VGV4dCA9IHByZXZOb25BdHRyU3BsYXkoKTsKKworICAgICAgICAgICAgR29vYmVyIG5leHRHb29iZXI7CisgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dEdvb2JlciA9IG5leHRHb29iZXIoIGcgKTsKKworICAgICAgICAgICAgICAgIGlmIChnLmdldEtpbmQoKSA9PSBDVVJTT1IpCisgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBnb3RUZXh0LCBnb3RUZXh0LmdldEVuZFBvcygpIC0gY2NoU2F2ZWQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJEc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTcGxheSBoYWRUZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgaXNCZWdpbigpICYmICFpc0xlYWYoKSA/IGdldEZpbmlzaFNwbGF5KCkgOiB0aGlzOworCisgICAgICAgICAgICAgICAgaWYgKHNEc3QgPT0gaGFkVGV4dCAmJiBwRHN0ID49IGhhZFRleHQuZ2V0RW5kUG9zKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzRHN0ID0gZ290VGV4dDsKKworICAgICAgICAgICAgICAgICAgICBwRHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdFRleHQuZ2V0RW5kUG9zKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjY2hTYXZlZCAtIChwRHN0IC0gaGFkVGV4dC5nZXRFbmRQb3MoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBzRHN0ICE9IHRoaXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc3BsYXksIHVwIHRvIHdoaWNoLCBJIHdpbGwgcmVtb3ZlCisKKyAgICAgICAgU3BsYXkgbGFzdCA9CisgICAgICAgICAgICBpc0JlZ2luKCkgPyBnZXRGaW5pc2hTcGxheSgpLm5leHROb25BdHRyU3BsYXkoKSA6IG5leHRTcGxheSgpOworCisgICAgICAgIC8vCisgICAgICAgIC8vCisgICAgICAgIC8vCisKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOworCisgICAgICAgIGludCBjcCA9IHIuZ2V0Q3AoIHRoaXMgKTsKKyAgICAgICAgaW50IGNjaCA9IDA7CisKKyAgICAgICAgZm9yICggU3BsYXkgcyA9IHRoaXMgOyBzICE9IGxhc3QgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEknbSBnb2luZyB0byBibG93IGF3YXkgdGhlIFR5cGVzIGhlcmUsIG1ha2Ugc3VyZSBJIGhhdmUKKyAgICAgICAgICAgIC8vIGFsbCB0aGUgdGV4dC4KKworICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNMZWFmKCkgfHwgcy5pc05vcm1hbEF0dHIoKTsKKworICAgICAgICAgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQorICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZVZhbHVlVmFsaWQoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzTGVhZigpKQorICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjY2ggKz0gcy5nZXRDY2goKTsKKworICAgICAgICAgICAgR29vYmVyIG5leHRHb29iZXI7CisgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHMuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXh0R29vYmVyID0gcy5uZXh0R29vYmVyKCBnICk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCBnLmdldEtpbmQoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFlQRSA6CisgICAgICAgICAgICAgICAgICAgIGcuZGlzY29ubmVjdCggciApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQU5OT1RBVElPTiA6CisgICAgICAgICAgICAgICAgICAgIGlmIChyRHN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBnLmRpc2Nvbm5lY3QoIHIgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZy5zZXQoIHJEc3QgKTsgLy8gUG90ZW50aWFsIG1vdmUgdG8gYSBuZXcgdHJlZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ1VSU09SIDoKKyAgICAgICAgICAgICAgICAgICAgZy5zZXQoIGxhc3QsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGxheXMgYW5kIHRoZSB0ZXh0LiAgVW5mb3J0dW5hdGVseSwgSSBuZWVkIHRvIHJlbW92ZQorICAgICAgICAvLyB0aGUgdGV4dCBoZXJlLiAgSSBjYW4ndCB0aGluayBvZiBhIHdheSB0byBrZWVwIHRoZSB0cmVlIHZhbGlkIGFuZAorICAgICAgICAvLyBoYXZlIHRoZSB0ZXh0IG1vdmVkIGluIG9uZSBjb3B5IC4uLi4gQ2FuIHlvdT8KKworICAgICAgICBTcGxheSBzUmVtb3ZlZCA9IHIucmVtb3ZlU3BsYXlzKCB0aGlzLCBsYXN0ICk7CisKKyAgICAgICAgU3BsYXkgZmlyc3QgPQorICAgICAgICAgICAgc1JlbW92ZWQuX2xlZnRTcGxheSA9PSBudWxsID8gc1JlbW92ZWQgOiBzUmVtb3ZlZC5fbGVmdFNwbGF5OworCisgICAgICAgIGlmIChmaXJzdC5pc0JlZ2luKCkpCisgICAgICAgICAgICAoKEJlZ2luKSBmaXJzdCkuX2NvbnRhaW5lciA9IG51bGw7CisKKyAgICAgICAgY2hhcltdIHRleHRSZW1vdmVkID0gckRzdCA9PSBudWxsIHx8IGNjaCA9PSAwID8gbnVsbCA6IG5ldyBjaGFyIFsgY2NoIF07CisKKyAgICAgICAgci5fdGV4dC5yZW1vdmUoIGNwLCBjY2gsIHRleHRSZW1vdmVkLCAwICk7CisKKyAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOworCisgICAgICAgIGlmIChyRHN0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNEc3QuaW5zZXJ0KAorICAgICAgICAgICAgICAgIHJEc3QsIHBEc3QsIHNSZW1vdmVkLCB0ZXh0UmVtb3ZlZCwgMCwgY2NoLCBpbnZhbGlkYXRlICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW52YWxpZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSBwYXJlbnRUeXBlID0gY29udGFpbmVyLnBlZWtUeXBlKCk7CisKKyAgICAgICAgICAgIGlmIChwYXJlbnRUeXBlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZS5pbnZhbGlkYXRlRWxlbWVudCggY29udGFpbmVyLCBsYXN0ICk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNBdHRyKCkgJiYgaXNYc2lOaWwoKSkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50VHlwZS5pbnZhbGlkYXRlTmlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgci52YWxpZGF0ZSgpOworICAgICAgICBhc3NlcnQgckRzdCA9PSBudWxsIHx8IHJEc3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoaXMgc3BsYXksIGFsbCBvZiBpdHMgY29udGVudCBhbmQgYXR0cmlidXRlcy4KKyAgICAgKi8KKworICAgIGZpbmFsIHZvaWQgcmVtb3ZlICggUm9vdCByLCBib29sZWFuIGludmFsaWRhdGUgKQorICAgIHsKKyAgICAgICAgbW92ZSggciwgbnVsbCwgbnVsbCwgMCwgaW52YWxpZGF0ZSApOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjb21wbGFpbiAoIFN0cmluZyBtc2cgKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggbXNnICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gaWYgdGhlIGluc2VydGlvbiBvZiBhICJub2RlIiBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpcyBhbGxvd2VkLgorICAgICAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBzb3VyY2UgaXMgYSBzaW5nbGUgcGllY2Ugb2YgY29udGVudHMgKGxpa2UgYSBub2RlKS4KKyAgICAgKiBGcmFnbWVudHMgYXJlIHN0cmluZ3Mgb2YgY29udGVudCwgbm90IGNvbnRhaW5lZCwgYW5kIG11c3Qgbm90IGJlCisgICAgICogdmFsaWRhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNyYyB0byBjb3B5IGlzIGNoYXJhY3RlcnMgKHBvdGVudGlhbGx5IDAgY2hhcnMgdG9vKQorICAgICAqLworCisgICAgZmluYWwgYm9vbGVhbiBjaGVja0luc2VydGlvblZhbGlkaXR5ICgKKyAgICAgICAgaW50IHAsIFNwbGF5IHNEc3QsIGludCBwRHN0LCBib29sZWFuIGVuZE9rICkKKyAgICB7CisgICAgICAgIGFzc2VydCBwID49IDA7CisgICAgICAgIGFzc2VydCBwIDwgZ2V0RW5kUG9zKCk7CisgICAgICAgIGFzc2VydCBwRHN0ID49IDA7CisgICAgICAgIGFzc2VydCBwRHN0IDwgc0RzdC5nZXRFbmRQb3MoKTsKKworICAgICAgICBib29sZWFuIHNyY0NoYXJzID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHAgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWVuZE9rICYmIGlzTGVhZigpICYmIHAgPT0gZ2V0UG9zTGVhZkVuZCgpKQorICAgICAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgbW92ZS9jb3B5L2luc2VydCBhbiBlbmQgdG9rZW4uIiApOworCisgICAgICAgICAgICBzcmNDaGFycyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHZhbGlkIHRleHQgdGFyZ2V0IHdpbGwgYmUgdGVzdGVkIGZvciBmdXJ0aGVyIGRvd24KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc0RvYygpKQorICAgICAgICAgICAgICAgIGNvbXBsYWluKCAiQ2FuJ3QgbW92ZS9jb3B5L2luc2VydCBhIHdob2xlIGRvY3VtZW50LiIgKTsKKworICAgICAgICAgICAgaWYgKGlzRmluaXNoKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFlbmRPaykKKyAgICAgICAgICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBtb3ZlL2NvcHkvaW5zZXJ0IGFuIGVuZCB0b2tlbi4iICk7CisKKyAgICAgICAgICAgICAgICBzcmNDaGFycyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc0ZyYWdtZW50KCkpCisgICAgICAgICAgICAgICAgc3JjQ2hhcnMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3QgPT0gMCAmJiBzRHN0LmlzRG9jKCkpCisgICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IGluc2VydCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4iICk7CisKKyAgICAgICAgaWYgKHAgPiAwICYmIHNEc3QuaXNBdHRyKCkpCisgICAgICAgICAgICBjb21wbGFpbiggIkNhbid0IGluc2VydCB0ZXh0IGJlZm9yZSBhbiBhdHRyaWJ1dGUuIiApOworCisgICAgICAgIGlmIChpc0F0dHIoKSAmJiBwRHN0ID4gMCAmJiAoIXNEc3QuaXNDb250YWluZXIoKSB8fCBwRHN0ICE9IDEpKQorICAgICAgICAgICAgY29tcGxhaW4oICJDYW4ndCBpbnNlcnQgYW4gYXR0cmlidXRlIGluIHRleHQuIiApOworCisgICAgICAgIGlmIChwIDw9IDAgJiYgcERzdCA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNBdHRyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09rID0gc0RzdC5pc0F0dHIoKTsKKworICAgICAgICAgICAgICAgIGlmICghaXNPaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IHQgPSBzRHN0LnByZXZOb25BdHRyU3BsYXkoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0NvbnRhaW5lcigpICYmIHQuZ2V0Q2NoQWZ0ZXIoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNPayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpc09rKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxhaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgbW92ZS9jb3B5L2luc2VydCBhdHRyaWJ1dGUgYWZ0ZXIgYW5vdGhlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBvciBzdGFydCB0b2tlbi4iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc0RzdC5pc0F0dHIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wbGFpbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IG1vdmUvY29weS9pbnNlcnQgYSBub24tYXR0cmlidXRlIGJlZm9yZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbiBhdHRyaWJ1dGUuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNyY0NoYXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydCBpbiB0aGlzIHNwbGF5IGF0IHBvc2l0aW9uIHAgd2hvc2Ugcm9vdCBpcyByIHRoZSBzcGxheXMgcm9vdEluc2VydAorICAgICAqIHdpdGggdGV4dCB0eHQgYXQgb2Zmc2V0IGNwVHh0IGFuZCBsZW5ndGggY2NoVHh0CisgICAgICovCisKKyAgICBmaW5hbCB2b2lkIGluc2VydCAoCisgICAgICAgIFJvb3QgciwgaW50IHAsIFNwbGF5IHJvb3RJbnNlcnQsCisgICAgICAgIE9iamVjdCB0eHQsIGludCBvZmZUeHQsIGludCBjY2hUeHQsCisgICAgICAgIGJvb2xlYW4gaW52YWxpZGF0ZSApCisgICAgeworLy8gQlVHQlVHIC0gd2hhdCBpcyBhIG5ldyB4c2l0eXBlIGF0dHIgaXMgaW5zZXJ0ZWQ/IC0tIG11c3QgZGlzY29ubmVjdCB0eXBlcworCisgICAgICAgIGFzc2VydCBwIDwgZ2V0RW5kUG9zKCk7CisgICAgICAgIGFzc2VydCBjY2hUeHQgPj0gMDsKKyAgICAgICAgYXNzZXJ0IHJvb3RJbnNlcnQgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IHJvb3RJbnNlcnQuX3BhcmVudFNwbGF5ID09IG51bGw7CisgICAgICAgIGFzc2VydCByb290SW5zZXJ0LmdldENjaExlZnQoKSArIHJvb3RJbnNlcnQuZ2V0Q2NoKCkgPT0gY2NoVHh0OworCisgICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgYSB0cmVlIGhlcmUuICBHZXQgdGhlIGZpcnN0IHNwbGF5IGluIHRoZSB0cmVlCisgICAgICAgIC8vIEl0IG11c3QgZWl0aGVyIGJlIGF0IHRoZSByb290IG9yIGp1c3QgdG8gdGhlIGxlZnQgb2YgdGhlIHJvb3QuCisgICAgICAgIC8vIFRoaXMgaXMgdGhlICJjbGFzc2ljIiBkb2cgbGVnIHBhdHRlcm4gSSB1c2UgdG8gcGFzcyBzcGxheSB0cmVlcy4KKworICAgICAgICBhc3NlcnQKKyAgICAgICAgICAgIHJvb3RJbnNlcnQuX2xlZnRTcGxheSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgcm9vdEluc2VydC5fbGVmdFNwbGF5Ll9sZWZ0U3BsYXkgPT0gbnVsbDsKKworICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CisKKyAgICAgICAgU3BsYXkgc0luc2VydCA9CisgICAgICAgICAgICByb290SW5zZXJ0Ll9sZWZ0U3BsYXkgPT0gbnVsbCA/IHJvb3RJbnNlcnQgOiByb290SW5zZXJ0Ll9sZWZ0U3BsYXk7CisKKyAgICAgICAgYXNzZXJ0ICFzSW5zZXJ0LmlzRG9jKCkgJiYgIXNJbnNlcnQuaXNGaW5pc2goKTsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKKworICAgICAgICAvLyBXaGVuIHRoaXMgbWVtYmVyIGlzIGNhbGxlZCwgd2UgYmV0dGVyIGJlIGFibGUgdG8gZG8gdGhlIGluc2VydC4KKworICAgICAgICBhc3NlcnQgdHJ1ZSB8fCBzSW5zZXJ0LmNoZWNrSW5zZXJ0aW9uVmFsaWRpdHkoIDAsIHRoaXMsIHAsIGZhbHNlICk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBmcmFnbWVudCwgdGhlcmUgYmV0dGVyIGJlIHRleHQgaW4gaXQKKworICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNGcmFnbWVudCgpIHx8IHNJbnNlcnQuZ2V0Q2NoKCkgPiAwOworCisgICAgICAgIC8vCisKKyAgICAgICAgU3BsYXkgcyA9IHRoaXM7CisKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNJbnNlcnQuZ2V0Um9vdFNsb3coKSA9PSBudWxsOworCisgICAgICAgIFNwbGF5IHNPcmlnID0gbnVsbDsKKyAgICAgICAgaW50ICAgcE9yaWcgPSAwOworICAgICAgICBpbnQgICBjY2hCeXBhc3NlZCA9IDA7CisKKyAgICAgICAgLy8gUHJlcGFyZSBmb3IgaW5zZXJ0aW5nIGludG8gdGhlIG1pZGRsZSBvZiBhIHNwbGF5CisKKyAgICAgICAgaWYgKHAgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcGxlOworCisgICAgICAgICAgICBpZiAocy5pc0xlYWYoKSAmJiBwIDw9IChwbGUgPSBzLmdldFBvc0xlYWZFbmQoKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcGxlID09IDE7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBwID09IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGNjaFZhbGlkID0gcy5lbnN1cmVDb250ZW50VmFsaWQoKTsKKworICAgICAgICAgICAgICAgICAgICBwICs9IGNjaFZhbGlkOworICAgICAgICAgICAgICAgICAgICBwbGUgKz0gY2NoVmFsaWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuZ2V0RmluaXNoU3BsYXkoKSA9PSBzOworCisgICAgICAgICAgICAgICAgZGVmb2xpYXRlKCByICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgcy5nZXRGaW5pc2hTcGxheSgpICE9IHM7CisKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBwbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzID0gZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy5pbnNlcnQoIHIsIHAsIHJvb3RJbnNlcnQsIHR4dCwgb2ZmVHh0LCBjY2hUeHQsIGludmFsaWRhdGUgKTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gWW91IGNhbiBjb3B5IGFuIGF0dHIgdG8gYSBkc3Qgd2hlcmUgaXQgaXMgdGhlIGZpcnN0IGF0dHIsIG9yCisgICAgICAgICAgICAvLyBhZnRlciBhbGwgcHJlLWV4aXNpdG5nIGF0dHJzLiAgVGhpcyB0aGVzZSBjYXNlcywgcCA9PSAxIG9uCisgICAgICAgICAgICAvLyB0aGUgYmVnaW4uICBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbW92ZSB0ZXh0IGxhdGVyLgorCisgICAgICAgICAgICBhc3NlcnQgIXNJbnNlcnQuaXNBdHRyKCkgfHwgKHAgPT0gMSAmJiBzLmlzQ29udGFpbmVyKCkpOworCisgICAgICAgICAgICBzT3JpZyA9IHM7CisgICAgICAgICAgICBwT3JpZyA9IHA7CisgICAgICAgICAgICBjY2hCeXBhc3NlZCA9IGdldEVuZFBvcygpIC0gcDsKKworICAgICAgICAgICAgcyA9IHMubmV4dE5vbkF0dHJTcGxheSgpOworICAgICAgICAgICAgcCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgcCA9PSAwOworICAgICAgICBhc3NlcnQgIXMuaXNEb2MoKTsKKworICAgICAgICAvLyBHZXQgdGhlIGNvbnRhaW5lciByZWNlaXZpbmcgYWxsIG9mIHRoaXMKKworICAgICAgICBDb250YWluZXIgYyA9IHMuZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgLy8gUnVuIG92ZXIgdGhlIHRvcCBsZXZlbCBjb250ZW50LCBwYXJlbnRpbmcgYW55IEJFR0lOUy4gIEFsc28sCisgICAgICAgIC8vIGNoYXJhY3Rlcml6ZSB0aGUgY29udGVudCBiZWluZyBpbnNlcnRlZCBmb3IgZnV0dXJlIGludmFsaWRhdGlvbi4KKyAgICAgICAgLy8gT25seSBmcmFnbWVudHMgd2lsbCBoYXZlIG11bHRpcGxlIHRvcCBsZXZlbCBiZWdpbnMuCisKKyAgICAgICAgYm9vbGVhbiBpbnNlcnRpbmdFbGVtZW50cyA9IGZhbHNlOworICAgICAgICBib29sZWFuIGluc2VydGluZ1RleHQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBpbnNlcnRpbmdOaWxBdHRyID0gZmFsc2U7CisgICAgICAgIFNwbGF5ICAgaW5zZXJ0aW5nRnJhZ21lbnQgPSBudWxsOworCisgICAgICAgIGZvciAoIFNwbGF5IHQgPSBzSW5zZXJ0IDsgdCAhPSBudWxsIDsgdCA9IHQubmV4dFNwbGF5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodC5pc0JlZ2luKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5zZXJ0aW5nRWxlbWVudHMgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQmVnaW4gYiA9IChCZWdpbikgdDsKKworICAgICAgICAgICAgICAgIGFzc2VydCBiLl9jb250YWluZXIgPT0gbnVsbDsKKworICAgICAgICAgICAgICAgIGIuX2NvbnRhaW5lciA9IGM7CisKKyAgICAgICAgICAgICAgICB0ID0gdC5nZXRGaW5pc2hTcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodC5pc0ZyYWdtZW50KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGluc2VydGluZ0ZyYWdtZW50ID09IG51bGw7CisgICAgICAgICAgICAgICAgaW5zZXJ0aW5nRnJhZ21lbnQgPSB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodC5pc1hzaU5pbCgpKQorICAgICAgICAgICAgICAgIGluc2VydGluZ05pbEF0dHIgPSB0cnVlOworCisgICAgICAgICAgICBpZiAodC5nZXRDY2hBZnRlcigpID4gMCkKKyAgICAgICAgICAgICAgICBpbnNlcnRpbmdUZXh0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgaW5zZXJ0IHRoZSB0ZXh0IChpZiBhbnkpCisKKyAgICAgICAgci5fdGV4dC5pbnNlcnQoIHIuZ2V0Q3AoIHMgKSwgdHh0LCBvZmZUeHQsIGNjaFR4dCApOworCisgICAgICAgIC8vIEluc2VydCB0aGUgdHJlZQorCisgICAgICAgIHIuaW5zZXJ0U3BsYXkoIHJvb3RJbnNlcnQsIHMucHJldlNwbGF5KCkgKTsKKworICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgc3BsYXkgdG8gaXNuZXJ0IHdhcyBhIGZyYWdtZW50LCByZW1vdmUgaXQsIGxlYXZpbmcKKyAgICAgICAgLy8gdGhlIHRleHQgaXQgY2FycmllZCBpbiB0aGUgdHJlZS4gIERvbid0IHBlcmZvcm0gaW52YWxpZGF0aW9uLgorCisgICAgICAgIGlmIChpbnNlcnRpbmdGcmFnbWVudCAhPSBudWxsKQorICAgICAgICAgICAgaW5zZXJ0aW5nRnJhZ21lbnQucmVtb3ZlKCByLCBmYWxzZSApOworCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHBhcmVudCBpZiByZXF1ZXN0ZWQKKworICAgICAgICBpZiAoaW52YWxpZGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSBjVHlwZSA9IGMucGVla1R5cGUoKTsKKworICAgICAgICAgICAgaWYgKGNUeXBlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydGluZ0VsZW1lbnRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY1R5cGUuaW52YWxpZGF0ZUVsZW1lbnQoIGMsIHMgKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW5nVGV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGluc2VydGluZ1RleHQpCisgICAgICAgICAgICAgICAgICAgIGNUeXBlLmludmFsaWRhdGVUZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0aW5nTmlsQXR0cikKKyAgICAgICAgICAgICAgICAgICAgY1R5cGUuaW52YWxpZGF0ZU5pbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgcG9zdCB0ZXh0IHRvIG1vdmUsIG1vdmUgaXQgdG8gdGhlIGVuZCBvZiB0aGUgc3R1ZmYKKyAgICAgICAgLy8gaW5zZXJ0ZWQuICBEb24ndCBkbyB0aGlzIGlzIGlmIGFuIGF0dHIgd2FzIGluc2VydGVkIGJlY2F1c2UgaW4gdGhpcworICAgICAgICAvLyBjYXNlLCB0aGUgYXR0ciBpcyBsb2dpY2FsbHkgYWZ0ZXIgdGhlIHRleHQgdG8gYmUgbW92ZWQgYW55d2F5cy4KKworICAgICAgICBpZiAoc09yaWcgIT0gbnVsbCAmJiAhc0luc2VydC5pc0F0dHIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNjaE1vdmVkID0gc09yaWcubW92ZUNoYXJzKCByLCBwT3JpZywgLTEsIHIsIHMsIDAsIHRydWUgKTsKKyAgICAgICAgICAgIGFzc2VydCBjY2hNb3ZlZCA+IDA7CisgICAgICAgICAgICBhc3NlcnQgY2NoTW92ZWQgPT0gY2NoQnlwYXNzZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBhIGxlYWYgaWYgcG9zc2libGUKKworICAgICAgICBpZiAocy5pc0VuZCgpICYmIHMuZ2V0Q29udGFpbmVyKCkubmV4dE5vbkF0dHJTcGxheSgpID09IHMpCisgICAgICAgICAgICBzLmdldENvbnRhaW5lcigpLmZvbGlhdGUoIHIgKTsKKworICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisKKyAgICAgICAgYXNzZXJ0IHIudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgY29udGVudHMgb2YgdGhpcyAoYXR0cmlidXRlcyBhcyB3ZWxsKSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICAgKiBjb250ZW50cyBvZiBzU3JjLiAgSWYgcHJlc2VydmVUeXBlIGlzIHRydWUsIHRoZW4gdGhlIHhzaTp0eXBlIGF0dHIKKyAgICAgKiBvZiB0aGUgc291cmNlIGlzIG5vdCBjb3BpZWQsIGFuZCB0aGUgeHNpOnR5cGUgb2YgdGhlIHRhcmdldCAodGhpcykKKyAgICAgKiBpcyBub3QgYWx0ZXJlZC4KKyAgICAgKi8KKworICAgIGZpbmFsIHZvaWQgcmVwbGFjZUNvbnRlbnRzICgKKyAgICAgICAgUm9vdCByLCBTcGxheSBzU3JjLCBSb290IHJTcmMsCisgICAgICAgIGJvb2xlYW4gcHJlc2VydmVUeXBlLCBib29sZWFuIHByZXNlcnZlTmFtZXNwYWNlcyApCisgICAgeworICAgICAgICBhc3NlcnQgIWlzRmluaXNoKCkgJiYgIXNTcmMuaXNGaW5pc2goKTsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gcjsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHNTcmMuZ2V0Um9vdFNsb3coKSA9PSByU3JjOworCisgICAgICAgIC8vIElmIHRoZSBzcmMgYW5kIGRzdCBhcmUgdGhlIHNhbWUgc3BsYXksIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbworCisgICAgICAgIGlmICh0aGlzID09IHNTcmMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIHRvIHByZXNlcnZlIG5hbWVzcGFjZSBtYXBwaW5ncywgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAgICAgIC8vIG5hbXNwYWNlcyBpbiBzY29wZSBoZXJlCisKKyAgICAgICAgTWFwIHNvdXJjZU5hbWVzcGFjZXMgPQorICAgICAgICAgICAgcHJlc2VydmVOYW1lc3BhY2VzID8gc1NyYy5sb29rdXBBbGxQcmVmaXhNYXBwaW5ncygpIDogbnVsbDsKKworICAgICAgICAvLyBJZiB0aGUgZGVzdGluYXRpb24gaXMgYSBzaW1wbGUgY29udGFpbmVyIG9mIHRleHQsIHRoZW4gdGhlIGNvbnRlbnQKKyAgICAgICAgLy8gbW9kZWwgaXMgbGltaXRlZCB0byB0ZXh0LiAgSGFuZGxlIHRoaXMgc3BlY2lhbGx5LgorCisgICAgICAgIGlmIChpc0F0dHIoKSB8fCBpc0NvbW1lbnQoKSB8fCBpc1Byb2NpbnN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBEbyB0aGlzIHdpdGhvdXQgY3JlYXRpbmcgYSBzdHJpbmc/CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gc1NyYy5nZXRUZXh0KCByU3JjICk7CisgICAgICAgICAgICBzZXRUZXh0KCByLCBzdHIsIDAsIHN0ci5sZW5ndGgoKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzdGFydENoYW5nZSgpIGhlcmUsIGZjbnMgSSBjYWxsIHdpbGwgZG8gaXQgZm9yIG1lCisKKyAgICAgICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworCisgICAgICAgICAgICAvLyBNYWtlIGNvcHkgb2Ygc291cmNlCisKKyAgICAgICAgICAgIENvcHlDb250ZXh0IGNvcHlDb250ZXh0ID0gc1NyYy5jb3B5U3BsYXlDb250ZW50cyggclNyYyApOworCisgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUsIHRoZW4gZmV0Y2ggaXQuCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCB0aGUgZmlyc3Qgb25lIHdpbnMuCisKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXRYc2lUeXBlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHByZXNlcnZlVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gbmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNYc2lUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFhzaVR5cGUgPSBzLmdldFRleHQoIHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCZWNhdXNlIEkgaGF2ZSByZW1vdmVkIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHRhcmdldCwgSSBjYW4KKyAgICAgICAgICAgIC8vIGluc2VydCBmcmFnbWVudCBvciBub2RlLgorCisgICAgICAgICAgICByZW1vdmVDb250ZW50KCByLCB0cnVlICk7CisKKyAgICAgICAgICAgIGFzc2VydCBpc0xlYWYoKSB8fCBnZXRGaW5pc2hTcGxheSgpID09IG5leHRTcGxheSgpOworICAgICAgICAgICAgYXNzZXJ0IGdldENjaFZhbHVlKCkgPT0gMDsKKworICAgICAgICAgICAgU3BsYXkgY29weSA9IGNvcHlDb250ZXh0LmdldFRyZWUoKTsKKworICAgICAgICAgICAgaWYgKGNvcHkgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbXB1dGUgYSBub3JtYWxpemVkIHNwbGF5L3BvcyB0byBpbnNlcnQgYXQuICBPbmx5CisgICAgICAgICAgICAgICAgLy8gdHdvIGNhc2VzLCBlaXRoZXIgd2UncmUgaW5zZXJ0aW5nIGluIGEgbGVhZiBvciBhCisgICAgICAgICAgICAgICAgLy8gY29udGFpbmVyL2ZpbmlzaCBwYWlyLgorCisgICAgICAgICAgICAgICAgU3BsYXkgaW5zZXJ0U3BsYXkgPSB0aGlzOworICAgICAgICAgICAgICAgIGludCBpbnNlcnRQb3MgPSAxOworCisgICAgICAgICAgICAgICAgaWYgKCFpc0xlYWYoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluc2VydFNwbGF5ID0gbmV4dFNwbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIGluc2VydFBvcyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hhcltdIHRleHRDb3B5ID0gY29weUNvbnRleHQuZ2V0VGV4dCgpOworCisgICAgICAgICAgICAgICAgaW5zZXJ0U3BsYXkuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICByLCBpbnNlcnRQb3MsIGNvcHksCisgICAgICAgICAgICAgICAgICAgIHRleHRDb3B5LCAwLCB0ZXh0Q29weSA9PSBudWxsID8gMCA6IHRleHRDb3B5Lmxlbmd0aCwgdHJ1ZSApOworCisgICAgICAgICAgICAgICAgLy8gTm93LCBnbyB0aG9ydWdoIGFsbCB0aGUgYXR0cnMsIHJlbW92aW5nIHR5cGVzIGFuZCBwbGFjZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBiYWNrIGluLgorCisgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlVHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNwbGF5IG5leHQgPSBuZXh0U3BsYXkoKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gbmV4dCA7IHMuaXNBdHRyKCkgOyBzID0gbmV4dCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1hzaVR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbW92ZSggciwgdHJ1ZSApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFhzaVR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciBhID0gbmV3IEF0dHIoIF94c2lUeXBlICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjY2hUeXBlID0gdGFyZ2V0WHNpVHlwZS5sZW5ndGgoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYS5hZGp1c3RDY2goIGNjaFR5cGUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEVuZFBvcygpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQoIHIsIDEsIGEsIHRhcmdldFhzaVR5cGUsIDAsIGNjaFR5cGUsIHRydWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9uQXR0clNwbGF5KCkuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCAwLCBhLCB0YXJnZXRYc2lUeXBlLCAwLCBjY2hUeXBlLCB0cnVlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc291cmNlTmFtZXNwYWNlcyAhPSBudWxsKQorICAgICAgICAgICAgYXBwbHlOYW1lc3BhY2VzKCByLCBzb3VyY2VOYW1lc3BhY2VzICk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvcHlDb250ZXh0CisgICAgeworICAgICAgICB2b2lkIGNvcHlUZXh0ICggY2hhcltdIHRleHQgKQorICAgICAgICB7CisgICAgICAgICAgICBfdGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNvcHlTcGxheSAoIFNwbGF5IHMsIGJvb2xlYW4gY29weVRleHRBZnRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhcy5pc0RvYygpICYmICFzLmlzUm9vdCgpOworCisgICAgICAgICAgICBTcGxheSB0OworCisgICAgICAgICAgICBzd2l0Y2ggKCBzLmdldEtpbmQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJFR0lOIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOworCisgICAgICAgICAgICAgICAgdCA9IF9mcm9udGllciA9IG5ldyBCZWdpbiggcy5nZXROYW1lKCksIF9mcm9udGllciApOworCisgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0LnRvZ2dsZUlzTGVhZigpOworICAgICAgICAgICAgICAgICAgICBfZnJvbnRpZXIgPSBfZnJvbnRpZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFUVFIgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBYbWxucyggcy5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZVZhbHVlVmFsaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBBdHRyKCBzLmdldE5hbWUoKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ09NTUVOVCA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdCA9IG5ldyBDb21tZW50KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFBST0NJTlNUIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gbmV3IFByb2NpbnN0KCBzLmdldE5hbWUoKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBFTkQgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJlZ2luIGIgPSAoQmVnaW4pIF9mcm9udGllcjsKKyAgICAgICAgICAgICAgICB0ID0gYi5fZW5kID0gbmV3IEVuZCggYiApOworICAgICAgICAgICAgICAgIF9mcm9udGllciA9IF9mcm9udGllci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0IHMuaXNWYWxpZCgpOworCisgICAgICAgICAgICBpbnQgY2NoID0gcy5nZXRDY2hWYWx1ZSgpOworCisgICAgICAgICAgICBpZiAoY29weVRleHRBZnRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2NoQWZ0ZXIgPSBzLmdldENjaEFmdGVyKCk7CisgICAgICAgICAgICAgICAgY2NoICs9IGNjaEFmdGVyOworICAgICAgICAgICAgICAgIHQuYWRqdXN0Q2NoQWZ0ZXIoIGNjaEFmdGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjY2ggPiAwKQorICAgICAgICAgICAgICAgIHQuYWRqdXN0Q2NoKCBjY2ggKTsKKworICAgICAgICAgICAgY29weSggdCApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1heSBiZSBjYWxsZWQgb25jZSBiZWZvcmUgYW55IG90aGVyIGNvcHkKKyAgICAgICAgICovCisKKyAgICAgICAgdm9pZCBjb3B5RnJhZ21lbnQgKCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNjaCA+IDA7CisKKyAgICAgICAgICAgIFNwbGF5IHMgPSBuZXcgRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgcy5hZGp1c3RDY2hBZnRlciggY2NoICk7CisgICAgICAgICAgICBzLmFkanVzdENjaCggY2NoICk7CisKKyAgICAgICAgICAgIGNvcHkoIHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIFNwbGF5IGdldFRyZWUgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBfZnJvbnRpZXIgPT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKF9sYXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGlmIChfZmlyc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDY2hMZWZ0KCBfZmlyc3QuZ2V0Q2NoTGVmdCgpICsgX2ZpcnN0LmdldENjaCgpICk7CisKKyAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KAorICAgICAgICAgICAgICAgICAgICBfZmlyc3QuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgX2ZpcnN0LmdldENkb2NCZWdpbigpICk7CisKKyAgICAgICAgICAgICAgICBfbGFzdC5fbGVmdFNwbGF5ID0gX2ZpcnN0OworICAgICAgICAgICAgICAgIF9maXJzdC5fcGFyZW50U3BsYXkgPSBfbGFzdDsKKworICAgICAgICAgICAgICAgIGlmIChfdGFpbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2xhc3QuYWRqdXN0Q2NoTGVmdCggX3RhaWwuZ2V0Q2NoTGVmdCgpICsgX3RhaWwuZ2V0Q2NoKCkgKTsKKworICAgICAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDZG9jQmVnaW5MZWZ0KAorICAgICAgICAgICAgICAgICAgICAgICAgX3RhaWwuZ2V0Q2RvY0JlZ2luTGVmdCgpICsgX3RhaWwuZ2V0Q2RvY0JlZ2luKCkgKTsKKworICAgICAgICAgICAgICAgICAgICBfZmlyc3QuX3JpZ2h0U3BsYXkgPSBfdGFpbDsKKyAgICAgICAgICAgICAgICAgICAgX3RhaWwuX3BhcmVudFNwbGF5ID0gX2ZpcnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIF9sYXN0OworICAgICAgICB9CisKKyAgICAgICAgY2hhcltdIGdldFRleHQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb3B5ICggU3BsYXkgcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIZXJlIEkgbWFrZSBzdXJlIHRoYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgc3BsYXkgdHJlZSByZXR1cm5lZAorICAgICAgICAgICAgLy8gYnkgdGhlIGNvcHkgaXMgc3VjaCB0aGF0IHRoZSBsYXN0IHNwbGF5IGNvcGllZCBpcyBhdCB0aGUgcm9vdCwKKyAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzcGxheSBjb3BpZWQgaXMgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIGxhc3QgY29waWVkLAorICAgICAgICAgICAgLy8gdGhlIHNlY29uZCB0byBsYXN0IHNwbGF5IGNvcGllZCBpcyB0aGUgcmlnaHQgY2hpbGQgb2YgdGhlIGZpcnN0LAorICAgICAgICAgICAgLy8gYW5kIHRoZSB0aGlyZCB0aHJvdWdoIHRoZSBzZWNvbmQgdG8gbGFzdCBhcmUgYSBsZWZ0IG9ubHkgbGlzdAorICAgICAgICAgICAgLy8gb2ZmIG9mIHRoZSBsZWZ0IGNoaWxkIG9mIHRoZSBzZWNvbmQhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gWW91IG1heSBiZSBhc2tpbmcgeW91ciBzZWxmLCAiU2VsZiwgd2h5IGFsbCB0aGlzIG1hZG5lc3M/IgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNldmVyYWwgcmVhc29ucy4gIEZpcnN0LCBieSBtYWtpbmcgdGhlIGZpcnN0IGhhbmcgb2ZmIHRoZQorICAgICAgICAgICAgLy8gbGVmdCBjaGlsZCBvZiB0aGUgbGFzdCBhbmQgaGF2ZSB0aGUgcmlnaHQgY2hpbGQgb2YgbGFzdCBiZSBudWxsLAorICAgICAgICAgICAgLy8gdGhlIHJvb3Qgd2lsbCBoYXZlIHRoZSB0b3RhbCBzcGxheSBzdGF0aXN0aWNzIGZvciB0aGUgd2hvbGUKKyAgICAgICAgICAgIC8vIHRyZWUuICBTZWNvbmQsIHlvdSBoYXZlIHF1aWNrIGFjY2VzcyB0byB0aGUgZmlyc3Qgc3BsYXkgY29waWVkLgorICAgICAgICAgICAgLy8gVGhpcmQsIGJ1aWxkaW5nIHRoZSB0aGlyZCB0aHJvdWdoIHRoZSBzZWNvbmQgdG8gbGFzdCBkbworICAgICAgICAgICAgLy8gbm90IHJlcXVpcmUgd2Fsa2luZyB0byB1cGRhdGUgc3RhdGljdGljcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBVbHRpbWF0ZWx5LCBJIGRvIHRoaXMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBmb3JtYXQgb2YgdGhlCisgICAgICAgICAgICAvLyB0cmVlIHdoZW4gYSByYW5nZSBvZiBzcGxheXMgYXJlIHJlbW92ZWQgZnJvbSBhIHRyZWUuICBUbyBhdm9pZAorICAgICAgICAgICAgLy8gYW4gYWRkaXRpb25hbCBzcGxheSwgdGhlIHJlbW92YWwgb2YgYSBzdWIgdHJlZSBpcyBzaGFwZWQgbGlrZQorICAgICAgICAgICAgLy8gdGhpcy4KKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGlmIChfbGFzdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gX2xhc3Q7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RhaWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX3RhaWwgPSBfbGFzdDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfbGFzdC5hZGp1c3RDY2hMZWZ0KCBfdGFpbC5nZXRDY2hMZWZ0KCkgKyBfdGFpbC5nZXRDY2goKSApOworCisgICAgICAgICAgICAgICAgICAgIF9sYXN0LmFkanVzdENkb2NCZWdpbkxlZnQoCisgICAgICAgICAgICAgICAgICAgICAgICBfdGFpbC5nZXRDZG9jQmVnaW5MZWZ0KCkgKyBfdGFpbC5nZXRDZG9jQmVnaW4oKSApOworCisgICAgICAgICAgICAgICAgICAgIF9sYXN0Ll9sZWZ0U3BsYXkgPSBfdGFpbDsKKyAgICAgICAgICAgICAgICAgICAgX3RhaWwuX3BhcmVudFNwbGF5ID0gX2xhc3Q7CisgICAgICAgICAgICAgICAgICAgIF90YWlsID0gX2xhc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdCA9IHM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNoYXJbXSAgICBfdGV4dDsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgX2ZpcnN0OworICAgICAgICBwcml2YXRlIFNwbGF5ICAgICBfdGFpbDsKKyAgICAgICAgcHJpdmF0ZSBTcGxheSAgICAgX2xhc3Q7CisgICAgICAgIHByaXZhdGUgQ29udGFpbmVyIF9mcm9udGllcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3BsYXkgKGRlZXBseSkuCisgICAgICogVGhpcyB3aWxsIHVwZGF0ZSBhbnkgaW52YWxpZCBjb250ZW50LgorICAgICAqCisgICAgICogQmVjYXVzZSB0aGlzIGNhbiByZXR1cm4gb25seSB0ZXh0LCBpZiB0aGVyZSBpcyB0ZXh0IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgKiBvZiB0aGUgY29udGVudHMsIEkgd2lsbCBjcmVhdGUgYSBGUkFHIGFzIHRoZSBmaXJzdCBzcGxheSAoYWZ0ZXIgYW55CisgICAgICogYXR0cmlidXRlcykuCisgICAgICovCisKKyAgICBmaW5hbCBDb3B5Q29udGV4dCBjb3B5U3BsYXlDb250ZW50cyAoIFJvb3QgciApCisgICAgeworICAgICAgICBhc3NlcnQgIWlzRmluaXNoKCkgJiYgIWlzWG1sbnMoKTsKKworICAgICAgICBpZiAoaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgIGVuc3VyZUNvbnRlbnRWYWxpZCgpOworICAgICAgICBlbHNlIGlmIChpc05vcm1hbEF0dHIoKSkKKyAgICAgICAgICAgIGVuc3VyZVZhbHVlVmFsaWQoKTsKKworICAgICAgICBDb3B5Q29udGV4dCBjb3B5Q29udGV4dCA9IG5ldyBDb3B5Q29udGV4dCgpOworCisgICAgICAgIGlmIChpc0NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2NoQXR0cnMgPSAwOworCisgICAgICAgICAgICBTcGxheSB0ID0gbmV4dFNwbGF5KCksIHMgPSB0OworCisgICAgICAgICAgICBmb3IgKCA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weVNwbGF5KCBzLCBmYWxzZSApOworICAgICAgICAgICAgICAgIGNjaEF0dHJzICs9IHMuZ2V0Q2NoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IGlzTGVhZigpID8gZ2V0Q2NoVmFsdWUoKSA6IGdldENjaEFmdGVyKCk7CisKKyAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA+IDApCisgICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weUZyYWdtZW50KCBjY2hWYWx1ZSApOworCisgICAgICAgICAgICBpbnQgY2NoQ29udGVudHMgPSAwOworCisgICAgICAgICAgICBpZiAoIWlzTGVhZigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNwbGF5IGZpbmlzaCA9IGdldEZpbmlzaFNwbGF5KCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSB1ID0gcyA7IHUgIT0gZmluaXNoIDsgdSA9IHUubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weVNwbGF5KCB1LCB0cnVlICk7CisgICAgICAgICAgICAgICAgICAgIGNjaENvbnRlbnRzICs9IHUuZ2V0Q2NoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY2NoQWxsID0gY2NoQXR0cnMgKyBjY2hWYWx1ZSArIGNjaENvbnRlbnRzOworCisgICAgICAgICAgICBpZiAoY2NoQWxsID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCA9IG5ldyBjaGFyIFsgY2NoQWxsIF07CisKKyAgICAgICAgICAgICAgICBpbnQgY3AgPSByLmdldENwKCB0aGlzICk7CisgICAgICAgICAgICAgICAgaW50IGNjaCA9IGdldENjaCgpOworCisgICAgICAgICAgICAgICAgaWYgKGNjaEF0dHJzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggdGV4dCwgMCwgY3AgKyBjY2gsIGNjaEF0dHJzICk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2NoVmFsdWUgPiAwKQorICAgICAgICAgICAgICAgICAgICByLl90ZXh0LmZldGNoKCB0ZXh0LCBjY2hBdHRycywgY3AsIGNjaFZhbHVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2NoQ29udGVudHMgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIGNjaEF0dHJzICsgY2NoVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjcCArIGNjaCArIGNjaEF0dHJzLCBjY2hDb250ZW50cyApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvcHlDb250ZXh0LmNvcHlUZXh0KCB0ZXh0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaXNOb3JtYWxBdHRyKCkgfHwgaXNDb21tZW50KCkgfHwgaXNQcm9jaW5zdCgpOworCisgICAgICAgICAgICBpbnQgY2NoVmFsdWUgPSBnZXRDY2hWYWx1ZSgpOworCisgICAgICAgICAgICBpZiAoY2NoVmFsdWUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvcHlDb250ZXh0LmNvcHlGcmFnbWVudCggY2NoVmFsdWUgKTsKKworICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0ID0gbmV3IGNoYXIgWyBjY2hWYWx1ZSBdOworCisgICAgICAgICAgICAgICAgci5fdGV4dC5mZXRjaCggdGV4dCwgMCwgci5nZXRDcCggdGhpcyApLCBjY2hWYWx1ZSApOworCisgICAgICAgICAgICAgICAgY29weUNvbnRleHQuY29weVRleHQoIHRleHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3B5Q29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhpcyBzcGxheSAoZGVlcGx5KS4gIEFsc28gY29waWVzIGF0dHJpYnV0ZXMgYWZ0ZXIgYSBiZWdpbgorICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgYW55IGludmFsaWQgY29udGVudC4KKyAgICAgKi8KKworICAgIGZpbmFsIFNwbGF5IGNvcHlTcGxheSAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCAhaXNEb2MoKSAmJiAhaXNGaW5pc2goKTsKKworICAgICAgICAvLyBDb21wdXRlIHNwbGF5IHRvIHN0b3AgYXQgKGRvZXMgbm90IGdldCBjb3BpZWQpLiAgQWxzbyBjb21wdXRlCisgICAgICAgIC8vIGEgc3BsYXksIHRvIGJlIGNvcGllZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXZlIGl0J3MgdGV4dCBhZnRlciBjb3BpZWQuCisKKyAgICAgICAgU3BsYXkgc3RvcEhlcmUsIG5vVGV4dEFmdGVyOworCisgICAgICAgIGlmIChpc0JlZ2luKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vVGV4dEFmdGVyID0gZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgIHN0b3BIZXJlID0gbm9UZXh0QWZ0ZXIubmV4dE5vbkF0dHJTcGxheSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9UZXh0QWZ0ZXIgPSBudWxsOworICAgICAgICAgICAgc3RvcEhlcmUgPSBuZXh0U3BsYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2UgdGhlIGNvcHkKKworICAgICAgICBDb3B5Q29udGV4dCBjb3B5Q29udGV4dCA9IG5ldyBDb3B5Q29udGV4dCgpOworCisgICAgICAgIGZvciAoIFNwbGF5IG5leHQsIHMgPSB0aGlzIDsgcyAhPSBzdG9wSGVyZSA7IHMgPSBuZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCA9IHMubmV4dFNwbGF5KCk7CisKKyAgICAgICAgICAgIGNvcHlDb250ZXh0LmNvcHlTcGxheSggcywgcyAhPSBub1RleHRBZnRlciApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvcHlDb250ZXh0LmdldFRyZWUoKTsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3BsYXkgcyA9IG5leHRTcGxheSgpOworCisgICAgICAgICAgICBpZiAoIXMuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHMucmVtb3ZlKCByLCB0cnVlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBjb250ZW50IGZyb20gc3BsYXkuCisgICAgICogQmVnaW4gd2lsbCBiZSBhIGxlYWYgdXBvbiBleGl0LgorICAgICAqLworCisgICAgZmluYWwgdm9pZCByZW1vdmVDb250ZW50ICggUm9vdCByLCBib29sZWFuIHJlbW92ZUF0dHJzICkKKyAgICB7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRSb290U2xvdygpID09IHI7CisKKyAgICAgICAgci5zdGFydENoYW5nZSgpOworCisgICAgICAgIGlmIChpc0ludmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdG9nZ2xlSXNJbnZhbGlkKCk7CisKKyAgICAgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKKworICAgICAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkgJiYgcmVtb3ZlQXR0cnMpCisgICAgICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlcyggciApOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRE9DIDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkVHSU4gOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNMZWFmKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2hhcnMoIHIsIDEsIGdldENjaFZhbHVlKCkgKTsKKworICAgICAgICAgICAgICAgIGlmIChyZW1vdmVBdHRycykKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlcyggciApOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQVRUUiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc1htbG5zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciByZW1vdmVDb250ZW50IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBjYXNlIENPTU1FTlQgIDoKKyAgICAgICAgY2FzZSBQUk9DSU5TVCA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2hWYWx1ZSA9IGdldENjaFZhbHVlKCk7CisKKyAgICAgICAgICAgIGlmIChjY2hWYWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgci5fdGV4dC5yZW1vdmUoIHIuZ2V0Q3AoIHRoaXMgKSwgY2NoVmFsdWUgKTsKKworICAgICAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIC0gY2NoVmFsdWUgKTsKKworICAgICAgICAgICAgaWYgKGdldEtpbmQoKSA9PSBBVFRSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNYc2lUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmRpc2Nvbm5lY3RUeXBlcyggciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciByZW1vdmVDb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBpc0RvYygpIHx8IChpc0JlZ2luKCkgJiYgIWlzTGVhZigpKTsKKworICAgICAgICBTcGxheSBzID0gbmV4dE5vbkF0dHJTcGxheSgpOworCisgICAgICAgIGlmIChzLmlzUm9vdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaXNEb2MoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSBzcGxheXMuICBJbmhpYml0IGludmFsaWRhdGlvbiBvbiBlYWNoIHJlbW92ZSB0bworICAgICAgICAgICAgLy8gcHJldmVudCBhIGZsb29kIG9mIGludmFsaWRhdGlvbnMgdG8gdGhlIHBhcmVudCB0eXBlIChpZiB0aGVyZSkuCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBTcGxheSBuZXh0OworICAgICAgICAgICAgZm9yICggcyA9IG5leHROb25BdHRyU3BsYXkoKSA7ICFzLmlzRmluaXNoKCkgOyBzID0gbmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFzLmlzQXR0cigpOworCisgICAgICAgICAgICAgICAgaWYgKHMuaXNMZWFmKCkpCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBzLm5leHROb25BdHRyU3BsYXkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHMuZ2V0RmluaXNoU3BsYXkoKS5uZXh0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICAgICAgcy5yZW1vdmUoIHIsIGZhbHNlICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIYXZlIHRvIHJlbW92ZSB0aGUgdGV4dCBhZnRlciB0aGlzIGhlcmUgYmVjYXVzZSB0aGUgYWJvdmUKKyAgICAgICAgICAgIC8vIHJlbW92ZXMgY291bGQgaGF2ZSBzdXVmZmxlZCB0ZXh0IHRvIGFmdGVyIHRoaXMuCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBhc3NlcnQgIWlzTGVhZigpOworCisgICAgICAgICAgICBpZiAoZ2V0Q2NoQWZ0ZXIoKSA+IDApCisgICAgICAgICAgICAgICAgcmVtb3ZlVGV4dEFmdGVyKCByICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUcmlja3kgY29kZS4gIE1lcmdlIHRoZSBFTkQgYW5kIHRoZSBCRUdJTiB0byBmb3JtIGEgbGVhZi4KKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCisgICAgICAgICAgICAgICAgZm9saWF0ZSggciApOworCisgICAgICAgICAgICBpbnZhbGlkYXRlVGV4dCgpOworCisgICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisgICAgICAgIH0KKworLy8gVE9ETyAtIGlmIHJlbW92aW5nIHRleHQgZnJvbSB4c2k6dHlwZSBvciBuaWwgbXVzdCBkbyBzdHVmZgorLy8gVE9ETyAtIGlmIHJlbW92aW5nIHRleHQgZnJvbSB4c2k6dHlwZSBvciBuaWwgbXVzdCBkbyBzdHVmZgorLy8gVE9ETyAtIGlmIHJlbW92aW5nIHRleHQgZnJvbSB4c2k6dHlwZSBvciBuaWwgbXVzdCBkbyBzdHVmZgorLy8gVE9ETyAtIGlmIHJlbW92aW5nIHRleHQgZnJvbSB4c2k6dHlwZSBvciBuaWwgbXVzdCBkbyBzdHVmZgorLy8gVE9ETyAtIGlmIHJlbW92aW5nIHRleHQgZnJvbSB4c2k6dHlwZSBvciBuaWwgbXVzdCBkbyBzdHVmZgorCisKKy8vIFRPRE8gLSBpZiByZW1vdmluZyBhdHRyaWJ1dGUgeHNpOnR5cGUgb3IgeHNpOm5pbCwgbXVzdCBkbyBzdHVpZmYKKy8vIFRPRE8gLSBpZiByZW1vdmluZyBhdHRyaWJ1dGUgeHNpOnR5cGUgb3IgeHNpOm5pbCwgbXVzdCBkbyBzdHVpZmYKKy8vIFRPRE8gLSBpZiByZW1vdmluZyBhdHRyaWJ1dGUgeHNpOnR5cGUgb3IgeHNpOm5pbCwgbXVzdCBkbyBzdHVpZmYKKy8vIFRPRE8gLSBpZiByZW1vdmluZyBhdHRyaWJ1dGUgeHNpOnR5cGUgb3IgeHNpOm5pbCwgbXVzdCBkbyBzdHVpZmYKKy8vIFRPRE8gLSBpZiByZW1vdmluZyBhdHRyaWJ1dGUgeHNpOnR5cGUgb3IgeHNpOm5pbCwgbXVzdCBkbyBzdHVpZmYKKworICAgICAgICBpZiAocmVtb3ZlQXR0cnMpCisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVzKCByICk7CisKKyAgICAgICAgLy8gSWYgdGhlIHRyZWUgYmVjYW1lIGVtcHR5LCByZXNldCBfbGVmdE9ubHkKKworICAgICAgICBpZiAoci5fbGVmdFNwbGF5ID09IHIuX2RvYyAmJiByLl9kb2MuX3JpZ2h0U3BsYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHIuX2xlZnRPbmx5ID0gdHJ1ZTsKKworICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgY29weUNoYXJzICgKKyAgICAgICAgUm9vdCByLCBpbnQgcCwgaW50IGNjaCwgUm9vdCByRHN0LCBTcGxheSBzRHN0LCBpbnQgcERzdCApCisgICAgeworICAgICAgICBhc3NlcnQgcERzdCA+IDAgJiYgcERzdCA8PSBzRHN0LmdldEVuZFBvcygpOworCisgICAgICAgIGludCBwb3N0Q2NoID0gZ2V0UG9zdENjaCggcCApOworCisgICAgICAgIGlmIChwID09IDAgfHwgY2NoID09IDAgfHwgcG9zdENjaCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgaWYgKGNjaCA8IDAgfHwgY2NoID4gcG9zdENjaCkKKyAgICAgICAgICAgIGNjaCA9IHBvc3RDY2g7CisKKyAgICAgICAgYXNzZXJ0IGNjaCA+IDA7CisKKy8vIFRPRE8gLSB1c2VzIHN0cmluZyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNvdXJjZSBhbmQgZGVzdCBmcm9tIHNhbWUgYnVmZmVyCisvLyAgICAgICAgcmV3cml0ZSB0byBub3QgY3JlYXRlIHN0cmluZyBvYmplY3QKKworICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhciBbIGNjaCBdOworCisgICAgICAgIHIuX3RleHQuZmV0Y2goIGNoYXJzLCAwLCBnZXRDcEZvclBvcyggciwgcCApLCBjY2ggKTsKKworICAgICAgICBzRHN0Lmluc2VydENoYXJzKCBwRHN0LCByRHN0LCBjaGFycywgMCwgY2NoICk7CisKKyAgICAgICAgcmV0dXJuIGNjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb3ZlIGNjaCBjaGFycyBmcm9tIHBvcyBwIG9uIHRoaXMgc3BsYXkgdG8gcG9zIHBEc3Qgb24gc0RzdC4KKyAgICAgKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGNhbiBiZSBkaWZmZXJlbnQgZG9jdW1lbnRzLiAgTm9ybWFsbHkgY3Vyc29ycworICAgICAqIHN0YXkgcHV0IHdoZW4gdGhlaXIgY2hhciBpcyBtb3ZlZCwgYnV0IG1vdmVDdXJzb3JzIGNhbiBjYXVzZSBjdXJzb3JzCisgICAgICogdG9tb3ZlIHdpdGggdGhlIGNoYXJzICh1c2VkIGludGVybmFsbHkpLgorICAgICAqLworCisgICAgZmluYWwgaW50IG1vdmVDaGFycyAoCisgICAgICAgIFJvb3QgciwgaW50IHAsIGludCBjY2gsIFJvb3QgckRzdCwgU3BsYXkgc0RzdCwgaW50IHBEc3QsCisgICAgICAgIGJvb2xlYW4gbW92ZUN1cnNvcnMgKQorICAgIHsKKyAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGludCBwb3N0Q2NoID0gZ2V0UG9zdENjaCggcCApOworCisgICAgICAgIGlmIChjY2ggPT0gMCB8fCBwb3N0Q2NoID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoY2NoIDwgMCB8fCBjY2ggPiBwb3N0Q2NoKQorICAgICAgICAgICAgY2NoID0gcG9zdENjaDsKKworICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CisgICAgICAgIHJEc3Quc3RhcnRDaGFuZ2UoKTsKKworICAgICAgICBhc3NlcnQgY2NoID4gMDsKKworICAgICAgICAvLyBJIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIGludmFsaWRpdHkgb2YgdGhlIHNvdXJjZSBiZWNhdXNlIHRoZQorICAgICAgICAvLyBvbmx5IGludmFsaWQgdGV4dCBJIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGlzIHRoYXQgaW4gYSBsZWFmLCBhbmQKKyAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBpcyBpbiBhIGxlYWYgaGVyZSwgdGhlbiBpdCBtdXN0IGJlIHBvc2l0aW9uZWQgYXQgdGhlCisgICAgICAgIC8vIGVuZCAoMSkgd2hpY2ggaXMgbm90IHNlbnNpdGl2ZSB0byB0aGUgaW52YWxpZGl0eS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSG93ZXZlciwgSSBtdWNoIGNoZWNrIHRoZSBkZXN0aW5hdGlvbiBmb3IgdmFsaWRpdHkgYmVjYXVzZSBJIG1heQorICAgICAgICAvLyBiZSBhcHBlbmRpbmcgdGV4dCB0byBhbiBleGlzdGluZyB2YWx1ZS4KKworICAgICAgICBpZiAoc0RzdC5pc0NvbnRhaW5lcigpICYmIHBEc3QgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNjaFZhbGlkID0gc0RzdC5lbnN1cmVDb250ZW50VmFsaWQoKTsKKworICAgICAgICAgICAgcERzdCArPSBjY2hWYWxpZDsKKworICAgICAgICAgICAgaWYgKHNEc3QgPT0gdGhpcyAmJiBwID09IDEpCisgICAgICAgICAgICAgICAgcCArPSBjY2hWYWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKHBEc3QgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc0RzdCA9IHNEc3QucHJldk5vbkF0dHJTcGxheSgpOworICAgICAgICAgICAgcERzdCA9IHNEc3QuZ2V0RW5kUG9zKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgZGVzdGluYXRpb24gaWYgaW4gdGhlIHJhbmdlIG9mIHRoZSBzb3VyY2UsIHRoZW4gdGhpcyBpcworICAgICAgICAvLyBlZmZlY3RpdmVseSBhIG5vLW9wLgorCisvLyBUT0RPIC0gUHJvYmFibHkgc2hvdWxkIGRpc2Nvbm5lY3QgVHlwZXMgaW4gdGhlIHJhbmdlCisKKyAgICAgICAgaWYgKHNEc3QgPT0gdGhpcyAmJiBwRHN0ID49IHAgJiYgcERzdCA8PSBwICsgY2NoKQorICAgICAgICAgICAgcmV0dXJuIGNjaDsKKworICAgICAgICBhc3NlcnQgcERzdCA+IDA7CisKKyAgICAgICAgQ29udGFpbmVyIGNEc3QgPSBzRHN0LmdldENvbnRhaW5lciggcERzdCApOworICAgICAgICBDb250YWluZXIgYyA9IGdldENvbnRhaW5lciggcCApOworCisgICAgICAgIC8vIE1vdmUgdGhlIHRleHQKKworICAgICAgICByRHN0Ll90ZXh0Lm1vdmUoCisgICAgICAgICAgICBzRHN0LmdldENwRm9yUG9zKCByRHN0LCBwRHN0ICksIHIuX3RleHQsIGdldENwRm9yUG9zKCByLCBwICksIGNjaCApOworCisgICAgICAgIC8vIFBlcmZvcm0gdGhlICJpbnNlcnRpb24iIGZpcnN0CisKKyAgICAgICAgaWYgKCFzRHN0LmlzTGVhZigpIHx8IHBEc3QgPiBzRHN0LmdldFBvc0xlYWZFbmQoKSkKKyAgICAgICAgICAgIHNEc3QuYWRqdXN0Q2NoQWZ0ZXIoIGNjaCApOworCisgICAgICAgIHJEc3QudXBkYXRlQ2NoKCBzRHN0LCBjY2ggKTsKKworICAgICAgICBmb3IgKCBHb29iZXIgZyA9IHNEc3QuZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7CisgICAgICAgICAgICAgIGcgPSBzRHN0Lm5leHRHb29iZXIoIGcgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7CisKKyAgICAgICAgICAgIGlmIChncCA+PSBwRHN0KQorICAgICAgICAgICAgICAgIGcuc2V0KCBncCArIGNjaCApOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHNEc3QgIT0gdGhpcyB8fCBwRHN0IDwgcCB8fCBwRHN0ID4gcCArIGNjaDsKKworICAgICAgICBpZiAoc0RzdCA9PSB0aGlzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcERzdFNhdmUgPSBwRHN0OworCisgICAgICAgICAgICBpZiAocERzdCA+IHAgKyBjY2gpCisgICAgICAgICAgICAgICAgcERzdCAtPSBjY2g7CisKKyAgICAgICAgICAgIGlmIChwID49IHBEc3RTYXZlKQorICAgICAgICAgICAgICAgIHAgKz0gY2NoOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlbiBwZXJmb3JtIHRoZSAicmVtb3ZhbCIKKworICAgICAgICBpZiAoIWlzTGVhZigpIHx8IHAgPiBnZXRQb3NMZWFmRW5kKCkpCisgICAgICAgICAgICBhZGp1c3RDY2hBZnRlciggLSBjY2ggKTsKKworICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgLSBjY2ggKTsKKworICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKKyAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOworCisgICAgICAgICAgICBpZiAoZ3AgPj0gcCArIGNjaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnLnNldCggZ3AgLSBjY2ggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGdwID49IHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFtb3ZlQ3Vyc29ycyAmJiBnLmdldEtpbmQoKSA9PSBDVVJTT1IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBnZXRFbmRQb3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBuZXh0U3BsYXkoKSwgMCApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGcuc2V0KCByRHN0LCBzRHN0LCBwRHN0ICsgZ3AgLSBwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjRHN0LmludmFsaWRhdGVUZXh0KCk7CisgICAgICAgIGMuaW52YWxpZGF0ZVRleHQoKTsKKworICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisgICAgICAgIHJEc3QuaW52YWxpZGF0ZVZlcnNpb24oKTsKKworICAgICAgICByZXR1cm4gY2NoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBjY2ggY2hhcnMgc3RhcnRpbmcgYXQgcG9zaXRpb24gcCBvbiB0aGlzIHNwbGF5LgorICAgICAqLworCisgICAgZmluYWwgaW50IHJlbW92ZUNoYXJzICggUm9vdCByLCBpbnQgcCwgaW50IGNjaCApCisgICAgeworICAgICAgICBpbnQgbWF4UG9zID0gZ2V0TWF4UG9zKCk7CisKKyAgICAgICAgYXNzZXJ0IHAgPiAwICYmIHAgPD0gbWF4UG9zOworCisgICAgICAgIGlmIChwID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CisKKy8vIFRPRE8gLSBtZXJnZSB0aGUgdHdvIGZvbGxvd2luZyBjaHVua3Mgb2YgY29kZT8/Pz8/PworCisgICAgICAgIGlmIChpc0xlYWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBsZSA9IGdldFBvc0xlYWZFbmQoKTsKKworICAgICAgICAgICAgaWYgKHAgPD0gcGxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjY2ggPCAwIHx8IHBsZSAtIHAgPCBjY2gpCisgICAgICAgICAgICAgICAgICAgIGNjaCA9IHBsZSAtIHA7CisKKyAgICAgICAgICAgICAgICBpZiAoY2NoID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgci5fdGV4dC5yZW1vdmUoIHIuZ2V0Q3AoIHRoaXMgKSArIHAgLSAxLCBjY2ggKTsKKworICAgICAgICAgICAgICAgIHIudXBkYXRlQ2NoKCB0aGlzLCAtIGNjaCApOworCisgICAgICAgICAgICAgICAgR29vYmVyIG5leHRHb29iZXI7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBHb29iZXIgZyA9IGZpcnN0R29vYmVyKCkgOyBnICE9IG51bGwgOyBnID0gbmV4dEdvb2JlciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICAgICAgICAgIGludCBrID0gZy5nZXRLaW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBncCA9IGcuZ2V0UG9zKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdwID49IHAgKyBjY2gpCisgICAgICAgICAgICAgICAgICAgICAgICBnLnNldCggZ3AgLSBjY2ggKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3AgPj0gcCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gQ1VSU09SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc2V0KCBwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGsgPT0gQU5OT1RBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmRpc2Nvbm5lY3QoIHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVUZXh0KCk7CisKKyAgICAgICAgICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2NoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHBvc0FmdGVyID0gZ2V0UG9zQWZ0ZXIoKTsKKworICAgICAgICBhc3NlcnQgcCA+PSBwb3NBZnRlcjsKKworICAgICAgICBpbnQgbWF4Q2NoID0gbWF4UG9zIC0gcCArIDE7CisKKyAgICAgICAgYXNzZXJ0IG1heENjaCA+PSAwOworCisgICAgICAgIGlmIChjY2ggPCAwIHx8IGNjaCA+IG1heENjaCkKKyAgICAgICAgICAgIGNjaCA9IG1heENjaDsKKworICAgICAgICBpZiAoY2NoIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBDb250YWluZXIgYyA9IGdldENvbnRhaW5lciggcCApOworCisgICAgICAgIHIuX3RleHQucmVtb3ZlKCBnZXRDcEZvclBvcyggciwgcCApLCBjY2ggKTsKKworICAgICAgICBhZGp1c3RDY2hBZnRlciggLSBjY2ggKTsKKworICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgLSBjY2ggKTsKKworICAgICAgICBHb29iZXIgbmV4dEdvb2JlcjsKKyAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0R29vYmVyID0gbmV4dEdvb2JlciggZyApOworCisgICAgICAgICAgICBpbnQgayA9IGcuZ2V0S2luZCgpOworICAgICAgICAgICAgaW50IGdwID0gZy5nZXRQb3MoKTsKKworICAgICAgICAgICAgaWYgKGdwID49IHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGsgPT0gQ1VSU09SKQorICAgICAgICAgICAgICAgICAgICBnLnNldCggbmV4dE5vbkF0dHJTcGxheSgpLCAwICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnLmRpc2Nvbm5lY3QoIHIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGMuaW52YWxpZGF0ZVRleHQoKTsKKworICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisKKyAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisKKyAgICAgICAgcmV0dXJuIGNjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgdGV4dCBhIHBvc2l0aW9uIHAgaW4gdGhpcyBzcGxheQorICAgICAqLworCisgICAgZmluYWwgdm9pZCBpbnNlcnRDaGFycyAoIGludCBwLCBSb290IHIsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHAgPiAwICYmIHAgPD0gZ2V0RW5kUG9zKCk7CisKKyAgICAgICAgaWYgKGNjaCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKKworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCBwICk7CisKKyAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkgJiYgcCA9PSAxKQorICAgICAgICAgICAgcCArPSBlbnN1cmVDb250ZW50VmFsaWQoKTsKKworICAgICAgICByLl90ZXh0Lmluc2VydCggZ2V0Q3BGb3JQb3MoIHIsIHAgKSwgdHh0LCBvZmYsIGNjaCApOworCisgICAgICAgIGlmIChwID49IGdldFBvc0FmdGVyKCkpCisgICAgICAgICAgICBhZGp1c3RDY2hBZnRlciggY2NoICk7CisKKyAgICAgICAgci51cGRhdGVDY2goIHRoaXMsIGNjaCApOworCisgICAgICAgIGZvciAoIEdvb2JlciBnID0gZmlyc3RHb29iZXIoKSA7IGcgIT0gbnVsbCA7IGcgPSBuZXh0R29vYmVyKCBnICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ3AgPSBnLmdldFBvcygpOworCisgICAgICAgICAgICBpZiAoZ3AgPj0gcCkKKyAgICAgICAgICAgICAgICBnLnNldCggZ3AgKyBjY2ggKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRhaW5lci5pbnZhbGlkYXRlVGV4dCgpOworCisgICAgICAgIHIuaW52YWxpZGF0ZVZlcnNpb24oKTsKKworICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1RBVEUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTUEFDRV9TRUVOX1NUQVRFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9TUEFDRV9TVEFURSA9IDI7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IHNjcnViVGV4dCgKKyAgICAgICAgVGV4dCB0ZXh0LCBpbnQgd3MsIGludCBjcCwgaW50IGNjaCwgU3RyaW5nQnVmZmVyIHNiLCBpbnQgc3RhdGUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKKworICAgICAgICBpZiAodGV4dC5fYnVmID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjY2ggPT0gMDsKKyAgICAgICAgICAgIGFzc2VydCBjcCA9PSAwOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNjaCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworCisgICAgICAgIGJvb2xlYW4gcmVwbGFjZSA9IGZhbHNlOworICAgICAgICBib29sZWFuIGNvbGxhcHNlID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoICggd3MgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX1VOU1BFQ0lGSUVEIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX1BSRVNFUlZFICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX1JFUExBQ0UgICAgIDogICAgICAgICAgICByZXBsYWNlID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgVHlwZVN0b3JlLldTX0NPTExBUFNFICAgIDogY29sbGFwc2UgPSByZXBsYWNlID0gdHJ1ZTsgYnJlYWs7CisKKwkJZGVmYXVsdCA6IGFzc2VydCBmYWxzZTogIlVua25vd24gd2hpdGUgc3BhY2UgcnVsZSAiICt3czsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVwbGFjZSAmJiAhY29sbGFwc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRleHQuZmV0Y2goc2IsIGNwLCBjY2gpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgaW50IG9mZiA9IHRleHQudW5PYnNjdXJlKCBjcCwgY2NoICk7CisgICAgICAgIGludCBzdGFydHB0ID0gMDsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgY2NoIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuX2J1Zlsgb2ZmICsgaSBdOworCisgICAgICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXh0Ll9idWYsIG9mZiArIHN0YXJ0cHQsIGkgLSBzdGFydHB0KTsKKyAgICAgICAgICAgICAgICBzdGFydHB0ID0gaSArIDE7CisKKyAgICAgICAgICAgICAgICBpZiAoY29sbGFwc2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9TUEFDRV9TVEFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1BBQ0VfU0VFTl9TVEFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU1BBQ0VfU0VFTl9TVEFURSkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAnICcgKTsKKworICAgICAgICAgICAgICAgIHN0YXRlID0gTk9TUEFDRV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCggdGV4dC5fYnVmLCBvZmYgKyBzdGFydHB0LCBjY2ggLSBzdGFydHB0ICk7CisKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBnZXRUZXh0ICggUm9vdCByICkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRUZXh0KCByLCBUeXBlU3RvcmUuV1NfUFJFU0VSVkUgKTsKKyAgICB9CisKKy8vICAgIGZpbmFsIGludCBnZXRUZXh0ICggUm9vdCByLCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkKKy8vICAgIHsKKy8vICAgICAgICBpZiAobGVuIDw9IDApCisvLyAgICAgICAgICAgIHJldHVybiAwOworLy8KKy8vICAgICAgICBpZiAoaXNJbnZhbGlkKCkpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBpZiAoaXNOb3JtYWxBdHRyKCkpCisvLyAgICAgICAgICAgICAgICBlbnN1cmVWYWx1ZVZhbGlkKCk7CisvLyAgICAgICAgICAgIGVsc2UgaWYgKGlzTGVhZigpKQorLy8gICAgICAgICAgICAgICAgZW5zdXJlQ29udGVudFZhbGlkKCk7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBpbnQgY3AgPSByLmdldENwKCB0aGlzICk7CisvLworLy8gICAgICAgIGlmIChpc05vcm1hbEF0dHIoKSB8fCBpc0NvbW1lbnQoKSB8fCBpc1Byb2NpbnN0KCkgfHwgaXNMZWFmKCkpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBpbnQgY2NoID0gZ2V0Q2NoVmFsdWUoKTsKKy8vCisvLyAgICAgICAgICAgIGlmIChjY2ggPT0gMCkKKy8vICAgICAgICAgICAgICAgIHJldHVybiAwOworLy8KKy8vICAgICAgICAgICAgaWYgKGNjaCA+IGxlbikKKy8vICAgICAgICAgICAgICAgIGNjaCA9IGxlbjsKKy8vCisvLyAgICAgICAgICAgIHIuX3RleHQuZmV0Y2goIGJ1Ziwgb2ZmLCBwb3MsIGNjaCApOworLy8KKy8vICAgICAgICAgICAgcmV0dXJuIGNjaDsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIGlmICghaXNDb250YWluZXIoKSkKKy8vICAgICAgICAgICAgcmV0dXJuIDA7CisvLworLy8gICAgICAgIGludCBvcmlnaW5hbExlbiA9IGxlbjsKKy8vICAgICAgICBTcGxheSBsYXN0ID0gZ2V0RmluaXNoU3BsYXkoKTsKKy8vCisvLyAgICAgICAgZm9yICggU3BsYXkgcyA9IHRoaXMgOyBsZW4gPiAwICYmIHMgIT0gbGFzdCA7IHMgPSBzLm5leHRTcGxheSgpICkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGludCBzcmNDcCwgc3JjQ2NoOworLy8KKy8vICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKKy8vICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOworLy8KKy8vICAgICAgICAgICAgICAgIHNyY0NwID0gY3A7CisvLyAgICAgICAgICAgICAgICBzcmNDY2ggPSBzLmdldENjaCgpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgICAgIGVsc2UKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgLy8gSXQncyBvayBmb3IgYW4gYXR0ciB0byBiZSBpbnZhbGlkIGhlcmUsIGdldHMgdGV4dCBhZnRlcgorLy8KKy8vICAgICAgICAgICAgICAgIHNyY0NwID0gY3AgKyBzLmdldENjaFZhbHVlKCk7CisvLyAgICAgICAgICAgICAgICBzcmNDY2ggPSBzLmdldENjaEFmdGVyKCk7CisvLyAgICAgICAgICAgIH0KKy8vCisvLyAgICAgICAgICAgIGlmIChzcmNDY2ggPiAwKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAoc3JjQ2NoID4gbGVuKQorLy8gICAgICAgICAgICAgICAgICAgIHNyY0NjaCA9IGxlbjsKKy8vCisvLyAgICAgICAgICAgICAgICBpbnQgc3JjT2ZmID0gci5fdGV4dC51bk9ic2N1cmUoIHNyY0NwLCBzcmNDY2ggKTsKKy8vCisvLyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXlDb3B5KCByLl90ZXh0Ll9idWYsIHNyY09mZiwgYnVmLCBvZmYsIHNyY0NjaCApOworLy8KKy8vICAgICAgICAgICAgICAgIGxlbiAtPSBzcmNDY2g7CisvLyAgICAgICAgICAgICAgICBvZmYgKz0gc3JjQ2NoOworLy8gICAgICAgICAgICB9CisvLworLy8gICAgICAgICAgICBjcCArPSBzLmdldENjaCgpOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisvLyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgZ2V0VGV4dCAoIFJvb3QgciwgaW50IHdzICkKKyAgICB7CisgICAgICAgIGlmIChpc0ludmFsaWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzTm9ybWFsQXR0cigpKQorICAgICAgICAgICAgICAgIGVuc3VyZVZhbHVlVmFsaWQoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzTGVhZigpKQorICAgICAgICAgICAgICAgIGVuc3VyZUNvbnRlbnRWYWxpZCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNwID0gci5nZXRDcCggdGhpcyApOworCisgICAgICAgIGlmIChpc05vcm1hbEF0dHIoKSB8fCBpc0NvbW1lbnQoKSB8fCBpc1Byb2NpbnN0KCkgfHwgaXNMZWFmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjY2ggPSBnZXRDY2hWYWx1ZSgpOworCisgICAgICAgICAgICBpZiAoY2NoID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgICAgICBpZiAod3MgPT0gVHlwZVN0b3JlLldTX1BSRVNFUlZFIHx8IHdzID09IFR5cGVTdG9yZS5XU19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gci5fdGV4dC5mZXRjaCggY3AsIGNjaCApOworCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIHNjcnViVGV4dCggci5fdGV4dCwgd3MsIGNwLCBnZXRDY2hWYWx1ZSgpLCBzYiwgU1RBUlRfU1RBVEUgKTsKKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTcGxheSBsYXN0ID0gZ2V0RmluaXNoU3BsYXkoKTsKKworICAgICAgICBpbnQgc2NydWJTdGF0ZSA9IFNUQVJUX1NUQVRFOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKCBTcGxheSBzID0gdGhpcyA7IHMgIT0gbGFzdCA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMuaXNCZWdpbigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzSW52YWxpZCgpKQorICAgICAgICAgICAgICAgICAgICBzLmVuc3VyZUNvbnRlbnRWYWxpZCgpOworCisgICAgICAgICAgICAgICAgc2NydWJTdGF0ZSA9CisgICAgICAgICAgICAgICAgICAgIHNjcnViVGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHIuX3RleHQsIHdzLCBjcCwgcy5nZXRDY2goKSwgc2IsIHNjcnViU3RhdGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIG9rIGZvciBhbiBhdHRyIHRvIGJlIGludmFsaWQgaGVyZSwgZ2V0cyB0ZXh0IGFmdGVyCisKKyAgICAgICAgICAgICAgICBpbnQgY2NoQWZ0ZXIgPSBzLmdldENjaEFmdGVyKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2NoQWZ0ZXIgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2NydWJTdGF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzY3J1YlRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fdGV4dCwgd3MsIGNwICsgcy5nZXRDY2hWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaEFmdGVyLCBzYiwgc2NydWJTdGF0ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3AgKz0gcy5nZXRDY2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4gYXR0ciBzcGxheSBmb3IgYSBnaXZlbiBjb250YWluZXIsIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworCisgICAgU3BsYXkgZ2V0QXR0ciAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKworICAgICAgICBpZiAoIWlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBmb3IgKCBTcGxheSBzID0gbmV4dFNwbGF5KCkgOyBzLmlzQXR0cigpIDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocy5pc05vcm1hbEF0dHIoKSAmJiBzLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUgKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHZvaWQgc2V0WHNpTmlsICggUm9vdCByLCBib29sZWFuIG5pbCApCisgICAgeworICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKworICAgICAgICBpZiAoZ2V0WHNpTmlsKCByICkgPT0gbmlsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNldEF0dHIoIHIsIF94c2lOaWwsICJ0cnVlIiApOworICAgIH0KKworICAgIGJvb2xlYW4gZ2V0WHNpTmlsICggUm9vdCByICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc0NvbnRhaW5lcigpOworCisgICAgICAgIFNwbGF5IHM7CisKKyAgICAgICAgZm9yICggcyA9IG5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMuaXNYc2lOaWwoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy5pc0F0dHIoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTdHJpbmcgdmFsdWUgPSBzLmdldFRleHQoIHIsIFR5cGVTdG9yZS5XU19DT0xMQVBTRSApOworCisgICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMoICJ0cnVlIiApIHx8dmFsdWUuZXF1YWxzKCAiMSIgKTsKKyAgICB9CisKKyAgICBRTmFtZSBnZXRYc2lUeXBlTmFtZSAoIFJvb3QgciApCisgICAgeworICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKworICAgICAgICBTcGxheSBzOworCisgICAgICAgIGZvciAoIHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzLmlzWHNpVHlwZSgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzLmlzQXR0cigpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNYc2lUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gcy5nZXRUZXh0KCByLCBUeXBlU3RvcmUuV1NfQ09MTEFQU0UgKTsKKworLy8gVE9ETyAtIHVub2JzY3VyZSB0aGUgdW5kZXJseWluZyB0ZXh0IGFuZCB1c2UgaXQgZGlyZWN0bHkKKy8vIFRPRE8gLSBzaG91bGQgSSBtYWtlIHN1cmUgdGhlIHByZWZpeCBpcyB3cWVsbCBmb3JtZWQ/IGllLiBqdXN0IHRleHQKKworICAgICAgICBTdHJpbmcgcHJlZml4LCBsb2NhbG5hbWU7CisKKyAgICAgICAgaW50IGZpcnN0Y29sb24gPSB2YWx1ZS5pbmRleE9mKCAnOicgKTsKKworICAgICAgICBpZiAoZmlyc3Rjb2xvbiA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHJpbmcoIDAsIGZpcnN0Y29sb24gKTsKKyAgICAgICAgICAgIGxvY2FsbmFtZSA9IHZhbHVlLnN1YnN0cmluZyggZmlyc3Rjb2xvbiArIDEgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWZpeCA9ICIiOworICAgICAgICAgICAgbG9jYWxuYW1lID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXgsIHRydWUgKTsKKworICAgICAgICBpZiAodXJpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gbm8gcHJlZml4IGRlZmluaXRpb24gZm91bmQgLSB0aGF0J3MgaWxsZWdhbAorCisgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIHVyaSwgbG9jYWxuYW1lICk7CisgICAgfQorCisgICAgdm9pZCBzZXRYc2lUeXBlICggUm9vdCByLCBRTmFtZSB0eXBlTmFtZSApCisgICAgeworICAgICAgICBhc3NlcnQgaXNDb250YWluZXIoKTsKKworICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlQXR0ciggciwgX3hzaVR5cGUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHR5cGVOYW1lLmdldExvY2FsUGFydCgpOworCisgICAgICAgIFN0cmluZyBucyA9IHR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpOworCisgICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhGb3JOYW1lc3BhY2UoIHIsIG5zLCBudWxsLCB0cnVlKTsKKworICAgICAgICBhc3NlcnQgcHJlZml4ICE9IG51bGwgOiAiQ2Fubm90IGVzdGFibGlzaCBwcmVmaXggZm9yICIgKyBuczsKKworICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIHZhbHVlID0gcHJlZml4ICsgIjoiICsgdmFsdWU7CisKKyAgICAgICAgYm9vbGVhbiBzZXQgPSBmYWxzZTsKKworICAgICAgICBzZXRBdHRyKCByLCBfeHNpVHlwZSwgdmFsdWUgKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZUF0dHIgKCBSb290IHIsIFFOYW1lIGF0dHJOYW1lICkKKyAgICB7CisgICAgICAgIFNwbGF5IG5leHQ7CisgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gbmV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgPSBzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICBpZiAocy5nZXROYW1lKCkuZXF1YWxzKCBhdHRyTmFtZSApKQorICAgICAgICAgICAgICAgIHMucmVtb3ZlKCByLCB0cnVlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEF0dHIgKCBSb290IHIsIFFOYW1lIGF0dHJOYW1lLCBTdHJpbmcgdmFsdWUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisgICAgICAgIGFzc2VydCBhdHRyTmFtZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgdmFsdWUgIT0gbnVsbDsKKworICAgICAgICBib29sZWFuIHNldCA9IGZhbHNlOworCisgICAgICAgIFNwbGF5IG5leHQ7CisgICAgICAgIGZvciAoIFNwbGF5IHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gbmV4dCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgPSBzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICBpZiAocy5nZXROYW1lKCkuZXF1YWxzKCBhdHRyTmFtZSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXQpCisgICAgICAgICAgICAgICAgICAgIHMucmVtb3ZlKCByLCB0cnVlICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcy5zZXRUZXh0KCByLCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldCkKKyAgICAgICAgeworICAgICAgICAgICAgU3BsYXkgc0luc2VydCA9IHRoaXM7CisgICAgICAgICAgICBpbnQgICBwSW5zZXJ0ID0gMTsKKworICAgICAgICAgICAgaWYgKCFpc0xlYWYoKSAmJiBnZXRDY2goKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNJbnNlcnQgPSBuZXh0U3BsYXkoKTsKKyAgICAgICAgICAgICAgICBwSW5zZXJ0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNjaFZhbHVlID0gdmFsdWUubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIEF0dHIgYXR0ciA9IG5ldyBBdHRyKCBhdHRyTmFtZSApOworICAgICAgICAgICAgYXR0ci5hZGp1c3RDY2goIGNjaFZhbHVlICk7CisKKyAgICAgICAgICAgIHNJbnNlcnQuaW5zZXJ0KCByLCBwSW5zZXJ0LCBhdHRyLCB2YWx1ZSwgMCwgY2NoVmFsdWUsIGZhbHNlICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnQvdmFsdWUgb2YgdGhpcyBzcGxheSB0byB0aGUgZ2l2ZW4gdGV4dC4KKyAgICAgKi8KKworICAgIGZpbmFsIHZvaWQgc2V0VGV4dCAoIFJvb3QgciwgT2JqZWN0IHR4dCwgaW50IG9mZiwgaW50IGNjaCApCisgICAgeworICAgICAgICByZW1vdmVDb250ZW50KCByLCBmYWxzZSApOworCisgICAgICAgIGlmICh0eHQgPT0gbnVsbCB8fCBjY2ggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRE9DIDoKKyAgICAgICAgY2FzZSBCRUdJTiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhaXNCZWdpbigpIHx8IGlzTGVhZigpOworICAgICAgICAgICAgaW5zZXJ0Q2hhcnMoIDEsIHIsIHR4dCwgb2ZmLCBjY2ggKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVRUUiA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc1htbG5zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOiAiVW5leHBlY3RlZCBraW5kIGZvciBzZXRUZXh0IjsKKyAgICAgICAgICAgIH0KKy8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCisvLyBUT0RPIC0gaWYgc2V0dGluZyB0ZXh0IG9mIHhzaTp0eXBlIG9yIHhzaTpuaWwgbXVzdCBkbyBzdHVmZgorLy8gVE9ETyAtIGlmIHNldHRpbmcgdGV4dCBvZiB4c2k6dHlwZSBvciB4c2k6bmlsIG11c3QgZG8gc3R1ZmYKKy8vIFRPRE8gLSBpZiBzZXR0aW5nIHRleHQgb2YgeHNpOnR5cGUgb3IgeHNpOm5pbCBtdXN0IGRvIHN0dWZmCisKKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaAorICAgICAgICB9CisgICAgICAgIGNhc2UgQ09NTUVOVCAgOgorICAgICAgICBjYXNlIFBST0NJTlNUIDoKKyAgICAgICAgeworICAgICAgICAgICAgci5zdGFydENoYW5nZSgpOworCisgICAgICAgICAgICBhc3NlcnQgZ2V0Q2NoVmFsdWUoKSA9PSAwOworCisgICAgICAgICAgICByLl90ZXh0Lmluc2VydCggci5nZXRDcCggdGhpcyApLCB0eHQsIG9mZiwgY2NoICk7CisgICAgICAgICAgICByLnVwZGF0ZUNjaCggdGhpcywgY2NoICk7CisKKyAgICAgICAgICAgIGlmIChnZXRLaW5kKCkgPT0gQVRUUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlVGV4dCgpOworCisgICAgICAgICAgICAgICAgaWYgKGlzWHNpVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICBnZXRDb250YWluZXIoKS5kaXNjb25uZWN0VHlwZXMoIHIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTogIlVuZXhwZWN0ZWQga2luZCBmb3Igc2V0VGV4dCI7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBmaW5hbCBNYXAgbG9va3VwQWxsUHJlZml4TWFwcGluZ3MgKCApCisgICAgeworICAgICAgICBNYXAgbWFwcGluZ3MgPSBudWxsOworCisgICAgICAgIFNwbGF5IGNvbnRhaW5lciA9IHRoaXMuaXNDb250YWluZXIoKSA/IHRoaXMgOiBnZXRDb250YWluZXIoKTsKKworICAgICAgICBmb3IgKCA7IGNvbnRhaW5lciAhPSBudWxsIDsgY29udGFpbmVyID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggU3BsYXkgcyA9IGNvbnRhaW5lci5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOworICAgICAgICAgICAgICAgICAgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXBwaW5ncy5jb250YWluc0tleSggcy5nZXRMb2NhbCgpICkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncy5wdXQoIHMuZ2V0TG9jYWwoKSwgcy5nZXRVcmkoKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXBwaW5nczsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIGFwcGx5TmFtZXNwYWNlcyAoIFJvb3QgciwgTWFwIG5hbWVzcGFjZXMgKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTcGxheSBjb250YWluZXIgPSB0aGlzLmlzQ29udGFpbmVyKCkgPyB0aGlzIDogZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgbmFtZXNwYWNlX2xvb3A6CisgICAgICAgIGZvciAoIEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VzLmtleVNldCgpLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOworCisgICAgICAgICAgICAvLyBVc3VhbGx5LCB0aGlzIGlzIHRoZSBwcmVkZWZpbmVkIHhtbCBuYW1lc3BhY2UKKyAgICAgICAgICAgIGlmIChwcmVmaXgudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCAieG1sIiApKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgbmFtZXNwYWNlcy5nZXQoIHByZWZpeCApOworCisgICAgICAgICAgICBTcGxheSBjYW5kaWRhdGUgPSBjb250YWluZXI7CisKKyAgICAgICAgICAgIGNhbmRpZGF0ZV9sb29wOgorICAgICAgICAgICAgZm9yICggU3BsYXkgYyA9IGNvbnRhaW5lci5nZXRDb250YWluZXIoKSA7IGMgIT0gbnVsbCAmJiAhYy5pc0RvYygpIDsKKyAgICAgICAgICAgICAgICAgIGMgPSBjLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcHJlZml4LmVxdWFscyggcy5nZXRMb2NhbCgpICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCBzLmdldFVyaSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG5hbWVzcGFjZV9sb29wOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjYW5kaWRhdGVfbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IG5hbWVzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBhdHRyIGxpc3QgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1ha2Vpbmcgc3VyZSBhbGwgcHJldmlvdXMgbWFwcGluZ3MgYXJlIGdvbmUKKyAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCBuYW1lc3BhY2UsIHByZWZpeCApOworCisgICAgICAgICAgICByZW1vdmVBdHRyKCByLCBxbmFtZSApOworCisgICAgICAgICAgICBjYW5kaWRhdGUubmV4dE5vbkF0dHJTcGxheSgpLmluc2VydCgKKyAgICAgICAgICAgICAgICByLCAwLCBuZXcgWG1sbnMoIHFuYW1lICksIG51bGwsIDAsIDAsIGZhbHNlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0ci9lbGVtZW50LgorICAgICAqLworICAgIGZpbmFsIFN0cmluZyBnZXRQcmVmaXggKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzQmVnaW4oKSB8fCBpc0F0dHIoKTsKKworICAgICAgICBpZiAoaXNYbWxucygpKQorICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7CisKKyAgICAgICAgLy8gVE9ETyAtIGhhdmUgYSBwcmVmaXggZ29vYmVyIHRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIG9uIHRoZSBmcm9udGllci4KKyAgICAgICAgLy8gUGFyc2VyIHdpbGwgYWRkIHRoaXMgd2hlbiB0aGUgbmF0dXJhbCBwcmVmaXggaXMgbm90IHRoZSByZWFsIHByZWZpeC4KKworICAgICAgICBTcGxheSBjID0gaXNCZWdpbigpID8gdGhpcyA6IGdldENvbnRhaW5lcigpOworCisgICAgICAgIC8vIHNwZWNpYWwgY2FzZQorICAgICAgICBTdHJpbmcgbnMgPSBnZXRVcmkoKTsKKworICAgICAgICAvLyBsYXN0IGFyZ3VtZW50IGlzIGZhbHNlLCB3aGljaCBtZWFucywgZG9uJ3QgbW9kaWZ5IHRoZSB0cmVlCisgICAgICAgIHJldHVybiBwcmVmaXhGb3JOYW1lc3BhY2UoIHIsIG5zLCBudWxsLCBmYWxzZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgcHJlZml4LCByZXR1cm5zIHRoZSBuYW1lc3BhY2UgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSBwcmVmaXggYXQgdGhpcyBsb2NhdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBtYXBwaW5nCisgICAgICogZm9yIHRoaXMgcHJlZml4LgorICAgICAqIDxwPgorICAgICAqIHByZWZpeD0iIiBpbmRpY2F0ZXMgdGhlIGFic2VuY2Ugb2YgYSBwcmVmaXguICBBIHJldHVybiB2YWx1ZQorICAgICAqIG9mICIiIGluZGljYXRlcyB0aGUgbm8tbmFtZXNwYWNlLCBhbmQgc2hvdWxkIG5vdCBiZSBjb25mdXNlZAorICAgICAqIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgbnVsbCwgd2hpY2ggaW5kaWNhdGVzIGFuIGlsbGVnYWwKKyAgICAgKiBzdGF0ZSwgd2hlcmUgdGhlcmUgaXMgbm8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHByZWZpeC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbiB0aGUgeG1sLAorICAgICAqIHRoZSB4bWwgc3BlYyBzYXlzIHRoYXQgaXQgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGUgbm8tbmFtZXNwYWNlLgorICAgICAqIFdoZW4gdGhlICdkZWZhdWx0QWx3YXlzTWFwcGVkJyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGRlZmF1bHQgbmFtZXBzYWNlCisgICAgICogd2lsbCByZXR1cm4gdGhlIG5vLW5hbWVzcGFjZSBldmVuIGlmIGl0IGlzIG5vdCBleHBsaWNpdHkKKyAgICAgKiBtYXBwZWQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2Ugd2lsbCByZXR1cm4gbnVsbC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGludGVyY2VwdHMgdGhlIGJ1aWx0LWluIHByZWZpeGVzICJ4bWwiIGFuZAorICAgICAqICJ4bWxucyIgYW5kIHJldHVybnMgdGhlaXIgd2VsbC1rbm93biBuYW1lc3BhY2UgVVJJcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeCB0byBsb29rIHVwLgorICAgICAqIEBwYXJhbSBtYXBEZWZhdWx0IElmIHRydWUsIHJldHVybiB0aGUgbm8tbmFtZXNwYWNlIGZvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaWYgbm90IHNldC4KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXBwZWQgbmFtZXNwYWNlIFVSSSAoIiIgaWYgbm8tbmFtZXNwYWNlKSwgb3IgbnVsbCBpZiBubyBtYXBwaW5nLgorICAgICAqLworICAgIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VGb3JQcmVmaXggKCBTdHJpbmcgcHJlZml4LCBib29sZWFuIGRlZmF1bHRBbHdheXNNYXBwZWQgKQorICAgIHsKKyAgICAgICAgLy8gbnVsbCBzYW1lIGFzICIiLCBtZWFucyBsb29rIHVwIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCisgICAgICAgICAgICBwcmVmaXggPSAiIjsKKworICAgICAgICAvLyBoYW5kbGUgYnVpbHQtaW4gcHJlZml4ZXMKKyAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyhwcmVmaXgpKQorICAgICAgICAgICAgcmV0dXJuIF94bWwxOTk4VXJpOworICAgICAgICBpZiAoInhtbG5zIi5lcXVhbHMocHJlZml4KSkKKyAgICAgICAgICAgIHJldHVybiBfeG1sbnNVcmk7CisKKyAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisKKyAgICAgICAgLy8gZmluZCBhbiB4bWxucyBkZWNsCisgICAgICAgIGZvciAoIENvbnRhaW5lciBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBTcGxheSBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHByZWZpeC5lcXVhbHMoIHMuZ2V0TG9jYWwoKSApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRVcmkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENSMTM1MTkzOiBpZiBkZWZhdWx0QWx3YXlzTWFwcGVkLCByZXR1cm4gbm8tbmFtZXNwYWNlIHdoZW4gbm8gZGVmYXVsdCBuYW1lc3BhY2UgaXMgZm91bmQKKyAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSBubyBkZWZhdWx0IG5hbWVzcGFjZSB3YXMgZm91bmQuCisgICAgICAgIGlmIChkZWZhdWx0QWx3YXlzTWFwcGVkICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gbmFtZXNwYWNlIGRlZm4gZm91bmQ6IHJldHVybiBudWxsCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJlZml4IHRvIHVzZSBmb3IgYSBnaXZlbiBuYW1lc3BhY2UgVVJJLiAgQ2FuIGVpdGhlcgorICAgICAqIGJlIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB0cmVlIHRvIGVuc3VyZSBzdWNoIGEgbWFwcGluZyAoaWYgcgorICAgICAqIGlzIG5vbi1udWxsKSwgb3IgY2FuIGJlIHRvbGQgdG8gcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8KKyAgICAgKiBleGlzdGluZyBtYXBwaW5nIChpZiByIGlzIG51bGwpLgorICAgICAqIDxwPgorICAgICAqIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdHJlZSBtYXkgYmUgbW9kaWZpZWQsIGEgc3VnZ2VzdGVkIHByZWZpeAorICAgICAqIGNhbiBiZSBzdXBwbGllZC4gIFRoZSBzdWdnZXN0aW9uIG1heSBiZSBpZ25vcmVkIGZvciBhbnkgcmVhc29uLAorICAgICAqIGZvciBleGFtcGxlLCBpZiB0aGUgcHJlZml4IGlzIGFscmVhZHkgaW4tdXNlLgorICAgICAqIDxwPgorICAgICAqIFJldHVybnMgInhtbCIgYW5kICJ4bWxucyIgZm9yIHRoZSB3ZWxsLWtub3duIG5hbWVzcGFjZSBVUklzCisgICAgICogY29ycmVzcG9uZGluZyB0byB0aG9zZSBidWlsdC1pbiBwcmVmaXhlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByICAgICAgIHNob3VsZCBiZSBudWxsIGlmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZS4KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhIHByZWZpeCBjYW4ndCBiZSBmb3VuZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gaW50cm9kdWNpbmcgYW4geG1sbnMuCisgICAgICogQHBhcmFtIG5zICAgICAgdGhlIG5hbWVzcGFjZSB0byBsb29rIGZvciBvciBpbnRyb2R1Y2UgYSBtYXBwaW5nIGZvci4KKyAgICAgKiAgICAgICAgICAgICAgICBjYXJlZnVsIHdpdGggIiIsIGJlY2F1c2UgaXQgbWF5IGhhdmUgbm9ubG9jYWwgZWZmZWN0cworICAgICAqICAgICAgICAgICAgICAgIGlmIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KKyAgICAgKiBAcGFyYW0gc3VnZ2VzdGlvbiAgYSBzdWdnZXN0ZWQgcHJlZml4IHRvIHRyeSBmaXJzdDsgbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlYXRlSWZNaXNzaW5nIHRydWUgKG5vcm1hbGx5IGl0J3MgdHJ1ZSkgaWYgeW91IHdhbnQgdG8gY3JlYXRlCisgICAgICogICAgICAgICAgICAgICAgYW4geG1sbnMgZGVjbGFyYXRpb24gd2hlbiBvbmUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGZvcgorICAgICAqICAgICAgICAgICAgICAgIHlvdXIgcmVxdWVzdGVkIFVSSS4gIElmIHlvdSBkb24ndCB3YW50IHRvIG1vZGlmeSB0aGUgdHJlZSwKKyAgICAgKiAgICAgICAgICAgICAgICBwYXNzIGZhbHNlLgorICAgICAqLworICAgIGZpbmFsIFN0cmluZyBwcmVmaXhGb3JOYW1lc3BhY2UgKCAgUm9vdCByLCBTdHJpbmcgbnMsIFN0cmluZyBzdWdnZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVJZk1pc3NpbmcgKQorICAgIHsKKyAgICAgICAgLy8gbnVsbCBzYW1lIGFzIGVtcHR5IHN0cmluZywgbWVhbnMgbm8tbmFtZXNwYWNlCisgICAgICAgIGlmIChucyA9PSBudWxsKQorICAgICAgICAgICAgbnMgPSAiIjsKKworICAgICAgICAvLyBzcGVjaWFsIGNhc2VzCisgICAgICAgIGlmIChfeG1sMTk5OFVyaS5lcXVhbHMoIG5zICkpCisgICAgICAgICAgICByZXR1cm4gInhtbCI7CisgICAgICAgIGlmIChfeG1sbnNVcmkuZXF1YWxzKCBucyApKQorICAgICAgICAgICAgcmV0dXJuICJ4bWxucyI7CisKKyAgICAgICAgYXNzZXJ0IGlzQ29udGFpbmVyKCk7CisKKyAgICAgICAgQ29udGFpbmVyIGM7CisgICAgICAgIFNwbGF5IHM7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBpcyBucyBpcyBub3Qgc3BlY2lmaWVkIChubyBuYW1lc3BhY2UpCisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKG5zLmxlbmd0aCgpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvb3A6CisgICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1htbG5zKCkgJiYgcy5nZXRMb2NhbCgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmdldFVyaSgpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TG9jYWwoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG92ZXJyaWRkZW4gZGVmYXVsdCBuYW1lc3BhY2UgaW4gc2NvcGUsCisgICAgICAgICAgICAvLyByZXR1cm4gIiIgLSB0aGUgZGVmYXVsdCBkZWZhdWx0IG5hbWVzcGFjZSBpcyB0aGUgbm8tbmFtZXBzYWNlLgorICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgaWYgKCBjID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgcHJvYmxlbWF0aWMgZGVmYXVsdCBuYW1lc3BhY2UgYnV0IGNhbm5vdCBtb2RpZnkKKyAgICAgICAgICAgIC8vIHRoZSB0cmVlLCByZXR1cm4gbnVsbCAtIG5vIHByZWZpeCBhdmFpbGFibGUuCisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBpZiAoICFjcmVhdGVJZk1pc3NpbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSB3aGljaCBtYXBzIHRvIGEgJ3JlYWwnIG5hbWVzcGFjZSwKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgbmFtZXNwYWNlIG9uIHRoaXMgY29udGFpbmVyIHdoaWNoIGlzICIiLiAgVGhpcworICAgICAgICAgICAgLy8gY2FuIHNjcmV3IGF0dHJpYnV0ZXMgYW5kIHN1Y2gsIGJ1dCwgb2ggd2VsbC4KKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGZvciAoIHMgPSBuZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0TG9jYWwoKS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcy5zZXROYW1lKCByLCBuZXcgUU5hbWUoICIiLCAiIiApICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldExvY2FsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHhtbG5zPSIiIGRlY2xhcmF0aW9uCisKKyAgICAgICAgICAgIEF0dHIgYSA9IG5ldyBYbWxucyggbmV3IFFOYW1lKCAiIiwgIiIgKSApOworCisgICAgICAgICAgICByLnN0YXJ0Q2hhbmdlKCk7CisKKyAgICAgICAgICAgIHIuaW5zZXJ0U3BsYXkoIGEsIHRoaXMgKTsKKworICAgICAgICAgICAgci5pbnZhbGlkYXRlVmVyc2lvbigpOworCisgICAgICAgICAgICByZXR1cm4gYS5nZXRMb2NhbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdGhlIG9yZGluYXJ5IG5vdC1hLW5vLW5hbWVzcGFjZSBjYXNlCisgICAgICAgIC8vCisKKyAgICAgICAgYXNzZXJ0IG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwOworCisgICAgICAgIC8vCisgICAgICAgIC8vIGxvb2sgZm9yIGFuIGV4aXN0aW5nIHByZWZpeCBmb3IgdGhlIHJlcXVlc3RlZCBVUkkKKyAgICAgICAgLy8KKworICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgZmluZHhtbG5zOiBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmIHMuZ2V0VXJpKCkuZXF1YWxzKCBucyApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHMuZ2V0TG9jYWwoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdGhlIHByZWZpeCBpc24ndCBtYXNrZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yICggQ29udGFpbmVyIGMyID0gKENvbnRhaW5lcikgdGhpcyA7IGMyICE9IGMgOyBjMiA9IGMyLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggU3BsYXkgczIgPSBjMi5uZXh0U3BsYXkoKSA7IHMyLmlzQXR0cigpIDsgczIgPSBzMi5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMyLmlzWG1sbnMoKSAmJiBzMi5nZXRMb2NhbCgpLmVxdWFscyhyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBmaW5keG1sbnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWFza2VkOiBPSy4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBXZSBjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBwcmVmaXggaW4tc2NvcGUgdGhhdCB3b3Jrcy4KKyAgICAgICAgLy8gSWYgIWNyZWF0ZUlmTWlzc2luZywgZG9uJ3QgbW9kaWZ5IHRoZSB0cmVlIC0gcmV0dXJuIG51bGwgaW5zdGVhZC4KKyAgICAgICAgLy8KKworICAgICAgICBpZiAoIWNyZWF0ZUlmTWlzc2luZykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIG11c3QgYWRkIGFuIHhtbG5zOnNvbWV0aGluZz0idXJpIiwgc28gd2UgbXVzdCBwaWNrIGEgcHJlZml4LgorICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGUgc3VnZ2VzdGlvbiBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHNjb3BlIGFuZCBpZgorICAgICAgICAvLyBpdCdzIG5vdCB0aGUgZW1wdHkgc3RyaW5nIG9yIGFuIGlsbGVnYWwgcHJlZml4LgorICAgICAgICAvLworCisgICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uLmxlbmd0aCgpID09IDAgfHwgc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoICJ4bWwiICkpCisgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7IC8vIGJhZCBzdWdnZXN0aW9uCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggYyA9IChDb250YWluZXIpIHRoaXMgOyBjICE9IG51bGwgOyBjID0gYy5nZXRDb250YWluZXIoKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKCBzID0gYy5uZXh0U3BsYXkoKSA7IHMuaXNBdHRyKCkgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzWG1sbnMoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJZiBubyBzdWdnZXN0aW9uLCBjb21lIHVwIHdpdGggYSBzYWZlIHByZWZpeCB0byB1c2UKKyAgICAgICAgLy8KKworICAgICAgICBpZiAoc3VnZ2VzdGlvbiA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IFFOYW1lSGVscGVyLnN1Z2dlc3RQcmVmaXgobnMpOworICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2U7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyA7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9vcDoKKyAgICAgICAgICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIHMgPSBjLm5leHRTcGxheSgpIDsgcy5pc0F0dHIoKSA7IHMgPSBzLm5leHRTcGxheSgpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaXNYbWxucygpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldExvY2FsKCkuZXF1YWxzKCBzdWdnZXN0aW9uICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGJhc2UgKyBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ29udGFpbmVyIHRhcmdldCA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBsYXN0Q29udGFpbmVyID0gbnVsbDsKKworICAgICAgICBmb3IgKCBjID0gKENvbnRhaW5lcikgdGhpcyA7IGMgIT0gbnVsbCA7IGMgPSBjLmdldENvbnRhaW5lcigpICkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdENvbnRhaW5lciA9IGM7CisKKyAgICAgICAgICAgIGlmIChjLmlzQmVnaW4oKSkKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQorICAgICAgICAgICAgdGFyZ2V0ID0gbGFzdENvbnRhaW5lcjsKKworICAgICAgICBBdHRyIGEgPSBuZXcgWG1sbnMoIG5ldyBRTmFtZSggbnMsIHN1Z2dlc3Rpb24gKSApOworCisgICAgICAgIHIuc3RhcnRDaGFuZ2UoKTsKKworICAgICAgICByLmluc2VydFNwbGF5KCBhLCB0YXJnZXQgKTsKKworICAgICAgICByLmludmFsaWRhdGVWZXJzaW9uKCk7CisKKyAgICAgICAgcmV0dXJuIGEuZ2V0TG9jYWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IGF0IHBvcyBpbiB0aGlzCisgICAgICogc3BsYXkuCisgICAgICovCisKKyAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggaW50IHAgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHAgPj0gMCAmJiBwIDw9IGdldEVuZFBvcygpOworICAgICAgICBhc3NlcnQgcCA+IDAgfHwgIWlzRG9jKCk7CisKKyAgICAgICAgaWYgKHAgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKTsKKworICAgICAgICBpZiAoaXNMZWFmKCkpCisgICAgICAgICAgICByZXR1cm4gcCA8IGdldFBvc0FmdGVyKCkgPyAoQ29udGFpbmVyKSB0aGlzIDogZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKGlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICByZXR1cm4gKENvbnRhaW5lcikgdGhpczsKKworICAgICAgICBpZiAoaXNGaW5pc2goKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKKworICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3BsYXkgd2hpY2ggY29udGFpbnMgdGhpcyBzcGxheS4KKyAgICAgKi8KKworICAgIGFic3RyYWN0IENvbnRhaW5lciBnZXRDb250YWluZXIgKCApOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZjbiB0byBsb2NhdGUgdGhlIGNvbnRhaW5lciB0aGlzIHNwbGF5IGlzIGNvbnRhaW5lciBpbi4KKyAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mIGdldENvbnRhaW5lciBpbgorICAgICAqIGNhc2VzIHdoZXJlIHRoZSBjb250YWluZXIgaXMgbm90IG9idmlvdXNseSBjb21wdXRhYmxlLgorICAgICAqLworCisgICAgQ29udGFpbmVyIGZpbmRDb250YWluZXIgKCApCisgICAgeworICAgICAgICBhc3NlcnQgIWlzQ29udGFpbmVyKCk7CisgICAgICAgIGFzc2VydCAhaXNGaW5pc2goKTsKKworICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7CisKKyAgICAgICAgd2hpbGUgKCAhcy5pc0ZpbmlzaCgpICYmICFzLmlzQmVnaW4oKSApCisgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKworICAgICAgICByZXR1cm4gcy5nZXRDb250YWluZXIoKTsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVUZXh0ICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzVmFsaWQoKTsKKworICAgICAgICBUeXBlIHQgPSBwZWVrVHlwZSgpOworCisgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisKKyAgICAgICAgICAgIHQuaW52YWxpZGF0ZVRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIHZvaWQgaW52YWxpZGF0ZU5pbCAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisKKyAgICAgICAgaWYgKCFpc0F0dHIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSB0ID0gcGVla1R5cGUoKTsKKworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0LmludmFsaWRhdGVOaWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciApCisgICAgeworICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIsIGZhbHNlICk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2Nvbm5lY3RUeXBlcyAoIFJvb3QgciwgYm9vbGVhbiBkaXNjb25uZWN0RG9jICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisKKyAgICAgICAgU3BsYXkgbGFzdCA9IGlzQXR0cigpID8gdGhpcyA6IGdldEZpbmlzaFNwbGF5KCk7CisKKyAgICAgICAgU3BsYXkgcyA9IHRoaXM7CisKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSB0ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKHMuaXNOb3JtYWxBdHRyKCkgfHwgcy5pc0xlYWYoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gcy5wZWVrVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocy5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnRhaW5lciBjID0gcy5nZXRDb250YWluZXIoKTsKKworICAgICAgICAgICAgICAgIGlmICghYy5pc0RvYygpIHx8IGRpc2Nvbm5lY3REb2MpCisgICAgICAgICAgICAgICAgICAgIHQgPSBjLnBlZWtUeXBlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3BsYXkgdSA9IHQuZ2V0U3BsYXkoKTsKKworICAgICAgICAgICAgICAgIGlmICh1LmlzSW52YWxpZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlVmFsdWUoIHUsIHQgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluaXNoIHNwbGF5IG1pZ2h0IGdldCB3aGFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICBTcGxheSBmID0gdS5nZXRGaW5pc2hTcGxheSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0LnZhbGlkYXRlQ29udGVudCggdSwgdCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiA9PSBsYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdC5kaXNjb25uZWN0KCByICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzID09IGxhc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzLmlzQ29udGFpbmVyKCkgJiYgIXMuaXNMZWFmKCkgJiYgcy5wZWVrVHlwZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHR5cGUgb2Ygb2YgdGhpcworICAgICAqLworCisgICAgZmluYWwgdm9pZCBzZXRUeXBlICggUm9vdCByLCBTY2hlbWFUeXBlIHNUeXBlICkKKyAgICB7CisgICAgICAgIHNldFR5cGUoIHIsIHNUeXBlLCB0cnVlICk7CisgICAgfQorICAgIAorICAgIGZpbmFsIHZvaWQgc2V0VHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgYm9vbGVhbiBjb21wbGFpbiApCisgICAgeworICAgICAgICBhc3NlcnQgaXNUeXBlYWJsZSgpOworICAgICAgICBhc3NlcnQgc1R5cGUgIT0gbnVsbDsKKworICAgICAgICAvLworICAgICAgICAvLyBJcyB0aGUgY3VycmVudCB0eXBlIGFscmVhZHkgdGhpcyB0eXBlPworICAgICAgICAvLworCisgICAgICAgIFR5cGUgdCA9IHBlZWtUeXBlKCk7CisKKyAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldF9zY2hlbWFfdHlwZSgpID09IHNUeXBlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vCisgICAgICAgIC8vIENhbiBhbHdheXMgc2V0IGFuIGFyYml0cmFyeSB0eXBlIGF0IHRoZSBkb2MgbGV2ZWwKKyAgICAgICAgLy8KKworICAgICAgICBpZiAoaXNEb2MoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzY29ubmVjdFR5cGVzKCByLCB0cnVlICk7CisKKyAgICAgICAgICAgIGFzc2VydCBwZWVrVHlwZSgpID09IG51bGw7CisKKyAgICAgICAgICAgIG5ldyBUeXBlKCByLCBzVHlwZSwgdGhpcyApOworCisgICAgICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR290dGEgZ2V0IHRoZSBwYXJlbnQgdHlwZSB0byBkbyBhbnl0aGluZyBmdXJ0aGVyLiAgSWYgaXQKKyAgICAgICAgLy8gY2FuJ3QgYmUgZm91bmQsIHRoZW4gYmFyZgorICAgICAgICAvLworCisgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKKworICAgICAgICBhc3NlcnQgcGFyZW50VHlwZSAhPSBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFlvdSBjYW4gc2V0IHRoZSBhdHRyaWJ1dGUgdHlwZSwgYXMgbG9uZyBhcyBpdCBpcyB0aGUgbmF0dXJhbAorICAgICAgICAvLyB0eXBlLiAgQXR0cmlidXRlcyBjYW5ub3QgaGF2ZSB4c2k6dHlwZQorICAgICAgICAvLworCisgICAgICAgIGlmIChpc0F0dHIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2F0dHJpYnV0ZV90eXBlKCBnZXROYW1lKCkgKSAhPSBzVHlwZSAmJiBjb21wbGFpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgYXR0cmlidXRlIHRvICIgKyBzVHlwZS50b1N0cmluZygpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBpc0JlZ2luKCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm93LCBmb3IgaW50ZXJpb3IgdHlwZXMsIEkgaGF2ZSB0byBkZWFsIHdpdGggeHNpOnR5cGUgYW5kCisgICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoZSB0eXBlIGlzIGFsbG93ZWQgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgLy8KKworICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhpcyB0eXBlIGNhbiBiZSBoZXJlIHNhbnMgeHNpOnR5cGUuCisgICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8geHNpOnR5cGUKKworICAgICAgICBpZiAocGFyZW50VHlwZS5nZXRfZWxlbWVudF90eXBlKCBnZXROYW1lKCksIG51bGwgKSA9PSBzVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0WHNpVHlwZSggciwgbnVsbCApOworCisgICAgICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKKworICAgICAgICAgICAgYXNzZXJ0IHZhbGlkYXRlKCk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBkZXNpcmVkIHR5cGUgaGFzIG5vIG5hbWUsIHRoZW4gaXQgY2Fubm90IGJlCisgICAgICAgIC8vIHJlZmVyZW5jZWQgdmlhIHhzaTp0eXBlCisKKyAgICAgICAgUU5hbWUgdHlwZU5hbWUgPSBzVHlwZS5nZXROYW1lKCk7CisKKyAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb21wbGFpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2V0IHR5cGUgb2YgZWxlbWVudCwgdHlwZSBpcyB1bi1uYW1lZCIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0X2VsZW1lbnRfdHlwZSggZ2V0TmFtZSgpLCB0eXBlTmFtZSApICE9IHNUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGxhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNldCB0eXBlIG9mIGVsZW1lbnQsIGludmFsaWQgdHlwZSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2V0WHNpVHlwZSggciwgdHlwZU5hbWUgKTsKKworICAgICAgICBkaXNjb25uZWN0VHlwZXMoIHIgKTsKKworICAgICAgICBhc3NlcnQgdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BsYXkuICBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGNyZWF0ZQorICAgICAqIG9uZSBhbmQgd2lsbCByZXR1cm4gbnVsbCBpcyBub24gZXhpc3RzLgorICAgICAqLworCisgICAgZmluYWwgVHlwZSBwZWVrVHlwZSAoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBpc1R5cGVhYmxlKCk7CisKKyAgICAgICAgVHlwZSB0eXBlID0gbnVsbDsKKworICAgICAgICBpZiAoX2dvb2JlcnMgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggR29vYmVyIGcgPSBmaXJzdEdvb2JlcigpIDsgZyAhPSBudWxsIDsgZyA9IG5leHRHb29iZXIoIGcgKSApCisgICAgICAgICAgICAgICAgaWYgKGcuZ2V0S2luZCgpID09IFRZUEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVHlwZSkgZzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB0eXBlICE9IG51bGwgfHwgaXNWYWxpZCgpOworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgVHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGxheS4gIElmIG5vbiBleGlzdHMsIGl0IGF0dGVtcHRzCisgICAgICogdG8gY3JlYXRlIG9uZS4gIFJldHVybnMgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQuCisgICAgICovCisKKyAgICBmaW5hbCBUeXBlIGdldFR5cGUgKCBSb290IHIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzVHlwZWFibGUoKTsKKworICAgICAgICBUeXBlIHR5cGUgPSBwZWVrVHlwZSgpOworCisgICAgICAgIGlmICghaXNEb2MoKSAmJiB0eXBlID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IGdldENvbnRhaW5lcigpLmdldFR5cGUoIHIgKTsKKworICAgICAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKworICAgICAgICAgICAgLy8gRGVmZW5zaXZlCisgICAgICAgICAgICBpZiAocGFyZW50VHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBUeXBlU3RvcmVVc2VyIG5ld1VzZXI7CisKKyAgICAgICAgICAgIGlmIChpc0JlZ2luKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3VXNlciA9CisgICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGUuY3JlYXRlX2VsZW1lbnRfdXNlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSwgZ2V0WHNpVHlwZU5hbWUoIHIgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBpc05vcm1hbEF0dHIoKTsKKworICAgICAgICAgICAgICAgIG5ld1VzZXIgPSBwYXJlbnRUeXBlLmNyZWF0ZV9hdHRyaWJ1dGVfdXNlciggZ2V0TmFtZSgpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydCBuZXdVc2VyICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIERlZmVuc2l2ZQorICAgICAgICAgICAgaWYgKG5ld1VzZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgdHlwZSA9IG5ldyBUeXBlKCByLCBuZXdVc2VyLCB0aGlzICk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgaW5zaWRlIG9mIHRoZSBjb250ZW50IG9mIHNSYW5nZT8gIERvZXMgYW4gaW5jbHVzaXZlIGNoZWNrLgorICAgICAqLworCisgICAgZmluYWwgYm9vbGVhbiBiZXR3ZWVuICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNSYW5nZSApCisgICAgeworICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgZ2V0Um9vdFNsb3coKSA9PSBzUmFuZ2UuZ2V0Um9vdFNsb3coKTsKKworICAgICAgICBpZiAoc1JhbmdlLmlzRG9jKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoY29tcGFyZSggciwgcFRoaXMsIHNSYW5nZSwgMCApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTcGxheSBzRW5kOworICAgICAgICBpbnQgICBwRW5kOworCisgICAgICAgIGFzc2VydCAhc1JhbmdlLmlzRG9jKCk7CisKKyAgICAgICAgaWYgKHNSYW5nZS5pc0xlYWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc0VuZCA9IHNSYW5nZTsKKyAgICAgICAgICAgIHBFbmQgPSBzUmFuZ2UuZ2V0UG9zTGVhZkVuZCgpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzUmFuZ2UuaXNCZWdpbigpKQorICAgICAgICB7CisgICAgICAgICAgICBzRW5kID0gc1JhbmdlLmdldEZpbmlzaFNwbGF5KCk7CisgICAgICAgICAgICBwRW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNFbmQgPSBzUmFuZ2UubmV4dFNwbGF5KCk7CisgICAgICAgICAgICBwRW5kID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBwVGhpcywgc0VuZCwgcEVuZCApIDw9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gcG9zaXRpb25zLiAgQXR0cmlidXRlcyBhcmUgYSBiaXRjaC4KKyAgICAgKi8KKworICAgIGZpbmFsIGludCBjb21wYXJlICggUm9vdCByLCBpbnQgcFRoaXMsIFNwbGF5IHNUaGF0LCBpbnQgcFRoYXQgKQorICAgIHsKKyAgICAgICAgU3BsYXkgc1RoaXMgPSB0aGlzOworCisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhpcy5nZXRSb290U2xvdygpID09IHI7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzVGhhdC5nZXRSb290U2xvdygpID09IHI7CisgICAgICAgIGFzc2VydCBwVGhpcyA+PSAwICYmIHBUaGlzIDw9IHNUaGlzLmdldEVuZFBvcygpOworICAgICAgICBhc3NlcnQgcFRoYXQgPj0gMCAmJiBwVGhhdCA8PSBzVGhhdC5nZXRFbmRQb3MoKTsKKworICAgICAgICAvLyBOb3JtYWxpemUgcG9zaXRpb25zCisKKyAgICAgICAgaWYgKHBUaGlzID09IHNUaGlzLmdldEVuZFBvcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc1RoaXMuaXNBdHRyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpKS5pc0F0dHIoKSkKKyAgICAgICAgICAgICAgICAgICAgcFRoaXMgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMucHJldk5vbkF0dHJTcGxheSgpOworICAgICAgICAgICAgICAgICAgICBwVGhpcyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNUaGlzID0gc1RoaXMubmV4dE5vbkF0dHJTcGxheSgpOworICAgICAgICAgICAgICAgIHBUaGlzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwVGhhdCA9PSBzVGhhdC5nZXRFbmRQb3MoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoc1RoYXQgPSBzVGhhdC5uZXh0U3BsYXkoKSkuaXNBdHRyKCkpCisgICAgICAgICAgICAgICAgICAgIHBUaGF0ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcFRoYXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzVGhhdCA9IHNUaGF0Lm5leHROb25BdHRyU3BsYXkoKTsKKyAgICAgICAgICAgICAgICBwVGhhdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgcFRoaXMgPCBzVGhpcy5nZXRFbmRQb3MoKTsKKyAgICAgICAgYXNzZXJ0IHBUaGF0IDwgc1RoYXQuZ2V0RW5kUG9zKCk7CisKKyAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQorICAgICAgICAgICAgcmV0dXJuIHBUaGlzIDwgcFRoYXQgPyAtMSA6IHBUaGlzID4gcFRoYXQgPyAxIDogMDsKKworICAgICAgICAvLworCisgICAgICAgIGlmIChzVGhpcy5pc0F0dHIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNUaGF0LmlzQXR0cigpKQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOworCisgICAgICAgICAgICBpZiAoc1RoaXMucHJldk5vbkF0dHJTcGxheSgpICE9IHNUaGF0KQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKCByLCBzVGhhdCApOworCisgICAgICAgICAgICByZXR1cm4gcFRoYXQgPT0gMCA/IDEgOiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzVGhhdC5pc0F0dHIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICFzVGhpcy5pc0F0dHIoKTsKKworICAgICAgICAgICAgaWYgKHNUaGF0LnByZXZOb25BdHRyU3BsYXkoKSAhPSBzVGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKKworICAgICAgICAgICAgcmV0dXJuIHBUaGlzID09IDAgPyAtMSA6IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZSggciwgc1RoYXQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmUgKCBSb290IHIsIFNwbGF5IHNUaGF0ICkKKyAgICB7CisgICAgICAgIFNwbGF5IHNUaGlzID0gdGhpczsKKworICAgICAgICBpZiAoc1RoaXMgPT0gc1RoYXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoci5pc0xlZnRPbmx5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzVGhpcy5nZXRDY2hMZWZ0KCkgPCBzVGhhdC5nZXRDY2hMZWZ0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoTGVmdCgpID4gc1RoYXQuZ2V0Q2NoTGVmdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2RvY0JlZ2luTGVmdCgpIDwgc1RoYXQuZ2V0Q2RvY0JlZ2luTGVmdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgaWYgKHNUaGlzLmdldENkb2NCZWdpbkxlZnQoKSA+IHNUaGF0LmdldENkb2NCZWdpbkxlZnQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgd2hpbGUgKCBzVGhpcyAhPSByICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzVGhpcyA9IHNUaGlzLm5leHRTcGxheSgpOworCisgICAgICAgICAgICAgICAgaWYgKHNUaGlzID09IHNUaGF0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICBpZiAoc1RoaXMuZ2V0Q2NoKCkgPiAwIHx8IHNUaGlzLmdldENkb2NCZWdpbigpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNUaGF0LmlzUm9vdCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmIChzVGhpcy5pc1Jvb3QoKSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHNUaGlzLnNwbGF5KCByLCByICk7CisgICAgICAgIHNUaGF0LnNwbGF5KCByLCBzVGhpcyApOworCisgICAgICAgIGFzc2VydCBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0IHx8IHNUaGlzLl9yaWdodFNwbGF5ID09IHNUaGF0OworCisgICAgICAgIHJldHVybiBzVGhpcy5fbGVmdFNwbGF5ID09IHNUaGF0ID8gMSA6IC0xOworICAgIH0KKworICAgIGZpbmFsIFNwbGF5IG5leHROb25BdHRyU3BsYXkgKCApCisgICAgeworICAgICAgICBTcGxheSBzID0gbmV4dFNwbGF5KCk7CisKKyAgICAgICAgd2hpbGUgKCBzICE9IG51bGwgJiYgcy5pc0F0dHIoKSApCisgICAgICAgICAgICBzID0gcy5uZXh0U3BsYXkoKTsKKworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBmaW5hbCBTcGxheSBwcmV2Tm9uQXR0clNwbGF5ICggKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IHByZXZTcGxheSgpOworCisgICAgICAgIHdoaWxlICggcyAhPSBudWxsICYmIHMuaXNBdHRyKCkgKQorICAgICAgICAgICAgcyA9IHMucHJldlNwbGF5KCk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgZmluYWwgU3BsYXkgbmV4dFNwbGF5ICggKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IHRoaXM7CisgICAgICAgIFNwbGF5IHIgPSBzLl9yaWdodFNwbGF5OworCisgICAgICAgIGlmIChyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIFNwbGF5IGwgPSBzID0gciA7IChsID0gbC5fbGVmdFNwbGF5KSAhPSBudWxsIDsgKQorICAgICAgICAgICAgICAgIHMgPSBsOworCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKKyAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fbGVmdFNwbGF5ID09IHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgZmluYWwgU3BsYXkgcHJldlNwbGF5ICggKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IHRoaXM7CisgICAgICAgIFNwbGF5IGwgPSBzLl9sZWZ0U3BsYXk7CisKKyAgICAgICAgaWYgKGwgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggU3BsYXkgciA9IHMgPSBsIDsgKHIgPSByLl9yaWdodFNwbGF5KSAhPSBudWxsIDsgKQorICAgICAgICAgICAgICAgIHMgPSByOworCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIFNwbGF5IHAgPSBzLl9wYXJlbnRTcGxheSA7IDsgcCA9IChzID0gcCkuX3BhcmVudFNwbGF5ICkKKyAgICAgICAgICAgIGlmIChwID09IG51bGwgfHwgcC5fcmlnaHRTcGxheSA9PSBzKQorICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIGZpbmFsIHZvaWQgcm90YXRlUmlnaHQgKCApCisgICAgeworICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPT0gdGhpczsKKworICAgICAgICBTcGxheSBwID0gX3BhcmVudFNwbGF5OworICAgICAgICBTcGxheSBnID0gcC5fcGFyZW50U3BsYXk7CisKKyAgICAgICAgYXNzZXJ0IHAgIT0gbnVsbDsKKworICAgICAgICBwLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheTsKKworICAgICAgICBpZiAoX3JpZ2h0U3BsYXkgIT0gbnVsbCkKKyAgICAgICAgICAgIF9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7CisKKyAgICAgICAgX3JpZ2h0U3BsYXkgPSBwOworICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHRoaXM7CisgICAgICAgIF9wYXJlbnRTcGxheSA9IGc7CisKKyAgICAgICAgaWYgKGcgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGcuX2xlZnRTcGxheSA9PSBwKQorICAgICAgICAgICAgICAgIGcuX2xlZnRTcGxheSA9IHRoaXM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZy5fcmlnaHRTcGxheSA9IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwLmFkanVzdENjaExlZnQoIC0gZ2V0Q2NoTGVmdCgpIC0gZ2V0Q2NoKCkgKTsKKyAgICAgICAgcC5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSAtIGdldENkb2NCZWdpbigpICk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCByb3RhdGVMZWZ0ICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IF9wYXJlbnRTcGxheS5fcmlnaHRTcGxheSA9PSB0aGlzOworCisgICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7CisgICAgICAgIFNwbGF5IGcgPSBwLl9wYXJlbnRTcGxheTsKKworICAgICAgICBhc3NlcnQgcCAhPSBudWxsOworCisgICAgICAgIHAuX3JpZ2h0U3BsYXkgPSBfbGVmdFNwbGF5OworCisgICAgICAgIGlmIChfbGVmdFNwbGF5ICE9IG51bGwpCisgICAgICAgICAgICBfbGVmdFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7CisKKyAgICAgICAgX2xlZnRTcGxheSA9IHA7CisgICAgICAgIHAuX3BhcmVudFNwbGF5ID0gdGhpczsKKyAgICAgICAgX3BhcmVudFNwbGF5ID0gZzsKKworICAgICAgICBpZiAoZyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCisgICAgICAgICAgICAgICAgZy5fbGVmdFNwbGF5ID0gdGhpczsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnLl9yaWdodFNwbGF5ID0gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGFkanVzdENjaExlZnQoIHAuZ2V0Q2NoTGVmdCgpICsgcC5nZXRDY2goKSApOworICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCBwLmdldENkb2NCZWdpbkxlZnQoKSArIHAuZ2V0Q2RvY0JlZ2luKCkgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNwbGF5IHRoaXMgc28gdGhhdCBpdCdzIHBhcmVudCBpcyBwU3RvcC4KKyAgICAvLworICAgIC8vIFRoaXMgdmVyc2lvbiBvZiBzcGxheSBpcyBjYXBhYmxlIG9mIHNwbGF5aW5nIHRoaXMgdG8gdGhlIHRvcC4gIFRoZXJlCisgICAgLy8gYXJlIHR3byBjYXNlcy4gIE9uZSBpcyB0aGVyZSByIGlzIHRoaXMgYW5kIHRoaXMgaXMgc3BsYXllZCB0byBiZQorICAgIC8vIHRoZSBsZWZ0IGNoaWxkIG9mIHIuICBUaGUgb3RoZXIgY2FzZSBpcyB3aGVyZSByIGlzIG51bGwuICBJbiB0aGlzIGNhc2UKKyAgICAvLyB0aGUgdHJlZSB0aGlzIGlzIGluIGlzIGRldGFjaGVkIGZyb20gdGhlIG1haW4gZG9jdW1lbnQsIGFuZCB0aGlzIHdpbGwgYmUKKyAgICAvLyBzcGxheWVkIHRvIHRoZSB0b3Agb2YgdGhhdCBzdWJ0cmVlIHN1Y2ggdGhhdCBpdCdzIHBhcmVudCB3aWxsIGJlIG51bGwuCisgICAgLy8KKworICAgIGZpbmFsIHZvaWQgc3BsYXkgKCBSb290IHIsIFNwbGF5IHBTdG9wICkKKyAgICB7CisgICAgICAgIGFzc2VydCBwU3RvcCAhPSBudWxsOworICAgICAgICBhc3NlcnQgdGhpcyAhPSBwU3RvcDsKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHIgPT0gbnVsbCB8fCBnZXRSb290U2xvdygpID09IHI7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCByID09IG51bGwgfHwgcFN0b3AuZ2V0Um9vdFNsb3coKSA9PSByOworICAgICAgICBhc3NlcnQgciA9PSBudWxsIHx8IHIudmFsaWRhdGVTcGxheVRyZWUoKTsKKyAgICAgICAgYXNzZXJ0ICFpc1Jvb3QoKTsKKworICAgICAgICBib29sZWFuIHJvdGF0ZWQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7CisKKyAgICAgICAgICAgIFNwbGF5IHAgPSBfcGFyZW50U3BsYXk7CisKKyAgICAgICAgICAgIGFzc2VydCBwICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGlsZCBvZiB0aGUgc3RvcHBlciwgdGhlbiB3ZSBhcmUgZG9uZQorCisgICAgICAgICAgICBpZiAocCA9PSBwU3RvcCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgU3BsYXkgZyA9IHAuX3BhcmVudFNwbGF5OworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGNoaWxkIG9mIHJvb3QsIHRoZW4gc2ltcGxlIHJvdGF0ZQorCisgICAgICAgICAgICByb3RhdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKGcgPT0gcFN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQorICAgICAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcm90YXRlTGVmdCgpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZhbmN5IHNwbGF5cworCisgICAgICAgICAgICBpZiAoZy5fbGVmdFNwbGF5ID09IHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAuX2xlZnRTcGxheSA9PSB0aGlzKQorICAgICAgICAgICAgICAgICAgICBwLnJvdGF0ZVJpZ2h0KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByb3RhdGVMZWZ0KCk7CisKKyAgICAgICAgICAgICAgICByb3RhdGVSaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwLl9yaWdodFNwbGF5ID09IHRoaXMpCisgICAgICAgICAgICAgICAgICAgIHAucm90YXRlTGVmdCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcm90YXRlUmlnaHQoKTsKKworICAgICAgICAgICAgICAgIHJvdGF0ZUxlZnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb3RhdGVkICYmIHIgIT0gbnVsbCkKKyAgICAgICAgICAgIHIuX2xlZnRPbmx5ID0gZmFsc2U7CisKKyAgICAgICAgYXNzZXJ0IHIgPT0gbnVsbCB8fCByLnZhbGlkYXRlU3BsYXlUcmVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoaXMgc3BsYXkgd2hlcmUgcm9vdCBpcyB0aGUgc3BsYXkgcm9vdCBvZiB0aGUgdHJlZSB0aGlzIHNwbGF5LgorICAgICAqIFRoaXMgbWF5IGJlIGEgUk9PVCBzcGxheQorICAgICAqLworCisgICAgZmluYWwgU3BsYXkgcmVtb3ZlU3BsYXkgKCBTcGxheSByICkKKyAgICB7CisgICAgICAgIFJvb3Qgcm9vdCA9IHIuaXNSb290KCkgPyAoUm9vdCkgciA6IG51bGw7CisKKyAgICAgICAgYXNzZXJ0IHIuX3BhcmVudFNwbGF5ID09IG51bGw7CisgICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOworICAgICAgICBhc3NlcnQgIWlzUm9vdCgpOworICAgICAgICBhc3NlcnQgIWlzRG9jKCk7CisgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBnZXRTcGxheVJvb3RTbG93KCkgPT0gcjsKKworICAgICAgICAvLyBJZiB0aGUgc3BsYXkgdG8gYmUgcmVtb3ZlZCBoYXMgbm8gY2NoIG9yIGNiZWdpbiwgdGhlbiB3aGVuIHRoZQorICAgICAgICAvLyB0cmVlIGlzIGxlZnQgb25seSBjaGlsZHJlbiwgd2UgbmVlZCBub3Qgc3BsYXkuCisKKyAgICAgICAgaW50IGNjaCA9IGdldENjaCgpOworICAgICAgICBpbnQgY2JlZ2luID0gZ2V0Q2RvY0JlZ2luKCk7CisKKyAgICAgICAgaWYgKHJvb3QgIT0gbnVsbCAmJiByb290Ll9sZWZ0T25seSAmJiBjY2ggPT0gMCAmJiBjYmVnaW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IF9yaWdodFNwbGF5ID09IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgX3BhcmVudFNwbGF5ICE9IG51bGw7CisKKyAgICAgICAgICAgIGlmICgoX3BhcmVudFNwbGF5Ll9sZWZ0U3BsYXkgPSBfbGVmdFNwbGF5KSAhPSBudWxsKQorICAgICAgICAgICAgICAgIF9sZWZ0U3BsYXkuX3BhcmVudFNwbGF5ID0gX3BhcmVudFNwbGF5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3BsYXkoIHJvb3QsIHIgKTsKKworICAgICAgICAgICAgaWYgKF9sZWZ0U3BsYXkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByLmFkanVzdENjaExlZnQoIC0gY2NoICk7CisgICAgICAgICAgICAgICAgci5hZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGNiZWdpbiApOworCisgICAgICAgICAgICAgICAgaWYgKChyLl9sZWZ0U3BsYXkgPSBfcmlnaHRTcGxheSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgX3JpZ2h0U3BsYXkuX3BhcmVudFNwbGF5ID0gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTcGxheSBwID0gcHJldlNwbGF5KCk7CisKKyAgICAgICAgICAgICAgICBwLnNwbGF5KCByb290LCB0aGlzICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgcC5fcmlnaHRTcGxheSA9PSBudWxsOworCisgICAgICAgICAgICAgICAgci5fbGVmdFNwbGF5ID0gcDsKKyAgICAgICAgICAgICAgICBwLl9wYXJlbnRTcGxheSA9IHI7CisgICAgICAgICAgICAgICAgci5hZGp1c3RDY2hMZWZ0KCAtIGNjaCApOworICAgICAgICAgICAgICAgIHIuYWRqdXN0Q2RvY0JlZ2luTGVmdCggLSBjYmVnaW4gKTsKKyAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5ID0gX3JpZ2h0U3BsYXk7CisKKyAgICAgICAgICAgICAgICBpZiAocC5fcmlnaHRTcGxheSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBwLl9yaWdodFNwbGF5Ll9wYXJlbnRTcGxheSA9IHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfbGVmdFNwbGF5ID0gX3JpZ2h0U3BsYXkgPSBfcGFyZW50U3BsYXkgPSBudWxsOworICAgICAgICBhZGp1c3RDY2hMZWZ0KCAtIGdldENjaExlZnQoKSApOworICAgICAgICBhZGp1c3RDZG9jQmVnaW5MZWZ0KCAtIGdldENkb2NCZWdpbkxlZnQoKSApOworCisgICAgICAgIGFzc2VydCByb290ID09IG51bGwgfHwgcm9vdC52YWxpZGF0ZVNwbGF5VHJlZSgpOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlIFpvbyAobW9yZSBsaWtlIGEgcGV0dGluZyB6b28gbm93KQorICAgIC8vCisKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUU5hbWVTcGxheSBleHRlbmRzIFNwbGF5CisgICAgeworICAgICAgICBRTmFtZVNwbGF5ICggaW50IGtpbmQsIGJvb2xlYW4gaXMsIFFOYW1lIG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigga2luZCwgaXMgKTsKKyAgICAgICAgICAgIF9uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFFOYW1lIGdldE5hbWUgKCApIHsgcmV0dXJuIF9uYW1lOyB9CisgICAgICAgIGZpbmFsIHZvaWQgIGNoYW5nZU5hbWUgKCBRTmFtZSBuYW1lICkgeyBfbmFtZSA9IG5hbWU7IH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0VXJpICAgKCApIHsgcmV0dXJuIF9uYW1lLmdldE5hbWVzcGFjZVVSSSgpOyB9CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRMb2NhbCAoICkgeyByZXR1cm4gX25hbWUuZ2V0TG9jYWxQYXJ0KCk7ICAgIH0KKworICAgICAgICBwcml2YXRlIFFOYW1lIF9uYW1lOworICAgIH0KKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250YWluZXIgZXh0ZW5kcyBRTmFtZVNwbGF5CisgICAgeworICAgICAgICBDb250YWluZXIgKCBpbnQga2luZCwgYm9vbGVhbiBpcywgUU5hbWUgbmFtZSApCisgICAgICAgICAgICB7IHN1cGVyKCBraW5kLCBpcywgbmFtZSApOyB9CisKKyAgICAgICAgYWJzdHJhY3QgRmluaXNoIGdldEZpbmlzaCAoICk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIERvYyBleHRlbmRzIENvbnRhaW5lcgorICAgIHsKKyAgICAgICAgRG9jICggUm9vdCByLCBRTmFtZSBuYW1lICkKKyAgICAgICAgICAgIHsgc3VwZXIoIERPQywgZmFsc2UsIG5hbWUgKTsgX3Jvb3QgPSByOyB9CisKKyAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQorICAgICAgICBGaW5pc2ggICAgZ2V0RmluaXNoICggKSB7IHJldHVybiBfcm9vdDsgfQorCisgICAgICAgIFJvb3QgX3Jvb3Q7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJlZ2luIGV4dGVuZHMgQ29udGFpbmVyCisgICAgeworICAgICAgICBCZWdpbiAoIFFOYW1lIG5hbWUsIENvbnRhaW5lciBjb250YWluZXIgKQorICAgICAgICAgICAgeyBzdXBlciggQkVHSU4sIGZhbHNlLCBuYW1lICk7IF9jb250YWluZXIgPSBjb250YWluZXI7IH0KKworICAgICAgICBmaW5hbCBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfY29udGFpbmVyOyB9CisgICAgICAgIGZpbmFsIEZpbmlzaCAgICBnZXRGaW5pc2ggICAgKCApIHsgcmV0dXJuIF9lbmQ7IH0KKworICAgICAgICBFbmQgICAgICAgICBfZW5kOworICAgICAgICBDb250YWluZXIgICBfY29udGFpbmVyOworICAgIH0KKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGaW5pc2ggZXh0ZW5kcyBTcGxheQorICAgIHsKKyAgICAgICAgRmluaXNoICggaW50IGtpbmQgKSB7IHN1cGVyKCBraW5kLCBmYWxzZSApOyB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEVuZCBleHRlbmRzIEZpbmlzaAorICAgIHsKKyAgICAgICAgRW5kICggQmVnaW4gYmVnaW4gKSB7IHN1cGVyKCBFTkQgKTsgX2JlZ2luID0gYmVnaW47IH0KKworICAgICAgICBDb250YWluZXIgZ2V0Q29udGFpbmVyICggKSB7IHJldHVybiBfYmVnaW47IH0KKworICAgICAgICBmaW5hbCBCZWdpbiBfYmVnaW47CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBTcGxheQorICAgIHsKKyAgICAgICAgQ29tbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgZmFsc2UgKTsgfQorCisgICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGcmFnbWVudCBleHRlbmRzIFNwbGF5CisgICAgeworICAgICAgICBGcmFnbWVudCAoICkgeyBzdXBlciggQ09NTUVOVCwgdHJ1ZSApOyB9CisKKyAgICAgICAgQ29udGFpbmVyIGdldENvbnRhaW5lciAoICkgeyByZXR1cm4gbnVsbDsgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBdHRyIGV4dGVuZHMgUU5hbWVTcGxheQorICAgIHsKKyAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBBVFRSLCBmYWxzZSwgbmFtZSApOyB9CisKKyAgICAgICAgQXR0ciAoIFFOYW1lIG5hbWUsIGJvb2xlYW4gaXNYbWxucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCBBVFRSLCB0cnVlLCBuYW1lICk7CisgICAgICAgICAgICBhc3NlcnQgaXNYbWxuczsKKyAgICAgICAgfQorCisgICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIFNwbGF5IHMgPSBwcmV2U3BsYXkoKSA7IDsgcyA9IHMucHJldlNwbGF5KCkgKQorICAgICAgICAgICAgICAgIGlmICghcy5pc0F0dHIoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDb250YWluZXIpIHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgWG1sbnMgZXh0ZW5kcyBBdHRyCisgICAgeworICAgICAgICBYbWxucyAoIFFOYW1lIG5hbWUgKSB7IHN1cGVyKCBuYW1lLCB0cnVlICk7IH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgUHJvY2luc3QgZXh0ZW5kcyBRTmFtZVNwbGF5CisgICAgeworICAgICAgICBQcm9jaW5zdCAoIFFOYW1lIHRhcmdldCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCBQUk9DSU5TVCwgZmFsc2UsIHRhcmdldCApOworICAgICAgICB9CisKKyAgICAgICAgUHJvY2luc3QgKCBTdHJpbmcgdGFyZ2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoIFBST0NJTlNULCBmYWxzZSwgbmV3IFFOYW1lKCAiIiwgdGFyZ2V0ICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbnRhaW5lciBnZXRDb250YWluZXIgKCApIHsgcmV0dXJuIGZpbmRDb250YWluZXIoKTsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV2ZXJ5IHNwbGF5IHBvaW50cyB0byBhIGNvbGxlY3Rpb24gb2YgZ29vYmVycy4gIEdvb2JlcnMgY2FuIGJlCisgICAgICogYWdncmVnYXRlZCBpbnRvIGdyb3VwcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBzdGF0ZSAoa2luZCBhbmQgcG9zaXRpb24pLgorICAgICAqLworCisgICAgc3RhdGljIGZpbmFsIGludCBDVVJTT1IgICAgID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFRZUEUgICAgICAgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTiA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVEUgID0gMzsKKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHb29iZXIgZXh0ZW5kcyBHb29iZXJzCisgICAgeworICAgICAgICBHb29iZXIgKCBSb290IHIsIGludCBraW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgX3Jvb3QgPSByOworICAgICAgICAgICAgX3N0YXRlID0ga2luZDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCAgIGdldEtpbmQgICggKSB7IHJldHVybiBfc3RhdGUgJiA3OyAgfQorICAgICAgICBmaW5hbCBSb290ICBnZXRSb290ICAoICkgeyByZXR1cm4gX3Jvb3Q7ICAgICAgIH0KKyAgICAgICAgZmluYWwgU3BsYXkgZ2V0U3BsYXkgKCApIHsgcmV0dXJuIF9zcGxheTsgICAgICB9CisgICAgICAgIGZpbmFsIGludCAgIGdldFBvcyAgICggKSB7IHJldHVybiBfc3RhdGUgPj4gMzsgfQorICAgICAgICBmaW5hbCBpbnQgICBnZXRTdGF0ZSAoICkgeyByZXR1cm4gX3N0YXRlOyAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIGlzQW5ub3RhdGlvbiAoICkgeyByZXR1cm4gZ2V0S2luZCgpID09IEFOTk9UQVRJT047IH0KKworICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOworICAgICAgICAgICAgZG9TZXQoIHIsIHMsIHAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBkb1NldCAoIFJvb3QgciwgU3BsYXkgcywgaW50IHAgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsIHx8IHAgPT0gMDsKKyAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBzID09IG51bGwgfHwgciA9PSBzLmdldFJvb3RTbG93KCk7CisgICAgICAgICAgICBhc3NlcnQgUm9vdC5kdiA+IDAgfHwgX3NwbGF5ID09IG51bGwgfHwgX3Jvb3QgPT0gX3NwbGF5LmdldFJvb3RTbG93KCk7CisvLyAgICAgICAgICAgIGFzc2VydCBSb290LmR2ID4gMCB8fCBfcm9vdCA9PSByIHx8IF9zcGxheS5nZXRSb290U2xvdygpICE9IHMuZ2V0Um9vdFNsb3coKTsKKworICAgICAgICAgICAgX3Jvb3QgPSByOworCisgICAgICAgICAgICBpZiAoX3NwbGF5ICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9zcGxheSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZW1vdmUoKTsKKworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgcCA+PSAwOworICAgICAgICAgICAgYXNzZXJ0IF9zcGxheSA9PSBudWxsIHx8IHAgPD0gX3NwbGF5LmdldE1heFBvcygpOworICAgICAgICAgICAgX3N0YXRlID0gcCAqIDggKyAoX3N0YXRlICYgNyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFJvb3QgciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCByICE9IG51bGw7CisgICAgICAgICAgICBfcm9vdCA9IHI7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCB2b2lkIHNldCAoIFNwbGF5IHMsIGludCBwICkgeyBkb1NldCggZ2V0Um9vdCgpLCBzLCAgICAgICAgICBwICk7IH0KKyAgICAgICAgZmluYWwgdm9pZCBzZXQgKCAgICAgICAgICBpbnQgcCApIHsgZG9TZXQoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgcCApOyB9CisKKyAgICAgICAgZmluYWwgdm9pZCBzZXQgKCBHb29iZXIgZyApCisgICAgICAgICAgICB7IGRvU2V0KCBnLmdldFJvb3QoKSwgZy5nZXRTcGxheSgpLCBnLmdldFBvcygpICk7IH0KKworICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQorICAgICAgICB7CisgICAgICAgICAgICBkb1NldCggciwgbnVsbCwgMCApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWxlYXNlICggKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQoIG51bGwsIDApOworICAgICAgICAgICAgX3Jvb3QgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFwcGVuZCAoIFNwbGF5IHMgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IHMuZ2V0Um9vdFNsb3coKSA9PSBfcm9vdDsKKyAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgPT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBfcGFyZW50ID09IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgX25leHQgPT0gbnVsbCAmJiBfcHJldiA9PSBudWxsOworCisgICAgICAgICAgICBpZiAocy5fZ29vYmVycyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMuX2dvb2JlcnMgPSB0aGlzOworICAgICAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9uZXh0ID0gcy5fZ29vYmVyczsKKyAgICAgICAgICAgICAgICBfcHJldiA9IF9uZXh0Ll9wcmV2OworICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gdGhpczsKKyAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9zcGxheSA9IHM7CisgICAgICAgICAgICBfcGFyZW50ID0gczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCByZW1vdmUgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBfc3BsYXkgIT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBfZ29vYmVycyA9PSBudWxsOworCisgICAgICAgICAgICBpZiAoX25leHQgPT0gdGhpcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzOworCisgICAgICAgICAgICAgICAgX3BhcmVudC5fZ29vYmVycyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBwYXJlbnQgaXMgYW4gYWdncmVnYXRlIGdvb2JlciwgcmVtb3ZlIGl0IHRvbworCisgICAgICAgICAgICAgICAgaWYgKF9wYXJlbnQgIT0gX3NwbGF5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR29vYmVyIGcgPSAoR29vYmVyKSBfcGFyZW50OworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZy5nZXRLaW5kKCkgPT0gQUdHUkVHQVRFOworICAgICAgICAgICAgICAgICAgICBnLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfcHJldi5fbmV4dCA9IF9uZXh0OworICAgICAgICAgICAgICAgIF9uZXh0Ll9wcmV2ID0gX3ByZXY7CisKKyAgICAgICAgICAgICAgICBpZiAoX3BhcmVudC5fZ29vYmVycyA9PSB0aGlzKQorICAgICAgICAgICAgICAgICAgICBfcGFyZW50Ll9nb29iZXJzID0gX25leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9uZXh0ID0gX3ByZXYgPSBudWxsOworCisgICAgICAgICAgICBfcGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgIF9zcGxheSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBYbWxCb29rbWFyayBnZXRCb29rbWFyayAoICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZ2V0S2luZCgpID09IEFOTk9UQVRJT04KKyAgICAgICAgICAgICAgICAgICAgPyAoKEFubm90YXRpb24pIHRoaXMpLmdldFhtbEJvb2ttYXJrKCkKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldEtpbmROYW1lICggKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCBnZXRLaW5kKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDVVJTT1IgICAgIDogcmV0dXJuICJDVVJTT1IiOworICAgICAgICAgICAgY2FzZSBUWVBFICAgICAgIDogcmV0dXJuICJUWVBFIjsKKyAgICAgICAgICAgIGNhc2UgQU5OT1RBVElPTiA6IHJldHVybiAiQU5OT1RBVElPTiI7CisgICAgICAgICAgICBkZWZhdWx0ICAgICAgICAgOiByZXR1cm4gIjx1bmtub3cgZ29vYmVyIGtpbmQ+IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUm9vdCBfcm9vdDsKKworICAgICAgICBwcml2YXRlIFNwbGF5IF9zcGxheTsKKworICAgICAgICBwcml2YXRlIGludCBfc3RhdGU7ICAvLyBwb3MgYW5kIGtpbmQKKworICAgICAgICBHb29iZXIgIF9uZXh0OworICAgICAgICBHb29iZXIgIF9wcmV2OworICAgICAgICBHb29iZXJzIF9wYXJlbnQ7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEN1cnNvckdvb2JlciBleHRlbmRzIEdvb2JlcgorICAgIHsKKyAgICAgICAgQ3Vyc29yR29vYmVyICggUm9vdCByICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoIHIsIENVUlNPUiApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBjcmVhdGVEZWJ1Z0lkTWFwICggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVlcHkgd2F5IHRvIGRpc2NvdmVyIGlzIGFzc2VydCBpcyBlbmFibGVkLgorICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBudWxsOworICAgICAgICAgICAgYXNzZXJ0IChtYXAgPSBuZXcgSGFzaE1hcCgpKSAhPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9kZWJ1Z0lkcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgc3luY2hyb25pemVkICggX2RlYnVnSWRzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQorICAgICAgICAgICAgICAgICAgICBfZGVidWdJZHMucHV0KCB0aGlzLCBuZXcgSW50ZWdlciggX25leHREZWJ1Z0lkKysgKSApOworCisgICAgICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgX2RlYnVnSWRzLmdldCggdGhpcyApKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBfZGVidWdJZHMgPSBjcmVhdGVEZWJ1Z0lkTWFwKCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCAgIF9uZXh0RGVidWdJZCA9IDE7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFubm90YXRpb24gZXh0ZW5kcyBHb29iZXIgaW1wbGVtZW50cyBYbWxNYXJrCisgICAgeworICAgICAgICBwdWJsaWMgT2JqZWN0IG1vbml0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdCgpOworICAgICAgICB9CisKKyAgICAgICAgQW5ub3RhdGlvbiAoIFJvb3QgciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCByLCBBTk5PVEFUSU9OICk7CisgICAgICAgIH0KKworICAgICAgICBBbm5vdGF0aW9uICggUm9vdCByLCBYbWxCb29rbWFyayBhICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyggciApOworCisgICAgICAgICAgICBpZiAoYS5fcmVmID09IG51bGwpCisgICAgICAgICAgICAgICAgX2Fubm90YXRpb24gPSBhOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9yZWYgPSBhLl9yZWY7CisKKyAgICAgICAgICAgIF9rZXkgPSBhLmdldEtleSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRLZXkgKCBPYmplY3Qga2V5ICkKKyAgICAgICAgeworICAgICAgICAgICAgX2tleSA9IGtleTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGxlZCB2aWEgYm9va21hcmsgKHB1YmxpYyB2aWEgWG1sTWFyaykKKyAgICAgICAgcHVibGljIGZpbmFsIFhtbEN1cnNvciBjcmVhdGVDdXJzb3IgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobW9uaXRvcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChnZXRTcGxheSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gY3JlYXRlIGEgY3Vyc29yIG9uIGEgYm9va21hcmsgdGhhdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGJlZW4gY2xlYXJlZCBvciByZXBsYWNlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvciggZ2V0Um9vdCgpLCBnZXRTcGxheSgpLCBnZXRQb3MoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEJvb2ttYXJrIGdldFhtbEJvb2ttYXJrICggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2Fubm90YXRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gX2Fubm90YXRpb247CisKKyAgICAgICAgICAgIGlmIChfcmVmICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxCb29rbWFyaykgX3JlZi5nZXQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRpc2Nvbm5lY3QgKCBSb290IHIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7CisKKyAgICAgICAgICAgIFhtbEJvb2ttYXJrIHhhID0gZ2V0WG1sQm9va21hcmsoKTsKKworICAgICAgICAgICAgaWYgKHhhICE9IG51bGwpCisgICAgICAgICAgICAgICAgeGEuX2N1cnJlbnRNYXJrID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFhtbEJvb2ttYXJrIF9hbm5vdGF0aW9uOworICAgICAgICBSZWZlcmVuY2UgICAgIF9yZWY7CisKKyAgICAgICAgT2JqZWN0IF9rZXk7CisgICAgfQorCisgICAgZmluYWwgR29vYmVyIGZpcnN0R29vYmVyICggKQorICAgIHsKKyAgICAgICAgaWYgKF9nb29iZXJzID09IG51bGwgfHwgX2dvb2JlcnMuZ2V0S2luZCgpICE9IEFHR1JFR0FURSkKKyAgICAgICAgICAgIHJldHVybiBfZ29vYmVyczsKKworICAgICAgICBhc3NlcnQgX2dvb2JlcnMuX2dvb2JlcnMgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IF9nb29iZXJzLl9nb29iZXJzLmdldEtpbmQoKSAhPSBBR0dSRUdBVEU7CisKKyAgICAgICAgcmV0dXJuIF9nb29iZXJzLl9nb29iZXJzOworICAgIH0KKworICAgIGZpbmFsIEdvb2JlciBuZXh0R29vYmVyICggR29vYmVyIGcgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGcgIT0gbnVsbDsKKworICAgICAgICBpZiAoKGcgPSBnLl9uZXh0KSAhPSBnLl9wYXJlbnQuX2dvb2JlcnMpCisgICAgICAgICAgICByZXR1cm4gZzsKKworICAgICAgICByZXR1cm4gZy5fcGFyZW50ID09IGcuX3NwbGF5ID8gbnVsbCA6IG5leHRHb29iZXIoIChHb29iZXIpIGcuX3BhcmVudCApOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIF9hc3NlcnRFbmFibGVkID0gZ2V0QXNzZXJ0RW5hYmxlZCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXRBc3NlcnRFbmFibGVkICggKQorICAgIHsKKyAgICAgICAgLy8gQ3JlZXB5IHdheSB0byBkaXNjb3ZlciBpcyBhc3NlcnQgaXMgZW5hYmxlZC4KKyAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7CisgICAgICAgIGFzc2VydCAoZW5hYmxlZCA9IHRydWUpIHx8IHRydWU7CisgICAgICAgIHJldHVybiBlbmFibGVkOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydEFzc2VydEVuYWJsZWQgKCApCisgICAgeworICAgICAgICBpZiAoIV9hc3NlcnRFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0IG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXNzb2NpYXRlIGlkJ3Mgd2l0aCBzcGxheXMgd2hlbiBhc3NlcnRzIGFyZSBlbmFibGVkCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwIF9kZWJ1Z0lkcyA9CisgICAgICAgIF9hc3NlcnRFbmFibGVkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgX25leHREZWJ1Z0lkID0gMTsKKworICAgIHB1YmxpYyBpbnQgZ2V0RGVidWdJZCAoICkKKyAgICB7CisgICAgICAgIGlmIChfZGVidWdJZHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKCBfZGVidWdJZHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9kZWJ1Z0lkcy5jb250YWluc0tleSggdGhpcyApKQorICAgICAgICAgICAgICAgIF9kZWJ1Z0lkcy5wdXQoIHRoaXMsIG5ldyBJbnRlZ2VyKCBfbmV4dERlYnVnSWQrKyApICk7CisKKyAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIF9kZWJ1Z0lkcy5nZXQoIHRoaXMgKSkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHVtcCAoICkgeyBnZXRSb290U2xvdygpLmR1bXAoKTsgfQorICAgIHZvaWQgZHVtcCAoIGJvb2xlYW4gdmVyYm9zZSApIHsgZ2V0Um9vdFNsb3coKS5kdW1wKCB2ZXJib3NlICk7IH0KKworICAgIHB1YmxpYyBTcGxheSBnZXRTcGxheVJvb3RTbG93ICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOworCisgICAgICAgIFNwbGF5IHMgPSB0aGlzOworCisgICAgICAgIHdoaWxlICggcy5fcGFyZW50U3BsYXkgIT0gbnVsbCApCisgICAgICAgICAgICBzID0gcy5fcGFyZW50U3BsYXk7CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIFJvb3QgZ2V0Um9vdFNsb3cgKCApCisgICAgeworICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7CisKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5Um9vdFNsb3coKTsKKworICAgICAgICByZXR1cm4gcy5pc1Jvb3QoKSA/IChSb290KSBzIDogbnVsbDsKKyAgICB9CisKKyAgICBpbnQgZ2V0Q3BTbG93ICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOworCisgICAgICAgIGludCBjY2ggPSAwOworCisgICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgKHMgPSBzLnByZXZTcGxheSgpKSAhPSBudWxsIDsgKQorICAgICAgICAgICAgY2NoICs9IHMuZ2V0Q2NoKCk7CisKKyAgICAgICAgcmV0dXJuIGNjaDsKKyAgICB9CisKKyAgICBpbnQgY29tcGFyZVNsb3cgKCBTcGxheSBzVGhhdCApCisgICAgeworICAgICAgICBhc3NlcnRBc3NlcnRFbmFibGVkKCk7CisKKyAgICAgICAgYXNzZXJ0IFJvb3QuZHYgPiAwIHx8IGdldFJvb3RTbG93KCkgPT0gc1RoYXQuZ2V0Um9vdFNsb3coKTsKKworICAgICAgICBpZiAodGhpcyA9PSBzVGhhdCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGZvciAoIFNwbGF5IHMgPSB0aGlzIDsgcyAhPSBudWxsIDsgcyA9IHMucHJldlNwbGF5KCkgKQorICAgICAgICAgICAgaWYgKHMgPT0gc1RoYXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgYXNzZXJ0IGZhbHNlOiAiWWlrZXMhIjsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sZWFuIHZhbGlkYXRlICggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QXNzZXJ0RW5hYmxlZCgpOworCisgICAgICAgIHJldHVybiBnZXRSb290U2xvdygpLnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBEb2N1bWVudCBzcGxheSB0cmVlIG1lbWJlcnMKKyAgICAvLworCisgICAgU3BsYXkgX2xlZnRTcGxheTsKKyAgICBTcGxheSBfcmlnaHRTcGxheTsKKyAgICBTcGxheSBfcGFyZW50U3BsYXk7CisKKyAgICBwcml2YXRlIGludCBfYml0czsgLy8gMjc6IGNEb2NiZWdpbkxlZnQsIDE6IGludmFsaWQsIDE6IG11bHRpLCAzOiBraW5kCisgICAgcHJpdmF0ZSBpbnQgX2NjaDsKKyAgICBwcml2YXRlIGludCBfY2NoQWZ0ZXI7CisgICAgcHJpdmF0ZSBpbnQgX2NjaExlZnQ7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzQ0YjIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1RleHQuamF2YQpAQCAtMCwwICsxLDMwOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOworCisvL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5Xcml0ZUNvbnRleHQ7CisvL2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdC5SZWFkQ29udGV4dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgVGV4dAoreworICAgIGNoYXJbXSBfYnVmOworICAgIGludCAgICBfZ2FwOyAgICAvLyBXaGVyZSB0aGUgZ2FwIHN0YXJ0cworICAgIGludCAgICBfZ2FwTGVuOyAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBnYXAKKworICAgIGludCBsZW5ndGggKCApCisgICAgeworICAgICAgICByZXR1cm4gYnVmTGVuKCkgLSBfZ2FwTGVuOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGJ1ZkxlbiAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfYnVmID09IG51bGwgPyAwIDogX2J1Zi5sZW5ndGg7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvcHkgKCBjaGFyW10gbmV3QnVmICkKKyAgICB7CisgICAgICAgIGFzc2VydCBfYnVmICE9IG51bGwgJiYgbmV3QnVmLmxlbmd0aCA+PSBsZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIDAsIG5ld0J1ZiwgMCwgX2dhcCApOworCisgICAgICAgIGludCBsZW5BZnRlckdhcCA9IF9idWYubGVuZ3RoIC0gX2dhcCAtIF9nYXBMZW47CisKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKKyAgICAgICAgICAgIF9idWYsIF9nYXAgKyBfZ2FwTGVuLAorICAgICAgICAgICAgbmV3QnVmLCBuZXdCdWYubGVuZ3RoIC0gKGxlbkFmdGVyR2FwKSwgbGVuQWZ0ZXJHYXAgKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZSAoIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGNjaCA+IF9nYXBMZW47CisgICAgICAgIAorICAgICAgICBpbnQgbmV3U2l6ZSA9IGxlbmd0aCgpICsgY2NoOworICAgICAgICBpbnQgbmV3TGVuID0gX2J1ZiA9PSBudWxsID8gMTAyNCA6IF9idWYubGVuZ3RoICogMjsKKworICAgICAgICB3aGlsZSAoIG5ld0xlbiA8IG5ld1NpemUgKQorICAgICAgICAgICAgbmV3TGVuICo9IDI7CisKKyAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbmV3TGVuIF07CisKKyAgICAgICAgaWYgKF9idWYgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgY29weSggbmV3QnVmICk7CisgICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGggLSBfYnVmLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBfZ2FwTGVuICs9IG5ld0J1Zi5sZW5ndGg7CisKKyAgICAgICAgX2J1ZiA9IG5ld0J1ZjsKKyAgICB9CisKKyAgICB2b2lkIHRyaW0gKCApCisgICAgeworICAgICAgICBpZiAoX2J1ZiAhPSBudWxsICYmIF9nYXBMZW4gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhcltdIG5ld0J1ZiA9IG5ldyBjaGFyIFsgbGVuZ3RoKCkgXTsKKworICAgICAgICAgICAgY29weSggbmV3QnVmICk7CisKKyAgICAgICAgICAgIF9idWYgPSBuZXdCdWY7CisgICAgICAgICAgICBfZ2FwID0gMDsKKyAgICAgICAgICAgIF9nYXBMZW4gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtb3ZlICggaW50IHBvcywgVGV4dCBzcmMsIGludCBzcmNQb3MsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgaW5zZXJ0KCBwb3MsIHNyYywgc3JjUG9zLCBjY2ggKTsKKworICAgICAgICBpZiAoc3JjID09IHRoaXMgJiYgc3JjUG9zID49IHBvcykKKyAgICAgICAgICAgIHNyY1BvcyArPSBjY2g7CisKKyAgICAgICAgc3JjLnJlbW92ZSggc3JjUG9zLCBjY2ggKTsKKyAgICB9CisKKyAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIE9iamVjdCB0eHQsIGludCBvZmYsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgaWYgKHR4dCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHh0IGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoU3RyaW5nKSB0eHQsIG9mZiwgY2NoICk7CisgICAgICAgICAgICBlbHNlIGlmICh0eHQgaW5zdGFuY2VvZiBUZXh0KQorICAgICAgICAgICAgICAgIGluc2VydCggcG9zLCAoVGV4dCkgdHh0LCBvZmYsIGNjaCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCB0eHQgaW5zdGFuY2VvZiBjaGFyW107CisgICAgICAgICAgICAgICAgaW5zZXJ0KCBwb3MsIChjaGFyW10pIHR4dCwgb2ZmLCBjY2ggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFRleHQgc3JjLCBpbnQgc3JjUG9zLCBpbnQgY2NoICkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgY2FuIGRlYWwgd2l0aCBjb3B5aW5nIGZyb20gaXRzZWxmCisgICAgICAgIC8vCisKKyAgICAgICAgaWYgKGNjaCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQorICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOworCisgICAgICAgICAgICBpZiAoc3JjUG9zICsgY2NoIDwgc3JjLl9nYXApCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgY2NoICk7CisgICAgICAgICAgICBlbHNlIGlmIChzcmNQb3MgPj0gc3JjLl9nYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKKyAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyY1BvcyArIHNyYy5fZ2FwTGVuLCBfYnVmLCBfZ2FwLCBjY2ggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdExlbiA9IHNyYy5fZ2FwIC0gc3JjUG9zOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggc3JjLl9idWYsIHNyY1BvcywgX2J1ZiwgX2dhcCwgbGVmdExlbiApOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSgKKyAgICAgICAgICAgICAgICAgICAgc3JjLl9idWYsIHNyYy5fZ2FwICsgc3JjLl9nYXBMZW4sCisgICAgICAgICAgICAgICAgICAgIF9idWYsIF9nYXAgKyBsZWZ0TGVuLCBjY2ggLSBsZWZ0TGVuICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9nYXAgKz0gY2NoOworICAgICAgICAgICAgX2dhcExlbiAtPSBjY2g7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBjaGFyW10gY2hhcnMsIGludCBvZmYsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGNoYXJzICE9IF9idWY7CisgICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7CisgICAgICAgIAorICAgICAgICBpZiAoY2NoID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNjaCA+IF9nYXBMZW4pCisgICAgICAgICAgICAgICAgcmVzaXplKCBjY2ggKTsKKworICAgICAgICAgICAgbW92ZUdhcCggcG9zICk7CisKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIGNoYXJzLCBvZmYsIF9idWYsIF9nYXAsIGNjaCApOworCisgICAgICAgICAgICBfZ2FwICs9IGNjaDsKKyAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbnNlcnQgKCBpbnQgcG9zLCBTdHJpbmcgcyApCisgICAgeworICAgICAgICBpbnNlcnQoIHBvcywgcywgMCwgcy5sZW5ndGgoKSApOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluc2VydCAoIGludCBwb3MsIFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgY2NoICkKKyAgICB7CisgICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgPD0gbGVuZ3RoKCk7CisgICAgICAgIAorICAgICAgICBpZiAoY2NoID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG9mZiA+PSAwICYmIG9mZiA8IHMubGVuZ3RoKCk7CisgICAgICAgICAgICBhc3NlcnQgY2NoIDw9IHMubGVuZ3RoKCkgLSBvZmY7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjY2ggPiBfZ2FwTGVuKQorICAgICAgICAgICAgICAgIHJlc2l6ZSggY2NoICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1vdmVHYXAoIHBvcyApOworCisgICAgICAgICAgICBzLmdldENoYXJzKCBvZmYsIG9mZiArIGNjaCwgX2J1ZiwgX2dhcCApOworCisgICAgICAgICAgICBfZ2FwICs9IGNjaDsKKyAgICAgICAgICAgIF9nYXBMZW4gLT0gY2NoOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoICkKKyAgICB7CisgICAgICAgIHJlbW92ZSggcG9zLCBjY2gsIG51bGwsIDAgKTsKKyAgICB9CisgICAgCisgICAgdm9pZCByZW1vdmUgKCBpbnQgcG9zLCBpbnQgY2NoLCBjaGFyW10gcmV0QnVmLCBpbnQgb2ZmICkKKyAgICB7CisgICAgICAgIGFzc2VydCBwb3MgPj0gMCAmJiBwb3MgKyBjY2ggPD0gbGVuZ3RoKCk7CisKKyAgICAgICAgbW92ZUdhcCggcG9zICk7CisKKyAgICAgICAgYXNzZXJ0IHJldEJ1ZiA9PSBudWxsIHx8IHJldEJ1Zi5sZW5ndGggLSBvZmYgPj0gY2NoOworCisgICAgICAgIGlmIChjY2ggPiAwICYmIHJldEJ1ZiAhPSBudWxsKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIHJldEJ1Ziwgb2ZmLCBjY2ggKTsKKyAgICAgICAgCisgICAgICAgIF9nYXBMZW4gKz0gY2NoOworICAgIH0KKworICAgIHZvaWQgbW92ZUdhcCggaW50IHBvcyApCisgICAgeworICAgICAgICBpZiAocG9zIDwgX2dhcCkKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgX2J1ZiwgcG9zICsgX2dhcExlbiwgX2dhcCAtIHBvcyApOworICAgICAgICBlbHNlIGlmIChwb3MgPiBfZ2FwKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIF9idWYsIF9nYXAsIHBvcyAtIF9nYXApOworCisgICAgICAgIF9nYXAgPSBwb3M7CisgICAgfQorCisgICAgaW50IHVuT2JzY3VyZSAoIGludCBwb3MsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGNjaCA+PSAwOworICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOworCisgICAgICAgIGlmIChjY2ggPiAwICYmIChwb3MgPCBfZ2FwICYmIHBvcyArIGNjaCA+IF9nYXApKQorICAgICAgICAgICAgbW92ZUdhcCggcG9zICsgY2NoICk7CisKKyAgICAgICAgcmV0dXJuIHBvcyA8IF9nYXAgPyBwb3MgOiBwb3MgKyBfZ2FwTGVuOworICAgIH0KKworICAgIHZvaWQgZmV0Y2ggKCBTdHJpbmdCdWZmZXIgc2IsIGludCBwb3MsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKKworICAgICAgICBpZiAoY2NoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQorICAgICAgICB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgY2NoICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID49IF9nYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBfYnVmLCBwb3MgKyBfZ2FwTGVuLCBjY2ggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGNjaCAtIF9nYXAgKyBwb3MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFN0cmluZyBmZXRjaCAoIGludCBwb3MsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHBvcyA+PSAwICYmIHBvcyArIGNjaCA8PSBsZW5ndGgoKTsKKworICAgICAgICBpZiAoY2NoID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcywgY2NoICk7CisKKyAgICAgICAgaWYgKHBvcyA+PSBfZ2FwKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIF9idWYsIHBvcyArIF9nYXBMZW4sIGNjaCApOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoIF9idWYsIHBvcywgX2dhcCAtIHBvcyApOworICAgICAgICBzYi5hcHBlbmQoIF9idWYsIF9nYXAgKyBfZ2FwTGVuLCBjY2ggLSBfZ2FwICsgcG9zICk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgdm9pZCBmZXRjaCAoIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBwb3MsIGludCBjY2ggKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IG9mZiA+PSAwOworICAgICAgICBhc3NlcnQgcG9zID49IDAgJiYgcG9zICsgY2NoIDw9IGxlbmd0aCgpOworICAgICAgICBhc3NlcnQgYnVmLmxlbmd0aCAtIG9mZiA+PSBjY2g7CisKKyAgICAgICAgaWYgKGNjaCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHBvcyArIGNjaCA8PSBfZ2FwKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zLCBidWYsIG9mZiwgY2NoICk7CisgICAgICAgIGVsc2UgaWYgKHBvcyA+PSBfZ2FwKQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSggX2J1ZiwgcG9zICsgX2dhcExlbiwgYnVmLCBvZmYsIGNjaCApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaHVuayA9IF9nYXAgLSBwb3M7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoIF9idWYsIHBvcywgYnVmLCBvZmYsIGNodW5rICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoCisgICAgICAgICAgICAgICAgX2J1ZiwgX2dhcCArIF9nYXBMZW4sIGJ1Ziwgb2ZmICsgY2h1bmssIGNjaCAtIGNodW5rICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZldGNoKCAwLCBsZW5ndGgoKSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhIGIvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzNWQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTAzOSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5WYWxpZGF0b3JMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQXR0cjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQmVnaW47CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5LkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuU3BsYXkuQ29weUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlNwbGF5Lkdvb2JlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLk5hbWVzcGFjZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVVc2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuVHlwZVN0b3JlVXNlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5UeXBlU3RvcmVWaXNpdG9yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuUU5hbWVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBUeXBlIGV4dGVuZHMgR29vYmVyIGltcGxlbWVudHMgVHlwZVN0b3JlCit7CisgICAgVHlwZSAoIFJvb3QgciwgU2NoZW1hVHlwZSBzVHlwZSwgU3BsYXkgcyApCisgICAgeworICAgICAgICB0aGlzKCByLCAoKFR5cGVTdG9yZVVzZXJGYWN0b3J5KSBzVHlwZSkuY3JlYXRlVHlwZVN0b3JlVXNlcigpLCBzICk7CisgICAgfQorICAgIAorICAgIFR5cGUgKCBSb290IHIsIFR5cGVTdG9yZVVzZXIgdXNlciwgU3BsYXkgcyApCisgICAgeworICAgICAgICBzdXBlciggciwgU3BsYXkuVFlQRSApOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHMucGVla1R5cGUoKSA9PSBudWxsOworICAgICAgICBhc3NlcnQgdXNlciAhPSBudWxsOworICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisgICAgICAgIAorICAgICAgICBfdXNlciA9IHVzZXI7CisgICAgICAgIAorICAgICAgICBzZXQoIHMsIDAgKTsKKworICAgICAgICBpZiAodXNlci51c2VzX2ludmFsaWRhdGVfdmFsdWUoKSkKKyAgICAgICAgICAgIHIuX2NJbnZhbGlkYXRhYmxlVHlwZXMrKzsKKworICAgICAgICBpZiAodXNlci5pc19jaGlsZF9lbGVtZW50X29yZGVyX3NlbnNpdGl2ZSgpKQorICAgICAgICAgICAgci5fY0VsZW1PcmRlclNlbnNpdGl2ZVR5cGVzKys7CisgICAgICAgIAorICAgICAgICB1c2VyLmF0dGFjaF9zdG9yZSggdGhpcyApOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCAoIFJvb3QgciApCisgICAgeworICAgICAgICBzdXBlci5kaXNjb25uZWN0KCByICk7CisgICAgICAgIAorICAgICAgICBpZiAoX3VzZXIudXNlc19pbnZhbGlkYXRlX3ZhbHVlKCkpCisgICAgICAgICAgICByLl9jSW52YWxpZGF0YWJsZVR5cGVzLS07CisKKyAgICAgICAgaWYgKF91c2VyLmlzX2NoaWxkX2VsZW1lbnRfb3JkZXJfc2Vuc2l0aXZlKCkpCisgICAgICAgICAgICByLl9jRWxlbU9yZGVyU2Vuc2l0aXZlVHlwZXMtLTsKKyAgICAgICAgCisgICAgICAgIF91c2VyLmRpc2Nvbm5lY3Rfc3RvcmUoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKworICAgIFNjaGVtYVR5cGUgZ2V0X3NjaGVtYV90eXBlICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF91c2VyLmdldF9zY2hlbWFfdHlwZSgpOworICAgIH0KKyAgICAKKyAgICBTY2hlbWFUeXBlIGdldF9lbGVtZW50X3R5cGUgKCBRTmFtZSBlbHROYW1lLCBRTmFtZSB4c2lUeXBlICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF90eXBlKCBlbHROYW1lLCB4c2lUeXBlICk7CisgICAgfQorICAgIAorICAgIFNjaGVtYVR5cGUgZ2V0X2F0dHJpYnV0ZV90eXBlICggUU5hbWUgYXR0ck5hbWUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF91c2VyLmdldF9hdHRyaWJ1dGVfdHlwZSggYXR0ck5hbWUgKTsKKyAgICB9CisgICAgCisgICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfZWxlbWVudF91c2VyICggUU5hbWUgZWx0TmFtZSwgUU5hbWUgeHNpVHlwZSApCisgICAgeworICAgICAgICBUeXBlU3RvcmVVc2VyIHJldCA9IG51bGw7CisgICAgICAgIGlmIChnZXRSb290KCkuX2ZhY3RvcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldCA9IGdldFJvb3QoKS5fZmFjdG9yeS5jcmVhdGVFbGVtZW50VXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgZWx0TmFtZSwgeHNpVHlwZSk7CisKKyAgICAgICAgaWYgKHJldCA9PSBudWxsKQorICAgICAgICAgICAgcmV0ID0gX3VzZXIuY3JlYXRlX2VsZW1lbnRfdXNlciggZWx0TmFtZSwgeHNpVHlwZSApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgICAgICAgICAgCisgICAgVHlwZVN0b3JlVXNlciBjcmVhdGVfYXR0cmlidXRlX3VzZXIoIFFOYW1lIGF0dHJOYW1lICkKKyAgICB7CisgICAgICAgIFR5cGVTdG9yZVVzZXIgcmV0ID0gbnVsbDsKKworICAgICAgICBpZiAoZ2V0Um9vdCgpLl9mYWN0b3J5ICE9IG51bGwpCisgICAgICAgICAgICByZXQgPSBnZXRSb290KCkuX2ZhY3RvcnkuY3JlYXRlQXR0cmlidXRlVXNlcihnZXRfc2NoZW1hX3R5cGUoKSwgIGF0dHJOYW1lKTsKKworICAgICAgICBpZiAocmV0ID09IG51bGwpCisgICAgICAgICAgICByZXQgPSBfdXNlci5jcmVhdGVfYXR0cmlidXRlX3VzZXIoIGF0dHJOYW1lICk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBYbWxPYmplY3QgZ2V0WG1sT2JqZWN0ICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChYbWxPYmplY3QpIF91c2VyOworICAgIH0KKworICAgIGJvb2xlYW4gdXNlc19pbnZhbGlkYXRlX3ZhbHVlICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF91c2VyLnVzZXNfaW52YWxpZGF0ZV92YWx1ZSgpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUgKCApCisgICAgeworICAgICAgICByZXR1cm4gX3VzZXIuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGVUZXh0ICggKQorICAgIHsKKyAgICAgICAgaWYgKF9pbmhpYml0VXNlckludmFsaWRhdGUgPT0gMCkKKyAgICAgICAgICAgIF91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGVOaWwgKCApCisgICAgeworICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA9PSAwKQorICAgICAgICAgICAgX3VzZXIuaW52YWxpZGF0ZV9uaWx2YWx1ZSgpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVFbGVtZW50ICggQ29udGFpbmVyIGNvbnRhaW5lciwgU3BsYXkgcyApCisgICAgeworICAgICAgICBhc3NlcnQgcy5nZXRDb250YWluZXIoKSA9PSBjb250YWluZXI7CisgICAgICAgIAorICAgICAgICBpZiAoX2luaGliaXRVc2VySW52YWxpZGF0ZSA+IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVHlwZSBjb250YWluZXJUeXBlID0gY29udGFpbmVyLnBlZWtUeXBlKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lclR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIWNvbnRhaW5lclR5cGUuaXNfY2hpbGRfZWxlbWVudF9vcmRlcl9zZW5zaXRpdmUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb250YWluZXJUeXBlLl91c2VyLmludmFsaWRhdGVfdmFsdWUoKTsKKworICAgICAgICBmb3IgKCA7IDsgcyA9IHMubmV4dFNwbGF5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocy5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBzLmdldENvbnRhaW5lcigpID09IGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLmlzQmVnaW4oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUeXBlIGNoaWxkVHlwZSA9IHMucGVla1R5cGUoKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlsZFR5cGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRUeXBlLl91c2VyLmludmFsaWRhdGVfZWxlbWVudF9vcmRlcigpOworCisgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgYnVpbGRfdGV4dCAoIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdXNlci5idWlsZF90ZXh0KCBuc20gKTsKKyAgICB9CisKKyAgICBib29sZWFuIGJ1aWxkX25pbCAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdXNlci5idWlsZF9uaWwoKTsKKyAgICB9CisgICAgCisgICAgaW50IHZhbGlkYXRlQ29udGVudCAoIFNwbGF5IHMsIE5hbWVzcGFjZU1hbmFnZXIgbnNtICkKKyAgICB7CisgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzLmlzSW52YWxpZCgpOworICAgICAgICBhc3NlcnQgcy5pc0xlYWYoKSB8fCBzLmlzRG9jKCk7CisKKyAgICAgICAgU3RyaW5nIHRleHQgPSBidWlsZF90ZXh0KCBuc20gKTsKKworICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsOworCisgICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKKworICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYworICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKKyAgICAgICAgCisgICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICAKKyAgICAgICAgcy5pbnNlcnRDaGFycyggMSwgciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOworCisgICAgICAgIHIucmVzdG9yZVZlcnNpb24oIG9sZFZlcnNpb24gKTsKKyAgICAgICAgCisgICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUtLTsKKworICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGgoKTsKKyAgICB9CisgICAgCisgICAgdm9pZCB2YWxpZGF0ZVZhbHVlICggU3BsYXkgcywgTmFtZXNwYWNlTWFuYWdlciBuc20gKQorICAgIHsKKyAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7CisgICAgICAgIGFzc2VydCBzLmlzTm9ybWFsQXR0cigpOworCisgICAgICAgIFN0cmluZyB0ZXh0ID0gYnVpbGRfdGV4dCggbnNtICk7CisKKyAgICAgICAgYXNzZXJ0IHRleHQgIT0gbnVsbDsKKworICAgICAgICAvLyBWYWxpZGF0aW5nIGRvZXMgbm90IGxvZ2ljYWxseSBjaGFuZ2UgdGhlIGRvYworICAgICAgICBsb25nIG9sZFZlcnNpb24gPSByLmdldFZlcnNpb24oKTsKKyAgICAgICAgCisgICAgICAgIF9pbmhpYml0VXNlckludmFsaWRhdGUrKzsKKyAgICAgICAgCisgICAgICAgIHMudG9nZ2xlSXNJbnZhbGlkKCk7IC8vIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICAKKyAgICAgICAgcy5zZXRUZXh0KCByLCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpICk7CisgICAgICAgIAorICAgICAgICByLnJlc3RvcmVWZXJzaW9uKCBvbGRWZXJzaW9uICk7CisgICAgICAgIAorICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07CisgICAgfQorCisgICAgUU5hbWVTZXQgZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIFFOYW1lIHFuYW1lICkKKyAgICB7CisgICAgICAgIHJldHVybiBfdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyggcW5hbWUgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc19hdHRyaWJ1dGUgKCApCisgICAgeworICAgICAgICByZXR1cm4gZ2V0U3BsYXkoKS5pc0F0dHIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZV9vbl9zZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFJvb3QoKS52YWxpZGF0ZU9uU2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yICggKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3IoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlICggVmFsaWRhdG9yTGlzdGVuZXIgdkV2ZW50U2luayApCisgICAgeworICAgICAgICBuZXcgU2F2ZXIuVmFsaWRhdG9yU2F2ZXIoIGdldFJvb3QoKSwgZ2V0U3BsYXkoKSwgMCwgbnVsbCwgdkV2ZW50U2luayApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU2NoZW1hVHlwZUxvYWRlciBnZXRfc2NoZW1hdHlwZWxvYWRlciAoICkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCkuZ2V0U2NoZW1hVHlwZUxvYWRlcigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgUU5hbWUgZ2V0X3hzaV90eXBlICggKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKSB8fCBzLmlzTm9ybWFsQXR0cigpOworCisgICAgICAgIGlmIChzLmlzTm9ybWFsQXR0cigpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIHMuZ2V0WHNpVHlwZU5hbWUoIGdldFJvb3QoKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBjaGFuZ2VfdHlwZSAoIFNjaGVtYVR5cGUgc1R5cGUgKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgcy5zZXRUeXBlKCBnZXRSb290KCksIHNUeXBlLCBmYWxzZSApOworCisgICAgICAgIFR5cGUgdCA9IHMuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CisKKyAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0Ll91c2VyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQgKCApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisKKyAgICAgICAgaWYgKHMuaXNJbnZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlKys7CisKKyAgICAgICAgcy5yZW1vdmVDb250ZW50KCBnZXRSb290KCksIGZhbHNlICk7CisKKyAgICAgICAgcy50b2dnbGVJc0ludmFsaWQoKTsKKyAgICAgICAgYXNzZXJ0IHMuaXNJbnZhbGlkKCk7CisgICAgICAgIAorICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZmV0Y2hfdGV4dCAoIGludCB3aGl0ZXNwYWNlUnVsZSApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBhc3NlcnQgIXMuaXNJbnZhbGlkKCk7CisgICAgICAgIAorICAgICAgICBpZiAocy5pc0ludmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ2FuJ3QgZmV0Y2ggdGV4dCB3aGVuIGludmFsaWQiICk7CisKKyAgICAgICAgcmV0dXJuIHMuZ2V0VGV4dCggZ2V0Um9vdCgpLCB3aGl0ZXNwYWNlUnVsZSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0ICggU3RyaW5nIHRleHQgKQorICAgIHsKKyAgICAgICAgX2luaGliaXRVc2VySW52YWxpZGF0ZSsrOworICAgICAgICBnZXRTcGxheSgpLnNldFRleHQoIGdldFJvb3QoKSwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSApOworICAgICAgICBfaW5oaWJpdFVzZXJJbnZhbGlkYXRlLS07CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9mbGFncyAoICkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOworCisgICAgICAgIGlmIChzLmlzRG9jKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKKworICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CisKKyAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKworICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOworCisgICAgICAgIGlmIChzLmlzQXR0cigpKQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2F0dHJpYnV0ZWZsYWdzKCBzLmdldE5hbWUoKSApOworCisgICAgICAgIGludCBmID0gcGFyZW50VXNlci5nZXRfZWxlbWVudGZsYWdzKCBzLmdldE5hbWUoKSApOworCisgICAgICAgIGlmIChmICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIGY7CisKKyAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOworCisgICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6CisgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKKworICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTY2hlbWFGaWVsZCBnZXRfc2NoZW1hX2ZpZWxkICggKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisKKyAgICAgICAgaWYgKHMuaXNEb2MoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IHMuZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgVHlwZVN0b3JlVXNlciBwYXJlbnRVc2VyID0gcGFyZW50Q29udGFpbmVyLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOworICAgICAgICAKKyAgICAgICAgaWYgKHMuaXNBdHRyKCkpCisgICAgICAgICAgICByZXR1cm4gcGFyZW50VXNlci5nZXRfYXR0cmlidXRlX2ZpZWxkKCBzLmdldE5hbWUoKSApOworCisgICAgICAgIGFzc2VydCBzLmlzQmVnaW4oKTsKKworICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IHBhcmVudFVzZXIubmV3X3Zpc2l0b3IoKTsKKworICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgZm9yICggU3BsYXkgdCA9IHBhcmVudENvbnRhaW5lci5uZXh0U3BsYXkoKSA7IDsgdCA9IHQubmV4dFNwbGF5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCB0LmdldEtpbmQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNwbGF5LkVORCA6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNwbGF5LkJFR0lOIDoKKyAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0KCB0LmdldE5hbWUoKSApOworCisgICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X3NjaGVtYV9maWVsZCgpOworCisgICAgICAgICAgICAgICAgdCA9IHQuZ2V0RmluaXNoU3BsYXkoKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMgKCBRTmFtZSBuYW1lICkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCkuY291bnQoIChDb250YWluZXIpIGdldFNwbGF5KCksIG5hbWUsIG51bGwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvdW50X2VsZW1lbnRzKFFOYW1lU2V0IG5hbWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFJvb3QoKS5jb3VudCgoQ29udGFpbmVyKWdldFNwbGF5KCksICBudWxsLCBuYW1lcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbiggcywgbmFtZSwgbnVsbCwgaSApOworCisgICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZSggZ2V0Um9vdCgpICk7CisKKyAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0Ll91c2VyOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGZpbmRfZWxlbWVudF91c2VyICggUU5hbWVTZXQgbmFtZXMsIGludCBpICkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworCisgICAgICAgIEJlZ2luIG50aEJlZ2luID0gZ2V0Um9vdCgpLmZpbmROdGhCZWdpbihzLCAgbnVsbCwgbmFtZXMsIGkpOworICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVHlwZSB0ID0gbnRoQmVnaW4uZ2V0VHlwZShnZXRSb290KCkpOworICAgICAgICBhc3NlcnQgdCAhPSBudWxsOworCisgICAgICAgIHJldHVybiB0Ll91c2VyOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmluZEFsbEVsZW1lbnRUeXBlcyAoIFFOYW1lIG5hbWUsIFFOYW1lU2V0IHNldCwgTGlzdCBmaWxsTWVVcCApCisgICAgeworICAgICAgICBhc3NlcnQgZ2V0U3BsYXkoKS5pc0NvbnRhaW5lcigpOworCisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIGlmIChzLmlzTGVhZigpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvb3A6CisgICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EICA6CisgICAgICAgICAgICBjYXNlIFNwbGF5LlJPT1QgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7CisgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgU3BsYXkuQkVHSU4gOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUgKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKCBnZXRSb290KCkgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsTWVVcC5hZGQoIHR5cGUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHMuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gcy5nZXRUeXBlKGdldFJvb3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1lVXAuYWRkKHR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcyA9IHMuZ2V0RmluaXNoU3BsYXkoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmRfYWxsX2VsZW1lbnRfdXNlcnMgKCBRTmFtZSBuYW1lLCBMaXN0IGZpbGxNZVVwICkKKyAgICB7CisgICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZmluZEFsbEVsZW1lbnRUeXBlcyggbmFtZSwgbnVsbCwgZmlsbE1lVXAgKTsKKworICAgICAgICBmb3IgKCBpbnQgaiA9IGkgOyBqIDwgZmlsbE1lVXAuc2l6ZSgpIDsgaisrICkKKyAgICAgICAgICAgIGZpbGxNZVVwLnNldCggaiwgKChUeXBlKSBmaWxsTWVVcC5nZXQoIGogKSkuX3VzZXIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5kX2FsbF9lbGVtZW50X3VzZXJzIChRTmFtZVNldCBuYW1lcywgTGlzdCBmaWxsTWVVcCkKKyAgICB7CisgICAgICAgIGludCBpID0gZmlsbE1lVXAuc2l6ZSgpOworICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKG51bGwsIG5hbWVzLCBmaWxsTWVVcCk7CisKKyAgICAgICAgZm9yICggaW50IGogPSBpIDsgaiA8IGZpbGxNZVVwLnNpemUoKSA7IGorKyApCisgICAgICAgICAgICBmaWxsTWVVcC5zZXQoIGosICgoVHlwZSkgZmlsbE1lVXAuZ2V0KCBqICkpLl91c2VyICk7CisgICAgfQorCisgICAgcHVibGljIFR5cGVTdG9yZVVzZXIgZmluZF9hdHRyaWJ1dGVfdXNlciAoIFFOYW1lIG5hbWUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGdldFNwbGF5KCkuaXNDb250YWluZXIoKTsKKworICAgICAgICBTcGxheSBhID0gZ2V0U3BsYXkoKS5nZXRBdHRyKCBuYW1lICk7CisKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFR5cGUgdCA9IGEuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CisKKyAgICAgICAgYXNzZXJ0IHQgIT0gbnVsbDsKKworICAgICAgICByZXR1cm4gdC5fdXNlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBjb21wdXRlX2RlZmF1bHRfdGV4dCAoICkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHMuaXNUeXBlYWJsZSgpOworCisgICAgICAgIGlmIChzLmlzRG9jKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBDb250YWluZXIgcGFyZW50Q29udGFpbmVyID0gcy5nZXRDb250YWluZXIoKTsKKworICAgICAgICBUeXBlIHBhcmVudFR5cGUgPSBwYXJlbnRDb250YWluZXIuZ2V0VHlwZSggZ2V0Um9vdCgpICk7CisKKyAgICAgICAgYXNzZXJ0IHBhcmVudFR5cGUgIT0gbnVsbDsKKworICAgICAgICBUeXBlU3RvcmVVc2VyIHBhcmVudFVzZXIgPSBwYXJlbnRUeXBlLl91c2VyOworCisgICAgICAgIGlmIChzLmlzQXR0cigpKQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoIHMuZ2V0TmFtZSgpICk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHBhcmVudFVzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KCBzLmdldE5hbWUoKSApOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gcGFyZW50VXNlci5uZXdfdmlzaXRvcigpOworCisgICAgICAgIGlmICh2aXNpdG9yID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBhc3NlcnQgIXBhcmVudENvbnRhaW5lci5pc0xlYWYoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIFNwbGF5IHQgPSBwYXJlbnRDb250YWluZXIubmV4dFNwbGF5KCkgOyA7IHQgPSB0Lm5leHRTcGxheSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggdC5nZXRLaW5kKCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBTcGxheS5FTkQgOgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6CisgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggdC5nZXROYW1lKCkgKTsKKworICAgICAgICAgICAgICAgIGlmICh0ID09IHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9kZWZhdWx0X3RleHQoKTsKKworICAgICAgICAgICAgICAgIHQgPSB0LmdldEZpbmlzaFNwbGF5KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwgKCApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBhc3NlcnQgcy5pc1R5cGVhYmxlKCk7CisKKyAgICAgICAgaWYgKCFzLmlzQXR0cigpKQorICAgICAgICAgICAgcy5zZXRYc2lOaWwoIGdldFJvb3QoKSwgYnVpbGRfbmlsKCkgKTsKKyAgICB9CisgICAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kX25pbCAoICkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIGFzc2VydCBzLmlzVHlwZWFibGUoKTsKKyAgCisgICAgICAgIHJldHVybiBzLmlzQXR0cigpID8gZmFsc2UgOiBzLmdldFhzaU5pbCggZ2V0Um9vdCgpICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZmluZF9wcmVmaXhfZm9yX25zdXJpICgKKyAgICAgICAgU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBpZiAocy5pc0F0dHIoKSkKKyAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOworCisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzLnByZWZpeEZvck5hbWVzcGFjZSggZ2V0Um9vdCgpLCBuc3VyaSwgc3VnZ2VzdGVkX3ByZWZpeCwgdHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlRm9yUHJlZml4ICggU3RyaW5nIHByZWZpeCApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBpZiAocy5pc0F0dHIoKSkKKyAgICAgICAgICAgIHMgPSBzLmdldENvbnRhaW5lcigpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHMubmFtZXNwYWNlRm9yUHJlZml4KCBwcmVmaXgsIHRydWUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBpbnNlcnRfZWxlbWVudF91c2VyICggUU5hbWUgbmFtZSwgaW50IGkgKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgICAgICBDb250YWluZXIgYyA9IChDb250YWluZXIpIHM7CisKKyAgICAgICAgQmVnaW4gbnRoQmVnaW4gPSByLmZpbmROdGhCZWdpbiggYywgbmFtZSwgbnVsbCwgaSApOworCisgICAgICAgIGlmIChudGhCZWdpbiA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IHIuY291bnQoIGMsIG5hbWUsIG51bGwgKSArIDEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIoIG5hbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBuYW1lLCBudGhCZWdpbiwgMCApOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoUU5hbWVTZXQgc2V0LCBRTmFtZSBuYW1lLCBpbnQgaSkKKyAgICB7CisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIFJvb3QgciA9IGdldFJvb3QoKTsKKyAgICAgICAgQ29udGFpbmVyIGMgPSAoU3BsYXkuQ29udGFpbmVyKSBzOworCisgICAgICAgIEJlZ2luIG50aEJlZ2luID0gci5maW5kTnRoQmVnaW4oYywgbnVsbCwgc2V0LCBpKTsKKworICAgICAgICBpZiAobnRoQmVnaW4gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiByLmNvdW50KGMsIG51bGwsIHNldCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgcmV0dXJuIGFkZF9lbGVtZW50X3VzZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5zZXJ0RWxlbWVudChuYW1lLCBudGhCZWdpbiwgMCk7CisgICAgfQorICAgIAorLy8gVE9ETyAtIGNvbnNvbGlkYXRlIG5hbWVzLCB0aGlzIGZjbiBpcyB2ZXJ5IGV4cGVuc2l2ZSBpbiBjcmVhdGluZyBuYW1lcworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIgKCBRTmFtZSBxbmFtZSApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICAKKyAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU3BsYXkgY2FuZGlkYXRlU3BsYXk7CisgICAgICAgIGludCBjYW5kaWRhdGVQb3M7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKHMuaXNMZWFmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVNwbGF5ID0gczsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVBvcyA9IHMuZ2V0UG9zTGVhZkVuZCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2FuZGlkYXRlU3BsYXkgPSBzLmdldEZpbmlzaFNwbGF5KCk7CisgICAgICAgICAgICBjYW5kaWRhdGVQb3MgPSAwOworCisgICAgICAgICAgICBRTmFtZVNldCBlbmRTZXQgPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICBsb29wOgorICAgICAgICAgICAgZm9yICggU3BsYXkgdCA9IGNhbmRpZGF0ZVNwbGF5IDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQgPSB0LnByZXZTcGxheSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3A7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAodC5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNFbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFzc2VydCB0LmlzQ29udGFpbmVyKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodC5nZXROYW1lKCkuZXF1YWxzKCBxbmFtZSApKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChlbmRTZXQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZW5kU2V0ID0gZ2V0X2VsZW1lbnRfZW5kaW5nX2RlbGltaXRlcnMoIHFuYW1lICk7CisKKyAgICAgICAgICAgICAgICBpZiAoZW5kU2V0LmNvbnRhaW5zKCB0LmdldE5hbWUoKSApKQorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVTcGxheSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpbnNlcnRFbGVtZW50KCBxbmFtZSwgY2FuZGlkYXRlU3BsYXksIGNhbmRpZGF0ZVBvcyApOworICAgIH0KKworICAgIHByaXZhdGUgVHlwZVN0b3JlVXNlciBpbnNlcnRFbGVtZW50ICggUU5hbWUgbmFtZSwgU3BsYXkgcywgaW50IHAgKQorICAgIHsKKyAgICAgICAgUm9vdCByID0gZ2V0Um9vdCgpOworICAgICAgICAKKyAgICAgICAgQmVnaW4gYiA9IG5ldyBCZWdpbiggbmFtZSwgbnVsbCApOworICAgICAgICBiLnRvZ2dsZUlzTGVhZigpOworICAgICAgICAKKyAgICAgICAgcy5pbnNlcnQoIHIsIHAsIGIsIG51bGwsIDAsIDAsIHRydWUgKTsKKyAgICAgICAgCisgICAgICAgIFR5cGUgdCA9IGIuZ2V0VHlwZSggciApOworCisgICAgICAgIGFzc2VydCB0ICE9IG51bGw7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdC5fdXNlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlX2VsZW1lbnQgKCBRTmFtZSBxbmFtZSwgaW50IGkgKQorICAgIHsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgCisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAocy5pc0xlYWYoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4oIHMsIHFuYW1lLCBudWxsLCBpICk7CisKKyAgICAgICAgaWYgKGIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgYi5yZW1vdmUoIGdldFJvb3QoKSwgdHJ1ZSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFFOYW1lU2V0IG5hbWVzLCBpbnQgaSkKKyAgICB7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKworICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAocy5pc0xlYWYoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgQmVnaW4gYiA9IGdldFJvb3QoKS5maW5kTnRoQmVnaW4ocywgbnVsbCwgbmFtZXMsIGkpOworCisgICAgICAgIGlmIChiID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGIucmVtb3ZlKGdldFJvb3QoKSwgdHJ1ZSk7CisKKyAgICB9CisgICAgCisgICAgcHVibGljIFR5cGVTdG9yZVVzZXIgYWRkX2F0dHJpYnV0ZV91c2VyICggUU5hbWUgcW5hbWUgKQorICAgIHsKKyAgICAgICAgU3BsYXkgcyA9IGdldFNwbGF5KCk7CisKKyAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghcy5pc0NvbnRhaW5lcigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIFNwbGF5IGEgPSBzLmdldEF0dHIoIHFuYW1lICk7CisKKyAgICAgICAgaWYgKGEgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIAorICAgICAgICBzLm5leHRTcGxheSgpLmluc2VydCgKKyAgICAgICAgICAgIGdldFJvb3QoKSwgMCwgYSA9IG5ldyBBdHRyKCBxbmFtZSApLCBudWxsLCAwLCAwLCB0cnVlICk7CisgICAgICAgIAorICAgICAgICBUeXBlIHQgPSBhLmdldFR5cGUoIGdldFJvb3QoKSApOworCisgICAgICAgIGFzc2VydCB0ICE9IG51bGw7CisKKyAgICAgICAgcmV0dXJuIHQuX3VzZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUgKCBRTmFtZSBxbmFtZSApCisgICAgeworICAgICAgICBTcGxheSBzID0gZ2V0U3BsYXkoKTsKKworICAgICAgICBhc3NlcnQgcy5pc0NvbnRhaW5lcigpOworICAgICAgICAKKyAgICAgICAgaWYgKCFzLmlzQ29udGFpbmVyKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisKKyAgICAgICAgU3BsYXkgYSA9IHMuZ2V0QXR0ciggcW5hbWUgKTsKKworICAgICAgICBpZiAoYSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgCisgICAgICAgIGEucmVtb3ZlKCBnZXRSb290KCksIHRydWUgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFR5cGVTdG9yZVVzZXIgY29weV9jb250ZW50c19mcm9tICggVHlwZVN0b3JlIHNvdXJjZSApCisgICAgeworICAgICAgICBhc3NlcnQgc291cmNlIGluc3RhbmNlb2YgVHlwZTsKKworICAgICAgICBUeXBlIHNvdXJjZVR5cGUgPSAoVHlwZSkgc291cmNlOworCisgICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIHMucmVwbGFjZUNvbnRlbnRzKCBnZXRSb290KCksIHNvdXJjZVR5cGUuZ2V0U3BsYXkoKSwgc291cmNlVHlwZS5nZXRSb290KCksIHRydWUsIHRydWUgKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzLmdldFR5cGUoIGdldFJvb3QoKSApLl91c2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFycmF5X3NldHRlciAoIFhtbE9iamVjdFtdIHNvdXJjZXMsIFFOYW1lIGVsZW1lbnROYW1lICkKKyAgICB7CisgICAgICAgIC8vIFRPRE8gLSB0aGlzIGlzIHRoZSBxdWljayBhbmQgZGlydHkgaW1wbGVtZW50YXRpb24sIG1ha2UgdGhpcyBmYXN0ZXIKKyAgICAgICAgCisgICAgICAgIGludCBtID0gc291cmNlcy5sZW5ndGg7CisKKyAgICAgICAgQXJyYXlMaXN0IGNvcGllcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBtIDsgaSsrICkKKyAgICAgICAgeworLy8gVE9ETyAtIGRlYWwgd2l0aCBudWxsIHNvdXJjZXNbIGkgXSBoZXJlIC0tIHdoYXQgdG8gZG8/CisKKyAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQXJyYXkgZWxlbWVudCBudWxsIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCBudWxsICk7CisgICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBudWxsICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpICgoVHlwZVN0b3JlVXNlcikgc291cmNlc1sgaSBdKS5nZXRfc3RvcmUoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjb3BpZXMuYWRkKCB0eXBlLmdldFNwbGF5KCkuY29weVNwbGF5Q29udGVudHMoIHR5cGUuZ2V0Um9vdCgpKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHlwZXMuYWRkKCBzb3VyY2VzWyBpIF0uc2NoZW1hVHlwZSgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgbiA9IGNvdW50X2VsZW1lbnRzKCBlbGVtZW50TmFtZSApOworCisgICAgICAgIGZvciAoIDsgbiA+IG0gOyBuLS0gKQorICAgICAgICAgICAgcmVtb3ZlX2VsZW1lbnQoIGVsZW1lbnROYW1lLCBtICk7CisKKyAgICAgICAgZm9yICggOyBtID4gbiA7IG4rKyApCisgICAgICAgICAgICBhZGRfZWxlbWVudF91c2VyKCBlbGVtZW50TmFtZSApOworCisgICAgICAgIGFzc2VydCBtID09IG47CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICBmaW5kQWxsRWxlbWVudFR5cGVzKCBlbGVtZW50TmFtZSwgbnVsbCwgZWxlbWVudHMgKTsKKworICAgICAgICBSb290IHIgPSBnZXRSb290KCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnQgZWxlbWVudHMuc2l6ZSgpID09IG47CisKKyAgICAgICAgZm9yICggaW50IGkgPSAwIDsgaSA8IG4gOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIHR5cGUgPSAoVHlwZSkgZWxlbWVudHMuZ2V0KCBpICk7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2VzWyBpIF0uaXNJbW11dGFibGUoKSkKKyAgICAgICAgICAgICAgICB0eXBlLmdldFhtbE9iamVjdCgpLnNldCggc291cmNlc1sgaSBdICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3BsYXkgcyA9IHR5cGUuZ2V0U3BsYXkoKTsKKworICAgICAgICAgICAgICAgIGFzc2VydCByID09IHR5cGUuZ2V0Um9vdCgpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0IHMuaXNDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzLnJlbW92ZUNvbnRlbnQoIHIsIHRydWUgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBDb3B5Q29udGV4dCBjb3B5Q29udGV4dCA9IChDb3B5Q29udGV4dCkgY29waWVzLmdldCggaSApOworCisgICAgICAgICAgICAgICAgU3BsYXkgY29weVRyZWUgPSBjb3B5Q29udGV4dC5nZXRUcmVlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29weVRyZWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0Q29weSA9IGNvcHlDb250ZXh0LmdldFRleHQoKTsKKworICAgICAgICAgICAgICAgICAgICBzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHIsIDEsIGNvcHlUcmVlLCB0ZXh0Q29weSwgMCwgdGV4dENvcHkgPT0gbnVsbCA/IDAgOiB0ZXh0Q29weS5sZW5ndGgsIHRydWUgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0eXBlLmNoYW5nZV90eXBlKCAoU2NoZW1hVHlwZSkgdHlwZXMuZ2V0KCBpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdF9lbGVtZW50cyAoIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciApCisgICAgeworICAgICAgIFNwbGF5IHMgPSBnZXRTcGxheSgpOworCisgICAgICAgIGFzc2VydCBzLmlzQ29udGFpbmVyKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIXMuaXNDb250YWluZXIoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAocy5pc0xlYWYoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAoIHMgPSBzLm5leHRTcGxheSgpIDsgOyBzID0gcy5uZXh0U3BsYXkoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMuZ2V0S2luZCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU3BsYXkuRU5EIDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTcGxheS5CRUdJTiA6CisgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdCggcy5nZXROYW1lKCkgKTsKKyAgICAgICAgICAgICAgICBzID0gcy5nZXRGaW5pc2hTcGxheSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFhtbE9iamVjdFtdIGV4ZWNfcXVlcnkgKCBTdHJpbmcgcXVlcnlFeHByLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gUGF0aC5xdWVyeSggdGhpcywgcXVlcnlFeHByLCBvcHRpb25zICk7CisgICAgfQorICAgIAorICAgIC8vCisgICAgLy8KKyAgICAvLworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1vbml0b3Igb2JqZWN0LCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byB0aGUgZG9jLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0X3Jvb3Rfb2JqZWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlU3RvcmVVc2VyIF91c2VyOworICAgIHByaXZhdGUgaW50IF9pbmhpYml0VXNlckludmFsaWRhdGU7Cit9CmRpZmYgLS1naXQgYS92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWG1sT2JqZWN0TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjIzMjYKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveG1sc3RvcmUvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3N0b3JlL1htbE9iamVjdExpc3QuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlOworCisvLyBCVUdCVUc6ICoqKlRMTCoqKiBXaHkgaXNuJ3QgdGhpcyBleHBvc2VkIGluIG9yZy5hcGFjaGUueG1sYmVhbnM/Pz8/CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gcmVwcmVzZW50IGxpc3RzIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgcmV0dXJuZWQKKyAqIGZyb20gYSBxdWVyeS4gVXNlZCBhbHNvIGFzIGEgY29udmVuaWVudCB0eXBlZCB3YXkgb2YgY29sbGVjdGluZworICogWG1sT2JqZWN0IGluc3RhbmNlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBYbWxPYmplY3RMaXN0IHsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBYbWxPYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWwgdGhlIFhtbE9iamVjdCBpbnN0YW5jZSB0byBhZGQgdG8gdGhlIGxpc3QKKyAgICAgKi8KKyAgICB2b2lkIGFkZChYbWxPYmplY3QgeG1sKTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgbGlzdCB0byB0aGlzIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sTGlzdCB0aGUgbGlzdCB3aGljaCBpcyB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QuCisgICAgICovCisgICAgdm9pZCBhZGRBbGwoWG1sT2JqZWN0TGlzdCB4bWxMaXN0KTsKKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgYW4gYXJyYXkgb2YgWG1sT2JqZWN0IGluc3RhbmNlcyB0byB0aGlzIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sQXJyYXkgdGhlIGFycmF5IHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIHRvIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEFsbChYbWxPYmplY3RbXSB4bWxBcnJheSk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QuIEFmdGVyIHRoaXMgb3BlcmF0aW9uLAorICAgICAqIHtAbGluayAjaXNFbXB0eSgpIGlzRW1wdHkoKX0gd2lsbCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgWG1sT2JqZWN0IGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBYbWxPYmplY3QgYXQgdGhlIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZgorICAgICAqICAgICAgICAgPGNvZGU+KGluZGV4IDwgMCkgfHwgKGluZGV4ID49IHNpemUoKSk8L2NvZGU+CisgICAgICovCisgICAgWG1sT2JqZWN0IGdldChpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgdGhpcyBYbWxMaXN0IGlzIGVtcHR5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiA8Y29kZT57QGxpbmsgI3NpemUoKSBzaXplKCl9ID09IDA8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBsaXN0IGlzIGVtcHR5LgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbXB0eSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIGFsbCB0aGUgWG1sT2JqZWN0IGluc3RhbmNlcyBjb250YWluZWQgaW4gdGhpcworICAgICAqIGxpc3QuIFRoaXMgaXRlcmF0b3Igd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpbgorICAgICAqIHJlc3BvbnNlIHRvIGl0cyByZW1vdmUgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvdmVyIHRoZSBjb250ZW50cyBvZiB0aGlzIGxpc3QKKyAgICAgKi8KKyAgICBJdGVyYXRvciBpdGVyYXRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFhtbE9iamVjdCBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50IHNpemUgb2YgdGhlIGxpc3QuCisgICAgICovCisgICAgaW50IHNpemUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgWG1sTGlzdCBpbiBhIG5ld2x5IGNyZWF0ZWQgYXJyYXkgb2YKKyAgICAgKiBYbWxPYmplY3RzLgorICAgICAqCisgICAgICogQHJldHVybiBhcnJheSBvZiBYbWxPYmplY3QgaW5zdGFuY2VzIHdoaWNoIGlzIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YKKyAgICAgKiAgICAgICAgIHRoZSBsaXN0LgorICAgICAqLworICAgIFhtbE9iamVjdFtdIHRvQXJyYXkoKTsKKworCisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgZmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBvZiBYbWxPYmplY3RMaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWN0b3J5CisgICAgeworICAgICAgICAvLyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQ0xBU1M7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENMQVNTID0gQ2xhc3MuZm9yTmFtZSgiY29tLmJlYS53bGkudmFyaWFibGVzLlhtbE9iamVjdExpc3RJbXBsIik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UgPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBYbWxPYmplY3RMaXN0SW1wbC4iKTsKKyAgICAgICAgICAgICAgICBpc2UuaW5pdENhdXNlKHQpOworICAgICAgICAgICAgICAgIHRocm93IGlzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgZW1wdHkgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIG5ldyBlbXB0eSBYbWxPYmplY3RMaXN0IGluc3RhbmNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFhtbE9iamVjdExpc3QgbmV3SW5zdGFuY2UoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0TGlzdClDTEFTUy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNyZWF0ZXMgYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZSwgZmlsbGVkIHdpdGggdGhlIGVsZW1lbnRzCisgICAgICAgICAqIG9mIHRoZSBnaXZlbiBsaXN0CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgWG1sT2JqZWN0TGlzdCBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0TGlzdCBuZXdJbnN0YW5jZShYbWxPYmplY3RMaXN0IGxpc3QpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpQ0xBU1MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZEFsbChsaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TGlzdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBjcmVhdGVzIGEgbmV3IFhtbE9iamVjdExpc3QgaW5zdGFuY2UgZ2l2ZW4gYW4gYXJyYXkgb2YgWG1sT2JqZWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIG5ldyBYbWxPYmplY3RMaXN0IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBYbWxPYmplY3RMaXN0IG5ld0luc3RhbmNlKFhtbE9iamVjdFtdIHhtbE9iamVjdHMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0TGlzdCBuZXdMaXN0ID0gKFhtbE9iamVjdExpc3QpIENMQVNTLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGRBbGwoeG1sT2JqZWN0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9YcXJsRGVsZWdhdGUuamF2YSBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxZjMyZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94bWxzdG9yZS9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwvc3RvcmUvWHFybERlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBYcXJsRGVsZWdhdGUgCit7CisgICAgcHJpdmF0ZSBYcXJsRGVsZWdhdGUgKCApCisgICAgeworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNoZWNrICggT2JqZWN0IG8gKQorICAgIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cKKyAgICAgICAgICAgICAgICBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGlzIHF1ZXJ5IGlzIHRvbyBjb21wbGV4IHRvIGJlIHByb2Nlc3NlZC4iICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgUGF0aC5RdWVyeSBjb21waWxlUGF0aCAoIFN0cmluZyBwYXRoLCBYbWxPcHRpb25zIG9wdGlvbnMgKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoUGF0aC5RdWVyeSkKKyAgICAgICAgICAgICAgICBpbnZva2UoIF9jb21waWxlUGF0aCwgbmV3IE9iamVjdFtdIHsgcGF0aCwgb3B0aW9ucyB9ICk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBQYXRoLlF1ZXJ5IGNvbXBpbGVRdWVyeSAoIFN0cmluZyBxdWVyeUV4cHIsIFhtbE9wdGlvbnMgb3B0aW9ucyApCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIChQYXRoLlF1ZXJ5KQorICAgICAgICAgICAgICAgIGludm9rZSgKKyAgICAgICAgICAgICAgICAgICAgX2NvbXBpbGVRdWVyeSwgbmV3IE9iamVjdFtdIHsgcXVlcnlFeHByLCBvcHRpb25zLCBuZXcgQm9vbGVhbih0cnVlKSB9ICk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dSdW50aW1lRXhjZXB0aW9uICggVGhyb3dhYmxlIGUgKQorICAgIHsKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQorICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7CisgICAgICAgIAorICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7CisgICAgICAgIAorICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHJ0ZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBjYXVzZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgCisgICAgICAgIHJ0ZS5pbml0Q2F1c2UoIGNhdXNlICk7CisKKyAgICAgICAgdGhyb3cgcnRlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2UgKCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbXMgKQorICAgIHsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdworICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgcXVlcnkgaXMgdG9vIGNvbXBsZXggdG8gYmUgcHJvY2Vzc2VkLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSggbnVsbCwgcGFyYW1zICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93UnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gVW5yZWFjaGFibGUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIExvb3NlIGNvdXBsaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCB4cXJsLmphcgorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIF9jb21waWxlUGF0aDsKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgX2NvbXBpbGVRdWVyeTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgYm9vbGVhbiBoYXNYcXJsOworICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoICJvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuWHFybEltcGwiICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGhhc1hxcmwgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzWHFybCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc1hxcmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsYXNzIHhxcmxJbXBsID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSggIm9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5YcXJsSW1wbCIgKTsKKworICAgICAgICAgICAgICAgIF9jb21waWxlUGF0aCA9CisgICAgICAgICAgICAgICAgICAgIHhxcmxJbXBsLmdldERlY2xhcmVkTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBYbWxPcHRpb25zLmNsYXNzIH0gKTsKKworICAgICAgICAgICAgICAgIF9jb21waWxlUXVlcnkgPQorICAgICAgICAgICAgICAgICAgICB4cXJsSW1wbC5nZXREZWNsYXJlZE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlUXVlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFhtbE9wdGlvbnMuY2xhc3MsIEJvb2xlYW4uY2xhc3MgfSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWEJlYW5zTmF2aWdhdG9yLmphdmEgYi92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc05hdmlnYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmQ3YzkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc05hdmlnYXRvci5qYXZhCkBAIC0wLDAgKzEsODE0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwueHBhdGguamF4ZW47CitpbXBvcnQgb3JnLmpheGVuLlhQYXRoOworaW1wb3J0IG9yZy5qYXhlbi5OYXZpZ2F0b3I7CitpbXBvcnQgb3JnLmpheGVuLkRlZmF1bHROYXZpZ2F0b3I7CitpbXBvcnQgb3JnLmpheGVuLkZ1bmN0aW9uQ2FsbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuamF4ZW4uVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uOworLy9pbXBvcnQgb3JnLmpheGVuLk5hbWVkQWNjZXNzTmF2aWdhdG9yOworaW1wb3J0IG9yZy5qYXhlbi51dGlsLkFuY2VzdG9yQXhpc0l0ZXJhdG9yOworaW1wb3J0IG9yZy5qYXhlbi51dGlsLkZvbGxvd2luZ1NpYmxpbmdBeGlzSXRlcmF0b3I7CitpbXBvcnQgb3JnLmpheGVuLnV0aWwuUHJlY2VkaW5nU2libGluZ0F4aXNJdGVyYXRvcjsKK2ltcG9ydCBvcmcuamF4ZW4udXRpbC5Gb2xsb3dpbmdBeGlzSXRlcmF0b3I7CitpbXBvcnQgb3JnLmpheGVuLnV0aWwuUHJlY2VkaW5nQXhpc0l0ZXJhdG9yOworaW1wb3J0IG9yZy5qYXhlbi51dGlsLlNlbGZBeGlzSXRlcmF0b3I7CitpbXBvcnQgb3JnLmpheGVuLnV0aWwuRGVzY2VuZGFudE9yU2VsZkF4aXNJdGVyYXRvcjsKK2ltcG9ydCBvcmcuamF4ZW4udXRpbC5BbmNlc3Rvck9yU2VsZkF4aXNJdGVyYXRvcjsKK2ltcG9ydCBvcmcuamF4ZW4udXRpbC5TaW5nbGVPYmplY3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuamF4ZW4udXRpbC5EZXNjZW5kYW50QXhpc0l0ZXJhdG9yOworaW1wb3J0IG9yZy5qYXhlbi5zYXhwYXRoLlNBWFBhdGhFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpIChjZXphci5hbmRyZWkgYXQgYmVhLmNvbSkKKyAqIERhdGU6IE9jdCAxMCwgMjAwMworICovCitwdWJsaWMgY2xhc3MgWEJlYW5zTmF2aWdhdG9yCisgICAgZXh0ZW5kcyBEZWZhdWx0TmF2aWdhdG9yCisvLyAgICBpbXBsZW1lbnRzIE5hbWVkQWNjZXNzTmF2aWdhdG9yCit7CisgICAgcHJpdmF0ZSBYbWxDdXJzb3IgX3hjOworCisgICAgcHJpdmF0ZSBYQmVhbnNOYXZpZ2F0b3IoKQorICAgIHt9CisKKyAgICAvKiogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5Eb2N1bWVudE5hdmlnYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOYXZpZ2F0b3IgZ2V0SW5zdGFuY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYQmVhbnNOYXZpZ2F0b3IoKTsKKyAgICB9CisKKworICAgIHN0YXRpYyBjbGFzcyBKYXhlbk5vZGUKKyAgICAgICAgZXh0ZW5kcyBYbWxDdXJzb3IuWG1sQm9va21hcmsKKyAgICB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxDdXJzb3IgeGMgPSB0aGlzLmNyZWF0ZUN1cnNvcigpOworICAgICAgICAgICAgcmV0dXJuICJ7Tm9kZToiICsgeGMuY3VycmVudFRva2VuVHlwZSgpLnRvU3RyaW5nKCkgKyAiICIgKyB4Yy50b1N0cmluZygpICsgIn0iOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLworICAgIC8vIERlZmF1bHROYXZpZ2F0b3IgaW1wbGVtZW50YXRpb24KKyAgICAvLworCisgICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGVsZW1lbnQgVGhlIGNvbnRleHQgZWxlbWVudCBub2RlLgorICAgICAqCisgICAgICogIEByZXR1cm4gVGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGVsZW1lbnQgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lc3BhY2VVcmkoT2JqZWN0IGVsZW1lbnQpCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSllbGVtZW50KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOworICAgIH0KKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBlbGVtZW50IFRoZSBjb250ZXh0IGVsZW1lbnQgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IG5vZGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3QgZWxlbWVudCkKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWVsZW1lbnQpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBRTmFtZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBlbGVtZW50IFRoZSBjb250ZXh0IGVsZW1lbnQgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBRTmFtZSBvZiB0aGUgZWxlbWVudCBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFFOYW1lKE9iamVjdCBlbGVtZW50KQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpZWxlbWVudCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gX3hjLmdldE5hbWUoKS5nZXRQcmVmaXgoKTsKKyAgICAgICAgcmV0dXJuICggISIiLmVxdWFscyhwcmVmaXgpID8gcHJlZml4ICsgIjoiIDogIiIgKSArIF94Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gYXR0ciBUaGUgY29udGV4dCBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZVVyaShPYmplY3QgYXR0cikKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWF0dHIpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gYXR0ciBUaGUgY29udGV4dCBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoT2JqZWN0IGF0dHIpCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSlhdHRyKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOworICAgIH0KKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgUU5hbWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBhdHRyIFRoZSBjb250ZXh0IGF0dHJpYnV0ZSBub2RlLgorICAgICAqCisgICAgICogIEByZXR1cm4gVGhlIFFOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVFOYW1lKE9iamVjdCBhdHRyKQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpYXR0cikudG9Cb29rbWFyayhfeGMpOworICAgICAgICBTdHJpbmcgdXJpID0gX3hjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IF94Yy5wcmVmaXhGb3JOYW1lc3BhY2UodXJpKTsKKyAgICAgICAgcmV0dXJuICggISIiLmVxdWFscyhwcmVmaXgpID8gcHJlZml4ICsgIjoiIDogIiIgKSArIF94Yy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgZG9jdW1lbnQgbm9kZS4gQSBkb2N1bWVudCBub2RlCisgICAgICogIGlzIHRoZSBub2RlIHRoYXQgaXMgc2VsZWN0ZWQgYnkgdGhlIHhwYXRoIGV4cHJlc3Npb24gPGNvZGU+LzwvY29kZT4uCisgICAgICoKKyAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCisgICAgICoKKyAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGEgZG9jdW1lbnQgbm9kZSwKKyAgICAgKiAgICAgICAgICBlbHNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW9iamVjdCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmlzU3RhcnRkb2MoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gZWxlbWVudCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byB0ZXN0LgorICAgICAqCisgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhbiBlbGVtZW50IG5vZGUsCisgICAgICogICAgICAgICAgZWxzZSA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW9iamVjdCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmlzU3RhcnQoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gYXR0cmlidXRlIG5vZGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIHRlc3QuCisgICAgICoKKyAgICAgKiAgQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGFuIGF0dHJpYnV0ZSBub2RlLAorICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW9iamVjdCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmlzQXR0cigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIG5hbWVzcGFjZSBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byB0ZXN0LgorICAgICAqCisgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIG5hbWVzcGFjZSBub2RlLAorICAgICAqICAgICAgICAgIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2UoT2JqZWN0IG9iamVjdCkKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW9iamVjdCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmlzTmFtZXNwYWNlKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgY29tbWVudCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byB0ZXN0LgorICAgICAqCisgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIGNvbW1lbnQgbm9kZSwKKyAgICAgKiAgICAgICAgICBlbHNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWVudChPYmplY3Qgb2JqZWN0KQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuaXNDb21tZW50KCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdGV4dCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byB0ZXN0LgorICAgICAqCisgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIHRleHQgbm9kZSwKKyAgICAgKiAgICAgICAgICBlbHNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dChPYmplY3Qgb2JqZWN0KQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpb2JqZWN0KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuaXNUZXh0KCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcHJvY2Vzc2luZy1pbnN0cnVjdGlvbiBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byB0ZXN0LgorICAgICAqCisgICAgICogIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBhIHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24gbm9kZSwKKyAgICAgKiAgICAgICAgICBlbHNlIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0luc3RydWN0aW9uKE9iamVjdCBvYmplY3QpCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSlvYmplY3QpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5pc1Byb2NpbnN0KCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBzdHJpbmctdmFsdWUgb2YgYSBjb21tZW50IG5vZGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGNvbW1lbnQgVGhlIGNvbW1lbnQgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50U3RyaW5nVmFsdWUoT2JqZWN0IGNvbW1lbnQpCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSljb21tZW50KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuZ2V0VGV4dFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBzdHJpbmctdmFsdWUgb2YgYW4gZWxlbWVudCBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBlbGVtZW50IFRoZSBjb21tZW50IG5vZGUuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBUaGUgc3RyaW5nLXZhbHVlIG9mIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFN0cmluZ1ZhbHVlKE9iamVjdCBlbGVtZW50KQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpZWxlbWVudCkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmdldFRleHRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgc3RyaW5nLXZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBhdHRyIFRoZSBhdHRyaWJ1dGUgbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBzdHJpbmctdmFsdWUgb2YgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVTdHJpbmdWYWx1ZShPYmplY3QgYXR0cikKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWF0dHIpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5nZXRUZXh0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKiogUmV0cmlldmUgdGhlIHN0cmluZy12YWx1ZSBvZiBhIG5hbWVzcGFjZSBub2RlLgorICAgICAqCisgICAgICogIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlIG5vZGUuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBUaGUgc3RyaW5nLXZhbHVlIG9mIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlU3RyaW5nVmFsdWUoT2JqZWN0IG5zKQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpbnMpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBzdHJpbmctdmFsdWUgb2YgYSB0ZXh0IG5vZGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHR4dCBUaGUgdGV4dCBub2RlLgorICAgICAqCisgICAgICogIEByZXR1cm4gVGhlIHN0cmluZy12YWx1ZSBvZiB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRTdHJpbmdWYWx1ZShPYmplY3QgdHh0KQorICAgIHsKKyAgICAgICAgKChKYXhlbk5vZGUpdHh0KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuZ2V0VGV4dFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqIFJldHJpZXZlIHRoZSBuYW1lc3BhY2UgcHJlZml4IG9mIGEgbmFtZXNwYWNlIG5vZGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2Ugbm9kZS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KE9iamVjdCBucykKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW5zKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBfeGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgcGFyc2VkIGZvcm0gb2YgdGhlIGdpdmVuIHhwYXRoIHN0cmluZywgd2hpY2ggd2lsbCBiZSBzdWl0YWJsZQorICAgICAqICBmb3IgcXVlcmllcyBvbiBkb2N1bWVudHMgdGhhdCB1c2UgdGhlIHNhbWUgbmF2aWdhdG9yIGFzIHRoaXMgb25lLgorICAgICAqCisgICAgICogIEBzZWUgb3JnLmpheGVuLlhQYXRoCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHhwYXRoIFRoZSB4cGF0aCBleHByZXNzaW9uLgorICAgICAqCisgICAgICogIEByZXR1cm4gQSBuZXcgWFBhdGggZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICoKKyAgICAgKiAgQHRocm93cyBvcmcuamF4ZW4uc2F4cGF0aC5TQVhQYXRoRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwYXJzaW5nIHRoZQorICAgICAqICAgICAgICAgIHhwYXRoIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFhQYXRoIHBhcnNlWFBhdGgoU3RyaW5nIHhwYXRoKQorICAgICAgICAgICAgdGhyb3dzIFNBWFBhdGhFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgWEJlYW5zWFBhdGgoeHBhdGgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gT3ZlcndyaXR0ZW4gbWV0aG9kcworICAgIC8vCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoaWxkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgX25leHROb2RlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBYbWxDdXJzb3IgX3hjID0gbnVsbDsKKworICAgICAgICBDaGlsZEl0ZXJhdG9yKFhtbEN1cnNvciB4YykKKyAgICAgICAgeworICAgICAgICAgICAgX3hjID0geGM7CisgICAgICAgICAgICBYbWxDdXJzb3IuVG9rZW5UeXBlIHRrID0gX3hjLnRvRmlyc3RDb250ZW50VG9rZW4oKTsgLy9ub3QgaW5jbHVkaW5nIGF0dHMgYW5kIG5zLWVzCisgICAgICAgICAgICBpZiAodGsuaXNGaW5pc2goKSkKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgSmF4ZW5Ob2RlIHJlcyA9IF9uZXh0Tm9kZTsKKworICAgICAgICAgICAgcmVzLnRvQm9va21hcmsoX3hjKTsKKworICAgICAgICAgICAgaWYgKF94Yy5jdXJyZW50VG9rZW5UeXBlKCkgPT0gWG1sQ3Vyc29yLlRva2VuVHlwZS5TVEFSVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfeGMudG9FbmRUb2tlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3hjLnRvTmV4dFRva2VuKCkuaXNGaW5pc2goKSkKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9wdGlvbmFsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiKTsgfQorICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBuZXcgQ2hpbGRJdGVyYXRvcihfeGMpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXREZXNjZW5kYW50QXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZXNjZW5kYW50QXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOworICAgICAgICAvKgorICAgICAgICAgICAgKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGVzY2VuZGFudEl0ZXJhdG9yKF94Yyk7CisgICAgICAgICovCisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFBhcmVudEF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIGlmIChfeGMudG9QYXJlbnQoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlT2JqZWN0SXRlcmF0b3IoZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldEFuY2VzdG9yQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbmNlc3RvckF4aXNJdGVyYXRvciggY29udGV4dE5vZGUsIHRoaXMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Rm9sbG93aW5nU2libGluZ0F4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRm9sbG93aW5nU2libGluZ0F4aXNJdGVyYXRvciggY29udGV4dE5vZGUsIHRoaXMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlY2VkaW5nU2libGluZ0F4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUHJlY2VkaW5nU2libGluZ0F4aXNJdGVyYXRvciggY29udGV4dE5vZGUsIHRoaXMgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Rm9sbG93aW5nQXhpc0l0ZXJhdG9yKE9iamVjdCBjb250ZXh0Tm9kZSkgdGhyb3dzIFVuc3VwcG9ydGVkQXhpc0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGb2xsb3dpbmdBeGlzSXRlcmF0b3IoIGNvbnRleHROb2RlLCB0aGlzICk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFByZWNlZGluZ0F4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUHJlY2VkaW5nQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgX25leHROb2RlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBYbWxDdXJzb3IgX3hjID0gbnVsbDsKKworICAgICAgICBBdHRyaWJ1dGVJdGVyYXRvcihYbWxDdXJzb3IgeGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF94YyA9IHhjOworICAgICAgICAgICAgaWYgKCFfeGMudG9GaXJzdEF0dHJpYnV0ZSgpKQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOworCisgICAgICAgICAgICByZXMudG9Cb29rbWFyayhfeGMpOworCisgICAgICAgICAgICBpZiAoIV94Yy50b05leHRBdHRyaWJ1dGUoKSkKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9wdGlvbmFsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiKTsgfQorICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRyaWJ1dGVBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSljb250ZXh0Tm9kZSkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUl0ZXJhdG9yKF94Yyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lc3BhY2VJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCisgICAgeworICAgICAgICBwcml2YXRlIEpheGVuTm9kZSBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICBwcml2YXRlIFhtbEN1cnNvciBfeGMgPSBudWxsOworCisgICAgICAgIE5hbWVzcGFjZUl0ZXJhdG9yKFhtbEN1cnNvciB4YykKKyAgICAgICAgeworICAgICAgICAgICAgX3hjID0geGM7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxDdXJzb3IuVG9rZW5UeXBlIHRrID0gX3hjLnRvTmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaWYgKHRrID09IFhtbEN1cnNvci5Ub2tlblR5cGUuQVRUUikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHRrID09IFhtbEN1cnNvci5Ub2tlblR5cGUuTkFNRVNQQUNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgSmF4ZW5Ob2RlIHJlcyA9IF9uZXh0Tm9kZTsKKyAgICAgICAgICAgIHJlcy50b0Jvb2ttYXJrKF94Yyk7CisKKyAgICAgICAgICAgIGlmIChfeGMudG9OZXh0VG9rZW4oKS5pc05hbWVzcGFjZSgpKQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3B0aW9uYWwgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOyB9CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldE5hbWVzcGFjZUF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBuZXcgTmFtZXNwYWNlSXRlcmF0b3IoX3hjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0U2VsZkF4aXNJdGVyYXRvcihPYmplY3QgY29udGV4dE5vZGUpIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2VsZkF4aXNJdGVyYXRvciggY29udGV4dE5vZGUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NlbmRhbnRPclNlbGZBeGlzSXRyIGltcGxlbWVudHMgSXRlcmF0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgSmF4ZW5Ob2RlIF9uZXh0Tm9kZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgWG1sQ3Vyc29yIF94YyA9IG51bGw7CisKKyAgICAgICAgRGVzY2VuZGFudE9yU2VsZkF4aXNJdHIoWG1sQ3Vyc29yIHhjKQorICAgICAgICB7CisgICAgICAgICAgICBfeGMgPSB4YzsKKyAgICAgICAgICAgIFhtbEN1cnNvci5Ub2tlblR5cGUgdGsgPSBfeGMudG9GaXJzdENvbnRlbnRUb2tlbigpOyAvL25vdCBpbmNsdWRpbmcgYXR0cyBhbmQgbnMtZXMKKyAgICAgICAgICAgIGlmICh0ay5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOworCisgICAgICAgICAgICByZXMudG9Cb29rbWFyayhfeGMpOworCisgICAgICAgICAgICBpZiAoX3hjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBYbWxDdXJzb3IuVG9rZW5UeXBlLlNUQVJUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF94Yy50b0VuZFRva2VuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfeGMudG9OZXh0VG9rZW4oKS5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IG51bGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgX25leHROb2RlID0gZ2V0Qm9va21hcmtJblRoaXNQbGFjZShfeGMpOworCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigib3B0aW9uYWwgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIpOyB9CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRPclNlbGZBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IERlc2NlbmRhbnRPclNlbGZBeGlzSXRlcmF0b3IoIGNvbnRleHROb2RlLCB0aGlzICk7CisgICAgICAgIC8vKChKYXhlbk5vZGUpY29udGV4dE5vZGUpLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgLy9yZXR1cm4gbmV3IERlc2NlbmRhbnRPclNlbGZBeGlzSXRlcmF0b3IoX3hjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QW5jZXN0b3JPclNlbGZBeGlzSXRlcmF0b3IoT2JqZWN0IGNvbnRleHROb2RlKSB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFuY2VzdG9yT3JTZWxmQXhpc0l0ZXJhdG9yKCBjb250ZXh0Tm9kZSwgdGhpcyApOworICAgICAgICAvLygoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIC8vcmV0dXJuIG5ldyBBbmNlc3Rvck9yU2VsZkF4aXNJdGVyYXRvcihfeGMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RG9jdW1lbnROb2RlKE9iamVjdCBjb250ZXh0Tm9kZSkKKyAgICB7CisgICAgICAgICAgICAoKEpheGVuTm9kZSljb250ZXh0Tm9kZSkudG9Cb29rbWFyayhfeGMpOworICAgICAgICAgICAgX3hjLnRvU3RhcnREb2MoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0cmFuc2xhdGVOYW1lc3BhY2VQcmVmaXhUb1VyaShTdHJpbmcgcHJlZml4LCBPYmplY3QgZWxlbWVudCkKKyAgICB7CisgICAgICAgICAgICAoKEpheGVuTm9kZSllbGVtZW50KS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgICAgICByZXR1cm4gX3hjLm5hbWVzcGFjZUZvclByZWZpeChwcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uVGFyZ2V0KE9iamVjdCBvYmopCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSlvYmopLnRvQm9va21hcmsoX3hjKTsKKyAgICAgICAgcmV0dXJuIF94Yy5nZXRUZXh0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRhdGEoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKW9iaikudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gX3hjLmdldFRleHRWYWx1ZSgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBnZXREb2N1bWVudChTdHJpbmcgdXJsKSB0aHJvd3MgRnVuY3Rpb25DYWxsRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBub3QgZmluZCBlbGVtZW50cy4gT3ZlcnJpZGUgaW4gc3ViY2xhc3MKKyAgICAgKiAgaWYgc3ViY2xhc3MgZG9lcyBrbm93IGFib3V0IGF0dHJpYnV0ZSB0eXBlcy4KKyAgICAgKgorICAgICAqICBAcGFyYW0gb2JqZWN0ICAgYSBub2RlIGZyb20gdGhlIGRvY3VtZW50IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpZAorICAgICAqICBAcGFyYW0gZWxlbWVudElkICAgaWQgdG8gbG9vayBmb3IKKyAgICAgKgorICAgICAqICBAcmV0dXJuICAgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEJ5SWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVsZW1lbnRJZCkKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWRDaGlsZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKKyAgICB7CisgICAgICAgIHByaXZhdGUgSmF4ZW5Ob2RlIF9uZXh0Tm9kZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgUU5hbWUgX3FuYW1lOworICAgICAgICBwcml2YXRlIFhtbEN1cnNvciBfeGMgPSBudWxsOworCisgICAgICAgIE5hbWVkQ2hpbGRJdGVyYXRvcihYbWxDdXJzb3IgeGMsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF94YyA9IHhjOworICAgICAgICAgICAgX3FuYW1lID0gbmV3IFFOYW1lKCAobmFtZXNwYWNlVVJJPT1udWxsID8gIiIgOiBuYW1lc3BhY2VVUkkpLCBsb2NhbE5hbWUpOworCisgICAgICAgICAgICBpZiAoIV94Yy50b0ZpcnN0Q2hpbGQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKF94Yy5jdXJyZW50VG9rZW5UeXBlKCk9PVhtbEN1cnNvci5Ub2tlblR5cGUuU1RBUlQgJiYKKyAgICAgICAgICAgICAgICAgIF94Yy5nZXROYW1lKCkuZXF1YWxzKF9xbmFtZSkKKyAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFfeGMudG9OZXh0U2libGluZyhfcW5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX25leHROb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX25leHROb2RlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgSmF4ZW5Ob2RlIHJlcyA9IF9uZXh0Tm9kZTsKKyAgICAgICAgICAgIHJlcy50b0Jvb2ttYXJrKF94Yyk7CisKKyAgICAgICAgICAgIGlmICghX3hjLnRvTmV4dFNpYmxpbmcoX3FuYW1lKSkKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9uZXh0Tm9kZSA9IGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoX3hjKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm9wdGlvbmFsIG1ldGhvZCBub3QgaW1wbGVtZW50ZWQiKTsgfQorICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEF4aXNJdGVyYXRvcigKKyAgICAgICAgICAgIE9iamVjdCBjb250ZXh0Tm9kZSwKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRBeGlzRXhjZXB0aW9uCisgICAgeworICAgICAgICAoKEpheGVuTm9kZSljb250ZXh0Tm9kZSkudG9Cb29rbWFyayhfeGMpOworICAgICAgICByZXR1cm4gbmV3IE5hbWVkQ2hpbGRJdGVyYXRvcihfeGMsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVkQXR0cmlidXRlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBKYXhlbk5vZGUgX25leHROb2RlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBRTmFtZSBfcW5hbWU7CisgICAgICAgIHByaXZhdGUgWG1sQ3Vyc29yIF94YzsKKworICAgICAgICBOYW1lZEF0dHJpYnV0ZUl0ZXJhdG9yKFhtbEN1cnNvciB4YywgU3RyaW5nIGxvY2FsLCBTdHJpbmcgdXJpKQorICAgICAgICB7CisgICAgICAgICAgICBfeGMgPSB4YzsKKyAgICAgICAgICAgIF9xbmFtZSA9IG5ldyBRTmFtZSgoIHVyaT09bnVsbCA/ICIiIDogdXJpKSwgbG9jYWwpOworCisgICAgICAgICAgICBYbWxDdXJzb3IuVG9rZW5UeXBlIHRrID0gX3hjLnRvTmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAodGshPVhtbEN1cnNvci5Ub2tlblR5cGUuQVRUUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBfeGMuZ2V0TmFtZSgpLmVxdWFscyhfcW5hbWUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbmV4dE5vZGUgPSBnZXRCb29rbWFya0luVGhpc1BsYWNlKF94Yyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX25leHROb2RlID0gbW92ZShfeGMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfbmV4dE5vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9uZXh0Tm9kZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBKYXhlbk5vZGUgcmVzID0gX25leHROb2RlOworICAgICAgICAgICAgcmVzLnRvQm9va21hcmsoX3hjKTsKKworICAgICAgICAgICAgX25leHROb2RlID0gbW92ZShfeGMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSmF4ZW5Ob2RlIG1vdmUoWG1sQ3Vyc29yIHhjKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoeGMuY3VycmVudFRva2VuVHlwZSgpICE9IFhtbEN1cnNvci5Ub2tlblR5cGUuQVRUUiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlKHhjLnRvTmV4dFRva2VuKCk9PVhtbEN1cnNvci5Ub2tlblR5cGUuQVRUUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHhjLmdldE5hbWUoKS5lcXVhbHMoX3FuYW1lKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Qm9va21hcmtJblRoaXNQbGFjZSh4Yyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJvcHRpb25hbCBtZXRob2Qgbm90IGltcGxlbWVudGVkIik7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0cmlidXRlQXhpc0l0ZXJhdG9yKAorICAgICAgICAgICAgT2JqZWN0IGNvbnRleHROb2RlLAorICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEF4aXNFeGNlcHRpb24KKyAgICB7CisgICAgICAgICgoSmF4ZW5Ob2RlKWNvbnRleHROb2RlKS50b0Jvb2ttYXJrKF94Yyk7CisgICAgICAgIHJldHVybiBuZXcgTmFtZWRBdHRyaWJ1dGVJdGVyYXRvcihfeGMsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKKyAgICB9CisKKyAgICBzdGF0aWMgSmF4ZW5Ob2RlIGdldEJvb2ttYXJrSW5UaGlzUGxhY2UoWG1sQ3Vyc29yIHhjKQorICAgIHsKKyAgICAgICAgSmF4ZW5Ob2RlIHJleiA9IChKYXhlbk5vZGUpeGMuZ2V0Qm9va21hcmsoSmF4ZW5Ob2RlLmNsYXNzKTsKKyAgICAgICAgaWYgKHJlej09bnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV6ID0gbmV3IEpheGVuTm9kZSgpOworICAgICAgICAgICAgeGMuc2V0Qm9va21hcmsocmV6KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXo7CisgICAgfQorCisgICAgWG1sQ3Vyc29yIGdldEN1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gX3hjOworICAgIH0KKworICAgIHZvaWQgc2V0Q3Vyc29yKFhtbEN1cnNvciB4YykKKyAgICB7CisgICAgICAgIHRoaXMuX3hjID0geGM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aC5qYXZhIGIvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGYxMmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc1hQYXRoLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbjsKKworaW1wb3J0IG9yZy5qYXhlbi5CYXNlWFBhdGg7CitpbXBvcnQgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCisgKiBEYXRlOiBPY3QgMTAsIDIwMDMKKyAqLworcHVibGljIGNsYXNzIFhCZWFuc1hQYXRoIGV4dGVuZHMgQmFzZVhQYXRoCit7CisgICAgLyoqIENvbnN0cnVjdCBnaXZlbiBhbiBYUGF0aCBleHByZXNzaW9uIHN0cmluZy4KKyAgICAgKgorICAgICAqICBAcGFyYW0geHBhdGhFeHByIFRoZSBYUGF0aCBleHByZXNzaW9uLgorICAgICAqCisgICAgICogIEB0aHJvd3Mgb3JnLmpheGVuLkpheGVuRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgc3ludGF4IGVycm9yIHdoaWxlCisgICAgICogICAgICAgICAgcGFyc2luZyB0aGUgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgWEJlYW5zWFBhdGgoU3RyaW5nIHhwYXRoRXhwcikgdGhyb3dzIEpheGVuRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlciggeHBhdGhFeHByLCBYQmVhbnNOYXZpZ2F0b3IuZ2V0SW5zdGFuY2UoKSApOworICAgIH0KKworICAgIC8qKiBTZWxlY3QgYWxsIG5vZGVzIHRoYXQgYXJlIHNlbGVjdGFibGUgYnkgdGhpcyBYUGF0aAorICAgICAqICBleHByZXNzaW9uLiBJZiBtdWx0aXBsZSBub2RlcyBtYXRjaCwgbXVsdGlwbGUgbm9kZXMKKyAgICAgKiAgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqICA8cD4KKyAgICAgKiAgPGI+Tk9URTo8L2I+IEluIG1vc3QgY2FzZXMsIG5vZGVzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiAgaW4gZG9jdW1lbnQtb3JkZXIsIGFzIGRlZmluZWQgYnkgdGhlIFhNTCBDYW5vbmljYWxpemF0aW9uCisgICAgICogIHNwZWNpZmljYXRpb24uICBUaGUgZXhjZXB0aW9uIG9jY3VycyB3aGVuIHVzaW5nIFhQYXRoCisgICAgICogIGV4cHJlc3Npb25zIGludm9sdmluZyB0aGUgPGNvZGU+dW5pb248L2NvZGU+IG9wZXJhdG9yCisgICAgICogIChkZW5vdGVkIHdpdGggdGhlIHBpcGUgJ3wnIGNoYXJhY3RlcikuCisgICAgICogIDwvcD4KKyAgICAgKgorICAgICAqICBAcGFyYW0gbm9kZSBUaGUgbm9kZSwgbm9kZXNldCBvciBDb250ZXh0IG9iamVjdCBmb3IgZXZhbHVhdGlvbi4gVGhpcyB2YWx1ZSBjYW4gYmUgbnVsbC4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSA8Y29kZT5ub2RlLXNldDwvY29kZT4gb2YgYWxsIGl0ZW1zIHNlbGVjdGVkCisgICAgICogICAgICAgICAgYnkgdGhpcyBYUGF0aCBleHByZXNzaW9uLgorICAgICAqCisgICAgICogIEBzZWUgI3NlbGVjdFNpbmdsZU5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBzZWxlY3ROb2RlcyhPYmplY3Qgbm9kZSkgdGhyb3dzIEpheGVuRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxDdXJzb3IgeGM7CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgWG1sT2JqZWN0KQorICAgICAgICB7CisgICAgICAgICAgICB4YyA9ICgoWG1sT2JqZWN0KW5vZGUpLm5ld0N1cnNvcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBYbWxDdXJzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHhjID0gKChYbWxDdXJzb3Ipbm9kZSkubmV3Q3Vyc29yKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm9kZSBtdXN0IGJlIGFuIFhtbE9iamVjdCBvciBhbiBYbWxDdXJzb3IsIGZvdW5kOiAiICsgbm9kZS5nZXRDbGFzcygpKTsKKworICAgICAgICAoKFhCZWFuc05hdmlnYXRvcilnZXROYXZpZ2F0b3IoKSkuc2V0Q3Vyc29yKHhjKTsKKyAgICAgICAgcmV0dXJuIG5ldyBMaXN0SW1wbChzdXBlci5zZWxlY3ROb2RlcyggWEJlYW5zTmF2aWdhdG9yLmdldEJvb2ttYXJrSW5UaGlzUGxhY2UoeGMpICkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RMaXN0CisgICAgeworICAgICAgICBwcml2YXRlIExpc3QgX3Jlc3VsdHM7CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0SW1wbChMaXN0IHJlc3VsdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9yZXN1bHRzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9yZXN1bHRzPT1udWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICByZXR1cm4gKChYQmVhbnNOYXZpZ2F0b3IuSmF4ZW5Ob2RlKV9yZXN1bHRzLmdldChpbmRleCkpLmNyZWF0ZUN1cnNvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChfcmVzdWx0cz09bnVsbCA/IDAgOiBfcmVzdWx0cy5zaXplKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aEFkdi5qYXZhIGIvdjEvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNYUGF0aEFkdi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGI2MTkKLS0tIC9kZXYvbnVsbAorKysgYi92MS9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc1hQYXRoQWR2LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuOworCitpbXBvcnQgb3JnLmpheGVuLkJhc2VYUGF0aDsKK2ltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLkpheGVuWEJlYW5zRGVsZWdhdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCisgKiBEYXRlOiBPY3QgMTAsIDIwMDMKKyAqLworcHVibGljIGNsYXNzIFhCZWFuc1hQYXRoQWR2CisgICAgZXh0ZW5kcyBCYXNlWFBhdGgKKyAgICBpbXBsZW1lbnRzIEpheGVuWEJlYW5zRGVsZWdhdGUuU2VsZWN0UGF0aEludGVyZmFjZQoreworICAgIC8qKiBDb25zdHJ1Y3QgZ2l2ZW4gYW4gWFBhdGggZXhwcmVzc2lvbiBzdHJpbmcuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIHhwYXRoRXhwciBUaGUgWFBhdGggZXhwcmVzc2lvbi4KKyAgICAgKgorICAgICAqICBAdGhyb3dzIG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHN5bnRheCBlcnJvciB3aGlsZQorICAgICAqICAgICAgICAgIHBhcnNpbmcgdGhlIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFhCZWFuc1hQYXRoQWR2KFN0cmluZyB4cGF0aEV4cHIpIHRocm93cyBKYXhlbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIoIHhwYXRoRXhwciwgWEJlYW5zTmF2aWdhdG9yLmdldEluc3RhbmNlKCkgKTsKKyAgICB9CisKKyAgICAvKiogU2VsZWN0IGFsbCBub2RlcyB0aGF0IGFyZSBzZWxlY3RhYmxlIGJ5IHRoaXMgWFBhdGgKKyAgICAgKiAgZXhwcmVzc2lvbi4gSWYgbXVsdGlwbGUgbm9kZXMgbWF0Y2gsIG11bHRpcGxlIG5vZGVzCisgICAgICogIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiAgPHA+CisgICAgICogIDxiPk5PVEU6PC9iPiBJbiBtb3N0IGNhc2VzLCBub2RlcyB3aWxsIGJlIHJldHVybmVkCisgICAgICogIGluIGRvY3VtZW50LW9yZGVyLCBhcyBkZWZpbmVkIGJ5IHRoZSBYTUwgQ2Fub25pY2FsaXphdGlvbgorICAgICAqICBzcGVjaWZpY2F0aW9uLiAgVGhlIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB1c2luZyBYUGF0aAorICAgICAqICBleHByZXNzaW9ucyBpbnZvbHZpbmcgdGhlIDxjb2RlPnVuaW9uPC9jb2RlPiBvcGVyYXRvcgorICAgICAqICAoZGVub3RlZCB3aXRoIHRoZSBwaXBlICd8JyBjaGFyYWN0ZXIpLgorICAgICAqICA8L3A+CisgICAgICoKKyAgICAgKiAgPHA+CisgICAgICogIDxiPk5PVEU6PC9iPiBQYXJhbSBub2RlIG11c3QgYmUgYW4gWG1sQ3Vyc29yLCB3aGljaCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSB4cGF0aAorICAgICAqICBleGVjdXRpb24gYW5kIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSByZXN1bHRzLiBBIGNhbGwgb2Ygbm9kZS5kaXNwb3NlKCkgbXVzdCBiZSBkb25lCisgICAgICogIGFmdGVyIHJlYWRpbmcgYWxsIHJlc3VsdHMuCisgICAgICogIDwvcD4KKyAgICAgKgorICAgICAqICBAcGFyYW0gbm9kZSBUaGUgbm9kZSwgbm9kZXNldCBvciBDb250ZXh0IG9iamVjdCBmb3IgZXZhbHVhdGlvbi4gVGhpcyB2YWx1ZSBjYW4gYmUgbnVsbC4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIFRoZSA8Y29kZT5ub2RlLXNldDwvY29kZT4gb2YgYWxsIGl0ZW1zIHNlbGVjdGVkCisgICAgICogICAgICAgICAgYnkgdGhpcyBYUGF0aCBleHByZXNzaW9uLgorICAgICAqCisgICAgICogIEBzZWUgI3NlbGVjdFNpbmdsZU5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBzZWxlY3ROb2RlcyhPYmplY3Qgbm9kZSkgdGhyb3dzIEpheGVuRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxDdXJzb3IgeGM7CisgICAgICAgIHhjID0gKChYbWxDdXJzb3Ipbm9kZSk7CisKKyAgICAgICAgKChYQmVhbnNOYXZpZ2F0b3IpZ2V0TmF2aWdhdG9yKCkpLnNldEN1cnNvcih4Yyk7CisgICAgICAgIHJldHVybiBzdXBlci5zZWxlY3ROb2RlcyggWEJlYW5zTmF2aWdhdG9yLmdldEJvb2ttYXJrSW5UaGlzUGxhY2UoeGMpICk7CisgICAgfQorCisgICAgcHVibGljIExpc3Qgc2VsZWN0UGF0aChPYmplY3Qgbm9kZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VsZWN0Tm9kZXMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvc3JjL3hzZHNjaGVtYS9zY2hlbWEvWE1MU2NoZW1hLnhzZCBiL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlMDNhYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3NyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QKQEAgLTAsMCArMSwyNTQ5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBYTUwgU2NoZW1hIHNjaGVtYSBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMTogU3RydWN0dXJlcyAtLT4KKzwhLS0gTm90ZSB0aGlzIHNjaGVtYSBpcyBOT1QgdGhlIG5vcm1hdGl2ZSBzdHJ1Y3R1cmVzIHNjaGVtYS4gLS0+CisKKzwhLS0gVGhlIHByb3NlIGNvcHkgaW4gdGhlIHN0cnVjdHVyZXMgUkVDIGlzIHRoZSBub3JtYXRpdmUgLS0+CisKKzwhLS0gdmVyc2lvbiAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgLS0+CisKKzwhLS0gdGhpcyBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSAtLT4KKworPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgWworCis8IS0tIHByb3ZpZGUgSUQgdHlwZSBpbmZvcm1hdGlvbiBldmVuIGZvciBwYXJzZXJzIHdoaWNoIG9ubHkgcmVhZCB0aGUKKyAgICAgaW50ZXJuYWwgc3Vic2V0IC0tPgorPCFBVFRMSVNUIHhzOnNjaGVtYSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmNvbXBsZXhUeXBlICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmNvbXBsZXhDb250ZW50ICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOnNpbXBsZUNvbnRlbnQgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmV4dGVuc2lvbiAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmVsZW1lbnQgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmdyb3VwICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmFsbCAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmNob2ljZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOnNlcXVlbmNlICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmFueSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmFueUF0dHJpYnV0ZSAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZSAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmF0dHJpYnV0ZUdyb3VwICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOnVuaXF1ZSAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmtleSAgICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmtleXJlZiAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOnNlbGVjdG9yICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmZpZWxkICAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmluY2x1ZGUgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOmltcG9ydCAgICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOnJlZGVmaW5lICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCFBVFRMSVNUIHhzOm5vdGF0aW9uICAgICAgICBpZCAgSUQgICNJTVBMSUVEPgorPCEtLQorICAgICBrZWVwIHRoaXMgc2NoZW1hIFhNTDEuMCBEVEQgdmFsaWQKKyAgLS0+CisgICAgICAgIDwhRU5USVRZICUgc2NoZW1hQXR0cnMgJ3htbG5zOmhmcCBDREFUQSAjSU1QTElFRCc+CisKKyAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNGYWNldCBFTVBUWT4KKyAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNGYWNldAorICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQ+CisKKyAgICAgICAgPCFFTEVNRU5UIGhmcDpoYXNQcm9wZXJ0eSBFTVBUWT4KKyAgICAgICAgPCFBVFRMSVNUIGhmcDpoYXNQcm9wZXJ0eQorICAgICAgICAgICAgICAgIG5hbWUgTk1UT0tFTiAjUkVRVUlSRUQKKyAgICAgICAgICAgICAgICB2YWx1ZSBDREFUQSAjUkVRVUlSRUQ+Cis8IS0tCisgICAgICAgIE1ha2Ugc3VyZSB0aGF0IHByb2Nlc3NvcnMgdGhhdCBkbyBub3QgcmVhZCB0aGUgZXh0ZXJuYWwKKyAgICAgICAgc3Vic2V0IHdpbGwga25vdyBhYm91dCB0aGUgdmFyaW91cyBJRHMgd2UgZGVjbGFyZQorICAtLT4KKyAgICAgICAgPCFBVFRMSVNUIHhzOnNpbXBsZVR5cGUgaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czptYXhFeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czptaW5FeGNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czptYXhJbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czptaW5JbmNsdXNpdmUgaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czp0b3RhbERpZ2l0cyBpZCBJRCAjSU1QTElFRD4KKyAgICAgICAgPCFBVFRMSVNUIHhzOmZyYWN0aW9uRGlnaXRzIGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6bGVuZ3RoIGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6bWluTGVuZ3RoIGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6bWF4TGVuZ3RoIGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6ZW51bWVyYXRpb24gaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czpwYXR0ZXJuIGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6YXBwaW5mbyBpZCBJRCAjSU1QTElFRD4KKyAgICAgICAgPCFBVFRMSVNUIHhzOmRvY3VtZW50YXRpb24gaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIDwhQVRUTElTVCB4czpsaXN0IGlkIElEICNJTVBMSUVEPgorICAgICAgICA8IUFUVExJU1QgeHM6dW5pb24gaWQgSUQgI0lNUExJRUQ+CisgICAgICAgIF0+Cis8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGJsb2NrRGVmYXVsdD0iI2FsbCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHZlcnNpb249IjEuMCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iRU4iIHhtbG5zOmhmcD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaGFzRmFjZXRBbmRQcm9wZXJ0eSI+CisgPHhzOmFubm90YXRpb24+CisgIDx4czpkb2N1bWVudGF0aW9uPgorICAgIFBhcnQgMSB2ZXJzaW9uOiBJZDogWE1MU2NoZW1hLnhzZCx2IDEuNTMgMjAwMy8wMi8yNCAxNzo0MDowNyBodCBFeHAKKyAgICBQYXJ0IDIgdmVyc2lvbjogSWQ6IGRhdGF0eXBlcy54c2QsdiAxLjYwIDIwMDMvMDQvMDUgMTE6MDI6MzAgaHQgRXhwCisgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgQXBhY2hlIFhNTEJlYW4gY2hhbmdlczoKKworICAgIDIwMDMvMDUvMTQ6IFRoZSByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgZGVzY3JpYmUgaW50ZWdyaXR5IGNvbnN0cmFpbnQKKyAgICB4cGF0aHMgaGFzIGJlZW4gbW9kaWZpZWQgdG8gcGVybWl0IHdoaXRlc3BhY2VzIGluIGNlcnRhaW4gcGxhY2VzLCBhcworICAgIGRpc2N1c3NlZCBpbiBvbmUgb2YgdGhlIGVycmF0YS4KKworICAgIDIwMDMvMDUvMjg6IHRoZSB0eXBlIG9mIHRoZSAmbHQ7ZWxlbWVudD4gZWxlbWVudCBpbiBhbiAmbHQ7YWxsPiBncm91cCBoYXMKKyAgICBiZWVuIGdpdmVuIGEgbmFtZSBzbyB0aGF0IGl0IGlzIGxlZ2FsIHRvIHVzZSB0aGUgdHlwZSBpbiBib3RoIGEgYmFzZSB0eXBlCisgICAgYW5kIGEgcmVzdHJpY3Rpb24gd2hlbiB1c2luZyB0aGUgYWxsTW9kZWwgKG90aGVyd2lzZSBpdCBicmVha3Mgb25lIG9mIHRoZQorICAgIHBhcnRpY2xlLXZhbGlkIChyZXN0cmljdGlvbikgcnVsZXMpLgorCisgICAgMjAwMy8wOS8xNTogZmluYWxEZWZhdWx0IGhhcyBiZWVuIGNoYW5nZWQgdG8gcGVybWl0ICJsaXN0IiBhbmQgInVuaW9uIgorCisgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKworIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvR3JvdXAvMjAwMi8wOS94bWxzY2hlbWEtMS9zdHJ1Y3R1cmVzLXdpdGgtZXJyYXRhLmh0bWwiPgorICAgVGhlIHNjaGVtYSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZG9jdW1lbnQgaXMgbm9ybWF0aXZlLAorICAgd2l0aCByZXNwZWN0IHRvIHRoZSBzeW50YWN0aWMgY29uc3RyYWludHMgaXQgZXhwcmVzc2VzIGluIHRoZQorICAgWE1MIFNjaGVtYSBsYW5ndWFnZS4gIFRoZSBkb2N1bWVudGF0aW9uICh3aXRoaW4gJmx0O2RvY3VtZW50YXRpb24+IGVsZW1lbnRzKQorICAgYmVsb3csIGlzIG5vdCBub3JtYXRpdmUsIGJ1dCByYXRoZXIgaGlnaGxpZ2h0cyBpbXBvcnRhbnQgYXNwZWN0cyBvZgorICAgdGhlIFczQyBSZWNvbW1lbmRhdGlvbiBvZiB3aGljaCB0aGlzIGlzIGEgcGFydDwveHM6ZG9jdW1lbnRhdGlvbj4KKyA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgVGhlIHNpbXBsZVR5cGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBtZW1iZXJzIGFyZSBkZWZpbmVkCisgICAgICB0b3dhcmRzIHRoZSBlbmQgb2YgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L3hzOmRvY3VtZW50YXRpb24+CisgPC94czphbm5vdGF0aW9uPgorCisgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgR2V0IGFjY2VzcyB0byB0aGUgeG1sOiBhdHRyaWJ1dGUgZ3JvdXBzIGZvciB4bWw6bGFuZworICAgICAgIGFzIGRlY2xhcmVkIG9uICdzY2hlbWEnIGFuZCAnZG9jdW1lbnRhdGlvbicgYmVsb3cKKyAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgPC94czphbm5vdGF0aW9uPgorIDwveHM6aW1wb3J0PgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im9wZW5BdHRycyI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbW9zdCBhbGwgc2NoZW1hIHR5cGVzCisgICAgICAgdG8gYWxsb3cgYXR0cmlidXRlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUKKyAgICAgICBhZGRlZCB0byB1c2VyIHNjaGVtYXMuCisgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgIDwveHM6YW5ub3RhdGlvbj4KKyAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPgorICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFubm90YXRlZCI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGFsbCB0eXBlcyB3aGljaCBhbGxvdyBhbm5vdGF0aW9uCisgICAgICAgb3RoZXIgdGhhbiAmbHQ7c2NoZW1hJmd0OyBpdHNlbGYKKyAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgPC94czphbm5vdGF0aW9uPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+CisgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+CisgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmdyb3VwIG5hbWU9InNjaGVtYVRvcCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBUaGlzIGdyb3VwIGlzIGZvciB0aGUKKyAgIGVsZW1lbnRzIHdoaWNoIG9jY3VyIGZyZWVseSBhdCB0aGUgdG9wIGxldmVsIG9mIHNjaGVtYXMuCisgICBBbGwgb2YgdGhlaXIgdHlwZXMgYXJlIGJhc2VkIG9uIHRoZSAiYW5ub3RhdGVkIiB0eXBlIGJ5IGV4dGVuc2lvbi48L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNob2ljZT4KKyAgIDx4czpncm91cCByZWY9InhzOnJlZGVmaW5hYmxlIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmVsZW1lbnQiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6YXR0cmlidXRlIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOm5vdGF0aW9uIi8+CisgIDwveHM6Y2hvaWNlPgorIDwveHM6Z3JvdXA+CisKKyA8eHM6Z3JvdXAgbmFtZT0icmVkZWZpbmFibGUiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgVGhpcyBncm91cCBpcyBmb3IgdGhlCisgICBlbGVtZW50cyB3aGljaCBjYW4gc2VsZi1yZWRlZmluZSAoc2VlICZsdDtyZWRlZmluZT4gYmVsb3cpLjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6Y2hvaWNlPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzaW1wbGVUeXBlIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmNvbXBsZXhUeXBlIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmdyb3VwIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmF0dHJpYnV0ZUdyb3VwIi8+CisgIDwveHM6Y2hvaWNlPgorIDwveHM6Z3JvdXA+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJmb3JtQ2hvaWNlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJxdWFsaWZpZWQiLz4KKyAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5xdWFsaWZpZWQiLz4KKyAgPC94czpyZXN0cmljdGlvbj4KKyA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkZWZhdWx0RGVyaXZhdGlvbkNvbnRyb2wiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KKyAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KKyAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgorICA8L3hzOnJlc3RyaWN0aW9uPgorIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlZmF1bHREZXJpdmF0aW9uU2V0Ij4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge2V4dGVuc2lvbiwgcmVzdHJpY3Rpb24sIGxpc3QsIHVuaW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6dW5pb24+CisgICA8eHM6c2ltcGxlVHlwZT4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiNhbGwiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpzaW1wbGVUeXBlPgorICAgPHhzOnNpbXBsZVR5cGU+CisgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmRlZmF1bHREZXJpdmF0aW9uQ29udHJvbCIvPgorICAgPC94czpzaW1wbGVUeXBlPgorICA8L3hzOnVuaW9uPgorIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpzaW1wbGVUeXBlIG5hbWU9InJlZHVjZWREZXJpdmF0aW9uQ29udHJvbCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+CisgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXN0cmljdGlvbiIvPgorICA8L3hzOnJlc3RyaWN0aW9uPgorIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlcml2YXRpb25TZXQiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgI2FsbCBvciAocG9zc2libHkgZW1wdHkpIHN1YnNldCBvZiB7ZXh0ZW5zaW9uLCByZXN0cmljdGlvbn08L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOnVuaW9uPgorICAgPHhzOnNpbXBsZVR5cGU+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKyAgIDx4czpzaW1wbGVUeXBlPgorICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpyZWR1Y2VkRGVyaXZhdGlvbkNvbnRyb2wiLz4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKyAgPC94czp1bmlvbj4KKyA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIGlkPSJzY2hlbWEiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNjaGVtYSIvPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpjb21wbGV4VHlwZT4KKyAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+CisgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbmNsdWRlIi8+CisgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czppbXBvcnQiLz4KKyAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlZGVmaW5lIi8+CisgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIi8+CisgICAgICA8L3hzOmNob2ljZT4KKyAgICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzY2hlbWFUb3AiLz4KKyAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgIDwveHM6c2VxdWVuY2U+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4KKyAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpub3JtYWxpemVkU3RyaW5nIi8+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWxEZWZhdWx0IiB0eXBlPSJ4czpkZWZhdWx0RGVyaXZhdGlvblNldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2tEZWZhdWx0IiB0eXBlPSJ4czpibG9ja1NldCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlRm9ybURlZmF1bHQiIHR5cGU9InhzOmZvcm1DaG9pY2UiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InVucXVhbGlmaWVkIi8+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudEZvcm1EZWZhdWx0IiB0eXBlPSJ4czpmb3JtQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJ1bnF1YWxpZmllZCIvPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KKyAgICA8L3hzOmV4dGVuc2lvbj4KKyAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmtleSBuYW1lPSJlbGVtZW50Ij4KKyAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6ZWxlbWVudCIvPgorICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgorICA8L3hzOmtleT4KKworICA8eHM6a2V5IG5hbWU9ImF0dHJpYnV0ZSI+CisgICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOmF0dHJpYnV0ZSIvPgorICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgorICA8L3hzOmtleT4KKworICA8eHM6a2V5IG5hbWU9InR5cGUiPgorICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpjb21wbGV4VHlwZXx4czpzaW1wbGVUeXBlIi8+CisgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+CisgIDwveHM6a2V5PgorCisgIDx4czprZXkgbmFtZT0iZ3JvdXAiPgorICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ4czpncm91cCIvPgorICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIvPgorICA8L3hzOmtleT4KKworICA8eHM6a2V5IG5hbWU9ImF0dHJpYnV0ZUdyb3VwIj4KKyAgIDx4czpzZWxlY3RvciB4cGF0aD0ieHM6YXR0cmlidXRlR3JvdXAiLz4KKyAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KKyAgPC94czprZXk+CisKKyAgPHhzOmtleSBuYW1lPSJub3RhdGlvbiI+CisgICA8eHM6c2VsZWN0b3IgeHBhdGg9InhzOm5vdGF0aW9uIi8+CisgICA8eHM6ZmllbGQgeHBhdGg9IkBuYW1lIi8+CisgIDwveHM6a2V5PgorCisgIDx4czprZXkgbmFtZT0iaWRlbnRpdHlDb25zdHJhaW50Ij4KKyAgIDx4czpzZWxlY3RvciB4cGF0aD0iLi8veHM6a2V5fC4vL3hzOnVuaXF1ZXwuLy94czprZXlyZWYiLz4KKyAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiLz4KKyAgPC94czprZXk+CisKKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJhbGxOTkkiPgorICA8eHM6YW5ub3RhdGlvbj48eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIGZvciBtYXhPY2N1cnM8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPgorICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+CisgICA8eHM6c2ltcGxlVHlwZT4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5ib3VuZGVkIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKyAgPC94czp1bmlvbj4KKyA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ib2NjdXJzIj4KKyAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+CisgICBmb3IgYWxsIHBhcnRpY2xlczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+CisgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiLz4KKyAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHR5cGU9InhzOmFsbE5OSSIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgorIDwveHM6YXR0cmlidXRlR3JvdXA+CisKKyA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iZGVmUmVmIj4KKyAgPHhzOmFubm90YXRpb24+PHhzOmRvY3VtZW50YXRpb24+CisgICBmb3IgZWxlbWVudCwgZ3JvdXAgYW5kIGF0dHJpYnV0ZUdyb3VwLAorICAgd2hpY2ggYm90aCBkZWZpbmUgYW5kIHJlZmVyZW5jZTwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+CisgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+CisgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB0eXBlPSJ4czpRTmFtZSIvPgorIDwveHM6YXR0cmlidXRlR3JvdXA+CisKKyA8eHM6Z3JvdXAgbmFtZT0idHlwZURlZlBhcnRpY2xlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAnY29tcGxleFR5cGUnIHVzZXMgdGhpczwveHM6ZG9jdW1lbnRhdGlvbj48L3hzOmFubm90YXRpb24+CisgIDx4czpjaG9pY2U+CisgICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgorICA8L3hzOmNob2ljZT4KKyA8L3hzOmdyb3VwPgorCisKKworIDx4czpncm91cCBuYW1lPSJuZXN0ZWRQYXJ0aWNsZSI+CisgIDx4czpjaG9pY2U+CisgICA8eHM6ZWxlbWVudCBuYW1lPSJlbGVtZW50IiB0eXBlPSJ4czpsb2NhbEVsZW1lbnQiLz4KKyAgIDx4czplbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJ4czpncm91cFJlZiIvPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpjaG9pY2UiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6c2VxdWVuY2UiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6YW55Ii8+CisgIDwveHM6Y2hvaWNlPgorIDwveHM6Z3JvdXA+CisKKyA8eHM6Z3JvdXAgbmFtZT0icGFydGljbGUiPgorICA8eHM6Y2hvaWNlPgorICAgPHhzOmVsZW1lbnQgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6bG9jYWxFbGVtZW50Ii8+CisgICA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6Z3JvdXBSZWYiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6YWxsIi8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmNob2ljZSIvPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZXF1ZW5jZSIvPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbnkiLz4KKyAgPC94czpjaG9pY2U+CisgPC94czpncm91cD4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0ieHM6ZGVmUmVmIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpRTmFtZSIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idXNlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJvcHRpb25hbCI+CisgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvaGliaXRlZCIvPgorICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib3B0aW9uYWwiLz4KKyAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIi8+CisgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxBdHRyaWJ1dGUiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YXR0cmlidXRlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpncm91cCBuYW1lPSJhdHRyRGVjbHMiPgorICA8eHM6c2VxdWVuY2U+CisgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgIDx4czplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ieHM6YXR0cmlidXRlIi8+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOmF0dHJpYnV0ZUdyb3VwUmVmIi8+CisgICA8L3hzOmNob2ljZT4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6YW55QXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KKyAgPC94czpzZXF1ZW5jZT4KKyA8L3hzOmdyb3VwPgorCisgPHhzOmVsZW1lbnQgbmFtZT0iYW55QXR0cmlidXRlIiB0eXBlPSJ4czp3aWxkY2FyZCIgaWQ9ImFueUF0dHJpYnV0ZSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbnlBdHRyaWJ1dGUiLz4KKyAgPC94czphbm5vdGF0aW9uPgorIDwveHM6ZWxlbWVudD4KKworIDx4czpncm91cCBuYW1lPSJjb21wbGV4VHlwZU1vZGVsIj4KKyAgPHhzOmNob2ljZT4KKyAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6c2ltcGxlQ29udGVudCIvPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpjb21wbGV4Q29udGVudCIvPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIFRoaXMgYnJhbmNoIGlzIHNob3J0IGZvcgorICAgJmx0O2NvbXBsZXhDb250ZW50PgorICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9InhzOmFueVR5cGUiPgorICAgLi4uCisgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICAgJmx0Oy9jb21wbGV4Q29udGVudD48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgIDx4czpncm91cCByZWY9InhzOnR5cGVEZWZQYXJ0aWNsZSIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICA8L3hzOmNob2ljZT4KKyA8L3hzOmdyb3VwPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBsZXhUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiPgorICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgV2lsbCBiZSByZXN0cmljdGVkIHRvIHJlcXVpcmVkIG9yIGZvcmJpZGRlbjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgPC94czphbm5vdGF0aW9uPgorICAgIDwveHM6YXR0cmlidXRlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIj4KKyAgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIE5vdCBhbGxvd2VkIGlmIHNpbXBsZUNvbnRlbnQgY2hpbGQgaXMgY2hvc2VuLgorICAgICAgTWF5IGJlIG92ZXJyaWRlbiBieSBzZXR0aW5nIG9uIGNvbXBsZXhDb250ZW50IGNoaWxkLjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYnN0cmFjdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0Ii8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9jayIgdHlwZT0ieHM6ZGVyaXZhdGlvblNldCIvPgorICAgPC94czpleHRlbnNpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0b3BMZXZlbENvbXBsZXhUeXBlIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmNvbXBsZXhUeXBlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4czpncm91cCByZWY9InhzOmNvbXBsZXhUeXBlTW9kZWwiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxDb21wbGV4VHlwZSI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpjb21wbGV4VHlwZSI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpjb21wbGV4VHlwZU1vZGVsIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWJzdHJhY3QiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmluYWwiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmxvY2siIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlc3RyaWN0aW9uVHlwZSI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgIDx4czpncm91cCByZWY9InhzOnR5cGVEZWZQYXJ0aWNsZSIvPgorICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgorICAgICA8L3hzOmNob2ljZT4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+CisgICA8L3hzOmV4dGVuc2lvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBsZXhSZXN0cmljdGlvblR5cGUiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bworICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6dHlwZURlZlBhcnRpY2xlIi8+CisgICAgIDwveHM6Y2hvaWNlPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2lvblR5cGUiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czp0eXBlRGVmUGFydGljbGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0icmVxdWlyZWQiLz4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4Q29udGVudCIgaWQ9ImNvbXBsZXhDb250ZW50Ij4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNvbXBsZXhDb250ZW50Ii8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgPHhzOmNob2ljZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9InJlc3RyaWN0aW9uIiB0eXBlPSJ4czpjb21wbGV4UmVzdHJpY3Rpb25UeXBlIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9InhzOmV4dGVuc2lvblR5cGUiLz4KKyAgICAgPC94czpjaG9pY2U+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iPgorICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgT3ZlcnJpZGVzIGFueSBzZXR0aW5nIG9uIGNvbXBsZXhUeXBlIHBhcmVudC48L3hzOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPC94czpleHRlbnNpb24+CisgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorIDwveHM6ZWxlbWVudD4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVSZXN0cmljdGlvblR5cGUiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6cmVzdHJpY3Rpb25UeXBlIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoaXMgY2hvaWNlIGlzIGFkZGVkIHNpbXBseSB0bworICAgICAgICAgICAgICAgICAgIG1ha2UgdGhpcyBhIHZhbGlkIHJlc3RyaWN0aW9uIHBlciB0aGUgUkVDPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCIvPgorICAgICA8L3hzOmNob2ljZT4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHRlbnNpb25UeXBlIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4dGVuc2lvblR5cGUiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIE5vIHR5cGVEZWZQYXJ0aWNsZSBncm91cCByZWZlcmVuY2U8L3hzOmRvY3VtZW50YXRpb24+CisgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6YXR0ckRlY2xzIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czplbGVtZW50IG5hbWU9InNpbXBsZUNvbnRlbnQiIGlkPSJzaW1wbGVDb250ZW50Ij4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNpbXBsZUNvbnRlbnQiLz4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6Y29tcGxleFR5cGU+CisgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgICA8eHM6Y2hvaWNlPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIHR5cGU9InhzOnNpbXBsZVJlc3RyaWN0aW9uVHlwZSIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJ4czpzaW1wbGVFeHRlbnNpb25UeXBlIi8+CisgICAgIDwveHM6Y2hvaWNlPgorICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6dG9wTGV2ZWxDb21wbGV4VHlwZSIgaWQ9ImNvbXBsZXhUeXBlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWNvbXBsZXhUeXBlIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmVsZW1lbnQ+CisKKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJibG9ja1NldCI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICBBIHV0aWxpdHkgdHlwZSwgbm90IGZvciBwdWJsaWMgdXNlPC94czpkb2N1bWVudGF0aW9uPgorICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICNhbGwgb3IgKHBvc3NpYmx5IGVtcHR5KSBzdWJzZXQgb2Yge3N1YnN0aXR1dGlvbiwgZXh0ZW5zaW9uLAorICAgIHJlc3RyaWN0aW9ufTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgIDwveHM6YW5ub3RhdGlvbj4KKyAgIDx4czp1bmlvbj4KKyAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iI2FsbCIvPgorICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgPHhzOmxpc3Q+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZGVyaXZhdGlvbkNvbnRyb2wiPgorICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuc2lvbiIvPgorICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlc3RyaWN0aW9uIi8+CisgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3Vic3RpdHV0aW9uIi8+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgPC94czpsaXN0PgorICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgIDwveHM6dW5pb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBUaGUgZWxlbWVudCBlbGVtZW50IGNhbiBiZSB1c2VkIGVpdGhlcgorICAgYXQgdGhlIHRvcCBsZXZlbCB0byBkZWZpbmUgYW4gZWxlbWVudC10eXBlIGJpbmRpbmcgZ2xvYmFsbHksCisgICBvciB3aXRoaW4gYSBjb250ZW50IG1vZGVsIHRvIGVpdGhlciByZWZlcmVuY2UgYSBnbG9iYWxseS1kZWZpbmVkCisgICBlbGVtZW50IG9yIHR5cGUgb3IgZGVjbGFyZSBhbiBlbGVtZW50LXR5cGUgYmluZGluZyBsb2NhbGx5LgorICAgVGhlIHJlZiBmb3JtIGlzIG5vdCBhbGxvd2VkIGF0IHRoZSB0b3AgbGV2ZWwuPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisKKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgorICAgICA8L3hzOmNob2ljZT4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25Hcm91cCIgdHlwZT0ieHM6UU5hbWUiLz4KKyAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpvY2N1cnMiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhYnN0cmFjdCIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iZmFsc2UiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB0eXBlPSJ4czpkZXJpdmF0aW9uU2V0Ii8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJibG9jayIgdHlwZT0ieHM6YmxvY2tTZXQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZvcm0iIHR5cGU9InhzOmZvcm1DaG9pY2UiLz4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxFbGVtZW50Ij4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgorICAgICA8L3hzOmNob2ljZT4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmb3JtIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxFbGVtZW50Ij4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmVsZW1lbnQiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgorICAgICA8L3hzOmNob2ljZT4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6aWRlbnRpdHlDb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkdyb3VwIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFic3RyYWN0IiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOnRvcExldmVsRWxlbWVudCIgaWQ9ImVsZW1lbnQiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtZWxlbWVudCIvPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czplbGVtZW50PgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBncm91cCB0eXBlIGZvciBleHBsaWNpdCBncm91cHMsIG5hbWVkIHRvcC1sZXZlbCBncm91cHMgYW5kCisgICBncm91cCByZWZlcmVuY2VzPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICA8eHM6Z3JvdXAgcmVmPSJ4czpwYXJ0aWNsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOmRlZlJlZiIvPgorICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InhzOm9jY3VycyIvPgorICAgPC94czpleHRlbnNpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJyZWFsR3JvdXAiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Z3JvdXAiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFsbCIvPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpjaG9pY2UiLz4KKyAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6c2VxdWVuY2UiLz4KKyAgICAgPC94czpjaG9pY2U+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZEdyb3VwIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnJlYWxHcm91cCI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIj4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImFsbCI+CisgICAgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YWxsIj4KKyAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphbGxNb2RlbCIvPgorICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICA8L3hzOmVsZW1lbnQ+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UiIHR5cGU9InhzOnNpbXBsZUV4cGxpY2l0R3JvdXAiLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlIiB0eXBlPSJ4czpzaW1wbGVFeHBsaWNpdEdyb3VwIi8+CisgICAgIDwveHM6Y2hvaWNlPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJncm91cFJlZiI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpyZWFsR3JvdXAiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpRTmFtZSIvPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZXhwbGljaXRHcm91cCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBncm91cCB0eXBlIGZvciB0aGUgdGhyZWUga2luZHMgb2YgZ3JvdXA8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmdyb3VwIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgIDx4czpncm91cCByZWY9InhzOm5lc3RlZFBhcnRpY2xlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOlFOYW1lIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaW1wbGVFeHBsaWNpdEdyb3VwIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4cGxpY2l0R3JvdXAiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgPHhzOmdyb3VwIHJlZj0ieHM6bmVzdGVkUGFydGljbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Z3JvdXAgbmFtZT0iYWxsTW9kZWwiPgorICA8eHM6c2VxdWVuY2U+CisgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+VGhpcyBjaG9pY2Ugd2l0aCBtaW4vbWF4IGlzIGhlcmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgYSBwYmxtIHdpdGggdGhlIEVsdDpBbGwvQ2hvaWNlL1NlcQorICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWNsZSBkZXJpdmF0aW9uIGNvbnN0cmFpbnQ8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOmVsZW1lbnRJbkFsbCIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgIDwveHM6c2VxdWVuY2U+CisgPC94czpncm91cD4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudEluQWxsIj4KKyAgIDx4czphbm5vdGF0aW9uPgorICAgIDx4czpkb2N1bWVudGF0aW9uPnJlc3RyaWN0ZWQgbWF4L21pbjwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgIDwveHM6YW5ub3RhdGlvbj4KKyAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bG9jYWxFbGVtZW50Ij4KKyAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiLz4KKyAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21wbGV4VHlwZSIgdHlwZT0ieHM6bG9jYWxDb21wbGV4VHlwZSIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czppZGVudGl0eUNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5PY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgorICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+CisgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KKyAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhPY2N1cnMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IjEiPgorICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFsbE5OSSI+CisgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgorICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KKyAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFsbCI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIE9ubHkgZWxlbWVudHMgYWxsb3dlZCBpbnNpZGU8L3hzOmRvY3VtZW50YXRpb24+CisgICA8L3hzOmFubm90YXRpb24+CisgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmV4cGxpY2l0R3JvdXAiPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphbGxNb2RlbCIvPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbk9jY3VycyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KKyAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwIi8+CisgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgorICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgIDwveHM6YXR0cmlidXRlPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1heE9jY3VycyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YWxsTk5JIj4KKyAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgPC94czphdHRyaWJ1dGU+CisgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmVsZW1lbnQgbmFtZT0iYWxsIiBpZD0iYWxsIiB0eXBlPSJ4czphbGwiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYWxsIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UiIHR5cGU9InhzOmV4cGxpY2l0R3JvdXAiIGlkPSJjaG9pY2UiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtY2hvaWNlIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ieHM6ZXhwbGljaXRHcm91cCIgaWQ9InNlcXVlbmNlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXNlcXVlbmNlIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ieHM6bmFtZWRHcm91cCIgaWQ9Imdyb3VwIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWdyb3VwIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0id2lsZGNhcmQiPgorICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOm5hbWVzcGFjZUxpc3QiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IiMjYW55Ii8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzQ29udGVudHMiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9InN0cmljdCI+CisgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2tpcCIvPgorICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGF4Ii8+CisgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpY3QiLz4KKyAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJhbnkiIGlkPSJhbnkiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtYW55Ii8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6d2lsZGNhcmQiPgorICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpvY2N1cnMiLz4KKyAgICA8L3hzOmV4dGVuc2lvbj4KKyAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisgPC94czplbGVtZW50PgorCisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICBzaW1wbGUgdHlwZSBmb3IgdGhlIHZhbHVlIG9mIHRoZSAnbmFtZXNwYWNlJyBhdHRyIG9mCisgICAnYW55JyBhbmQgJ2FueUF0dHJpYnV0ZSc8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIFZhbHVlIGlzCisgICAgICAgICAgICAgICMjYW55ICAgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGF0IGFsbAorCisgICAgICAgICAgICAgICMjb3RoZXIgICAgLSAtIGFueSBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBvdGhlciB0aGFuIHRhcmdldE5TCisKKyAgICAgICAgICAgICAgIyNsb2NhbCAgICAtIC0gYW55IHVucXVhbGlmaWVkIG5vbi1jb25mbGljdGluZyBXRlhNTC9hdHRyaWJ1dGUKKworICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1ML2F0dHJpYnV0ZSBmcm9tCisgICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKKyAgICAgICAgICAgICAgcmVmZXJlbmNlcworICAgICAgICAgICAgICAoc3BhY2Ugc2VwYXJhdGVkKQorCisgICAgIyN0YXJnZXROYW1lc3BhY2Ugb3IgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LCB0bworICAgICAgICByZWZlciB0byB0aGUgdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBlbmNsb3NpbmcKKyAgICAgICAgc2NoZW1hIG9yIGFuIGFic2VudCB0YXJnZXROYW1lc3BhY2UgcmVzcGVjdGl2ZWx5PC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJuYW1lc3BhY2VMaXN0Ij4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOnVuaW9uPgorICAgPHhzOnNpbXBsZVR5cGU+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2FueSIvPgorICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IiMjb3RoZXIiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpzaW1wbGVUeXBlPgorICAgPHhzOnNpbXBsZVR5cGU+CisgICAgPHhzOmxpc3Q+CisgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSJ4czphbnlVUkkiPgorICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgorICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjI2xvY2FsIi8+CisgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgPC94czp1bmlvbj4KKyAgICAgPC94czpzaW1wbGVUeXBlPgorICAgIDwveHM6bGlzdD4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKyAgPC94czp1bmlvbj4KKyA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9InhzOnRvcExldmVsQXR0cmlidXRlIiBpZD0iYXR0cmlidXRlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LWF0dHJpYnV0ZSIvPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czplbGVtZW50PgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwIiBhYnN0cmFjdD0idHJ1ZSI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KKyAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ4czpkZWZSZWYiLz4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWRBdHRyaWJ1dGVHcm91cCI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphdHRyaWJ1dGVHcm91cCI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICA8eHM6Z3JvdXAgcmVmPSJ4czphdHRyRGVjbHMiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZUdyb3VwUmVmIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmF0dHJpYnV0ZUdyb3VwIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6UU5hbWUiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icHJvaGliaXRlZCIvPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlR3JvdXAiIHR5cGU9InhzOm5hbWVkQXR0cmlidXRlR3JvdXAiIGlkPSJhdHRyaWJ1dGVHcm91cCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hdHRyaWJ1dGVHcm91cCIvPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czplbGVtZW50PgorCisgPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgaWQ9ImluY2x1ZGUiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW5jbHVkZSIvPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpjb21wbGV4VHlwZT4KKyAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFubm90YXRlZCI+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgorICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJyZWRlZmluZSIgaWQ9InJlZGVmaW5lIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXJlZGVmaW5lIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6b3BlbkF0dHJzIj4KKyAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIvPgorICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6cmVkZWZpbmFibGUiLz4KKyAgICAgPC94czpjaG9pY2U+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTG9jYXRpb24iIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJpbXBvcnQiIGlkPSJpbXBvcnQiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtaW1wb3J0Ii8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYUxvY2F0aW9uIiB0eXBlPSJ4czphbnlVUkkiLz4KKyAgICA8L3hzOmV4dGVuc2lvbj4KKyAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisgPC94czplbGVtZW50PgorCisgPHhzOmVsZW1lbnQgbmFtZT0ic2VsZWN0b3IiIGlkPSJzZWxlY3RvciI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1zZWxlY3RvciIvPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpjb21wbGV4VHlwZT4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCitpbiBzZWxlY3RvcnM8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwordXNlPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBmb2xsb3dpbmcgRUJORjoKKyAgICAgICAgICBTZWxlY3RvciAgICA6Oj0gICAgUGF0aCAoICd8JyBQYXRoICkqCisgICAgICAgICAgUGF0aCAgICA6Oj0gICAgKCcuLy8nKT8gU3RlcCAoICcvJyBTdGVwICkqCisgICAgICAgICAgU3RlcCAgICA6Oj0gICAgJy4nIHwgTmFtZVRlc3QKKyAgICAgICAgICBOYW1lVGVzdCAgICA6Oj0gICAgUU5hbWUgfCAnKicgfCBOQ05hbWUgJzonICcqJworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6OiBpcyBhbHNvIGFsbG93ZWQKKyAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgICA8IS0tIFRTSCBtb2RpZmllZCB0byBhbGxvdyB3aGl0ZSBzcGFjZSAtLT4KKyAgICAgICAgPHhzOnBhdHRlcm4KKyAgICAgICAgICAgIHZhbHVlPSIoXC5ccyovL1xzKik/KCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikoXHMqL1xzKigoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKSooXHMqXHxccyooXC5ccyovL1xzKik/KCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikoXHMqL1xzKigoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pKSopKiI+CisgICAgICAgIDwveHM6cGF0dGVybj4KKyAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgIDwveHM6ZXh0ZW5zaW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisgPC94czplbGVtZW50PgorCisgPHhzOmVsZW1lbnQgbmFtZT0iZmllbGQiIGlkPSJmaWVsZCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1maWVsZCIvPgorICA8L3hzOmFubm90YXRpb24+CisgIDx4czpjb21wbGV4VHlwZT4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhwYXRoIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj5BIHN1YnNldCBvZiBYUGF0aCBleHByZXNzaW9ucyBmb3IgdXNlCitpbiBmaWVsZHM8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPkEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYwordXNlPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSBmb2xsb3dpbmcgcGF0dGVybiBpcyBpbnRlbmRlZCB0byBhbGxvdyBYUGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMgcGVyIHRoZSBzYW1lIEVCTkYgYXMgZm9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZToKKyAgICAgICAgICBQYXRoICAgIDo6PSAgICAoJy4vLycpPyAoIFN0ZXAgJy8nICkqICggU3RlcCB8ICdAJyBOYW1lVGVzdCApCisgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgPCEtLSBUU0ggbW9kaWZpZWQgdG8gYWxsb3cgd2hpdGUgc3BhY2UgLS0+CisgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIoXC5ccyovL1xzKik/KCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pXHMqL1xzKikqKCgoKGNoaWxkXHMqOjpccyopPygoXGlcYyo6KT8oXGlcYyp8XCopKSl8XC4pfCgoYXR0cmlidXRlXHMqOjpccyp8QFxzKikoKFxpXGMqOik/KFxpXGMqfFwqKSkpKShccypcfFxzKihccypcLi8vXHMqKT8oKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLikvKSooKCgoY2hpbGRccyo6OlxzKik/KChcaVxjKjopPyhcaVxjKnxcKikpKXxcLil8KChhdHRyaWJ1dGVccyo6OlxzKnxAXHMqKSgoXGlcYyo6KT8oXGlcYyp8XCopKSkpKSoiPgorICAgICAgICA8L3hzOnBhdHRlcm4+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgPC94czphdHRyaWJ1dGU+CisgICA8L3hzOmV4dGVuc2lvbj4KKyAgPC94czpjb21wbGV4Q29udGVudD4KKyA8L3hzOmNvbXBsZXhUeXBlPgorIDwveHM6ZWxlbWVudD4KKworIDx4czpjb21wbGV4VHlwZSBuYW1lPSJrZXliYXNlIj4KKyAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzZWxlY3RvciIvPgorICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmZpZWxkIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgorICAgPC94czpleHRlbnNpb24+CisgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgPC94czpjb21wbGV4VHlwZT4KKworIDx4czpncm91cCBuYW1lPSJpZGVudGl0eUNvbnN0cmFpbnQiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPlRoZSB0aHJlZSBraW5kcyBvZiBpZGVudGl0eSBjb25zdHJhaW50cywgYWxsIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUgb2Ygb3IgZGVyaXZlZCBmcm9tICdrZXliYXNlJy4KKyAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6Y2hvaWNlPgorICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlxdWUiLz4KKyAgIDx4czplbGVtZW50IHJlZj0ieHM6a2V5Ii8+CisgICA8eHM6ZWxlbWVudCByZWY9InhzOmtleXJlZiIvPgorICA8L3hzOmNob2ljZT4KKyA8L3hzOmdyb3VwPgorCisgPHhzOmVsZW1lbnQgbmFtZT0idW5pcXVlIiB0eXBlPSJ4czprZXliYXNlIiBpZD0idW5pcXVlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbiBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyNlbGVtZW50LXVuaXF1ZSIvPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czplbGVtZW50PgorIDx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0ieHM6a2V5YmFzZSIgaWQ9ImtleSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1rZXkiLz4KKyAgPC94czphbm5vdGF0aW9uPgorIDwveHM6ZWxlbWVudD4KKyA8eHM6ZWxlbWVudCBuYW1lPSJrZXlyZWYiIGlkPSJrZXlyZWYiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQta2V5cmVmIi8+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOmNvbXBsZXhUeXBlPgorICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6a2V5YmFzZSI+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVmZXIiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIi8+CisgICAgPC94czpleHRlbnNpb24+CisgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorIDwveHM6ZWxlbWVudD4KKworIDx4czplbGVtZW50IG5hbWU9Im5vdGF0aW9uIiBpZD0ibm90YXRpb24iPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iLz4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6Y29tcGxleFR5cGU+CisgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIvPgorICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0ieHM6cHVibGljIi8+CisgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3lzdGVtIiB0eXBlPSJ4czphbnlVUkkiLz4KKyAgICA8L3hzOmV4dGVuc2lvbj4KKyAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisgPC94czplbGVtZW50PgorCisgPHhzOnNpbXBsZVR5cGUgbmFtZT0icHVibGljIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgcHVibGljIGlkZW50aWZpZXIsIHBlciBJU08gODg3OTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iLz4KKyA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJhcHBpbmZvIiBpZD0iYXBwaW5mbyI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hcHBpbmZvIi8+CisgICA8L3hzOmFubm90YXRpb24+CisgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgorICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJkb2N1bWVudGF0aW9uIiBpZD0iZG9jdW1lbnRhdGlvbiI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1kb2N1bWVudGF0aW9uIi8+CisgICA8L3hzOmFubm90YXRpb24+CisgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgorICAgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9InhzOmFueVVSSSIvPgorICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiBpZD0iYW5ub3RhdGlvbiI+CisgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgPHhzOmRvY3VtZW50YXRpb24gc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8jZWxlbWVudC1hbm5vdGF0aW9uIi8+CisgICA8L3hzOmFubm90YXRpb24+CisgICA8eHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm9wZW5BdHRycyI+CisgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YXBwaW5mbyIvPgorICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZG9jdW1lbnRhdGlvbiIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorICAgICA8L3hzOmV4dGVuc2lvbj4KKyAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgPC94czpjb21wbGV4VHlwZT4KKyA8L3hzOmVsZW1lbnQ+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+CisgICBub3RhdGlvbnMgZm9yIHVzZSB3aXRoaW4gWE1MIFNjaGVtYSBzY2hlbWFzPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czpub3RhdGlvbiBuYW1lPSJYTUxTY2hlbWFTdHJ1Y3R1cmVzIiBwdWJsaWM9InN0cnVjdHVyZXMiIHN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOC9YTUxTY2hlbWEueHNkIi8+CisgPHhzOm5vdGF0aW9uIG5hbWU9IlhNTCIgcHVibGljPSJSRUMteG1sLTE5OTgwMjEwIiBzeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCIvPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFueVR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgPHhzOmFubm90YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIE5vdCB0aGUgcmVhbCB1clR5cGUsIGJ1dCBhcyBjbG9zZSBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbgorICAgZ2V0IGluIHRoZSBYTUwgcmVwcmVzZW50YXRpb248L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOnNlcXVlbmNlPgorICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICA8L3hzOnNlcXVlbmNlPgorICA8eHM6YW55QXR0cmlidXRlIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIEZpcnN0IHRoZSBidWlsdC1pbiBwcmltaXRpdmUgZGF0YXR5cGVzLiAgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvcgorICAgICAgaW5mb3JtYXRpb24gb25seSwgdGhlIHJlYWwgYnVpbHQtaW4gZGVmaW5pdGlvbnMgYXJlIG1hZ2ljLgorICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKworICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgRm9yIGVhY2ggYnVpbHQtaW4gZGF0YXR5cGUgaW4gdGhpcyBzY2hlbWEgKGJvdGggcHJpbWl0aXZlIGFuZAorICAgICAgZGVyaXZlZCkgY2FuIGJlIHVuaXF1ZWx5IGFkZHJlc3NlZCB2aWEgYSBVUkkgY29uc3RydWN0ZWQKKyAgICAgIGFzIGZvbGxvd3M6CisgICAgICAgIDEpIHRoZSBiYXNlIFVSSSBpcyB0aGUgVVJJIG9mIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZQorICAgICAgICAyKSB0aGUgZnJhZ21lbnQgaWRlbnRpZmllciBpcyB0aGUgbmFtZSBvZiB0aGUgZGF0YXR5cGUKKworICAgICAgRm9yIGV4YW1wbGUsIHRvIGFkZHJlc3MgdGhlIGludCBkYXRhdHlwZSwgdGhlIFVSSSBpczoKKworICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnQKKworICAgICAgQWRkaXRpb25hbGx5LCBlYWNoIGZhY2V0IGRlZmluaXRpb24gZWxlbWVudCBjYW4gYmUgdW5pcXVlbHkKKyAgICAgIGFkZHJlc3NlZCB2aWEgYSBVUkkgY29uc3RydWN0ZWQgYXMgZm9sbG93czoKKyAgICAgICAgMSkgdGhlIGJhc2UgVVJJIGlzIHRoZSBVUkkgb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlCisgICAgICAgIDIpIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGlzIHRoZSBuYW1lIG9mIHRoZSBmYWNldAorCisgICAgICBGb3IgZXhhbXBsZSwgdG8gYWRkcmVzcyB0aGUgbWF4SW5jbHVzaXZlIGZhY2V0LCB0aGUgVVJJIGlzOgorCisgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI21heEluY2x1c2l2ZQorCisgICAgICBBZGRpdGlvbmFsbHksIGVhY2ggZmFjZXQgdXNhZ2UgaW4gYSBidWlsdC1pbiBkYXRhdHlwZSBkZWZpbml0aW9uCisgICAgICBjYW4gYmUgdW5pcXVlbHkgYWRkcmVzc2VkIHZpYSBhIFVSSSBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgorICAgICAgICAxKSB0aGUgYmFzZSBVUkkgaXMgdGhlIFVSSSBvZiB0aGUgWE1MIFNjaGVtYSBuYW1lc3BhY2UKKyAgICAgICAgMikgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGF0eXBlLCBmb2xsb3dlZAorICAgICAgICAgICBieSBhIHBlcmlvZCAoIi4iKSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgZmFjZXQKKworICAgICAgRm9yIGV4YW1wbGUsIHRvIGFkZHJlc3MgdGhlIHVzYWdlIG9mIHRoZSBtYXhJbmNsdXNpdmUgZmFjZXQgaW4KKyAgICAgIHRoZSBkZWZpbml0aW9uIG9mIGludCwgdGhlIFVSSSBpczoKKworICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnQubWF4SW5jbHVzaXZlCisKKyAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzdHJpbmciIGlkPSJzdHJpbmciPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3N0cmluZyIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0icHJlc2VydmUiIGlkPSJzdHJpbmcucHJlc2VydmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYm9vbGVhbiIgaWQ9ImJvb2xlYW4iPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIgdmFsdWU9ImZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYm9vbGVhbiIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgorICAgICAgICBpZD0iYm9vbGVhbi53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImZsb2F0IiBpZD0iZmxvYXQiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJ0b3RhbCIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiIHZhbHVlPSJmaW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZmxvYXQiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgorICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9ImZsb2F0LndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZG91YmxlIiBpZD0iZG91YmxlIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0idG90YWwiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RvdWJsZSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9ImRvdWJsZS53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRlY2ltYWwiIGlkPSJkZWNpbWFsIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InRvdGFsRGlnaXRzIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZnJhY3Rpb25EaWdpdHMiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InRvdGFsIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkZWNpbWFsIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgorICAgICAgICBpZD0iZGVjaW1hbC53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKworICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZHVyYXRpb24iIGlkPSJkdXJhdGlvbiI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkdXJhdGlvbiIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9ImR1cmF0aW9uLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpzaW1wbGVUeXBlPgorCisgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGF0ZVRpbWUiIGlkPSJkYXRlVGltZSI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgorICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCisgICAgICAgIGlkPSJkYXRlVGltZS53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9InRpbWUiIGlkPSJ0aW1lIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0aW1lIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgorICAgICAgICBpZD0idGltZS53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImRhdGUiIGlkPSJkYXRlIj4KKyAgIDx4czphbm5vdGF0aW9uPgorICAgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGUiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgorICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCisgICAgICAgIGlkPSJkYXRlLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ1llYXJNb250aCIgaWQ9ImdZZWFyTW9udGgiPgorICAgPHhzOmFubm90YXRpb24+CisgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZ1llYXJNb250aCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9ImdZZWFyTW9udGgud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnWWVhciIgaWQ9ImdZZWFyIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4SW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4RXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluSW5jbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluRXhjbHVzaXZlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9InBhcnRpYWwiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnWWVhciIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9ImdZZWFyLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnTW9udGhEYXkiIGlkPSJnTW9udGhEYXkiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heEV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkluY2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkV4Y2x1c2l2ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJwYXJ0aWFsIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aERheSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiIGZpeGVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGlkPSJnTW9udGhEYXkud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJnRGF5IiBpZD0iZ0RheSI+CisgICAgPHhzOmFubm90YXRpb24+CisgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dEYXkiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgorICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCisgICAgICAgICAgICAgICAgaWQ9ImdEYXkud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpzaW1wbGVUeXBlIG5hbWU9ImdNb250aCIgaWQ9ImdNb250aCI+CisgICAgPHhzOmFubm90YXRpb24+CisgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9InBhdHRlcm4iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhJbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhFeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5JbmNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5FeGNsdXNpdmUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0icGFydGlhbCIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBpZD0iZ01vbnRoLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImhleEJpbmFyeSIgaWQ9ImhleEJpbmFyeSI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYmluYXJ5Ii8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCisgICAgICAgIGlkPSJoZXhCaW5hcnkud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICA8L3hzOnNpbXBsZVR5cGU+CisKKyA8eHM6c2ltcGxlVHlwZSBuYW1lPSJiYXNlNjRCaW5hcnkiIGlkPSJiYXNlNjRCaW5hcnkiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYmFzZTY0QmluYXJ5Ii8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgZml4ZWQ9InRydWUiCisgICAgICAgIGlkPSJiYXNlNjRCaW5hcnkud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFueVVSSSIgaWQ9ImFueVVSSSI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYW55VVJJIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czphbnlTaW1wbGVUeXBlIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIgIGZpeGVkPSJ0cnVlIgorICAgICAgICBpZD0iYW55VVJJLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lIiBpZD0iUU5hbWUiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJwYXR0ZXJuIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0iZW51bWVyYXRpb24iLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJ3aGl0ZVNwYWNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ib3JkZXJlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iYm91bmRlZCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0iY2FyZGluYWxpdHkiCisgICAgICAgICAgICAgICAgdmFsdWU9ImNvdW50YWJseSBpbmZpbml0ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im51bWVyaWMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgPC94czphcHBpbmZvPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jUU5hbWUiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmFueVNpbXBsZVR5cGUiPgorICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiAgZml4ZWQ9InRydWUiCisgICAgICAgIGlkPSJRTmFtZS53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOT1RBVElPTiIgaWQ9Ik5PVEFUSU9OIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgPHhzOmFwcGluZm8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWluTGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0ibWF4TGVuZ3RoIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0icGF0dGVybiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05PVEFUSU9OIi8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgTk9UQVRJT04gY2Fubm90IGJlIHVzZWQgZGlyZWN0bHkgaW4gYSBzY2hlbWE7IHJhdGhlciBhIHR5cGUKKyAgICAgICAgbXVzdCBiZSBkZXJpdmVkIGZyb20gaXQgYnkgc3BlY2lmeWluZyBhdCBsZWFzdCBvbmUgZW51bWVyYXRpb24KKyAgICAgICAgZmFjZXQgd2hvc2UgdmFsdWUgaXMgdGhlIG5hbWUgb2YgYSBOT1RBVElPTiBkZWNsYXJlZCBpbiB0aGUKKyAgICAgICAgc2NoZW1hLgorICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55U2ltcGxlVHlwZSI+CisgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiICBmaXhlZD0idHJ1ZSIKKyAgICAgICAgaWQ9Ik5PVEFUSU9OLndoaXRlU3BhY2UiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmFubm90YXRpb24+CisgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICBOb3cgdGhlIGRlcml2ZWQgcHJpbWl0aXZlIHR5cGVzCisgICAgPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibm9ybWFsaXplZFN0cmluZyIgaWQ9Im5vcm1hbGl6ZWRTdHJpbmciPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9ybWFsaXplZFN0cmluZyIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KKyAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJyZXBsYWNlIgorICAgICAgICBpZD0ibm9ybWFsaXplZFN0cmluZy53aGl0ZVNwYWNlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9InRva2VuIiBpZD0idG9rZW4iPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdG9rZW4iLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vcm1hbGl6ZWRTdHJpbmciPgorICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIiBpZD0idG9rZW4ud2hpdGVTcGFjZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsYW5ndWFnZSIgaWQ9Imxhbmd1YWdlIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2xhbmd1YWdlIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICA8eHM6cGF0dGVybgorICAgICAgICB2YWx1ZT0iW2EtekEtWl17MSw4fSgtW2EtekEtWjAtOV17MSw4fSkqIgorICAgICAgICAgICAgICAgIGlkPSJsYW5ndWFnZS5wYXR0ZXJuIj4KKyAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTGFuZ3VhZ2VJRCI+CisgICAgICAgICAgICBwYXR0ZXJuIHNwZWNpZmllcyB0aGUgY29udGVudCBvZiBzZWN0aW9uIDIuMTIgb2YgWE1MIDEuMGUyCisgICAgICAgICAgICBhbmQgUkZDIDMwNjYgKFJldmlzZWQgdmVyc2lvbiBvZiBSRkMgMTc2NikuCisgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICA8L3hzOnBhdHRlcm4+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklEUkVGUyIgaWQ9IklEUkVGUyI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJsZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtaW5MZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJtYXhMZW5ndGgiLz4KKyAgICAgICAgPGhmcDpoYXNGYWNldCBuYW1lPSJlbnVtZXJhdGlvbiIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9IndoaXRlU3BhY2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJvcmRlcmVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJjYXJkaW5hbGl0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iY291bnRhYmx5IGluZmluaXRlIi8+CisgICAgICAgIDxoZnA6aGFzUHJvcGVydHkgbmFtZT0ibnVtZXJpYyIgdmFsdWU9ImZhbHNlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uPgorICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpJRFJFRiIvPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIxIiBpZD0iSURSRUZTLm1pbkxlbmd0aCIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJFTlRJVElFUyIgaWQ9IkVOVElUSUVTIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbj4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6RU5USVRZIi8+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjEiIGlkPSJFTlRJVElFUy5taW5MZW5ndGgiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk1UT0tFTiIgaWQ9Ik5NVE9LRU4iPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTk1UT0tFTiIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dG9rZW4iPgorICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IlxjKyIgaWQ9Ik5NVE9LRU4ucGF0dGVybiI+CisgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULU5tdG9rZW4iPgorICAgICAgICAgICAgcGF0dGVybiBtYXRjaGVzIHByb2R1Y3Rpb24gNyBmcm9tIHRoZSBYTUwgc3BlYworICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPC94czpwYXR0ZXJuPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJOTVRPS0VOUyIgaWQ9Ik5NVE9LRU5TIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czphcHBpbmZvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Imxlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1pbkxlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9Im1heExlbmd0aCIvPgorICAgICAgICA8aGZwOmhhc0ZhY2V0IG5hbWU9ImVudW1lcmF0aW9uIi8+CisgICAgICAgIDxoZnA6aGFzRmFjZXQgbmFtZT0id2hpdGVTcGFjZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9Im9yZGVyZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImJvdW5kZWQiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IgorICAgICAgICAgICAgICAgIHZhbHVlPSJjb3VudGFibHkgaW5maW5pdGUiLz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJudW1lcmljIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICAgIDwveHM6YXBwaW5mbz4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05NVE9LRU5TIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbj4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6Tk1UT0tFTiIvPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIxIiBpZD0iTk1UT0tFTlMubWluTGVuZ3RoIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05hbWUiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcaVxjKiIgaWQ9Ik5hbWUucGF0dGVybiI+CisgICAgICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTmFtZSI+CisgICAgICAgICAgICBwYXR0ZXJuIG1hdGNoZXMgcHJvZHVjdGlvbiA1IGZyb20gdGhlIFhNTCBzcGVjCisgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICA8L3hzOnBhdHRlcm4+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9Ik5DTmFtZSIgaWQ9Ik5DTmFtZSI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNOQ05hbWUiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5hbWUiPgorICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcaS1bOl1dW1xjLVs6XV0qIiBpZD0iTkNOYW1lLnBhdHRlcm4iPgorICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8jTlQtTkNOYW1lIj4KKyAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyBwcm9kdWN0aW9uIDQgZnJvbSB0aGUgTmFtZXNwYWNlcyBpbiBYTUwgc3BlYworICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPC94czphbm5vdGF0aW9uPgorICAgICAgPC94czpwYXR0ZXJuPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iSUQiIGlkPSJJRCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIi8+CisgICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklEUkVGIiBpZD0iSURSRUYiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5DTmFtZSIvPgorICAgPC94czpzaW1wbGVUeXBlPgorCisgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJFTlRJVFkiIGlkPSJFTlRJVFkiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRZIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOQ05hbWUiLz4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnRlZ2VyIiBpZD0iaW50ZWdlciI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNpbnRlZ2VyIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZWNpbWFsIj4KKyAgICAgIDx4czpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iMCIgZml4ZWQ9InRydWUiIGlkPSJpbnRlZ2VyLmZyYWN0aW9uRGlnaXRzIi8+CisgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1wtK10/WzAtOV0rIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlciI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25Qb3NpdGl2ZUludGVnZXIiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMCIgaWQ9Im5vblBvc2l0aXZlSW50ZWdlci5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiBpZD0ibmVnYXRpdmVJbnRlZ2VyIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25lZ2F0aXZlSW50ZWdlciIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIj4KKyAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9Ii0xIiBpZD0ibmVnYXRpdmVJbnRlZ2VyLm1heEluY2x1c2l2ZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJsb25nIiBpZD0ibG9uZyI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNsb25nIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii05MjIzMzcyMDM2ODU0Nzc1ODA4IiBpZD0ibG9uZy5taW5JbmNsdXNpdmUiLz4KKyAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjkyMjMzNzIwMzY4NTQ3NzU4MDciIGlkPSJsb25nLm1heEluY2x1c2l2ZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJpbnQiIGlkPSJpbnQiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jaW50Ii8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpsb25nIj4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0yMTQ3NDgzNjQ4IiBpZD0iaW50Lm1pbkluY2x1c2l2ZSIvPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMjE0NzQ4MzY0NyIgaWQ9ImludC5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2hvcnQiIGlkPSJzaG9ydCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNzaG9ydCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50Ij4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii0zMjc2OCIgaWQ9InNob3J0Lm1pbkluY2x1c2l2ZSIvPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMzI3NjciIGlkPSJzaG9ydC5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYnl0ZSIgaWQ9ImJ5dGUiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jYnl0ZSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2hvcnQiPgorICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iLTEyOCIgaWQ9ImJ5dGUubWluSW5jbHVzaXZlIi8+CisgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxMjciIGlkPSJieXRlLm1heEluY2x1c2l2ZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIGlkPSJub25OZWdhdGl2ZUludGVnZXIiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uTmVnYXRpdmVJbnRlZ2VyIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAiIGlkPSJub25OZWdhdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9InVuc2lnbmVkTG9uZyIgaWQ9InVuc2lnbmVkTG9uZyI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6YXBwaW5mbz4KKyAgICAgICAgPGhmcDpoYXNQcm9wZXJ0eSBuYW1lPSJib3VuZGVkIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8aGZwOmhhc1Byb3BlcnR5IG5hbWU9ImNhcmRpbmFsaXR5IiB2YWx1ZT0iZmluaXRlIi8+CisgICAgICA8L3hzOmFwcGluZm8+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+CisgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPSIxODQ0Njc0NDA3MzcwOTU1MTYxNSIKKyAgICAgICAgaWQ9InVuc2lnbmVkTG9uZy5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRJbnQiIGlkPSJ1bnNpZ25lZEludCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIj4KKyAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjQyOTQ5NjcyOTUiCisgICAgICAgIGlkPSJ1bnNpZ25lZEludC5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgaWQ9InVuc2lnbmVkU2hvcnQiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRTaG9ydCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iNjU1MzUiCisgICAgICAgIGlkPSJ1bnNpZ25lZFNob3J0Lm1heEluY2x1c2l2ZSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiIGlkPSJ1bnNpZ25lZEJ5dGUiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jdW5zaWduZWRCeXRlIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZFNob3J0Ij4KKyAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjI1NSIgaWQ9InVuc2lnbmVkQnl0ZS5tYXhJbmNsdXNpdmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiBpZD0icG9zaXRpdmVJbnRlZ2VyIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiIGlkPSJwb3NpdGl2ZUludGVnZXIubWluSW5jbHVzaXZlIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZGVyaXZhdGlvbkNvbnRyb2wiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgQSB1dGlsaXR5IHR5cGUsIG5vdCBmb3IgcHVibGljIHVzZTwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgPC94czphbm5vdGF0aW9uPgorICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN1YnN0aXR1dGlvbiIvPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbnNpb24iLz4KKyAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KKyAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgorICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmlvbiIvPgorICA8L3hzOnJlc3RyaWN0aW9uPgorIDwveHM6c2ltcGxlVHlwZT4KKworIDx4czpncm91cCBuYW1lPSJzaW1wbGVEZXJpdmF0aW9uIj4KKyAgPHhzOmNob2ljZT4KKyAgICA8eHM6ZWxlbWVudCByZWY9InhzOnJlc3RyaWN0aW9uIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpsaXN0Ii8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp1bmlvbiIvPgorICA8L3hzOmNob2ljZT4KKyA8L3hzOmdyb3VwPgorCisgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic2ltcGxlRGVyaXZhdGlvblNldCI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAjYWxsIG9yIChwb3NzaWJseSBlbXB0eSkgc3Vic2V0IG9mIHtyZXN0cmljdGlvbiwgdW5pb24sIGxpc3R9CisgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgIEEgdXRpbGl0eSB0eXBlLCBub3QgZm9yIHB1YmxpYyB1c2U8L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyAgPHhzOnVuaW9uPgorICAgPHhzOnNpbXBsZVR5cGU+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnRva2VuIj4KKyAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIjYWxsIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgIDwveHM6c2ltcGxlVHlwZT4KKyAgIDx4czpzaW1wbGVUeXBlPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkZXJpdmF0aW9uQ29udHJvbCI+CisgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGlzdCIvPgorICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuaW9uIi8+CisgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVzdHJpY3Rpb24iLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgPC94czpzaW1wbGVUeXBlPgorICA8L3hzOnVuaW9uPgorIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgorICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgICAgPHhzOmdyb3VwIHJlZj0ieHM6c2ltcGxlRGVyaXZhdGlvbiIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB0eXBlPSJ4czpzaW1wbGVEZXJpdmF0aW9uU2V0Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIj4KKyAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICBDYW4gYmUgcmVzdHJpY3RlZCB0byByZXF1aXJlZCBvciBmb3JiaWRkZW4KKyAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgPC94czpleHRlbnNpb24+CisgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9wTGV2ZWxTaW1wbGVUeXBlIj4KKyAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c2ltcGxlVHlwZSI+CisgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZURlcml2YXRpb24iLz4KKyAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIgorICAgICAgICAgICAgIHR5cGU9InhzOk5DTmFtZSI+CisgICAgICAgICAgPHhzOmFubm90YXRpb24+CisgICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgUmVxdWlyZWQgYXQgdGhlIHRvcCBsZXZlbAorICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsU2ltcGxlVHlwZSI+CisgICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNpbXBsZVR5cGUiPgorICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czphbm5vdGF0aW9uIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ4czpzaW1wbGVEZXJpdmF0aW9uIi8+CisgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJwcm9oaWJpdGVkIj4KKyAgICAgICAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICBGb3JiaWRkZW4gd2hlbiBuZXN0ZWQKKyAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICAgIDwveHM6YXR0cmlidXRlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpbmFsIiB1c2U9InByb2hpYml0ZWQiLz4KKyAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czp0b3BMZXZlbFNpbXBsZVR5cGUiIGlkPSJzaW1wbGVUeXBlIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtc2ltcGxlVHlwZSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgPC94czplbGVtZW50PgorCisgIDx4czpncm91cCBuYW1lPSJmYWNldHMiPgorICAgPHhzOmFubm90YXRpb24+CisgICAgPHhzOmRvY3VtZW50YXRpb24+CisgICAgICAgV2Ugc2hvdWxkIHVzZSBhIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgZmFjZXRzLCBidXQKKyAgICAgICB0aGF0J3MgcnVsZWQgb3V0IGJlY2F1c2UgaXQgd291bGQgYWxsb3cgdXNlcnMgdG8KKyAgICAgICBhZGQgdGhlaXIgb3duLCB3aGljaCB3ZSdyZSBub3QgcmVhZHkgZm9yIHlldC4KKyAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICA8L3hzOmFubm90YXRpb24+CisgICA8eHM6Y2hvaWNlPgorICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluRXhjbHVzaXZlIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptaW5JbmNsdXNpdmUiLz4KKyAgICA8eHM6ZWxlbWVudCByZWY9InhzOm1heEV4Y2x1c2l2ZSIvPgorICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWF4SW5jbHVzaXZlIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp0b3RhbERpZ2l0cyIvPgorICAgIDx4czplbGVtZW50IHJlZj0ieHM6ZnJhY3Rpb25EaWdpdHMiLz4KKyAgICA8eHM6ZWxlbWVudCByZWY9InhzOmxlbmd0aCIvPgorICAgIDx4czplbGVtZW50IHJlZj0ieHM6bWluTGVuZ3RoIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czptYXhMZW5ndGgiLz4KKyAgICA8eHM6ZWxlbWVudCByZWY9InhzOmVudW1lcmF0aW9uIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czp3aGl0ZVNwYWNlIi8+CisgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpwYXR0ZXJuIi8+CisgICA8L3hzOmNob2ljZT4KKyAgPC94czpncm91cD4KKworICA8eHM6Z3JvdXAgbmFtZT0ic2ltcGxlUmVzdHJpY3Rpb25Nb2RlbCI+CisgICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2ltcGxlVHlwZSIgdHlwZT0ieHM6bG9jYWxTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8eHM6Z3JvdXAgcmVmPSJ4czpmYWNldHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgIDwveHM6c2VxdWVuY2U+CisgIDwveHM6Z3JvdXA+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0icmVzdHJpY3Rpb24iIGlkPSJyZXN0cmljdGlvbiI+CisgICA8eHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcmVzdHJpY3Rpb24iPgorICAgICAgICAgIGJhc2UgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQorICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAorICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgICAgIDx4czpncm91cCByZWY9InhzOnNpbXBsZVJlc3RyaWN0aW9uTW9kZWwiLz4KKyAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHM6UU5hbWUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgPC94czpleHRlbnNpb24+CisgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJsaXN0IiBpZD0ibGlzdCI+CisgICA8eHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGlzdCI+CisgICAgICAgICAgaXRlbVR5cGUgYXR0cmlidXRlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseQorICAgICAgICAgIGV4Y2x1c2l2ZSwgYnV0IG9uZSBvciBvdGhlciBpcyByZXF1aXJlZAorICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzOmFubm90YXRpb24+CisgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGVUeXBlIiB0eXBlPSJ4czpsb2NhbFNpbXBsZVR5cGUiCisgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Iml0ZW1UeXBlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICA8L3hzOmV4dGVuc2lvbj4KKyAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9InVuaW9uIiBpZD0idW5pb24iPgorICAgPHhzOmNvbXBsZXhUeXBlPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LXVuaW9uIj4KKyAgICAgICAgICBtZW1iZXJUeXBlcyBhdHRyaWJ1dGUgbXVzdCBiZSBub24tZW1wdHkgb3IgdGhlcmUgbXVzdCBiZQorICAgICAgICAgIGF0IGxlYXN0IG9uZSBzaW1wbGVUeXBlIGNoaWxkCisgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbm5vdGF0ZWQiPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZVR5cGUiIHR5cGU9InhzOmxvY2FsU2ltcGxlVHlwZSIKKyAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lbWJlclR5cGVzIiB1c2U9Im9wdGlvbmFsIj4KKyAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6UU5hbWUiLz4KKyAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94czpleHRlbnNpb24+CisgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXQiPgorICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW5ub3RhdGVkIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZpeGVkIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIgorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIi8+CisgICAgICA8L3hzOmV4dGVuc2lvbj4KKyAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICA8L3hzOmNvbXBsZXhUeXBlPgorCisgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vRml4ZWRGYWNldCI+CisgIDx4czpjb21wbGV4Q29udGVudD4KKyAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpmYWNldCI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdXNlPSJwcm9oaWJpdGVkIi8+CisgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOmNvbXBsZXhDb250ZW50PgorIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibWluRXhjbHVzaXZlIiBpZD0ibWluRXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1pbkV4Y2x1c2l2ZSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgPC94czplbGVtZW50PgorICA8eHM6ZWxlbWVudCBuYW1lPSJtaW5JbmNsdXNpdmUiIGlkPSJtaW5JbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWluSW5jbHVzaXZlIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4RXhjbHVzaXZlIiBpZD0ibWF4RXhjbHVzaXZlIiB0eXBlPSJ4czpmYWNldCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heEV4Y2x1c2l2ZSIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgPC94czplbGVtZW50PgorICA8eHM6ZWxlbWVudCBuYW1lPSJtYXhJbmNsdXNpdmUiIGlkPSJtYXhJbmNsdXNpdmUiIHR5cGU9InhzOmZhY2V0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbWF4SW5jbHVzaXZlIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im51bUZhY2V0Ij4KKyAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZmFjZXQiPgorICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KKyAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJ0b3RhbERpZ2l0cyIgaWQ9InRvdGFsRGlnaXRzIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtdG90YWxEaWdpdHMiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6bnVtRmFjZXQiPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpwb3NpdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiLz4KKyAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisgIDx4czplbGVtZW50IG5hbWU9ImZyYWN0aW9uRGlnaXRzIiBpZD0iZnJhY3Rpb25EaWdpdHMiIHR5cGU9InhzOm51bUZhY2V0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtZnJhY3Rpb25EaWdpdHMiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIGlkPSJsZW5ndGgiIHR5cGU9InhzOm51bUZhY2V0Ij4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtbGVuZ3RoIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICA8L3hzOmVsZW1lbnQ+CisgIDx4czplbGVtZW50IG5hbWU9Im1pbkxlbmd0aCIgaWQ9Im1pbkxlbmd0aCIgdHlwZT0ieHM6bnVtRmFjZXQiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC1taW5MZW5ndGgiLz4KKyAgICA8L3hzOmFubm90YXRpb24+CisgIDwveHM6ZWxlbWVudD4KKyAgPHhzOmVsZW1lbnQgbmFtZT0ibWF4TGVuZ3RoIiBpZD0ibWF4TGVuZ3RoIiB0eXBlPSJ4czpudW1GYWNldCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LW1heExlbmd0aCIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9ImVudW1lcmF0aW9uIiBpZD0iZW51bWVyYXRpb24iIHR5cGU9InhzOm5vRml4ZWRGYWNldCI+CisgICAgPHhzOmFubm90YXRpb24+CisgICAgICA8eHM6ZG9jdW1lbnRhdGlvbgorICAgICAgICBzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNlbGVtZW50LWVudW1lcmF0aW9uIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0id2hpdGVTcGFjZSIgaWQ9IndoaXRlU3BhY2UiPgorICAgIDx4czphbm5vdGF0aW9uPgorICAgICAgPHhzOmRvY3VtZW50YXRpb24KKyAgICAgICAgc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZWxlbWVudC13aGl0ZVNwYWNlIi8+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmZhY2V0Ij4KKyAgICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhzOmFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJlc2VydmUiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2UiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbGxhcHNlIi8+CisgICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgICAgPC94czphdHRyaWJ1dGU+CisgICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9InBhdHRlcm4iIGlkPSJwYXR0ZXJuIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uCisgICAgICAgIHNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2VsZW1lbnQtcGF0dGVybiIvPgorICAgIDwveHM6YW5ub3RhdGlvbj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+CisgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpub0ZpeGVkRmFjZXQiPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieHM6YW5ub3RhdGlvbiIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKyAgICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpjb21wbGV4Q29udGVudD4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3hzZHNjaGVtYS9zY2hlbWEvdzNjLXNjaGVtYS1saWNlbnNlLmh0bWwgYi92MS9zcmMveHNkc2NoZW1hL3NjaGVtYS93M2Mtc2NoZW1hLWxpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU4YmNiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3hzZHNjaGVtYS9zY2hlbWEvdzNjLXNjaGVtYS1saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+CisgIDx0aXRsZT5XM0MgU29mdHdhcmUgTGljZW5zZTwvdGl0bGU+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9TdHlsZVNoZWV0cy9iYXNlLmNzcyIgLz4KKyAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyA8IS0tCitoMyN2ZXJzaW9uIHsgbWFyZ2luLXRvcDogLTAuOGVtO30KKy0tPgorICA8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KKworPGgxPlczQyBYTUwgU2NoZW1hLCBTY2hlbWEgZm9yIFNjaGVtYXM6IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCI+aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkPC9hPjwvaDE+Cis8ZGw+CisgICAgPGRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvaXByLW5vdGljZSI+Q29weXJpZ2h0PC9hPgorICAgICAgqSAyMDAxLTIwMDMgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvIj5Xb3JsZCBXaWRlIFdlYgorICAgICAgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cworICAgICAgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmVyY2ltLm9yZy8iPkV1cm9wZWFuCisgICAgICBSZXNlYXJjaCBDb25zb3J0aXVtIGZvciBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3M8L2E+LCA8YQorICAgICAgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbyBVbml2ZXJzaXR5PC9hPikuIEFsbCBSaWdodHMKKyAgICAgIFJlc2VydmVkLiBUaGlzIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIDxhCisgICAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxIj5XM0M8c3VwPq48L3N1cD4KKyAgICAgIFNvZnR3YXJlIExpY2Vuc2U8L2E+IFsxXSBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgICAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgIDxwPlsxXSA8YQorICAgICAgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMS5odG1sIj5odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxPC9hPjwvcD4KKyAgICA8L2RkPgorPC9kbD4KKworCis8aHIvPgorCis8aDE+VzNDPHN1cD6uPC9zdXA+IFNPRlRXQVJFIE5PVElDRSBBTkQgTElDRU5TRTwvaDE+CisKKzxoMyBpZD0idmVyc2lvbiI+PGEKK2hyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzE8L2E+PC9oMz4KKworPHA+VGhpcyB3b3JrIChhbmQgaW5jbHVkZWQgc29mdHdhcmUsIGRvY3VtZW50YXRpb24gc3VjaCBhcyBSRUFETUVzLCBvciBvdGhlcgorcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2xpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkKK2FncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZwordGVybXMgYW5kIGNvbmRpdGlvbnMuPC9wPgorCis8cD5QZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwO2ZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbgorQUxMIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nCittb2RpZmljYXRpb25zOjwvcD4KKzxvbD4KKyAgPGxpPlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUKKyAgICByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgd29yay48L2xpPgorICA8bGk+QW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zCisgICAgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIHRoZSA8YQorICAgIGhyZWY9ImNvcHlyaWdodC1zb2Z0d2FyZS1zaG9ydC1ub3RpY2UtMjAwMjEyMzEuaHRtbCI+VzNDIFNvZnR3YXJlIFNob3J0CisgICAgTm90aWNlPC9hPiBzaG91bGQgYmUgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKQorICAgIHdpdGhpbiB0aGUgYm9keSBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuPC9saT4KKyAgPGxpPk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlCisgICAgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbQorICAgIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Cis8L29sPgorCis8cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORCBDT1BZUklHSFQgSE9MREVSUworTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVAorTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKK1BVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFCitBTlkgVEhJUkQgUEFSVFkgUEFURU5UUywgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMuPC9wPgorCis8cD5DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgQU5ZIFVTRSBPRiBUSEUgU09GVFdBUkUgT1IKK0RPQ1VNRU5UQVRJT04uPC9wPgorCis8cD5UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4KK2FkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCitwcmlvciBwZXJtaXNzaW9uLiBUaXRsZSB0byBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGFzc29jaWF0ZWQKK2RvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuPC9wPgorCis8cD48L3A+CisKKzxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KKworPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbiBEZWNlbWJlciAzMQorMjAwMi4gVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlIGNvcHlyaWdodCBvd25lcnNoaXAgbm90aWNlIHN1Y2ggdGhhdCB0aGlzCitsaWNlbnNlIGNhbiBiZSB1c2VkIHdpdGggbWF0ZXJpYWxzIG90aGVyIHRoYW4gdGhvc2Ugb3duZWQgYnkgdGhlIFczQywKK3JlZmxlY3RzIHRoYXQgRVJDSU0gaXMgbm93IGEgaG9zdCBvZiB0aGUgVzNDLCBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIHRoaXMKK3NwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UsIGFuZCByZW1vdmVzIHRoZSBhbWJpZ3VvdXMgZ3JhbnQgb2YKKyJ1c2UiLiBPdGhlcndpc2UsIHRoaXMgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgPGEKK2hyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwIj5wcmV2aW91cwordmVyc2lvbjwvYT4gYW5kIGlzIHdyaXR0ZW4gc28gYXMgdG8gcHJlc2VydmUgdGhlIDxhCitocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS9saWNlbnNlLWxpc3QuaHRtbCNHUExDb21wYXRpYmxlTGljZW5zZXMiPkZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5PC9hPiBhbmQgPGEKK2hyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvVzNDLnBocCI+T1NJJ3MgY2VydGlmaWNhdGlvbjwvYT4KK3VuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2RvY3MvZGVmaW5pdGlvbi5waHAiPk9wZW4gU291cmNlCitEZWZpbml0aW9uPC9hPi4gUGxlYXNlIHNlZSBvdXIgPGEKK2hyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUSI+Q29weXJpZ2h0IEZBUTwvYT4gZm9yCitjb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMKK3Rlcm1zIGFuZCBjb25kaXRpb25zIGZvciBwYWNrYWdlcyBsaWtlIGxpYnd3dywgQW1heWEsIGFuZCBKaWdzYXcuIE90aGVyCitxdWVzdGlvbnMgYWJvdXQgdGhpcyBub3RpY2UgY2FuIGJlIGRpcmVjdGVkIHRvIDxhCitocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+LjxiciAvPgorJm5ic3A7PC9wPgorPGFkZHJlc3M+CisgIEpvc2VwaCBSZWFnbGUgJmx0OzxhCisgIGhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZyZndDs8L2E+Cis8L2FkZHJlc3M+CisKKzxwPkxhc3QgcmV2aXNlZCBieSBSZWFnbGUgJERhdGUkPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdjEvc3JjL3ppcGNvbXBhcmUvemlwY29tcGFyZS9aaXBDb21wYXJlLmphdmEgYi92MS9zcmMvemlwY29tcGFyZS96aXBjb21wYXJlL1ppcENvbXBhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y5MDJiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvc3JjL3ppcGNvbXBhcmUvemlwY29tcGFyZS9aaXBDb21wYXJlLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHppcGNvbXBhcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBaaXBDb21wYXJlCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiB6aXBjb21wYXJlIFtmaWxlMV0gW2ZpbGUyXSIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBaaXBGaWxlIGZpbGUxOworICAgICAgICB0cnkgeyBmaWxlMSA9IG5ldyBaaXBGaWxlKGFyZ3NbMF0pOyB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IG9wZW4gemlwIGZpbGUgIiArIGFyZ3NbMF0gKyAiOiAiICsgZSk7IFN5c3RlbS5leGl0KDEpOyByZXR1cm47IH0KKworICAgICAgICBaaXBGaWxlIGZpbGUyOworICAgICAgICB0cnkgeyBmaWxlMiA9IG5ldyBaaXBGaWxlKGFyZ3NbMV0pOyB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IG9wZW4gemlwIGZpbGUgIiArIGFyZ3NbMF0gKyAiOiAiICsgZSk7IFN5c3RlbS5leGl0KDEpOyByZXR1cm47IH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmluZyAiICsgYXJnc1swXSArICIgd2l0aCAiICsgYXJnc1sxXSArICI6Iik7CisKKyAgICAgICAgU2V0IHNldDEgPSBuZXcgTGlua2VkSGFzaFNldCgpOworICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBmaWxlMS5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKKyAgICAgICAgICAgIHNldDEuYWRkKCgoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCkpOworCisgICAgICAgIFNldCBzZXQyID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZTIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApCisgICAgICAgICAgICBzZXQyLmFkZCgoKFppcEVudHJ5KWUubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpbnQgZXJyY291bnQgPSAwOworICAgICAgICBpbnQgZmlsZWNvdW50ID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0MS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIXNldDIuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiIG5vdCBmb3VuZCBpbiAiICsgYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgZXJyY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldDIucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghc3RyZWFtc0VxdWFsKGZpbGUxLmdldElucHV0U3RyZWFtKGZpbGUxLmdldEVudHJ5KG5hbWUpKSwgZmlsZTIuZ2V0SW5wdXRTdHJlYW0oZmlsZTIuZ2V0RW50cnkobmFtZSkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIiBkb2VzIG5vdCBtYXRjaCIpOworICAgICAgICAgICAgICAgICAgICBlcnJjb3VudCArPSAxOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOiBJTyBFcnJvciAiICsgZSk7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBlcnJjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZWNvdW50ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2V0Mi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArICIgbm90IGZvdW5kIGluICIgKyBhcmdzWzBdKTsKKyAgICAgICAgICAgIGVycmNvdW50ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGVjb3VudCArICIgZW50cmllcyBtYXRjaGVkIik7CisgICAgICAgIGlmIChlcnJjb3VudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnJjb3VudCArICIgZW50cmllcyBkaWQgbm90IG1hdGNoIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBzdHJlYW1zRXF1YWwoSW5wdXRTdHJlYW0gc3RyZWFtMSwgSW5wdXRTdHJlYW0gc3RyZWFtMikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBieXRlW10gYnVmMSA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICBib29sZWFuIGRvbmUxID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZG9uZTIgPSBmYWxzZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICB3aGlsZSAoIWRvbmUxKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb2ZmMSA9IDA7CisgICAgICAgICAgICBpbnQgb2ZmMiA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChvZmYxIDwgYnVmMS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gc3RyZWFtMS5yZWFkKGJ1ZjEsIG9mZjEsIGJ1ZjEubGVuZ3RoIC0gb2ZmMSk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvbmUxID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZjEgKz0gY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAob2ZmMiA8IGJ1ZjIubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHN0cmVhbTIucmVhZChidWYyLCBvZmYyLCBidWYyLmxlbmd0aCAtIG9mZjIpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb25lMiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmYyICs9IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZjEgIT0gb2ZmMiB8fCBkb25lMSAhPSBkb25lMikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9mZjE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmMVtpXSAhPSBidWYyW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7IHN0cmVhbTEuY2xvc2UoKTsgc3RyZWFtMi5jbG9zZSgpOyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9lbnVtdGVzdC9yZXBvcnQxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvZW51bXRlc3QvcmVwb3J0MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2YzFiOAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvZW51bXRlc3QvcmVwb3J0MS54bWwKQEAgLTAsMCArMSwxOSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8c3RhdHVzcmVwb3J0IHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiPgorICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9ImFsbCI+YWxsPC9zdGF0dXM+CisgIDxzdGF0dXMgbmFtZT0ic2Vjb25kIiB0YXJnZXQ9ImFsbCI+ZmV3PC9zdGF0dXM+CisgIDxzdGF0dXMgbmFtZT0idGhpcmQiIHRhcmdldD0ibm9uZSI+bW9zdDwvc3RhdHVzPgorICA8c3RhdHVzIG5hbWU9ImZpcnN0IiB0YXJnZXQ9Im5vbmUiPm5vbmU8L3N0YXR1cz4KKzwvc3RhdHVzcmVwb3J0PgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9uYW1ld29ybGQvd29ybGQxLnhtbCBiL3YxL3Rlc3QvY2FzZXMvbmFtZXdvcmxkL3dvcmxkMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxYzUwNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvbmFtZXdvcmxkL3dvcmxkMS54bWwKQEAgLTAsMCArMSw0NyBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8bnc6bmFtZXdvcmxkIHhtbG5zOm53PSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgorICAgICAgICAgICAgICB4bWxuczpmb289Imh0dHA6Ly9mb28uY29tLyIKKyAgICAgICAgICAgICAgeG1sbnM6YmFyPSJodHRwOi8vYmFyLmNvbS8iPgorCisgIDxudzppc2xhbmQgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbS8iPgorICAgIDxudzpsb2NhdGlvbiBuYW1lPSJmb29jaXR5Ij4KKyAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJjaXR5Ii8+CisgICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vdG93biIvPgorICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnZpbGxhZ2UiLz4KKyAgICA8L253OmxvY2F0aW9uPgorICAgIDxudzpsb2NhdGlvbiBuYW1lPSJmb290b3duIj4KKyAgICAgIDxudzpyZWZlcmVuY2UgdG89ImJhcjpiYXJ0b3duIi8+CisgICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vdmlsbGFnZSIvPgorICAgIDwvbnc6bG9jYXRpb24+CisgICAgPG53OmxvY2F0aW9uIG5hbWU9ImZvb3ZpbGxhZ2UiPgorICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnZpbGxhZ2UiLz4KKyAgICA8L253OmxvY2F0aW9uPgorICA8L253OmlzbGFuZD4KKworICA8bnc6aXNsYW5kIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Jhci5jb20vIj4KKyAgICA8bnc6bG9jYXRpb24gbmFtZT0iYmFyY2l0eSI+CisgICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vY2l0eSIvPgorICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnRvd24iLz4KKyAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb292aWxsYWdlIi8+CisgICAgPC9udzpsb2NhdGlvbj4KKyAgICA8bnc6bG9jYXRpb24gbmFtZT0iYmFydG93biI+CisgICAgICA8bnc6cmVmZXJlbmNlIHRvPSJmb286Zm9vdG93biIvPgorICAgICAgPG53OnJlZmVyZW5jZSB0bz0iYmFyOmJhcnZpbGxhZ2UiLz4KKyAgICA8L253OmxvY2F0aW9uPgorICAgIDxudzpsb2NhdGlvbiBuYW1lPSJiYXJ2aWxsYWdlIj4KKyAgICAgIDxudzpyZWZlcmVuY2UgdG89ImZvbzpmb292aWxsYWdlIi8+CisgICAgPC9udzpsb2NhdGlvbj4KKyAgPC9udzppc2xhbmQ+Cis8L253Om5hbWV3b3JsZD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtZHNhLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1kc2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDk1NGUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUtZHNhLnhtbApAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIHFVQURETUhaa3llYnZSZExzKzZEdjdSdmdNTFJsVWFEQjRROXluOVhvSkE3OWEyODgyZmZUZz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgMmlZM3cwNjJzREIzL0RJbExXT2VHOSs0VXBtRFowZHlxUms5ZExsTlE2cWFYSTd0T3JqZElobTZuL2VPdzQ1QQorICAgICAgICAgIFF0dVlTcDZzcEN0OWNRY05CQWoyMkt2eWd2ZkpJSVhYOXNTUXJ1Z2ZHcWlmZVN2WTNWWDVTZDFqK3owTVNaL24KKyAgICAgICAgICA1ak50ODh1aDJDMTFTQXFYNm5yWFRZLzFSd2tvV1JOMjNTWWhPbGFHMGhVPQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIDlCNXlwTFk5cE1PbXR4Q2VUREhnd2RORmVHcz0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBNdUdBbHFlQjFheCt2eU8yK09zdWJqaGw3cEh4THU0N1JJSCsvTTUyRGpFU0E5S01Tcnd6c1l4OHlOUjJXb29CCisgICAgICAgICAgeXJFMHQ2ZnUwVm5jSzdVSzhvbE80dDd3cHYyejRBRlFQUlZDS0Z3bzBxZ241YUtJa0lDR01sclJ5ODFhdmIyNworICAgICAgICAgIHdHY1dvdGh4M2lQUE10Rlh0b0RxSzBKSXRhSTlSOHpjMW1zRmhNMUdLTVk9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgY3RBOFlHeHJ0bmdnL3pLVnZxRU9lZm53bVZpRnp0Y25QQllQbEpzdmg2eUtJNGlEbTY4Zm5wNE1pM1JySjZiWgorICAgICAgICAgIEF5Z0ZyVUlRTHhMalYrT0p0Z0pBRXRvMHhBcytNZWh1cTFEa1NGRXBQM29EekNUT3NyT2lTMUR3UWU0b0liN3oKKyAgICAgICAgICBWay85bDdhUHRKTUhXMExWbE1kd1pORk5OSm9xTWNUMlpmQ1ByZnZZdlEwPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlTdWJqZWN0TmFtZT4KKyAgICAgICAgQ049TWVybGluIEh1Z2hlcyxPPUJhbHRpbW9yZSBUZWNobm9sb2dpZXNcLCBMdGQuLFNUPUR1YmxpbixDPUlFCisgICAgICA8L1g1MDlTdWJqZWN0TmFtZT4KKyAgICAgIDxYNTA5SXNzdWVyU2VyaWFsPgorICAgICAgICA8WDUwOUlzc3Vlck5hbWU+CisgICAgICAgICAgQ049VGVzdCBEU0EgQ0EsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQorICAgICAgICA8L1g1MDlJc3N1ZXJOYW1lPgorICAgICAgICA8WDUwOVNlcmlhbE51bWJlcj45NzA4NDk5MzY8L1g1MDlTZXJpYWxOdW1iZXI+CisgICAgICA8L1g1MDlJc3N1ZXJTZXJpYWw+CisgICAgICA8WDUwOUNlcnRpZmljYXRlPgorICAgICAgICBNSUlETnpDQ0F2V2dBd0lCQWdJRU9kMytrREFKQmdjcWhrak9PQVFETUZzeEN6QUpCZ05WQkFZVEFrbEZNUTh3CisgICAgICAgIERRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5WlNCVVpXTm9ibTlzYjJkcFpYTXMKKyAgICAgICAgSUV4MFpDNHhGREFTQmdOVkJBTVRDMVJsYzNRZ1JGTkJJRU5CTUI0WERUQXdNVEF3TmpFMk16SXhOVm9YRFRBeAorICAgICAgICBNVEF3TmpFMk16SXhORm93WFRFTE1Ba0dBMVVFQmhNQ1NVVXhEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWxNQ01HCisgICAgICAgIEExVUVDaE1jUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbGN5d2dUSFJrTGpFV01CUUdBMVVFQXhNTlRXVnkKKyAgICAgICAgYkdsdUlFaDFaMmhsY3pDQ0FiWXdnZ0VyQmdjcWhrak9PQVFCTUlJQkhnS0JnUURhSmpmRFRyYXdNSGY4TWlVdAorICAgICAgICBZNTRiMzdoU21ZTm5SM0twR1QxMHVVMURxcHBjanUwNnVOMGlHYnFmOTQ3RGprQkMyNWhLbnF5a0szMXhCdzBFCisgICAgICAgIENQYllxL0tDOThrZ2hkZjJ4SkN1NkI4YXFKOTVLOWpkVmZsSjNXUDdQUXhKbitmbU0yM3p5NkhZTFhWSUNwZnEKKyAgICAgICAgZXRkTmovVkhDU2haRTNiZEppRTZWb2JTRlFJVkFQUWVjcVMyUGFURHByY1Fua3d4NE1IVFJYaHJBb0dBTXVHQQorICAgICAgICBscWVCMWF4K3Z5TzIrT3N1YmpobDdwSHhMdTQ3UklIKy9NNTJEakVTQTlLTVNyd3pzWXg4eU5SMldvb0J5ckUwCisgICAgICAgIHQ2ZnUwVm5jSzdVSzhvbE80dDd3cHYyejRBRlFQUlZDS0Z3bzBxZ241YUtJa0lDR01sclJ5ODFhdmIyN3dHY1cKKyAgICAgICAgb3RoeDNpUFBNdEZYdG9EcUswSkl0YUk5Ujh6YzFtc0ZoTTFHS01ZRGdZUUFBb0dBY3RBOFlHeHJ0bmdnL3pLVgorICAgICAgICB2cUVPZWZud21WaUZ6dGNuUEJZUGxKc3ZoNnlLSTRpRG02OGZucDRNaTNScko2YlpBeWdGclVJUUx4TGpWK09KCisgICAgICAgIHRnSkFFdG8weEFzK01laHVxMURrU0ZFcFAzb0R6Q1RPc3JPaVMxRHdRZTRvSWI3elZrLzlsN2FQdEpNSFcwTFYKKyAgICAgICAgbE1kd1pORk5OSm9xTWNUMlpmQ1ByZnZZdlEyalJ6QkZNQjRHQTFVZEVRUVhNQldCRTIxbGNteHBia0JpWVd4MAorICAgICAgICBhVzF2Y21VdWFXVXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSXdRTU1BcUFDRUpaUUcwS3dSYlBNQWtHCisgICAgICAgIEJ5cUdTTTQ0QkFNRE1RQXdMZ0lWQUs0c2tXRUZZZ3JnZ2FKQTh2WUF3U2pnMTIrS0FoVUF3SFRvN3dkNHRFTncKKyAgICAgICAgOUxBS1BrbFEvNzRmSDE4PQorICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+CisgICAgPC9YNTA5RGF0YT4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLXJzYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2OGQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS1yc2EueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+CisgICAganVTNVJoSjg4NHFvRlI4ZmxWWGQvcmJyU0RWR240MENhcGdCN3FlUWlUK3JyME5la0VRNkJIaFVBOGRUMytCQworICAgIFRCVVFJMGRCamxtbDlsd3pFTlh2UzgzelJFQ2p6WGJNUlRVdFZaaVBaRzJwcUtQbkwyWVUzQTk2NDVVQ2pUWFUKKyAgICAramdGdW12N2s3OGhpZUFHRHpOY2krUFE5S1JtbS8vaWNUN0phWXp0Z3Q0PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8S2V5VmFsdWU+CisgICAgICA8UlNBS2V5VmFsdWU+CisgICAgICAgIDxNb2R1bHVzPgorICAgICAgICAgIHVDaXVrcGdPYU9tcnExZlBVVEgzQ0FYeHVGbVBqc21TNGpuVEt4cnYwdzFKS2NYdEoyTTNha2FWMWQva2FydkoKKyAgICAgICAgICBsbWVhbzIwak55OXIrL3ZLd2liak03N0YrM2JJa2VNRUdtQUlVbkZjaUprUitpaE83YjRjVHVZbkVpOHhIdHU0CisgICAgICAgICAgaU1uNkdPREJvRXpxRlFZZGQ4cDR2clpCc3ZzNDRuVHJTOHF5eWhiYTY0OD0KKyAgICAgICAgPC9Nb2R1bHVzPgorICAgICAgICA8RXhwb25lbnQ+CisgICAgICAgICAgQVFBQgorICAgICAgICA8L0V4cG9uZW50PgorICAgICAgPC9SU0FLZXlWYWx1ZT4KKyAgICA8L0tleVZhbHVlPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5U3ViamVjdE5hbWU+CisgICAgICAgIENOPU1lcmxpbiBIdWdoZXMsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQorICAgICAgPC9YNTA5U3ViamVjdE5hbWU+CisgICAgICA8WDUwOUlzc3VlclNlcmlhbD4KKyAgICAgICAgPFg1MDlJc3N1ZXJOYW1lPgorICAgICAgICAgIENOPVRlc3QgUlNBIENBLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+OTcwODQ5OTI4PC9YNTA5U2VyaWFsTnVtYmVyPgorICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgorICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgTUlJQ2VEQ0NBZUdnQXdJQkFnSUVPZDMraURBTkJna3Foa2lHOXcwQkFRUUZBREJiTVFzd0NRWURWUVFHRXdKSgorICAgICAgICBSVEVQTUEwR0ExVUVDQk1HUkhWaWJHbHVNU1V3SXdZRFZRUUtFeHhDWVd4MGFXMXZjbVVnVkdWamFHNXZiRzluCisgICAgICAgIGFXVnpMQ0JNZEdRdU1SUXdFZ1lEVlFRREV3dFVaWE4wSUZKVFFTQkRRVEFlRncwd01ERXdNRFl4TmpNeU1EZGEKKyAgICAgICAgRncwd01URXdNRFl4TmpNeU1EUmFNRjB4Q3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eAorICAgICAgICBKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNc0lFeDBaQzR4RmpBVUJnTlZCQU1UCisgICAgICAgIERVMWxjbXhwYmlCSWRXZG9aWE13Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUxnb3JwS1kKKyAgICAgICAgRG1qcHE2dFh6MUV4OXdnRjhiaFpqNDdKa3VJNTB5c2E3OU1OU1NuRjdTZGpOMnBHbGRYZjVHcTd5WlpubXFOdAorICAgICAgICBJemN2YS92N3lzSW00ek8reGZ0MnlKSGpCQnBnQ0ZKeFhJaVpFZm9vVHUyK0hFN21KeEl2TVI3YnVJakoraGpnCisgICAgICAgIHdhQk02aFVHSFhmS2VMNjJRYkw3T09KMDYwdktzc29XMnV1UEFnTUJBQUdqUnpCRk1CNEdBMVVkRVFRWE1CV0IKKyAgICAgICAgRTIxbGNteHBia0JpWVd4MGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQQorICAgICAgICBDRW5nclpJVmd1MDNNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBSEp1NEpWcS9XblhLMm9xcWZMV3FlczV2SE90CisgICAgICAgIGZYL1poQ2pGeURNaHpzbEk4YW02MmdaZWR3WjlJSVpJd2xOUk12RURRQjJ6ZHMvZUVCbklBUVBsL3lSTENMT2YKKyAgICAgICAgWm5iQThQWHJiRlA1aWdzM3FRV1NjQlVqWlZqaWs3NDhIVTJzVVZaT2E5MGMwbUpsMnZKcy9Sd3lMVzcvdUNBZgorICAgICAgICBDL0kvazl4R3I3Zm5lb0lXCisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KKwpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3NpZ25hdHVyZS1leGFtcGxlLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0YjEzMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL1htbFNpZ25hdHVyZS9zaWduYXR1cmUtZXhhbXBsZS54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhRE9DVFlQRSBTaWduYXR1cmUgU1lTVEVNICJ4bWxkc2lnLWNvcmUtc2NoZW1hLmR0ZCIgWworPCFFTlRJVFkgZHNpZyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgICA8IUVOVElUWSAlIFNpZ25hdHVyZVByb3BlcnR5LkFOWSAnfCB0czp0aW1lc3RhbXAnPgorICAgPCFFTEVNRU5UIHRzOnRpbWVzdGFtcCAoI1BDREFUQSk+CisgICA8IUFUVExJU1QgdHM6dGltZXN0YW1wCisgICAgICAgICAgICAgeG1sbnM6dHMJQ0RBVEEJI0ZJWEVEICAgJ2h0dHA6Ly93d3cuZXhhbXBsZS5vcmcvcmZjL3JmY3h4eHgudHh0Jz4KKyAgIDwhQVRUTElTVCBTaWduYXR1cmUKKyAgICAgICAgICAgICB4bWxuczp4c2kgIENEQVRBICNGSVhFRCAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScKKyAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb24JQ0RBVEEJI1JFUVVJUkVEPgorXT4KKzxTaWduYXR1cmUgSWQ9Ik15Rmlyc3RTaWduYXR1cmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgorICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIworICAgeG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiPgorICA8U2lnbmVkSW5mbz4KKwkgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1dELXhtbC1jMTRuLTIwMDAwNzEwIj4KKwkgPC9DYW5vbmljYWxpemF0aW9uTWV0aG9kPgorCSA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYSI+CisJIDwvU2lnbmF0dXJlTWV0aG9kPgorCSA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQvIj4KKwkJPFRyYW5zZm9ybXM+CisJCSAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiLz4KKwkJICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI251bGwiLz4KKwkJPC9UcmFuc2Zvcm1zPgorCQk8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiPgorCQk8L0RpZ2VzdE1ldGhvZD4KKwkJPERpZ2VzdFZhbHVlPmo2bHd4M3J2RVBPMHZLdE11cDROYmVWdThuaz08L0RpZ2VzdFZhbHVlPgorCSA8L1JlZmVyZW5jZT4KKwkgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIj4KKwkJPFRyYW5zZm9ybXM+CisJCSAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiLz4KKwkJPC9UcmFuc2Zvcm1zPgorCQk8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiPgorCQk8L0RpZ2VzdE1ldGhvZD4KKwkJPERpZ2VzdFZhbHVlPlVyWExETEJJdGE2c2tvVjUvQThRMzhHRXc0ND08L0RpZ2VzdFZhbHVlPgorCSA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+TUMwQ0ZGclZMdFJsa01jM0Rhb240QnFxbmtoQ09sRWFBaFVBazhwSDFpUk5LK3ExSStzaXNEVHoyVEZFQUxFPTwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+Li4uPC9QPjxRPi4uLjwvUT48Rz4uLi48L0c+PFk+Li4uPC9ZPgorICAgICAgPC9EU0FLZXlWYWx1ZT4KKyAgICA8L0tleVZhbHVlPgorICA8L0tleUluZm8+CisgIDxPYmplY3Q+CisgICAgIDxTaWduYXR1cmVQcm9wZXJ0aWVzPgorICAgICAgICA8U2lnbmF0dXJlUHJvcGVydHkgVGFyZ2V0PSIjTXlGaXJzdFNpZ25hdHVyZSI+CisgICAgICAgICAgPHRzOnRpbWVzdGFtcCB4bWxuczp0cz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9yZmMvcmZjeHh4eC50eHQiPgorICAgICAgICAgICB0aGlzIGlzIGEgdGVzdCBvZiB0aGUgbWl4ZWQgY29udGVudCBtb2RlbDwvdHM6dGltZXN0YW1wPgorICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnR5PgorICAgICAgPC9TaWduYXR1cmVQcm9wZXJ0aWVzPgorICA8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUveGttcy0xLjAud3NkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNhMDVmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3hrbXMtMS4wLndzZGwKQEAgLTAsMCArMSw2OTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZGVmaW5pdGlvbnMgbmFtZT0iWE1MS2V5TWFuYWdlbWVudCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgorIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hIgorIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCisgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKKyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKKyB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKKyB4bWxuczp4a21zPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiCisgeG1sbnM6dG5zPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiCisgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnhrbXMub3JnL3NjaGVtYS94a21zLTIwMDEtMDEtMjAiPgorCisgIDx0eXBlcz4KKworPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgorICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCisgICAgICAgIHZlcnNpb249IjAuMSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAKKworPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgorCis8c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KKyAgPC9yZXN0cmljdGlvbj4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgorICA8c2VxdWVuY2U+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmVkSW5mbyIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZVZhbHVlIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6T2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPiAgCisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Cis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVZhbHVlIiB0eXBlPSJkczpTaWduYXR1cmVWYWx1ZVR5cGUiLz4gCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVWYWx1ZVR5cGUiPgorICAgIDxzaW1wbGVDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJiYXNlNjRCaW5hcnkiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9zaW1wbGVDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIFN0YXJ0IFNpZ25lZEluZm8gLS0+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25lZEluZm8iIHR5cGU9ImRzOlNpZ25lZEluZm9UeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmVkSW5mb1R5cGUiPgorICA8c2VxdWVuY2U+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZU1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlJlZmVyZW5jZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCisgIDwvc2VxdWVuY2U+ICAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iQ2Fub25pY2FsaXphdGlvbk1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIG5hbWVzcGFjZSAtLT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCisgIDwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlTWV0aG9kIiB0eXBlPSJkczpTaWduYXR1cmVNZXRob2RUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iSE1BQ091dHB1dExlbmd0aCIgbWluT2NjdXJzPSIwIiB0eXBlPSJkczpITUFDT3V0cHV0TGVuZ3RoVHlwZSIvPgorICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwhLS0gKDAsdW5ib3VuZGVkKSBlbGVtZW50cyBmcm9tICgxLDEpIGV4dGVybmFsIG5hbWVzcGFjZSAtLT4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCisgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgorCis8ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KKyAgPHNlcXVlbmNlPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybXMiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdE1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybXMiIHR5cGU9ImRzOlRyYW5zZm9ybXNUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2Zvcm1zVHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm0iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAKKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+IAorICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWFBhdGgiIHR5cGU9InN0cmluZyIvPiAKKyAgICA8L2Nob2ljZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBSZWZlcmVuY2UgLS0+CisKKzxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4gCisgIDxzZXF1ZW5jZT4KKyAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgPC9zZXF1ZW5jZT4gICAgCisgIDxhdHRyaWJ1dGUgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJhbnlVUkkiIHVzZT0icmVxdWlyZWQiLz4gCis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Cis8c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Cis8L3NpbXBsZVR5cGU+CisKKzwhLS0gRW5kIFNpZ25lZEluZm8gLS0+CisKKzwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KKworPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4gCisKKzxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSIgbWl4ZWQ9InRydWUiPgorICA8c2VxdWVuY2U+Cis8IS0tICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5TmFtZSIvPiAgICAgLS0+CisgICAgPGVsZW1lbnQgcmVmPSJkczpLZXlOYW1lIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpLZXlWYWx1ZSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlJldHJpZXZhbE1ldGhvZCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6UEdQRGF0YSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNQS0lEYXRhIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpNZ210RGF0YSIvPgorICAgIDxhbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIvPiAgCisgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IktleU5hbWUiIHR5cGU9InN0cmluZyIvPgorICA8ZWxlbWVudCBuYW1lPSJNZ210RGF0YSIgdHlwZT0ic3RyaW5nIi8+CisKKyAgPGVsZW1lbnQgbmFtZT0iS2V5VmFsdWUiIHR5cGU9ImRzOktleVZhbHVlVHlwZSIvPiAKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IktleVZhbHVlVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgPGNob2ljZT4KKyAgICAgPGVsZW1lbnQgcmVmPSJkczpEU0FLZXlWYWx1ZSIvPgorICAgICA8ZWxlbWVudCByZWY9ImRzOlJTQUtleVZhbHVlIi8+CisgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC9jaG9pY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iUmV0cmlldmFsTWV0aG9kIiB0eXBlPSJkczpSZXRyaWV2YWxNZXRob2RUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICA8L3NlcXVlbmNlPiAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUkkiIHR5cGU9ImFueVVSSSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iVHlwZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+CisgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gU3RhcnQgWDUwOURhdGEgLS0+CisKKzxlbGVtZW50IG5hbWU9Ilg1MDlEYXRhIiB0eXBlPSJkczpYNTA5RGF0YVR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KKyAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICA8Y2hvaWNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwvY2hvaWNlPgorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4KKworPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4gCisgIDxzZXF1ZW5jZT4gCisgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3Vlck5hbWUiIHR5cGU9InN0cmluZyIvPiAKKyAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+IAorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4KKworPCEtLSBFbmQgWDUwOURhdGEgLS0+CisKKzwhLS0gQmVnaW4gUEdQRGF0YSAtLT4KKworPGVsZW1lbnQgbmFtZT0iUEdQRGF0YSIgdHlwZT0iZHM6UEdQRGF0YVR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iUEdQRGF0YVR5cGUiPiAKKyAgPGNob2ljZT4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+IAorICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIvPiAKKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jaG9pY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBQR1BEYXRhIC0tPgorCis8IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IlNQS0lEYXRhVHlwZSI+CisgIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGVsZW1lbnQgbmFtZT0iU1BLSVNleHAiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIi8+CisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPiAKKworPCEtLSBFbmQgU1BLSURhdGEgLS0+CisKKzwhLS0gRW5kIEtleUluZm8gLS0+CisKKzwhLS0gU3RhcnQgT2JqZWN0IChNYW5pZmVzdCwgU2lnbmF0dXJlUHJvcGVydHkpIC0tPgorCis8ZWxlbWVudCBuYW1lPSJPYmplY3QiIHR5cGU9ImRzOk9iamVjdFR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgorICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJNaW1lVHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+IDwhLS0gYWRkIGEgZ3JlcCBmYWNldCAtLT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJFbmNvZGluZyIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0iTWFuaWZlc3QiIHR5cGU9ImRzOk1hbmlmZXN0VHlwZSIvPiAKKzxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXMiIHR5cGU9ImRzOlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKyAgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZVByb3BlcnR5IiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0eVR5cGUiLz4gCisgICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+CisgICAgIDwvY2hvaWNlPgorICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPiAKKyAgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gRW5kIE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KKworPCEtLSBTdGFydCBBbGdvcml0aG0gUGFyYW1ldGVycyAtLT4KKworPHNpbXBsZVR5cGUgbmFtZT0iSE1BQ091dHB1dExlbmd0aFR5cGUiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciIvPgorPC9zaW1wbGVUeXBlPgorCis8IS0tIFN0YXJ0IEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+CisKKzxlbGVtZW50IG5hbWU9IkRTQUtleVZhbHVlIiB0eXBlPSJkczpEU0FLZXlWYWx1ZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJEU0FLZXlWYWx1ZVR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9IlEiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGVsZW1lbnQgbmFtZT0iSiIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8ZWxlbWVudCBuYW1lPSJHIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgorICAgIDxlbGVtZW50IG5hbWU9IlkiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iU2VlZCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQZ2VuQ291bnRlciIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKworPGVsZW1lbnQgbmFtZT0iUlNBS2V5VmFsdWUiIHR5cGU9ImRzOlJTQUtleVZhbHVlVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlJTQUtleVZhbHVlVHlwZSI+CisgIDxzZXF1ZW5jZT4KKyAgICA8ZWxlbWVudCBuYW1lPSJNb2R1bHVzIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4gCisgICAgPGVsZW1lbnQgbmFtZT0iRXhwb25lbnQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPiAKKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+IAorCis8IS0tIEVuZCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgorCis8IS0tIEVuZCBTaWduYXR1cmUgLS0+CisKKzwvc2NoZW1hPgorCis8c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwIgorIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLz4KKyAgIDxlbGVtZW50IG5hbWU9IlJlY292ZXIiIHR5cGU9InhrbXM6UmVjb3ZlclR5cGUiLz4KKyAgIDxlbGVtZW50IG5hbWU9IlJldm9rZSIgdHlwZT0ieGttczpSZXZva2VUeXBlIi8+CisgICA8ZWxlbWVudCBuYW1lPSJMb2NhdGUiIHR5cGU9InhrbXM6TG9jYXRlVHlwZSIvPgorICAgPGVsZW1lbnQgbmFtZT0iUmVnaXN0ZXIiIHR5cGU9InhrbXM6UmVnaXN0ZXJUeXBlIi8+CisgICA8ZWxlbWVudCBuYW1lPSJWYWxpZGF0ZSIgdHlwZT0ieGttczpWYWxpZGF0ZVR5cGUiLz4KKyAgIDxlbGVtZW50IG5hbWU9IlJlZ2lzdGVyUmVzdWx0IiB0eXBlPSJ4a21zOlJlZ2lzdGVyUmVzdWx0VHlwZSIvPgorICAgPGVsZW1lbnQgbmFtZT0iUmVjb3ZlclJlc3VsdCIgdHlwZT0ieGttczpSZWNvdmVyUmVzdWx0VHlwZSIvPgorICAgPGVsZW1lbnQgbmFtZT0iUmV2b2tlUmVzdWx0IiB0eXBlPSJ4a21zOlJldm9rZVJlc3VsdFR5cGUiLz4KKyAgIDxlbGVtZW50IG5hbWU9IkxvY2F0ZVJlc3VsdCIgdHlwZT0ieGttczpMb2NhdGVSZXN1bHRUeXBlIi8+CisgICA8ZWxlbWVudCBuYW1lPSJWYWxpZGF0ZVJlc3VsdCIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdFR5cGUiLz4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGVUeXBlIj4KKyAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNhY3Rpb25JRCIgdHlwZT0ic3RyaW5nIi8+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWVyeSIgdHlwZT0ieGttczpLZXlJbmZvVHlwZSIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25kIiB0eXBlPSJ4a21zOlJlc3BvbmRUeXBlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGVSZXN1bHRUeXBlIj4KKyAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNhY3Rpb25JRCIgdHlwZT0ic3RyaW5nIi8+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXN1bHQiIHR5cGU9InhrbXM6UmVzdWx0Q29kZVR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOkxvY2F0ZVJlc3VsdEFuc3dlclR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JJbmZvIiB0eXBlPSJ4a21zOkVycm9ySW5mb1R5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiByZWY9ImRzOlNpZ25hdHVyZSIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWVyeSIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNwb25kIiB0eXBlPSJ4a21zOlJlc3BvbmRUeXBlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJWYWxpZGF0ZVJlc3VsdFR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVzdWx0IiB0eXBlPSJ4a21zOlJlc3VsdENvZGVUeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFuc3dlciIgdHlwZT0ieGttczpWYWxpZGF0ZVJlc3VsdEFuc3dlclR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JJbmZvIiB0eXBlPSJ4a21zOkVycm9ySW5mb1R5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiByZWY9ImRzOlNpZ25hdHVyZSIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkYXRlUmVzdWx0QW5zd2VyVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJLZXlCaW5kaW5nIiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWdpc3RlclR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHJvdG90eXBlIiB0eXBlPSJ4a21zOktleUJpbmRpbmdUeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdXRoSW5mbyIgdHlwZT0ieGttczpBdXRoSW5mb1R5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3BvbmQiIHR5cGU9InhrbXM6UmVzcG9uZFR5cGUiLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0VHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXN1bHQiIHR5cGU9InhrbXM6UmVzdWx0Q29kZVR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQW5zd2VyIiB0eXBlPSJ4a21zOlJlZ2lzdGVyUmVzdWx0QW5zd2VyVHlwZSIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcml2YXRlIiB0eXBlPSJ4a21zOlByaXZhdGVUeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVycm9ySW5mbyIgdHlwZT0ieGttczpFcnJvckluZm9UeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgcmVmPSJkczpTaWduYXR1cmUiLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWdpc3RlclJlc3VsdEFuc3dlclR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbmFtZT0iS2V5QmluZGluZyIgdHlwZT0ieGttczpLZXlCaW5kaW5nVHlwZSIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iUmVjb3ZlclR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWNvdmVyUmVzdWx0VHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCByZWY9InhrbXM6UmVnaXN0ZXJSZXN1bHQiLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldm9rZVR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKworICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByaXZhdGVUeXBlIj4KKyAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgIDxhbnkgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAgCisJICAgICAgbWluT2NjdXJzPSIwIiBuYW1lc3BhY2U9IiMjYW55Ii8+CisgICAgICA8L3NlcXVlbmNlPgorICAgICAgPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC9jb21wbGV4VHlwZT4KKworICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJldm9rZVJlc3VsdFR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgcmVmPSJ4a21zOlJlZ2lzdGVyUmVzdWx0Ii8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJFcnJvckluZm9UeXBlIj4KKyAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVycm9yRGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcnJvckFjdG9yIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXJyb3JEZXRhaWwiIHR5cGU9InhrbXM6RXJyb3JEZXRhaWxUeXBlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlcnJvckNvZGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJFcnJvckRldGFpbFR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic3RyaWN0Ii8+CisgICAgICA8L3NlcXVlbmNlPgorICAgICAgPGFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic3RyaWN0Ii8+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPHNpbXBsZVR5cGUgbmFtZT0iRXJyb3JDb2RlVHlwZSI+CisgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Ii8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZlciIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnQuTWFsZm9ybWVkS2V5TmFtZVBhc3NlZCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnQuSW52YWxpZFBhc3NQaHJhc2VBdXRoIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IioiLz4KKyAgICAgIDwvcmVzdHJpY3Rpb24+CisgICA8L3NpbXBsZVR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5QmluZGluZ1R5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2FjdGlvbklEIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1cyIgdHlwZT0ieGttczpBc3NlcnRpb25TdGF0dXNUeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlJRCIgdHlwZT0ic3RyaW5nIi8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6S2V5SW5mbyIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXNzUGhyYXNlIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJvY2Vzc0luZm8iIHR5cGU9InhrbXM6UHJvY2Vzc0luZm9UeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlZhbGlkaXR5SW50ZXJ2YWwiIHR5cGU9InhrbXM6VmFsaWRpdHlJbnRlcnZhbFR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IktleVVzYWdlIiB0eXBlPSJ4a21zOktleVVzYWdlVHlwZSIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcml2YXRlIiB0eXBlPSJ4a21zOlByaXZhdGVUeXBlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iS2V5SW5mb1R5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgcmVmPSJkczpLZXlJbmZvIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZXNwb25kVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJpbmciIHR5cGU9InhrbXM6UmVzcG9uZEVudW0iLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPHNpbXBsZVR5cGUgbmFtZT0iUmVzcG9uZEVudW0iPgorICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleU5hbWUiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iS2V5VmFsdWUiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iWDUwOUNlcnQiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iWDUwOUNoYWluIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ilg1MDlDUkwiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iT0NTUCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSZXRyaWV2YWxNZXRob2QiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTWdtdERhdGEiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUEdQRGF0YSIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQR1BXZWIiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU1BLSURhdGEiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGUiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZSIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eUludGVydmFsIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IktleVVzYWdlIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJTaWduZWRSZXN1bHQiLz4KKyAgICAgIDwvcmVzdHJpY3Rpb24+CisgICA8L3NpbXBsZVR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRlUmVzdWx0QW5zd2VyVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiByZWY9ImRzOktleUluZm8iLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPHNpbXBsZVR5cGUgbmFtZT0iUmVzdWx0Q29kZVR5cGUiPgorICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlN1Y2Nlc3MiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTm9NYXRjaCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJOb3RGb3VuZCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbXBsZXRlIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmUiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNlZCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nIi8+CisgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgPC9zaW1wbGVUeXBlPgorICAgPHNpbXBsZVR5cGUgbmFtZT0iQXNzZXJ0aW9uU3RhdHVzVHlwZSI+CisgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWQiLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSW52YWxpZCIvPgorICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJbmRldGVybWluYXRlIi8+CisgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgPC9zaW1wbGVUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NJbmZvVHlwZSI+CisgICAgICA8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iVmFsaWRpdHlJbnRlcnZhbFR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RCZWZvcmUiIHR5cGU9InRpbWVJbnN0YW50Ii8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5vdEFmdGVyIiB0eXBlPSJ0aW1lSW5zdGFudCIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8c2ltcGxlVHlwZSBuYW1lPSJLZXlVc2FnZVR5cGUiPgorICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVuY3J5cHRpb24iLz4KKyAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlIi8+CisgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgPC9zaW1wbGVUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhJbmZvVHlwZSI+CisgICAgICA8Y2hvaWNlPgorICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXV0aFVzZXJJbmZvIiB0eXBlPSJ4a21zOkF1dGhVc2VySW5mb1R5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhTZXJ2ZXJJbmZvIiB0eXBlPSJ4a21zOkF1dGhTZXJ2ZXJJbmZvVHlwZSIvPgorICAgICAgPC9jaG9pY2U+CisgICA8L2NvbXBsZXhUeXBlPgorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZHM6U2lnbmF0dXJlIi8+CisgICAgICA8L3NlcXVlbmNlPgorICAgPC9jb21wbGV4VHlwZT4KKyAgIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlCaW5kaW5nQXV0aFR5cGUiPgorICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRzOlNpZ25hdHVyZSIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iQXV0aFVzZXJJbmZvVHlwZSI+CisgICAgICA8c2VxdWVuY2U+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb29mT2ZQb3NzZXNzaW9uIiB0eXBlPSJ4a21zOlByb29mT2ZQb3NzZXNzaW9uVHlwZSIvPgorICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlCaW5kaW5nQXV0aCIgdHlwZT0ieGttczpLZXlCaW5kaW5nQXV0aFR5cGUiLz4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFzc1BocmFzZUF1dGgiIHR5cGU9InN0cmluZyIvPgorICAgICAgPC9zZXF1ZW5jZT4KKyAgIDwvY29tcGxleFR5cGU+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iQXV0aFNlcnZlckluZm9UeXBlIj4KKyAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgIDxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iS2V5QmluZGluZ0F1dGgiIHR5cGU9InhrbXM6S2V5QmluZGluZ0F1dGhUeXBlIi8+CisgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhc3NQaHJhc2VBdXRoIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgIDwvc2VxdWVuY2U+CisgICA8L2NvbXBsZXhUeXBlPgorPC9zY2hlbWE+CisgIDwvdHlwZXM+CisKKyAgPG1lc3NhZ2UgbmFtZT0iUmVnaXN0ZXIiPgorICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6UmVnaXN0ZXIiLz4KKyAgPC9tZXNzYWdlPgorCisgIDxtZXNzYWdlIG5hbWU9IlJlZ2lzdGVyUmVzdWx0Ij4KKyAgICA8cGFydCBuYW1lPSJib2R5IiBlbGVtZW50PSJ4a21zOlJlZ2lzdGVyUmVzdWx0Ii8+CisgIDwvbWVzc2FnZT4KKworICA8bWVzc2FnZSBuYW1lPSJWYWxpZGF0ZSI+CisgICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpWYWxpZGF0ZSIvPgorICA8L21lc3NhZ2U+CisKKyAgPG1lc3NhZ2UgbmFtZT0iVmFsaWRhdGVSZXN1bHQiPgorICAgIDxwYXJ0IG5hbWU9ImJvZHkiIGVsZW1lbnQ9InhrbXM6VmFsaWRhdGVSZXN1bHQiLz4KKyAgPC9tZXNzYWdlPgorCisgIDxtZXNzYWdlIG5hbWU9IkxvY2F0ZSI+CisgICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpMb2NhdGUiLz4KKyAgPC9tZXNzYWdlPgorCisgIDxtZXNzYWdlIG5hbWU9IkxvY2F0ZVJlc3VsdCI+CisgICAgPHBhcnQgbmFtZT0iYm9keSIgZWxlbWVudD0ieGttczpMb2NhdGVSZXN1bHQiLz4KKyAgPC9tZXNzYWdlPgorCisgIDxwb3J0VHlwZSBuYW1lPSJLZXlTZXJ2aWNlUG9ydFR5cGUiPgorICAgIDxvcGVyYXRpb24gbmFtZT0iUmVnaXN0ZXIiPgorICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpSZWdpc3RlciIvPgorICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiLz4KKwk8ZmF1bHQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyUmVzdWx0Ii8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9IlZhbGlkYXRlIj4KKyAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGUiLz4KKyAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlZhbGlkYXRlUmVzdWx0Ii8+CisJPGZhdWx0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJMb2NhdGUiPgorICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpMb2NhdGUiLz4KKyAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkxvY2F0ZVJlc3VsdCIvPgorCTxmYXVsdCBtZXNzYWdlPSJ0bnM6TG9jYXRlUmVzdWx0Ii8+CisgICAgPC9vcGVyYXRpb24+CisgIDwvcG9ydFR5cGU+CisKKyAgPGJpbmRpbmcgbmFtZT0iS2V5U2VydmljZVNvYXBCaW5kaW5nIiB0eXBlPSJ0bnM6S2V5U2VydmljZVBvcnRUeXBlIj4KKyAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KKworICAgIDxvcGVyYXRpb24gbmFtZT0iUmVnaXN0ZXIiPgorICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cueGttcy5vcmcvc2NoZW1hL3hrbXMtMjAwMS0wMS0yMCNSZWdpc3RlciIgc3R5bGU9ImRvY3VtZW50Ii8+CisgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyIj4KKyAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0iYm9keSIgdXNlPSJsaXRlcmFsIi8+CisgICAgICA8L2lucHV0PgorICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXJSZXN1bHQiPgorICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiLz4KKyAgICAgIDwvb3V0cHV0PgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJWYWxpZGF0ZSI+CisgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI1ZhbGlkYXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4KKyAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGUiPgorICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJib2R5IiB1c2U9ImxpdGVyYWwiLz4KKyAgICAgIDwvaW5wdXQ+CisgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZVJlc3VsdCI+CisgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPgorICAgICAgPC9vdXRwdXQ+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9IkxvY2F0ZSI+CisgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy54a21zLm9yZy9zY2hlbWEveGttcy0yMDAxLTAxLTIwI0xvY2F0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+CisgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOkxvY2F0ZSI+CisgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPgorICAgICAgPC9pbnB1dD4KKyAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkxvY2F0ZVJlc3VsdCI+CisgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9ImJvZHkiIHVzZT0ibGl0ZXJhbCIvPgorICAgICAgPC9vdXRwdXQ+CisgICAgPC9vcGVyYXRpb24+CisgIDwvYmluZGluZz4KKworICA8YmluZGluZyBuYW1lPSJLZXlTZXJ2aWNlSHR0cFBvc3RCaW5kaW5nIiB0eXBlPSJ0bnM6S2V5U2VydmljZVBvcnRUeXBlIj4KKyAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IlBPU1QiLz4KKworICAgIDxvcGVyYXRpb24gbmFtZT0iUmVnaXN0ZXIiPgorICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJ4a21zL0FjY2VwdG9yLm5hbm8iLz4KKyAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UmVnaXN0ZXIiPgorICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPgorICAgICAgPC9pbnB1dD4KKyAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlJlZ2lzdGVyUmVzdWx0Ij4KKyAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0cz0iYm9keSIgdHlwZT0idGV4dC94bWwiLz4KKyAgICAgIDwvb3V0cHV0PgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJWYWxpZGF0ZSI+CisgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249InhrbXMvQWNjZXB0b3IubmFubyIvPgorICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpWYWxpZGF0ZSI+CisgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+CisgICAgICA8L2lucHV0PgorICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VmFsaWRhdGVSZXN1bHQiPgorICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPgorICAgICAgPC9vdXRwdXQ+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9IkxvY2F0ZSI+CisgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249InhrbXMvQWNjZXB0b3IubmFubyIvPgorICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpMb2NhdGUiPgorICAgICAgICA8bWltZTpjb250ZW50IHBhcnRzPSJib2R5IiB0eXBlPSJ0ZXh0L3htbCIvPgorICAgICAgPC9pbnB1dD4KKyAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkxvY2F0ZVJlc3VsdCI+CisgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydHM9ImJvZHkiIHR5cGU9InRleHQveG1sIi8+CisgICAgICA8L291dHB1dD4KKyAgICA8L29wZXJhdGlvbj4KKyAgPC9iaW5kaW5nPgorCisgIDxzZXJ2aWNlIG5hbWU9IlhNTEtleU1hbmFnZW1lbnRTZXJ2aWNlIj4KKwk8ZG9jdW1lbnRhdGlvbj5WZXJpc2lnbidzIFhNTCBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChYS01TKTwvZG9jdW1lbnRhdGlvbj4KKworICAgIDxwb3J0IG5hbWU9IktleVNlcnZpY2VTb2FwUG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VTb2FwQmluZGluZyI+CisgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8veGttcy52ZXJpc2lnbi5jb20veGttcy9BY2NlcHRvci5uYW5vIi8+CisgICAgPC9wb3J0PgorCisgICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZUh0dHBQb3N0UG9ydCIgYmluZGluZz0idG5zOktleVNlcnZpY2VIdHRwUG9zdEJpbmRpbmciPgorICAgICAgPGh0dHA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3hrbXMudmVyaXNpZ24uY29tLyIvPgorICAgIDwvcG9ydD4KKyAgPC9zZXJ2aWNlPgorCisgIDxzZXJ2aWNlIG5hbWU9IlBpbG90WE1MS2V5TWFuYWdlbWVudFNlcnZpY2UiPgorCTxkb2N1bWVudGF0aW9uPlZlcmlzaWduJ3MgUGlsb3QgWE1MIEtleSBNYW5hZ2VtZW50IFNlcnZpY2UgKFhLTVMpPC9kb2N1bWVudGF0aW9uPgorCisgICAgPHBvcnQgbmFtZT0iS2V5U2VydmljZVNvYXBQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZVNvYXBCaW5kaW5nIj4KKyAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9waWxvdC14a21zLnZlcmlzaWduLmNvbS94a21zL0FjY2VwdG9yLm5hbm8iLz4KKyAgICA8L3BvcnQ+CisKKyAgICA8cG9ydCBuYW1lPSJLZXlTZXJ2aWNlSHR0cFBvc3RQb3J0IiBiaW5kaW5nPSJ0bnM6S2V5U2VydmljZUh0dHBQb3N0QmluZGluZyI+CisgICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vcGlsb3QteGttcy52ZXJpc2lnbi5jb20vIi8+CisgICAgPC9wb3J0PgorICA8L3NlcnZpY2U+Cis8L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvWG1sU2lnbmF0dXJlL3htbGRzaWctY29yZS1zY2hlbWEueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTI0NDIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9YbWxTaWduYXR1cmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QKQEAgLTAsMCArMSwzMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgc2NoZW1hCisgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU2NoZW1hIDIwMDEwMi8vRU4iICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS5kdGQiCisgWworICAgPCFBVFRMSVNUIHNjaGVtYQorICAgICB4bWxuczpkcyBDREFUQSAjRklYRUQgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICAgPCFFTlRJVFkgZHNpZyAnaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+CisgICA8IUVOVElUWSAlIHAgJyc+CisgICA8IUVOVElUWSAlIHMgJyc+CisgIF0+CisKKzwhLS0gU2NoZW1hIGZvciBYTUwgU2lnbmF0dXJlcworICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMKKyAgICAkUmV2aXNpb24kIG9uICREYXRlJCBieSAkQXV0aG9yJAorCisgICAgQ29weXJpZ2h0IDIwMDEgVGhlIEludGVybmV0IFNvY2lldHkgYW5kIFczQyAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUKKyAgICBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuCisgICAgQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KKworICAgIFRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQKKyAgICBpbiB0aGUgRkFRIFsyXS4KKworICAgIFsxXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAorICAgIFsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQKKy0tPgorCisKKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgorICAgICAgICB2ZXJzaW9uPSIwLjEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworPCEtLSBCYXNpYyBUeXBlcyBEZWZpbmVkIGZvciBTaWduYXR1cmVzIC0tPgorCis8c2ltcGxlVHlwZSBuYW1lPSJDcnlwdG9CaW5hcnkiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KKyAgPC9yZXN0cmljdGlvbj4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTdGFydCBTaWduYXR1cmUgLS0+CisKKzxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0iZHM6U2lnbmF0dXJlVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPGVsZW1lbnQgcmVmPSJkczpTaWduZWRJbmZvIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVWYWx1ZSIvPgorICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5SW5mbyIgbWluT2NjdXJzPSIwIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpPYmplY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KKzwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iU2lnbmF0dXJlVmFsdWUiIHR5cGU9ImRzOlNpZ25hdHVyZVZhbHVlVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlVmFsdWVUeXBlIj4KKyAgICA8c2ltcGxlQ29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvc2ltcGxlQ29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworPCEtLSBTdGFydCBTaWduZWRJbmZvIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTaWduZWRJbmZvIiB0eXBlPSJkczpTaWduZWRJbmZvVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25lZEluZm9UeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCIvPgorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlTWV0aG9kIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgIDwvc2VxdWVuY2U+CisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Cis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2QiIHR5cGU9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPCEtLSAoMCx1bmJvdW5kZWQpIGVsZW1lbnRzIGZyb20gKDEsMSkgbmFtZXNwYWNlIC0tPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZU1ldGhvZCIgdHlwZT0iZHM6U2lnbmF0dXJlTWV0aG9kVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9IkhNQUNPdXRwdXRMZW5ndGgiIG1pbk9jY3Vycz0iMCIgdHlwZT0iZHM6SE1BQ091dHB1dExlbmd0aFR5cGUiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBleHRlcm5hbCBuYW1lc3BhY2UgLS0+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+CisgIDwvY29tcGxleFR5cGU+CisKKzwhLS0gU3RhcnQgUmVmZXJlbmNlIC0tPgorCis8ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2UiIHR5cGU9ImRzOlJlZmVyZW5jZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtcyIgbWluT2NjdXJzPSIwIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RNZXRob2QiLz4KKyAgICA8ZWxlbWVudCByZWY9ImRzOkRpZ2VzdFZhbHVlIi8+CisgIDwvc2VxdWVuY2U+CisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+CisgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJUeXBlIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KKzwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iVHJhbnNmb3JtcyIgdHlwZT0iZHM6VHJhbnNmb3Jtc1R5cGUiLz4KKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybXNUeXBlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCByZWY9ImRzOlRyYW5zZm9ybSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3NlcXVlbmNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlRyYW5zZm9ybSIgdHlwZT0iZHM6VHJhbnNmb3JtVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3JtVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMCx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYUGF0aCIgdHlwZT0ic3RyaW5nIi8+CisgICAgPC9jaG9pY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBSZWZlcmVuY2UgLS0+CisKKzxlbGVtZW50IG5hbWU9IkRpZ2VzdE1ldGhvZCIgdHlwZT0iZHM6RGlnZXN0TWV0aG9kVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IkRpZ2VzdE1ldGhvZFR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Cis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJEaWdlc3RWYWx1ZSIgdHlwZT0iZHM6RGlnZXN0VmFsdWVUeXBlIi8+Cis8c2ltcGxlVHlwZSBuYW1lPSJEaWdlc3RWYWx1ZVR5cGUiPgorICA8cmVzdHJpY3Rpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ii8+Cis8L3NpbXBsZVR5cGU+CisKKzwhLS0gRW5kIFNpZ25lZEluZm8gLS0+CisKKzwhLS0gU3RhcnQgS2V5SW5mbyAtLT4KKworPGVsZW1lbnQgbmFtZT0iS2V5SW5mbyIgdHlwZT0iZHM6S2V5SW5mb1R5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJLZXlJbmZvVHlwZSIgbWl4ZWQ9InRydWUiPgorICA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICA8ZWxlbWVudCByZWY9ImRzOktleU5hbWUiLz4KKyAgICA8ZWxlbWVudCByZWY9ImRzOktleVZhbHVlIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpSZXRyaWV2YWxNZXRob2QiLz4KKyAgICA8ZWxlbWVudCByZWY9ImRzOlg1MDlEYXRhIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpQR1BEYXRhIi8+CisgICAgPGVsZW1lbnQgcmVmPSJkczpTUEtJRGF0YSIvPgorICAgIDxlbGVtZW50IHJlZj0iZHM6TWdtdERhdGEiLz4KKyAgICA8YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KKyAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgorICA8L2Nob2ljZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KKzwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iS2V5TmFtZSIgdHlwZT0ic3RyaW5nIi8+CisgIDxlbGVtZW50IG5hbWU9Ik1nbXREYXRhIiB0eXBlPSJzdHJpbmciLz4KKworICA8ZWxlbWVudCBuYW1lPSJLZXlWYWx1ZSIgdHlwZT0iZHM6S2V5VmFsdWVUeXBlIi8+CisgIDxjb21wbGV4VHlwZSBuYW1lPSJLZXlWYWx1ZVR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgIDxjaG9pY2U+CisgICAgIDxlbGVtZW50IHJlZj0iZHM6RFNBS2V5VmFsdWUiLz4KKyAgICAgPGVsZW1lbnQgcmVmPSJkczpSU0FLZXlWYWx1ZSIvPgorICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgIDwvY2hvaWNlPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlJldHJpZXZhbE1ldGhvZCIgdHlwZT0iZHM6UmV0cmlldmFsTWV0aG9kVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPgorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIFN0YXJ0IFg1MDlEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJYNTA5RGF0YSIgdHlwZT0iZHM6WDUwOURhdGFUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iWDUwOURhdGFUeXBlIj4KKyAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICA8Y2hvaWNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUlzc3VlclNlcmlhbCIgdHlwZT0iZHM6WDUwOUlzc3VlclNlcmlhbFR5cGUiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTS0kiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVN1YmplY3ROYW1lIiB0eXBlPSJzdHJpbmciLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlDZXJ0aWZpY2F0ZSIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q1JMIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwvY2hvaWNlPgorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4KKworPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWxUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlJc3N1ZXJOYW1lIiB0eXBlPSJzdHJpbmciLz4KKyAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U2VyaWFsTnVtYmVyIiB0eXBlPSJpbnRlZ2VyIi8+CisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBYNTA5RGF0YSAtLT4KKworPCEtLSBCZWdpbiBQR1BEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJQR1BEYXRhIiB0eXBlPSJkczpQR1BEYXRhVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlBHUERhdGFUeXBlIj4KKyAgPGNob2ljZT4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlJRCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJQR1BLZXlQYWNrZXQiIHR5cGU9ImJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIi8+CisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jaG9pY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBQR1BEYXRhIC0tPgorCis8IS0tIEJlZ2luIFNQS0lEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTUEtJRGF0YSIgdHlwZT0iZHM6U1BLSURhdGFUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iU1BLSURhdGFUeXBlIj4KKyAgPHNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICA8ZWxlbWVudCBuYW1lPSJTUEtJU2V4cCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiLz4KKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKzwhLS0gRW5kIFNQS0lEYXRhIC0tPgorCis8IS0tIEVuZCBLZXlJbmZvIC0tPgorCis8IS0tIFN0YXJ0IE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KKworPGVsZW1lbnQgbmFtZT0iT2JqZWN0IiB0eXBlPSJkczpPYmplY3RUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZSIgbWl4ZWQ9InRydWUiPgorICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICA8L3NlcXVlbmNlPgorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgorICA8YXR0cmlidXRlIG5hbWU9Ik1pbWVUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4gPCEtLSBhZGQgYSBncmVwIGZhY2V0IC0tPgorICA8YXR0cmlidXRlIG5hbWU9IkVuY29kaW5nIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KKzwvY29tcGxleFR5cGU+CisKKzxlbGVtZW50IG5hbWU9Ik1hbmlmZXN0IiB0eXBlPSJkczpNYW5pZmVzdFR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJNYW5pZmVzdFR5cGUiPgorICA8c2VxdWVuY2U+CisgICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgIDwvc2VxdWVuY2U+CisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Cis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0aWVzIiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0aWVzVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnRpZXNUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6U2lnbmF0dXJlUHJvcGVydHkiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgIDwvc2VxdWVuY2U+CisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+Cis8L2NvbXBsZXhUeXBlPgorCisgICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eSIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydHlUeXBlIi8+CisgICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlUHJvcGVydHlUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgIDwhLS0gKDEsMSkgZWxlbWVudHMgZnJvbSAoMSx1bmJvdW5kZWQpIG5hbWVzcGFjZXMgLS0+CisgICAgIDwvY2hvaWNlPgorICAgICA8YXR0cmlidXRlIG5hbWU9IlRhcmdldCIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+CisgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+CisgICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBPYmplY3QgKE1hbmlmZXN0LCBTaWduYXR1cmVQcm9wZXJ0eSkgLS0+CisKKzwhLS0gU3RhcnQgQWxnb3JpdGhtIFBhcmFtZXRlcnMgLS0+CisKKzxzaW1wbGVUeXBlIG5hbWU9IkhNQUNPdXRwdXRMZW5ndGhUeXBlIj4KKyAgPHJlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiLz4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTdGFydCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgorCis8ZWxlbWVudCBuYW1lPSJEU0FLZXlWYWx1ZSIgdHlwZT0iZHM6RFNBS2V5VmFsdWVUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iRFNBS2V5VmFsdWVUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJRIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+CisgICAgPGVsZW1lbnQgbmFtZT0iWSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgPGVsZW1lbnQgbmFtZT0iSiIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgIDxlbGVtZW50IG5hbWU9IlNlZWQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUGdlbkNvdW50ZXIiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJSU0FLZXlWYWx1ZSIgdHlwZT0iZHM6UlNBS2V5VmFsdWVUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iUlNBS2V5VmFsdWVUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IG5hbWU9Ik1vZHVsdXMiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDxlbGVtZW50IG5hbWU9IkV4cG9uZW50IiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKzwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+CisKKzwhLS0gRW5kIFNpZ25hdHVyZSAtLT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0FkZF9BY2N0U2llYmVsNy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMjdjNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8IS0tIGVkaXRlZCB3aXRoIFhNTCBTcHkgdjQuNCBVIChodHRwOi8vd3d3LnhtbHNweS5jb20pIC0tPgorPD9TaWViZWwtUHJvcGVydHktU2V0IEVzY2FwZU5hbWVzPSJmYWxzZSI/PgorPFNpZWJlbE1lc3NhZ2UgTWVzc2FnZUlkPSIxLU4iIEludE9iamVjdEZvcm1hdD0iU2llYmVsIEhpZXJhcmNoaWNhbCIgTWVzc2FnZVR5cGU9IkludGVncmF0aW9uIE9iamVjdCIgSW50T2JqZWN0TmFtZT0iU2FtcGxlIEFjY291bnQiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJGOlxBZGFwdGVyc1xzaWViZWxcQWRkX0FjY3RTaWViZWw3XzEueHNkIj4KKwk8TGlzdE9mU2FtcGxlQWNjb3VudD4KKwkJPEFjY291bnQ+CisJCQk8Q3VsdHVyZS8+CisJCQk8Q3VycmVuY3lDb2RlPlVTRDwvQ3VycmVuY3lDb2RlPgorCQkJPERlc2NyaXB0aW9uLz4KKwkJCTxEaXZpc2lvbi8+CisJCQk8SG9tZVBhZ2UvPgorCQkJPEludGVncmF0aW9uSWQvPgorCQkJPExpbmVvZkJ1c2luZXNzLz4KKwkJCTxMb2NhdGlvbi8+CisJCQk8TmFtZT5EZW1vPC9OYW1lPgorCQkJPFByb2plY3ROYW1lLz4KKwkJCTxUeXBlPkNvbW1lcmNpYWw8L1R5cGU+CisJCQk8TGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb24+CisJCQkJPEFjY291bnRfT3JnYW5pemF0aW9uIElzUHJpbWFyeU1WRz0iWSI+CisJCQkJCTxJbnRlZ3JhdGlvbklkLz4KKwkJCQkJPE9yZ2FuaXphdGlvbj5EZWZhdWx0IE9yZ2FuaXphdGlvbjwvT3JnYW5pemF0aW9uPgorCQkJCTwvQWNjb3VudF9Pcmdhbml6YXRpb24+CisJCQk8L0xpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uPgorCQkJPExpc3RPZkFjY291bnRBdHRhY2htZW50Lz4KKwkJCTxMaXN0T2ZCdXNpbmVzc0FkZHJlc3M+CisJCQkJPEJ1c2luZXNzQWRkcmVzcz4KKwkJCQkJPEFkZHJlc3NOYW1lPk5ZPC9BZGRyZXNzTmFtZT4KKwkJCQkJPENpdHk+Tlk8L0NpdHk+CisJCQkJCTxDb3VudHJ5PlVTQTwvQ291bnRyeT4KKwkJCQkJPEZheE51bWJlcj45ODc2NTQzMjExPC9GYXhOdW1iZXI+CisJCQkJCTxJbnRlZ3JhdGlvbklkLz4KKwkJCQkJPFBob25lTnVtYmVyPjEyMzQ1Njc4OTA8L1Bob25lTnVtYmVyPgorCQkJCQk8UG9zdGFsQ29kZT4wNzMwMTwvUG9zdGFsQ29kZT4KKwkJCQkJPFByb3ZpbmNlLz4KKwkJCQkJPFN0YXRlPk5ZPC9TdGF0ZT4KKwkJCQkJPFN0cmVldEFkZHJlc3M+MiBNYWRpc2lvbiBTcXVhcmU8L1N0cmVldEFkZHJlc3M+CisJCQkJPC9CdXNpbmVzc0FkZHJlc3M+CisJCQk8L0xpc3RPZkJ1c2luZXNzQWRkcmVzcz4KKwkJCTxMaXN0T2ZDb250YWN0Lz4KKwkJPC9BY2NvdW50PgorCTwvTGlzdE9mU2FtcGxlQWNjb3VudD4KKzwvU2llYmVsTWVzc2FnZT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvQWRkX0FjY3RTaWViZWw3LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY2YjZmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9BZGRfQWNjdFNpZWJlbDcueHNkCkBAIC0wLDAgKzEsMjI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8IS0tVzNDIFNjaGVtYSBnZW5lcmF0ZWQgYnkgWE1MIFNweSB2NC40IFUgKGh0dHA6Ly93d3cueG1sc3B5LmNvbSktLT4KKzx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJTaWViZWxNZXNzYWdlIj4KKwkgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOnNlcXVlbmNlPgorCQkJICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2FtcGxlQWNjb3VudCIgdHlwZT0iTGlzdE9mU2FtcGxlQWNjb3VudF90eXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJNZXNzYWdlSWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Ik1lc3NhZ2VUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJbnRPYmplY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBmaXhlZD0iU2FtcGxlIEFjY291bnQiLz4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IkludE9iamVjdEZvcm1hdCIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTYW1wbGVBY2NvdW50X3R5cGUiPgorCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudCIgdHlwZT0iQWNjb3VudF90eXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisKKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfdHlwZSI+CisJCSA8eHNkOnNlcXVlbmNlPgorCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJTeXN0ZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvLS0+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkN1bHR1cmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpdmlzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG9tZVBhZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVncmF0aW9uSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lb2ZCdXNpbmVzcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKworCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKworCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50X09yZ2FuaXphdGlvbiIgdHlwZT0iTGlzdE9mQWNjb3VudF9Pcmdhbml6YXRpb25fdHlwZSIgbWluT2NjdXJzPSIwIi8+CisKKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWNjb3VudEF0dGFjaG1lbnQiIHR5cGU9Ikxpc3RPZkFjY291bnRBdHRhY2htZW50X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBY2NvdW50QXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8tLT4KKworCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZCdXNpbmVzc0FkZHJlc3MiIHR5cGU9Ikxpc3RPZkJ1c2luZXNzQWRkcmVzc190eXBlIiBtaW5PY2N1cnM9IjAiLz4KKworCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJMaXN0T2ZDb250YWN0X3R5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTwhLS14c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLy0tPgorCisJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlN1YkFjY291bnQiIHR5cGU9Ikxpc3RPZlN1YkFjY291bnRfdHlwZSIgbWluT2NjdXJzPSIwIi8+CisJCSAgPC94c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFjY291bnRfT3JnYW5pemF0aW9uX3R5cGUiPgorCSAgCTx4c2Q6c2VxdWVuY2U+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRfT3JnYW5pemF0aW9uIiB0eXBlPSJBY2NvdW50X09yZ2FuaXphdGlvbl90eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkgIDwveHNkOmNvbXBsZXhUeXBlPgorCisJICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFjY291bnRBdHRhY2htZW50X3R5cGUiPgorCQkgIDx4c2Q6c2VxdWVuY2U+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRBdHRhY2htZW50IiB0eXBlPSJBY2NvdW50QXR0YWNobWVudF90eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCSAgPC94c2Q6c2VxdWVuY2U+CisJICA8L3hzZDpjb21wbGV4VHlwZT4KKworCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZCdXNpbmVzc0FkZHJlc3NfdHlwZSI+CisJCSAgPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnVzaW5lc3NBZGRyZXNzIiB0eXBlPSJCdXNpbmVzc0FkZHJlc3NfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkgIDwveHNkOnNlcXVlbmNlPgorCSAgPC94c2Q6Y29tcGxleFR5cGU+CisKKwkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdF90eXBlIj4KKwkgIAk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0IiB0eXBlPSJDb250YWN0X3R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCSAgPC94c2Q6Y29tcGxleFR5cGU+CisKKwkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSI+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0X0J1c2luZXNzQWRkcmVzcyIgdHlwZT0iQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJICA8L3hzZDpjb21wbGV4VHlwZT4KKworCSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdWJBY2NvdW50X3R5cGUiPgorCQkgPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQWNjb3VudCIgdHlwZT0iU3ViQWNjb3VudF90eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCSA8L3hzZDpzZXF1ZW5jZT4KKwkgIDwveHNkOmNvbXBsZXhUeXBlPgorCisJICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRBdHRhY2htZW50X3R5cGUiID4KKwkJICA8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NudEZpbGVFeHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NudEZpbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCSAgPC94c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisKKworCSA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRfT3JnYW5pemF0aW9uX3R5cGUiPgorCQkgPHhzZDpzZXF1ZW5jZT4KKwkJCSA8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkgPHhzZDplbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCSA8L3hzZDpzZXF1ZW5jZT4KKwkJIDx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJIDwveHNkOmNvbXBsZXhUeXBlPgorCisKKwkgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc0FkZHJlc3NfdHlwZSI+CisJCSA8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRyZXNzTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRmF4TnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBob25lTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb3ZpbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RhdGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJlZXRBZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisKKworCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdF90eXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2VsbHVsYXJQaG9uZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW1lbnQyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRmlyc3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG9tZVBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkpvYlRpdGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGFzdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNaWRkbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3JnYW5pemF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyc29uYWxDb250YWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdF9CdXNpbmVzc0FkZHJlc3MiIHR5cGU9Ikxpc3RPZkNvbnRhY3RfQnVzaW5lc3NBZGRyZXNzX3R5cGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlYXJjaHNwZWMiIHR5cGU9InhzZDpzdHJpbmciLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKworCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdF9CdXNpbmVzc0FkZHJlc3NfdHlwZSI+CisJCSA8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmVldEFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJlZXRBZGRyZXNzMiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZHJlc3NOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZWdyYXRpb25JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzUHJpbWFyeU1WRyIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWFyY2hzcGVjIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCisJICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1YkFjY291bnRfdHlwZSI+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNyZWF0ZWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVcGRhdGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZmxpY3RJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1vZElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudFN0YXR1czIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbGlhczIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXJlYUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50Q291bnRyeUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDU04yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tcGV0aXRvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5Q29kZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGl2aXNpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHcm91cFR5cGVDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJuYWxPcmdGbGFnIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbkxldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFpbkZheE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5QaG9uZU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50RGl2aXNpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50SWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50TG9jYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJlbnRBY2NvdW50TG9jYXRpb25MZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcmVudEFjY291bnROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFyZW50QWNjb3VudFJlZ2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5VHlwZUNvZGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVVJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlJbmR1c3RyeUlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeU9yZ2FuaXphdGlvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVBvc2l0aW9uSWQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5U2VydmljZUFncmVlbWVudElkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJpbWFyeVN5bm9ueW1JZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZ2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlMtU0luc3RhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUy1TSW5zdGFuY2VJZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IlMtU0tleUlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VhcmNoc3BlYyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAJPC94c2Q6Y29tcGxleFR5cGU+CisKKworPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9BZGRDdXN0b21lcl9yZXF1ZXN0LnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfQWRkQ3VzdG9tZXJfcmVxdWVzdC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiNWFmOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfQWRkQ3VzdG9tZXJfcmVxdWVzdC54c2QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisKKworICA8eHNkOmVsZW1lbnQgbmFtZT0iSW5wdXQiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1ROQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRE9CIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvREJNUzFfQWRkQ3VzdG9tZXJfcmVzcG9uc2UueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjRmY2UKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0FkZEN1c3RvbWVyX3Jlc3BvbnNlLnhzZApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKworCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSb3dzQWZmZWN0ZWQiIHR5cGU9InhzZDppbnQiLz4KKworPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9HZXRBbGxDdXN0b21lcnNfcmVzcG9uc2UueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9EQk1TMV9HZXRBbGxDdXN0b21lcnNfcmVzcG9uc2UueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2UzZGUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0RCTVMxX0dldEFsbEN1c3RvbWVyc19yZXNwb25zZS54c2QKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisKKworICA8eHNkOmVsZW1lbnQgbmFtZT0iUm93cyI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSb3ciIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUREUkVTUzEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFERFJFU1MyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBRERSRVNTMyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ0lUWSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09VTlRSWSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRE9CIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVNQUlMIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGQVgiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZJUlNUTkFNRSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTEFTVE5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1JRERMRU5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBIT05FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQT1NUQUxDT0RFIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWNkYzVjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ISVBBQTI3MC54bWwKQEAgLTAsMCArMSwyNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8IURPQ1RZUEUgSElQQUEyNzA+Cis8SElQQUEyNzA+CisgIDxJU0E+CisgICAgPF8wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+MDA8L18wMV9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uX1F1YWxpZmllcl8+CisgICAgPF8wMl9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDJfQXV0aG9yaXphdGlvbl9JbmZvcm1hdGlvbl8+CisgICAgPF8wM19TZWN1cml0eV9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfPjAwPC9fMDNfU2VjdXJpdHlfSW5mb3JtYXRpb25fUXVhbGlmaWVyXz4KKyAgICA8XzA0X1NlY3VyaXR5X0luZm9ybWF0aW9uXz4xMjM0NTY3ODkwPC9fMDRfU2VjdXJpdHlfSW5mb3JtYXRpb25fPgorICAgIDxfMDVfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz5aWjwvXzA1X0ludGVyY2hhbmdlX0lEX1F1YWxpZmllcl8+CisgICAgPF8wNl9JbnRlcmNoYW5nZV9TZW5kZXJfSURfPlNVQk1JVFRFUlMgSUQxMjwvXzA2X0ludGVyY2hhbmdlX1NlbmRlcl9JRF8+CisgICAgPF8wN19JbnRlcmNoYW5nZV9JRF9RdWFsaWZpZXJfPlpaPC9fMDdfSW50ZXJjaGFuZ2VfSURfUXVhbGlmaWVyXz4KKyAgICA8XzA4X0ludGVyY2hhbmdlX1JlY2VpdmVyX0lEXz5SRUNFSVZFUlMgSUQxMjM8L18wOF9JbnRlcmNoYW5nZV9SZWNlaXZlcl9JRF8+CisgICAgPF8wOV9JbnRlcmNoYW5nZV9EYXRlXz4wMTAxMjI8L18wOV9JbnRlcmNoYW5nZV9EYXRlXz4KKyAgICA8XzEwX0ludGVyY2hhbmdlX1RpbWVfPjEyNTM8L18xMF9JbnRlcmNoYW5nZV9UaW1lXz4KKyAgICA8XzExX1JlcGV0aXRpb25fU2VwYXJhdG9yXz5VPC9fMTFfUmVwZXRpdGlvbl9TZXBhcmF0b3JfPgorICAgIDxfMTJfSW50ZXJjaGFuZ2VfQ29udHJvbF9WZXJzaW9uX051bWJlcl8+MDA0MDE8L18xMl9JbnRlcmNoYW5nZV9Db250cm9sX1ZlcnNpb25fTnVtYmVyXz4KKyAgICA8XzEzX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18xM19JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+CisgICAgPF8xNF9BY2tub3dsZWRnZW1lbnRfUmVxdWVzdGVkXz4xPC9fMTRfQWNrbm93bGVkZ2VtZW50X1JlcXVlc3RlZF8+CisgICAgPF8xNV9Vc2FnZV9JbmRpY2F0b3JfPlQ8L18xNV9Vc2FnZV9JbmRpY2F0b3JfPgorICAgIDxfMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz46PC9fMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXz4KKyAgPC9JU0E+CisgIDxHUz4KKyAgICA8XzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz5IUzwvXzAxX0Z1bmN0aW9uYWxfSWRlbnRpZmllcl9Db2RlXz4KKyAgICA8XzAyX0FwcGxpY2F0aW9uX1NlbmRlcnNfQ29kZV8+U2VuZGVySUQ8L18wMl9BcHBsaWNhdGlvbl9TZW5kZXJzX0NvZGVfPgorICAgIDxfMDNfQXBwbGljYXRpb25fUmVjZWl2ZXJzX0NvZGVfPlJlY2VpdmVySUQ8L18wM19BcHBsaWNhdGlvbl9SZWNlaXZlcnNfQ29kZV8+CisgICAgPF8wNF9EYXRlXz4yMDAxMDEyMjwvXzA0X0RhdGVfPgorICAgIDxfMDVfVGltZV8+MTMxMDwvXzA1X1RpbWVfPgorICAgIDxfMDZfR3JvdXBfQ29udHJvbF9OdW1iZXJfPjE8L18wNl9Hcm91cF9Db250cm9sX051bWJlcl8+CisgICAgPF8wN19SZXNwb25zaWJsZV9BZ2VuY3lfQ29kZV8+WDwvXzA3X1Jlc3BvbnNpYmxlX0FnZW5jeV9Db2RlXz4KKyAgICA8XzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+MDA0MDEwWDA5MjwvXzA4X1ZlcnNpb25fX1JlbGVhc2VfX0luZHVzdHJ5X0lkZW50aWZpZXJfQ29kZV8+CisgIDwvR1M+CisgIDxfMjcwPgorICAgIDxTVD4KKyAgICAgIDxfMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+MjcwPC9fMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8+CisgICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+CisgICAgPC9TVD4KKyAgICA8QkhUPgorICAgICAgPF8wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPjAwMjI8L18wMV9IaWVyYXJjaGljYWxfU3RydWN0dXJlX0NvZGVfPgorICAgICAgPF8wMl9UcmFuc2FjdGlvbl9TZXRfUHVycG9zZV9Db2RlXz4xMzwvXzAyX1RyYW5zYWN0aW9uX1NldF9QdXJwb3NlX0NvZGVfPgorICAgICAgPF8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPjEwMDAxMjM0PC9fMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KKyAgICAgIDxfMDRfRGF0ZV8+MTk5OTA1MDE8L18wNF9EYXRlXz4KKyAgICAgIDxfMDVfVGltZV8+MTMxOTwvXzA1X1RpbWVfPgorICAgICAgPF8wNl9UcmFuc2FjdGlvbl9UeXBlX0NvZGVfLz4KKyAgICA8L0JIVD4KKyAgICA8XzIwMDBBPgorICAgICAgPEhMPgorICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjE8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KKyAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8vPgorICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMDwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KKyAgICAgICAgPF8wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+MTwvXzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4KKyAgICAgIDwvSEw+CisgICAgICA8XzIxMDBBPgorICAgICAgICA8Tk0xPgorICAgICAgICAgIDxfMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+UFI8L18wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz4KKyAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MjwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+CisgICAgICAgICAgPF8wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPkFCQ0NPTVBBTlk8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgorICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8vPgorICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KKyAgICAgICAgICA8XzA2X05hbWVfUHJlZml4Xy8+CisgICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgorICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlBJPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgorICAgICAgICAgIDxfMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+ODQyNjEwMDAxPC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+CisgICAgICAgIDwvTk0xPgorICAgICAgPC9fMjEwMEE+CisgICAgICA8XzIwMDBCPgorICAgICAgICA8SEw+CisgICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4yPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+CisgICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MTwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KKyAgICAgICAgICA8XzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4yMTwvXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXz4KKyAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgorICAgICAgICA8L0hMPgorICAgICAgICA8XzIxMDBCPgorICAgICAgICAgIDxOTTE+CisgICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjFQPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+CisgICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+CisgICAgICAgICAgICA8XzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+Sk9ORVM8L18wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfPgorICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJDVVM8L18wNF9OYW1lX0ZpcnN0Xz4KKyAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfLz4KKyAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KKyAgICAgICAgICAgIDxfMDdfTmFtZV9TdWZmaXhfLz4KKyAgICAgICAgICAgIDxfMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPlNWPC9fMDhfSWRlbnRpZmljYXRpb25fQ29kZV9RdWFsaWZpZXJfPgorICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4wMjAyMDM0PC9fMDlfSWRlbnRpZmljYXRpb25fQ29kZV8+CisgICAgICAgICAgPC9OTTE+CisgICAgICAgICAgPFJFRj4KKyAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+TjU8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KKyAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4xMjk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgorICAgICAgICAgICAgPF8wM19EZXNjcmlwdGlvbl8vPgorICAgICAgICAgIDwvUkVGPgorICAgICAgICAgIDxOMz4KKyAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+NTUgSElHSCBTVFJFRVQ8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KKyAgICAgICAgICAgIDxfMDJfQWRkcmVzc19JbmZvcm1hdGlvbl8vPgorICAgICAgICAgIDwvTjM+CisgICAgICAgICAgPE40PgorICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlNFQVRUTEU8L18wMV9DaXR5X05hbWVfPgorICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5XQTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgorICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+OTgxMjM8L18wM19Qb3N0YWxfQ29kZV8+CisgICAgICAgICAgICA8XzA0X0NvdW50cnlfQ29kZV8vPgorICAgICAgICAgIDwvTjQ+CisgICAgICAgICAgPFBFUj4KKyAgICAgICAgICAgIDxfMDFfQ29udGFjdF9GdW5jdGlvbl9Db2RlXz5JQzwvXzAxX0NvbnRhY3RfRnVuY3Rpb25fQ29kZV8+CisgICAgICAgICAgICA8XzAyX05hbWVfPk1BUllNVVJQSFk8L18wMl9OYW1lXz4KKyAgICAgICAgICAgIDxfMDNfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz5URTwvXzAzX0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+CisgICAgICAgICAgICA8XzA0X0NvbW11bmljYXRpb25fTnVtYmVyXz4yMDY1NTUxMjEyPC9fMDRfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPgorICAgICAgICAgICAgPF8wNV9Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPkVYPC9fMDVfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXz4KKyAgICAgICAgICAgIDxfMDZfQ29tbXVuaWNhdGlvbl9OdW1iZXJfPjM2OTQ8L18wNl9Db21tdW5pY2F0aW9uX051bWJlcl8+CisgICAgICAgICAgICA8XzA3X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8+Rlg8L18wN19Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfPgorICAgICAgICAgICAgPF8wOF9Db21tdW5pY2F0aW9uX051bWJlcl8+MjA2NTU1MTIxNDwvXzA4X0NvbW11bmljYXRpb25fTnVtYmVyXz4KKyAgICAgICAgICA8L1BFUj4KKyAgICAgICAgPC9fMjEwMEI+CisgICAgICAgIDxfMjAwMEM+CisgICAgICAgICAgPEhMPgorICAgICAgICAgICAgPF8wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4zPC9fMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8+CisgICAgICAgICAgICA8XzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4yPC9fMDJfSGllcmFyY2hpY2FsX1BhcmVudF9JRF9OdW1iZXJfPgorICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjI8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+CisgICAgICAgICAgICA8XzA0X0hpZXJhcmNoaWNhbF9DaGlsZF9Db2RlXz4xPC9fMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPgorICAgICAgICAgIDwvSEw+CisgICAgICAgICAgPFRSTj4KKyAgICAgICAgICAgIDxfMDFfVHJhY2VfVHlwZV9Db2RlXz4xPC9fMDFfVHJhY2VfVHlwZV9Db2RlXz4KKyAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz45MzE3NS0wMTI1NDc8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgorICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgorICAgICAgICAgICAgPF8wNF9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fLz4KKyAgICAgICAgICA8L1RSTj4KKyAgICAgICAgICA8XzIxMDBDPgorICAgICAgICAgICAgPE5NMT4KKyAgICAgICAgICAgICAgPF8wMV9FbnRpdHlfSWRlbnRpZmllcl9Db2RlXz5JTDwvXzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPgorICAgICAgICAgICAgICA8XzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+MTwvXzAyX0VudGl0eV9UeXBlX1F1YWxpZmllcl8+CisgICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+CisgICAgICAgICAgICAgIDxfMDRfTmFtZV9GaXJzdF8+Uk9CRVJUPC9fMDRfTmFtZV9GaXJzdF8+CisgICAgICAgICAgICAgIDxfMDVfTmFtZV9NaWRkbGVfPkI8L18wNV9OYW1lX01pZGRsZV8+CisgICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KKyAgICAgICAgICAgICAgPF8wN19OYW1lX1N1ZmZpeF8vPgorICAgICAgICAgICAgICA8XzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz5NSTwvXzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXz4KKyAgICAgICAgICAgICAgPF8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXz4xMTEyMjMzMzMwMTwvXzA5X0lkZW50aWZpY2F0aW9uX0NvZGVfPgorICAgICAgICAgICAgPC9OTTE+CisgICAgICAgICAgICA8UkVGPgorICAgICAgICAgICAgICA8XzAxX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl9RdWFsaWZpZXJfPjFMPC9fMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+CisgICAgICAgICAgICAgIDxfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz41OTkxMTk8L18wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fPgorICAgICAgICAgICAgPC9SRUY+CisgICAgICAgICAgICA8TjM+CisgICAgICAgICAgICAgIDxfMDFfQWRkcmVzc19JbmZvcm1hdGlvbl8+MjkgRlJFTU9OVCBTVDwvXzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPgorICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgorICAgICAgICAgICAgPC9OMz4KKyAgICAgICAgICAgIDxOND4KKyAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KKyAgICAgICAgICAgICAgPF8wMl9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXz5OWTwvXzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPgorICAgICAgICAgICAgICA8XzAzX1Bvc3RhbF9Db2RlXz4xMDAyMzwvXzAzX1Bvc3RhbF9Db2RlXz4KKyAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KKyAgICAgICAgICAgIDwvTjQ+CisgICAgICAgICAgICA8RE1HPgorICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgorICAgICAgICAgICAgICA8XzAyX0RhdGVfVGltZV9QZXJpb2RfPjE5NDMwNTE5PC9fMDJfRGF0ZV9UaW1lX1BlcmlvZF8+CisgICAgICAgICAgICAgIDxfMDNfR2VuZGVyX0NvZGVfPk08L18wM19HZW5kZXJfQ29kZV8+CisgICAgICAgICAgICA8L0RNRz4KKyAgICAgICAgICA8L18yMTAwQz4KKyAgICAgICAgICA8XzIwMDBEPgorICAgICAgICAgICAgPEhMPgorICAgICAgICAgICAgICA8XzAxX0hpZXJhcmNoaWNhbF9JRF9OdW1iZXJfPjQ8L18wMV9IaWVyYXJjaGljYWxfSURfTnVtYmVyXz4KKyAgICAgICAgICAgICAgPF8wMl9IaWVyYXJjaGljYWxfUGFyZW50X0lEX051bWJlcl8+MzwvXzAyX0hpZXJhcmNoaWNhbF9QYXJlbnRfSURfTnVtYmVyXz4KKyAgICAgICAgICAgICAgPF8wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+MjM8L18wM19IaWVyYXJjaGljYWxfTGV2ZWxfQ29kZV8+CisgICAgICAgICAgICAgIDxfMDRfSGllcmFyY2hpY2FsX0NoaWxkX0NvZGVfPjA8L18wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8+CisgICAgICAgICAgICA8L0hMPgorICAgICAgICAgICAgPFRSTj4KKyAgICAgICAgICAgICAgPF8wMV9UcmFjZV9UeXBlX0NvZGVfPjE8L18wMV9UcmFjZV9UeXBlX0NvZGVfPgorICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+OTMxNzUtMDEyNTQ3PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KKyAgICAgICAgICAgICAgPF8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPjk4NzcyODEyMzQ8L18wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfPgorICAgICAgICAgICAgICA8XzA0X1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+UkFESU9MT0dZPC9fMDRfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KKyAgICAgICAgICAgIDwvVFJOPgorICAgICAgICAgICAgPF8yMTAwRD4KKyAgICAgICAgICAgICAgPE5NMT4KKyAgICAgICAgICAgICAgICA8XzAxX0VudGl0eV9JZGVudGlmaWVyX0NvZGVfPjAzPC9fMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8+CisgICAgICAgICAgICAgICAgPF8wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPjE8L18wMl9FbnRpdHlfVHlwZV9RdWFsaWZpZXJfPgorICAgICAgICAgICAgICAgIDxfMDNfTmFtZV9MYXN0X29yX09yZ2FuaXphdGlvbl9OYW1lXz5TTUlUSDwvXzAzX05hbWVfTGFzdF9vcl9Pcmdhbml6YXRpb25fTmFtZV8+CisgICAgICAgICAgICAgICAgPF8wNF9OYW1lX0ZpcnN0Xz5NQVJZTE9VPC9fMDRfTmFtZV9GaXJzdF8+CisgICAgICAgICAgICAgICAgPF8wNV9OYW1lX01pZGRsZV8vPgorICAgICAgICAgICAgICAgIDxfMDZfTmFtZV9QcmVmaXhfLz4KKyAgICAgICAgICAgICAgICA8XzA3X05hbWVfU3VmZml4Xy8+CisgICAgICAgICAgICAgIDwvTk0xPgorICAgICAgICAgICAgICA8UkVGPgorICAgICAgICAgICAgICAgIDxfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8+U1k8L18wMV9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXz4KKyAgICAgICAgICAgICAgICA8XzAyX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8+MDAzMjIxMjM0PC9fMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXz4KKyAgICAgICAgICAgICAgPC9SRUY+CisgICAgICAgICAgICAgIDxOMz4KKyAgICAgICAgICAgICAgICA8XzAxX0FkZHJlc3NfSW5mb3JtYXRpb25fPjI5IEZSRU1PTlQgU1Q8L18wMV9BZGRyZXNzX0luZm9ybWF0aW9uXz4KKyAgICAgICAgICAgICAgICA8XzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPkFQVCMgMTwvXzAyX0FkZHJlc3NfSW5mb3JtYXRpb25fPgorICAgICAgICAgICAgICA8L04zPgorICAgICAgICAgICAgICA8TjQ+CisgICAgICAgICAgICAgICAgPF8wMV9DaXR5X05hbWVfPlBFQUNFPC9fMDFfQ2l0eV9OYW1lXz4KKyAgICAgICAgICAgICAgICA8XzAyX1N0YXRlX29yX1Byb3ZpbmNlX0NvZGVfPk5ZPC9fMDJfU3RhdGVfb3JfUHJvdmluY2VfQ29kZV8+CisgICAgICAgICAgICAgICAgPF8wM19Qb3N0YWxfQ29kZV8+MTAwMjM8L18wM19Qb3N0YWxfQ29kZV8+CisgICAgICAgICAgICAgICAgPF8wNF9Db3VudHJ5X0NvZGVfLz4KKyAgICAgICAgICAgICAgPC9OND4KKyAgICAgICAgICAgICAgPERNRz4KKyAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+RDg8L18wMV9EYXRlX1RpbWVfUGVyaW9kX0Zvcm1hdF9RdWFsaWZpZXJfPgorICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF8+MTk3ODEwMTQ8L18wMl9EYXRlX1RpbWVfUGVyaW9kXz4KKyAgICAgICAgICAgICAgICA8XzAzX0dlbmRlcl9Db2RlXz5GPC9fMDNfR2VuZGVyX0NvZGVfPgorICAgICAgICAgICAgICA8L0RNRz4KKyAgICAgICAgICAgICAgPElOUz4KKyAgICAgICAgICAgICAgICA8XzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+TjwvXzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8+CisgICAgICAgICAgICAgICAgPF8wMl9JbmRpdmlkdWFsX1JlbGF0aW9uc2hpcF9Db2RlXz4xOTwvXzAyX0luZGl2aWR1YWxfUmVsYXRpb25zaGlwX0NvZGVfPgorICAgICAgICAgICAgICAgIDxfMDNfTWFpbnRlbmFuY2VfVHlwZV9Db2RlXy8+CisgICAgICAgICAgICAgICAgPF8wNF9NYWludGVuYW5jZV9SZWFzb25fQ29kZV8vPgorICAgICAgICAgICAgICAgIDxfMDVfQmVuZWZpdF9TdGF0dXNfQ29kZV8vPgorICAgICAgICAgICAgICAgIDxfMDZfTWVkaWNhcmVfU3RhdHVzX0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8XzA3X0NvbnNvbGlkYXRlZF9PbW5pYnVzX0J1ZGdldF9SZWNvbmNpbGlhdGlvbl9BY3RfX0NPQlJBX19RdWFsaWZ5aW5nX0V2ZW50X0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8XzA4X0VtcGxveW1lbnRfU3RhdHVzX0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8XzA5X1N0dWRlbnRfU3RhdHVzX0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8XzEwX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8vPgorICAgICAgICAgICAgICAgIDxfMTFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXy8+CisgICAgICAgICAgICAgICAgPF8xMl9EYXRlX1RpbWVfUGVyaW9kXy8+CisgICAgICAgICAgICAgICAgPF8xM19Db25maWRlbnRpYWxpdHlfQ29kZV8vPgorICAgICAgICAgICAgICAgIDxfMTRfQ2l0eV9OYW1lXy8+CisgICAgICAgICAgICAgICAgPF8xNV9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXy8+CisgICAgICAgICAgICAgICAgPF8xNl9Db3VudHJ5X0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8XzE3X051bWJlcl8vPgorICAgICAgICAgICAgICA8L0lOUz4KKyAgICAgICAgICAgICAgPERUUD4KKyAgICAgICAgICAgICAgICA8XzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPjQ3MjwvXzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfPgorICAgICAgICAgICAgICAgIDxfMDJfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXz5EODwvXzAyX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8+CisgICAgICAgICAgICAgICAgPF8wM19EYXRlX1RpbWVfUGVyaW9kXz4xOTk5MDUwMTwvXzAzX0RhdGVfVGltZV9QZXJpb2RfPgorICAgICAgICAgICAgICA8L0RUUD4KKyAgICAgICAgICAgICAgPF8yMTEwRD4KKyAgICAgICAgICAgICAgICA8RVE+CisgICAgICAgICAgICAgICAgICA8XzAxX1NlcnZpY2VfVHlwZV9Db2RlXz44MTwvXzAxX1NlcnZpY2VfVHlwZV9Db2RlXz4KKyAgICAgICAgICAgICAgICAgIDxfMDJfQ29tcG9zaXRlX01lZGljYWxfUHJvY2VkdXJlX0lkZW50aWZpZXJfLz4KKyAgICAgICAgICAgICAgICAgIDxfMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+RkFNPC9fMDNfQ292ZXJhZ2VfTGV2ZWxfQ29kZV8+CisgICAgICAgICAgICAgICAgICA8XzA0X0luc3VyYW5jZV9UeXBlX0NvZGVfLz4KKyAgICAgICAgICAgICAgICA8L0VRPgorICAgICAgICAgICAgICA8L18yMTEwRD4KKyAgICAgICAgICAgIDwvXzIxMDBEPgorICAgICAgICAgIDwvXzIwMDBEPgorICAgICAgICA8L18yMDAwQz4KKyAgICAgIDwvXzIwMDBCPgorICAgIDwvXzIwMDBBPgorICAgIDxTRT4KKyAgICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX1NlZ21lbnRzXz4yODwvXzAxX051bWJlcl9vZl9JbmNsdWRlZF9TZWdtZW50c18+CisgICAgICA8XzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+MTIzNDwvXzAyX1RyYW5zYWN0aW9uX1NldF9Db250cm9sX051bWJlcl8+CisgICAgPC9TRT4KKyAgPC9fMjcwPgorICA8R0U+CisgICAgPF8wMV9OdW1iZXJfb2ZfVHJhbnNhY3Rpb25fU2V0c19JbmNsdWRlZF8+MTwvXzAxX051bWJlcl9vZl9UcmFuc2FjdGlvbl9TZXRzX0luY2x1ZGVkXz4KKyAgICA8XzAyX0dyb3VwX0NvbnRyb2xfTnVtYmVyXz4xPC9fMDJfR3JvdXBfQ29udHJvbF9OdW1iZXJfPgorICA8L0dFPgorICA8SUVBPgorICAgIDxfMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4xPC9fMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXz4KKyAgICA8XzAyX0ludGVyY2hhbmdlX0NvbnRyb2xfTnVtYmVyXz4wMDAwMDA5MDU8L18wMl9JbnRlcmNoYW5nZV9Db250cm9sX051bWJlcl8+CisgIDwvSUVBPgorPC9ISVBBQTI3MD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSElQQUEyNzAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzc4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hJUEFBMjcwLnhzZApAQCAtMCwwICsxLDM0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorCisKKzx4c2Q6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRE1HVHlwZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfRGF0ZV9UaW1lX1BlcmlvZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfR2VuZGVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRFRQVHlwZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0RhdGVfVGltZV9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0RhdGVfVGltZV9QZXJpb2RfRm9ybWF0X1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfRGF0ZV9UaW1lX1BlcmlvZF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFUVR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9TZXJ2aWNlX1R5cGVfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfQ29tcG9zaXRlX01lZGljYWxfUHJvY2VkdXJlX0lkZW50aWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0NvdmVyYWdlX0xldmVsX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0luc3VyYW5jZV9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJHRSI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfTnVtYmVyX29mX1RyYW5zYWN0aW9uX1NldHNfSW5jbHVkZWRfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9Hcm91cF9Db250cm9sX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJHUyI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRnVuY3Rpb25hbF9JZGVudGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9BcHBsaWNhdGlvbl9TZW5kZXJzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19BcHBsaWNhdGlvbl9SZWNlaXZlcnNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDRfRGF0ZV8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDVfVGltZV8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA2X0dyb3VwX0NvbnRyb2xfTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfUmVzcG9uc2libGVfQWdlbmN5X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOF9WZXJzaW9uX19SZWxlYXNlX19JbmR1c3RyeV9JZGVudGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iSElQQUEyNzAiPgorCQk8eHNkOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KKwkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iSVNBIi8+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iR1MiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMjcwIi8+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iR0UiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJJRUEiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSExUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfSGllcmFyY2hpY2FsX0lEX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfSGllcmFyY2hpY2FsX1BhcmVudF9JRF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0hpZXJhcmNoaWNhbF9MZXZlbF9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9IaWVyYXJjaGljYWxfQ2hpbGRfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9IklFQSI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfTnVtYmVyX29mX0luY2x1ZGVkX0Z1bmN0aW9uYWxfR3JvdXBzXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfSW50ZXJjaGFuZ2VfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklJSVR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9Db2RlX0xpc3RfUXVhbGlmaWVyX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAyX0luZHVzdHJ5X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSU5TVHlwZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfSW5kaXZpZHVhbF9SZWxhdGlvbnNoaXBfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfTWFpbnRlbmFuY2VfVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9NYWludGVuYW5jZV9SZWFzb25fQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfQmVuZWZpdF9TdGF0dXNfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfTWVkaWNhcmVfU3RhdHVzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X0NvbnNvbGlkYXRlZF9PbW5pYnVzX0J1ZGdldF9SZWNvbmNpbGlhdGlvbl9BY3RfX0NPQlJBX19RdWFsaWZ5aW5nX0V2ZW50X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X0VtcGxveW1lbnRfU3RhdHVzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA5X1N0dWRlbnRfU3RhdHVzX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzEwX1llc19Ob19Db25kaXRpb25fb3JfUmVzcG9uc2VfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTFfRGF0ZV9UaW1lX1BlcmlvZF9Gb3JtYXRfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMl9EYXRlX1RpbWVfUGVyaW9kXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xM19Db25maWRlbnRpYWxpdHlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTRfQ2l0eV9OYW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNV9TdGF0ZV9vcl9Qcm92aW5jZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNl9Db3VudHJ5X0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzE3X051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9IklTQSI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQXV0aG9yaXphdGlvbl9JbmZvcm1hdGlvbl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9BdXRob3JpemF0aW9uX0luZm9ybWF0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfU2VjdXJpdHlfSW5mb3JtYXRpb25fUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfU2VjdXJpdHlfSW5mb3JtYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNV9JbnRlcmNoYW5nZV9JRF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9JbnRlcmNoYW5nZV9TZW5kZXJfSURfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wN19JbnRlcmNoYW5nZV9JRF9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOF9JbnRlcmNoYW5nZV9SZWNlaXZlcl9JRF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA5X0ludGVyY2hhbmdlX0RhdGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMF9JbnRlcmNoYW5nZV9UaW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTFfUmVwZXRpdGlvbl9TZXBhcmF0b3JfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xMl9JbnRlcmNoYW5nZV9Db250cm9sX1ZlcnNpb25fTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTNfSW50ZXJjaGFuZ2VfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8xNF9BY2tub3dsZWRnZW1lbnRfUmVxdWVzdGVkXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTVfVXNhZ2VfSW5kaWNhdG9yXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMTZfQ29tcG9uZW50X0VsZW1lbnRfU2VwYXJhdG9yXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94c2Q6c2VxdWVuY2U+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOM1R5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9BZGRyZXNzX0luZm9ybWF0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9BZGRyZXNzX0luZm9ybWF0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik40VHlwZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAxX0NpdHlfTmFtZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfU3RhdGVfb3JfUHJvdmluY2VfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfUG9zdGFsX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X0NvdW50cnlfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOTTFUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfRW50aXR5X0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfRW50aXR5X1R5cGVfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19OYW1lX0xhc3Rfb3JfT3JnYW5pemF0aW9uX05hbWVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X05hbWVfRmlyc3RfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA1X05hbWVfTWlkZGxlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9OYW1lX1ByZWZpeF8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDdfTmFtZV9TdWZmaXhfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X0lkZW50aWZpY2F0aW9uX0NvZGVfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wOV9JZGVudGlmaWNhdGlvbl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBSVlR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9Qcm92aWRlcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IHJlZj0iXzAzX1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSRUZUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzAzX0Rlc2NyaXB0aW9uXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRSTlR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9UcmFjZV9UeXBlX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDJfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wM19PcmlnaW5hdGluZ19Db21wYW55X0lkZW50aWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA0X1JlZmVyZW5jZV9JZGVudGlmaWNhdGlvbl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9UcmFuc2FjdGlvbl9TZXRfQ29udHJvbF9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9Il8wM19SZWZlcmVuY2VfSWRlbnRpZmljYXRpb25fIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9Il8wNF9EYXRlXyIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDVfVGltZV8iIHR5cGU9InhzZDpzdHJpbmciLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iXzI3MCI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNlcXVlbmNlPgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfVHJhbnNhY3Rpb25fU2V0X0lkZW50aWZpZXJfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDJfVHJhbnNhY3Rpb25fU2V0X0NvbnRyb2xfTnVtYmVyXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJIVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfSGllcmFyY2hpY2FsX1N0cnVjdHVyZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfVHJhbnNhY3Rpb25fU2V0X1B1cnBvc2VfQ29kZV8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJfMDNfUmVmZXJlbmNlX0lkZW50aWZpY2F0aW9uXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNF9EYXRlXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wNV9UaW1lXyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDZfVHJhbnNhY3Rpb25fVHlwZV9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwQSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTAwQSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOTTEiIHR5cGU9Ik5NMVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjAwMEIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSEwiIHR5cGU9IkhMVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjEwMEIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTk0xIiB0eXBlPSJOTTFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOMyIgdHlwZT0iTjNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik40IiB0eXBlPSJONFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUEVSIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMV9Db250YWN0X0Z1bmN0aW9uX0NvZGVfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wMl9OYW1lXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDNfQ29tbXVuaWNhdGlvbl9OdW1iZXJfUXVhbGlmaWVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDRfQ29tbXVuaWNhdGlvbl9OdW1iZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNV9Db21tdW5pY2F0aW9uX051bWJlcl9RdWFsaWZpZXJfIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8wNl9Db21tdW5pY2F0aW9uX051bWJlcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA3X0NvbW11bmljYXRpb25fTnVtYmVyX1F1YWxpZmllcl8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzA4X0NvbW11bmljYXRpb25fTnVtYmVyXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBSViIgdHlwZT0iUFJWVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMDAwQyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJITCIgdHlwZT0iSExUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRSTiIgdHlwZT0iVFJOVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjEwMEMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTk0xIiB0eXBlPSJOTTFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJFRiIgdHlwZT0iUkVGVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOMyIgdHlwZT0iTjNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik40IiB0eXBlPSJONFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUFJWIiB0eXBlPSJQUlZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRNRyIgdHlwZT0iRE1HVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJTlMiIHR5cGU9IklOU1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Il8yMTEwQyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFUSIgdHlwZT0iRVFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFNVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfQW1vdW50X1F1YWxpZmllcl9Db2RlXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDJfTW9uZXRhcnlfQW1vdW50XyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IklJSSIgdHlwZT0iSUlJVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRFRQIiB0eXBlPSJEVFBUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KKwkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjAwMEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSEwiIHR5cGU9IkhMVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUUk4iIHR5cGU9IlRSTlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iXzIxMDBEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQkJCQkJCQkJCQkJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5NMSIgdHlwZT0iTk0xVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSRUYiIHR5cGU9IlJFRlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTjMiIHR5cGU9Ik4zVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJONCIgdHlwZT0iTjRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBSViIgdHlwZT0iUFJWVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJETUciIHR5cGU9IkRNR1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSU5TIiB0eXBlPSJJTlNUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRUUCIgdHlwZT0iRFRQVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMjExMEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRVEiIHR5cGU9IkVRVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJSUkiIHR5cGU9IklJSVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUkVGIiB0eXBlPSJSRUZUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRUUCIgdHlwZT0iRFRQVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQkJCQkJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJCQkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJCQkJCQkJCQkJPC94c2Q6ZWxlbWVudD4KKwkJCQkJCQkJCQkJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQkJCQkJCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQkJCQkJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQkJCQkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJCQkJCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJCQkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQkJCQkJPC94c2Q6ZWxlbWVudD4KKwkJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCQk8L3hzZDplbGVtZW50PgorCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJfMDFfTnVtYmVyX29mX0luY2x1ZGVkX1NlZ21lbnRzXyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9Il8wMl9UcmFuc2FjdGlvbl9TZXRfQ29udHJvbF9OdW1iZXJfIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQkJPC94c2Q6ZWxlbWVudD4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9IZWFkZXJzLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjZTBhZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx3b3JrYm9vaz4KKyAgICA8U2hlZXQxPgorICAgICAgICA8cm93PgorICAgICAgICAgICAgPGNvbDE+RklSU1QgTkFNRTwvY29sMT4KKyAgICAgICAgICAgIDxjb2wyPkxBU1QgTkFNRTwvY29sMj4KKyAgICAgICAgICAgIDxjb2wzPlRJVExFPC9jb2wzPgorICAgICAgICAgICAgPGNvbDQ+QUREUkVTUzwvY29sND4KKyAgICAgICAgICAgIDxjb2w1PkNJVFk8L2NvbDU+CisgICAgICAgICAgICA8Y29sNj5TVEFURTwvY29sNj4KKyAgICAgICAgICAgIDxjb2w3PkNPVU5UUlk8L2NvbDc+CisgICAgICAgIDwvcm93PgorICAgICAgICA8cm93PgorICAgICAgICAgICAgPGNvbDE+UGF1bDwvY29sMT4KKyAgICAgICAgICAgIDxjb2wyPkZlYXJvbjwvY29sMj4KKyAgICAgICAgICAgIDxjb2wzPk1yPC9jb2wzPgorICAgICAgICAgICAgPGNvbDQ+MiBQZW5uIFBsYXphPC9jb2w0PgorICAgICAgICAgICAgPGNvbDU+TmV3IFlvcms8L2NvbDU+CisgICAgICAgICAgICA8Y29sNj5OZXcgWW9yazwvY29sNj4KKyAgICAgICAgICAgIDxjb2w3PlVTQTwvY29sNz4KKyAgICAgICAgPC9yb3c+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgICA8Y29sMT5KZWZmPC9jb2wxPgorICAgICAgICAgICAgPGNvbDI+UGFvbGV0dGk8L2NvbDI+CisgICAgICAgICAgICA8Y29sMz5TaXI8L2NvbDM+CisgICAgICAgICAgICA8Y29sND4yIFBlbm4gUGxhemE8L2NvbDQ+CisgICAgICAgICAgICA8Y29sNT5OZXcgWW9yazwvY29sNT4KKyAgICAgICAgICAgIDxjb2w2Pk5ldyBZb3JrPC9jb2w2PgorICAgICAgICAgICAgPGNvbDc+VVNBPC9jb2w3PgorICAgICAgICA8L3Jvdz4KKyAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxjb2wxPkpvbmF0aG9uPC9jb2wxPgorICAgICAgICAgICAgPGNvbDI+UGxhdHQ8L2NvbDI+CisgICAgICAgICAgICA8Y29sMz5Mb3JkPC9jb2wzPgorICAgICAgICAgICAgPGNvbDQ+V2VtYmxleSBQb2ludCwgSGFycm93IFJvYWQ8L2NvbDQ+CisgICAgICAgICAgICA8Y29sNT5Mb25kb248L2NvbDU+CisgICAgICAgICAgICA8Y29sNj5NSUREWDwvY29sNj4KKyAgICAgICAgICAgIDxjb2w3PlVLPC9jb2w3PgorICAgICAgICA8L3Jvdz4KKyAgICAgICAgPHJvdz4KKyAgICAgICAgICAgIDxjb2wxPkVpbGVlbjwvY29sMT4KKyAgICAgICAgICAgIDxjb2wyPkFuZGVyc29uPC9jb2wyPgorICAgICAgICAgICAgPGNvbDM+TXJzPC9jb2wzPgorICAgICAgICAgICAgPGNvbDQ+QmVsbGUgUGxhaW48L2NvbDQ+CisgICAgICAgICAgICA8Y29sNT5NYXlwZW48L2NvbDU+CisgICAgICAgICAgICA8Y29sNj5DbGFyZW5kb248L2NvbDY+CisgICAgICAgICAgICA8Y29sNz5KYW1haWNhPC9jb2w3PgorICAgICAgICA8L3Jvdz4KKyAgICA8L1NoZWV0MT4KKzwvd29ya2Jvb2s+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvSGVhZGVycy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMWM2N2YKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L0hlYWRlcnMueHNkCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjMgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJTaGVldDEiPgorCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJyb3ciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29sMSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2wyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbDMiPgorCQk8eHNkOnNpbXBsZVR5cGU+CisJCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvcmQiLz4KKwkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNciIvPgorCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ycyIvPgorCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpciIvPgorCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJVExFIi8+CisJCQk8L3hzZDpyZXN0cmljdGlvbj4KKwkJPC94c2Q6c2ltcGxlVHlwZT4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbDUiIHR5cGU9InhzZDpzdHJpbmciLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29sNiIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb2w3Ij4KKwkJPHhzZDpzaW1wbGVUeXBlPgorCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKwkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVFJZIi8+CisJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFtYWljYSIvPgorCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVLIi8+CisJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBIi8+CisJCQk8L3hzZDpyZXN0cmljdGlvbj4KKwkJPC94c2Q6c2ltcGxlVHlwZT4KKwk8L3hzZDplbGVtZW50PgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb3ciPgorCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2wxIi8+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iY29sMiIvPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDMiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w0Ii8+CisJCQkJPHhzZDplbGVtZW50IHJlZj0iY29sNSIvPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9ImNvbDYiLz4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJjb2w3Ii8+CisJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKwk8eHNkOmVsZW1lbnQgbmFtZT0id29ya2Jvb2siPgorCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQk8eHNkOmVsZW1lbnQgcmVmPSJTaGVldDEiLz4KKwkJCTwveHNkOnNlcXVlbmNlPgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MmE3NQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvUkZDX0NVU1RPTUVSX0dFVC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGRvYzpSRkNfQ1VTVE9NRVJfR0VUIHhtbG5zOmRvYz0idXJuOnNhcC1jb206ZG9jdW1lbnQ6c2FwOmJ1c2luZXNzOnJmYyI+Cis8S1VOTlI+KjwvS1VOTlI+Cis8TkFNRTE+QSo8L05BTUUxPgorPENVU1RPTUVSX1Q+Cis8aXRlbT4KKzxLVU5OUj48L0tVTk5SPgorPEFOUkVEPjwvQU5SRUQ+Cis8TkFNRTE+PC9OQU1FMT4KKzxQRkFDSD48L1BGQUNIPgorPFNUUkFTPjwvU1RSQVM+Cis8UFNUTFo+PC9QU1RMWj4KKzxPUlQwMT48L09SVDAxPgorPFRFTEYxPjwvVEVMRjE+Cis8VEVMRlg+PC9URUxGWD4KKzwvaXRlbT4KKzwvQ1VTVE9NRVJfVD4KKzwvZG9jOlJGQ19DVVNUT01FUl9HRVQ+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9hcHB2aWV3L1JGQ19DVVNUT01FUl9HRVQueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY2ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9SRkNfQ1VTVE9NRVJfR0VULnhzZApAQCAtMCwwICsxLDExNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6ZG9jPSJ1cm46c2FwLWNvbTpkb2N1bWVudAorOnNhcDpidXNpbmVzczpyZmMiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9InVybjpzYXAtY29tOmRvY3VtZW50OnNhcDoKK2J1c2luZXNzOnJmYyI+CisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQlJGQ0tOQTEiPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iS1VOTlIiPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPgorICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBTlJFRCI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+CisgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUxIj4KKyAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz4KKyAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEZBQ0giPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPgorICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVFJBUyI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+CisgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBTVExaIj4KKyAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KKyAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDEiPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPgorICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGMSI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+CisgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRFTEZYIj4KKyAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzEiLz4KKyAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSRkNfQ1VTVE9NRVJfR0VUIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphbGw+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJLVU5OUiIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KKyAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMSIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz4KKyAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDVVNUT01FUl9UIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9ImRvYzpCUkZDS05BMSIgbWluT2NjdXJzPSIwIi8+CisgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmFsbD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzZTAxMwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxERUJNQVMwMT48SURPQyBCRUdJTj0iMSI+PEVESV9EQzQwIFNFR01FTlQ9IjEiPjxUQUJOQU0+RURJX0RDNDA8L1RBQk5BTT48TUFORFQ+ODAwPC9NQU5EVD48RE9DTlVNPjAwMDAwMDAwMDAyMzI5MDQ8L0RPQ05VTT48RE9DUkVMPjQwQjwvRE9DUkVMPjxTVEFUVVM+MzA8L1NUQVRVUz48RElSRUNUPjE8L0RJUkVDVD48T1VUTU9EPjI8L09VVE1PRD48RVhQUlNTLz48VEVTVC8+PElET0NUWVA+REVCTUFTMDE8L0lET0NUWVA+PENJTVRZUC8+PE1FU1RZUD5ERUJNQVM8L01FU1RZUD48TUVTQ09ELz48TUVTRkNULz48U1RELz48U1REVlJTLz48U1RETUVTLz48U05EUE9SPlNBUEk0QjwvU05EUE9SPjxTTkRQUlQ+TFM8L1NORFBSVD48U05EUEZDLz48U05EUFJOPkk0Ql9DTEk4MDA8L1NORFBSTj48U05EU0FELz48U05ETEFELz48UkNWUE9SPkEwMDAwMDAwMzE8L1JDVlBPUj48UkNWUFJUPkxTPC9SQ1ZQUlQ+PFJDVlBGQy8+PFJDVlBSTj5OT05fSlhBPC9SQ1ZQUk4+PFJDVlNBRC8+PFJDVkxBRC8+PENSRURBVD4yMDAyMDcyMjwvQ1JFREFUPjxDUkVUSU0+MTgyOTM5PC9DUkVUSU0+PFJFRklOVC8+PFJFRkdSUC8+PFJFRk1FUy8+PEFSQ0tFWS8+PFNFUklBTD4yMDAyMDcyMjE4MjkzOTwvU0VSSUFMPgorICAgICAgPC9FRElfREM0MD48RTFLTkExTSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48S1VOTlI+MDAwMDAwMDEwMDwvS1VOTlI+PEFOUkVELz48QVVGU0QvPjxCQUhORS8+PEJBSE5TPkT8c3NlbGRvcmYgSEJGPC9CQUhOUz48QkJCTlI+MDAwMDAwMDwvQkJCTlI+PEJCU05SPjAwMDAwPC9CQlNOUj48QkVHUlUvPjxCUlNDSC8+PEJVQktaPjA8L0JVQktaPjxEQVRMVC8+PEZBS1NELz48RklTS04vPjxLTlJaQS8+PEtPTlpTLz48S1RPS0Q+MDAwMTwvS1RPS0Q+PEtVS0xBLz48TEFORDE+REU8L0xBTkQxPjxMSUZOUi8+PExJRlNELz48TE9DQ08vPjxMT0VWTS8+PE5BTUUxPklCSSBRdWFsaXR5IEFzc3VyYW5jZTwvTkFNRTE+PE5BTUUyLz48TkFNRTMvPjxOQU1FNC8+PE5JRUxTLz48T1JUMDE+TmV3IFlvcms8L09SVDAxPjxPUlQwMi8+PFBGQUNILz48UFNUTDIvPjxQU1RMWj4xMDEyMTwvUFNUTFo+PFJFR0lPPjA1PC9SRUdJTz48Q09VTkMvPjxDSVRZQy8+PFJQTUtSLz48U09SVEw+QU08L1NPUlRMPjxTUEVSUi8+PFNQUkFTPkQ8L1NQUkFTPjxTVENEMS8+PFNUQ0QyLz48U1RLWkEvPjxTVEtaVS8+PFNUUkFTPjIgUGVubnN5bHZhbmlhIFBsYXphPC9TVFJBUz48VEVMQlgvPjxURUxGMT4yMTItNzM2LTQ0MzM8L1RFTEYxPjxURUxGMi8+PFRFTEZYPjIxMi03MzYtNDQzNDwvVEVMRlg+PFRFTFRYLz48VEVMWDEvPjxMWk9ORT5EMDAwMDQwMDAwPC9MWk9ORT48WFpFTVAvPjxWQlVORC8+PFNUQ0VHPkRFLTEyMzQ1Njc5PC9TVENFRz48R0ZPUk0vPjxCUkFOMS8+PEJSQU4yLz48QlJBTjMvPjxCUkFONC8+PEJSQU41Lz48VU1KQUg+MDAwMDwvVU1KQUg+PFVXQUVSLz48Sk1aQUg+MDAwMDAwPC9KTVpBSD48Sk1KQUg+MDAwMDwvSk1KQUg+PEtBVFIxLz48S0FUUjIvPjxLQVRSMy8+PEtBVFI0Lz48S0FUUjUvPjxLQVRSNi8+PEtBVFI3Lz48S0FUUjgvPjxLQVRSOS8+PEtBVFIxMC8+PFNUS1pOLz48VU1TQTE+MDwvVU1TQTE+PFRYSkNELz48UEVSSVYvPjxLVE9DRC8+PFBGT1JULz48RFRBTVMvPjxEVEFXUy8+PEhaVU9SPjAwPC9IWlVPUj48Q0lWVkU+WDwvQ0lWVkU+PE1JTFZFLz48U1BSQVNfSVNPPkRFPC9TUFJBU19JU08+PEZJVFlQLz48U1RDRFQvPjxTVENEMy8+PFNUQ0Q0Lz48WElDTVMvPjxYWElQSS8+PFhTVUJULz48Q0ZPUEMvPjxUWExXMS8+PFRYTFcyLz48Q0NDMDEvPjxDQ0MwMi8+PENDQzAzLz48Q0NDMDQvPjxDQVNTRC8+PEtES0cxLz48S0RLRzIvPjxLREtHMy8+PEtES0c0Lz48S0RLRzUvPjxFMUtOQjFNIFNFR01FTlQ9IjEiPjxNU0dGTj4wMDU8L01TR0ZOPjxCVUtSUz5HTDEwMDA8L0JVS1JTPjxTUEVSUi8+PExPRVZNLz48WlVBV0E+MDAyPC9aVUFXQT48QlVTQUIvPjxBS09OVD4wMDAwMTQwMDAwPC9BS09OVD48QkVHUlUvPjxLTlJaRS8+PEtOUlpCLz48WkFNSU0vPjxaQU1JVi8+PFpBTUlSLz48WkFNSUIvPjxaQU1JTy8+PFpXRUxTLz48WFZFUlIvPjxaQUhMUy8+PFpURVJNPlpCMDE8L1pURVJNPjxXQUtPTi8+PFZaU0taLz48WklORFQ+MDAwMDAwMDA8L1pJTkRUPjxaSU5SVD4wMDwvWklOUlQ+PEVJS1RPPjAwMDAwMDAxMDA8L0VJS1RPPjxaU0FCRS8+PEtWRVJNLz48RkRHUlY+RTI8L0ZER1JWPjxWUkJLWi8+PFZMSUJCPjA8L1ZMSUJCPjxWUlNaTD4wPC9WUlNaTD48VlJTUFI+MDwvVlJTUFI+PFZSU05SLz48VkVSRFQ+MDAwMDAwMDA8L1ZFUkRUPjxQRVJLWi8+PFhERVpWLz48WEFVU1ovPjxXRUJUUj4wPC9XRUJUUj48UkVNSVQvPjxEQVRMWj4wMDAwMDAwMDwvREFUTFo+PFhaVkVSPlg8L1haVkVSPjxUT0dSVS8+PEtVTFRHPjA8L0tVTFRHPjxIQktJRC8+PFhQT1JFLz48QkxOS1ovPjxBTFRLTi8+PFpHUlVQLz48VVJMSUQvPjxNR1JVUC8+PExPQ0tCLz48VVpBV0UvPjxFS1ZCRC8+PFNSRUdMLz48WEVESVAvPjxGUkdSUC8+PFZSU0RHLz48VExGWFMvPjxQRVJOUj4wMDAwMDAwMDwvUEVSTlI+PElOVEFELz48R1VaVEUvPjxHUklDRC8+PEdSSURULz48RTFLTkI1TSBTRUdNRU5UPSIxIj48TVNHRk4+MDA1PC9NU0dGTj48TUFCRVIvPjxNQUhOQT4wMDAxPC9NQUhOQT48TUFOU1AvPjxNQURBVD4wMDAwMDAwMDwvTUFEQVQ+PE1BSE5TPjA8L01BSE5TPjxLTlJNQS8+PEdNVkRUPjAwMDAwMDAwPC9HTVZEVD48QlVTQUIvPjwvRTFLTkI1TT48L0UxS05CMU0+PC9FMUtOQTFNPjwvSURPQz48L0RFQk1BUzAxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvYXBwdmlldy9ldmVudF9ERUJNQVMwMS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5ZTZkMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2FwcHZpZXcvZXZlbnRfREVCTUFTMDEueHNkCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj48eHNkOmVsZW1lbnQgbmFtZT0iREVCTUFTMDEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iSURPQyI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJFRElfREM0MCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iVEFCTkFNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFORFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQ05VTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQ1JFTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RBVFVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESVJFQ1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik9VVE1PRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRVhQUlNTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURVNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJJRE9DVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0lNVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUVTVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUVTQ09EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNRVNGQ1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNURCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1REVlJTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVERNRVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFBPUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNORFBSVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU05EUEZDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRQUk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRTQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTTkRMQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjcwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZQT1IiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSQ1ZQUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJDVlBGQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWUFJOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWU0FEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUkNWTEFEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3MCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ1JFREFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlIi8+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDUkVUSU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRpbWUiLz48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFRklOVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFRkdSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJFRk1FUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFSQ0tFWSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNFUklBTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05BMU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVU5OUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFOUkVEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQVVGU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJBSE5FIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFITlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQkJOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkJTTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJFR1JVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUlNDSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlVCS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRBVExUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRkFLU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZJU0tOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05SWkEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLT05aUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktUT0tEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVUtMQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTEFORDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxJRk5SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTElGU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPQ0NPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9FVk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUUxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTkFNRTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUU0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTklFTFMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik9SVDAxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iT1JUMDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRkFDSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBTVEwyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFNUTFoiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRUdJTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ09VTkMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNJVFlDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSUE1LUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09SVEwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUEVSUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BSQVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0QxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RDRDIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjExIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEtaQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1RLWlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUUkFTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMQlgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTEYyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVEVMRlgiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxUWCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRFTFgxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTFpPTkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYWkVNUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVkJVTkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0VHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR0ZPUk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU4xIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUkFOMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJSQU40IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlJBTjUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVTUpBSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVVdBRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkpNWkFIIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJKTUpBSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI1IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSNiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBVFI4IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLQVRSOSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FUUjEwIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVEtaTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVU1TQTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUWEpDRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUklWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVE9DRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEZPUlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjM1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEVEFNUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRFRBV1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkhaVU9SIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDSVZWRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlMVkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQUkFTX0lTTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRklUWVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0RUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVENEMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNUQ0Q0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWElDTVMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhYSVBJIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYU1VCVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0ZPUEMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRYTFcxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUWExXMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0NDMDEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNDQzAyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDQ0MwMyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0NDMDQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNBU1NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktES0czIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREtHNCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0RLRzUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WVk0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWS09SRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlRXRUciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQQVJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCRUdSVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTE9FVk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZFUlNHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBVUZTRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0FMS1MiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktER1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCWklSSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS09OREEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBMVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBV0FIUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSU5DTzEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IklOQ08yIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTElGU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFVVExGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTlRMRiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1pUTEYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktaQVpVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDSFNQTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTFBSSU8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkVJS1RPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlNCRUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZBS1NEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNUk5LWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSRksiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBFUlJMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXQUVSUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1RHUkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpURVJNIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWV0VSSyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVktHUlAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZLQlVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWU09SVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1IxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZHUjMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktWR1I0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLVkdSNSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQk9LUkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVUlNUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQUkZSRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0xBQkMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktBQlNTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLS0JFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQ0FTU0QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlJET0ZGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVlBNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSVlciIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVTk4yIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREVGUEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUkVGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZETSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQ1RQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUFJBUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9BTloiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPVkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQUNIQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BSQVNfSVNPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVklNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUxBTkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlRBVFlQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUQVhLRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTlZMTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFMQU5EIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUQVRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTElDTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQVRBQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREFUQkkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJFTElDIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOQjFNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlVLUlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNQRVJSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJMT0VWTSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlVBV0EiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJVU0FCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBS09OVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJFR1JVIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTlJaRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktOUlpCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQU1JUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWkFNSUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpBTUlPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaV0VMUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhWRVJSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJaQUhMUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWlRFUk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IldBS09OIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWWlNLWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWklORFQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpJTlJUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFSUtUTyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpTQUJFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS1ZFUk0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGREdSViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSQktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWTElCQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlZSU1pMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlNQUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJTTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWRVJEVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEVSS1oiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlhERVpWIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYQVVTWiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0VCVFIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRU1JVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRBVExaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJYWlZFUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVE9HUlUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktVTFRHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJIQktJRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFBPUkUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJMTktaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBTFRLTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlpHUlVQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVUkxJRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUdSVVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkxPQ0tCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI3Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJVWkFXRSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRUtWQkQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTUkVHTCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWEVESVAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSR1JQIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJWUlNERyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVExGWFMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQRVJOUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iSU5UQUQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR1VaVEUiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkdSSUNEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHUklEVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRTFLTkI1TSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9Ijk5OTkiPjx4c2Q6Y29tcGxleFR5cGU+PHhzZDpzZXF1ZW5jZT48eHNkOmVsZW1lbnQgbmFtZT0iTVNHRk4iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BQkVSIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQUhOQSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUFOU1AiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1BREFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNQUhOUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05STUEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHTVZEVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQlVTQUIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05CS00iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFOS0wiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCQU5LTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJLT05UIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCVlRZUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWEVaRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJLUkVGIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQkFOS0EiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTVFJBUyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik9SVDAxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1dJRlQiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjExIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCR1JVUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iWFBHUk8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkJOS0xaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUFNLVE8iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjE2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUk5DSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNDAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBST1ZaIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLT0lOSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05WQU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI5OTk5Ij48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBQkxBRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktORkFLIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJXQU5JRCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRFRkFCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOVktNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FViIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5BTUUxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzNSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUJUUEEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJBQlROUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVUVQQVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJURUxGMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkFOUkVEIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFGS1QiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUlZPIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVZJUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSR0UiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkxBIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJHQkRBVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iVlJUTlIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJCUllUSCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iQUtWRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik5NQUlMIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBVSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNDAiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkgxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJIMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFSSDMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBUkg0IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIyIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJINSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1PQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNT0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTU9CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJESUJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRElBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRJQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTUlCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9Ik1JQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJNSUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRPQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJET0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRE9CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQUIxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGUkJJMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRlJBQjIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkZSQkkyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUFCMSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU0FCSTEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNBQUIyIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQUJJMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09BQjEiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNPQkkxIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI2Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTT0FCMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09CSTIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS04xIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtOMiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFLTjMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlBBS040IiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJQQUtONSIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU09SVEwiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJGQU1TVCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iU1BOQU0iIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJUSVRFTF9BUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMzUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PHhzZDphdHRyaWJ1dGUgbmFtZT0iU0VHTUVOVCIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkUxS05LQU0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj48eHNkOmNvbXBsZXhUeXBlPjx4c2Q6c2VxdWVuY2U+PHhzZDplbGVtZW50IG5hbWU9Ik1TR0ZOIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLTElNRyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktMSU1FIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iV0FFUlMiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjUiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRMQVVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50PjwveHNkOnNlcXVlbmNlPjx4c2Q6YXR0cmlidXRlIG5hbWU9IlNFR01FTlQiIHVzZT0icmVxdWlyZWQiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmF0dHJpYnV0ZT48L3hzZDpjb21wbGV4VHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJFMUtOS0tNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iOTk5OSI+PHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPjx4c2Q6ZWxlbWVudCBuYW1lPSJNU0dGTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS0tCRVIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktMSU1LIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxNiIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iS05LTEkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjEwIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJDVExQQyIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iRFRSRVYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkNSQkxCIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJTQkdSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMyIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iTlhUUlYiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjgiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IktSQVVTIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIxMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iUEFZREIiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjIiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCUkFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJSRVZEQiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iR1JVUFAiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjQiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IlNCREFUIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI4Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJLREdSUCIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48eHNkOmVsZW1lbnQgbmFtZT0iREJQQVkiIG1pbk9jY3Vycz0iMCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDptYXhMZW5ndGggdmFsdWU9IjMiLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCUlRHIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQkVLUiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iMTciLz48L3hzZDpyZXN0cmljdGlvbj48L3hzZDpzaW1wbGVUeXBlPjwveHNkOmVsZW1lbnQ+PHhzZDplbGVtZW50IG5hbWU9IkRCV0FFIiBtaW5PY2N1cnM9IjAiPjx4c2Q6c2ltcGxlVHlwZT48eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPjx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDplbGVtZW50Pjx4c2Q6ZWxlbWVudCBuYW1lPSJEQk1PTiIgbWluT2NjdXJzPSIwIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOm1heExlbmd0aCB2YWx1ZT0iOCIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJTRUdNRU5UIiB1c2U9InJlcXVpcmVkIj48eHNkOnNpbXBsZVR5cGU+PHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj48eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxIi8+PC94c2Q6cmVzdHJpY3Rpb24+PC94c2Q6c2ltcGxlVHlwZT48L3hzZDphdHRyaWJ1dGU+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzZXF1ZW5jZT48eHNkOmF0dHJpYnV0ZSBuYW1lPSJCRUdJTiIgdXNlPSJyZXF1aXJlZCI+PHhzZDpzaW1wbGVUeXBlPjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+PHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPjwveHNkOnJlc3RyaWN0aW9uPjwveHNkOnNpbXBsZVR5cGU+PC94c2Q6YXR0cmlidXRlPjwveHNkOmNvbXBsZXhUeXBlPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2VxdWVuY2U+PC94c2Q6Y29tcGxleFR5cGU+PC94c2Q6ZWxlbWVudD48L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0LnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZTJkNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwKQEAgLTAsMCArMSwyMSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZHQ6d3JhcHBlZGluc3RhbmNlIHhtbG5zOmR0PSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0Ij4KKyAgPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvcXVhbnQiPgorICAgIDx4czplbGVtZW50IG5hbWU9InF1YW50aXR5IiB0eXBlPSJ4czppbnQiLz4KKyAgPC94czpzY2hlbWE+CisgIDxxdDpxdWFudGl0eSB4bWxuczpxdD0iaHR0cDovL29wZW51cmkub3JnL3Rlc3QvcXVhbnQiPgorICAgIDQyCisgIDwvcXQ6cXVhbnRpdHk+Cis8L2R0OndyYXBwZWRpbnN0YW5jZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2E3ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0LnhzZApAQCAtMCwwICsxLDMxIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IgorICBibG9ja0RlZmF1bHQ9IiNhbGwiCisgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgeG1sOmxhbmc9IkVOIj4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJ3cmFwcGVkaW5zdGFuY2UiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4czpzY2hlbWEiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKzwveHM6c2NoZW1hPgorCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTg3YjYKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9keW5hbWljL2R5bnRlc3QyLnhtbApAQCAtMCwwICsxLDE4IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxkdDp3cmFwcGVkd2lsZGNhcmQgeG1sbnM6ZHQ9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiPgorICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9xdWFudCI+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvPgorICA8L3hzOnNjaGVtYT4KKzwvZHQ6d3JhcHBlZHdpbGRjYXJkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvZHluYW1pYy9keW50ZXN0Mi54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5N2NiMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiCisgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgYmxvY2tEZWZhdWx0PSIjYWxsIgorICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgdmVyc2lvbj0iMS4wIgorICB4bWw6bGFuZz0iRU4iPgorCisgIDx4czplbGVtZW50IG5hbWU9IndyYXBwZWR3aWxkY2FyZCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3ByaWNlcXVvdGUvUHJpY2VRdW90ZS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9wcmljZXF1b3RlL1ByaWNlUXVvdGUueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWZlODMKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9wcmljZXF1b3RlL1ByaWNlUXVvdGUueHNkCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisgICAgPHhzZDplbGVtZW50IG5hbWU9InByaWNlLXF1b3RlIj4KKyAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ic3RvY2stc3ltYm9sIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InN0b2NrLXByaWNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgorICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPCEtLSBYWFhTSk0gY2hhbmdlIGZvbGxvd2luZyB0byB1c2UgcmVmaW5lZCBkYXRhdHlwZXMgLS0+CisgICAgPHhzZDplbGVtZW50IG5hbWU9InN0b2NrLXN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdG9jay1wcmljZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS9yYS9yYS54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9yYS9yYS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMmZmOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3JhL3JhLnhzZApAQCAtMCwwICsxLDI1IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0L3Jvd3NhZmZlY3RlZCIKKyAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL215dGVzdC9yb3dzYWZmZWN0ZWQiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKKz4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJyb3dzQWZmZWN0ZWQiIHR5cGU9InhzOmludCIvPgorCis8L3hzOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL2phdmFzcmMvU2ltcGxlUGVyc29uVGVzdC5qYXZhIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL2phdmFzcmMvU2ltcGxlUGVyc29uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmYyZjUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS9zaW1wbGUvamF2YXNyYy9TaW1wbGVQZXJzb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLm9wZW51cmkubXl0ZXN0LlBlcnNvbjsKK2ltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuQ3VzdG9tZXJEb2N1bWVudDsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgZHJ0Y2FzZXMuVGVzdEVudjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLlJvb3Q7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVQZXJzb25UZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ3VzdG9tZXJEb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgQ3VzdG9tZXJEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvc2ltcGxlL3BlcnNvbi54bWwiKSwgbnVsbCk7CisKKyAgICAgICAgLy8gTW92ZSBmcm9tIHRoZSByb290IHRvIHRoZSByb290IGN1c3RvbWVyIGVsZW1lbnQKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IGRvYy5nZXRDdXN0b21lcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJIb3dkeSIsIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNCwgICBwZXJzb24uc2l6ZU9mTnVtYmVyQXJyYXkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDM2LCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyMywgcGVyc29uLmdldE51bWJlckFycmF5KDEpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0NCwgIHBlcnNvbi5nZXROdW1iZXJBcnJheSgyKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoOTMzLCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsICAgcGVyc29uLnNpemVPZkJpcnRoZGF5QXJyYXkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IERhdGUoIlR1ZSBBdWcgMjUgMTc6MDA6MDAgUERUIDE5OTgiKSwgcGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCkpOworCisgICAgICAgIFBlcnNvbi5HZW5kZXIuRW51bSBnID0gcGVyc29uLmdldEdlbmRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFBlcnNvbi5HZW5kZXIuTUFMRSwgZyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRUdJUVRXWVpKIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4KCkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhpcyBzdHJpbmcgaXMgYmFzZTY0QmluYXJ5IGVuY29kZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjQoKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdHSVFUV1lHRyIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleEF0dCgpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0QXR0KCkpKTsKKworICAgICAgICBwZXJzb24uc2V0Rmlyc3RuYW1lKCJHZW9yZ2UiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2VvcmdlIiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKKworICAgICAgICBwZXJzb24uc2V0SGV4KCJoZXggZW5jb2RpbmciLmdldEJ5dGVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZXggZW5jb2RpbmciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXgoKSkpOworCisgICAgICAgIHBlcnNvbi5zZXRCYXNlNjQoImJhc2U2NCBlbmNvZGVkIi5nZXRCeXRlcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmFzZTY0IGVuY29kZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NCgpKSk7CisKKyAgICAgICAgLy9wZXJzb24uc2V0SGV4QXR0KCJoZXggZW5jb2RpbmcgaW4gYXR0cmlidXRlcyIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4QXR0KCkpKTsKKworICAgICAgICAvL3BlcnNvbi5zZXRCYXNlNjRBdHQoImJhc2U2NCBlbmNvZGVkIGluIGF0dHJpYnV0ZXMiLmdldEJ5dGVzKCkpOworICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoImJhc2U2NCBlbmNvZGVkIGluIGF0dHJpYnV0ZXMiLAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0QXR0KCkpKTsKKy8vCisvLyAgICAgICAgWG1sQ3Vyc29yIGNwID0gcGVyc29uLm5ld1htbEN1cnNvcigpOworLy8gICAgICAgIFJvb3QuZHVtcCggY3AgKTsKKworLy8gICAgICAgIFhtbEN1cnNvciBjID0gcGVyc29uLnhnZXRCaXJ0aGRheUFycmF5KDApLm5ld1htbEN1cnNvcigpOworCisvLyAgICAgICAgUm9vdC5kdW1wKCBjICk7CisKKy8vICAgICAgICBwZXJzb24uc2V0QmlydGhkYXkoMCxuZXcgRGF0ZSgiVHVlIEF1ZyAyNSAxNjowMDowMCBQRFQgMjAwMSIpKTsKKworLy8gICAgICAgIFJvb3QuZHVtcCggYyApOworCisvLyAgICAgICAgYy50b05leHRUb2tlbigpOworCisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiLS0tIiArIGMuZ2V0VGV4dCgpICsgIi0tLSIgKTsKKworLy8gICAgICAgIFJvb3QuZHVtcCggYyApOworCisvLyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhwZXJzb24uZ2V0QmlydGhkYXlBcnJheSgwKSwgbmV3IERhdGUoIlR1ZSBBdWcgMjUgMTY6MDA6MDAgUERUIDIwMDIiKSk7CisvLworLy8gICAgICAgIHBlcnNvbi5zZXRGaXJzdG5hbWUoIkdlb3JnZSIpOworLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocGVyc29uLmdldEZpcnN0bmFtZSgpLCAiR2VvcmdlIik7CisvLworLy8gICAgICAgIHBlcnNvbi5hZGROdW1iZXIoIChzaG9ydCkgNjkgKTsKKy8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBlcnNvbi5jb3VudE51bWJlcigpLCA1KTsKKy8vICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXROdW1iZXJBcnJheSg0KSwgNjkpOworLy8KKy8vCisvLyAgICAgICAgd2hpbGUgKCBjLmhhc05leHRUb2tlbigpICkKKy8vICAgICAgICAgICAgYy50b05leHRUb2tlbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzNTRkMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgorICBnZW5kZXI9Im1hbGUiCisgIGhleEF0dD0iNDc0NzQ5NTE1NDU3NTk0NzQ3IgorICBiYXNlNjRBdHQ9IiAgICAgICAgCisJVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoCisJICAiPgorICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+CisgIDxudW1iZXI+NDM2PC9udW1iZXI+CisgIDxudW1iZXI+MTIzPC9udW1iZXI+CisgIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+CisgIDxudW1iZXI+NDQ8L251bWJlcj4KKyAgPG51bWJlcj45MzM8L251bWJlcj4KKyAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgorICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgorICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgorPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3BlcnNvbi54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMmU4NgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9wZXJzb24ueHNkCkBAIC0wLDAgKzEsNzggQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYQorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6bXQ9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgPgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpcnN0bmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIj4KKyAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgorICAgICAgICAgICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMCIvPgorICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaXJ0aGRheSIgdHlwZT0ieHM6ZGF0ZSIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJoZXgiIHR5cGU9InhzOmhleEJpbmFyeSIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0IiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2VuZGVyIj4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWxlIi8+CisgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmZW1hbGUiLz4KKyAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhleEF0dCI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmhleEJpbmFyeSI+CisgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IihbNDVdWzAtOUEtRl0pKiIvPgorICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlNjRBdHQiPgorICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgorICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgorICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVkdocGN5QnpkSEpwYm1jZ2FYTWdZbUZ6WlRZMFFtbHVZWEo1SUdWdVkyOWtaV1FoIi8+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0ibXQ6cGVyc29uIi8+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZW1wbG95ZWUiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJtdDpwZXJzb24iPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVpZCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPC94czpleHRlbnNpb24+CisgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDJjZGViCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvc2ltcGxlL3NpbXBsZWMueHNkCkBAIC0wLDAgKzEsNDAgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYQorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6bXQ9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKKz4KKworICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2ltcGxpY2l0eSI+CisgICAgPHhzOnNpbXBsZUNvbnRlbnQ+CisgICAgIDx4czpleHRlbnNpb24gYmFzZT0ibXQ6dGhvdXNhbmQiPgorICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm90ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgIDwveHM6c2ltcGxlQ29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ0aG91c2FuZCI+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+CisgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjEiLz4KKyAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMCIvPgorICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czplbGVtZW50IG5hbWU9InNpbXBsZSIgdHlwZT0ibXQ6c2ltcGxpY2l0eSIvPgorCis8L3hzOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDAzX3Byb2Nlc3NfcG9fMDA3LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2UxZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpLzAwM19wcm9jZXNzX3BvXzAwNy54c2QKQEAgLTAsMCArMSwyMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIExpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCisgICAgICBvbiB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgd2ViIHNpdGUuIHd3dy5vcGVuYXBwbGljYXRpb25zLm9yZworCisgICAgICBGb3Igc3VwcG9ydCwgbW9yZSBpbmZvcm1hdGlvbiwgb3IgdG8gcmVwb3J0IGltcGxlbWVudGF0aW9uIGJ1Z3MsCisgICAgICBwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCisKKyAgICAkUmV2aXNpb24kCisgICAgJERhdGUkCisgICAgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWFNECisgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgICAkTmFtZTogICQKKworY21rCTYuMi4wICAgCTExLzIyLzE5OTkJSW5pdGlhbCBSZWxlYXNlIC0gdXBkYXRlIGZyb20gdmVyc2lvbiAwMDMKKwkJCQkJCQlBZGQgUE9MTlNUQVRVUywgREFURVRJTUUuTkVFRERFTFYgdG8gUE9PUkRFUkxJTgorCQkJCQkJCUZpeCBwcm9jZXNzaW5nIG5vdGUgcnVsZXMKK3Jqagk3LjAuMAkJMTAvMTUvMjAwMAlTcGVjaWFsIFJldmlzaW9uIFVwZGF0ZQorcmpqCTcuMC4yCQkxMS8yNC8yMDAwCUFsbG93IG11bHRpcGxlIGluc3RhbmNlcyBvZiBOT1RFUy4KK21scgk3LjEJCTA0LzE2LzIwMDEJQWRkIEFUVENIUkVGIHRvIEJPRC4KK2FqdwkJNy4yLjEJCQkxMC8zMS8yMDAxCQlXM0MgU2NoZW1hIFJlbGVhc2UKKworU3RydWN0dXJlIE92ZXJ2aWV3CisKKwlQUk9DRVNTX1BPIChQT09SREVSSERSLCBQT09SREVSTElOKykKKwkJUE9PUkRFUkhEUiAoUEFSVE5FUissIEFUVENIUkVGKiwgQ0hBUkdFKiwgUE9URVJNKikKKwkJCVBPVEVSTSAoKQorCQlQT09SREVSTElOIChBVFRDSFJFRiosIENIQVJHRSosIERJU1RSSUJVVE4qLCBQQVJUTkVSKiwgUE9URVJNKiwKKwkJICBQT0JTVUJMSU5FKiwgUE9MSU5FU0NIRCopCisJCQlQT1RFUk0gKCkKKwkJCVBPU1VCTElORSAoKQorCQkJUE9MSU5FU0NIRCAoKQorCitOb3RlczoKKworLS0+Cis8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy8wMDNfcHJvY2Vzc19wb18wMDciIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDAzX3Byb2Nlc3NfcG9fMDA3Ij4KKwk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgorCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPXzAwNyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNOVFJPTEFSRUEiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IkRBVEFBUkVBIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iREFUQUFSRUEiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJQUk9DRVNTX1BPIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUk9DRVNTX1BPIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJIRFIiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpEQVRFVElNRUFOWSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPSUQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPVFlQRSIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QUNLUkVRVUVTVCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVEIiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09OVFJBQ1RTIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6T1BSQU1UQVVUSCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT1JFTEVBU0UiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpQQVJUTkVSIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgorCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT1RFUk0iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVSTUlEIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6Y2hvaWNlPgorCQkJCQk8eHM6c2VxdWVuY2U+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRBWU9GTU9OVEgiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFJPWE1PTlRIIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZU05VTSIvPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJCTx4czpjaG9pY2U+CisJCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIvPgorCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+CisJCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+CisJCQkJCTwhLS0gKCVRVUFOVElUWS5QRVJDRU5UOykgLS0+CisJCQkJPC94czpjaG9pY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPCEtLSAoKERBWU9GTU9OVEgsIFBST1hNT05USCkgfCBEQVlTTlVNKSwgKCglT1BFUkFNVC5FWFRFTkRFRC5UOykgfCAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT09SREVSTElOIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9MSU5FTlVNIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkhBWlJETUFUTCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlYiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWWCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFDS0lORyIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xOU1RBVFVTIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBWFdIRVhNUFQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czpjaG9pY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQk8L3hzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkFUVENIUkVGIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDSEFSR0UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRJU1RSSUJVVE4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlBBUlRORVIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IlBPVEVSTSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9TVUJMSU5FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJQT0xJTkVTQ0hEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPCEtLSAoJVFVQU5USVRZLlBFUkNFTlQ7KSkgLS0+CisJCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOyk/IC0tPgorCQkJCTwhLS0gKCVPUEVSQU1ULlVOSVQuVDspPyAtLT4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlBPU1VCTElORSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkFXSU5HIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBTQkxJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czpjaG9pY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU0iIG1pbk9jY3Vycz0iMCIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVgiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQk8L3hzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8IS0tICglUVVBTlRJVFkuSVRFTTspIC0tPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUE9MSU5FU0NIRCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNDTElORU5VTSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPCEtLSAoJURBVEVUSU1FLk5FRURERUxWOykgLS0+CisJCQkJPCEtLSAoJVFVQU5USVRZLk9SREVSRUQ7KSAtLT4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvMDA0X2Fja25vd2xlZGdlX3BvXzAwOC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkZThiNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS8wMDRfYWNrbm93bGVkZ2VfcG9fMDA4LnhzZApAQCAtMCwwICsxLDI2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCisJb24gdGhlIE9wZW4gQXBwbGljYXRpb25zIEdyb3VwIHdlYiBzaXRlLiB3d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcKKworCUZvciBzdXBwb3J0LCBtb3JlIGluZm9ybWF0aW9uLCBvciB0byByZXBvcnQgaW1wbGVtZW50YXRpb24gYnVncywKKwlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCisKKwkkUmV2aXNpb24kCisJJERhdGUkCisJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWFNECisJQ29weXJpZ2h0IDE5OTgtMjAwMSwgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisJJE5hbWU6ICAkCisKKwljbWsJNi4yLjAgICAJMTEvMjIvMTk5OQlJbml0aWFsIFJlbGVhc2UgLSBVcGRhdGUgZnJvbSB2ZXJzaW9uIDAwMworCQkJCQkJCQlBZGQgUE9MTlNUQVRVUywgREFURVRJTUUuTkVFRERFTFYgdG8gUE9PUkRFUkxJTgorCQkJCQkJCQlGaXggcHJvY2Vzc2luZyBub3RlIHJ1bGVzCisJcmpqCTcuMC4wCTEwLzE1LzIwMDAJU3BlY2lhbCBSZXZpc2lvbiBVcGRhdGUKKwlyamoJNy4wLjIJMTEvMjQvMjAwMAlBbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTk9URVMuCisJbWxyCTcuMQkJMDQvMTYvMjAwMQlBZGQgQVRUQ0hSRUYgdG8gQk9ELgorCWFqdyA3LjIJCTA5LzMwLzIwMDEgCU1hZGUgQUNLTElORSBzZWdtZW50ICcwIHRvIG1hbnknIHRpbWVzCisJYWp3CTcuMi4xCTA5LzAxLzAwCVczQyBTY2hlbWEgUmVsZWFzZQorCisgICAgU3RydWN0dXJlIE92ZXJ2aWV3CisKKyAgICBBQ0tOT1dMRURHRV9QTyAoUE9PUkRFUkhEUiwgUE9PUkRFUkxJTiopCisgICAgICAgIFBPT1JERVJIRFIgKEFDS0hFQURFUiwgQVRUQ0hSRUYqLCBDSEFSR0UqLCBQQVJUTkVSKiwgUE9URVJNKikKKyAgICAgICAgICAgIEFDS0hFQURFUiAoKQorICAgICAgICAgICAgUE9URVJNICgpCisgICAgICAgIFBPT1JERVJMSU4gKEFDS0xJTkUqLCBBVFRDSFJFRiosIENIQVJHRSosIERJU1RSSUJVVE4qLCBQQVJUTkVSKiwKKyAgICAgICAgICAgIFBPTElORVNDSEQqLCBQT1NVQkxJTkUqLCBQT1RFUk0qKQorICAgICAgICAgICAgQUNLTElORSAoKQorICAgICAgICAgICAgUEFSVE5FUiAoKQorICAgICAgICAgICAgUE9MSU5FU0NIRCAoKQorICAgICAgICAgICAgUE9TVUJMSU5FICgpCisgICAgICAgICAgICBQT1RFUk0gKCkKKworTm90ZXM6CisKKy0tPgorPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvMDA0X2Fja25vd2xlZGdlX3BvXzAwOCIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpvZj0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHhtbG5zOm9zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIj4KKwk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX3NlZ21lbnRzLnhzZCIvPgorCTx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgc2NoZW1hTG9jYXRpb249Im9hZ2lzX2ZpZWxkcy54c2QiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tOT1dMRURHRV9QT18wMDgiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpDTlRST0xBUkVBIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRBQVJFQSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkRBVEFBUkVBIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTk9XTEVER0VfUE8iLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkFDS05PV0xFREdFX1BPIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkhEUiIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9PUkRFUkxJTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUE9PUkRFUkhEUiI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOk9QRVJBTVQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9JRCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UE9UWVBFIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBQ0tSRVFVRVNUIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNPTlRSQUNUQiIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05UUkFDVFMiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpPUFJBTVRBVVRIIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPUkVMRUFTRSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhXSEVYTVBUIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IkFDS0hFQURFUiIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPCEtLSAoJURBVEVUSU1FLkRPQ1VNRU5UOyk/IC0tPgorCQkJCTwhLS0gKCVPUEVSQU1ULkVYVEVOREVELlQ7KT8gLS0+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBQ0tIRUFERVIiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpTRU5ERVIiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0FMRVNPUkRJRCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPCEtLSAoJURBVEVUSU1FLlBST01ERUxWOyk/IC0tPgorCQkJCTwhLS0gKCVEQVRFVElNRS5QUk9NU0hJUDspPyAtLT4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlBPVEVSTSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpURVJNSUQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czpjaG9pY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZT0ZNT05USCIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQUk9YTU9OVEgiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEQVlTTlVNIi8+CisJCQkJPC94czpjaG9pY2U+CisJCQkJPHhzOmNob2ljZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpPUEVSQU1UIi8+CisJCQkJCTwveHM6c2VxdWVuY2U+CisJCQkJCTx4czpzZXF1ZW5jZT4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQk8L3hzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8IS0tICgoREFZT0ZNT05USCwgUFJPWE1PTlRIKSB8IERBWVNOVU0pLCAoKCVPUEVSQU1ULkVYVEVOREVELlQ7KSB8ICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlBPT1JERVJMSU4iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvczpRVUFOVElUWSIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6T1BFUkFNVCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQT0xJTkVOVU0iLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SEFaUkRNQVRMIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SViIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNUlZYIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQUNLSU5HIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPTE5TVEFUVVMiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYV0hFWE1QVCIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmNob2ljZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQk8L3hzOnNlcXVlbmNlPgorCQkJCQk8eHM6c2VxdWVuY2U+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgorCQkJCQk8L3hzOnNlcXVlbmNlPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iQUNLTElORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6QVRUQ0hSRUYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkNIQVJHRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6RElTVFJJQlVUTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UEFSVE5FUiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0iUE9URVJNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJQT1NVQkxJTkUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9IlBPTElORVNDSEQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8IS0tICglUVVBTlRJVFkuUEVSQ0VOVDspKSAtLT4KKwkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KT8gLS0+CisJCQkJPCEtLSAoJU9QRVJBTVQuVU5JVC5UOyk/IC0tPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQUNLTElORSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOkRBVEVUSU1FQU5ZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9zOlFVQU5USVRZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDS0NPREUiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5PVEVTIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTQUxFU09SRElEIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8IS0tICglREFURVRJTUUuUFJPTURFTFY7KT8gLS0+CisJCQkJPCEtLSAoJURBVEVUSU1FLlBST01TSElQOyk/IC0tPgorCQkJCTwhLS0gKCVRVUFOVElUWS5PUkRFUkVEOyk/IC0tPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUE9TVUJMSU5FIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRSQVdJTkciIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTVJWIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1SVlgiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFNCTElORU5VTSIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmNob2ljZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpERVNDUklQVE4iLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6SVRFTSIgbWluT2NjdXJzPSIwIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNIi8+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOklURU1YIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVBDIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJPC94czpzZXF1ZW5jZT4KKwkJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpJVEVNWCIvPgorCQkJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUEMiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQk8L3hzOnNlcXVlbmNlPgorCQkJCQk8eHM6c2VxdWVuY2U+CisJCQkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVQQyIvPgorCQkJCQk8L3hzOnNlcXVlbmNlPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTwhLS0gKCVRVUFOVElUWS5JVEVNOykgLS0+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT0xJTkVTQ0hEIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6REFURVRJTUVBTlkiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib3M6UVVBTlRJVFkiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQU0NMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCQk8IS0tICglREFURVRJTUUuTkVFRERFTFY7KSAtLT4KKwkJCQk8IS0tICglUVVBTlRJVFkuT1JERVJFRDspIC0tPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlci54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXIueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2NkMjcKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvT3JkZXIueHNkCkBAIC0wLDAgKzEsMjAyNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlci54c2QiIHRhcmdldE5hbWVzcGFjZT0icHVibGljaWQ6b3JnLnhDQkw6c2NoZW1hcy9YQ0JMMzUvT3JkZXIueHNkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KKyAgICAgICAgICAgIFhNTCBDb21tb24gQnVzaW5lc3MgTGlicmFyeSAzLjUKKyAgICAgICAgICAgIENvcHlyaWdodCAyMDAwIENvbW1lcmNlIE9uZSwgSW5jLgorICAgICAgICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgICAgICAgRFREJ3MsIHNjaGVtYXMgYW5kIG1vZHVsZXMgaW4gdGhlIENvbW1lcmNlIE9uZSBYTUwgQ29tbW9uIEJ1c2luZXNzCisgICAgICAgICAgICBMaWJyYXJ5IFZlcnNpb24gMy41IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHNwZWNpZmllZAorICAgICAgICAgICAgYXQgaHR0cDovL3d3dy54Y2JsLm9yZy9saWNlbnNlLmh0bWwKKyAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAJUExFQVNFIE5PVEU6IFRoaXMgc2NoZW1hLCB3aGlsc3QgaXQgZGVzY3JpYmVzIGluIGVudGlyZXR5IGEgdmFsaWQsIHNpbmdsZSwKKyAgICAgICAgCXhDQkwgMy41IGRvY3VtZW50LCBpcyBkZWZpbmVkIHRvIGJlIGluIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gdGhlIG1haW4geENCTCAzLjUKKyAgICAgICAgCW5hbWVzcGFjZS4gVGhlcmVmb3JlIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGZ1bGwgeENCTCAzLjUgc2NoZW1hIGlzIHVzZWQKKyAgICAgICAgCWZvciBmdWxsIHByb2R1Y3Rpb24gc2l0dWF0aW9ucy4gUGxlYXNlIHNlZSB0aGUgbm90ZXMgYXQKKyAgICAgICAgCTxhIGhyZWY9Imh0dHA6Ly93d3cueGNibC5vcmcveGNibDM1L3hzZC9zY2hlbWFzLmh0bWwiPnd3dy54Q0JMLm9yZzwvYT4uCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVySGVhZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyU3VtbWFyeSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXIiIHR5cGU9Ik9yZGVyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckhlYWRlciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVySXNzdWVEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJSZWZlcmVuY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWxlYXNlTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQdXJwb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJlcXVlc3RlZFJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ3VycmVuY3kiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhBY2NvdW50aW5nQ3VycmVuY3kiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJMYW5ndWFnZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyVGF4UmVmZXJlbmNlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVGF4UmVmZXJlbmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySW52b2ljZU1lZGl1bVR5cGVDb2RlZCIgdHlwZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVySW52b2ljZU1lZGl1bVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ik9yZGVyRGF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnRpYWxTaGlwbWVudEFsbG93ZWQiIHR5cGU9InhjYmxCb29sZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlclBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0TG9jYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iT3JkZXJUZXJtc09mRGVsaXZlcnkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUZXJtc09mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJIZWFkZXJQcmljZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByaWNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyUGF5bWVudEluc3RydWN0aW9ucyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBheW1lbnRJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJBbGxvd2FuY2VzT3JDaGFyZ2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJvdW5kVHJpcEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckhlYWRlck5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckhlYWRlckF0dGFjaG1lbnRzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQXR0YWNobWVudCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckhlYWRlciIgdHlwZT0iT3JkZXJIZWFkZXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyTnVtYmVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCdXllck9yZGVyTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJPcmRlck51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZNZXNzYWdlSUQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyTnVtYmVyIiB0eXBlPSJPcmRlck51bWJlciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTWVzc2FnZUlEIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJNZXNzYWdlSUQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk1lc3NhZ2VJRCIgdHlwZT0iTGlzdE9mTWVzc2FnZUlEIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXNzYWdlSUQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklETnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJREFzc2lnbmVkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IklEQXNzaWduZWREYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lc3NhZ2VJRCIgdHlwZT0iTWVzc2FnZUlEIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJREFzc2lnbmVkQnkiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEQXNzaWduZWRCeUNvZGVkIiB0eXBlPSJQYXJ0eVJvbGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJREFzc2lnbmVkQnlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJREFzc2lnbmVkQnkiIHR5cGU9IklEQXNzaWduZWRCeSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXJ0eVJvbGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2ZEZXN0aW5hdGlvblBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T2YtT3JpZ2luUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE93bmVyc1NlcnZpY2luZ0JhbmtPblRoZVJlY2VpdmluZ1NpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lcnNTZXJ2aWNpbmdCYW5rT25UaGVTZW5kaW5nU2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNyb255bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFB1cmNoYXNlcnNDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVmZXJyZWRCeU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN1dGVDYXJlSG9zcGl0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVsaXZlcnlBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUGlja1VwQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aW9uQ2VudHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdTdXJnZW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHVsdERheUNhcmVQcm9ncmFtRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZVRocm91Z2hCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRlZENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lHcmFudGluZ1NlY3VyaXR5Q2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJRFNPckFSQ1VuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckFtYnVsYW5jZVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnb0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZvcmNlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpc21BbmRPdGhlckNoZW1pY2FsRGVwZW5kZW5jeUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sT3JEcnVnQWJ1c2VPckRlcGVuZGVuY3lJbnBhdGllbnRVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sT3JEcnVnQWJ1c2VPckRlcGVuZGVuY3lPdXRwYXRpZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaWFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGllbkFmZmlsaWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdlZERlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGllZEhlYWx0aFByb2Zlc3Npb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YWJsZVJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUmV0dXJuQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVBZGRyZXNzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlTWFudWZhY3R1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHpoZWltZXJzRGlhZ25vc3RpY09yQXNzZXNzbWVudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGVkTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5JbmRpYW4tT3duZWRCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1pY3VzQ3VyaWFlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lvbG9neVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmdpb3BsYXN0eUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmltYWxCZWluZ0ludmVzdGlnYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdGFudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRlbm5hU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWxsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlbGxlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRDb21ha2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRGb3JKb2IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQ29zaWduZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2FsQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcmFpc2VyTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92ZWRDb25zaWdub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkSW1wb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmJpdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmNoaXRlY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyY2hpdGVjdC1EZXNpZ25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZFNlcnZpY2VzTG9jYXRpb25EZXNpZ25hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJteUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRocml0aXNUcmVhdG1lbnRDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0QWNjb3VudEhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0YW50U3VyZ2VvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0YW50VVNUcnVzdGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVHZW5lcmFsQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRpbmdQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvckRlZmVuZGFudFByaXZhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Rm9yRGVmZW5kYW50UHVibGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvclBsYWludGlmZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlPZlJlY29yZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVjdGlvbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5Rm9yU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25Bc3NpZ25lZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkQWNjZXB0aW5nT2ZmaWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRFbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRFeHBvcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRJbXBvcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE1hcmtldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkT2ZmaWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFRyYWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXppbmdPZmZpY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkRGF0YVByb2Nlc3NpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkVW5kZXJ3cml0aW5nU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVXaXRoQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5U2hpcFRvUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxpZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50V2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsUGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJha2VyeURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeVJlZmVyZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lUcnVzdGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUGVyaW9kRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdHRlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYWxPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbmluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbC1Ub1BhcnR5Rm9yRGl2ZXJzaW9uQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhpbmdSb29tT3JMRFJQUm9vbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aHBsYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9vZEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZSZWFsdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9idGFpbFNlcnZpY2VQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZHNtYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2tlZXBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyQ3Jvc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcnJvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3Jyb3dlcnNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJha2VtYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmROYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtCZXJ0aE9wZXJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvYWRjYXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJPcGluaW9uT3JBbmFseXNpc1JlcXVlc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3JTYWxlc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2Vyc0Fzc2lzdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRlck5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nSW5zcGVjdG9yYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlRm9yd2FyZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ1NpdGVQdXJjaGFzZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdU9mTGFuZE1hbmFnZW1lbnRQcm9wZXJ0eVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cm5DYXJlVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBc3NvY2lhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1BhcnRuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllckFzT2ZmaWNpYWxseVJlZ2lzdGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29ycG9yYXRlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzUXVhbGl0eVJldmlld0JvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmdHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ3VzdG9tc0Jyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZGlkYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5keUFuZENvbmZlY3Rpb25zRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY0NhdGhlcml6YXRpb25MYWJvcmF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjSW50ZW5zaXZlQ2FyZVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNSZWhhYmlsaXRhdGlvblByb2dyYW1GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY1JlaGFiaWxpdGF0aW9uU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcm5ldElzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPZk5lZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xMZXZlbEFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xTdWItQWNjb3VudFNlcnZpY2luZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoUG9vbFRvcEFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkaW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbEJhbmtPclJlZ3VsYXRvcnlBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxDYXRhbG9ndWVQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkQWNjb3VudGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmeWluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpcnBlcnNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzUGF5ZXJBdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydGVyU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZURyYXduQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRGVwdXR5Q2xlcmtPZkNvdXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zQ2hyb25pY0Rpc2Vhc2VGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zRGF5Q2FyZUNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zRXllRWFyTm9zZUFuZFRocm9hdEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNHZW5lcmFsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0hvc3BpdGFsVW5pdE9mQW5JbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zT3J0aG9wZWRpY0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNPdGhlclNwZWNpYWx0eUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNQc3ljaGlhdHJpY0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNSZWhhYmlsaXRhdGlvbkZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNUdWJlcmN1bG9zaXNBbmRPdGhlclJlc3BpcmF0b3J5RGlzZWFzZXNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpcm9wcmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbmljRGlzZWFzZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbmljT2JzdHJ1Y3RpdmVQdWxtb25hcnlEaXNlYXNlU2VydmljZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHVyY2hPcGVyYXRlZEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaWdhcmV0dGVzQW5kVG9iYWNjb0RlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXRMb2NhdGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50QXV0aG9yaXplZFJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrT2ZDb3VydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWREb29yUGhhcm1hY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZFNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ09yUGFpbnRTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQm9ycm93ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUNvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUNvdW5zZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRGVmZW5kYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Ecml2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUludmVzdGlnYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbEFzc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblByaW5jaXBhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEluc3VyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25hYmxlQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25Qcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bml0eUFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlIZWFsdGhQcm9tb3Rpb25GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFzc2lnbmVkV2VsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUludGVydmlld2VyV29ya3NGb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJbldoaWNoSW50ZXJlc3RIZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55TWVyZ2VkV2l0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueS1Pd25lZE9pbEZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55V2hpY2hIb2xkc0ZpbmFuY2lhbEludGVyZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eUxpc3RpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVSZW50YWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpbmdQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVQcm9wZXJ0eUxpc3RpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBpbGF0aW9uQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW5hbnRzQXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudE1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHJlaGVuc2l2ZUdlcmlhdHJpY0Fzc2Vzc21lbnRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEVtcGxveWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmR1Y3RvclBpbG90Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW5nQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVDb3VyaWVyVHJhbnNmZXJTdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVPZlZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVUb0JlU3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUtVG9SZWNlaXZlTGFyZ2VQYXJjZWxzQW5kRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlLVRvUmVjZWl2ZU1haWxBbmRTbWFsbFBhcmNlbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1JlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWREZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uQ29udHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRmlybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGFudHNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRpbmdQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyQ3JlZGl0QWNjb3VudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyUmVmZXJyYWxDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclNlcnZpY2VQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXJDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdEJhbmsxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0QmFuazIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBhcnR5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFBlcnNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9wZXJhdG9yT3JMZXNzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclJldHVybkNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN1cnZleUFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50QW5udWl0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50QmVuZWZpY2lhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbnRPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBZG1pbmlzdHJhdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RlZFNlcnZpY2VQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0aW5nT2ZmaWNlclJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLUdlbmVyYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1MZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yLU1haW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsRGVsaXZlcnlNZXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxSZWNlaXB0TWV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZXJRdWFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZveWluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1PY2N1cGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT3BlcmF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUJ1eWluZ0dyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLVBhcnRpY2lwYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Qcm9kdWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU1lc3NhZ2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRpb25Gb3ItUHJvZml0RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lcnNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bmNpbE9mR292ZXJubWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJDbGFpbWFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZkV4cG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydEFwcG9pbnRlZEF0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRHcmFudG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzQXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJhdGluZ0FnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3J0aW5nQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3TWVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltZVZpY3RpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NDbGFpbWFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3MtVG93blN3aXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1RTY2FubmVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEVtcGxveWVyLVByaW1hcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRFbXBsb3llci1TZWNvbmRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZWNlaXZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9kaWFsUGFyZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b2RpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckZPcldob21TYW1lT3JTaW1pbGFyV09ya1dhc1BlckZvcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJJZGVudGlmaWNhdGlvbkZpbGVDdXN0b21lcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZkNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUHJvY2Vzc2luZ1NlcnZpY2VCdXJlYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JJbmRpdmlkdWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3ItSW4tUG9zc2Vzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0UGF5bWVudEF1dGhvcmlzYXRpb25QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjaXNpb25NYWtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNvbnNvbGlkYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdE9yRm9yZWNsb3N1cmVTcGVjaWFsaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbmRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGljYXRlc3NlbkRlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50aXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZKdXN0aWNlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50SW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50TmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25hdGVkSGF6YXJkb3VzV2FzdGVGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW5naW5lZXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaENoYXJnZVBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uRHJheW1hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25JbnRlcm1vZGFsUmFtcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25NYWlsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3N0aWNSYWRpb2lzb3RvcGVGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhbHlzaXNDZW50ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWZmZXJlbnRQcmVtaXNlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkSW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2luZ09mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZVBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaXBsaW5hcnlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwYXRjaGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0aWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQnJhbmNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RKdXN0aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdG9yT2ZPcHRvbWV0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3Rvck9mT3N0ZW9wYXRoeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NvdW50UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjb3VudFBhcnR5c0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QXBwbGljYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEJlbmVmaWNpYXJ5c0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UmVpbWJ1cnNpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFNlY29uZEJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudEN1c3RvZGlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRPck1lc3NhZ2VJc3N1ZXJPclNlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvaW5nQnVzaW5lc3NBcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbUZpcnN0U3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1NZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpbGxpbmdDb250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3AtT2ZmTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUdyb2NlcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhYmxlTWVkaWNhbEVxdWlwbWVudFN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY29ub21pY2FsbHlEaXNhZHZhbnRhZ2VkSW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUNvb3JkaW5hdG9yUG9pbnRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRmlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNSZWdpc3RyYXRpb25VdGlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUmV0dXJuT3JpZ2luYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlbWVudGFyeVNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2libGVQYXJ0eVRvVGhlQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmxlUGFydHlUb1RoZVJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURlcGFydG1lbnRTb2NpYWxXb3JrU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeU1lZGljYWxUZWNobmljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UmVzcG9uc2VVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2luZ1NtYWxsQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZU5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lclJlc3BvbnNpYmxlUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyUmV0dXJuQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5RXF1aXBtZW50RGVzcGF0Y2hQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlFcXVpcG1lbnRSZXR1cm5QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5SW5mb3JtYXRpb25BZG1pbmlzdHJhdGlvbi1Pd25lZE9pbEZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItQ29uc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlci1Db25zdWx0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJQaWxvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItUmVzaWRlbnRDb25zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlIb2xkaW5nVGhlSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eUluV2hpY2hBRmluYW5jaWFsSW50ZXJlc3RJc0hlbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVByb3ZpZGluZ1RoZVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVJlc3BvbnNpYmxlRm9yRm9sbG93LVVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50VGVjaG5pY2FsQXNzZXNzbWVudEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnREcm9wLU9mZlBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmVwYWlyUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1ZGVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGl2ZUNvbW1pdHRlZU1lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0b3JPZkVzdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlcnRXaXRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXgtU3BvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZENhcmVGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFjb3Jwb3JlYWxTaG9jay1XYXZlTGl0aG90cmlwdGVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXllRWFyTm9zZUFuZFRocm9hdEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3ItQ29ycmVzcG9uZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5TWVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXRoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEdvdmVybm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxseUNoYXJ0ZXJlZEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3RhdGVDb3VudHlPckNpdHlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVsbG93c2hpcEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWxvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkb3JCcmFuY2hPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxDdXN0b21lck9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNYWludGVuYW5jZVBlcmlvZERlc2lnbmF0aW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbE1lc3NhZ2VSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxQbGFubmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmVtYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QXBwcmFpc2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEJyZWFrVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml0bmVzc0NlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2RDZXJ0aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kRGV0ZXJtaW5hdGlvblByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yYWxEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kU2VydmljZU9wZXJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ0xlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkRpc2Nsb3N1cmVJbmZvcm1hdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkxhbmd1YWdlU3lub255bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlZ2lzdHJhdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVybHlEb2luZ0J1c2luZXNzQXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lcmx5S25vd25BcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUHJlc2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJSZWdpc3RlcmVkQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUmVzaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91bmRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91bmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZW9uQm9hcmRQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE1hbmFnZW1lbnRGYWNpbGl0YXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodE9yQ2hhcmdlc1BheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5ZXJPbkJlaGFsZk9mVGhlQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5ZXJPbkJlaGFsZk9mVGhlQ29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXR1cmVBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWluaW5nSW52ZW50b3J5TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJuaXNoZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1BsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvbkVuZGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uU3RhcnRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZXdheVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsSW5wYXRpZW50Q2FyZUZvckFJRFNPckFSQ0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVkaWNhbEFuZFN1cmdpY2FsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxNZXJjaGFuZGlzZURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmV0aWNDb3Vuc2VsaW5nT3JTY3JlZW5pbmdTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VyaWF0cmljQWN1dGVDYXJlVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VyaWF0cmljQ2xpbmljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lmdFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb2xsZWN0aW9uUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ3VzdG9kaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc093bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlbGVhc2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUNvbWJpbmVkQ29udHJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLU1pbGl0YXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1WZXRlcmFucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Rk9CUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRMb2FuQWdlbmN5U3BvbnNvck9yQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtTG9jYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW5kcGFyZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFudG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmRBbWJ1bGFuY2VTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWZmaWxpYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFmZmlsaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGluZ0NlbnRyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBQcmFjdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBQdXJjaGFzaW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJkaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVHZW5lcmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEFuZEJlYXV0eURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm9mZXNzaW9uYWxTaG9ydGFnZUFyZWFGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1pc2NlbGxhbmVvdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aFNjaWVuY2VzTGlicmFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVtb2RpYWx5c2lzRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc29wYXRob2xvZ3lMYWJvcmF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXNwYW5pY1NlcnZpY2VJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhpc3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aEFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aENhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhDb3Jwb3JhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUhlYWx0aFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lU3RhdGVOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxBdXhpbGlhcnlVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbERpc3RyaWN0T3JBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsVW5pdE9mQW5JbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxVbml0V2l0aGluQW5JbnN0aXR1dGlvbkZvclRoZU1lbnRhbGx5UmV0YXJkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3RpbGVXaXRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlZEZyb21Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FyZU9mUGFydHlObzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQ2FyZU9mUGFydHlObzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRlZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkp1cmlzZGljdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUGxhY2VPZkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50QWRqdXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVwZW5kZW50TGFiIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudFBoeXNpY2lhbnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEZvci1Qcm9maXRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlCdXJlYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZWxpZ2libGVQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk1haW50ZW5hbmNlQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlZmVyZW5jZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Tb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEZWFsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxNZWRpY2FsUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTdWJzY3JpYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmplY3Rpb25Qb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tUGF0aWVudFBoYXJtYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVNlcnZpY2VTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25BZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQW5kQWNjZXB0YW5jZVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxlYWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbk9uU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uYWxQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Gb3JNZW50YWxSZXRhcmRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU3RvcmVCYWtlcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2xhaW1BZGp1c3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRPclN1YnNjcmliZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXRlcmlhbE1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVsbGVjdHVhbFByb3BlcnR5T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0ZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUZ1bmRpbmdPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1UcnVzdGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmxpbmVTZXJ2aWNlQ29tbWl0bWVudEN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJhbmsxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCYW5rMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5T3JCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlTGV2ZWxQYXJlbnRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnJlaWdodEZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuc2hpcEVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJwcmV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNvbnRyb2xsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUNvbnRyb2xQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvbHZlZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJldm9jYWJsZUJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mRGViaXRPckNyZWRpdE1lbW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyT2ZXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1TaGlwVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1TaGlwRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRBbm51aXRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50QW5udWl0YW50T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50RGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludERlYnRvckF0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyQW5udWl0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyQW5udWl0YW50UGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJKb2ludEFubnVpdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckpvaW50QW5udWl0YW50UGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJQYXlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRWZW50dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuaW9ySGlnaFNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZURlZmVuZGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVWaWN0aW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlV2l0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5UGVyc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaWRuZXlEaWFseXNpc1VuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3VycGx1c0FyZWFGaXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kbG9yZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFyZ2VCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEJyZWFrVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEtub3duU291cmNlT2ZTdXBwbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RW5mb3JjZW1lbnRBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0Zpcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsUmVjZWl2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsVGl0bGVIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGluZ0luc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZXNTdXJ2ZXlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWFiaWxpdHlIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuSG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkTGlhYmlsaXR5Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZExpYWJpbGl0eVBhcnRuZXJzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUGFydG5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE1haWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdE93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXRlcmFsbHlUcmFuc2xhdGVkTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQXBwbGljYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQnJva2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQ29ycmVzcG9uZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkhvbGRlckZvclJlYWxFc3RhdGVBc3NldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbk9yaWdpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5TZXJ2aWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxDaGFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxHb3Zlcm5tZW50U3BvbnNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHNGb3JDdXN0b21zRXhhbWluYXRpb25CZWZvcmVDbGVhcmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZMb2FkRXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZQcmluY2lwYWxBc3NldHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZTcG90Rm9yU3RvcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ1Rlcm1DYXJlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmctVGVybURpc2FiaWxpdHlDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NpbmdJbnZlbnRvcnlNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzUGF5ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnaXN0cmF0ZUp1ZGdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWduZXRpY1Jlc29uYW5jZUltYWdpbmdGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpZGVuTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbmxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlT3JnYW5pemF0aW9uVXNlZEZvckVzdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW1tb2dyYXBoeVNjcmVlbmluZ0NlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Q29udHJvbEFjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50Tm9uLU9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnaW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnaW5nR2VuZXJhbEFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJPZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lU3VydmV5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlck93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRUaW1lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyay1Gb3JQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckdlbmVyYWxBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGlzcG9zaXRpb25BdXRob3JpemF0aW9uTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydENoYXJ0ZXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdERlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxEb2N0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbnN1cmFuY2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsTnVyc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdXJnaWNhbE9yT3RoZXJJbnRlbnNpdmVDYXJlVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFRyZWF0bWVudEV4ZWN1dGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbFRyZWF0bWVudFByZXNjcmliZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVnYXZvbHRhZ2VSYWRpYXRpb25UaGVyYXB5VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFudEJhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkQ29tcGFueVdpdGhSZXRhaW5lZElkZW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZWROYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlcmluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXhpY2FuQ3VzdG9tc0Jyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkZGxlU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWdyYW50SGVhbHRoQ2xpbmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUJyYW5jaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJveWFsdHlQYXlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5LU93bmVkQnVzaW5lc3NMYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHktT3duZWRCdXNpbmVzc1NtYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzSGVhbHRoQ2FyZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25pdG9yaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUxpYWJpbGl0eUFjY291bnRIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZVJlcG9ydFByb3ZpZGVyQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lQ2hhbmdlZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lTm90VG9CZUNvbmZ1c2VkV2l0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZW9uQ3JlZGl0Q2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVVuZGVyV2hpY2hGaWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVZhcmlhdGlvblN5bm9ueW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ2hhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpdmVIYXdhaWlhbk9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF2eUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdsZWN0ZWRPckRlbGlucXVlbnRJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWlnaGJvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3Job29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZW9uYXRhbEludGVuc2l2ZUNhcmVVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXR3b3JrTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QXNzaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U2VjdXJlZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld3NwYXBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3VwcGx5U291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0RGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlja25hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vSGVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGVkQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGVkRnJlaWdodENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Eb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25lbXBsb3ltZW50SW5jb21lU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSGVhbHRoQ2FyZU1pc2NlbGxhbmVvdXNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1JbnZhc2l2ZUNhcmRpYWNBc3Nlc3NtZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Nb3J0Z2FnZUxpYWJpbGl0eUFjY291bnRIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1PY2N1cGFudENvLUJvcnJvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJvZHVjdGlvblN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25wcm9maXRJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJhaWxyb2FkRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25SZWdpc3RlcmVkQnVzaW5lc3NOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVnaXN0ZXJlZEludmVzdG1lbnRBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50Q3JlZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudERlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50R3JvdXBDb21wYW55V2l0aFdob21GaW5hbmNpYWxBY2NvdW50SXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEluc3RydWN0aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudFRoaXJkUGFydHlDb21wYW55V2l0aFdob21GaW5hbmNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1UZW1wb3JhcnlTdG9yYWdlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5UHVibGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RlQ28tU2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RGb3JQcm9maXRIZWFsdGhDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eUZvclNoaXBwZXJzT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVBhcnR5Tm8xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eU5vMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lQ2hhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmF0aW9uUm9vbVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnN0ZXRyaWNzQW5kR3luZWNvbG9neUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnN0ZXRyaWNzVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbEhlYWx0aFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxUaGVyYXB5U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVGFyaWZmQ29uZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0T3BlcmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbEFuZEdhc0N1c3RvZGlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQW5kR2FzUmVndWxhdG9yeUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkQXNzaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZERlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkU2VjdXJlZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkJlaGFsZk9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbi1DYWxsUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uY29sb2d5Q2VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLUhlYXJ0U3VyZ2VyeUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yLUNvbW11bmljYXRpb25DaGFubmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvci1Fc3NlbnRpYWxTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlByb3BlcnR5T3JFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZQcm9wZXJ0eU9yVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JPZlRoZVNvdXJjZVRyYW5zZmVyUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVUcmFuc2ZlclBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9mU2hpcHBlcnNPcmRlcnMtVHJhbnNwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT2ZUaGVTaGlwcGVyUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyV3JpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkNvbXBsZXRpbmdDb25maWd1cmF0aW9uQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25Hcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uSGF2aW5nU291cmNlQ29udHJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVkT3V0cGF0aWVudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZWRTb2NpYWxXb3JrU2VydmljZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuT3JUaXNzdWVUcmFuc3BsYW50VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxDbGFpbWFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJbnRlcm1vZGFsUmFtcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxKdXJpc2RpY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTaGlwcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRvck9mQXJ0aWNsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luRHJheW1hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luTWFpbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5TdWJsb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvcGVkaWNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9wZWRpY1N1cmdlcnlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEZXBhcnRtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5kaXZpZHVhbERpc2FiaWxpdHlDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTm90LUZvci1Qcm9maXRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQZXJzb25PckVudGl0eUFzc29jaWF0ZWRXaXRoU3R1ZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUmVsYXRlZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclNwZWNpYWx0eUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkVHlwZU9mT3JnYW5pemF0aW9uYWxFbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U29jaWFsV29ya1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRwYXRpZW50U3VyZ2ljZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVJbnNwZWN0aW9uQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUHJvY2Vzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlVGVzdEFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJpZGVJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyQW5udWl0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckFubnVpdGFudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckpvaW50QW5udWl0YW50UGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZNZWFuc09mVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZQcm9wZXJ0eU9yVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlJlc2lkZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT3JMZXNzb3JzU3VydmV5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyUGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duaW5nSW52ZW50b3J5Q29udHJvbFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbWVkaWNhbENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nTGFib3JhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzaGlwRm9yLVByb2ZpdEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVtYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRzRGlzdHJpYnV0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QWNjb3JkaW5nVG9Eb2N1bWVudGFyeUNyZWRpdFRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUFzc2lnbmluZ0FTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXRGaW5hbFBsYWNlT2ZQb3NpdGlvbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdFBpY2stVXBMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemVkdG9EZWZpbml0aXplQ29udHJhY3RBY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXplZFRvTWFrZURlZmluaXRlQUNvbnRyYWN0QWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6aW5nRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXppbmdSZWxlYXNlT2ZTZWN1cml0eUluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURhdGFSZXNwb25zaWJsZVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlY2xhcmluZ1RoZVZhbHVlQWRkZWRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvRXhlY3V0ZVJlLUljaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb0V4ZWN1dGVTYW5pdGFyeVByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RGVzaWduYXRlZFRvUHJvdmlkZUxpdmluZ0FuaW1hbENhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RXhlY3V0aW5nQW5kVmVyaWZ5aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZpbGxpbmdTaGlwcGVyc09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZvcldob21JdGVtSXNVbHRpbWF0ZWx5SW50ZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnJvbVdob21DdXN0b21zRG9jdW1lbnRzQXJlVG9CZVBpY2tlZFVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZyb21XaG9tTm9uLUN1c3RvbXNEb2N1bWVudHNBcmVUb0JlUGlja2VkVXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5RnVsZmlsbGluZ0FsbE9wZXJhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5Qb3NzZXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUlzc3VpbmdNdXR1YWxseUFncmVlZENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1haW50YWluaW5nVGhlQ29kZXNVc2VkSW5UaGVNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1haW50YWluaW5nVGhlSWRlbnRpZmllcnNVc2VkSW5UaGVNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1hbmRhdGVkVG9MaXF1aWRhdGVBbkVudGVycHJpc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5TWFudWZhY3R1cmVkRm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU5vdFRvQmVDb25mdXNlZFdpdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGFzc2luZ1RoZVRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdDZXJ0aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBlcmZvcm1pbmdDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nSW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nVGFzayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nVmVyaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVByb3ZpZGluZ0ZpbmFuY2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQcm92aWRpbmdHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVjb3ZlcmluZ1RoZVZhbHVlQWRkZWRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVwcmVzZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JEaXNpbmZlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UmVzcG9uc2libGVGb3JGaW5hbmNpYWxTZXR0bGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yUmVmdWVsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVN1Ym1pdHRpbmdRdW90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUaGF0UmVjZWl2ZWREaXNjbG9zdXJlU3RhdGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRoYXRSZW1pdHNQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvQXBwZWFyQmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQXBwcm92ZVNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9iZWFkdmlzZWQtV3JpdHRlbk9yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0JlQmlsbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvQmVCaWxsZWRGb3JPdGhlclRoYW5GcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9GaWxlUGVyc29uYWxQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0xlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUGVyZm9ybVBhY2thZ2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1ByaW50U29tZURvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUHJvdmlkZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUFsbERvY3VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWNhdGVPZkNvbXBsaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWNhdGVPZkNvbmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmllZEluc3BlY3Rpb25SZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ2VydGlmaWVkVGVzdFJlc3VsdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29tbWVyY2lhbEludm9pY2VSZW1pdHRhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvbnRyYWN0U2VjdXJpdHlDbGFzc2lmaWNhdGlvblNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29weSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb3JyZXNwb25kZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ3VzdG9tc0RvY3VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVFbGVjdHJvbmljTWVtb09mSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRnJlaWdodEJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW5zcGVjdGlvblJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnZpdGF0aW9uVG9PZmZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVJbnZvaWNlRk9yR29vZHNPclNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUludm9pY2VGb3JMZWFzZVBheW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZUxpbWl0YXRpb25zT2ZIZWF2eUVsZW1lbnRzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZU1hdGVyaWFsUmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVOb24tQ3VzdG9tc0RvY3VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVPcmRlclRvU3VwcGx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVBhY2tpbmdDcmF0aW5nQW5kSGFuZGxpbmdDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUGFwZXJNZW1vT2ZJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVByb3Bvc2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVB1cmNoYXNlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlUmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTY2FsZVRpY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTaGlwcGluZ01hbmlmZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVNoaXBwaW5nTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVNvbGljaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTdGF0ZW1lbnRPZkFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU3RhdGVtZW50T2ZGZWVzRHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVUZWNobmljYWxEb2N1bWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVRlc3RSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlVHJhbnNwb3J0YXRpb25DcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9XaG9tQWNrbm93bGVkZ21lbnRTaG91bGRCZVNlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9XaG9tRG9jdW1lbnRzQXJlVG9CZVByZXNlbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1dob21Qcm90ZXN0U3VibWl0dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdhaXZpbmdSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hpY2hEZWxpdmVyc0NvbnNpZ25tZW50c1RvVGhlVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2hpY2hQaWNrc1VwQ29uc2lnbm1lbnRzRnJvbVRoZVRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdob1NpZ25lZFRoZURlbGl2ZXJ5UmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaXRoS25vd2xlZGdlT2ZBZmZhaXJzT2ZUaGVDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdpdGhQb3dlclRvVm90ZVNlY3VyaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudENvbXBhbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEVkdWNhdGlvblVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudFJlcHJlc2VudGF0aXZlU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNDb21wYW55TmFtZU9ySWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllck9mTGFzdFJlc29ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzQ29tcGFueU5hbWVPcklkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5aW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheS1Ub1Byb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRlc3RyaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWRpYXRyaWNBY3V0ZUlucGF0aWVudFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1lZEF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbkZvcldob3NlQmVuZWZpdFByb3BlcnR5d2FzU2VpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9uQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlMZWdhbGx5UmVzcG9uc2libGVGb3JBQ2hpbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlMZWdhbGx5UmVzcG9uc2libGVGb3JBbmRXaXRoV2hvbUFDaGlsZFJlc2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbk9yT3RoZXJFbnRpdHlXaXRoV2hvbUFDaGlsZFJlc2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uaW5nQ3JlZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uaW5nQ3JlZGl0b3JzQXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWNpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxUaGVyYXB5U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuQ2xpbmljT3JHcm91cFByYWN0aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5Ib3NwaXRhbE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuLVNwZWNpYWxpc3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Qm91bmRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCb3R0bGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGlzdGlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZk9jY3VycmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZQZXJmb3JtYW5jZUNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFpbnRpZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5BZG1pbmlzdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ09yTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nQ29tbWlzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdTY2hlZHVsZU9yTWF0ZXJpYWxSZWxlYXNlSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuU3BvbnNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Q2xlYXJhbmNlT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9kaWF0cmlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pbnRPZlNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5V3JpdGluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xsaW5nU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsTWFpbGluZ0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RzZWNvbmRhcnlFZHVjYXRpb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RzZWNvbmRhcnlFZHVjYXRpb25TZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtU2Vjb25kYXJ5SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGVudGlhbFNvdXJjZU9mU3VwcGx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlck9mQXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtS0RheUNhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1raW5kZXJnYXJ0ZW5Ub0dyYWRlMTJSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1raW5kZXJnYXJ0ZW5Ub0dyYWRlMTJTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5Q3VzdG9tZXJPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5SW5zcGVjdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeU1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeU1haW50ZW5hbmNlUGVyaW9kRGVzaWduYXRpbmdPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5UmVmZXJyZWRUb09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCdXNpbmVzc1BhcnRuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0R3JhbnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWJ0SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Rpc3RyaWJ1dG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0dyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0luc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmFtZU9mRmlybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOZWlnaGJvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPY2N1cGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUaXRsZUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVHJhZGVVbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZG1pbmlzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNoZWNrU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlIZWFsdGhDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnN1cmVkT3JTdWJzY3JpYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50ZXJleGNoYW5nZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRlcm5hdGlvbmFsVGVsZWNvbUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnRyYS1MQVRBQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludmVudG9yeUNvbnRyb2xBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTdXBwb3J0T3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U3VyZ2VvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVRheHBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsQm9ycm93ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbEV4ZWN1dGl2ZU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUGVyc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJhc2VKdXJpc2RpY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0SW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbnN1cmFuY2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclRpdGxlRXZpZGVuY2VIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVQcmUtS0VkdWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvQm9ub0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50UmVzcG9uc2liaWxpdHlGb3JPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZURlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBvc2l0aW9uSG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2VydmljZXNBbmRSZXBhaXJzQ2VudHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb29yZGluYXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3JCdWlsZGluZ01hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VkSW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb1NlQ291bnNlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0NoaWxkT3JBZG9sZXNjZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljQ29uc3VsdGF0aW9uLUxpYWlzb25TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNFZHVjYXRpb25TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNFbWVyZ2VuY3lTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNHZXJpYXRyaWNTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNIZWFsdGhGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNJbnBhdGllbnRVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY091dHBhdGllbnRTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNQYXJ0aWFsSG9zcGl0YWxpemF0aW9uUHJvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaG9sb2dpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0FsdGVybmF0aXZlU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhTZXJ2aWNlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0hlYWx0aFNlcnZpY2VJbmRpYW5TZXJ2aWNlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY29yUHJpdmF0ZU9yZ2FuaXphdGlvbkZvclRoZURpc2FibGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNQcmUtS0VkdWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bXBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VkQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc0RlcGFydG1lbnRCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZnlpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGF0aW9uUmVxdWVzdGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZUltcGxhbnRzVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9Db250cm9sU3RhdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb1N0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TWV0ZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdFpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJPZkNoZXF1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJPZkZ1bmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNDb3JyZXNwb25kZW50QmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJTaXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNTdWItRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGYWNpbGl0eVNjaGVkdWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQb2ludEZvckN1c3RvbWVyU2FtcGxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nU3ViLUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRPZkNpdmlsb3JMZWdhbExpYWJpbGl0eVBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmQtS2VlcGluZ0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Um9vbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmVhdGlvbmFsVGhlcmFweVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZXNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyaW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJpbmdQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5T3BlcmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzYWxQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJ1c2luZXNzTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEludmVzdG1lbnRBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRQcmluY2lwYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nTm9ucGFyZW50UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nUGFyZW50UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uVHJpYnVuYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXJEZWFsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlTdGF0ZURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5U3RhdGVFbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uSW5wYXRpZW50VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoYWJpbGl0YXRpb25PdXRwYXRpZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW1idXJzaW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VJbnRlcm1lZGlhcnlPckJyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURyYXltYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VUb1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5kZXJpbmdQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50UGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpcmluZ091dGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyT3JSZWZ1cmJpc2hMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjaW5nTWFudWZhY3R1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nQ2FycmllcnNOb21pbmF0ZWRBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcm9kdWN0aXZlSGVhbHRoU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZExlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGVDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlYXJjaEluc3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2b2lyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VPckRvbWljaWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY3lJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRJbnN0cnVjdGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwaXJhdG9yeVRoZXJhcHlTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcGl0ZUNhcmVGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVFeGhpYml0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlR292ZXJubWVudEFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVJbnN0YWxsYXRpb25EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVJbnN0YWxsYXRpb25PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFBoYXJtYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyb2Nlc3Npb25haXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdHlPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVyYWxIZWFsdGhDbGluaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQXNzaXN0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNwZXJzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVzcG9uc2liaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbC1CYXNlZFNlcnZpY2VQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDb3Jwb3JhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyZWVuaW5nUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWxpbmdDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlJbnZlbnRvcnlDb250cm9sQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUxvY2F0aW9uQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVRheHBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlXYXJyYW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZENvbnRhY3RPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEhvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZExldmVsUGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb244QVByb2dyYW1QYXJ0aWNpcGFudEZpcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZFBhcnR5SW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyQXNPZmZpY2lhbGx5UmVnaXN0ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyT2ZGdW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0NvcnJlc3BvbmRlbnRCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5pb3JNZW1iZXJzaGlwUHJvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1hbmNlU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ0RlYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbHRlcmVkV29ya3Nob3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0xpbmVTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1NjaGVkdWxlSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3dpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2libGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25pZmljYW50T3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVBob3RvbkVtaXNzaW9uQ29tcHV0ZXJpemVkVG9tb2dyYXBoeVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGVPcGVyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZE51cnNpbmdvck90aGVyTG9uZy1UZXJtQ2FyZVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlcmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbG90Q2hhcnRlclBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJhc2VTdGF0aW9uTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbGx5RGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseURpc2FkdmFudGFnZWRJbmRpdmlkdWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseUluc3VyZWRQZXJzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXRpZXNDb2xsZWN0b3JzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5T2ZQcm9wZXJ0eUluZm9ybWF0aW9uQ29tcGlsZXJzQW5kQW5hbHlzdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvQW5kU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9JZkRpZmZlcmVudEZyb21CaWxsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGVQcm9wcmlldG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU1ldGVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZVBhcnR5T2ZJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb3Vuc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsaXplZE1vYmlsZVJhZGlvU2VydmljZUxpY2Vuc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsaXplZE91dHBhdGllbnRQcm9ncmFtRm9yQUlEU09yQVJDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpZWRSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlY2hUaGVyYXB5U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3J0c01lZGljaW5lQ2xpbmljT3JTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHVkQ29udHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ2hhcnRlcmVkRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGl2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtc2hpcENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NraG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5YXREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUZhY2lsaXR5QXRPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUNsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZUtlZXBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkeVN1Ym1pdHRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLUFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0T3JDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3Rvci1Ob21pbmF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JXaXRoRGlyZWN0UGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLUVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZ3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RPZklucXVpcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXJPZlNhbXBsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlcnNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlcnNTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVNlcnZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJ5RGl2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2Vzc2Z1bEpvYkFwcGxpY2FudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNpbmdIZWFsdGhDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzaW5nUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yeUFwcHJhaXNlck5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllck9yTWFudWZhY3R1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNDb3Jwb3JhdGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyV29ya1RlYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydGluZ1BlcnNvbm5lbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUZvckFkZGl0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Rm9yQW50aWR1bXBpbmdPckNvdW50ZXJ2YWlsaW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURpc2NoYXJnZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZU1hbmFnZW1lbnRFbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmdlb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnBsdXNEZWFsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yLVBvZmVzc2lvbmFsUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleW9yVG9wb2dyYXBoaWNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rRmFybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm1Pd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheENvbGxlY3RvcnNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4ZW1wdE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVBbnN3ZXJpbmdTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudE1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVydGlhcnlQYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0xhYm9yYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3BvbnNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlYXRlckNpcmN1aXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcGV1dGljUmFkaW9pc290b3BlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBZG1pbmlzdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5SW52ZXN0bWVudEFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlNYXJrZXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlcHJpY2luZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlcHJpY2luZ1ByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmV2aWV3aW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmV2aWV3aW5nUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlaG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZUluc3VyYW5jZVNlcnZpY2VzUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlVW5kZXJ3cml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdEZXNpZ24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdGYWJyaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9wUGFyZW50Q29tcGFueUluU2FtZUNvdW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd2luZ0FnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVuYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZU5hbWVTeW5vbnltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZVVuaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0luc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlclBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdENoYXJnZVBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0RnJlaWdodEZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFByaW5jaXBhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdFByaW5jaXBhbHNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0ZXJPZkhhemFyZG91c1dhc3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXVtYUNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWJhbEdvdmVybm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlc0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdE9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0T3JFc3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmVyY3Vsb3Npc0FuZE9UaGVyUmVzcGlyYXRvcnlEaXNlYXNlc0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVQYXJlbnRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVNhbWVDb3VudHJ5UGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0cmFzb3VuZFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYXNzaWduZWRBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZXhwZWN0ZWRIYW5kbGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzQ3VzdG9tc0Jyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzT3ZlcnNlYXNTZWN1cml0eUFkbWluaXN0cmF0aW9uT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNpdHktQ29sbGVnZU9yU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zZXJ2aWNlYWJsZU1hdGVyaWFsQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbU1ldGVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVHJ1c3RlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl6YXRpb25NYW5hZ2VtZW50T3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbkhvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZE5ldHdvcmtQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUN1c3RvZGlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVNhbHZhZ2VBc3NpZ25tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE1hc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbi1Pd25lZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW5zQWRtaW5pc3RyYXRpb25Mb2FuQXV0aG9yaXplZFN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uTG9hbkd1YXJhbnR5QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyaW5hcnlIb3NwaXRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmljdGltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWRlb0RlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGVlclNlcnZpY2VzRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VFYXJuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlRGVwb3NpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VLZWVwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJBbWJ1bGFuY2VTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2FzaW5nRGVwdGhBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQYWRDb25zdHJ1Y3Rpb25Db250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sbHktT3duZWRTdWJzaWRpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW5uZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvckRlZmVuZGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvclBsYWludGlmZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzc0ZvclByb3NlY3V0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzTGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWFuLU93bmVkQnVzaW5lc3NTbWFsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tZW5zSGVhbHRoQ2VudGVyT3JTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NpdGVIZWFsdGhQcm9tb3Rpb25GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGVhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdGluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLVJheVJhZGlhdGlvblRoZXJhcHlVbml0Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlclJlZmVyZW5jZXMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudENvZGUiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udHJhY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVvdGVSZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3RoZXJPcmRlclJlZmVyZW5jZXMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclJlZmVyZW5jZXMiIHR5cGU9Ik9yZGVyUmVmZXJlbmNlcyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZOdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlIiB0eXBlPSJSZWZlcmVuY2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRyYWN0Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250cmFjdCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udHJhY3QiIHR5cGU9Ikxpc3RPZkNvbnRyYWN0Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJRCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb250cmFjdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3lzdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0IiB0eXBlPSJDb250cmFjdCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSWRlbnRpZmllciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJZGVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSWRlbnRpZmllciIgdHlwZT0iSWRlbnRpZmllciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWdlbmN5Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2VuY3lDb2RlZCIgdHlwZT0iQWdlbmN5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWdlbmN5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWdlbmN5RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGVkIiB0eXBlPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2VuY3kiIHR5cGU9IkFnZW5jeSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBZ2VuY3lDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUFNVkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCQ0QtVGhlTWljcm9jb21wdXRlckluZHVzdHJ5QXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDR0lIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ09SRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdJbmR1c3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUVDTUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJSEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydEFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGFiYW1hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGFza2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdW1pbnVtQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuQXBwYXJlbE1hbnVmYWN0dXJlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5GdXJuaXR1cmVNYW51ZmFjdHVyZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuSXJvbkFuZFN0ZWVsSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkxhbmRUaXRsZUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbk1lZGljYWxBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QYXBlckluc3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQV0FBbmRPQ1NJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblNvY2lldHlGb3JBdXRvbWF0aW9uSW5QaGFybWFjeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UZXh0aWxlTWFudWZhY3R1cmVyc0luc3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5TSUFjY3JlZGl0ZWRTdGFuZGFyZHNDb21taXR0ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyaXpvbmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFya2Fuc2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU01FIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5QnV5ZXJPckJ1eWVyc0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeURpc3RyaWJ1dG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TWFudWZhY3R1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TWFya2V0UGxhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlOYXRpb25hbFRyYWRlQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5T3duZXJPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVBhcnR5T3JpZ2luYXRpbmdUaGVNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5U2VsbGVyT3JTZWxsZXJzQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlUcmFuc3BvcnRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1RNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtR2VsZGF1c2dhYmVhdXRvbWF0ZW5TZXJ2aWNlR2VzZWxsc2NoYWZ0TUJIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1BdXN0cmlhbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUF1c3RyaWFuUFRUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1WZXJiYW5kT2VzdGVycmVpY2hpc2NoZXJCYW5rZW5VbmRCYW5raWVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQUNPUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQURBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BSUhXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BUENBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BUUlTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1BdXN0cmlhbkN1c3RvbXNTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ET0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUhJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtTElGQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtTkNDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtUk9BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1TQUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVRyYWRlZ2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWVNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUtQmVsZ2lhbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5NaW5pc3RyeU9mRmluYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVsbGNvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tJbmR1c3RyeVN5c3RlbXNBZHZpc29yeUNvbW1pdHRlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlItQmFuY29DZW50cmFsRG9CcmF6aWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSLU1BQW5kUkFBQW5kTElNTkVUQW5kUklORVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLUNQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EtQ1NJTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsaWZvcm5pYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsaWZvcm5pYUxhbmRUaXRsZUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkZyZWlnaHRDbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYmlkZU1hbnVmYWN0dXJlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLVJldmVudWVDYW5hZGFDdXN0b21zQW5kRXhjaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLVNDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0NDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFQ0RHWElJSUQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYSTAxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYSUIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hYWElWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUZJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUFkbWluaXN0cmF0aW9uRmVkZXJhbGVEZXNDb250cmlidXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1Bc3NvY2lhdGlvblN1aXNzZUNvZGVEZXNBcnRpY2xlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQ2FyYnVyYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQ2VudHJhbGVTdWlzc2VQb3VyTEltcG9ydGF0aW9uRHVDaGFyYm9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1EaXJlY3Rpb25HZW5lcmFsZURlc0RvdWFuZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILURpdmlzaW9uRGVzSW1wb3J0YXRpb25zRXRFeHBvcnRhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUVudHJlcHJpc2VEZXNQVFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILU1pbmlzdHJ5T2ZUYXhhdGlvbkNlbnRyYWxDdXN0b21zQW5kVGF4QWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILU9mZmljZUZpZHVjaWFpcmVEZXNJbXBvcnRhdGV1cnNEZURlbnJlZXNBbGltZW50YWlyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILVN3aXNzU2VjdXJpdGllc0NsZWFyaW5nQ29ycG9yYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILVRlbGVrdXJzQUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRUNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlQXNzaWduZWRCeVRoZU9yZ2FuaXphdGlvblRoYXRJc1RoZVVsdGltYXRlRGVzdGluYXRpb25PZlRoZVRyYW5zYWN0aW9uU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTy1ESUFOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvcmFkbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWFuZGVyUm9tZUFpckRldmVsb3BtZW50Q2VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jb3JkRURJR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RpY3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uc09uU0FEQW5kVHJhbnNpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29wcGVyQW5kQnJhc3NGYWJyaWNhdG9yc0NvdW5jaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPLVNCREMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eURlc2lnbmF0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDU0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTSUV4dGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVNJUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1BUkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJESSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQklBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CUkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLURJTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRFRBRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtRURJQkFVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlTG9naXN0aWNzQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HRFYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdlcm1hbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR2VybWFuQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR01CSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXdhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkFpckZvcmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZBcm15Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZIZWFsdGhBbmRIdW1hblNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZIb3VzaW5nQW5kVXJiYW5EZXZlbG9wbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mTGFib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZlRoZU5hdnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLVNpZW1lbnNBRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtVkRBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERkFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdGlvbkdlbmVyYWxlRGVzRG91YW5lc0V0RHJvaXRzSW5kaXJlY3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mQ29sdW1iaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1FQU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLU1IQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstTkJIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1QQlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpYnVpbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaWVsTm9yZGljRm9ydW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESUZJQ0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRFVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESVRFWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUVHNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUlEWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNVdGlsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNJbmR1c3RyaWVzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTRFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTLU9ERVRUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUy1TcGFuaXNoQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVUtRURJRklDQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLUVUSVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLVJPRkVSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQVNMSU5DIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQ0MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZDSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkRBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsR292ZXJubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhpZ2h3YXlBZG1pbmlzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLUFUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktRmlubmlzaEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLVRCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1UaGVGaW5uaXNoQmFua2Vyc0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9yaWRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQUdGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1BcnZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1CYW5xdWVEZUZyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQ0ZPTkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUNOQU1UUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRENQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1ER0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESUZDQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESUZSQU5DRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItRURJVFJBTlNQT1JUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1HQUxJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItR0VOQ09EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1JTlNFRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItUkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BQkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFCVEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFydGljbGVOdW1iZXJBc3NvY2lhdGlvbkxpbWl0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUFzc29jaWF0aW9uRm9yUGF5bWVudENsZWFyaW5nU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUJBQ1NMaW1pdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1DSEFQU0FuZFRvd25DbGVhcmluZ0NvbXBhbnlMaW1pdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1GTEVFVE5FVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItSE1DdXN0b21zQW5kRXhjaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1PREVUVEUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLVRoZUNsZWFyaW5nSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb3JnaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBoaWNzQ29tbXVuaWNhdGlvbnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUi1HcmVla0N1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RJTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF3YWlpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZUFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISy1Ib25nS29uZ0N1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVBTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFSQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNBTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkYWhvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUtUmV2ZW51ZUNvbW1pc3Npb25lcnNDdXN0b21zQUVQcm9qZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTC1Jc3JhZWxDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxpbm9pcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpYW5hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlckNvbnRhaW5lckludGVyRnJpZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3NvY2lhdGlvbk9mQ29ycG9yYXRpb25BZG1pbmlzdHJhdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc29jaWF0aW9uT2ZJbmR1c3RyaWFsQWNjaWRlbnRCb2FyZHNBbmRDb21taXNzaW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkc09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW93YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25BbmRTdGVlbFN0YW5kYXJkc0NvbW1pdHRlZUlTTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVMtSWNlbGFuZEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlU2VydmljZXNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1Bc3NvY2lhemlvbmVCYW5jYXJpYUl0YWxpYW5hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1JdGFsaWFuQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtT0RFVFRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVC1Tb2NpZWF0YUludGVyYmFuY2FyaWFQZXJMQXV0b21hemlvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkphcGFuZXNlU3RhbmRhcmRzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLUphcGFuQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTU9UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1NU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU5BQ0NTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5zYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlbnR1Y2t5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzaW5nSW5kdXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVBbmRBbm51aXR5SW5kdXN0cnlDb21taXR0ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxJLUxpZWNodGVuc3RlaW5BdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxsb3lkc1JlZ2lzdGVyT2ZTaGlwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG91aXNpYW5hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUtTHV4ZW1ib3VyZ0N1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyeWxhbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3NhY2h1c2V0dHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0UHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pY2hpZ2FuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5uZXNvdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3Npc3NpcHBpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzb3VyaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGFuYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYW5rZXJzQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLURhZ2FuZ05ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktTWFsYXlzaWFDZW50cmFsQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVktTWFsYXlzaWFDdXN0b21zQW5kRXhjaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUdTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFsY29ob2xCZXZlcmFnZUNvbnRyb2xBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBc3NvY2lhdGlvbk9mQnVzaW5lc3NBbmRFZHVjYXRpb25hbFJhZGlvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzRm9ybXNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDZW50ZXJmb3JTdGF0ZUNvdXJ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3R0b25Db3VuY2lsT2ZBbWVyaWNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxNZXJjaGFudHNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxXaG9sZXNhbGVEcnVnZ2lzdHNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJhbEdhc1V0aWxpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkNJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVicmFza2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FTUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmFkYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SGFtcHNoaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdKZXJzZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01leGljbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3c3BhcGVyQXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JQ0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JT1NIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0aGVybGFuZHNSYWlsd2F5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtQmFua0dpcm9jZW50cmFsZUJWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1CRUFORVRCViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtRUFOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1JbnRlcnBheUNhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1JbnRlcnBheUdpcmFhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtTmV0aGVybGFuZHNDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTC1PREVUVEUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcndlaWdpYW5TdGF0ZVJhaWx3YXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1OT1JQUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkJhbmtlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTm9yd2VnaWFuSW50ZXJiYW5rUmVzZWFyY2hPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYS1UZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeUZvcnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aENhcm9saW5hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aERha290YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlRQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWi1OZXdaZWFsYW5kQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0RFVFRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZk1hbmFnZW1lbnRBbmRCdWRnZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VQcm9kdWN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2hpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2tsYWhvbWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxJbmR1c3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JlZ29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPU0hBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5uc3lsdmFuaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbm5zeWx2YW5pYUNvdXJ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1DQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtUG9ydHVndWVzZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULVNJQlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVJbmZvcm1hdGlvbkluZHVzdHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaG9kZUlzbGFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUklORVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVS1CSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVLVNGVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0FFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQS1TYXVkaUFyYWJpYUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1DZW50cmFsQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtT0RFVFRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1TdmVuc2thQmFua2ZvZXJlbmluZ2VuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRS1Td2VkaXNoQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lTQUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3V0aENhcm9saW5hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3V0aERha290YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBZ2VuY3lBc3NpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudExvYW5HdWFyYW50b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUxDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNJbmR1c3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5SGVscEluZHVzdHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5uZXNzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleGFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhc0xhbmRUaXRsZUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0aWxlRGlzdHJpYnV0b3JzQXNzb2NpYXRpb25JbmMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREQ0MtRURJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFctQ2hpbmVzZVRhaXBlaUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXLVRyYWRlLXZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkVDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5DVEFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNDb3VydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc01hcmluZUNvcnBzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNOdWNsZWFyUmVndWxhdG9yeUNvbW1pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BSUFHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUlTSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFOU0lBU0NYMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFQSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVNUTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQVRGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1CQVRGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1CWEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNISVBTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DSURYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ09QQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURBbmRCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EQ0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURFQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtREhIUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRElTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRElTQ1VTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ETE1TTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPREFBQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9MIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURTQUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUVJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRkNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GREEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZJUFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZNQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRldTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1HU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhCSUNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ISSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEw3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1JU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU1BUkFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQUJDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkFJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOYXRpb25hbENlbnRlckZvckhlYWx0aFN0YXRpc3RpY3NDb21taXNzaW9uT2ZQcm9mZXNzaW9uYWxBbmRIb3NwaXRhbEFjdGl2aXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5hdGlvbmFsTW90b3JGcmVpZ2h0Q2xhc3NpZmljYXRpb25Bc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OQ0NNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTklTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTlJDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OV0RBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PRFRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PRkFDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1PTUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVERDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVUNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VTi1TUFNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VT1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVTQ2Vuc3VzQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU0N1c3RvbXNTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU1BTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1WQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVklDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtV1NTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRhaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0eUluZHVzdHJ5R3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcm1vbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJQ1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpcmdpbmlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXNoaW5ndG9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZXN0VmlyZ2luaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldITUlTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXNjb25zaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ild5b21pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yR2VuZXJhbE9mQ2FuYWRhIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvZGVMaXN0SWRlbnRpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlU2l0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50UGFyYW1ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3JkRXVyb3BlZW5SZWxhdGlmQXVUcmFuc3BvcnRJbnRlcm5hdGlvbmFsRGVzTWFyY2hhbmRpc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50QW5hbHlzaXNDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENoYXJhY3RlcmlzdGljc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRSZWxhdGlvbnNoaXBUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbkFkdmljZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uTWV0aG9kQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25NZXRob2RTdWZmaXhDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0ZVByaW5jaXBhbGVFeGVyY2VlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWl0dGluZ0RpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzZUV2ZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzZUV2ZW50T3V0Y29tZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlkVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNvbW1vZGl0eUFuZFNwZWNpYWxIYW5kbGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0TWlzc2lvbkRlc2lnblNlcmllc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRpbWVuc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRPckNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcnBvcnRUZXJtaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVGVybWluYWxJZGVudGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxQYXRpZW50RGlhZ25vc2lzUmVsYXRlZEdyb3VwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUGF0aWVudFJlZmluZWREaWFnbm9zaXNSZWxhdGVkR3JvdXBzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9uTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWJ1bGF0b3J5UGF0aWVudEdyb3VwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50Q29kZS1DdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBzeWNoaWF0cmljQXNzb2NpYXRpb25EaWFnbm9zdGljU3RhdGlzdGljYWxNYW51YWxPZk1lbnRhbERpc29yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Tb2NpZXR5Rm9yVGVzdGluZ0FuZE1hdGVyaWFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVBvbGFyaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVN0cnVjdHVyZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudENsYXNzaWZpY2F0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25BY2tub3dsZWRnZW1lbnRBbmRFcnJvckNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25RdWVzdGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJlc3RSZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGljbGVTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0RGV0YWlscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRSZWN1cnJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFN0YXR1c09yVHJhbnNhY3Rpb25SZXBvcnRpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFRyYW5zZmVyU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5UmVjZWl2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc0RlcHJlc2NyaXB0aW9uRGlzdHJpYnV0aW9uTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzRGVwcmVzY3JpcHRpb25FeGNlcHRpb25MaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNSYXRlRWRpTmV0d29ya0Vycm9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVEZXNjcmlwdGlvblF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVNYXN0ZXJEZXNjcmlwdGlvbkluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNTd2l0Y2hSZWxlYXNlQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc3VyZWREZWxpdmVyeUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5nSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZERhdGFQcm9jZXNzaW5nRXF1aXBtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBd2FyZFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQWRtaW5pc3RyYXRpb25JbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtCcmFuY2hTb3J0aW5nSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1NlY3VyaXRpZXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc09mSnVyaXNkaWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRSZWplY3Rpb25SZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZE9mZmljZUluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBZHZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ2xhdXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlQYXJ0TG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVJlc3BvbnNpYmlsaXR5TG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mSW5zcGVjdGlvbkFuZFN1cnZleVNoaXBMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDaGFuZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NyZWRpdFJhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdEZXRhaWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ0xvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdSZXBvcnRUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdTZWN1cml0aWVzSW5mb3JtYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbGluZ1N0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmluYW5jaWFsSW5mb3JtYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eVN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRnVuY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzTGVnYWxTdHJ1Y3R1cmVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1NpemVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxTaWduRGlyZWN0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkludGVyRWRpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25SZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlRGVzaWduYXRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9yaWdpbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hEaXNjb3VudFN0aXB1bGF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZU9mTG9zc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlaWxpbmdUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblJlcXVpcmVtZW50c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5U3ViZGl2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUGF5bWVudFJlbWFya0NvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZPcGVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZQaXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlU3RhdHVzVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlQXV0b21hdGVkUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1QYXJ0aWNpcGFudHNJZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW1Vbml2ZXJzYWxJZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hc3REZXNpZ25hdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZ25pemFuY2VTeW1ib2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tSW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGlzaW9uSW5kdXN0cnlFbGVjdHJvbmljQ29tbWVyY2VBc3NvY2lhdGlvbi1Mb3NzQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tUG9pbnRzT2ZJbXBhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tUHJvZmlsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYml0ZXJtczE5OTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBbmRHb3Zlcm5tZW50RW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsRHJpdmVyc0xpY2Vuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0NvbW1vZGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0hhemFyZG91c01hdGVyaWFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zSW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNTYWZldHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVJlZ2lzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVGl0bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pY2F0aW9uc1JvdXRpbmdJZGVudGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uVHlwZUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUNoYXJhY3RlcmlzdGljc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludFJlcXVlc3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlUmV2aWV3Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY2x1c2lvbkV2YWx1YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbkRldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1ByZW1pc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUHJlbWlzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25BbmRDb250YWluZXJpemF0aW9uUG9pbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25NYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdG9yQWxlcnRMaXN0UmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyQW5kUm9sbC1Pbk9yUm9sbC1PZmZOdW1iZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJUZXJtaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVudEluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2xvc2UtT3V0R3JvdXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERlbGl2ZXJ5RGF0ZVJldmlzaW9uQWdlbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEZ1bmRSZXBvcnRpbmdUcmFuc2FjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JBbGVydExpc3RTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JSZXZpZXdMaXN0U3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBheW1lbnREZWR1Y3Rpb25PckNvbGxlY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBheW1lbnRMaW5lSXRlbVN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2hpcG1lbnRBZHZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkSW52ZW50b3J5SXRlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0RGVzaWduQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvdmVydENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3Rpb25PZmZlbnNlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVMb2dpc3RpY3NQcm9ncmFtU3VwcG9ydENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUZpbmFuY2lhbEZpbGluZ0NyaXRlcmlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdGF0ZW1lbnRGaWxpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aW9uT3JDaGFuZ2VGb3JTdG9yYWdlSXRlbVJlY29yZHNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5QW5kQWN0aXZpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Q29kZS1GaW5hbmNlQW5kQWNxdWlzaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlTdWItRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eURlc2lnbmF0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25BZGp1c3RtZW50UmVhc29uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRBcHBlYXJhbmNlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Q2FzZVN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RGlzcG9zaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERvY3VtZW50VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0SXNzdWVkV2FycmFudFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE9mTGF3RXZlbnRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydE9mTGF3VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRQYXJ0eVN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRQbGVhZGluZ1R5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUNvZGVMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZU1vZGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcGEtQ2FuYWRpYW5QYXltZW50c0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxDaGFyZ2VHcmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxpdHlEZXNpZ25hdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Vpc2luZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXNzZXREZXRhaWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGVudGFsVGVybWlub2xvZ3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlhYmlsaXR5RGV0YWlscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlTGV2ZWxMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyV2l0aGluQ291bnRyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWl6ZWROb3RpY2VUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0FyZWFPZlRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRG9tZXN0aWNQb3J0TG9jYXRpb25Db2Rlcy1VU1NjaGVkdWxlRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZvcmVpZ25Qb3J0TG9jYXRpb25Db2Rlcy1VU1NjaGVkdWxlSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0luZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0luc3BlY3Rpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1Byb2NlZHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlbGVhc2VOb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTaW1wbGlmaWVkUHJvY2VkdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3BlY2lhbENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3RhdHVzT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaXRHdWFyYW50ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2l0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ZhbHVhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1dhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNQYWNraW5nVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUNhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlU2hpcHBlZE9yUmVjZWl2ZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JCdXNpbmVzc1R5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5kYW50UGxlYVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlUHJpb3JpdGllc0FuZEFsbG9jYXRpb25zU3lzdGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyYWxMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaWVuY3lDYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpZW5jeUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaW5xdWVuY3lJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUZXJtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtaWxpdGFyaXphdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUF2YWlsYWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmljZUV2YWx1YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VFdmVudFByb2JsZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VPcGVyYXRvclR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VVc2FnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzRW5jb3VudGVyZWREdXJpbmdFeGFtaW5hdGlvbkFuZEludmVzdGlnYXRpb25PZkluZGl2aWR1YWxzQW5kUG9wdWxhdGlvbnNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3N0aWNBbmRTdGF0aXN0aWNhbE1hbnVhbE9mTWVudGFsRGlzb3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3ROdW1lcmljYWxDb250cm9sU3lzdGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5QWR2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5U3RhdHVzT3JEaXNwb3NpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsQXV0aG9yaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zYWxDb25kaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZXF1ZXN0ZWRCeUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvZGFhYy1EZXBhcnRtZW50T2ZEZWZlbnNlQWN0aXZpdHlBZGRyZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNMaW5lT2ZCdXNpbmVzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2VGb3JtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyUGFyYW1ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsQmFzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbER1ZVByb2Nlc3NTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbEV4dGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRGV0YWlsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1N0YXR1c0FkdmVyc2VFdmVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW1waW5nT3JDb3VudGVydmFpbGluZ0Fzc2Vzc21lbnRNZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bXBpbmdTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Q2FuYWRhczhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVucy1EdW5BbmRCcmFkc3RyZWV0UGx1czQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bnNTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbjJQbHVzMkR1bkFuZEJyYWRzdHJlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlUYXhPckZlZVBheW1lbnRNZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5bmFtaWNHZW5lcmF0b3JTZXRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeW5hbWljTG9jb21vdGl2ZVRhZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaXJhLUlkLUVkaVJlZ2lzdHJhdGlvbkF1dGhvcml0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0RXJyb3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25hbEluc3RpdHV0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxTdHVkeUFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9tYWduZXRpY1RyYW5zbWl0dGVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuaGFuY2VkUGFydHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXRsZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eVJlbGF0aW9uc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U3RhdHVzTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvckNsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNzZW50aWFsaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVGltZU9mQXJyaXZhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlVHlwZUxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGluZ01ldGhvZFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV0aG5pY2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGVXb3JrQ2FuZGlkYXRlTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmFsdWF0ZVdvcmtDYW5kaWRhdGVSZWFzb25Mb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50QWJhdGVtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRPckV4cG9zdXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRSZWFwcGVhcmFuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFtaW5hdGlvbkZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNhdmF0aW9uSW5mb3JtYXRpb25Db2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzTWF0ZXJpYWxEaXNwb3NpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUR1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydENvbW1vZGl0eUNsYXNzaWZpY2F0aW9uLVVTU2NoZWR1bGVCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuc2lvblJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXllQ29sb3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eVNlY3VyaXR5Q2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlVG9Bd2FyZFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlQWRqdXN0YWJsZVJhdGVNb3J0Z2FnZVBsYW5Db2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tTW9ydGdhZ2VJbnN1cmFuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1Qb29sRmVhdHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVJlbWl0dGFuY2VQcm9ncmFtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tU3BlY2lhbEZlYXR1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWVSZWZpbmFuY2VQbGFuQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEZpbmFuY2VDb2RlTGlzdDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIZWFsdGhDYXJlQ29kZUxpc3QxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTG9naXN0aWNzQ29kZUxpc3QxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUHJvY3VyZW1lbnRDb2RlTGlzdDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUcmFuc3BvcnRhdGlvbkNvZGVMaXN0MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQW5hbHlzaXNDYXRlZ29yaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1BbGxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtQXR0cmlidXRlZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEl0ZW1SZWNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxNYW5hZ2VtZW50U2VydmljZUNhc2gtTGlua0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUmVnaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSb3V0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTdGF0ZW1lbnRGb3JtYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZWV0UGFyYW1ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvd09mVGhlR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGxvdy1VcENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkxpbmVPZkJ1c2luZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNDb3VudHJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nUmVzdHJpY3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tTW9ydGdhZ2VJbnN1cmFuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tUmVtaXR0YW5jZVByb2dyYW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjLUZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb24tU3BlY2lhbENoYXJhY3RlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNSZWZpbmFuY2VQbGFuQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZU9uQm9hcmRTaXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5QmFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRQdXJwb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWluT3JMb3NzSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFNlcnZpY2VzQWRtaW5pc3RyYXRpb25DdXN0b21lclN1cHBseUNlbnRlck51bWJlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxUZXJyaXRvcnlUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXRNb3VudGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhc3NBY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0Rlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QWdlbmN5UHJvY2VkdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZU9mRGlmZmljdWx0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBRdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWlyQ29sb3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXplZFN5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNDcmVkZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNSZXNwb25zZUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlQ2xhaW1TdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25Db21tb25Qcm9jZWR1cmFsQ29kaW5nU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25Db21tb25Qcm9jZWR1cmFsQ29kaW5nU3lzdGVtUHJpbmNpcGFsUHJvY2VkdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25EdXJhYmxlTWVkaWNhbEVxdWlwbWVudFJlZ2lvbmFsQ2FycmllckNlcnRpZmljYXRlT2ZNZWRpY2FsTmVjZXNzaXR5Rm9ybXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm92aWRlckNoYXJhY3RlcmlzdGljc0FuZFJlc291cmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoY2FyZVByb3ZpZGVyVGF4b25vbXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU9yZ2FuaXphdGlvbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2JieSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNkMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZnlpbmdDaGFyYWN0ZXJpc3RpY3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5RGlzY2xvc3VyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbXVuaXphdGlvbkluamVjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdEF4aXNPckFuYWxvZ1BvcnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RSZWNvcmRlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Q29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRDb25zZXF1ZW5jZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50TG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudFJlbGF0ZWRBY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvdGVybXMxOTgwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsSW5zdXJhbmNlRmluYW5jaWFsRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsUGFydGljaXBhdGlvbkluQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFNlY3VyaXR5Q2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVJhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25JbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlcXVlc3RSZXN1bHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVxdWVzdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyZWF0bWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlTZWxlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25QYXJhbWV0ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3ZlcmFnZURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlSW5mb3JtYXRpb25JbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYW5EZXNjcmlwdGlvbkNoYXJhY3RlcmlzdGljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlQ29udGFpbmVyUXVhbnRpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb25Qcm9jZWR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvblByaW5jaXBhbFByb2NlZHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uLUljZC05LUNtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkRGVzaWduYXRpb25TeXN0ZW1Gb3JUZWV0aEFuZEFyZWFzT2ZUaGVPcmFsQ2F2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudEZ1bmRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJzUXVhbGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVNvdXJjaW5nQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JDaGFyYWN0ZXJpc3RpY3NMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yaWdpbmF0b3JMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50TGlmZUluc3VyYW5jZUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxIZWFyaW5nVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsT3JkZXJUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxTZW50ZW5jZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudExvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2luZE9mQ29udHJhY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLaW5kT2ZNb2RpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5UmVzdWx0c0lkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVRlc3RDb25kaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbENhc2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEV2ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0cnVjdHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mUmVjb21tZW5kYXRpb25SYXRpbmdDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5RGV0YWlscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U2VydmljZUZlYXR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U3RhdHVzQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVSZWluc3VyYW5jZU1lc3NhZ2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQnVzaW5lc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxlT2ZBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTb3VyY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25zRm9yVGFyaWZmQ2FsY3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpY2FsT2JzZXJ2YXRpb25JZGVudGlmaWVyTmFtZXNBbmRDb2Rlc0NvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpc3RpY3NDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc0Rlc2NyaXB0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1NldmVyaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yRm9yY2VQcm9ncmFtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRJbmRpY2F0b3JDb2RlLVBldHJvbGV1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVCZXJ0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lV2hhcmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFBsYWNlT3JnYW5pemF0aW9uSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFBsYWNlVHJhZGluZ1BhcnRuZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mQ29tbXVuaWNhdGlvbnNJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbml6YXRpb25PZkNvbnRyYWN0QWRtaW5pc3RyYXRpb25TZXJ2aWNlc1N5c3RlbUVycm9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWFBbmRTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQmVuZWZpdHNTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtT2ZUcmFuc21pc3Npb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJPcmdhbml6YXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RFdmFsdWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kc09mUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlBbmRDaXZpbGlhbkdyYWRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlBc3Npc3RhbmNlUHJvZ3JhbUFkZHJlc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc2lvbkltcGFjdFN0YXRlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbmV0YXJ5RnVuY3Rpb25EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5kZXhTb3VyY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1NZWRpYU9iamVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFjaGEtTmF0aW9uYWxBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbEZvclByZXNjcmlwdGlvbkRydWdQcm9ncmFtc1JlamVjdE9yUGF5bWVudENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxPbkNvbXBlbnNhdGlvbkluc3VyYW5jZU5hdHVyZU9mSW5qdXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VQYXJ0T2ZCb2R5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VTb3VyY2VPZkluanVyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsTW90b3JGcmVpZ2h0Q2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFN0YW5kYXJkVG9vdGhOdW1iZXJpbmdTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mQnV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkRlYnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkV2ZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlN1aXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mU3VpdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mVHJhbnNhY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vTG9uZ2VyQ29uc2lkZXJlZEZvckF3YXJkUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21lbmNsYXR1cmVBY3Rpdml0eUNsYXNzaWZpY2F0aW9uRWNvbm9teUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Qb3N0YWxUb3duIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtZUFjdGl2aXRlRnJhbmNhaXNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JsaWdhdGlvblZhcmlhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5QW5kSGVhbHRoQWRtaW5pc3RyYXRpb25OYXR1cmVPZkluanVyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uUGFydE9mQm9keUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uU291cmNlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5DYXJyaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJBbmRSZWxlYXNlT3B0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZXb3JrZXJzQ29tcGVuc2F0aW9uUHJvZ3JhbXNOYXR1cmVPZkluanVyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zT2NjdXBhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zUGFydE9mQm9keUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zU291cmNlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplT3JPdmVyd2VpZ2h0Q3JlZGVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUmlnaHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlRmFpbHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdBbmRPclVucGFja2luZ0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbEFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbEJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nUmVxdWlyZW1lbnRMZXZlbENDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0T2ZCb2R5QWZmZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRPZkJvZHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEV2ZW50UHJvYmxlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCZWhhdmlvdXJSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkZXN0cmlhbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsUHJvcGVydHlBbmRDb250ZW50c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUJpbGxUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1MYW5kQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUxlYXNlU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0RGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVByb2R1Y3RQb2ludC1PZi1TYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0U2VsbGluZ0FycmFuZ2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0VmFsdWVBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1SZWd1bGF0b3J5UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5QWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eUNhbGN1bGF0aW9uTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Sb3lhbHR5VHJhbnNhY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVVuaXRlZFN0YXRlc0dlb2xvZ2ljYWxTdXJ2ZXlGb3JtYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsQWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsQ2xhc3NpZmljYXRpb25TdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbFNodXQtSW5SZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxUZXN0SW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsQ2hhcmFjdGVyaXN0aWNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRDbGVhcmFuY2VPZmZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51c0luZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU9uQ2xhaW1JbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVJlc2VydmVWYWx1YXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0YWxJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGFsRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbFNlcnZpY2VDYXJyaWVyUm91dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3Rjb2RlRGlyZWN0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0TWFya2V0U3R1ZHlTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW91c01ldGFsc0luZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGlvbkRhdGFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpb25NYXRlcmlhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZlbnRpdmVNZWFzdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5RGlhZ25vc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxEaWFnbm9zaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFBhcnR5Q2l0aXplbnNoaXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eURlc2lnbmF0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eUxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXJGaW5hbmNpYWxIaXN0b3J5Q29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UXVhbGl0eURlZmljaWVuY3lSZXBvcnRTdW1tYXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFN1cHBseUNvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsRGVzaWduYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbU9yaWdpbmF0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtWWVhckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlPd25lcnNoaXBFeHRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3duZXJzaGlwVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5UmVjb3JkU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlTb3VyY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5VW5kZXJ3cml0aW5nQ29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcHJpZXRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250cmFjdE9mZmljZXJJbnN0cnVjdGlvbnNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJwb3NlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFsZXJ0TGlzdFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZVNpdGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29uZm9ybWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJVbml0UGFja0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5T3B0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnlTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvRnJlcXVlbmN5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TZXJ2aWNlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TeXN0ZW1UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQWRkaXRpb25hbENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxjYXJMZXR0ZXJNYXJraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsRG9jdW1lbnROYW1lcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhbmRsaW5nUmVzdHJpY3Rpb25zQW5kSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSGFybW9uaXplZENvZGlmaWNhdGlvbk9mVGFyaWZmcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhcm1vbml6ZWRFcXVpcG1lbnRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsUm91dGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVW5pZmllZE5vbWVuY2xhdHVyZU9mR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDb21wYW55TmV0d29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5RnJvbnRpZXJBbmRUcmFuc2l0UG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlMb2NhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlTZXJ2aWNlc0hhcm1vbml6ZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ1N1bW1hcnlWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZUFzc2V0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yQ29udHJhY3REZWxpdmVyeURhdGVSZXZpc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckRlbGF5ZWRDbG9zaW5nT2ZDb250cmFjdEZpbGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JEaXNwb3NhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckZpbmFuY2lhbEl0ZW1EZXRhaWxDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvclB1YmxpY1JlY29yZEZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yUmVxdWlzaXRpb25pbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNpcGllbnRPZkJpbGxpbmdTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRhdGlvbnNSZWdhcmRpbmdEZWxheWVkRGVsaXZlcmllc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZENvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZFByZWNlZGVuY2VCYXNlZE9uSXRzQ3VycmVuY3lJblRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUFuZFN0YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uVW5pdE9wZXJhdGluZ01vZGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yQWN0aXZpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZU1vbmV0YXJ5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQb2xpY3lBdHRyaWJ1dGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RBZHZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRGV2aWNlQXBwbGljYWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlnaW91c0FmZmlsaWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtZWRpYWxBY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVBY2Nlc3Nvcmllc0FuZFNwZWNpYWxFcXVpcG1lbnRPblJhaWxjYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRhYmxlRXZlbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRhYmxlRXZlbnRTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnREaXN0cmlidXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRTb3VyY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZUJ1eUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50c0luZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmN5SW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbEFuZENvbW1lcmNpYWxSb29tQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGlvbnNBbmRQcm9oaWJpdGlvbnNQbGFjZWRPblRoZVJlLVVzZU9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1bHRFdmFsdWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3UGVyaW9kSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza0NsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ2hhcmFjdGVyaXN0aWNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5RGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2Fkd2F5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRGaXRuZXNzRWxlY3Ryb25pY1JlY29yZFN5c3RlbXNFcnJvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUFuZEZpdG5lc3NFbGVjdHJvbmljUmVjb3JkU3lzdGVtc1N1YnNjcmlwdGlvbk9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5SGF6YXJkTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1ByaWNlQ29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZURpc3Bvc2l0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlRXh0cmFjdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF2YW5Pd25lcnNoaXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlEaWFnbm9zaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVNvdXJjZU9mSW5qdXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNoYXJlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUFuZEFnZW5jeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9jY3VwYXRpb25DYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250cmFjdEFjdE9wZXJhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPclBheW91dE9wdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50QWNjZXB0YW5jZURpc2NyZXBhbmN5RXhwbGFuYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFJlbGVhc2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTdGF0ZVJlZ2lzdHJhdGlvblN5c3RlbUFuZE9wZXJhdGluZ0F1dGhvcml0eUNyZWRlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVVzZUxhYmVsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZUFuZFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraW5Ub25lQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxBcm1zRXJyb3JUcmFuc2FjdGlvblJlamVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQXJtc1RyYW5zYWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uQ2FuY2VsbGF0aW9uUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdW5kQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VNYWludGVuYW5jZUFuZFJlY292ZXJhYmlsaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEZXBvc2l0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEaXNjbG9zdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkluanVyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTGVhZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mTG9zc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb250cmFjdFByb3Zpc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hcmtldGluZ1R5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWFya2luZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXRlcmlhbElkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2dyYW1SZXF1aXJlbWVudFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZWltYnVyc2FibGVQcm92aXNpb25zQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlcXVpcmVtZW50TG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVxdWlyZW1lbnRzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZXh0QWNjb3JkaW5nVVNFbWJhcmdvUmVndWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dENsYXVzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dEZvckV4cG9ydEFjY29yZGluZ05hdGlvbmFsUHJlc2NyaXB0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25DbGFzc2lmaWNhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsQWRtaW5pc3RyYXRpdmVJbmZvcm1hdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsTmF0dXJlT2ZUcmFuc2FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxPYmplY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsUHJvY2VkdXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljQnVuZGVzQW10Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VEZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRnVuZE9yTm9uLVN0b2NrRnVuZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudEFjdGl2aXR5VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRBd2FyZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25QYXltZW50T3B0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vicm9nYXRpb25SZXF1ZXN0Q29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUmVzcG9uc2VDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lzdGVuY2VUeXBlT2ZQYWNrQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4T3JMaW1pdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1vbnNUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsRGF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeUFjY291bnRpbmdDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc1N0b2NrVHVybm92ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBseUNvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEZXNjcmlwdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bnRheE5vdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1hdGl6ZWROb21lbmNsYXR1cmVPZkh1bWFuQW5kVmV0ZXJpbmFyeU1lZGljaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1TdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBc3Nlc3NtZW50TWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhPckZlZUV4ZW1wdGlvblJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBhcnR5SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbEFzc2Vzc21lbnRDaGVja2xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZURpcmVjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVDaGFyYWN0ZXJpc3RpY0xvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVPd25lckxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVUeXBlTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNPZkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJ0aWFyeURpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ0RlbW9ncmFwaGljQ2F0ZWdvcnlDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2VRdWVzdGlvbkNvZGVMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU3RhdGlzdGljYWxDYXRlZ29yeUNvZGVMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVzdWx0c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRG9jdW1lbnRDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVFeGNlcHRpb25BbmRSZXF1aXJlbWVudENvZGVMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uU3RhdHVzSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25CaWxsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Ib2xkaW5nRGVsYXlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk1vZGVPck1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uTW9kZVJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uUHJpb3JpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvblNlcnZpY2VDb2RlQW5kQmFua1NlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeVN5bWJvbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVuZFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFkanVzdG1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlQW5kQ2F1c2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlRHVlLUluSW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlSWRlbnRpdHlDaGFuZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlSW5zcGVjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVOdW1lcmljYWxDb250cm9sU3lzdGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQXNzZXRzQW5kTGlhYmlsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkFzc2lzdGFuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZCaWxsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQnVzaW5lc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDYXJnb0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbnRyYWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29udHJhY3RvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkRlbGF5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRmluYW5jaWFsQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRmlybUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkluZHVzdHJpYWxBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSW5xdWlyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZklzc3VlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mTG9jYXRpb25SZWNvbmNpbGlhdGlvblJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZk1lZGlhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mUGFja2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mUHJvY3VyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlN0b3JhZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTdXJ2ZXlRdWVzdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVBhY2tDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlUGh5c2ljYWxJbnZlbnRvcnlPclRyYW5zYWN0aW9uSGlzdG9yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUmVjaXBpZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jbGFpbWVkUHJvcGVydHlBZGRpdGlvbnNEZWxldGlvbnNBbmREZWR1Y3Rpb25zQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY2xhaW1lZFByb3BlcnR5VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1GcmVpZ2h0Q2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtUmVzaWRlbnRpYWxBcHByYWlzYWxBdHRyaWJ1dGVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNDb21tb25Db2RpbmdTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNTdGFuZGFyZFByb2R1Y3RzQW5kU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0RlcGFydG1lbnRPZkhlYWx0aEFuZEh1bWFuU2VydmljZXNPZmZpY2VPZlZpdGFsU3RhdGlzdGljc0UtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zb2xpY2l0ZWRQcm9wb3NhbFJlamVjdGlvblJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl6YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNjaW5hdGlvbklubm9jdWxhdGlvbk9ySXNvbGF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU9jY3VwYW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVBhcmFtZXRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0YXR1c0FuZFRlcm1zT2ZDYXJyaWFnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0b3dhZ2VMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN1c3RhaW5pbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWV3UGFyYW1ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlvbGF0aW9uVHlwZUNvZGVMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VEb2N1bWVudE51bWJlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZveWFnZU1hbmlmZXN0UmVmZXJlbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSZXNlcnZlTWF0ZXJpYWxSZXF1aXJlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQ29tbW9kaXR5QW5kU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJUZXJtaW5hbElkZW50aWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRPckZyYWdpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZW5EaXNjb3ZlcmVkTG9va3VwIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdFR5cGUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0VHlwZUNvZGVkIiB0eXBlPSJDb250cmFjdFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cmFjdFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdFR5cGUiIHR5cGU9IkNvbnRyYWN0VHlwZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250cmFjdFR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJEaWVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYWJsZVBlckRpZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEdyb3dpbmdFcXVpdHlNb3J0Z2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0F1dGhvcml0eVZldGVyYW5zQWZmYWlyc0ZpeGVkUmF0ZU1vcnRnYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxTZWNvbmRNb3J0Z2FnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbEZpeGVkUmF0ZU1vcnRnYWdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlWZXRlcmFuc0FmZmFpcnNHcmFkdWF0ZWRQYXltZW50TW9ydGdhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRDb252ZW50aW9uYWxHcmFkdWF0ZWRQYXltZW50T3JTdGVwUmF0ZU1vcnRnYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxBZGp1c3RhYmxlUmF0ZU1vcnRnYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0luY2VudGl2ZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFNoYXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQbHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0F3YXJkRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1c0ZpeGVkRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVSaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybW9yQWN0dWFsQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVGaXJtVGFyZ2V0V2l0aFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlRmlybVRhcmdldFdpdGhvdXRQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZVJlZGV0ZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZXdpdGhFc2NhbGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlU3VjY2Vzc2l2ZVRhcmdldFdpdGhQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZVN1Y2Nlc3NpdmVUYXJnZXRXaXRob3V0UGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VBd2FyZEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUxldmVsb2ZFZmZvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cm9hY3RpdmVGaXhlZFByaWNlUmVkZXRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtRml4ZWRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZXdpdGhFY29ub21pY1ByaWNlQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsb2ZFZmZvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9ySG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQ29udHJhY3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9zcGVjdFJlc2VydmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lUGVyY2VudGFnZWFzRmlsbVJlbnRhbEVhcm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZWFuZE1hdGVyaWFscyIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVmFsaWRpdHlEYXRlcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhcnREYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFbmREYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkaXR5RGF0ZXMiIHR5cGU9IlZhbGlkaXR5RGF0ZXMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2VDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiIHR5cGU9Ikxpc3RPZlJlZmVyZW5jZUNvZGVkIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkIiB0eXBlPSJSZWZlcmVuY2VUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmltYXJ5UmVmZXJlbmNlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBvcnRpbmdSZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1N1YlJlZmVyZW5jZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZUNvZGVkIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJicmV2aWF0ZWROZXdEcnVnQXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VTdXBwbGllcklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NvcmlhbFJhaWxEaXZlcnNpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdFcXVpcG1lbnRMb2NhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0ZpbGVSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRNYW5hZ2Vyc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNCYW5rUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGFydHlzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UGF5YWJsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFNlcnZpY2luZ0JhbmtzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVDdXN0b21lckFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlT3Blbkl0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZVN0YXRlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFN1ZmZpeENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uU3lzdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzZWVSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Q29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudE1lbW9DaGFyZ2VCYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJzYXJ5Q2FzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZDb2xsZWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VUaHJvdWdoQmFua3NSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nQmFua3NSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFlcm9uYXV0aWNhbEVxdWlwbWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUZFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZlY3RlZFN1YnN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lBc3NpZ25lZEVtcGxveWVlSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Q2xhdXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSURBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5SGllcmFyY2hpY2FsTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUxvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5c1N0dWRlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Q29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNCYW5rUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1NoaXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBR0VSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ29UcmFuc2Zlck1hbmlmZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEaW1lbnNpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJIYW5kbGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVzRmxpZ2h0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcldheWJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZWNpcGllbnRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlQ2xhdXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWJ1bGF0b3J5UGF0aWVudEdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGVkVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudEZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5CYW5rZXJzQXNzb2NpYXRpb25UcmFuc2l0T3JSb3V0aW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkdhc0Fzc29jaWF0aW9uRXF1YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuT3N0ZW9wYXRoaWNBc3NvY2lhdGlvbkNlcnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlRGVkdWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVXZWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc051bWJlck9yVGVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpYUxpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFNwZWNpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFN0cmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aUR1bXBpbmdDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUEUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVDb2VmZmljaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhYmxlSW5zdHJ1Y3Rpb25zT3JTdGFuZGFyZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNCYW5rUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXJMaWNlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ByaWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseUxpbmVGZWVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Nlc3NtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5VHJhbnNhY3Rpb25TZXRTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRDYXNlQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZEludm9pY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9ySm9pbmVkVW5pdE5vdFJlc3ViZGl2aWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvckxpbWl0ZWRDb21tb25FbGVtZW50UGFya2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZE51bWJlckZvclVuaXRQYXJraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvZHVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZFByb3BlcnR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHVyY2hhc2VPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1JhaWx3YXlBY2NvdW50aW5nUnVsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc3VtaW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRhQ2FybmV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdG9taWNTYWZldHlhbmRMaWNlbnNpbmdCb2FyZFBhbmVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2hlZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzYXRpb25Gb3JSZXBhaXJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eUlzc3VlZEVxdWlwbWVudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uTnVtYmVyRm9yRXhjZXB0aW9uVG9EYW5nZXJvdXNHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblRvTWVldENvbXBldGl0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvTG9zc0l0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFJldHVybk9yTm90aWZpY2F0aW9uT2ZDaGFuZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hFbnRyeURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTdGFuZGFyZEVudHJ5Q2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFRyYWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRVbmRlcndyaXRpbmdSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVSYXRpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja291dFByb2NlZHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZGdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlRHVlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRCYW5rZXJzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQXNzaWduZWRTZWN1cml0eUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNBY2NlcHRhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UHJvY2VkdXJlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rc0luZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RlbGVncmFwaGljTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVG9CYW5rSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkTGFiZWxTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhckNvZGVkU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZVBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaE51bWJlck9yTG90TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtQXNzZW1ibHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbk1pbGVNYXJrZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxhdGVyYWxDYXJTZXJ2aWNlQWdyZWVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGRJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0NlbnRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsb2ZNYXRlcmlhbFJldmlzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZRdWFudGl0aWVzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5hcnlPYmplY3RJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5Mb2NhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aEJhdGNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGVuZGVkV2l0aE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVDcm9zc1Byb3ZpZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlU2hpZWxkUHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRlZENhcnJpZXJJbnRlcm5hbFJldmVudWVTZXJ2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlcmVhdU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9yU2FsZXNPZmZpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlclJlZmVyZW5jZTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcnNPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRDaGFwdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVvZkxhYm9yYW5kU3RhdGlzdGljc1NjaGVkdWxlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1U2lnbmluZ09SIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nU1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVGF4TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNBcHByb3ZhbE1hcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhdGFsb2d1ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NyZWRpdE1lbW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RlYml0TWVtbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGVidG9yTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU2hpcG1lbnRNYXJrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWRGaWxlTGF5ZXJDb252ZW50aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFNpZ24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRXhjaXNlRW50cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuRmluYW5jaWFsSW5zdGl0dXRpb25CcmFuY2hBbmRJbnN0aXR1dGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Hb29kc0FuZFNlcnZpY2Vzb3JRdWViZWNTYWxlc1RheFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Qcm92aW5jZU9wZXJhdGluZ0F1dGhvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5Tb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuV2hlYXRCb2FyZFBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsZWRSZXZpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRSZXBvcnRpbmdJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRCaWxsaW5nVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRJc3N1ZXJUcmFuc2FjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWNjZXB0YW5jZU9yZGVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0NvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTWFuaWZlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcm5ldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkQ29uc2lnbmVlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRQYWNrYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkU2hpcHBlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNBZ2VudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNDdXN0b21zQm9uZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPZk5lZWRQYXJ0eXNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXN1YWx0eVJlcG9ydFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ3VlU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFzdHJvcGhlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeU9mV29ya1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VkZW50c0NsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRpbmdDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWlsaW5nRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQXV0b21hdGVkRmlsZXNJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQmxvY2tHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzU3RhdGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3RTdWZmaXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxTZWNyZXRhcmlhdExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mSW5jb3Jwb3JhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVvZlRyYW5zcG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRNYWlsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk5BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbWJlck9mQ29tbWVyY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU1QVVNJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVZlcmlmaWNhdGlvblByb2NlZHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VDYXJkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOb3RlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNraW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja0xpc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEFic3RyYWN0U2VydmljZVJlZ2lzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1aXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWxhclB1YmxpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZk9waW5pb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uT2ZTdGF0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRpemVuc2hpcERvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbEFjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxMaWFiaWxpdGllc29mT2lsQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1hbnRzQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU9mZmljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mQ29udHJhY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50c1N5c3RlbVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVBhcnRpY2lwYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0hvdXNlSW50ZXJiYW5rUGF5bWVudFN5c3RlbVVzZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyVGV4dENsYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50Q29tcGFueUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50UmVwb3J0aW5nQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY2FsTGFib3JhdG9yeUltcHJvdmVtZW50QW1lbmRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYWxBdXRob3JpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZGVPZkZlZGVyYWxSZWd1bGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sZFJvbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RpbmdCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9ySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxvY2F0aW9uSW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsT3JQcml2YXRlUGFzc2VuZ2VyVmVoaWNsZVF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEFjY291bnRTdW1tYXJ5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsYW5kR292ZXJubWVudEVudGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEcml2ZXJzTGljZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlU2FmZXR5QXNzdXJhbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWVPblVuaWZvcm1TZWN1cml0eUlkZW50aWZpY2F0aW9uUHJvY2VkdXJlc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25BY2Nlc3NSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kUGxhY2VSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55QW5kU3luZGljYXRlUmVmZXJlbmNlMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUlzc3VlZEVxdWlwbWVudElkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5UGVuZGluZ1NhbGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVNhbGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmFibGVQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0ZW50QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFVuaXRzUGF5bWVudFJlcXVlc3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2VDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbk9mUHVyY2hhc2VEb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZTYWxlRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRvbWluaXVtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdyZXNzaW9uYWxEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGluZ0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0Z1cnRoZXJPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc0ludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1JlbGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRDbGFzc2lmaWNhdGlvbklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzRnVydGhlck9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uU2hpcG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvcnNSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJhaW50Tm90YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVySWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtcHRpb25EYXRhUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPclBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc3Bvc2l0aW9uT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9wZXJhdG9yc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyb3JFcXVpcG1lbnRSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJQcmVmaXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXb3JrT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbkZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTW92ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1RyYW5zZmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEFkZGVuZHVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF1ZGl0b3JJRE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCcmVha2Rvd25SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29vcE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RIb2xkZXJDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RMaW5lSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0T3B0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yRGF0YVJlcXVpcmVtZW50c0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JFc3RhYmxpc2htZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvclJlcXVlc3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGFydHlSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGlvbkNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JuYm9yZUNlcnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEJhdGNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QWxsb2NhdGlvblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdGFSaWNhbkp1ZGljaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Q2VudHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RWxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5QnVzaW5lc3NSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eUxlZ2lzbGF0aXZlRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvbkRpc3RyaWJ1dGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uUmVkZW1wdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb3Vuc2VsaW5nSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE1lbW9OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvckRlYml0QWRqdXN0bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSYXRpbmdBZ2VuY3lzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3NpdG9yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsQXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsaXR5RGVzaWduYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JvcFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzTGlzdGVkQ291cnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1M1NEtleVRyYWluSW5kaWNhdG9yR3JvdXBOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Q2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50b3JMYXRlc3RDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ2F0YWxvZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZVBlcmlvZFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1hdGVyaWFsU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQcm9jZXNzU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRUb1ByZXZpb3VzQmFsYW5jZU9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNDb21tb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1JlbGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1VuaXRJbnZlbnRvcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVHJhY2tpbmdOdW1iZXJGb3JMb2FuZWRNYXRlcmlhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCYXJDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjaXNpb25SZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEcmF3YmFja0VudHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zR3VhcmFudGVlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zaG91c2VCcm9rZXJMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ByZWZlcmVuY2VJbnF1aXJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUmVsZWFzZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUYXJpZmZOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2hpcG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNWYWx1YXRpb25EZWNpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1NlY3VyaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc1RyYW5zcG9ydExpY2VuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFBdXRoZW50aWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUl0ZW1EZXNjcmlwdGlvblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVF1YWxpdHlSZWplY3RSZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFSZWxpYWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFTdHJ1Y3R1cmVUYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJwdXJjaGFzZW9yZGVybnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXJUeXBlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c0N1c3RvbXNJZGVudGl0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0Q29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlUHJpb3JpdGllc0FsbG9jYXRpb25TeXN0ZW1Qcmlvcml0eVJhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJtZW50QXBwcm92YWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdW90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVnaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUcmFpbGVyTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbFJlYXNvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHlPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGFsSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50aXN0TGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yQWdlbmN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZBZ3JpY3VsdHVyZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mQ29tbWVyY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VGb3JtMjUwUmVxdWlyZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERFRTQ04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkVkdWNhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRW5lcmd5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISFNBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVEQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkludGVyaW9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZKdXN0aWNlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZMYWJvckFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mU3RhdGVBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZnRoZVRyZWFzdXJ5QWNxdWlzaXRpb25PclByb2N1cmVtZW50UmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25BY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZlRyYW5zcG9ydGF0aW9uQm9uZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVHJhbnNwb3J0YXRpb25IYXphcmRvdXNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRXaGVyZUluanVyeU9jY3VycmVkSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50c0luZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0QWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdG9yTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3J5VHJ1c3RDb21wYW55SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYXRDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzY3JpcHRpb25PZkNoYW5nZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2Vsc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbm9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNSZWxhdGVkR3JvdXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdERlYml0UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eUluc3VyYW5jZVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRlclJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGVuc2F0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbFR1cm5JbkRvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwdXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25DZW50ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblN0YXRlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yQXNzaWduZWRPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZFRyYW5zYWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRPckludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc0FjY291bnRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzU3BsaXRBZ2VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkF1dGhvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2NrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5UGF5bWVudFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkFmZmVjdGVkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50Vm9sdW1lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZsaWdodE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNJbnZlbnRvcnlNYW5hZ2VtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taWNpbGVCcmFuY2hOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWluaW9uT2ZDYW5hZGFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtU2hpcHBlckNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5ob2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3ZWVzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTGlzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk9yZGVyQmxhbmtOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdGb3JtdWxhcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRDYW5hZGFzOERpZ2l0U3RhbmRhcmRJbmR1c3RyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0VVM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRVTlNOdW1iZXJ3aXRoRm91ckNoYXJhY3RlclN1ZmZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlckR1bkFuZEJyYWRzdHJlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxpblJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVXYXliaWxsTm90SW5Sb3V0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUZyZWVQcm9kdWN0c1JlY2VpcHRBdXRob3Jpc2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlNZW1vTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDQ04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb25JZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Rpb25EaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0RhdGFJbnRlcmNoYW5nZUFncmVlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY2RldmljZXBpbm51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0Z1bmRzVHJhbnNmZXJJRE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1BheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZXZhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb1Blcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5T3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtaXNzaW9uRGVzaWduYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVPck5vbkVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGF4RmlsaW5nU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJJZGVudGlmaWNhdGlvbk51bWJlck9mU2VydmljZUJ1cmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyc1NvY2lhbFNlY3VyaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VmlzYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVJlcG9zaXRpb25pbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0pvYlNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdLYW5iYW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ01ldGVyUmVhZGluZ0FjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdQYWNrYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE1pbGVNYXJrZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZXJzUHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VQcm9wb3NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnF1aXJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJDaGlsZERtciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludEFzc2Vzc21lbnRMb2dOdW1iZXJQYXJlbnREbXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5QWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvbkFnZW5jeVRlc3RUeXBlUHVycG9zZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VHJhbnNwb3J0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SW5pdGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRPd25lclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50U2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRyYW5zcG9ydENoYXJnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXZhbGVudENvdXJzZU51bWJlcmF0UmVxdWVzdGluZ0luc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvcklkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93RmlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV0ZXJtc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMUNlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzVHJhbnNwb3J0YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXREaXN0cmlidXRpb25MaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5zaW9ub25FZmZlY3RvZkNoYW5nZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydERlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEVzdGFibGlzaG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZE9yRXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eUNlcnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5SUROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5TWVhc3VyZW1lbnRQb2ludE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlOZXR3b3JrSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVBbmFseXNpc1JlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZW1lY2hhbmlzbW51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5TWVtYmVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseVVuaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZVNlbGxlclNlcnZpY2VyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEJ1cmVhdU9mSW52ZXN0aWdhdGlvbkluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbkNvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uVHJhZGVPckJyYW5kSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEVuZXJneVJlZ3VsYXRvcnlDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSExNQ0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb21lTG9hbk1vcnRnYWdlQ29ycG9yYXRpb25Mb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSG91c2luZ0FkbWluaXN0cmF0aW9uQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hVTVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25PcmlnaW5hdG9ySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uRm9yd2FyZGVyc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1hcml0aW1lQ29tbWlzc2lvblRhcmlmZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbkxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5Q2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5U2NoZWR1bGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXhwYXllcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFdpcmVUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkVEV0lSRUNvbmZpcm1hdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlU2NoZWR1bGVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUNvbnZlcnNpb25Kb3VybmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlTGluZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZGJ5QnVyZWF1T2ZDZW5zdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVyQ29kZUlzc3VlZEJ5Q3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyRm9ybU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVRyYW5zZmVyUHJvdG9jb2xMb2NhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVmVyc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxXb3JrQ2FuZGlkYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbERldGFpbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbE1hbmFnZW1lbnRSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFBoYXNlUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxTZXR0bGVtZW50UGFydHlzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5lTGluZUNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0VHJhbnNmZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxlZXRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsZXhpYmxlU3BlbmRpbmdBY2NvdW50SW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kRGF0YUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yUGxhbkFwcHJvdmFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25BY2Nlc3Npb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Qcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ1N0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3N1cmVBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZUNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc0Nhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTm90aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblRyYWRlWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZXN0cnlQZXJtaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hbFN0YXRlbWVudFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQaWNrdXBMaW1pdGVkRnJlaWdodFRhcmlmZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc09yQWdlbnRzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXhBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVab25lSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXJzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5b3JSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUaW1lT3JQYXJ0VGltZUVtcGxveWVlQ2xhc3NpZmljYXRpb25RdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFdvcmtHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZENvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZE1hbmFnZXJzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kc0F1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0FuYWx5c2lzU291cmNlTWV0ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0N1c3RvZGlhbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZVRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEFnZW5jeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxEZWNsYXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbExlZGdlckFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFB1cnBvc2VNZXNzYWdlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljRGVzdGluYXRpb25ab25lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljSW5kZXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNLZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNTY29yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lubmllTWFlUG9vbFBhY2thZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNhbmRTZXJ2aWNlVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5pbmdDbGFzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZHZhbmNlUHJvZ3Jlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRBZ2VuY3lSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsb2ZMYWRpbmdPZmZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmlvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFF1YWxpdHlBc3N1cmFuY2VBbmRDb250cm9sTGV2ZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvblJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluQmxvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXZpdHlTb3VyY2VNZXRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlZW5DYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFjY291bnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cE9yUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvd3RoRmFjdG9yUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50b3JVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbmlzZWRTeXN0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbml6ZWRDb2RlU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXN0ZW5pbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NlcnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0V4ZW1wdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzV2FzdGVNYW5pZmVzdERvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDYXJlRmluYW5jaW5nQWRtaW5pc3RyYXRpb25OYXRpb25hbFBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUHJvdmlkZXJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlTWFucG93ZXJTaG9ydGFnZUFyZWFGYWNpbGl0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQ0NMYWJlbGVySWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluc3VyYW5jZVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUmF0aW5nU3VmZml4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaE9yV2lkZUZpbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RDZW5zdXNUcmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdEJsb2NrTnVtYmVyQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENvdW50eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RNZXRyb3BvbGl0YW5TdGF0aXN0aWNhbEFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVNb3J0Z2FnZURpc2Nsb3N1cmVBY3RTdGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b250YWxDb29yZGluYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3JzZXBvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3RSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZUJpbGxPZkxhZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VXYXliaWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENhc3NBZGRyZXNzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJYXRhQ2FyZ29BZ2VudENvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRDlDTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWRlbnRpZmljYXRpb25DYXJkU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eUNhcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltYWdlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1tZWRpYXRlRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVUcmFuc3BvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uVmVyc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Q2xlYXJhbmNlSW5zdHJ1Y3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRlcnNSZWZlcmVuY2VOdW1iZXJUb0xldHRlck9mQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRQZXJtaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHV0YXRpb25BY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkJvbmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb09yT3V0Ym91bmRGcm9tUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRUb1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTGVnYWxSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERlYWxlckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmFpbHVyZUNsYWltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU2FtcGxlSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyb3VibGVJbmRpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRUcmFuc3BvcnRPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeVJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25hbmRTdXJ2ZXlTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9ySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0ZU9mU2VjdXJpdHlBbmRGdXR1cmVNYXJrZXREZXZlbG9wbWVudFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25Mb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29udHJhY3RSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUxpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZFBhcmNlbFBvc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRzTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cm9yUG9vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTG9naXN0aWNTdXBwb3J0Q3Jvc3NSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWFzdGVyU2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck5ldyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VOdW1iZXJPbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlVHJhaW5JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJnb3Zlcm5tZW50YWxNYXJpdGltZU9yZ2FuaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbUZ1bmRpbmdPcmdhbml6YXRpb25Mb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDdXN0b21lck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxEYXRhUHJvY2Vzc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxWZW5kb3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlckNoaWxkRGF0YU1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzZXNzbWVudExvZ051bWJlclBhcmVudERhdGFNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZsaWdodE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsUmVnaXN0cmF0aW9uUGxhbkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuU3RpY2tlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZEluZHVzdHJ5Q2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnN0YXRlQ29tbWVyY2VDb21taXNzaW9uQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmFQbGFudFJvdXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yaWFsTmV3RHJ1Z051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yQXNzaWduZWRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3Rvck5vdGVIb2xkZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlTnVtYmVyU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyb25DaGFyZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTRk1EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nQmFua3NSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYk9yUHJvamVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYlNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludENyZWRpdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50bHlBZG1pbmlzdGVyZWRDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludFZlbnR1cmVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkaWNpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TmFtZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbmFsQ29tbXVuaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck9wZXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JvckFmZmlsaWF0aW9uSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RUcmFuc2Zlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0aXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUFncmVlbWVudEFtZW5kbWVudE51bWJlck1hc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb250cmFjdFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJCbGFua2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVNjaGVkdWxlTnVtYmVyUHJpb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJSZXBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyRW50aXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUJpbGxDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXREcmFmdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcm9mQ3JlZGl0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJzb3JOb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2eWluZ09mZmljZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVBsYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQmlsbGluZ0FjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nU3VmZml4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFBhcnRuZXJzaGlwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZW9mQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkNyZWRpdENhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5rU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RCaWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0T2ZNYXRlcmlhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxsb3lkc0NsYWltc09mZmljZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0F1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRMaW5lQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRQbGFubmluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkFjcXVpc2l0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVhdHVyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Qcm9zcGVjdG9yS2V5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGx5QXNzaWduZWRDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbE1lZGlhSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU2Nob29sRGlzdHJpY3RDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25vblByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvblNwZWNpZmljU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uV2l0aGluRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NrYm94Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2ljYWxPYnNlcnZhdGlvbklkZW50aWZpZXJOYW1lc2FuZENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dpc3RpY3NTdXBwb3J0RG9jdW1lbnRhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRJbkRlZ3JlZXNNaW51dGVzYW5kU2Vjb25kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRlRXhwcmVzc2VkaW5TZWNvbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nVGVybURpc2FiaWxpdHlQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NPckV2ZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyQXJ0aWNsZU51bWJlck9mUmFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ2F6aW5lQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGJveCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFNsb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQXZhaWxhYmlsaXR5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VSZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckZvcmNlUHJvZ3JhbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFqb3JTeXN0ZW1BZmZlY3RlZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbExpbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbW1vZ3JhcGh5Q2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlZENhcmVPcmdhbml6YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdEtleU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsUHJvY2Vzc2luZ0F1dGhvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyRGVmaW5lZFJlcGFpclJhdGVzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNNYXRlcmlhbFNhZmV0eURhdGFTaGVldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdEaXJlY3RpdmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcGVyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lRGVjbGFyYXRpb25vZkhlYWx0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0QXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZ09yTGFiZWxSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFpcldheWJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckJpbGxPZkxhZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxhYmVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQcm9wZXJ0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJTb2xpY2l0YXRpb25Qcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENoYW5nZU5vdGljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTdG9yYWdlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyZWRDZXJ0aWZpY2F0ZU9mRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdFByb2Nlc3NpbmdFc3RhYmxpc2htZW50UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFByb3ZpZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZFJlY2lwaWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQXNzaXN0YW5jZUNhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsUmVjb3JkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlVmVyc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZW1iZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW50Q2F0ZWdvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlQWRkcmVzc29ySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VCYXRjaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZURlc2lnbkdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJQcm92aW5nUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmdBdFRoZUJlZ2lubmluZ09mVGhlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlRW5kT2ZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlDUk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWljcm9maWxtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWdyYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlc3RvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5Q2FsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJbnRlcmRlcGFydG1lbnRhbFB1cmNoYXNlUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlPcmRuYW5jZVNlY3VyaXR5Umlza051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlSYW5rT3JDaXZpbGlhblBheUdyYWRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxpbmdpblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJveWFsdHlQYXlvcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pc3RlcmlhbENlcnRpZmljYXRlT2ZIb21vbG9nYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWx5ZWFybnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9STkVUUGx1c0luc3RpdHV0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzVXNlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5TG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VCYWNrZWRTZWN1cml0eVBvb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlRWxlY3Ryb25pY1JlZ2lzdHJhdGlvblN5c3RlbU9yZ2FuaXphdGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZUxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlQ29tcGFueU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VJbmRpY2F0b3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckNhcnJpZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yVmVoaWNsZUlETnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aWZhbWlseVByb2plY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VCb29rVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZU1hcFhDb29yZGluYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWUNvb3JkaW5hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VTdWJBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZVBPT2ZBbkludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlWm9uZU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxpdHlBc3NpZ25lZEJ1c2luZXNzUmVnaXN0cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BQ0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZWRCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBZXJvbmF1dGljc2FuZFNwYWNlQWRtaW5pc3RyYXRpb25GQVJTdXBwbGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZCb2FyZHNPZlBoYXJtYWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFzc29jaWF0aW9uT2ZJbnN1cmFuY2VDb21taXNzaW9uZXJzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENyaW1pbmFsSW5mb3JtYXRpb25DZW50ZXJPcmlnaW5hdGluZ0FnZW5jeUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvbW11bml0eU5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbUNvdW50eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1NYXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsR292ZXJubWVudEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyYWxHYXNQb2xpY3lBY3RDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SGVhbHRoSW5zdXJhbmNlQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZW50YWxBZ3JlZW1lbnRSZWFzb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9taW5hdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQW1lcmljYW5JZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uQ29uZm9ybWFuY2VSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk5lZ290aWFibGVNYXJpdGltZVRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25PcmlnaW5hdGluZ1RoaXJkUGFydHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblBpY2t1cExpbWl0ZWRUYXJpZmZOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblNwb3VzZVRpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9PVDVBdXRob3JpdHlaZXJvTWlsZWFnZVJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5EYXR1bVN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuRnJlZVRyYWRlQWdyZWVtZW50Q29tcGxpYW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkhhemFyZG91c0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzR29vZHNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkluZHVzdHJpYWxDbGFzc2lmaWNhdGlvblN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PVElDT0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGVtcG9yYXJ5SW1wb3J0YXRpb25Eb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVDZWR1bGFkZUlkZW50aWRhZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJvZGVJZGVudGlmaWNhY2lvblRyaWJ1dGFyaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9iamVjdElkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eWFuZEhlYWx0aEFkbWluaXN0cmF0aW9uQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkJpbGxvZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Db250YWluZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuZGVyVHJhY2tpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVuc2VUcmFja2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlckxpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN5bWJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkTWV0ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZUNhbGxBZ2VuY3lUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ubGluZVByb2N1cmVtZW50YW5kQWNjb3VudGluZ0NvbnRyb2xUcmFuc2FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmFuZFByZXBhaWRTdGF0aW9uTGlzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckFzc2lnbmVkVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JMZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9yUGFyYWdyYXBoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJzU2Vjb25kUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkJyZWFrZG93blN0cnVjdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGZG9UcmFuc2FjdGlvblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRmlsaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUHVyY2hhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmV0dXJuUmVxdWVzdFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTaGlwcGVyc0JpbGxPZkxhZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJDaGlsZERhdGFNYWludGVuYW5jZVJlcXVlc3RMb2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyTG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlclBhcmVudERhdGFNYWludGVuYW5jZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFZvdWNoZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0aW5nQ2FzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDb21wYW55SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdEZXBvc2l0b3J5RmluYW5jaWFsSW5zdGl0dXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdG9yc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk9mU2hpcG1lbnRIYXJtb25pemVkQmFzZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVDVBdXRob3JpdHlDb25kaXRpb25PclJlc3RyaWN0aW9ub25DYXJIaXJlUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFR5cGVPZlJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0Ym91bmRGcm9tUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZCbG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJwYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGxldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0b2ZTZXJ2aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdCdXJlYXVJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0FuZEhvbGRJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdHcm91cE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nVW5pdElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0dyb3VwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdQbGFudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWdyYXBoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGhOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpY2FsSUROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudEZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDYXVzaW5nUmVwYWlyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0Q29uc2lnbm1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxQYXltZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydEludGVyY2hhbmdlYWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlZmVyZW5jZUluZGljYXRvckluQURyYXdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5SW5mb3JtYXRpb25NZXNzYWdlUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudENvb3BlcmF0aW9uVHJlYXR5QXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudEFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHJvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckFzc2lnbmVkUmVzdWJtaXNzaW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllckNhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNGaW5hbmNpYWxJbnN0aXR1dGlvbkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uVHJhbnNpdFJvdXRpbmdObyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlHcmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SGlzdG9yeVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluQWR2YW5jZVJlcXVlc3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJbnN0YWxtZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBsYW5SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW9yc0NsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGNzQ2F0YXN0cm9waGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25BcHByb3ZhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0Nhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbnNpb25Db250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSWRlbnRpdHlDYXJkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbElETnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qb29sQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lQcmVzY3JpcHRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBob25lQ2FsbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsSW52ZW50b3J5UmVjb3VudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBY3R1YWxQcm9kdWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlT2ZBR2VuZXJpY1Byb2R1Y3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZ2d5YmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdQYWNrYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsb3RGaWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lGb3JtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lMaW5rTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGx1dGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbENvbnRyYWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFN1ZmZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RW50cnlSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF3YXJkU3VydmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjaW5jdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZGVjZXNzb3JBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZXRlcm1pbmF0aW9ub2ZCZW5lZml0c0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRDYWxsU2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25TaXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldEFwcGxpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtYXJrZXROb3RpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFByaW9yaXR5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHVycG9zZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1BdWRpdFR5cGVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUmF0ZVRhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlcnNWZXJpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRpbmdCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NGb3JtSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3NJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JpbGxvZkxhZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDYXJnb0NvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ2xhaW1IaXN0b3J5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0T3JEZWJpdEFkanVzdG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3JlZGl0QWR2aWNlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RlbGl2ZXJ5SW5zdHJ1Y3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlTY2hlZHVsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEaXN0cmlidXRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcml2ZXJzTGljZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNIaWdoZXN0U2NoZWR1bGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlcG9ydGVkU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWVtYmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlcXVlc3RGb3JNZXRlcmVkUmVhZGluZ1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTY2hlbWVPclBsYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2VxdWVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzU2hpcG1lbnRJZGVudGlmaWNhdGlvbk51bWJlckNvbnRpbnVvdXNNb3ZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RheENvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGlja2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU9yU2FsZXNDYXRhbG9ndWVSZXNwb25zZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBcmVhTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3RDaGFuZ2Vvcklzc3VlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxpc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdFZlcnNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUXVvdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlVmFyaWF0aW9uRm9ybXVsYVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc0JhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRhdGFVbml2ZXJzYWxOdW1iZXJTeXN0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySGVhbHRoSW5kdXN0cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySWRlbnRpZmllck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RCYXRjaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3RTb2NpYWxTZWN1cml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQaG9uZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUG9zdGFsWmlwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQdXJjaGFzZU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JVbml2ZXJzYWxQcm92aWRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZWVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSGFuZGxpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1BsYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yc0ludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50QnVkZ2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudFJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmluZ0FnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUF1dGhvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdENoYW5nZUluZm9ybWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlTm90aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0R3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGljZW5zaW5nQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGluZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFBlcmlvZEZvcldoaWNoTGFib3JDb3N0c0FyZUZpcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RSZXNlcnZhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNvdXJjaW5nQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U3BlY2lmaWNhdGlvbkRvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQYXJhZ3JhcGhOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9wZXJ0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yRGVhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvb2ZPZkRlbGl2ZXJ5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbXBvbmVudExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eUNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5TG9zc0l0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NhbFBhcmFncmFwaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRHcm91cFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zZWRXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvY29sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90cmFjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJDb21tZXJjaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyT3JkZXJUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyUGxhbk5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclVQSU5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxDYW5hZGlhblNhbGVzVGF4RXhlbXB0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aW5jaWFsVGF4SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUGF0ZW50QXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uSXNzdWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0RlZWROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY0ZpbGluZ1JlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljVXRpbGl0aWVzQ29tbWlzc2lvbkNlcnRpZmljYXRlT2ZQdWJsaWNDb252ZW5pZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb25BZ3JlZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJDaGFuZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMaW5lSXRlbUlkZW50aWZpZXJCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlckluY2x1ZGVkaW5Pbk9yZGVyUG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZk9yZGVyUmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyT2ZTaGlwbWVudFJlY2VpdmVkU2luY2VMYXN0UmVwb3J0aW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlclN1ZmZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlUmVxdWlzaXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNSZXF1ZXN0UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQWN0aXZpdHlDbGF1c2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZE1hdGVyaWFsc0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpZmllZFByb2R1Y3RzTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNsYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURpc3Bvc2l0aW9uQXJlYUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0aW9uQXJlYUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSZXZpZXdNYXRlcmlhbENyaWJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb25SZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFyYW50aW5lT3JUcmVhdG1lbnRTdGF0dXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU2VjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTcG90TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVzdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGFOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlT3JTaG9wcGluZ0NhcnRJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFja1R5cGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxPclJvYWRSb3V0aW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRDb21taXNzaW9uT2lsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25SZWNvcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxSb3V0aW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFdheUJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDb25zaWdubWVudE5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlXYWdvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDYXJkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNvbmZlcmVuY2VJRENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVOb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhd21hdGVyaWFsU3VwcGxpZXJEdW5BbmRCcmFkc3RyZWV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlT3duZWRQcm9wZXJ0eUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uTm90TG93ZXN0Q29zdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjYWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBc3NpZ25lZERyb3Bab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcklEUXVhbGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclN1YklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdBZHZpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0JhbmtzQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29tcGFueUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUGFydHlzTWVtYmVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uY2lsaWF0aW9uUmVwb3J0U2VjdGlvbklkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y2VkRWFybmluZ1dlZWtJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRQYXR0ZXJuSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURyYXdpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlckFzc2lnbmVkQnlUaGlyZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJPZkFSZXF1ZXN0Rm9yTWV0ZXJlZFJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclF1b3RlZE9uU3RhdGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VOdW1iZXJUb1ByZXZpb3VzTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlVmVyc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvckNoZW1pY2FsQW5hbHlzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkUHJvZHVjdEZvck1lY2hhbmljYWxBbmFseXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmaW5lcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbERlQ29udHJpYnV5ZW50ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lyaXN0b0ZlZGVyYWxkZUNvbnRyaWJ1eWVudGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ2FwaXRhbFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JBY3Rpdml0eVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRNYWlsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlck9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvSW5mb3JtYWNpb25GaXNjYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvTmFjaW9uYWxkZUNvbnRyaWJ1eWVudGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJvVW5pY29kZUNvbnRyaWJ1eWVudGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25QcmltYXJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0aW9uU2Vjb25kYXJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5R3VpZGVsaW5lSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJlcnNDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZUNlc3Npb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWROb25jb25mb3JtYW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE9iamVjdElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRWZW5kb3JPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQcmlvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUludm9pY2VOdW1iZXJGb3JQcmlvckJpbGxBbmRIb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlQWR2aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRpbmdCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50UGF5b3JJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJDYXRlZ29yeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRGF0YVJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckVzdGltYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZWF0TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVCb29raW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlQ2FyZ29TaGlwbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZVBhdHRlcm5Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlV2F5YmlsbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50QXNzZW1ibHlNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnREcnVnRW5mb3JjZW1lbnRBZG1pbmlzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjaW5nUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VFbmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRQdXJjaGFzZU9yZGVyUmFuZ2VTdGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nRm9ybU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmVJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRDbGFpbVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmljZWRMaW5lSXRlbVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckNhbmNlbGxhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGZvclF1b3RhdGlvblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZUFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VTY3JlZW5pbmdSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlVXRpbGl6YXRpb25Hcm91cE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2V0b2FSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5QXV0aG9yaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEF2YWlsYWJpbGl0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25SZWFzb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pdG51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0YWlsTWVyY2hhbnRzQ2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudFBsYW5BY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhblBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lclNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRHb29kc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkdvb2RzQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5NYXRlcmlhbEF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybnNOb3RpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVudWVTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlldyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3ZXJGaWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlT3JkZXJOdW1iZXJEb21lc3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckVtZXJnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckV4cG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ0luc3RydWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bGVTZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmVrZWVwaW5nQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5RXF1aXBtZW50Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eW9mUmFkaW9DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZTaGlwQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT3JUZXJyaXRvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FsbG93YW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEZXBhcnRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0ZvcmVjYXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc09mZmljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJzb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUHJvZ3JhbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZWdpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVzcG9uc2liaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F2aW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbkxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlbWVPclBsYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbExvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9mZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhbE9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFyY2hLZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeUNvdmVyYWdlQ29tcGFueU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q3VzdG9tc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5RW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5SGVhbHRoSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVN1ZmZpeENvZGVJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEJlbmVmaWNpYXJ5c1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJpYWRlQ29tZXJjaWF5RmFtZW50YUluZHVzdHJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyeW9mU3RhdGVBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uT2ZUaGVOYXRpb25hbEhvdXNpbmdBY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eUluc3RydW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyYW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlckF1dGhvcml6YXRpb25UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkluc3VyZXJPcmdhbml6YXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzQ3JlZGl0TWVtbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0RlYml0TWVtbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc0ludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNTYWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nQXJyYW5nZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlckRlZmluZWRDbGF1c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNDbGF1c2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNGaWxlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzUmVmZXJlbmNlVG9UaGVPcmlnaW5hbE1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdCYW5rUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nQ29tcGFueUF1ZGl0TnVtYmVyQXV0b21hdGVkQ2xlYXJpbmdob3VzZVRyYW5zZmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdWxsZXRpbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1cmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYW5nZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRXN0aW1hdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VHcm91cElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlSW50ZXJydXB0VHJhY2tpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmZvcm1lZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERlc3RpbmF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRPcmlnaW5Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdGljZU9yTWFuaWZlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBvd25lcnNBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ2FyT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQm9uZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNIYXphcmRvdXNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTGFiZWxTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nTm90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvd0lkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlVHJhbnNhY3Rpb25TZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRU5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJUkVUTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlU3BlY2lmaWNQcm9jZWR1cmVzVGVybXNBbmRDb25kaXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXR1YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYXVnaHRlclBsYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxJbnN1cmFuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpZXR5b2ZQcm9wZXJ0eUluZm9ybWF0aW9uQ29tcGlsZXJzYW5kQW5hbHlzdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlQXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydEFuZFNlZ3JlZ2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRJbnRlcm5hbFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ1VuaXRPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEFwcHJvdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnVkZ2V0QWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENoYXJnZU9yQWxsb3dhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbENsYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEdvdmVybm1lbnRBY2NvdW50aW5nQ2xhc3NpZmljYXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxJbnN0cnVjdGlvbnNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNb3ZlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGFja2FnaW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYXltZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJvY2Vzc2luZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxRdW90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbHR5TGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbkNsYXNzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpbWVuSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRCb29raW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFByZW1pdW1BdWRpdENoYW5nZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0U2hpcG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VUaWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW5JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDbGF1c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkTnVtYmVyT2ZJbnNwZWN0aW9uRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUG9pbnRMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc0NvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzVmVyc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVCcmlkZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlUmVwbGFjZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGluZ1BhY2thZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQXNzZW1ibHlEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDaGFydGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNvbnRyb2xsZWRTdWJzdGFuY2VMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNyaW1pbmFsSGlzdG9yeVJlcG9zaXRvcnlJbmRpdmlkdWFsSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudEkyMEZvcm1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRGVwYXJ0bWVudElBUDY2Rm9ybU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVIYXphcmRvdXNXYXN0ZUVudGl0eUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlSW5kdXN0cmlhbEFjY2lkZW50UHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGVnaXNsYXRpdmVEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnRPZldvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTm9uUmVzaWRlbnRWaW9sYXRvckNvbXBhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jZUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVPclByb3ZpbmNlQXNzaWduZWRFbnRpdHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVTYWxlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNlbmF0ZURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN0dWRlbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGV3aWRlQ291cnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1JlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb21wYW55SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tLZWVwaW5nVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUluZm9ybWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJhc3NlbWJseU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RMaW5lSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJkYXlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRpdmlzaW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZXhoaWJpdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJGaWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5Tm9uU2FsZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViamVjdFByb3BlcnR5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlWZXJpZmljYXRpb25Tb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmxpbmVvZkluc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWlzc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzY3JpYmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXJ2aWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViU2VydmljZXJMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaXN0ZW5jZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGFudGl2ZWx5Q29uc29saWRhdGVkQ2FzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZUFpcldheWJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTdWJob3VzZUJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VjY2Vzc29yQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmludGVuZGVuY2lhZGVJbnZlcnNpb25lc0V4dHJhbmplcmFzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29yeUFwcHJhaXNlckNlcnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEFncmVlbWVudEF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclJlcGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckRvY3VtZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NyZWRpdENsYWltUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0aW5nRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FwT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMTAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVE1UMjAyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVENvbmZpcm1hdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltYm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXJGb3JNaWxlc3RvbmVPckxPQlJlcG9ydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWF0aXplZE5vbWVuY2xhdHVyZW9mSHVtYW5hbmRWZXRlcmluYXJ5TWVkaWNpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRW50cmVwcmlzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbWVJbmZvcm1hdGlxdWVQb3VyTGVSZXBlcnRvaXJlRGVzRXRhYmxpc3NlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlBhZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlJ1bGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlNlY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZlN1ZmZpeE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VwcGxlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFza09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZ2VuY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEV4Y2hhbmdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0aW9uTGljZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhlbXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhGaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZvcm1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpbmdBdXRob3JpdHlJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGljZW5zZUV4ZW1wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4TGllbkp1cmlzZGljdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhTY2hlZHVsZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNoZWx0ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFdvcmtzaGVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVENOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFtQXNzaWdubWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxJbmZvcm1hdGlvblBhY2thZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxQaGFzZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25DaXJjdWl0U3VwcGxlbWVudGFsSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TWVzc2FnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGxhdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxSZWxlYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uRmlsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0ZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleHRFbGVtZW50SWRlbnRpZmllckRlbGV0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdGVyU2NyZWVuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZEJhbmtzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWRtaW5pc3RyYXRvckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5Tm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JnYW5pemF0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eU9yaWdpbmF0b3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVySXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQdXJjaGFzZU9yZGVyUmVsZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyb3VnaEJpbGxPZkxhZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlja2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRmFpbHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyQ2FybmV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSVJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlQ29tcGFueUNvZGVCb29rUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZURvY3VtZW50U2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVYSVhJZGVudGlmaWVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2t5b1Nob2tvUmVzZWFyY2hCdXNpbmVzc0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGxCaWxsaW5nVGVsZXBob25lUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEN5Y2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9yZGVyQ3ljbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25zaGlwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3hpY29sb2d5SUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNlckFjdGlvblJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNraW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVyQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGluZ1BhcnRuZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclR5cGVRdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJVc2VBZ3JlZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0ZsaWdodE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DYXRlZ29yeU9yVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0R3VhcmFudGVlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvbmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRXhwb3J0YXRpb25Ob0ZvckluQm9uZE1vdmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblByaW9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29zdHNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRSZXR1cm5SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0cmlwcGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRSb3V0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U2VjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBsZWJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrZXJzQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUU1JCdXNpbmVzc0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkVzY3Jvd051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mSG91c2Vob2xkR29vZHNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZMYXdTdWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZPdXRzdGFuZGluZ0p1ZGdtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTY2llbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlZmVuc2VGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uU3VwcGxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkRlcGFydG1lbnRPZlZldGVyYW5zQWZmYWlyc0FjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVS5TLkdvdmVybm1lbnRUcmFuc3BvcnRhdGlvbkNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlRFVOU051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlUHVyY2hhc2VySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGluZ0FsZXJ0UmVmZXJlbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50SW5zdXJhbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdDb2xsYXRlcmFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ2xhaW1zUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUNvbnNpZ25tZW50SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZUN1cnJhY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVNYXJrZXRSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVJlaW5hY1JlZmVyZW5jZU51bWJlck9mVGhlU2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVTdXBwbGllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0dvdmVybm1lbnRWaXNhTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNTdGFuZGFyZE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRMb2FkRGV2aWNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlbGllZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFJlcG9ydFBlcmlvZElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0VHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFJhaWxyb2FkUmV2ZW51ZVdheWJpbGxJZGVudGlmaWVkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JFYXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JOb3J0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsVHJhbnN2ZXJzZU1lcmNhdG9yWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWlkSW5zdGFsbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwcGVyU2VyaWFsTnVtYmVyT2ZSYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ0ZSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0NTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQW50aUR1bXBpbmdEdXR5Q2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUJpbmRpbmdSdWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb21tZXJjaWFsRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VDb3VudGVydmFpbGluZ0R1dHlDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRW50cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlUHJlQXBwcm92YWxSdWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVDbGFzc2lmaWNhdGlvblJ1bGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVN0YXRlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNET0VBbmROQ0VTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPVEJvbmRTdXJldHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGQ0NJbXBvcnRDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsSW5mb3JtYXRpb25SZXNvdXJjZXNNYW5hZ2VtZW50UmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uRXN0YWJsaXNobWVudEluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHZW5lcmFsU2VydmljZXNBZG1pbmlzdHJhdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTR292ZXJubWVudEFnZW5jeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheFJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmF0UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQnVzaW5lc3NVc2VRdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVMaWNlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUmFkaXVzb2ZPcGVyYXRpb25RdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSZWxhdGVkU2VydmljZXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVTaXplQ2xhc3NRdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckFiYnJldmlhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNoYW5nZUlkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlUHJvY2VkdXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcklETnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlclN1ZmZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yUHJvZHVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1ByZXZpb3VzSm9iTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JUZXJtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uU291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVMb2NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbkNvZGVOYXRpb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVydGljYWxDb29yZGluYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbEFnZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZmZhaXJzQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNhVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVQdXJjaGFzZUFncmVlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRGV0ZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VFbnRyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUGlja1RpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlUmVjZWlwdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU3RvcmFnZUxvY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eUNvdmVyYWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheWJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXBvblN5c3RlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0QWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXdhbFJlY29yZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sVGF4UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2FuZGlkYXRlU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdTaGlmdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0l0ZW1RdWFudGl0eURldGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BhY2thZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtTaGlmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NpdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUYXNrQ2hhcmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGVhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFyZFBvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQdXJwb3NlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlQ29kZWQiIHR5cGU9IlB1cnBvc2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQdXJwb3NlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0iUHVycG9zZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQdXJwb3NlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uT25seSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3RlZFJlc3BvbnNlQ29kZWQiIHR5cGU9IlJlcXVlc3RlZFJlc3BvbnNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRSZXNwb25zZSIgdHlwZT0iUmVxdWVzdGVkUmVzcG9uc2UiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVxdWVzdGVkUmVzcG9uc2VDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlSG9sZFN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50V2hlbkVycm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZU5vRGV0YWlsT3JDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlT25seUNoYW5nZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlUHJvZHVjdFJlcGxlbmlzaG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlV2l0aERldGFpbEFuZENoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VXaXRoRGV0YWlsTm9DaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZVdpdGhEZXRhaWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VXaXRob3V0RGV0YWlscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZUFuZEFja25vd2xlZGdlbWVudEZvckRpcmVjdERlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2VNZXNzYWdlQWNrbm93bGVkZ2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2VSZXF1ZXN0ZWRGb3JEaXJlY3REZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2VGb3JFYWNoVHJhbnNhY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlTWVzc2FnZUFja25vd2xlZGdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2VNZXNzYWdlQWNrbm93bGVkZ2VtZW50Rm9yRWFjaFRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUFja25vd2xlZGdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BY2tub3dsZWRnZW1lbnROZWVkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlRXhwZWN0ZWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyVHlwZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJUeXBlQ29kZWQiIHR5cGU9Ik9yZGVyVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyVHlwZSIgdHlwZT0iT3JkZXJUeXBlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9yZGVyVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRPZk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ2xhaW1Gb3JQYXJ0c0FuZE9yTGFib3VyQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aWNlT2ZBbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkNvbGxlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mRGlzdHJpYnV0aW9uT2ZEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nSXRlbXNUb0JlQm9va2VkVG9BRmluYW5jaWFsQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9HQ3JpdGljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPR1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQWNrbm93bGVkZ2VtZW50QW5kRXJyb3JSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JBbmRBY2tub3dsZWRnZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRXJyb3JNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckJhbmtlcnNEcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JCYW5rZXJzR3VhcmFudGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckRlc2lnbmF0aW9uT2ZCZXJ0aGluZ1BsYWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JFeGNoYW5nZUFsbG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yR29vZHNDb250cm9sQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9ySW5zcGVjdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclBoeXRvc2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JTaGlmdGluZ0Zyb21UaGVEZXNpZ25hdGVkUGxhY2VJblBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yVXNhZ2VPZkJlcnRoT3JNb29yaW5nRmFjaWxpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JWZXNzZWxzRW50ZXJpbmdJbnRvUG9ydEFyZWFJbk5pZ2h0LVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsTm90aWNlR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29ydG1lbnRBZ2FpbnN0QmxhbmtldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRhQ2FybmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9QbGFuQW5kU2hpcE9yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvblRvUGxhbkFuZFN1Z2dlc3RPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eVRvUHJvY2VlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50Q29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VDb25maXJtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtlcnNEcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0d1YXJhbnRlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ1N0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1RvQmFua0Z1bmRzVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQWdyZWVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY09yZGVyaW5nQWdyZWVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsYW5kSG9sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mRXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ29weSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nT3JpZ2luYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rZXRPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldE9yZGVyRXN0aW1hdGVkUXVhbnRpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtldFB1cmNoYXNlQWdyZWVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nQ29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRhcnlRdW90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5QW1lcmljYUNlcnRpZmljYXRlT2ZDb21wbGlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxpbmdGb3J3YXJkTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsT2ZmRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGxPZmZPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FtcGFpZ25QcmljZVNhbGVzQ2F0YWxvZ3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FjY2VwdGFuY2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BbmFseXNpc1ZveWFnZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29EZWNsYXJhdGlvbkFycml2YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvRGVjbGFyYXRpb25EZXBhcnR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTW92ZW1lbnRFdmVudExvZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Nb3ZlbWVudFZveWFnZVN1bW1hcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZU5vdGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29TdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVmVzc2VsRGlzY2hhcmdlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVmVzc2VsTG9hZGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0YWdlT3JkZXJMb2NhbFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xGaW5hbmNpYWxTdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZBbmFseXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbkZvcm1Hc3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZRdWFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZSZWdpc3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlNlYWxpbmdPZkV4cG9ydE1lYXRMb2NrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRDb3N0QW5kUHJpY2VEYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRJbnNwZWN0aW9uQW5kVGVzdFJlc3VsdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVRvQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZVRvUHVyY2hhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVG9SZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2ViYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzTm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxMaWFiaWxpdHlGb3JPaWxDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VPdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZUNoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyYW5jZUNlZGluZ0JvcmRlcmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25PcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvblBheW1lbnRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkQ2VydGlmaWNhdGVPZlZhbHVlQW5kT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZFRyYW5zcG9ydEJpbGxPZkxhZGluZ011bHRpbW9kYWxCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQWNjb3VudFN1bW1hcnlSZXNwb25zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERpc3B1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZVdoaWNoSW5jbHVkZXNBUGFja2luZ0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25Ob3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NpdGVEYXRhRWxlbWVudENoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2l0ZURhdGFFbGVtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50U3RhdHVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudFVucGFja1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkQ3JlZGl0Tm90ZUdvb2RzQW5kU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFySW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzY2hhcmdlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTWFuaWZlc3RVbml0UGFja2luZ0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9mZkhpcmVOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0cmlwcGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBd2FyZE5vdGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCaWxsT2ZRdWFudGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEZ1bmRzU3RhdHVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNlY3VyaXR5Q2xhc3NpZmljYXRpb25TcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sRG9jdW1lbnRUNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uQ29tYmluZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkRlcGFydHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3VwZXJhbm51YXRpb25Db250cmlidXRpb25zQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdXBlcmFubnVhdGlvbk1lbWJlck1haW50ZW5hbmNlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdERhdGFTdW1tYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydEZvcm1hdDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydEZvcm1hdDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydEZvcm1hdDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydEZvcm1hdDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydEZvcm1hdDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RTY2hlZHVsZVN0YXR1c1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXROb3RlRm9yUHJpY2VWYXJpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVSZWxhdGVkVG9GaW5hbmNpYWxBZGp1c3RtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZVJlbGF0ZWRUb0dvb2RzT3JTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld0xpc3REZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld3NFZmZlY3RzRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ0Rlc3BhdGNoQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NEb2NraW5nU2VydmljZXNPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGF5bWVudE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ3Jld0FuZENvbnZleWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblBvc3RQYXJjZWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25Gb3JDYXJnb0V4YW1pbmF0aW9uQWx0ZXJuYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRoQ29tbWVyY2lhbEFuZEl0ZW1EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhvdXRDb21tZXJjaWFsRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVjbGFyYXRpb25XaXRob3V0SXRlbURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlbGl2ZXJ5Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RvY3VtZW50c0V4cGlyYXRpb25Ob3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbW1lZGlhdGVSZWxlYXNlRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNTdW1tYXJ5RGVjbGFyYXRpb25XaXRoQ29tbWVyY2lhbERldGFpbEFsdGVybmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N1bW1hcnlEZWNsYXJhdGlvbldpdGhvdXRDb21tZXJjaWFsRGV0YWlsQWx0ZXJuYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VDZXJ0aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0RlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZVJlbGF0ZWRUb0ZpbmFuY2lhbEFkanVzdG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVSZWxhdGVkVG9Hb29kc09yU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uT2ZPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUmVnYXJkaW5nVGhlSW53YXJkQW5kT3V0d2FyZE1vdmVtZW50T2ZWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGNyZWRlcmVDcmVkaXROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxjcmVkZXJlSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlGb3JlY2FzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5SnVzdEluVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGljZUdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGljZVJhaWxUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZVJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVZlcmlmaWNhdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdERvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUG9zdFBhcmNlbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb25SZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBY2NlcHRhbmNlQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFtZW5kbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnRJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnROb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Q29sbGVjdGlvbkluc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdElzc3VhbmNlSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TGV0dGVyT2ZJbmRlbW5pdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0TmVnb3RpYXRpb25BZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Tm90aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFBheW1lbnRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0VHJhbnNmZXJBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVzcG9uc2VDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHNQcmVzZW50YXRpb25Gb3JtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEJpbGxPZlF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2aW5nTGljZW5jZUludGVybmF0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZpbmdMaWNlbmNlTmF0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFY0Nhcm5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpQXNzb2NpYXRlZE9iamVjdEFkbWluaXN0cmF0aW9uTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1iYXJnb1Blcm1pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyQmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJEaXNwb3NpdGlvbk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRVc2VBdXRob3JpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnF1aXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvclJlc3BvbnNlQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0T2ZmaWNpYWxSZWNvZ25pdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUNvbnRyb2xEZWNsYXJhdGlvbkltcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VDb250cm9sRGVjbGFyYXRpb25FeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckV4cG9ydExpY2VuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkQ3JlZGl0QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFBheW1lbnRPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmEtQ29tbXVuaXR5VHJhZGVTdGF0aXN0aWNhbERlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNhdGVBbmRIb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3JlZENyZWRpdE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcmVkSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbExhYmVsQXBwcm92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUGF5bWVudFJlcXVlc3RCYXNlZE9uQ29tcGxldGlvbk9mV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50T2ZBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbXBsZVRlc3RSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZVBlcm1pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybXVsYUZ1bmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQWR2aWNlVG9FeHBvcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0FkdmljZVRvSW1wb3J0QWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNDZXJ0aWZpY2F0ZU9mUmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0NlcnRpZmljYXRlT2ZUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzV2FyZWhvdXNlUmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVBhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0TWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb25DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZVBhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb1N1bW1hcnlNYW5pZmVzdFJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbFJlc3BvbnNlQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb250cm9sQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JDdXN0b21zVHJhbnNpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckV4cG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9ySG9tZVVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZWNsYXJhdGlvbkZvckltcG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdENhcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3JzZW1lYXRTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZUJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2VXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eUNhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGVuZGluZ0Fycml2YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uR3VpZGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRMaWNlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvckltcG9ydExpY2VuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeURlZmluaXRlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeURlZmluaXRlUXVhbnRpdHlDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZWZpbml0ZURlbGl2ZXJ5SW5kZWZpbml0ZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlJbmRlZmluaXRlUXVhbnRpdHlDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5U3VwZXJhbm51YXRpb25NZW1iZXJNYWludGVuYW5jZU1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZWRpYmxlU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db3B5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlcndheUJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1Y3Rpb25zRm9yQmFua1RyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvblRvQ29sbGVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZURlY2xhcmF0aW9uU2hlZXRCb3JkZXJlYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBvbGljeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlcnNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltQXBwbGljYXRpb25Gb3JQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFRyYW5zcG9ydE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYXN0YXREZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5QWRqdXN0bWVudFN0YXR1c1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5TW92ZW1lbnRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5U3RhdHVzQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNpbmdEYXRhU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1zQm9va2VkVG9BRmluYW5jaWFsQWNjb3VudFJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iTG90Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5iYW5TY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQmxhbmtldEFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFN0YXRlbWVudE9mQW5BY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZJbmRlbW5pdHlGb3JOb24tU3VycmVuZGVyT2ZCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mSW50ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUGF5cm9sbERlZHVjdGlvbnNBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGxpbmVEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VmFsdWVQYXltZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2VPckJ1eVBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZURlY2xhcmF0aW9uT2ZIZWFsdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFpcldheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxJbnNwZWN0aW9uQW5kUmVjZWl2aW5nUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlU1JlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRhdGlvbkF2YWlsYWJpbGl0eUluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0YXRpb25TY2hlZHVsZUluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0QW5kTWVhdEJ5LVByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEZvb2RQcm9kdWN0c1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VJbkRldmVsb3BtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJlZFNlcnZpY2VzSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmljYXRpb25PZkV4aXN0aW5nTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZW1lbnRDZXJ0aWZpY2F0ZUFUcjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpZHJvcE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aW1vZGFsQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpbW9kYWxUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUGF5bWVudE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lUHJvZHVjdFBsYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdDb2RlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWVzc2FnZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdQcm9kdWN0SW50cm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZU9wZW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1OZWdvdGlhYmxlTWFyaXRpbWVUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QcmUtQXV0aG9yaXNlZERpcmVjdERlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdFJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEZvclNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdEZWxpdmVyeUdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VPZkNpcmN1bXN0YW5jZXNQcmV2ZW50aW5nVHJhbnNwb3J0R29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbk9mRW1lcmdlbmN5U2hpZnRpbmdGcm9tVGhlRGVzaWduYXRlZFBsYWNlSW5Qb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZlVzYWdlT2ZCZXJ0aE9yTW9vcmluZ0ZhY2lsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyUXVvdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGljYWxDaGFyYWN0ZXJSZWFkaW5nUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhdHVzRW5xdWlyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VSZXNwb25zZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCb25kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPclBlcmZvcm1hbmNlQm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlcXVlc3RGb3JDb21wbGV0ZWRVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbkZvclVuc2NoZWR1bGVkSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY2V1dGljYWxTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHl0b3Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcE5vdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydENoYXJnZXNEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3VsdHJ5U2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYWR2aWNlT2ZBQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVBdXRob3JpemVkRGlyZWN0RGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZUF1dGhvcml6ZWREaXJlY3REZWJpdFJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUNyZWRpdEFzc2Vzc21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5U2FsZXNSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBheW1lbnRJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1c3RvbXNEb2N1bWVudE1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlU2FsZXNDYXRhbG9ndWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlU2FsZXNDYXRhbG9ndWVSZXNwb25zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VkQWx0ZXJuYXRlVGVuZGVyQmlsbE9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlZFRlbmRlckJvcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VOZWdvdGlhdGlvblJlc3VsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25JbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzRGF0YVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdERhdGFNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UGVyZm9ybWFuY2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTcGVjaWZpY2F0aW9uUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzaXZlRGlzY2hhcmdlUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFzdGVyUGxhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hc3RlclNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBsYW5uaW5nQXZhaWxhYmxlUmVzb3VyY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbm5pbmdDYWxlbmRhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb2R1Y3Rpb25QbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UmVjb3ZlcnlQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUGF5bWVudFZhbHVhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckNoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXNwb25zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ1NwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlEYXRhTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhUHJpb3JBbGxvY2F0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDb25zaWdubWVudE5vdGVHZW5lcmljVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JEZXNwYXRjaEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc3NpZ25tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Q3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaGFyZ2luZ0RvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRVcGRhdGVTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEFwcGVsbGF0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbkNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblJlbmV3YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkRGlyZWN0RGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUFnYWluc3RBc3NvcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlT3JEZWxpdmVyeU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5ld2FsT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQW5kUmV0dXJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNGb3JJbmZvcm1hdGlvbk9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE9mVHJhbnNhY3Rpb25zV2hpY2hOZWVkRnVydGhlckluZm9ybWF0aW9uRnJvbVRoZVJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yRmluYW5jaWFsQ2FuY2VsbGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yU3RhdGlzdGljYWxEYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRzQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLVNlbmRpbmdDb25zaWdubWVudE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9BbkFtZW5kbWVudE9mQURvY3VtZW50YXJ5Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvQVRyYWRlU3RhdGlzdGljc01lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9QcmV2aW91c0JhbmtpbmdTdGF0dXNNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZVRvUXVlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9SZWdpc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RvdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdW1lV29ya09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxlclByZWNvbW1pdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2FsT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2FsT2ZEZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENvbnNpZ25tZW50Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZExpc3QtU21ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVzaE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRIYXphcmREYXRhU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mRXF1aXBtZW50Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mUmFkaW9DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZTaGlwQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFzb25UaWNrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYVdheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRDaGFuZ2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZkJpbGxlZENyZWRpdE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGYtQmlsbGVkSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VxdWVuY2VkRGVsaXZlcnlTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZURpcmVjdG9yeURlZmluaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPZkFMZXR0ZXJPZkNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0xldHRlck9mSW5zdHJ1Y3Rpb25zQWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwc1N0b3Jlc0RlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVEYXRhRWxlbWVudENoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZURhdGFFbGVtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlQWRtaW5pc3RyYXRpdmVEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhcmVQYXJ0c09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3RPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRBbG9uZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnRPZkFjY291bnRNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbEFuZE90aGVyQWRtaW5pc3RyYXRpdmVJbnRlcm5hbERvY3VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERlZmluaXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50RXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERvY3VtZW50SW1wb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVzUmVxdWlzaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlQWlyV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWFyeVNhbGVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YXJ5RG9jdW1lbnRGb3JBcHBsaWNhdGlvbkZvckNhcmdvT3BlcmF0aW9uT2ZEYW5nZXJvdXNHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeURvY3VtZW50Rm9yQXBwbGljYXRpb25Gb3JUcmFuc3BvcnRPZkRhbmdlcm91c0dvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlPclNlcnZpY2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhcE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rZXJCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhc2tPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q2FsY3VsYXRpb25Db25maXJtYXRpb25SZXNwb25zZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlY2xhcmF0aW9uR2VuZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVjbGFyYXRpb25WYWx1ZUFkZGVkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE5vdGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpZkZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVNYXRlcmlhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpckNhcm5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sbENvbnZlcnNpb25PcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdOdW1iZXJBc3NpZ25tZW50UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENhcmdvUmVsZWFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREZXBhcnR1cmVSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERpc2NoYXJnZUluc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREaXNjaGFyZ2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtZXJnZW5jeUNhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtcHR5RXF1aXBtZW50QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRBY2NlcHRhbmNlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERhbWFnZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGVsaXZlcnlOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudERpcmVjdEludGVyY2hhbmdlUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRFbXB0eVJlbGVhc2VJbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50SW1wZW5kaW5nQXJyaXZhbEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0F1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1haW50ZW5hbmNlQW5kUmVwYWlyV29ya0VzdGltYXRlQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtFc3RpbWF0ZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNb3ZlbWVudEluc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNb3ZlbWVudFJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T2ZmSGlyZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T2ZmSGlyZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uSGlyZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbkhpcmVSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE9uSGlyZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBhY2tpbmdJbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50UGlja1VwQXZhaWxhYmlsaXR5Q29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrVXBBdmFpbGFiaWxpdHlSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrVXBSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNoaWZ0UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTcGVjaWFsU2VydmljZUluc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdGF0dXNDaGFuZ2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0b2NrUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5T3JkZXJSZXNwb25zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRVbnBhY2tpbmdJbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50VW5wYWNraW5nUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRMb2FkaW5nSW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydExvYWRpbmdSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZUluUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRNb3ZlbWVudEdhdGVPdXRSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFN0YXR1c1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U3RhdHVzUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudERlc3BhdGNoQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudE5pbE91dHR1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFBlcnNvbmFsRWZmZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRUaW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFRpbWVVcFVuZGVyYm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50VW5kZXJib25kQnlTZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyYm9uZEFwcHJvdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmJvbmRSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0RG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc1N0YW5kYXJkTWVzc2FnZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRFeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsTXVsdGlwdXJwb3NlVHJhbnNwb3J0RG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hpcFBlcm1pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJnZW50U2VydmljZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJEaXJlY3RvcnlEZWZpbml0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNjaW5hdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0ZWRQcmljZWRUZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFVucGFja1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRGV0ZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlV2FycmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodExpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbEhlYWx0aENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuSW5zdHJ1Y3Rpb25zSW5Db25mb3JtYW5jZVdpdGhBZHJBcnRpY2xlTnVtYmVyMTAzODUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1cnJlbmN5Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUNvZGVkIiB0eXBlPSJDdXJyZW5jeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkN1cnJlbmN5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3kiIHR5cGU9IkN1cnJlbmN5Ii8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkN1cnJlbmN5Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFGQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFpEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBREYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFEUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWk0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkhEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJCRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQllCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk1EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCV1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk5EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJJRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0hSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNWRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1lEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYT0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhBRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFBGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNMRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05ZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNVUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1lQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRKRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQ0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUdQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUVLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEVVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGS1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZKRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkFMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR01EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1RRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTkYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1lEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEtEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5SIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVJSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUxTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlBZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktaVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0VTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLV0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0dTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxWTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxTTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMWUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUdGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNV0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVZSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1STyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVVSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ETCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU5UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk9WIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkxHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlJOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkdOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUFciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEtSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFlHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBIUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUExOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9NUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk9MIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJXRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1NUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0dEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTS0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0JEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1JXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFU1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTREEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNERCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0RQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNaTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNZUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEpSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUWlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRIQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFBFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUT1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRURCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE5EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVHWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVZVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZVViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVVOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaTUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpXRCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGFuZ3VhZ2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxhbmd1YWdlQ29kZWQiIHR5cGU9Ikxhbmd1YWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGFuZ3VhZ2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhbGVDb2RlZCIgdHlwZT0iTG9jYWxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYWxlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iTGFuZ3VhZ2VEZXBlbmRlbnQiIHR5cGU9InhjYmxCb29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxhbmd1YWdlIiB0eXBlPSJMYW5ndWFnZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMYW5ndWFnZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZHoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImduIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im10Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJxdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InlpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InpoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6dSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhbGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJiIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJieSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImR6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZqIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdiIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJneSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJociIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iam8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImpwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJraSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1oIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im12Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im15Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJucCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im51Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJueiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icG4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJxYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRqIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0diIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2dSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inl1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iem0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inp3Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXhSZWZlcmVuY2UiPgorICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iVGF4Ij4KKyAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4VHJlYXRtZW50Q29kZWQiIHR5cGU9IlRheFRyZWF0bWVudENvZGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4VHJlYXRtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4UmVmZXJlbmNlIiB0eXBlPSJUYXhSZWZlcmVuY2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheExvY2F0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhMb2NhdGlvbiIgdHlwZT0iVGF4TG9jYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlZCIgdHlwZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhDYXRlZ29yeUNvZGVkIiB0eXBlPSJUYXhDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheENhdGVnb3J5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZWQiIHR5cGU9IlJlYXNvblRheEV4ZW1wdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhUeXBlQ29kZWQiIHR5cGU9IlRheFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhUeXBlQ29kZWRPdGhlciI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGVyY2VudCIgdHlwZT0iRGVjaW1hbDEwXzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlZCIgdHlwZT0iVGF4UGF5bWVudE1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhhYmxlQW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4YWJsZUFtb3VudEluVGF4QWNjb3VudGluZ0N1cnJlbmN5IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheEFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEFtb3VudEluVGF4QWNjb3VudGluZ0N1cnJlbmN5IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUYXhMb2NhdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4IiB0eXBlPSJUYXgiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbER1dHlUYXhPckZlZUN1c3RvbXNJdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVzQ3VzdG9tc0l0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZFYWNoRHV0eVRheE9yRmVlVHlwZUN1c3RvbXNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkFsbER1dGllc1RheGVzQW5kRmVlVHlwZXNDdXN0b21zRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UmVsYXRlZEluZm9ybWF0aW9uIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheENhdGVnb3J5Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXlJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eVBhaWRCeVN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGb3JFeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvclJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbUNvdW50eVByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0ZnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0R29vZHNhbmRTZXJ2aWNlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TGV0dGVyT25GaWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdE5vdEZvclJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVBlclN0YXRlTGF3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRQcm92aW5jaWFsU2FsZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFNhbGVUb1VTR292ZXJubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVFeHBvcnRJdGVtVGF4Tm90Q2hhcmdlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaGVyUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRheGFibGVNYXRlcmlhbEV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRUYXhSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSG9tZXN0ZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdEZvclJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Tm90Rm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuU3BhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUHJvcGVydHlUYXhFeGVtcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlc091dHNpZGVTY29wZU9mVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZUV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheER1ZUZyb21BUHJldmlvdXNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Tm90Tm93RHVlRm9yUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9SYXRlZEdvb2RzIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtRm9yRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXMtVGF4RXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOby1Ob3RUYXhFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE9yRm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTm90Rm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtU2FsZVRvVVNHb3Zlcm5tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFRheGFibGVMYWJvckV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90VGF4YWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFRvbGxTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtR29vZHNBbmRTZXJ2aWNlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LVByb3ZpbmNpYWxTYWxlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0Zhcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0TG9jYWxTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZFZldGVyYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXI2NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0RnJvbVNjaG9vbFByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tTG9jYWxQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsbHlFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU3RhdGVQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUxldHRlck9uRmlsZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNpdHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMUNvdW50eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFTdGF0ZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvbW1vZGF0aW9uc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxFeHBvcnRSZWJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbGxldnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sTWFya1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsVGF4ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktRHVtcGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzTGljZW5zZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NQcml2aWxlZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhclRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVJlbnRhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmZWVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaW5PcGVyYXRlZERldmljZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5U3BlY2lmaWNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUluY29tZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaFNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlSZW50YWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHRMYWJvclRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmhhbmNlZDkxMVN0YXRlRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGF0ZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaXNlRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluY29tZVRheFdpdGhob2xkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVmFsdWVBZGRlZFRheE9uR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVlSW5MaWV1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBTWVkaWNhcmVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FTb2NpYWxTZWN1cml0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsTFVTVFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFNwaWxsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VwZXJGdW5kVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYW1pbmdUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb25zdHJ1Y3Rpb25UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpZnRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRpY2FwVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheVVzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsdW1pbmFudHNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEluY29tZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5oZXJpdGFuY2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxGdWVsVGF4QWdyZWVtZW50VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckJ5VHJhZGVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheEZlZGVyYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWt5VW5kZXJncm91bmRTdG9yYWdlVGFua1RheFN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWdodER1ZXNQYXlhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENvbnN0cnVjdGlvblRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTYWxlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1c3RUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRyb3BvbGl0YW5UcmFuc2l0VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNjZWxsYW5lb3VzQ2FzaERlcG9zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNTdGF0ZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlDb21wZW5zYXRvcnlBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yRnVlbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVuaWNpcGFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVGF4ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyQ29uc29ydGl1bVRheC1JdGFseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0VGhyZXNob2xkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJlbmNlRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlVGhyZXNob2xkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbGNvdW50ZXJ2YWlsaW5nRHV0eUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsQ291bnRlcnZhaWxpbmdEdXR5Q2FzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Qm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxEdXR5Q2FzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoQW5kRWR1Y2F0aW9uVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsUHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQW5kVXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBlcmNlbnRhZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldmVyYW5jZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFNvY2lhbFNlY3VyaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZWRXYWdlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpZFdhc3RlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29uc3RydWN0aW9uVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFkaXVtVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcER1dHktSW1wb3N0YWRpQm9sbG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlYW5kTG9jYWxTYWxlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRMb2NhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBbmRQcm92aW5jaWFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUV4Y2lzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxGdWVsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2lhbFNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbFRheE9uR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZW50YWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlVGF4b25TcGVjaWZpY0xhYm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcmZ1bmRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1clRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zRGV2aWNlRm9yVGhlRGVhZlNlcnZpY2VFeGNpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb25uYWdlVGF4ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyaXNtVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuT3ZlclRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5lbXBsb3ltZW50VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdHlVc2Vyc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhob2xkaW5nVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrZXJzQ29tcGVuc2F0aW9uVGF4Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxMF80Ij4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxMCIvPgorICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iNCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhQYXltZW50TWV0aG9kQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmQXNzZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlWZW5kb3IiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDIxXzYiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjIxIi8+CisgICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI2Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGVkIiB0eXBlPSJMb2NhdGlvblF1YWxpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsQWRkcmVzc0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTmFtZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iR1BTQ29vcmlkaW5hdGVzIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbiIgdHlwZT0iTG9jYXRpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uVG9SZWNlaXZlQ3JlZGl0Rm9yVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRpbmdVdGlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1NjaGVkdWxlRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzQmxvY2tHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVCYXNlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vuc3VzVHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1NjaGVkdWxlSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWFuZW50QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhwbGFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ybGR3aWRlR2VvZ3JhcGhpY0xvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVhcmVzdENyb3NzU3RyZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDcm9zc1N0cmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJTZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJJZGVudGlmaWVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZVN1YmRpdmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmlkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtlclR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGl0dWRlLUxvbmdpdHVkZVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaWRTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsaXF1b3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5ob2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5QmxvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb3RhZ2VDYWxsRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkRpcmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbExlYXNlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUXVhZHJhbmdsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsTWVyaWRpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkJsb2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2lhbFByb3RyYWN0aW9uRGlhZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJRdWFydGVyU2VjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzdHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFndWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvclF1YWRyYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vyc2VEaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0xvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxTdGF0ZW1lbnRzTWFpbGluZ0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlhbmRTdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUG9pbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZFNlcnZpY2VzTG9jYXRpb25EZXNpZ25hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Vjb25vbWljQXJlYVJlZ2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRCaWxsb2ZMYWRpbmdPZmZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb3BvbGl0aWNhbE5hbWVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbk1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1c3RvbXNPZmZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZXNwb25kZW5jZU1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFJhdGVCYXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5T3JQYXJpc2hBbmRTdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UYW5rQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblNQTEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25DZW50ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uLVNoaXBwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZlJlc2lkZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taWNpbGVUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEVxdWFsaXphdGlvblBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRnJlaWdodEZvcndhcmRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5mb3JtYXRpb25Qcm9jZXNzaW5nU3RhbmRhcmRzNTUtTmFtZWRQb3B1bGF0ZWRQbGFjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUuUy5DdXN0b21zRmFjaWxpdGllc0luZm9ybWF0aW9uYW5kUmVzb3VyY2VNYW5hZ2VtZW50U3lzdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN0YXRpb25BY2NvdW50aW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblRyYWRlWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUFsb25nc2lkZVZlc3NlbC1GcmVlT25Cb2FyZFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0U3RhdGlvbkdlb2dyYXBoaWNMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFpclRyYW5zcG9ydEFzc29jaWF0aW9uTG9jYXRpb25RdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmRNb3ZlbWVudFByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TdG9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlRk9CUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkVtYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50RnVybmlzaGVkUHJvcGVydHlGT0JQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvcG9saXRhblNhbXBsaW5nQXJlYVJlZ2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1leGljYW5Qb3N0YWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5T3JTdGF0ZUZyb21Qb2ludHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbi1BZnRlckxvYWRpbmdPbkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZEZyZWVPbkJvYXJkUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5hbmRQcmVwYXlTdGF0aW9uTGlzdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRBY2NlcHRhbmNlUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbi1TaGlwcGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblZlc3NlbC1GcmVlT25Cb2FyZFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0b2ZBcnJpdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0b2ZEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRzQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFNlcnZpY2luZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRGlnaXRVU1pJUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNERpZ2l0VVNaSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVEaWdpdFVTWklQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRGlnaXRDYW5hZGlhblBvc3RhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjZEaWdpdENhbmFkaWFuUG9zdGFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUFyZWFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblJhaWxDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbmFsRWR1Y2F0aW9uU2VydmljZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZUFkbWluaXN0cmF0aXZlTWVzc2FnZVRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnVyYmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5T3JTdGF0ZUFuZFBvaW50c1dpdGhpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sQ2FtcHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtU1BMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblN0b3JhZ2VUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hpbmdEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNjb250aW5lbnRhbEZyZWlnaHRCdXJlYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ2FyZ29Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25zaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUZXJyaXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGluZ0Rpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zTG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmJhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlsbGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsU3Rvd2FnZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2Vhc0FuZFBvaW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUG9ydE9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Q2hhcmdlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNPZmZpY2VPZk1hbmlmZXN0T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZNYW5pZmVzdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5SYWlsSW50ZXJtb2RhbFRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvblJhaWxJbnRlcm1vZGFsVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0T3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQWNjZXB0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zb2xpZGF0aW9uUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlLUNvbnNvbGlkYXRpb25Qb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXlhYmxlQXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFeGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1BvcnRPZkxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1BvcnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGF0Y2hpbmdQb29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdPcmlnaW5PZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mUmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuUG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudFBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRDaGFyZ2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVsZWFzZU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXlQb3J0Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMb2NhdGlvbklkZW50aWZpZXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxvY0lEIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NhdGlvbklkZW50aWZpZXIiIHR5cGU9IkxvY2F0aW9uSWRlbnRpZmllciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZUFkZHJlc3MiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lMSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmFtZTIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hbWUzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUE9Cb3giLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSG91c2VOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldFN1cHBsZW1lbnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXRTdXBwbGVtZW50MiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnVpbGRpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZsb29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSb29tTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmhvdXNlTWFpbCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVwYXJ0bWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2l0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJlZ2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzdHJpY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUaW1lem9uZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlZCIgdHlwZT0iQWRkcmVzc1R5cGVDb2RlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lQWRkcmVzcyIgdHlwZT0iTmFtZUFkZHJlc3MiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBPQm94Ij4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iUE9Cb3hQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBPQm94IiB0eXBlPSJQT0JveCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVnaW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb25Db2RlZCIgdHlwZT0iUmVnaW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVnaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVnaW9uIiB0eXBlPSJSZWdpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVnaW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVQUNUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVU5TVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVRTEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVZJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJERiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJFUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJHTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FBQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FCQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FNQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FORiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FPTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FRQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JERiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JERyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JFUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JGTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JISSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JITCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JJVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JLRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JLSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JURCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRJTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRJUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRVRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNERSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNISSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNLUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNLWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNMQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNSSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNVVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXWSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ291bnRyeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeUNvZGVkIiB0eXBlPSJDb3VudHJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvdW50cnkiIHR5cGU9IkNvdW50cnkiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ291bnRyeUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlciLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRpbWV6b25lIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUaW1lem9uZUNvZGVkIiB0eXBlPSJUaW1lem9uZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRpbWV6b25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGltZXpvbmUiIHR5cGU9IlRpbWV6b25lIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRpbWV6b25lQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTIuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTIuMDAiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50V2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5keUFuZENvbmZlY3Rpb25zRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBc3NpZ25lZFdlbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRPaWxGaWVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGFudHNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25NYWlsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50T3JNZXNzYWdlSXNzdWVyT3JTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNZXNzYWdlUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmFsRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkRpc2Nsb3N1cmVJbmZvcm1hdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlZ2lzdHJhdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1BsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvbkVuZGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uU3RhcnRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUGxhY2VPZkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU3RvcmVCYWtlcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RCcmVha1Rlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdERlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3Job29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVGVtcG9yYXJ5U3RvcmFnZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luTWFpbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5TdWJsb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGVwYXJ0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbE1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUluc3BlY3Rpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2VydmljZXNBbmRSZXBhaXJzQ2VudHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29vcmRpbmF0aW9uT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQb2ludEZvckN1c3RvbWVyU2FtcGxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nU3ViLUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkLUtlZXBpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRIb21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWx0ZXJlZFdvcmtzaG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJhc2VTdGF0aW9uTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvQW5kU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9JZkRpZmZlcmVudEZyb21CaWxsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJPck1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29ycG9yYXRlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2xsZWN0b3JzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1NZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbkhvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlkZW9EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkdQU0Nvb3JpZGluYXRlcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR1BTU3lzdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGF0aXR1ZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb25naXR1ZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkdQU0Nvb3JpZGluYXRlcyIgdHlwZT0iR1BTQ29vcmlkaW5hdGVzIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFRyZWF0bWVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1RheEFwcGxpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldEludm9pY2VMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NJbnZvaWNlTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldExpbmVMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaW5lTGV2ZWwiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3JkZXJJbnZvaWNlTWVkaXVtVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0c3dpdGNoaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVRBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUklOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElUcmFuc21pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVUcmFuc2ZlckFjY2Vzc01ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZUZheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0VJU01haWxib3giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklCTUluZm9ybWF0aW9uRXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmFsTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdEJveE5vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXRTd2l0Y2hpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVncmFwaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlVGV4dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFdYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLjQwMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVxdWlyZWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyRGF0ZXMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVxdWVzdGVkU2hpcEJ5RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyQnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb21pc2VEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FuY2VsQnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGF0ZUNvZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckRhdGVzIiB0eXBlPSJPcmRlckRhdGVzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRhdGVDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0ZUNvZGVkIiB0eXBlPSJMaXN0T2ZEYXRlQ29kZWQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJEYXRlUXVhbGlmaWVyIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlQ29kZWQiIHR5cGU9IkRhdGVDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkIiB0eXBlPSJEYXRlUXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVRdWFsaWZpZXIiIHR5cGU9IkRhdGVRdWFsaWZpZXIiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGF0ZVF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAzMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2NTYzMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzYwMjgzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1MjgzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjI4MzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdFNjaGVkdWxlU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZWxlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZU9mRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVUaW1lT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0QWdlTGltaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50QmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnREYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEluc3VyYW5jZUVsaW1pbmF0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudExpZmV0aW1lQmVuZWZpdFF1YWxpZmljYXRpb25BZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRhbnRzT3BpbmlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDbG9zZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nTWV0aG9kb2xvZ3lDaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1RyYW5zYWN0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1ZhbHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1llYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPcGVuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZS1TdGF0ZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpb25FbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eVJlcG9ydGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UGVyaW9kRGF0ZVJhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbEFyY2hpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQ29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VEYXRlVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUG9ydE9mRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlbGVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJldHVyblRvV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3V0ZU1hbmlmZXN0YXRpb25PZkFDaHJvbmljQ29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkcmVzc1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqb3Vybm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZENvbnRlc3RhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZERlYXRoQmVuZWZpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkSGlyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb2Nlc3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFByb21pc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50VG9CaWxsRGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JPcmRlcmVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXNzaW9uRGF0ZUFuZE9yVGltZUV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG9wdGlvbkRhdGVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUFmdGVyRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUJlZm9yZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VDb21wbGV0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlT25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdG1lbnRQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhYmxlRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2VkUmVuZXdhbER1cmF0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVCYXNlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcm9ibGVtUmVzb2x1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRpdmVEdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmFseXNpc01vbnRoRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhQWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREZWxpbnF1ZW50T25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnREdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRGaWxpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51YWxSZXBvcnRNYWlsaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0aXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0eUNvbW1lbmNlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkQ2xvc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGlhbmNlUGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRTaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkxvZ2dlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRFeHBpcnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxPcmRlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9mZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVBdEluaXRpYWxQb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFYXJsaWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lT2ZUcmFuc3BvcnRMZWFkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lU2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbEluQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0ZXJpYWxCbG9vZEdhc1Rlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldEFuZExpYWJpbGl0eVNjaGVkdWxlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXREb2N1bWVudGF0aW9uRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25tZW50UmVjb3JkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFuY2VEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGllbmNlRGVmaWNpZW5jeVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RBZnRlclNwbGl0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRQZXJpb2RQcmlvclRvU3BsaXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvbkRhdGVUaW1lT2ZEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aGVudGljYXRpb25WYWxpZGF0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0aWNQcmVtaXVtTG9hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5RHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlRGVsaXZlcnlEZWxheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVBheW1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF3YXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT25NYXJrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlckRlbGl2ZXJ5RGF0ZVRpbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEYXRlVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZVNoZWV0RGF0ZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lQ29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VsaW5lU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZm9yZUludmVudG9yeUlzUmVwbGVuaXNoZWRCYXNlZE9uU3RvY2tDaGVja0xlYWRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdMYXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpblRoZXJhcHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5c0JhbmtzRHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QXBwbGljYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRDaGFuZ2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENyZWRpdFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RGViaXRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGF5bWVudHNUZXJtaW5hdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRSZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRzUGFpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZUdyb3NzV2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHlwZU5ldFdlZWtseUFtb3VudEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2RTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RCZWZvcmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0VGltZVRvQ2FsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlhbm51YWxUZXJtaW5hbEluc3BlY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5EYXRlQmlkc1dpbGxCZU9wZW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkUHJpY2VFeGNlcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZFRocm91Z2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rc1ZhbHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZXByaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzSW5jb21wbGV0ZUFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNOb3RBdXRob3JpemVkQXNPZkdpdmVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdENvbXBsZXRlQXNPZkdpdmVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc1JlZ2lzdHJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaXRpc2hUaGVybWFsVW5pdFRlc3RQZXJmb3JtZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldExpbmVBcHBsaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ29udHJvbENoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzT3BlbmVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUZXJtaW5hdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0xvY2FsVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhckFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhclllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4Q291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXJFeEZhY3RvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90RGVsaXZlcmVkQnlUaGlzRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3RQdWJsaXNoZWRCeVRoaXNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFNoaXBwZWRCeVRoaXNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25EYXRlVGltZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwaXRhbGl6YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0aW9uUGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQm9va2luZ0NvbmZpcm1lZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1JlbGVhc2VEYXRlVGltZVVsdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlQ29udmVydGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlUmVvcGVuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hDYWxsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0ZWdvcnlDaGFuZ2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Vhc2VkT3BlcmF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25PZldlaWdodERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uUGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25SZXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFjY291bnRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQmFja0RhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRPZkFjY291bnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2VkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVBbmRPclRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkYmlydGhEYXRlRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJpc3RlbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltQWRtaW5pc3RyYXRvck5vdGlmaWVkT2ZFbXBsb3llZUxlZ2FsUmVwcmVzZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltSW5jdXJyZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU1hZGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbU5vdGlmaWNhdGlvblJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbXNNYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1TdGF0ZW1lbnRQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmFuY2VEYXRlQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxFeGFtaW5hdGlvbkRhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVW50aWxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nRGF0ZU9mRmlyc3RCYWxhbmNlU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc3VyZURhdGVUaW1lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsRGVwZW5kZW50QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUVhcmxpZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uRGF0ZVRpbWVMYXRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFB1bXBpbmdCYWxsYXN0RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lbmNlZFRhbmtDbGVhbmluZ0RhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsUmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55VGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmlzb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBpbGF0aW9uRGF0ZUFuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZU5vdEJlZm9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGVPclRpbWVTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmRpdGlvbkluaXRpYWxUcmVhdG1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1hdGlvbkRhdGVMZWFkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQVF1YWxpZnlpbmdFdmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvblN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTYWZldHlDb252ZW50aW9uQ3NjSW5zcGVjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NQbGF0ZUV4cGlyYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHJpcHBpbmdEYXRlVGltZVVsdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlc3RhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VuY3lFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25PZlBheVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWluZ0VkdWNhdGlvblJlcXVpcmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzQ292ZXJhZ2VEYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c1Bhc3NpdmVNb3Rpb25DUE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEF3YXJkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QmluZGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29tcGxldGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29zdHNUaHJvdWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGVmaW5pdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RFZmZlY3RpdmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEV4cGlyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0TWFpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmZvcm1hbmNlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmUtT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxEZWxpdmVyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsU3RhcnREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kRW5kRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblBlcmlvZFN0YXJ0RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvbnNDZWFzaW5nRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm92ZXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblByaXZpbGVnZUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVyc2lvblRvUmVwYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uSW50b0hvbGRpbmdDb21wYW55RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGVkVG9FbGVjdHJvbmljRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZVJlZ2lzdHJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZpY3RlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbk9mQmVuZWZpdHNCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkRGF0ZU9mQmlydGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc2lnbmVyU2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERpc21pc3NhbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RXZlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0Tm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydFJlZ2lzdHJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyYWdlSXNzdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkSW5jb21lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRlZFNlcnZpY2VFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc1JlcXVlc3RlZFZhbHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3Nib3JkZXJEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5RW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEF1dGhvcml0eUNvbnRyb2xTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbmNvbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMZWdhbFN0cnVjdHVyZUVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TW9udGhFbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnROYW1lRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFJlcG9ydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2NoZWR1bGVTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJ0YWlsbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZWZyb21BZHZpY2VPZlBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyQ29udHJhY3RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclZhbHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NhcmdvUmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0NsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZVRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFjY291bnRNYXR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBbmRPclRpbWVPZkhhbmRsaW5nRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNBdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFzc2lnbm1lbnRGaWxlZEZvclJlY29yZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua3J1cHRjeUZpbGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUJlY2FtZUF3YXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ2xhaW1QYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQ291cnNlT2ZPcnRob2RvbnRpY3NUcmVhdG1lbnRCZWdhbk9ySXNFeHBlY3RlZFRvQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWVkRmlsZWRGb3JSZWNvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEZWZhdWx0V2FzQ3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVEb2N1bWVudGF0aW9uT3JQYXBlcndvcmtPckJvdGhXYXNTZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZUhlbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVGb3JlY2xvc3VyZVByb2NlZWRpbmdzSW5zdGl0dXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlU2FsZVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvclRoZUxhc3RVcGRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lDYW5jZWxsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVIYXphcmRJbnN1cmFuY2VQb2xpY3lSZWZ1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlTWF0ZXJpYWxVc2FnZVN1c3BlbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWJhbmRvbm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjcXVpc2l0aW9uT2ZUaXRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBZHZhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBcHByYWlzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFzc2lnbm1lbnRBcHByb3ZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudFJlamVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNsb3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRhbWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjZWFzZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlZWRJbkxpZXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRpdm9yY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkV4dGVuc2lvblRvQ29udmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJtQ29tbWl0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RNb3J0Z2FnZVBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0UmVnaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdFVuY3VyZWREZWZhdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGb3JlY2xvc3VyZU5vdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3REcmF3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0SW5zdGFsbG1lbnRSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFBheW1lbnRSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdFVwZGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGVQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VBcHByb3ZhbE9mQ29udmV5YW5jZU9mT2NjdXBpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxvY2FsT2ZmaWNlQ2VydGlmaWNhdGlvbk9mQ29udmV5YW5jZU9mRGFtYWdlZFJlYWxFc3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1heGltdW1NZWRpY2FsSW1wcm92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZU9mUHJvYmFibGVJbmVsaWdpYmlsaXR5Rm9yQXNzaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZSZWZlcnJhbEZvckFzc2lnbm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5vdGljZVRvQ29udmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPcGVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9yZGVyTGVhZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlBvc3Nlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb2R1Y3RGYWlsdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZQcm9wZXJ0eUluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcm9tQmFua3J1cHRjeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlcGFpck9yU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VpenVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2VwYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU291cmNlRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT25XaGljaEFzc2V0c0p1ZGdlZEluc3VmZmljaWVudFRvUGF5Q3JlZGl0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT3V0c3RhbmRpbmdMb2FuQmFsYW5jZVJlcG9ydGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGFpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVBsYWNlZEluRGlzZmF2b3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUG9zc2Vzc29yeUFjdGlvbkluaXRpYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByYWN0aWNlQ2Vhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VFc3RhYmxpc2hlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByb3BlcnR5U29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlYWR5Rm9yQ29sbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVJlZGVtcHRpb25QZXJpb2RFbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVmZXJyZWRUb0F0dG9ybmV5Rm9yRm9yZWNsb3N1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3REYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGhyb3VnaFdoaWNoUHJvcGVydHlUYXhlc0hhdmVCZWVuUGFpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkRpc2NvdW50VGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaW1lT2ZJbnRlcmVzdER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkxhdGVzdEFjY291bnRzRmlsaW5nQXRQdWJsaWNSZWdpc3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRvdGFsQW1vdW50T2ZEZWxpbnF1ZW5jeVJlcG9ydGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVm9sdW50YXJ5Q29udmV5YW5jZUFjY2VwdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlV2hlbkNvbnRhaW5lckVxdWlwbWVudEJlY29tZXNEb21lc3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5bGlnaHRPdmVyZHJhZnRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzT2ZPcGVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYXRoRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0VmFsdWVEYXRlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0SW5jdXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2lzaW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUHJlc2VudGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25SZWZlcmVuY2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZWROb3RBdmFpbGFibGVBc09mR2l2ZW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWREaXN0cmlidXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmluaXRpb25PZkRpc2FiaWxpdHlEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXllZEJpbGxpbmdOb3REZWxheWVkUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJOb3RCZWZvcmVBbmROb3RBZnRlckRhdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFwcG9pbnRtZW50RGF0ZUFuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWUxU3RTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUN1cnJlbnRTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZURlZmVycmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRWFybGllc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFeHBlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUZpcnN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGFzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVByb21pc2VkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVNjaGVkdWxlZEZvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T3JkZXJJc3N1ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlUaWNrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmlhbEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVzY2lzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnREaXNjaGFyZ2VEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZMYWJvcldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRWFybGllc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRnJvbUxhc3RQb3J0T2ZDYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRnJvbVNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbEluZm9ybWF0aW9uUmVjZWlwdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdEludGVyY2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJpbGl0eVdhaXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VBbmRMb2FkaW5nQ29tcGxldGVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZS1QbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNlbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNtaXNzYWxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvclRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVuZEFwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRFeHBpcnlEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRJc3N1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0UHJlc2VudGF0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE1lc3NhZ2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRSZWNlaXZlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlcXVlc3RlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJBZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3REZWxpdmVyQmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFNoaXBCZWZvcmVFeENvdW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4RmFjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdSZXZpc2lvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BBY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wcGVkVG9MZXNzVGhhbkhhbGZUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlTGFzdENvbXBsZXRlSW5zdGFsbG1lbnRQYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVEYXRlT2ZGaXJzdFBheW1lbnRUb1ByaW5jaXBhbEFuZEludGVyZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWVUb0N1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXBsaWNhdGVCaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RGaWxpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmxpZXN0U2FsZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVdpdGhkcmF3YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5pbmdzRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25CZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlRGF0ZU9mQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmlsaXR5RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmthdGlvbkRhdGVBbmRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Byb2Zlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlRWZmZWN0aXZlRGF0ZU9mQ292ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlTGFpZE9mZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUZW1wb3JhcnlMYWlkT2ZmUGVyaW9kU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVdhZ2VzQ2Vhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcktub3dsZWRnZU9mVGhlSW5qdXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llclJlcG9ydGVkSW5qdXJ5VG9DbGFpbUFkbWluaXN0cmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQb3NpdGlvblN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudE9ySGlyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UHJvZmVzc2lvblN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEF2YWlsYWJpbGl0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVPZlN1cHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZERhdGVTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0xheURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mR3JhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTGFzdEZpc2NhbFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VkQ2VydGlmaWNhdGVJc3N1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFuZ2VMZXZlbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nRGF0YUxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucm9sbG1lbnRTaWduYXR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZUVzdGltYXRlZEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZUVhcmxpZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudExvZ0VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRQb3NpdGlvbmluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFByZVRyaXBEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZWNvbmRpdGlvbmluZ0RhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRSZXBhaXJSZWFkeURhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJldHVyblBlcmlvZEV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdG9ja0NoZWNrRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NhbGF0aW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlQ29tbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBY2NlcHRhbmNlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1GaXJzdFByaW9yTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZENvbXBsZXRpb24tU2Vjb25kUHJpb3JNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1UaGlyZFByaW9yTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkRhdGVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkJpcnRoRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRXNjcm93Q2xvc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkSW1taWdyYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9pbnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUG9ydE9mRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkU3RhcnQtRmlyc3RQcmlvck1vbnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1TZWNvbmRQcmlvck1vbnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1UaGlyZFByaW9yTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlUHJlcGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpb25EYXRlVGltZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpdFBsYW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRDb250YWluZXJIaXJlRnJvbURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZEZ1bmRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFByb2JsZW1SZXNvbHV0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRSZXBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRWYWx1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZU9mRXh0ZW5zaW9uVG9Bc3NpZ24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb250b0ZvcmVjbG9zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUaW1lT2ZDdXN0b21zRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlVG9TdWJtaXRUaXRsZUV2aWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub0NvbnZleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbk9mRXh0ZW5zaW9uVG9TdWJtaXRGaXNjYWxEYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZGb3JlY2xvc3VyZVRpbWVmcmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mRXhwb3J0TGljZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJ5RGF0ZU9mSW1wb3J0TGljZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwbGFudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZUZvclRleHRpbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3N1cmVTb3VyY2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNzaW1pbGVEdWVCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlTW9kZUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhc2liaWxpdHlTaWduT2ZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGlnaHdheUFkbWluaXN0cmF0aW9uRmh3YUluc3BlY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVDYXBpdGFsaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRGYWlsdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVHZW5lcmF0aW9uRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbElzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY29uY2lsaWF0aW9uVmFsdWVFc3RpbWF0ZUFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsU2NoZWR1bGVkUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ292ZXJhZ2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluZm9ybWF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25TdWJtaXNzaW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVNYW5kYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaERhdGVPclRpbWVFYXJsaWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdERhdGVPZk9yZGVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludGVyZXN0QmVhcmluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RQYXltZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEludm9sdmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdElzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdE1hcmtldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFBheW1lbnRDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQcm9kdWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQdWJsaXNoZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFJhdGVBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U3VibWlzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNjYWxBbm5pdmVyc2FyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEV4dHJhRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFBlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJpbGxEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9Db21wbGV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0RlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0VhcmxpZXN0RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvTGF0ZXN0RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbW1lbmNlbWVudE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mTm90aWNlVG9Qcm9jZWVkVG9Db21wbGV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9EZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2FtcGxlUmVhZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb1NoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mUmVjZWlwdE9mSXRlbVRvQXBwcm92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZUb29saW5nQWlkc1RvU2FtcGxlUmVhZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZTYW1wbGVBcHByb3ZhbFRvRmlyc3RQcm9kdWN0U2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZUb29saW5nQXV0aG9yaXphdGlvblRvU2FtcGxlUmVhZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21MYXN0Qm9va2VkT3JkZXJUb0RlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXBwcm9wcmlhdGlvbi1TdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnV0dXJlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWxsb25zUGVyTWludXRlVGVzdFBlcmZvcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNDb2xsZWN0aW9uT3JQaWNrVXBEYXRlVGltZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZUV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1Bvc2l0aW9uaW5nRGF0ZVRpbWVQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQ29udHJhY3RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kT3ZlckRhdGVUaW1lUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaENhcGl0YWxZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRGcm9tRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlyZWRVbnRpbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXNTdG9ja0FzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGlkYXlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZXN0ZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvblN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNDb25uZWN0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZXNEaXNjb25uZWN0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxBZG1pc3Npb25EYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJvdGVzdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklsbG5lc3NCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc1JlY292ZXJ5RGF0ZUV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1pZ3JhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxhbnRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25EYXRlVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5RW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5hY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZE1vdmVtZW50QXV0aG9yaXphdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZURvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVJbmNyZWFzZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvbkRpc3NvbHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmN1bWJlbmN5UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRWR1Y2F0aW9uUGxhbklFUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tZm9yY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUmVsZWFzZUF1dGhvcml6YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb21wbGV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsQ29udGFjdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZExhc3REYXlXb3JrZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kUmV0dXJuVG9Xb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGlzYWJpbGl0eVBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmVlRHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRmluYW5jaWFsQWNjb3VudHNGaWxlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudERhdGVJbml0aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFByZW1pdW1FZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxSZXF1ZXN0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFRyZWF0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluanVyeUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5T3JJbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TZXJ2aWNlU3VydmV5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zb2x2ZW5jeURpc2NoYXJnZUdyYW50ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uRGF0ZVRpbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbWVudFBheW1lbnREdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNPcmlnaW5hbEV4ZWN1dGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VmZmljaWVudEFzc2V0c0p1ZGdlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0Q2FwaXRhbGl6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRocm91Z2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGFpZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RSYXRlVmFsaWRpdHlQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50QXBwcm92YWxGb3JQdWJsaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZXZpZXdDeWNsZVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJydXB0aW9uRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25TdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlclNpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlSZXBvcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvblN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudE51bWJlckFsbG9jYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZpdGF0aW9uVG9UZW5kZXJEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVJlcXVpcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZWd1bGFySW50ZXJlc3RQYXltZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Db250cmFjdEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbmVkRW1wbG95ZXJEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRGdW5kRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudENhbGVuZGFyWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRGaXNjYWxZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJXYWdlRGV0ZXJtaW5hdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBY3Rpdml0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RBbm51YWxSZXBvcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2FwaXRhbENoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDZXJ0aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2hlY2tGb3JCYWxhbmNlU2hlZXRVcGRhdGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2l2aWxpYW5GbGlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlRm9yQUdvdmVybm1lbnRBZ2VuY3lUb0ZpbGVBQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlT2ZBY2NvdW50c0ZpbGVkQXRQdWJsaWNSZWdpc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZk9yZGVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvRmlsZUFDbGFpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVUb09iamVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEVwaXNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGbGlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RGb2xsb3ctdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnN1cmFuY2VNZWRpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEl0ZW1EZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdExvZ2dlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1hcmtldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE1lbnN0cnVhbEN5Y2xlU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWlsaXRhcnlGbGlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3ROb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RPZmZIaXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9uSGlyZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYWlkSW5zdGFsbG1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UGF5bWVudE1hZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQaHlzaWNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1FZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcmVtaXVtUGFpZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHVibGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaXNoZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2FsYXJ5SW5jcmVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxlRGF0ZUFuZE9yVGltZUFuZE9yUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2NyZWVuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U2VlbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RWaXNpdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RYUmF5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0QWJzZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RCYWxhbmNlU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdENoZWNrSW5UaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3REZWxpdmVyeURhdGVhdFBpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZUF0UmFpbFJhbXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEZpbGluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0TWF0ZXJpYWxTYWZldHlEYXRhU2hlZXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNZXRlclJlYWRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RPbkJvYXJkQ2FycmllckRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFByaWNlQWRqdXN0bWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFJlY2VpdmluZ0RhdGVDdXRvZmZEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RWaXNpdG9yQ29uc3VsdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlUaW1lRmlyc3REYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVMYXN0RGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VDb21tZW5jZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1FbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZVRlcm1TdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRFbXBsb3llckRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsQWN0aW9uQ2xvc2VkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25TdGFydGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFNldHRsZW1lbnRUZXJtc01ldERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RydWN0dXJlQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZGVyQ3JlZGl0Q2hlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQWdyZWVtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZMaWFiaWxpdHlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlbmV3YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ1JlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2VDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRlZG9uVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5QdXJjaGFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblNlcnZpY2luZ1RyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkV4Y2VwdGlvbk9yZGVyTnVtYmVyQXNzaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlckV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VzdEFjdGl2aXR5UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxSZWNlaXB0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlQ29tbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2Vnb29kQ29tbWVyY2lhbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRBdmFpbGFibGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlPclRhcmdldFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdFNoaXBOb3RpY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZNYXJyaWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGVhc2VBZ3JlZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXR1cml0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1DcmVkaXRHcmFudGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEFnZWluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvblNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFDb3ZlcmFnZUVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEFFbGlnaWJpbGl0eUJlZ2luRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5RW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QVRlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QkVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCVGVybWluYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZHBvaW50T2ZQZXJmb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlcXVpcmVkRGlzdHJpYnV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZEZXNwYXRjaFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoZWxmTGlmZVJlbWFpbmluZ0F0VGltZU9mUmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhFbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb29yaW5nRGF0ZUFuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlZU9mZmljaWFsU2lnbmF0dXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlUmVwb3J0ZWRDdXJ0YWlsbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlTm90ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlFYXJseUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5TGF0ZVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50SGVtb2dsb2Jpbk9ySGVtYXRvY3JpdE9yQm90aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJlbmV3YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRSZXZpc2lvbm9ySW5pdGlhbFZlcnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRTZXJ1bUNyZWF0aW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlZEZyb21Mb2NhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRFeHRlbnNpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0aW9uc1N0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Q3JlZGl0U2VydmljZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdvcnRoRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QW5uaXZlcnNhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm51YWxNZWV0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW5zdGFsbG1lbnREdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SW50ZXJlc3RDaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UGF5SW5jcmVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXltZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmV2aWV3RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uV29ya2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9kdWN0aW9uU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUHJvbWlzZUFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU2hpcHBpbmdTY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QWZ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEJlZm9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uT2ZEZWF0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uVGltZUxpbWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVnaXN0ZXJlZEFzT2ZHaXZlbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZUZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VycmVuY2VTcGFuRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5UbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZXJFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIaXJlU3VydmV5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSG9sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNpYWxSYWlsQ2FySW50ZXJjaGFuZ2VFaXRoZXJBY3R1YWxvckFncmVlZFVwb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZi1NYXJrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RnJvbUNvb3JkaW5hdGVkVW5pdmVyc2FsVGltZVV0YyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkZXN0VW5wYWlkSW5zdGFsbG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkJvYXJkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IaXJlU3VydmV5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ib2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mQ3VycmVudFN5bXB0b21zT3JJbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbnNldE9mU2ltaWxhclN5bXB0b21zT3JJbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zQ2Vhc2VkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BpbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0Vhcmx5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNMYXRlU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQW1lbmRtZW50QmluZGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29tcGxldGlvbkRhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlclJlY2VpdmVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyVG9Qcm9jZWVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxFYXJseVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVzdGltYXRlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxJc3N1ZUFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbGx5U2NoZWR1bGVkU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxNYXR1cml0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTmFtZUNoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUG9zdGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RSZW1haW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvZG9udGljVHJlYXRtZW50UGVyaW9kVG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1Qb2NrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVBdWRpdG9yc1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmhhdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnJpZGVEYXRlRm9yU2V0dGxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlclRhcmdldEJhc2VsaW5lTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuU2F0dXJhdGlvblRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlFdmFsdWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5RnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweVRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1N0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEluRnVsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yQWNjcnVlZFNpY2tQYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvck1pbmltdW1QYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLVRocm91Z2hEYXRlRm9yU2FsYXJ5Q29udGludWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGVGb3JUb3RhbFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JWYWNhdGlvblBheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC11cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJ3b3JrTWFpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsQW5udWl0aXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRUaW1lV29ya2luZ0NoYW5nZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXN0RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50Rmlyc3RWaXNpdEZvckNvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudENvbW1lbmNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREYXRlVGltZURlZmVycmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluaXRpYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RydWN0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRJc3N1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VmFsdWF0aW9uUHJlc2VudGF0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxEZWR1Y3Rpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFBlcmlvZEJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrQWN0aXZpdHlQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWVyUmV2aWV3T3JnYW5pemF0aW9uUFJPQXBwcm92ZWRTdGF5VG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuZGluZ0FyY2hpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNvbGF0aW9uVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQW5FdmVudElzTGF0ZUR1ZVRvQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEFzc2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RCZXR3ZWVuQ2hhbmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQ292ZXJlZEJ5U291cmNlRG9jdW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEV4dGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY0luc3BlY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVFbmREYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkNhcmVTdGFydERhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc0VuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mSWxsbmVzc1N0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT3ZlcmR1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFdvcmtlZEZvclRoZUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFRvQWRtaXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0Vhcmx5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljTGF0ZUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcENvbGxlY3Rpb25EYXRlVGltZU9mQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcERhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZVByZXZpb3VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRQZXJpb2RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQW5uaXZlcnNhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5CZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkRHVyYXRpb25PZldvcmtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkUmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbk9mVHJlYXRtZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGFydGljaXBhdGlvblN1c3BlbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QZXJpb2RFbGVjdGlvbkVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVnZ2VkQW5kQWJhbmRvbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZU9uT3JBZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckJlZm9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5U3VycmVuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU2V0dGxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zaXRpb25pbmdEYXRlVGltZU9mRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RtYXJrRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRW5kT2ZTZWNvbmRZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25GaXJzdFJlcG9ydENhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0U2VtaS1hbm51YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvblNlY29uZFNlbWktYW5udWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhcnJhbmdlZERlYWxNYXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF3YXJkU3VydmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjZWRpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jZXJ0aWZpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVBY2NlcHRhbmNlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZm9yZWNsb3N1cmVTYWxlQ2xvc2luZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lEdXJhdGlvbkFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhbmdlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVBhaWRUb0RhdGVFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkRpc3BlbnNpbmdEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25GaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Gcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Jc3N1ZURhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvblRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25EYXRlT2ZHb29kc0RlY2xhcmF0aW9uQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGF0aW9uVG9CYW5rcnVwdGN5UmVjZWl2ZXJzRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudENvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRlZFRvUmVjZWl2ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50TGVnYWxTdHJ1Y3R1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRseVJlc2lkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50bWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnROYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50UmVzaWRlbmNlU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Jvb2tpbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDb3VydEV2ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1cnJlbnRBY2NvdW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0ludm9pY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWREYXRlT2ZCaXJ0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseVJlc2lkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTWV0ZXJSZWFkaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNb250aEVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVwb3J0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Rlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50TGltaXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQmFzZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVByb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDYXJlUHJvdmlkZXJCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDb250cmFjdEFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0SXNzdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySG9zcGl0YWxpemF0aW9uRGF0ZXNSZWxhdGVkVG9DdXJyZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5jb3JyZWN0RGF0ZU9mQmlydGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmlsZWdlRGV0YWlsc1ZlcmlmaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdFbmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ1N0YXJ0RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RBdmFpbGFiaWxpdHlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0SGVsZFVudGlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25JbnNwZWN0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbk1hbnVmYWN0dXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpZmVzcGFuQXRUaW1lT2ZQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRDYWxlbmRhclllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1tZWRGaXNjYWxZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEFjdGlvbkVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEZvcmVjbG9zdXJlU2FsZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RPdmVyVGFyZ2V0QmFzZWxpbmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5QWZ0ZXJBbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlQcmlvclRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvckRlbGl2ZXJ5V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50QWZ0ZXJBbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRQcmlvcnRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNlZEZvclNoaXBtZW50V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25EYXRlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25FbmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uRmxvb3JTdG9ja1Byb3RlY3QtRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1TdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uSW52b2ljZVBlcmZvcm1hbmNlLVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25PcmRlci1FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25QZXJmb3JtYW5jZS1FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25SZXF1ZXN0ZWREZWxpdmVyeS1FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU2hpcC1TdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uU3RhcnREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QWNxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5QnVpbHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZVRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyU2lnbmF0dXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTGF0ZXN0UG9zc2libGVDaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1dEludG9TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5UmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVRvQmVSZWNlaXZlZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVPZkV4Y2hhbmdlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVQcmljZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFjaGVkVG90YWxEZXB0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVUYXhZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJ1aWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhcHR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmFibGVzQ29sbGVjdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVBdExvY2tib3hEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEluVGhlTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJBcHBvaW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc2hpcFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUmVzdWx0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFzc2lmaWNhdGlvbkV4aXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbXBsZXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1lbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtZXZhbHVhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlRXhwb3J0YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEl0ZW1DcmVhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVzYWxQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDb250cmFjdG9yTnVtYmVyQXNzaWdubWVudERhdGVPcmlnaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uRGF0ZU9mUHJldmlvdXNDdXN0b21zRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mQm9hcmRPZkRpcmVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVoaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWltYnVyc2VtZW50Q2xhaW1Jc3N1ZURhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlSW1wb3J0YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3RhdGVtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VBY2NvdW50aW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUNvdmVyYWdlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ3VycmVudEFjY291bnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUlzc3VlQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVBhaWRVcERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGF5bWVudEZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpc3N1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZU9mQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRSZXR1cm5Ub1dvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VkVG9WZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VGcmVxdWVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VPZkluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vZGVsaW5nQ29tcGxldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW5ld2FsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdXJ2ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpclR1cm5hcm91bmRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYXltZW50U2NoZWR1bGVTZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBseURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdDeWNsZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0U3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1YWxpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZENvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWREZXBhcnR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvckRlbGl2ZXJ5V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkRm9yQWZ0ZXJBbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRGb3JTaGlwbWVudFdlZWtPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkT2ZmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNldHRsZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZhdGlvbk9mRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50TGljZW5zZUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWduYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb2x2ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUmVsZWFzZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWVQYXJ0aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRyYW5zbWlzc2lvblRpbWVTdGFtcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZFRvQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblRvV29ya1BhcnRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRBZGp1c3RlZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzZWRFc3RpbWF0ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZva2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdBcnJpdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkRnVuZFRheEV4cGlyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeUNoYW5nZUVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGFyeURlZmVycmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlYWJsZVN0b2NrRGVtYW5kQ292ZXJQZXJpb2RFeHBlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVBdmFpbGFibGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVDb2xsZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZVJlcXVpcmVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW5jdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmYWN0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0aXNmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JBZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yRGVsaXZlcnlPbk9yQmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeVdlZWtPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkRm9yU2hpcG1lbnRQcmlvclRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFdlZWtPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkSW50ZXJjaGFuZ2VEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVkU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlUmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUmVmdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRBZG1pc3Npb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREaXNjaGFyZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVJhdGVBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0eVNoYXJlUHJpY2VBc09mR2l2ZW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZWN0aW9uUGVyaW9kU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsQnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzTG9jYWxUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pYW5udWFsRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kaW5nUm9hZFRpbWVTdGFtcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VwdGljQXBwcm92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXJTaWduYXR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXRvZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUFzU3BlY2lmaWVkQnlUaGVPcmlnaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZUZyb21JbnRlcmxpbmVTZXR0bGVtZW50U3lzdGVtT25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGVQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudFN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZMaWZlRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcERhdGVPcmlnaW5hbGx5U2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRHVyaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVByb21pc2VkRm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90TGF0ZXJUaGFuRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RCZWZvcmVEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBPbk9yQWJvdXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0RhdGVBbmRPclRpbWVDdXJyZW50U2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZU5vU2NoZWR1bGVFc3RhYmxpc2hlZEFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBXZWVrT2ZEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHV0SW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdEFnZUxpbWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWNrbmVzc0JlbmVmaXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzSW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzTGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZXRyYWNrZWRXZWxsYm9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbWlsYXJJbGxuZXNzT25zZXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVJbnRlcmVzdER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyaW5nU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0eUNsYWltc1ZlcmlmaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRCb29rUHVibGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGVEaXJlY3RvcnNoaXBSZWdpc3RyYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xpY2l0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZURvY3VtZW50Q2FwdHVyZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNpbmdPcmRlclVuaXRBc3NpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcmVkRGVwZW5kZW50RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2VSZXRpcmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVhcmxpZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTWFuZGF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RBZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTm90QmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWVQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydGVkRG9pbmdCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnROb0VhcmxpZXJUaGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vTGF0ZXJUaGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlUmVzaWRlbmN5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxUaW1lU2VyaWVzRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQXNzaWdubWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NoYW5nZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNDb21tZXJjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNPdXRzaWRlUHJvY2Vzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNQcmlvckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcERpc3RyaWJ1dGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BXb3JrQXNPZkdpdmVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50U2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yUGVyaW9kT2ZIaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50SW50ZXJlc3RQYXltZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50U3VibWlzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxJc3N1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQXZlcmFnZUNyZWRpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUNhc2luZ0F1dGhvcml0eUFwcHJvdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJnZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJyZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleVllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25FZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbnNpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3b3JuQW5kU3Vic2NyaWJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ltcHRvbXNPbnNldFBhdGllbnRBbGxlZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1TdXJ2ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhYmxlUmF0aW5nRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFpbENvdmVyYWdlRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rc0FjY2VwdGVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzSW5zcGVjdGVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2RTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBvaW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4WWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVByb3N0aGVzaXNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJTdWJtaXNzaW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25PZkZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0Rpc2NvdW50RHVlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc05ldER1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb21wbGV0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmZvcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFBlcmlvZEVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXNMaW5lVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZXJhcHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVFbXBsb3llZUJlZ2FuV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluVVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVMaW1pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU5vd0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXF1aXJlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hlbGZMaWZlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlU3R5bGVSZWdpc3RyYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0JlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ0VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb25DcmVhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyTm90ZUFjY2VwdGFuY2VEYXRlQW5kVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaGlwbWVudERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0VGltZUxpbWl0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3R1ZmZpbmdEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxCYWxhbmNlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFNldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU3RhcnREYXRlU2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkZWREYXRlQW5kVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGl0eVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRVbnRpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkRhdGVDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGVPZkluZGV4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJiYWxSZXBvcnROZWVkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25TZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsUmVnaXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXN0aW5nU2VydmljZUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW50YXJ5VGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdWNoZXJEYXRlT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VzRWFybmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZVBlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5RXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2Vla0VuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2hlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbExvZ1J1biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZUNvbnRyYWN0RXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbEFkdmlzZUFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3bkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhoZWxkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0VmZmVjdGl2ZVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtpbmdQZXJpb2RTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc0NvbXBsZXRpb25EYXRlVGltZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcnN0VGltZVRvQ2FsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckJlZ2lubmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckR1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhckVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhck9mT2NjdXJyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhclRvRGF0ZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJQYXJ0eSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQnV5ZXJQYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1eWVyVGF4SW5mb3JtYXRpb24iPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eVRheEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWxsZXJQYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlclRheEluZm9ybWF0aW9uIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHlUYXhJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwVG9QYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJpbGxUb1BhcnR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVtaXRUb1BhcnR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcEZyb21QYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IldhcmVob3VzZVBhcnR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU29sZFRvUGFydHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYW51ZmFjdHVyaW5nVG9QYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1hdGVyaWFsSXNzdWVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYXJ0eUNvZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlclBhcnR5IiB0eXBlPSJPcmRlclBhcnR5Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0eSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHlJRCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNREZCdXNpbmVzcyIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTmFtZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9yZGVyQ29udGFjdCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVjZWl2aW5nQ29udGFjdCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdDb250YWN0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPdGhlckNvbnRhY3RzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udGFjdCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3JyZXNwb25kZW5jZUxhbmd1YWdlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydHkiIHR5cGU9IlBhcnR5Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJZGVudGlmaWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJZGVudGlmaWVyIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJZGVudGlmaWVyIiB0eXBlPSJMaXN0T2ZJZGVudGlmaWVyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RJRCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbnRhY3RGdW5jdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkNvbnRhY3ROdW1iZXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHR5cGU9IkNvbnRhY3QiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWQiIHR5cGU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3RGdW5jdGlvbiIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbnRhY3RGdW5jdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRpbmdPZmZpY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ2NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGF5YWJsZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxJbnN1cmFuY2VJbmZvcm1hdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlQ29udHJhY3RpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZnRlci1Ib3Vyc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50U2NoZWR1bGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVudGlvbi1Ub1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRmluYW5jaWFsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE5lZ290aWF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0b21hdGVkQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsSW5xdWlyeUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkU3RhZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NVbml0TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJOYW1lb3JEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQURBbmRDQU1TcGVjaWFsaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaXJtYW5PZlRoZUJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9yZGVyQXBwcm92ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmRXhlY3V0aXZlT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZGaW5hbmNpYWxPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkluZm9ybWF0aW9uT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZPcGVyYXRpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5V29ya3NBdXRob3JpdHlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BcHByb3ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5naG91c2VDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya09mQ291cnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUJvcnJvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnZlc3RpZ2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVnZW9mRWR1Y2F0aW9uQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZU9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudEVuZ2luZWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wdXRlclN5c3RlbXNDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50RW1wbG95ZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRXaXRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlUHVyY2hhc2luZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QW5kU2NoZWR1bGVDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250YWN0R3JhbnRpbmdBcHBvaW50bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmVsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlJbnN0cnVjdGlvbnNDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JFbXBsb3llZVRvRXhlY3V0ZUV4cG9ydFByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlSW1wb3J0UHJvY2VkdXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yUGVyc29uUmVzcG9uc2libGVGb3JQcm9jZXNzaW5nUHVyY2hhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduRW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3J5QWR2ZXJ0aXNpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbkRpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbk1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVESUNvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25Db29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3RyaWNpdHlTdXBwbHlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQ29vcmRpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNTdWJtaXNzaW9uUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1NaWxpdGFyeVRyYWZmaWNNYW5hZ2VtZW50Q29tbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5Q29udGFjdC1TaGlwcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEYW5nZXJvdXNHb29kc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW5pbmdQcm9ncmFtc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlVmljZS1QcmVzaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQWlkT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc2luZ0xlbmRlckFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbE1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1N1cHBseUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpdmluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVCdXNpbmVzc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVFbmdpbmVlcmluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVGaW5lQXJ0c09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VpZGFuY2VDb3Vuc2Vsb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdEZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVW5pdE9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIdW1hblJlc291cmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ09mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50V29ya0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZHJlZ2lzdHJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3RmlybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF3U2Nob29sQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBdWRpdGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFB1cmNoYXNpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRpbmdEaXJlY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsSGFuZGxpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlU2VuZGVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN0YWZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlVmVuZG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdCdXNpbmVzc1Byb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0RldmVsb3BtZW50c0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeVB1YmxpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZpY2F0aW9uQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtZXJpY2FsQ29udHJvbEVuZ2luZWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdGFmZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckRlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBZHVsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnRvckd1YXJkaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nTGFib3JhdG9yeUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzQ2xhaW1PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlRXZhbHVhdGlvbkNvbW1pdHRlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQ29sbGVjdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZEZWxpdmVyeUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRPckVxdWlwbWVudENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRmb3JtTWFpbnRlbmFuY2VNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0RW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWF3YXJkU3VydmV5TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZmVycmVkUHJvdmlkZXJPcmdhbml6YXRpb25Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVRheHBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxTdHVkeUNvbnRhY3RvckF1dGhvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvYmF0aW9ub3JMZWdhbE9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYW5hZ2VtZW50Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbURpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdERpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90b3R5cGVDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1JlbGF0aW9uc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlU2VydmljZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2luZ0NvbnRyYWN0aW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUFzc3VyYW5jZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb29yZGluYXRvckNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlJbnNwZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVN1cnZleW9yQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlU3VwZXJ2aXNvck9yQ2xlcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eUtleUhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5T2NjdXBhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZU9yQ2hhcmdlYmFja0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0RvY2tDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbENvbXBhbnlBZG1pbmlzdHJhdGl2ZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEF1dGhvcml6ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydFByZXBhcmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbmRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckNvbXB1dGVyRGF0YVByb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uZm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBlcnNvbkZvckluZm9ybWF0aW9uUHJvZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3QW5kUmVwcmljaW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBZG1pbmlzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXByZXNlbnRhdGl2ZU9yRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xDbGVyayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZUaGVvbG9neUFkbWlzc2lvbnNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbG9mVmV0ZXJpbmFyeU1lZGljaW5lQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sUHJpbmNpcGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlUYXhwYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmRlcldyaXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VUZWNobmljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZXJ2aWNlc1dvcmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVIb3VzZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9ncmFtQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFmZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudGluQWJzZW50aWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWR5U3VibWl0dGVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtc0FkbWluaXN0cmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbERvY3VtZW50YXRpb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE1hcmtldGluZ1JlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxXcml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc05ldHdvcmtDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVBbnN3ZXJpbmdTZXJ2aWNlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJEZXZlbG9wZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZC1QYXJ0eUFkbWluaXN0cmF0b3JDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duUGxhbm5pbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZmZpY0F1dGhvcml0eUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRJbmZyYXN0cnVjdHVyZUF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVSZWNlaXZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJncmFkdWF0ZUFkbWlzc2lvbnNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlvblByZXNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmljZVByZXNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVyQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclN1cHBseUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcm9rZXJNYWludGVuYW5jZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaG9wQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NNYW5hZ2VtZW50Q29udGFjdCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdE51bWJlciIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdE51bWJlciIgdHlwZT0iTGlzdE9mQ29udGFjdE51bWJlciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdE51bWJlciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlZCIgdHlwZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhY3ROdW1iZXIiIHR5cGU9IkNvbnRhY3ROdW1iZXIiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdE51bWJlclR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXhOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9iaWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxleE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVQYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXV1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVJMT3RoZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRhY3QiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRhY3QiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRhY3QiIHR5cGU9Ikxpc3RPZkNvbnRhY3QiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5VGF4SW5mb3JtYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4SWRlbnRpZmllciI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVnaXN0ZXJlZE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZ2lzdGVyZWRPZmZpY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVGF4TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbXBhbnlSZWdpc3RyYXRpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5VGF4SW5mb3JtYXRpb24iIHR5cGU9IlBhcnR5VGF4SW5mb3JtYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhcnR5Q29kZWQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcnR5Q29kZWQiIHR5cGU9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Q29kZWQiPgorICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iUGFydHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eVJvbGVDb2RlZCIgdHlwZT0iUGFydHlSb2xlQ29kZSIvPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0eVJvbGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUNvZGVkIiB0eXBlPSJQYXJ0eUNvZGVkIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUcmFuc3BvcnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRyYW5zcG9ydCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHJhbnNwb3J0IiB0eXBlPSJMaXN0T2ZUcmFuc3BvcnQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0SUQiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNwb3J0TW9kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc3BvcnRNZWFucyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2Fycmllck5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcnJpZXJJRCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ3VzdFNoaXBwaW5nQ29udHJhY3ROdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlcnZpY2VMZXZlbENvZGVkIiB0eXBlPSJTZXJ2aWNlTGV2ZWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0luc3RydWN0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZWQiIHR5cGU9IlRyYW5zcG9ydExlZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zaXREaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydCIgdHlwZT0iVHJhbnNwb3J0Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRNb2RlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZWQiIHR5cGU9IlRyYW5zcG9ydE1vZGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TW9kZSIgdHlwZT0iVHJhbnNwb3J0TW9kZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRNb2RlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2hhcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJpZWdodEZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVGF4aSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcm1lZEZvcmNlc0NvdXJpZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNraGF1bCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RXYXktU2hpcHBlcnNPcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tQb3N0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FiT3JUYXhpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb25JcnJlZ3VsYXJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2t1cE9yQ3VzdG9tZXJzRXhwZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVhd2F5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZWF3YXlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhbk9yUGFjaWZpY0Rpc3RyaWJ1dGlvblN5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkVHJhbnNwb3J0SW5zdGFsbGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbHlhd2F5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljUmVjZWl2aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljUmVjZWl2aW5nT3JTaGlwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1NoaXBwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmxhbmRXYXRlclRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybW9kYWwtUGlnZ3liYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhblRyYWlsZXJMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dhaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcml0aW1lVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUludHJhdGhlYXRlckFpcmxpZnRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeU9mZmljaWFsTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZVVua25vd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1CdWxrQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItQ29tbW9uQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItRmxhdGJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItUGFja2FnZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLVZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXV0aW1vZGFsVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Db25mZXJlbmNlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5Ob24tQ29uZmVyZW5jZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmNlbFBvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFBpZ2d5YmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkUmFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xUb1Bvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlUGFyY2VsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVpY2t0cmFucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhT3JBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFnZW50LVRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrVHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWFtc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93YXdheVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJPclBpcGVsaW5lSW50ZXJtb2RhbE1vdmVtZW50Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRNZWFucyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlZCIgdHlwZT0iVHJhbnNwb3J0TWVhbnNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1lYW5zIiB0eXBlPSJUcmFuc3BvcnRNZWFucyIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRNZWFuc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SUxDb250YWluZXItQ2xvc2VkVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMEZ0SUxDb250YWluZXItT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDBGdElMQ29udGFpbmVyLU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJTENvbnRhaW5lci1DbG9zZWRUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGcmVpZ2h0LUJyZWFrQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyUmlkZVZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlQ2hlbWljYWxUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseUVuY2xvc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5T3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1Ob1Jvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvZ2llIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhckN1c2hpb25VbmRlckZyYW1lT0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1EYW1hZ2VGcmVlRXF1aXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnRlcmlvckJ1bGtoZWFkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa3RydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRCdWxrVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZFRhbmtUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJvb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhckNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQW5kUGFzc2VuZ2VyVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJXaXRoQ2FyYXZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VtZW50VmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzLUdvb3NlbmVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXItQ29udHJvbGxlZFRlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYWxWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXN0ZXJDaGVtaWNhbFRhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbC1DYXJDb3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsQ2FyT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQWx1bWludW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1CdWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQ2xvc2VkVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IaWdoU2lkZU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Mb3dTaWRlT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT25seVZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW4tU2lkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuVG9wLUxlbmd0aFVuc3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItUGxhdGZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcnJlc3RpbmdvbmFDaGFzc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItU3RlZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0NoZW1pY2FscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtGb29kR3JhZGUtTGlxdWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFua0dhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVVwZ3JhZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVmVudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoQmFnSGFuZ2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEZsb29yU2VjdXJpbmdSaW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEZsdXNoRG9vcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhIYW5nYXJCYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoU21vb3RoU2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhXYXZ5T3JSaXBwbGVTaWRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFRlbXBlcmF0dXJlVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRCYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3J1ZGVPaWxUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRGV0ZXJtaW5lZERlYW5zT2ZUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUmFpbFRhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0LUluSGVscGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWVwU2VhQ2hlbWljYWxUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1Ecm9wVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEJhY2tUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlCdWxrQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb2ZUcmFpbkRldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXB0aW9uYWxUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlcnJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXNoaW5nVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrRG91YmxlRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUmFjay1GbGF0QmVkVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRSYWNrLVNpbmdsZURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0YmVkU2xpZGluZ1RhbmRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyLVJlbW92YWJsZVNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcndpdGhIZWFkYm9hcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcndpdGhOb0hlYWRib2FyZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXItRW5kQnVsa2hlYWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Y2FyV2l0aFBlZGVzdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWV6ZXJUcnVja0FuZElzb3RoZXJtaWNUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRSZWZyaWdlcmF0ZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5Gb29kVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybml0dXJlVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENhcmdvVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmF0b3JTZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItQ292ZXJlZEludGVyaW9yQnVsa2hlYWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDb3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpbmNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXZlbFZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZkhlaWdodEZsYXRSYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkLUVuZEhlbHBlclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRvZlRyYWluRGV2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ3ViZVZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkUG5ldW1hdGljRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmFudENhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkbGVyQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNUcnVja0FuZEZyZWV6ZXJUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY3RydWNrYW5kcmVmcmlnZXJhdGVkdHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1ZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWVmaWVkTmF0dXJhbEdhc0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVlZmllZFBldHJvbGV1bUdhc0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPclVubG9hZERldmljZU9uRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsUHJvZHVjdHNUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW4tVG9wT3JGbGF0QmVkVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblRvcFZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRyb2xWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stVXBUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyUGFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGVkVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEJ1bGtDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxFeHByZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZE1haW50ZW5hbmNlT2ZXYXlDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxTaWxvVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyLUVuZEhlbHBlclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRGcmVlemVyVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2tBbmRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZVNpZGVUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFsVHJ1Y2tBbmRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2lkVHJ1Y2tXaXRoVGFua0FuZEJ1bGtUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmtBbmRUYW5rVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZFNpbG9UYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxPbi1Sb2xsT2ZmVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckRldGVybWluZWRNZWFuc09mVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUtRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVEFLLVJBSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlZWxQcm9kdWN0c1Zlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyMjVUb25uZVdpdGg5MEN1YmljTWV0ZXJUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kUmVtb3ZhbFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRFeHRlbmRhYmxlVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZEdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kUmVtb3ZhbFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZhbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4aSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXNjb3BpbmdUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1iZXJPckxvZ0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcEFydGljdWxhdGVkVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcHRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Cb2F0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1EcnlGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUVsZWN0cmljSGVhdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLU5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1QbmV1bWF0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUmVmcmlnZXJhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstQ2hlbWljYWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstRm9vZEdyYWRlTGlxdWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstR2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmluZ1Zlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoMjBPck1vcmVXYWdvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aE1vcmVUaGFuT25lQW5kTGVzc1RoYW4yMFdhZ29ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5XaXRoT25lV2Fnb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhcjIwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtRnVsbHlFbmNsb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoRG9vcnNOb1Jvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tBbmRUcmFpbGVyV2l0aE9wZW5pbmdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcEhpZ2hTaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wTG93U2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tPclRyYWlsZXJXaXRoVGlsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWdhbmRPclB1c2hib2F0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW4tU3BlY2lhbEluc2lkZUxlbmd0aFdpZHRoT3JIZWlnaHRSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1MYWtlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Db250YWluZXJzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tTGFzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLVJvbGxPbi1Sb2xsT2ZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kY2hpcGNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtWZXNzZWwiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VydmljZUxldmVsQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtDb21tb2RpdHlUcmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVlRGF5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOUFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRWNvbm9teSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZUJpbGxpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyRXhwcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZWROZXh0RGF5QnlDYXJ0YWdlQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkU2Vjb25kRGF5QnlDYXJ0YWdlQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkVGhpcmREYXlCeUNhcnRhZ2VBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25maXJtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmVkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25maXJtYXRpb25SZXR1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvb3JTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGlmaWNhdGlvbk9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeVdpdGhTaWduYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2VQbHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ0dyb3VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZVdvcmxkd2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2VXb3JsZHdpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERheUFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEZsaWdodE91dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERheUh1bmRyZWRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRNb3JuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTZXJ2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJuaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5MTAzMEFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eU1haWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTkzMEFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eU1haWxJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5Tm9vbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9Cb3haaXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5Qnk1MDBQTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhU2Vjb25kRGF5QnlOb29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5SW50ZXJtb2RhbEhpZ2hTcGVlZDcwTWlsZXNQZXJIb3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckludGVybW9kYWxBbmRTdGFja1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYwTWlsZXNQZXJIb3VyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdXNUcmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RyYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdXRlclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRSZXR1cm5TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXlBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkR3JvdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmREYXlIdW5kcmVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VuZEh1bmRyZWRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE1vcm5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHByZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU3BlZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFNwZWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0U2VydmljZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdFRoZVN0YXRpc3RpY2FsVGVycml0b3J5TGltaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1DYXJyaWFnZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRCb3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0RGVwYXJ0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRm91cnRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZpZnRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVNpeHRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVNldmVudGhDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRWlnaHRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZpcnN0Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpQ2FycmlhZ2UtU2Vjb25kQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVRoaXJkQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJ3YXlUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q2FycmllckFsbFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUHJlLUNhcnJpYWdlVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQWNjZXB0YW5jZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kT24tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1OaW50aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uLUNhcnJpYWdlVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVGVudGhDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtRWxldmVudGhDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtVHdlbGZ0aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFzdENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJuZENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNyZENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjR0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjV0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjZ0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijd0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijh0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijl0aENhcnJpZXJBZnRlck9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1JvdXRpbmdPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5EZWxpdmVyeUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxhZ2VSaWdodHNDYXJyaWVyQW5kSnVuY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblN3aXRjaENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxhZ2VNb3ZlbWVudENhcnJpZXJBbmRKdW5jdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllckFpck1vdG9yT3JPY2VhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luQ2FycmllclJ1bGUxMVNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc1JvdXRpbmdPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVTd2l0Y2hDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0Q2FycmllckluUm91dGVPblJldHVyblJvdXRlTW92ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuY3Rpb25TZXR0bGVtZW50Q2FycmllckZvbGxvd2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuY3Rpb25TZXR0bGVtZW50Q2FycmllclByZWRlY2Vzc29yIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRyYW5zcG9ydEVxdWlwbWVudCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50IiB0eXBlPSJMaXN0T2ZUcmFuc3BvcnRFcXVpcG1lbnQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydEVxdWlwbWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGVkIiB0eXBlPSJFcXVpcG1lbnRQcm92aWRlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlZCIgdHlwZT0iRXF1aXBtZW50T3duZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFcXVpcG1lbnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlZCIgdHlwZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcGVtZW50U2l6ZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRTdGF0dXNDb2RlZCIgdHlwZT0iRXF1aXBtZW50U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVsbEluZGljYXRvckNvZGVkIiB0eXBlPSJGdWxsSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVsbEluZGljYXRvckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29uZGl0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTZWFsSW5mbyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mRXF1aXBtZW50TWVhc3VyZW1lbnRzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydEVxdWlwbWVudCIgdHlwZT0iVHJhbnNwb3J0RXF1aXBtZW50Ii8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFByb3ZpZGVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJTdXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllclN1cHBsaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3JTdXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjb25zb2xpZGF0b3JTdXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVN1cHBsaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJTdXBwbGllZEZyb21BTGVhc2luZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlclN1cHBsaWVkRnJvbVRoZVJhaWx3YXlzUG9vbCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRPd25lckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RDdXN0b21lck93bmVkT3JMZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlck93bmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck93bmVkT3JMZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBMZWFzZWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50U2l6ZVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElsQ29udGFpbmVyLUNsb3NlZFRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElsQ29udGFpbmVyLU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJbENvbnRhaW5lci1DbG9zZWRUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJbENvbnRhaW5lci1PcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodC1CcmVha0J1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlFbmNsb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkV2l0aFJvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvZ2llIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhckN1c2hpb25VbmRlckZyYW1lT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1EYW1hZ2VGcmVlRXF1aXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveGNhci1JbnRlcmlvckJ1bGtoZWFkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94UGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJvb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzLUdvb3NlbmVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRDb250YWluZXItQ29udHJvbGxlZFRlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWwtQ2FyQ292ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbENhck9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUFsdW1pbnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNsb3NlZFRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGlnaFNpZGVPcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzIwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWMzMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljNDBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTG93U2lkZU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuLVNpZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3BlblRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVBsYXRmb3JtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJSZXN0aW5nT25BQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVN0ZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstQ2hlbWljYWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1Gb29kR3JhZGUtTGlxdWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuay1HYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1VcGdyYWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVZlbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEJhZ0hhbmdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhGbG9vclNlY3VyaW5nUmluZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhGbHVzaERvb3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoSGFuZ2FyQmFycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFNtb290aFNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoV2F2eU9yUmlwcGxlU2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRUZW1wZXJhdHVyZVRyYWlsZXItUmVlZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZEJhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQtSW5IZWxwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVDb2F0ZWRUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BCYWNrVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbFRyYWlsZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZlRyYWluRGV2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcG94eUNvYXRlZFRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cm9QYWxsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlYWJsZVBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1Eb3VibGVEcm9wVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFjay1GbGF0LUJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stU2luZ2xlLURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0YmVkU2xpZGluZ1RhbmRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyLVJlbW92YWJsZVNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcldpdGhIZWFkYm9hcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlcldpdGhOb0hlYWRib2FyZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDYXItRW5kQnVsa2hlYWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Y2FyV2l0aFBlZGVzdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5Gb29kVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLUNvdmVyZWQtSW50ZXJpb3JCdWxraGVhZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDYXItT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNvdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZIZWlnaHRGbGF0UmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZC1FbmRIZWxwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZUcmFpbkRldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEN1YmVWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZC1QbmV1bWF0aWNEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1PcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYW50LUNhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkbGVyQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTU8zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkT3JVbmxvYWREZXZpY2VPbkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjEwLjkwTUFuZDEzLjc1TSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjYuMTVNQW5kNy44Mk0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW43LjgyTUFuZDkuMTVNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuOS4xNU1BbmQxMC45ME0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUxlc3NUaGFuNi4xNU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbndvcmtpbmdSZWVmZXJDb250YWluZXIyMEZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb253b3JraW5nUmVlZmVyQ29udGFpbmVyNDBGdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uV29ya2luZ1JlZnJpZ2VyYXRlZE9yUmVlZmVyQ29udGFpbmVyMzBGdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5WZXNzZWwtQnJlYWtCdWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLVRvcE9yRmxhdGJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ub3BWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2stVXBUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJQYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc3VyaXplZFRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkTWFpbnRlbmFuY2VPZldheUNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhci1FbmRIZWxwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZE9yUmVlZmVyQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rMjBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rMzBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rNDBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rSWMyMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRhbmtJYzQwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlU2lkZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZGRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbmRpbmF2aWFuUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW1pLVJlZnJpZ2VyYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaS1UcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUtRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNrQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFpbmxlc3NTdGVlbFRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWstUmFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyMjBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyMzBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVyNDBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWMyMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzMwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljNDBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlc2NvcGluZ1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjIwRnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjMwRnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENvbnRhaW5lcjQwRnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGViaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQm9hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1DYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRHJ5RnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1FbGVjdHJpY0hlYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Ob3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUG5ldW1hdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVJlZnJpZ2VyYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUNoZW1pY2FscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUZvb2RHcmFkZS1MaXF1aWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1HYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhcjIwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtRnVsbHlFbmNsb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoRG9vcnMtTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcEhpZ2hTaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjay1PcGVuVG9wTG93U2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TG9hZERldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuLVNwZWNpYWxJbnNpZGVMZW5ndGgtV2lkdGhPckhlaWdodFJlcXVpcmVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLUxha2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2VhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUNvbnRhaW5lcnNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1MYXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tUm9sbG9uLVJvbGxvZmYiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluT25Cb2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydGxhbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmxhbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxvYWRlciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJGdWxsSW5kaWNhdG9yQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25kaXRpb25zIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZnJpZ2VyYXRpb25PbiIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlc2lkdWUiIHR5cGU9InhjYmxCb29sZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZDb25kaXRpb25zIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbmRpdGlvbnMiIHR5cGU9IkNvbmRpdGlvbnMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRpbWVuc2lvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGltZW5zaW9uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEaW1lbnNpb24iIHR5cGU9Ikxpc3RPZkRpbWVuc2lvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGltZW5zaW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGltZW5zaW9uQ29kZWQiIHR5cGU9IkRpbWVuc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpbWVuc2lvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkRpbWVuc2lvbiIgdHlwZT0iRGltZW5zaW9uIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudFZhbHVlIi8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnRSYW5nZSIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50IiB0eXBlPSJNZWFzdXJlbWVudCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnRWYWx1ZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnRWYWx1ZSIgdHlwZT0iTWVhc3VyZW1lbnRWYWx1ZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1YWxUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JlYXRlclRoYW5PckVxdWFsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJUaGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5PckVxdWFsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEVxdWFsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVlVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmVkVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mUmFuZ2UiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29uZGl0aW9uc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUFpckVxdWFsczEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlQnV0eWxBY2V0YXRlRXF1YWxzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVIMk9FcXVhbHMxT3JXYXRlckVxdWFsczEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZFRvNjBEZWdyZWVzRmFocmVuaGVpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVUb2x1ZW5lRXF1YWxzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFwb3JJbkFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFwb3JJbk90aGVyVGhhbkFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUZW1wZXJhdHVyZUFuZFByZXNzdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25zT3RoZXJUaGFuU3RhbmRhcmRUZW1wZXJhdHVyZUFuZFByZXNzdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkV0aHlsQWxjb2hvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5FdGh5bEV0aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbldhdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdDFBdG1vc3BoZXJlUHJlc3N1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlRXRoZXJFcXVhbHMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRpY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyLURyaWVkQmFzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzLVJlY2VpdmVkQmFzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpbGlicml1bUJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZUFuZEFzaC1GcmVlQmFzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94aWRpemluZ0F0bW9zcGhlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjaW5nQXRtb3NwaGVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRjaGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmF0ZWRWYXBvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb25kaXRpb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnQtVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZS1XZWlnaHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvcnJlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckdhbGxvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkb21pbmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVPd25lZE9yQ29ycG9yYXRlT3duZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkZWRPckJsb2NrZWRVcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RXaGVuU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNSZXBhaXJlZE9ySW1wcm92ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbnRhbmVvdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9Hb29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb0hpZ2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvTWVkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb01vZGVyYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bVRvR29vZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtVG9IaWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb0dvb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9IaWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvTWVkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kVG9IaWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3JlYXNpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGluaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90ZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFzdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyT24tUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyTWlkLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck9mZi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJTdXBlck9uLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lclN1cGVyT2ZmLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck9uLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck1pZC1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJPZmYtUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyU3VwZXJPbi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJTdXBlck9mZi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJEYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck5pZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJEYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlck5pZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay0yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdWxkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblRpbWVSZWxhdGVkRGVtYW5kIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZWFzdXJlbWVudFJhbmdlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1pbmltdW1WYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWF4aW11bVZhbHVlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudFJhbmdlIiB0eXBlPSJNZWFzdXJlbWVudFJhbmdlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaW5pbXVtVmFsdWUiPgorICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1pbmltdW1WYWx1ZSIgdHlwZT0iTWluaW11bVZhbHVlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNYXhpbXVtVmFsdWUiPgorICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1heGltdW1WYWx1ZSIgdHlwZT0iTWF4aW11bVZhbHVlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbml0T2ZNZWFzdXJlbWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVU9NQ29kZWQiIHR5cGU9IlVPTUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVPTUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRPZk1lYXN1cmVtZW50IiB0eXBlPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJVT01Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMVgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMloiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjROIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0UiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1UCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkhQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkxMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJRTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlVJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDREwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0tHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09VIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1RNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1dBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDV0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRExUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRXVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkYxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHR1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR08iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHV0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkgyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhCWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFRaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5IIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9VIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IksyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iks2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0haIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUEgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1NIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktVUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFBBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik03Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUNVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUxEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVBBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1TSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1USyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5CQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5KIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk1JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5STCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5WIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPSE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTloiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1pJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUFOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVREIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ROIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRRRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlU1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQ0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1RUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllESyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWURRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IloyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpQIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRpbWVuc2lvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXROZXRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOZXRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Hcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0TmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzUGVyUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYXRDb250ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzVG9ubmFnZU9mVGhlVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRUb25uYWdlT2ZUaGVWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh1bWlkaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x0YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlckNvbnN1bXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0RGlzc2lwYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZsb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob2NrSW1wYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpdmVUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uT3BlcmF0aXZlVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQ29udGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuc2lsZVN0cmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicm9zaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZUxlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaXVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaWdodG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRPZkNvbnZleWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VTdW1tZXJEZWFkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJpemVkQ2FyZ29PblZlc3NlbHNXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db250YWluZXJpemVkQ2FyZ29PblZlc3NlbHNXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEFzY2VydGFpbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxPdmVyYWxsTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nTWV0ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkF4bGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlsb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVMZW5ndGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVMZW5ndGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZVdpZHRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlV2lkdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UG9zaXRpb25JblRoZVRoaWNrbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZVRoaWNrbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFpbmVyQWN0dWFsRmlsbGluZ1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udGFpbmVyTWF4aW11bUNhcGFjaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZE5ldFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0hlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tpbmdIZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZWRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlcnJpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcHVyaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFpblNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbnRoYW5pZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGFzdGljaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYWxsaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJvbnRpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0b3JhZ2VMaW1pdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZUluZGV4T2ZUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZERyYWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZnRlckRyYWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUcmFuc3BvcnRFcXVpcG1lbnRHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNpZGl0eU9mSnVpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmV0cm9tZXRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVpY2VXZWlnaHRQZXIxMDBHcmFtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJ1aXRTa2luQ29sb3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmdsZU9mQmVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRJbmNyZW1lbnRhbE1lYXN1cmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDEwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXJvZmVsRDUwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RhY2tpbmdXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTWVhc3VyZUN1YmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VGYXRDb250ZW50SW5EcnlNYXR0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhY2NoYXJvbWV0cmljQ29udGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmF0ZUNvbnRlbnRPZkFuQWxjb2hvbGljUHJvZHVjdEFmdGVyQm90dGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaHlkcm91c0NvbnRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ0xvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRpbnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWx2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVXYXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFuZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlR3Jhdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtR3Jvc3NPYnNlcnZlZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtR3Jvc3NTdGFuZGFyZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bU5ldFN0YW5kYXJkVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbE9uLUJvYXJkUXVhbnRpdHktQWZ0ZXJEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRvdGFsQ2FsY3VsYXRlZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtVG90YWxPYnNlcnZlZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5uYWdlR2F1Z2VEaXN0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTmV0U3RhbmRhcmRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZGltZW50QW5kV2F0ZXJJblBldHJvbGV1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzZXJ2ZWRSZWZlcmVuY2VIZWlnaHQtVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlSGVpZ2h0LVRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsbGFnZUdhdWdlRGlzdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaW1Db3JyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3dUb0JyaWRnZURpc3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmlnaHRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFrZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ1N0cmVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha2luZ1N0cmVuZ3RoV2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvdXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlbnRzT2ZQYWNrYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbldlaWdodEFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhbWV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbHRhVmFsdWVMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5zaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXB0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0YW5jZUJldHdlZW5Qb2ludHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLUJveGNhckRvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZE5ld1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxvbmdhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpdFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsYW1lbnRDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZ2l0dWRpbmFsRmxhdG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3ZlcnNlRmxhdG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXVnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQtTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyZG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlaWdodC1NYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHREaW1lbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFjdEVuZXJneSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGlhbWV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGgtTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsTmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlRGlhbWV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZVN0cmV0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbm5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZUh1bWlkaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpc3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9ja3dlbGxDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFtV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y3Rpb25PZkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bi1Qcm9jZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpY2tuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRQZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQtVmFuRG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGgtVmFuRG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdE9mQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkdGhEaW1lbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLU1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdE9mTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRlSGVpZ2h0LUZsYXRCZWRXaXRoUmVtb3ZhYmxlU2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcXVhcmVuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbFNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllpZWxkU3RyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW5pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyc2VuaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcm9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXNtdXRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGNpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbHVtYml1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VyaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGxvcmluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29iYWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaHJvbWl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29wcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uUGx1c1NpbGljb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlcm1hbml1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcm9nZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGFzc2l1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmVzaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5nYW5lc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbHliZGVudW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pdHJvZ2VuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2RpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pb2JpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pY2tlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9zcGhvcnVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWxwaHVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpbW9ueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZW5pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGljb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGljaXVtT3h5ZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW50YWxpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGx1cml1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0YW5pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbmFkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdW5nc3RlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVDb250ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaaW5jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaaXJjb25pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0VGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvT3BlcmF0aW5nVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtZXJnZW5jeVRlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb250cm9sVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNlYWxJbmZvIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTZWFsSW5mbyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2VhbEluZm8iIHR5cGU9Ikxpc3RPZlNlYWxJbmZvIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsSW5mbyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbE51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTZWFsSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbEluZm8iIHR5cGU9IlNlYWxJbmZvIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWFsSXNzdWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWFsSXNzdWVyQ29kZWQiIHR5cGU9IlNlYWxJc3N1ZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsSXNzdWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbElzc3VlciIgdHlwZT0iU2VhbElzc3VlciIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZWFsSXNzdWVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5rbm93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcmFudGluZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxPcGVyYXRvciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNDb2RlZCIgdHlwZT0iU2VhbFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlYWxTdGF0dXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIiB0eXBlPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VhbFN0YXR1c0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluUmlnaHRDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVFbGVjdHJvbmljU2VhbElzRmF1bHR5Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZWQiIHR5cGU9IlRyYW5zaXREaXJlY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlZCIgdHlwZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNpdERpcmVjdGlvbiIgdHlwZT0iVHJhbnNpdERpcmVjdGlvbiIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc2l0RGlyZWN0aW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyVG9TZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvQnV5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JUb1NlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9Ecm9wU2hpcERlc2lnbmF0ZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9GcmVpZ2h0Rm9yd2FyZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb1N1YmNvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdGhlclZlc3NlbFRvTGlnaHRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlnaHRlclRvTW90aGVyVmVzc2VsIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhckRheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyV2Vla3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZUhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNURheVdvcmtXZWVrIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtc09mRGVsaXZlcnkiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZWQiIHR5cGU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RnVuY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRUZXJtc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydFRlcm1zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZWQiIHR5cGU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRNZXRob2RPZlBheW1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXJtc09mRGVsaXZlcnlEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NDb2RlZCIgdHlwZT0iUmlza09mTG9zc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tPZkxvc3NDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRlcm1zT2ZEZWxpdmVyeSIgdHlwZT0iVGVybXNPZkRlbGl2ZXJ5Ii8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaENvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VhbmREZXNwYXRjaENvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGVkQnlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNvbmRpdGlvbiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeC1Xb3JrcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZS1DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlQWxvbmdzaWRlU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZU9uQm9hcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbmRGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0LUluc3VyYW5jZUFuZEZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpYWdlUGFpZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWFnZS1JbnN1cmFuY2VQYWlkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEF0RnJvbnRpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEV4LVNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZEV4LVF1YXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZER1dHlVbnBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZER1dHlQYWlkIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VDb2xsZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlUHJlcGFpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE9uRGVsaXZlcnlTZXJ2aWNlQ2hhcmdlUGFpZEJ5Q29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoT25EZWxpdmVyeVNlcnZpY2VDaGFyZ2VQYWlkQnlDb25zaWdub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RGcmVpZ2h0Q3JlZGl0ZWRUb1BheW1lbnRDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUGljay1VcE9yQmFja2hhdWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmluZWRCeUJ1eWVyQW5kU2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2JQb3J0T2ZDYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmUHJlcGFpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Db3B5LU5vUGF5bWVudER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ29zdHNQYWlkQnlDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvc3RzUGFpZEJ5Q29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmV2ZW51ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5U3VwcGxpZXJPclNlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5YWJsZUVsc2V3aGVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEFuZFN1bW1hcnlCaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQnV0Q2hhcmdlZFRvQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRCeVByb2Nlc3NvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZC1CeVNlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZExvY2FsQ29sbGVjdE91dHN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkT25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodEZyZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRQYWlkQnlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29udGFpbmVyRnJlaWdodFBhaWRCeVN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdWxlMTFTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZyZWlnaHQtTm9DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodENvbmRpdGlvbiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJSaXNrT2ZMb3NzQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0Rlc3RpbmF0aW9uSXNCdXllcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb0ZyZWlnaHRFcXVhbGl6YXRpb25Qb2ludElzU2VsbGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvUG9vbFBvaW50SXNTZWxsZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9EZXN0aW5hdGlvbklzU2VsbGVycyIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHJpY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlByaWNlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQcmljZSIgdHlwZT0iTGlzdE9mUHJpY2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2luZ1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VCYXNpc1F1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FsY3VsYXRlZFByaWNlQmFzaXNRdWFudGl0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VRdWFudGl0eVJhbmdlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljZU11bHRpcGxpZXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlIiB0eXBlPSJQcmljZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2luZ1R5cGUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlVHlwZUNvZGVkIiB0eXBlPSJQcmljZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljaW5nVHlwZSIgdHlwZT0iUHJpY2luZ1R5cGUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUHJpY2VUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvblByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VEZXBlbmRlbnRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJc1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbk5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25Hcm9zcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4SW5jbHVkZWRBbGxvd2FuY2VzQW5kQ2hhcmdlc05vdEluY2x1ZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VTZWxsaW5nUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VUYXhJbmNsdWRlZEV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2VFeGNsdWRpbmdBbGxvd2FuY2VzT3JDaGFyZ2VzQW5kVGF4ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aXZlVW5pdFByaWNlQ29tcG9uZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlR2VuZXJpY1Byb2R1Y3RQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJuYXRlUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VXaG9sZXNhbGVQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsY3VsYXRpb25QcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ1ByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsRGlzdHJpYnV0aW9uRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREb21lc3RpY1ZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkVW5pdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZEN1c3RvbXNVbml0VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlckFkanVzdGVkUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yc1ByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudEFtb3VudEFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFN0b3JlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXBQcm9ncmFtUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVjc2NQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlT3JpZ2luYWxFcXVpcG1lbnRNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURpcmVjdFNoaXBQcmljZVdhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkVW5pdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVudERlbGl2ZXJ5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEV4Y2lzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxVcHBlckxpbWl0UHJpY2VNYXhpbXVtQWxsb3dhYmxlQ29zdFByaWNpbmdGb3JEcnVncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybVByaWNlRG9Ob3RBZHZpc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlVGhyb3VnaFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyaWFsUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uYWxQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUJpbGxpbmdQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnlUb0FkdmlzZVVuaXRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUFjdGl2aXR5U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJRdWFudGl0eVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1QcmljZVJlZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1N1Z2dlc3RlZFJldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVJlbGVhc2VRdWFudGl0eVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRJdGVtUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxUb0FkdmlzZVVuaXRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByaWNlQmVnaW5uaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtQdXJjaGFzZU9yZGVyQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQ2F0YWxvZ3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJFYWNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUluRWZmZWN0QXRUaW1lT2ZTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyS2lsb2dyYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckxpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkRnJlaWdodENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcnNQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyVG9ubmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZERlYWxlck5ldFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdnZXN0ZWRGbGVldFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQW5kRGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZExpc3RQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQcmljZUZhY3RvcnNFcXVhbGl6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFJldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZMaW5lSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZFdob2xlc2FsZVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb0JlTmVnb3RpYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlZFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0Q29zdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmVQcmljZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVW5pdFByaWNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2VWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgdHlwZT0iVW5pdFByaWNlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eVZhbHVlIi8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlSYW5nZSIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5IiB0eXBlPSJRdWFudGl0eSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlWYWx1ZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlWYWx1ZSIgdHlwZT0iUXVhbnRpdHlWYWx1ZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlSYW5nZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNaW5pbXVtVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1heGltdW1WYWx1ZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlSYW5nZSIgdHlwZT0iUXVhbnRpdHlSYW5nZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2VNdWx0aXBsaWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZCIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJpY2VNdWx0aXBsaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik11bHRpcGxpZXIiIHR5cGU9InhzZDpkZWNpbWFsIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljZU11bHRpcGxpZXIiIHR5cGU9IlByaWNlTXVsdGlwbGllciIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItT3JpZ2luYWxDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1SZXRhaWxDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudE11bHRpcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVdob2xlc2FsZUNvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRTb2x1dGlvbk11bHRpcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdNdWx0aXBsaWVyIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXltZW50SW5zdHJ1Y3Rpb25zIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYXltZW50VGVybXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYXltZW50TWV0aG9kIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50SW5zdHJ1Y3Rpb25zIiB0eXBlPSJQYXltZW50SW5zdHJ1Y3Rpb25zIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXltZW50VGVybXMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBheW1lbnRUZXJtIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJEaXNjb3VudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRUZXJtc05vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRUZXJtcyIgdHlwZT0iUGF5bWVudFRlcm1zIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXltZW50VGVybSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGF5bWVudFRlcm1Db2RlZCIgdHlwZT0iUGF5bWVudFRlcm1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50VGVybUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRUZXJtVmFsdWUiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRUZXJtRGV0YWlscyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkRpc2NvdW50cyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXltZW50VGVybSIgdHlwZT0iUGF5bWVudFRlcm0iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGF5bWVudFRlcm1Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTBEYXlzQWZ0ZXJFbmRPZk1vbnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZWRQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5QWNjZXB0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlEZWZlcnJlZFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5TmVnb3RpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZUJ5TmVnb3RpYXRpb25CeU5hbWVkQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlOZWdvdGlhdGlvbldpdGhBbnlCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVCeU5lZ290aWF0aW9uV2l0aEFueUJhbmtpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlQnlTaWdodFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljQ29tbWlzc2lvblRlcm1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0Rpc2NvdW50T2ZmZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mRXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxUb0JpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbk9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hBZ2FpbnN0RG9jdW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoQnlTdGF0ZUxhdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaERpc2NvdW50VGVybXNBcHBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaG9uQWR2YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaG9uQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE9uRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQZXJWZW5kb3JSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoV2l0aE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCYXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvbnRyb2xsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGluZ0dpdmVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZE9ySW5zdGFsbG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRSZXF1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50Tm90QXBwbGljYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnRXaXRoQWR2YW5jZVBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50V2l0aFByb21wdFBheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzQWdhaW5zdEFjY2VwdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50c0FnYWluc3RQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhc3RQYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWREYXRlTGF0ZVBheW1lbnRQZW5hbHR5QXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHNBcmVEdWVBbm51YWxseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50c0FyZUR1ZU1vbnRobHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHNBcmVEdWVRdWFydGVybHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50UGF5bWVudHNBcmVEdWVTZW1pQW5udWFsbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQ29tcGFueUFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklycmV2b2NhYmxlTGV0dGVyT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0QXRTaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1bXBTdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRNb250aEZvbGxvd2luZ0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25TdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90WWV0RGVmaW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEFnYWluc3RTdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxBZHZhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QnlJbnN0YWxtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QnlpbnN0YWxtZW50c0FjY29yZGluZ1RvUHJvZ3Jlc3NBQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEJ5SW5zdGFsbWVudHNBY2NvcmRpbmdUb1Byb2dyZXNzVEJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVlVXBvblJlY2VpcHRPZkludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlclRocm91Z2hCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VGVybXNEZWZpbmVkSW5Db25zb2xpZGF0ZWRJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VXBvbkNvbXBsZXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlUZXJtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseUFncmVlZFVwb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tcHRQYXltZW50QWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm94aW1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbEJ5Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9BZHZpc2VCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb3hpbW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRmxvb3JQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5vclBheW1lbnRUZXJtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUFjY2VwdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzRnVuZHNSZXF1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5rbm93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhbmNlQmlsbCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY291bnRzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50UGVyY2VudCIgdHlwZT0iRGVjaW1hbDEwXzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50QW1vdW50Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudERheXNEdWUiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RHVlRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudERheU9mTW9udGgiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRpc2NvdW50RGF0ZVRpbWVSZWZDb2RlZCIgdHlwZT0iRGF0ZVRpbWVSZWZDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaXNjb3VudERhdGVUaW1lUmVmQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0RGF5c0R1ZSIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmV0RHVlRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOZXREYXRlVGltZVJlZkNvZGVkIiB0eXBlPSJEYXRlVGltZVJlZkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldERhdGVUaW1lUmVmQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY291bnRzIiB0eXBlPSJEaXNjb3VudHMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5VmFsdWUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5QW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlWYWx1ZSIgdHlwZT0iTW9uZXRhcnlWYWx1ZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZUN1cnJlbmN5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRhcmdldEN1cnJlbmN5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW52ZXJzZVJhdGVPZkV4Y2hhbmdlIiB0eXBlPSJEZWNpbWFsMTlfOSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0ZU9mUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9InhjYmxEYXRldGltZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mUmF0ZU9mRXhjaGFuZ2VSZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiIHR5cGU9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOV85Ij4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOSIvPgorICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iOSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZSIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRhdGVUaW1lUmVmQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkRGVsaXZlcnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZhbE9mR2FnZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZTYW1wbGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uQW5kQWNjZXB0YW5jZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VEYXRlRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlRGF0ZUltcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUNyZWRpdE5vdGVSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUV4V29ya3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVHb29kc0hhbmRlZE92ZXJGb3JTaGlwbWVudEJ5U2VsbGVyT3JBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUdvb2RzUmVjZWl2ZWRCeUJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlR29vZHNSZWNlaXZlZEJ5QnV5ZXJzQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVHb29kc1JlY2VpdmVkQnlDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlSW52b2ljZVJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY2NlcHRhbmNlT2ZGaXJzdFNhbXBsZXNQcm9kdWNlZFVuZGVyUHJvZHVjdGlvbkNvbmRpdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFjY2VwdGFuY2VPZk5lZ290aWFibGVJbnN0cnVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY2NlcHRhbmNlT2ZUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBcnJpdmFsT2ZUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkJpbGxPZkxhZGluZ0NvbnNpZ25tZW50Tm90ZU9yT3RoZXJUcmFuc3BvcnREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2VydGlmaWNhdGVPZkZpbmFsQWNjZXB0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2VydGlmaWNhdGVPZlByZWxpbWluYXJ5QWNjZXB0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDb25maXJtYXRpb25PZk9yZGVyUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDcmVkaXROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlbGl2ZXJ5T2ZHb29kc1RvRXN0YWJsaXNobWVudHNEb21pY2lsZVNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlbGl2ZXJ5VG9CdXllck9mRG9jdW1lbnRzUmVwcmVzZW50aW5nR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlbGl2ZXJ5VG9CdXllcnNBZ2VudE9mRG9jdW1lbnRzUmVwcmVzZW50aW5nR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkRlbGl2ZXJ5VG9DYXJyaWVyT2ZEb2N1bWVudHNSZXByZXNlbnRpbmdHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVsaXZlcnlUb0ludGVybWVkaWFyeUJhbmtPZkRvY3VtZW50c1JlcHJlc2VudGluZ0dvb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkVuZE9mV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmluYWxBY2NlcHRhbmNlT2ZXb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZJbndhcmRGcm9udGllckNyb3NzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZJc3N1ZU9mVHJhbnNwb3J0RG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk5lZ290aWFibGVJbnN0cnVtZW50RHJhZnRQcm9taXNzb3J5Tm90ZUJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZPdXR3YXJkRnJvbnRpZXJDcm9zc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJlc2VudGF0aW9uT2ZEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByZXNlbnRhdGlvbk9mTmVnb3RpYWJsZUluc3RydW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByZXNlbnREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvdmlzaW9uYWxSZWNlcHRpb25PZldvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlY2VpcHRGb3JMb2FkaW5nTWF0ZXNSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZSZWNlaXB0T2ZUb29sRGVwZW5kZW50SW5pdGlhbFNhbXBsZXNQbHVzVW5saW1pdGVkQWJzb2x1dGVCYW5rR3VhcmFudGVlUGx1c1ZhbHVlQWRkZWRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlY2VpcHRPZlRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlJlc2FsZUJ5QnV5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlNhbGFyeVBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTaGlwbWVudEFzRXZpZGVuY2VkQnlUaGVUcmFuc3BvcnREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU2lnbmF0dXJlT2ZDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3RhcnRPZldvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmVzZW50RG9jdW1lbnRSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVByb2NlZWRzT2ZSZXNhbGVDb2xsZWN0ZWRCeUJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEF0RGF5c0FmdGVyRGF0ZU9mSXNzdWFuY2VPZlRyYW5zcG9ydERvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEF0RGF5c0FmdGVyRGF0ZU9mUHJlc2VudGF0aW9uT2ZEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0QXREYXlzRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRBdERheXNTaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlRGF0ZU9mTmVnb3RpYWJsZUluc3RydW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlUmVjZWlwdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VUcmFuc21pc3Npb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlVmVyaWZpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJSZWZlcmVuY2VEYXRlQWdyZWVkVXBvbkJldHdlZW5UaGVQYXJ0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudER1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXBwcm92YWxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0T2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRGF0ZU9mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmllZERyYWZ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RpcHVsYXRlZERhdGVGb3JBY2NlcHRhbmNlT2ZEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RpcHVsYXRlZERhdGVGb3JOZWdvdGlhdGlvbk9mRG9jdW1lbnRhcnlDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0aXB1bGF0ZWREYXRlRm9yUGF5bWVudE9mRG9jdW1lbnRhcnlDcmVkaXQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBheW1lbnRNZXRob2QiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRNZWFuQ29kZWQiIHR5cGU9IlBheW1lbnRNZWFuQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGF5bWVudE1lYW5Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50TWVhblJlZmVyZW5jZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50U3lzdGVtQ29kZWQiIHR5cGU9IlBheW1lbnRTeXN0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50U3lzdGVtQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JpZ2luYXRpbmdGSUFjY291bnQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJGSUFjY291bnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVjZWl2aW5nRklBY2NvdW50Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iRklBY2NvdW50Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2FyZEluZm8iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBheW1lbnRNZXRob2QiIHR5cGU9IlBheW1lbnRNZXRob2QiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGF5bWVudE1lYW5Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAzNUV4Y2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRlZEJpbGxPZkV4Y2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50RGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRQbHVzQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UGx1c0RlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmRDb3Jwb3JhdGVUcmFkZUV4Y2hhbmdlRGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENvcnBvcmF0ZVRyYWRlUGF5bWVudENyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ29ycG9yYXRlVHJhZGVQYXltZW50RGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZENyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIRGVtYW5kQ3JlZGl0UmV2ZXJzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSERlbWFuZERlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hEZW1hbmREZWJpdFJldmVyc2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hQcmVBcnJhbmdlZFBheW1lbnRBbmREZXBvc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hSZXZlcnNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0Nhc2hDb25jZW50cmF0aW9uT3JEaXNidXJzZW1lbnRDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50RGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBEQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBQRERlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBQRFBsdXNDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UFBEUGx1c0RlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ2FzaENvbmNlbnRyYXRpb25PckRpc2J1cnNlbWVudFBsdXNDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NDYXNoQ29uY2VudHJhdGlvbk9yRGlzYnVyc2VtZW50UGx1c0RlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ29ycG9yYXRlVHJhZGVFeGNoYW5nZUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NvcnBvcmF0ZVRyYWRlRXhjaGFuZ2VEZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NvcnBvcmF0ZVRyYWRlUGF5bWVudENyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0NvcnBvcmF0ZVRyYWRlUGF5bWVudERlYml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0hTYXZpbmdzQ3JlZGl0UmV2ZXJzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFNhdmluZ3NEZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIU2F2aW5nc0RlYml0UmV2ZXJzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5nSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5nSG91c2VDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZENsZWFyaW5nSG91c2VEZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0NhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtjaGVxdWUtSXNzdWVkQnlBQmFua2luZ09yU2ltaWxhckVzdGFibGlzaG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtEcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0RyYWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeUNyZWRpdG9yT25UaGlyZFBhcnR5QW5kQWNjZXB0ZWRBbmRFbmRvcnNlZEJ5QUJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JBbmRFbmRvcnNlZEJ5QW5vdGhlckJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JPbkFCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsRHJhd25CeVRoZUNyZWRpdG9yT25BQmFua0FuZEVuZG9yc2VkQnlBVGhpcmRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbERyYXduQnlUaGVDcmVkaXRvck9uQVRoaXJkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxEcmF3bkJ5VGhlQ3JlZGl0b3JPblRoZURlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ0FjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rRW50cnlEZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaGllcnNDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2NkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDY2RQbHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRCYW5rZXJzRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENoZXF1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlcXVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ0JldHdlZW5QYXJ0bmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RQYXltZW50QnlDZXJ0aWZpZWRGdW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFBheW1lbnRCeUNvbXBhbnlDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uQnlCYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdERlYml0QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Q2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0VHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN0cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3R4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdENhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0VHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlvbkZyb21GaWxtUmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5VG9PdGhlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQklOQVhDbGVhcmluZ05ldHdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNQYXltZW50U3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUmVzZXJ2ZUZ1bmRzT3JXaXJlVHJhbnNmZXJSZXBldGl0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsUmVzZXJ2ZUZ1bmRzT3JXaXJlVHJhbnNmZXJOb25SZXBldGl0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbk9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUZvcm1hdEdpcm8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXltZW50QmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lLUJhbmtpbmdEZWJpdFRyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUNvbnRpbmdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZVNlbnNpdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5LaW5kUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdHJ1bWVudE5vdERlZmluZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyQmFua0RlYml0VHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VkU2VwYXJhdGVseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsLVN1bUNvbnN0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoZXF1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9ja0JveCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXlPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxPclJlZ2lvbmFsQ2xlYXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblBheW1lbnREYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUcmFuc2ZlcmFibGVCYW5rZXJzRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRyYW5zZmVyYWJsZUxvY2FsQ2hlcXVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlCeUNoZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QnlQb3N0R2lybyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFRvQmFua0FjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxEZWR1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUNsZWFyaW5naG91c2VCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUERDcmVkaXRUb0RlbWFuZERlcG9zaXRBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUEREZWJpdFRvRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRFBsdXNBZGRlbmR1bUNyZWRpdFRvRGVtYW5kRGVwb3NpdEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBQRFBsdXNBZGRlbmR1bURlYml0VG9EZW1hbmREZXBvc2l0QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXV0aHJvaXplZENoZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5Q2hhcmdlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZU5ldHRpbmdBZ3JlZW1lbnRQYXlCeVdpcmVUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZU5ldHRpbmdQYXlCeUNoZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeUFCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5QUJhbmtBbmRFbmRvcnNlZEJ5QW5vdGhlckJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc3NvcnlOb3RlU2lnbmVkQnlBVGhpcmRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzc29yeU5vdGVTaWduZWRCeUFUaGlyZFBhcnR5QW5kRW5kb3JzZWRCeUFCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5VGhlRGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5VGhlRGVidG9yQW5kRW5kb3JzZWRCeUFUaGlyZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZVNpZ25lZEJ5VGhlRGVidG9yQW5kRW5kb3JzZWRCeUJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ByaWV0YXJ5TmV0d29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZEhvbWUtQmFua2luZ0NyZWRpdFRyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VHaXJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRGV0YWlsQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkTWV0aG9kRm9yUGF5bWVudFdhc05vdFVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tYXJ5QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbGVyc0NoZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcmdlbnRHaXJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVNBU3BlY2lhbEVsZWN0cm9uaWNGdW5kc1RyYW5zZmVyTmV0d29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXJlVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgxMiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYXltZW50U3lzdGVtQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGluYXJ5UG9zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyRW1wbG95ZWVDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENvbmNlbnRyYXRpb25EaXNidXJzZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hDb25jZW50cmF0aW9uRGlzYnVyc2VtZW50UGx1c0FkZGVuZGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVySW5pdGlhdGVkRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVySW5pdGlhdGVkRW50cnlQbHVzQWRkZW5kYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlVHJhZGVFeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlQ2hlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVncmFwaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRyYW5zbWlzc2lvbk5ldHdvcmtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXR3b3Jrc05vdERlZmluZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZHdpcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsLUZhY2UtVG8tRmFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXJyYW5nZWRQYXltZW50QW5kRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXJyYW5nZWRQYXltZW50QW5kRGVwb3NpdFBsdXNBZGRlbmRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhdXRob3JpemVkRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRBaXJNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkTWFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBQ0giLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZJQWNjb3VudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkFjY291bnREZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGSUFjY291bnQiIHR5cGU9IkZJQWNjb3VudCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudERldGFpbCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWNvbmRhcnlBY2NvdW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IklCQU4iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnRDb250cm9sS2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudFR5cGVDb2RlZCIgdHlwZT0iQWNjb3VudFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50TmFtZTEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFjY291bnROYW1lMiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWNjb3VudFJlZmVyZW5jZXMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBY2NvdW50RGV0YWlsIiB0eXBlPSJBY2NvdW50RGV0YWlsIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFjY291bnRUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0J1c2luZXNzQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXlNYXJrZXRGdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50QWNjb3VudFZlc3RlZEludGVyZXN0YXRNYXJrZXRWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudEFjY291bnRWZXN0ZWRJbnRlcmVzdE5ldENhc2hWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFJldGlyZW1lbnRBY2NvdW50LUlSQS1WZXN0ZWRJbnRlcmVzdGF0TWFya2V0VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxSZXRpcmVtZW50QWNjb3VudC1JUkEtVmVzdGVkSW50ZXJlc3ROZXRDYXNoVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZUNvbnRyb2xsZWRSZXRpcmVtZW50QWNjb3VudFZlc3RlZEludGVyZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUZhY2VWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0aXJlbWVudEFjY291bnQtVmVzdGVkSW50ZXJlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RGdW5kQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tzYW5kQm9uZHNBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlQWNjb3VudC1OZXRDYXNoVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlUmV0aXJlbWVudEFjY291bnQtNDAxSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQmFja0FjY291bnRmb3JSZXR1cm5zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoTWFuYWdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRDYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGlzdGluZ0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkl0ZW1zb25EZW1hbmREZXBvc2l0QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuSXRlbXNvblNhdmluZ3NBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXZpbmdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWREaXNidXJzZW1lbnRNYXN0ZXJBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkRGlzYnVyc2VtZW50U3ViQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0VW5pb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucmljaGVkUGxhbkNvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nLXRlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdXR1YWxGdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5QmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpb25zaGlwU3VtbWFyeUFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmVrZWVwaW5nLUN1c3RvZHlBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaZXJvQmFsYW5jZU1hc3RlckFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilplcm9CYWxhbmNlQWZmaWxpYXRlQWNjb3VudCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGaW5hbmNpYWxJbnN0aXR1dGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoTmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hTdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoSG91c2VOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoU3RyZWV0U3VwcGxlbWVudDEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoU3RyZWV0U3VwcGxlbWVudDIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZJQnJhbmNoUG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRklCcmFuY2hDaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaFJlZ2lvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZ2lvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGSUJyYW5jaENvdW50cnkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb3VudHJ5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkZpbmFuY2lhbEluc3RpdHV0aW9uIiB0eXBlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FyZEluZm8iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhcmROdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRBdXRoQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZFJlZk51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2FyZEV4cGlyYXRpb25EYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRUeXBlIiB0eXBlPSJDYXJkVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRUeXBlT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcmRIb2xkZXJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXJkSW5mbyIgdHlwZT0iQ2FyZEluZm8iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ2FyZFR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1FWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKQ0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbmVycyIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQWxsb3dPckNoYXJnZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIgdHlwZT0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoYXJnZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSW5kaWNhdG9yQ29kZWQiIHR5cGU9IkluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkluZGljYXRvckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhc2lzQ29kZWQiIHR5cGU9IkJhc2lzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkIiB0eXBlPSJNZXRob2RPZkhhbmRsaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd2FuY2VPckNoYXJnZURlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQWxsb3dPckNoZ0Rlc2MiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+CisgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc1F1YW50aXR5UmFuZ2UiPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQmFzaXNNb25ldGFyeVJhbmdlIi8+CisgICAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iVGF4Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTZXFObyIgdHlwZT0ieHNkOmludCIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iMSIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbGxvd09yQ2hhcmdlIiB0eXBlPSJBbGxvd09yQ2hhcmdlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkluZGljYXRvckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VMaW5lSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlckNhbGxPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2VPckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzT3JBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJCYXNpc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uZXRhcnlBbW91bnQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTWV0aG9kT2ZIYW5kbGluZ0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hlY2tUb0N1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDdXN0b21lckFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlWZW5kb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVRvQmVQYWlkQnlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkdyb3NzUXVhbnRpdHlJbnZvaWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlVG9CZUlzc3VlZEJ5VmVuZG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlSZXNlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlRGVuaWVkQnlWZW5kb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Pbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUGF5YWJsZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjcnVhbEZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRGdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoSW5BZHZhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVBbmRBZGR0b0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFsbG93T3JDaGdEZXNjIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZklEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkRlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VydmljZUNvZGVkIiB0eXBlPSJTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGdEZXNjIiB0eXBlPSJBbGxvd09yQ2hnRGVzYyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGVzY3JpcHRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRlc2NyaXB0aW9uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiIgdHlwZT0iTGlzdE9mRGVzY3JpcHRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvblRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxhbmd1YWdlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0iRGVzY3JpcHRpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VydmljZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYm91dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzb2x1dGVNaW5pbXVtQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtRmVkZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzQ2hhcmdlLVN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50TnVtYmVyQ29ycmVjdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNpZEJhdHRlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50b2ZEZWxpdmVyeUZlZUFPRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZhdGlvbk9mQ2FybmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29tbWVyY2lhbEludm9pY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQ29waWVzT2ZGcmVpZ2h0QmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbE1hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsVGFyaWZmQ2xhc3NpZmljYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT24tT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzQ29ycmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkVG9NYWtlTWFya2V0VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNYXhpbXVtQ2hhcmdlc0JpbGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRGb3JNaW5pbXVtQXZlcmFnZVRpbWVSZXF1aXJlbWVudEJpbGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRWYWxvcmVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlQ2hhcmdlc0hhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRGVzdGluYXRpb25BbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUxhZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZU9yaWdpbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpZGF2aXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LURlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudERpc2J1cnNlbWVudC1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmNyYWZ0T25Hcm91bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cG9ydENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJFeHByZXNzQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lT3BlbmluZ0ZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlycG9ydFRlcm1pbmFsSGFuZGxpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydGF0aW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saWNCZXZlcmFnZVJlcG9ydENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsZWdoZW55Q291bnR5UEFEZWxpdmVyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VMaW5lSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZU1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVBlckNhbGxPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlQWR2YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlRm9yQ29uc2lnbm1lbnRNZXJjaGFuZGlzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTm9uLVBlcmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRpbmdFeHBvcnREb2N1bWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm5lYWxIZWF0U3RlZWxvckdsYXNzVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm9kaXppbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGktZHVtcGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmJpdHJhcnlJbkFkZGl0aW9uVG9UaHJvdWdoUmF0ZXNhbmRDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRXb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaXN0QW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50c1RvQmlsbE9mTGFkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWREZWJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nRHJhZnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUZyZWlnaHRBbGxLaW5kc1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2ljUmVvcmRlckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbWluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkZGluZ0ZlZWRpbmdEaXNpbmZlY3RpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZWZGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJleW9uZENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kRnJlaWdodENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRIb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWREZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0F0dGVuZGFuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhY2tMdW5nVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9ja2luZ0FuZEJyYWNpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb3dlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9idGFpbENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcFNoZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JkZWF1eEFyYml0cmFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3RoLUZsYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrYnVsa1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVha0J1bGtTdXJmYWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmlkZ2VUb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZW5Mb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlblBhY2thZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlT3JEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlclN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZGVuT3ZlcmhlYWRPckFsbG93YW5jZUZvckluZGlyZWN0Q29zdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cm5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySGFuZENhcnJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDYXJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlUHJlc3N1cml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYmxlc1NlbmRpbmdPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbFRhZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FtcEFyYml0cmFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRhR3JlYXRMYWtlc0FkZGl0aW9uYWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkNRQ3VzdG9tc0NsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXJyZW5jeUV4Y2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkltcG9ydFRlcm1pbmF0aW9uRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblJlY29uc2lnbm1lbnRGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVtYW5pZmVzdEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsZWRPcmRlckhlYXZ5RHV0eUZsYXRjYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcHR1cmVBZGRpdGlvbmFsRGF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29UYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyUmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQ3JlZGl0QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyRGViaXRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJOb3RpZmljYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGFsb2dpbmdTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbEJ1eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHNPZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZDb25mb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlJlZ2lzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaW5BbmRCaW5kZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVNlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZU9mQWlyYmlsbC1TZXJ2aWNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VzRm9yd2FyZEFkdmFuY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJ0ZXJTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1RyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbE1pbGxpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWNhZ29Mb29wQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaWdhcmV0dGVTdGFtcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5TWFpbnRlbmFuY2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlQaWNrLXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VGVybWluYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFuaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU2VhbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hdGluZ0RpcFJ1c3Rwcm9vZkVEUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09EQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0T25EZWxpdmVyeUFsdGVyYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5RGVsZXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW1hbnVmYWN0dXJpbmdEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmF0aW9uUGVyZm9ybWFuY2VBbmROb24tcGVyZm9ybWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVBbGxTYW1lRGF5U2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pc3Npb25BbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW11bmljYXRpb25zQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlQ2FyQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wcmVzc29yQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXNzaW9uTW9uZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmdlc3Rpb25TdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNlcnZhdGlvblJlc2VhcmNoRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVVbmxvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0YW50U3VydmVpbGxhbmNlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlLUFybWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWxhcml6YXRpb25GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyTGVnYWxpemF0aW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlcG9zaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEZXN0dWZmaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGl2ZXJzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTG9zc0RhbWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VydmljZUNoYXJnZVVLRVVSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVVNBQ2FuYWRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdHVmZmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyVHJhaWxlckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludW91c01pbGVhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVzY2FsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VydmljZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEF0bW9zcGhlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLW9wQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZUFkdmVydGlzaW5nTWVyY2hhbmRpc2luZ0FsbG93YW5jZVBlcmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5T2ZCaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkRlbGl2ZXJ5UmVjZWlwdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5QWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFJlY292ZXJ5RmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3R0b25GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50QW5kUmVjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRlcnZhaWxpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWltYnVyc2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmFmdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC1CcmVha0J1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudEZhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJBY2NvdW50SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXF1aXBtZW50QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRXhhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtQ29udGFpbmVyTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUxpZnRMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0Zvcm1hbGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UtQWRkaXRpb25hbFBhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQZW5hbHR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dEFuZFBhcmFsbGVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXR0aW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkTWVyY2hhbmRpc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvQ2FycmllckVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0dvdmVybm1lbnRFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFEcmF3aW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkaGVhZE1pbGVhZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWZBbmREaXNhYmxlZFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckNhcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWRWYWx1ZUZvckluc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0VG9NYWtlTWFya2V0VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVjdGl2ZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaWNpdEZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlLUluc3RhbGxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsYXlGdXJuaXNoaW5nRGVzdGluYXRpb25XZWlnaHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtQXZlcmFnZUFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlLVNwZWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0SW5MaWV1T2ZPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYW1waW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJyaWNrQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25hdGVkU3VwcGxpZXJJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZQb3dlclVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlRyYWlsZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb24tU3BlY2lhbFR5cGVGbGF0Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25VbmxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVybWluZWRGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZlbG9wbWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGllU2VydmljZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UHJvZHVjdEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2Nvbm5lY3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1Ecm9wQm94Q29udmVuaWVuY2VDdHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LUluY2VudGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtTXVsdGlwbGVTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtU2VydmljZU9wdGlvbkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uUGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TcGVjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwbGF5QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvblNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yRGlzY291bnRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkFuZFJlY29uc2lnbm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmVyc2lvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uVG9BaXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2thZ2UtQm9hdERldGVudGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vci1Uby1Eb29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3dlbFBpbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRGViYXJrYXRpb25SYXRlWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRW1iYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VhdFBvcnRPZkVtYmFya2F0aW9uUmF0ZVpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VMaW5lSGF1bCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyQXNzaXN0ZWRVbmxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNXYWdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcERvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BZYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtQ29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bURlcG9zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1VcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5ZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyeUljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVubmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eURyYXdiYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseUJ1eUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlQYXltZW50QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVNoaXBBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVBvcnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlXZWlnaGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5jbG9zdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlbWVudEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5lcmd5Y2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lTdXJjaGFyZ2VGdWVsQWRqdXN0bWVudEZhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyaW5nU3VwcGxpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ3JhdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50ZXJlZFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUHJvdGVjdGlvblNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE1hbnVmYWN0dXJlclJlc3RvcmF0aW9uQXVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY29ydFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY3JvdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyMVByZXNlbnRhdGlvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5Qb3J0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZVZhbHVlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NNaWxlYWdlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NQZXJpb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NWYWx1ZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZUFjY2Vzc0NyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdGlvbkRlbGl2ZXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uUGlja3VwQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbmRlZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZE9uZURheUNvbnN1bGFyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2hpcG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0aW5nUHJlbWl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Q3VzdG9tc0NsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLUF1dG9tYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb25zLVVTU2hpcHBlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydEltcG9ydENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5zZUFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRTaGlwcGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFDb3BpZXNhbmRNYWlsaW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMYWJvckhlbHBlclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFTZXJ2aWNlLUNvdW50ZXItVG8tQ291bnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUNoYXJnZXMtQWRkaXRpb25hbFBhZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRMYW1wUGFuZWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheFByZS1hbGVydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRyYW5zZmVyU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0QXJ0aWNsZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RGbGlnaHRPdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRyYWNrU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0UmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JTdG9ja1Byb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb2RBbmRMb2RnaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduQ3VzdG9tc0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzUmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduTWlsaXRhcnlTYWxlc1NwZWNpYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2VBZHZhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkQ291cG9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0FnZW50Q29tbWlzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbmNoaXNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRG9taWNpbGVTaGlwbWVudFByb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEJhc2VkT25Eb2xsYXJNaW5pbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvQm9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Q2hhcmdlc1RvRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRFcXVhbGl6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0SW50ZXJuYXRpb25hbE5vbi1VU0RvbGxhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsVVNEb2xsYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGFzc3Rocm91Z2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXNobmVzc0xlYWtlckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxUcnVja2xvYWRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhcm1lbnREaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUHJlc3N1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGV3YXlGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb2xkRmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzQ3JlZGl0QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0FuZFNlcnZpY2VzVGF4Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50SW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFdhcmVob3VzZUZlZS1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRG9vcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRmxvd0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhdHVpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyaW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlY2VpcHRzU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGFnZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cGVkSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZWRJbnNwZWN0aW9uVGVjaG5pY2FsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VsZlBvcnREZWxpdmVyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRsaW5nQ2hhcmdlc09uRGlzdHJpYnV0aW9uRnJlaWdodEZvcndhcmRlZEJleW9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdGcmVpZ2h0QXRQb3NpdGlvbnNOb3RJbW1lZGlhdGVseUFkamFjZW50VG9WZWhpY2xlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFyYm9yTWFpbnRlbmFuY2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhdWxpbmdBbmRIb2lzdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nVG9CZURpcmVjdEJpbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c0NhcmdvT25EZWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1Eb21lc3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzSGFuZGxpbmdGZWUtSW50ZXJuYXRpb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzU3RvcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdEluVHJhbnNpdENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRUcmVhdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlEdXR5RmxhdENhckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdnlMaWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU2VjdXJpdHlSZWRJbi1ib25kU2VhbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaHdheUludGVyY2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2ludGluc0FuZEhhdWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVMaW5lRnJlaWdodENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9uZXlGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvb2stdXBjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc2VDaGFyZ2VTcGVjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZWhvbGRHb29kc1BpY2stdXBPckRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBQWlyYmlsbFByZXBhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQVRBRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0U2VydmljZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wcm9wZXJEb2N1bWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kRnJlaWdodENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUZyZWlnaHRNYW51ZmFjdHVyaW5nVG9TaGlwcGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnJlY3RCaWxsaW5nQWNjb3VudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlQcmljZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbExpY2Vuc2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVQaWNrLXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdEF0T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbkFuZFRyYWluaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25XYXJyYW50eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWxhdGVkVGFua0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYWNlbWVudENvc3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByZW1pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVByb3ZpZGVkQnlMZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJkaXZpc2lvblByb2ZpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25SZWZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0T25TZWN1cml0eURlcG9zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1Vc2VQZXJtaXR0ZWRBdFNwZWNpYWxSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25Db21taXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25NYXJrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDb3VyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRG9vci10by1Eb29ySGFuZGxpbmdGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycGxhbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVIaWdod2F5VG9sbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0UHJpY2VQcm90ZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYS1wbGFudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkZGl0aW9uYWxBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQXQtQ29zdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZURlbGl2ZXJ5VGVybXNBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOby1DaGFyZ2VBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVdpdGhHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJpc2hBcmJpdHJhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kRGVsaXZlcnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZFBpY2stVXBDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0YWxpYW5SZWxlYXNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtUGVyY2VudGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbS1Vbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwRnJvbUZyZWV6aW5nUGVyY2VudERpZmZlcmVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS29zaGVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFiZWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDb3N0T2ZSZW1vdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck1vZGlmeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JOb1Ryb3VibGVGb3VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JPdmVydGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JQcmVtaXVtT3ZlcnRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yUmVwYWlyQW5kUmV0dXJuT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU3RyYWlnaHQtdGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUZXN0QW5kQ2FsaWJyYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWRpbmdBZGp1c3RtZW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTIwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci00MEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc2hpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVPcmRlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZVBheW1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheW91dERlc2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3ZlckNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRGYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWtpbmdVbmRlcmdyb3VuZFN0b3JhZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2hvcnRmYWxsQ29uc2lkZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5Db250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuVHJ1Y2tsb2FkQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdFByb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VBbmRUaXRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZWxpbmVTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRHYXRlVHJ1Y2tPckZvcmtsaWZ0U2VydmljZUF0UGljay11cERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1lRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsRnJvbVBvcnRPZkRlYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5laGF1bFBlcmNlbnREaWZmZXJlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsVG9Qb3J0T2ZFbWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRGViYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVyVGVybXNBdFBvcnRPZkVtYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGVkRGFtYWdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25UYXhBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRvdGFsRmVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFdlaWdoaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbERlbGl2ZXJ5RHJheWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZURlbGF5ZWRJblN3aXRjaGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmVVbmRlck93blBvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDaGFyZ2VCYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3R0ZXJ5Q3Jvc3NSZWRlZW1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93LVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlXaW5uZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdW1wU3VtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5pbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctUG9zdGFnZUNvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxpbmctU2VydmljZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxJbnZvaWNlVG9FYWNoTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXREZXZlbG9wbWVudEZ1bmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JUYWdnaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJyaWFnZVJ1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbW9SZXR1cm5hYmxlQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJjaGFuZGlzZVByb2Nlc3NpbmdGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSYXRlQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2VuZ2VyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxzU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkLVRpZXJMb3R0ZXJ5Q2FzaGluZ0JvbnVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlXaW5uZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlRmVlRm9yUmVwYWlyQW5kUmV0dXJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxlYWdlT3JUcmF2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtUGVyY2VudGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kaWZpZWRBdG1vc3BoZXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aGx5UmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3VudERlbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11c2hyb29tRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGlzdHJpYnV0aW9uQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdJdGVtQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U3RvcmVEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3V2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2VEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3WW9ya0RlbGl2ZXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrUGljay11cENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkhEV2hhcmZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUR1dGlhYmxlQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uR2VuZXJhdGVkRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLXJldHVybmFibGVDb250YWluZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1JldHVybkNyZWRpdEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsUHVtcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJpemVkQWZmaWRhdml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZUJlZm9yZURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3p6bGVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ2hhcmdlcy1IYXphcmRvdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3VwcGxpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNob3JlLUFsYXNrYUhhd2FpaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25DYXJyaWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25EZWNrQnJlYWtCdWxrRGlmZmVyZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtRGF5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lVGltZUVuZ2luZWVyaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUtVGltZUxpY2Vuc2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lLU9ubHlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZXRpbWVUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbmFsU29mdHdhcmVTdXBwb3J0Rm9yT3BlcmF0aW9uYWxTdXBwb3J0U3lzdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JTd2l0Y2hpbmdTeXN0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25DaGFyZ2VDb2xvckZhYnJpY09mZmljZUZ1cm5pdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXItRmxhdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJOb3RpZnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWNjZXNzb3JpYWxTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdmFuY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckV4cG9ydENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeURlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdvdmVybm1lbnRBZ2VuY3lFeGFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckltcG9ydENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJNaXNjZWxsYW5lb3VzRWFybmluZ09yQWRkaXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyU2VlUmVsYXRlZERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlJvdXRlTWlsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mWm9uZVBpY2stdXBPckRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlQ2FibGVDb25uZWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVySGVpZ2h0Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycnVuQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZWRQcmVtaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZUxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJXaWR0aENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0FuZEhhbmRsaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQ3JhdGluZ0hhbmRsaW5nQW5kVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tJbnZvaWNlV2l0aFNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWludGluZ1ByaW1lck9yRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldEV4Y2hhbmdlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRpemluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYWxsZWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmlzaENvdW50eVNhbGVzVGF4T25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2luZ1NoaXBwZXJzRXhwb3J0RW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNPdmVydGltZUxhYm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsQWRkaXRpdmVzU3RyYWlnaHRUaW1lTGFib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxUYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVjYW5GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnREaWZmZXJlbnRpYWwtTGVzc1RoYW5Db250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlByb2R1Y3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBtZW50VmFsdWVUaGF0SXNSZXR1cm5hYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZTaGlwcGVkUXVhbnRpdHlUaGF0SXNSZXR1cm5hYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VBd2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVySXRlbUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRzQm9uZHNFc2NvcnRBdHRlbmRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlck9yZGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJQb3VuZENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eU1lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxQcm9wZXJ0eVNwb3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvc3BoYXRpemluZ1N0ZWVsVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrbGVBbmRPaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tVcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay11cEFuZERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAtT3V0T2ZBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzT3RoZXJUaGFuV2hhcmZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJDaGFyZ2VzLVdoYXJmYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWVyUGljay11cEFuZE9yRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJVbmxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90SW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50QW5kT3JSZW1vdmFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1QZXJjZW50YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzT3JNaW51cy1BbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLVBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVMYXNoaW5nRXF1aXBtZW50U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlV29vZC1TZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3JrRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Q2hhbmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydEhhbmRsaW5nQW5kVW5sb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0F0T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0RGFtYWdlZEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RhdG9GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyRmFjdG9yQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNhcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2VFeGNlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpb3VzTWV0YWxDb250ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2FkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsb2RnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZVVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVRyYW5zcG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkVXNhZ2VBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbkFuZERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQWlyV2F5YmlsbC1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDYW5hZGlhbkN1c3RvbXNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQ29tbWVyY2lhbEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZFeHBvcnRFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkluc3VyYW5jZUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mVVNFeHBvcnREb2N1bWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtUG9zaXRpb25lZEludmVudG9yeVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBZGp1c3RtZW50UGVyY2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VBbmRNYXJrZXRpbmdBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlRGV2aWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmlsbGluZ0Ftb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JEZWxpdmVyeU9mQmlsbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvck1vbnRoQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlT3duZWRWZWhpY2xlUHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0luVHJhbnNpdFByaXZpbGVnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbEZlZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zvcm1hSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50UmVxdWlyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbERpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZkNvbXBvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1Db2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZS1IZWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlSG91c2Vob2xkSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZU5hbWVBbmRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWxsaW5nRXllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcEFpckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVtcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsaGVhZEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW1waW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVJlZHVjdGlvbkJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmUtQmlsbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViaWxsZWREcmF5YWdlLURlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2lwaWVudEFkZHJlc3NDb3JyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlckhhbmRsaW5nQ2h1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uRmVkZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TaGFyZWRSZXNwb25zaWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25TdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29ubmVjdGNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWduQ29uc2lnbmVlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25EZWxpdmVyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWdubWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb29wZXJpbmdBdE93bmVyc09yU2hpcHBlcnNFeHBlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRGaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JhdGluZ1JlY29vcGVyaW5nLU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nSGFyZHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nTGljZW5zZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjdXJyaW5nU29mdHdhcmVNYWludGVuYW5jZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjdGlvblByZXBhbGxldGl6ZWRDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyQ2FyZ29QZXJjZW50RGlmZmVyZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlbENhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvbk1lY2hhbmljYWxEZXRlbnRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXJiaXNoaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk9mRXhwb3J0Rm9yUmVlbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRTaGlwbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlSZXF1aXJlZFJlZnVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaWFiaWxpdHlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlucXVpc2htZW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQW50aS1EdW1waW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvbkNvdW50ZXJ2YWlsaW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRheEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRHVlVVNDdXN0b21zU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaXF1aWRhdGlvblRvdGFsRmVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxEZWR1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRzQW5kTGVhc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhY2tDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRCdXllcnNFeHBlbnNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEN1c3RvbWVyRXhwZW5zZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyQXRHb3Zlcm5tZW50RXhwZW5zZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RWaWFDYW5hZGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VhcmNoRGV2ZWxvcG1lbnRGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VsbGVyc0Rpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudGlhbFBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvdHRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RvY2tpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBcnRpY2xlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ2FyZ29DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkTG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV3b3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWRpbmdBdHRlbmRhbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvY2t5TW91bnRhaW5CdXJlYXU1ODNJdGVtMTEwMEFyYml0cmFyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE91dEFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxSZWJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJveWFsdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsdmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZS1EYXlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stVXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay11cE9yRGVsaXZlcnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FsZUNoYXJnZVVubG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2lnbmF0dXJlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VncmVnYXRpbmdTb3J0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZVbmxvYWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVySGFuZENhcnJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXNzaXN0YW5jZVByb2dyYW1TdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDaGFyZ2VXaXRoQ2FzaERpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVXBncmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0LXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVhcmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXBGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENhcnJpZXJDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRDb25zaWduZWVVbmxvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0FuZEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwc2lkZVBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvU3RvY2tRdWFsaXR5QXVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3RibGFzdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rYWdlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmtBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmluay1XcmFwQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbkRlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvblBvcnRPZkRlYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JQb3J0T2ZFbWJhcmthdGlvbkRlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVJbnZvaWNlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQaWNrLXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVTaGlwbWVudEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xlZXZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFJhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGlwU2hlZXRVbmxvYWRpbmdBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsb3R0aW5nQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbE9yZGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZVN1cHBvcnRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQnV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2lyY3VzVHJhaW5zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZXRlbnRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxFcXVpcG1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGaW5pc2hDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxGcmVpZ2h0U3VwcGxlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1pbGVhZ2VNb3ZlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHVtcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRlc3RFcXVpcG1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVG9vbGluZ3Jld29ya2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRyYWluTW92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxWZWhpY2xlUmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvblJldmlldyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay1VcEF0UGllckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2xDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3R0aW5nT2ZUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHJlYWRlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1waW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU1ldHJvcG9saXRhblRyYW5zaXRBdXRob3JpdHlTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTW90b3JGdWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlYW1pbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZW5jaWxpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdE9yaWdpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0UGllckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3BwaW5nSW5UcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5UcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaWdodGVuaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhcHBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmVldExhbXBzQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJpcHBpbmdTb3J0aW5nQW5kQ29uc29saWRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9Db29wZXJhdGl2ZUFkdmVydGlzaW5nQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9UYXhPblJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VmZmVyYW5jZVdhcmVob3VzZUNoYXJnZUV4cG9ydE9ySW1wb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWdhckZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtT2ZBZGRzQW5kRGVkdWN0c1RvTWFrZU1hcmtldFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW5kYXlPckhvbGlkYXlQaWNrLXVwT3JEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJCYWdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbER1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbEl0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3ZWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2l0Y2hDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua1JlbnRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFycGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQWlycG9ydFRheE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUJldmVyYWdlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQ2l0eVNhbGVzVGF4T25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LURlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRXhjaXNlVGF4LU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1GZWRlcmFsRXhjaXNlVGF4T25UaXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUdvdmVybm1lbnRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUhhbmRsaW5nQ2hhcmdlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktQW1vcnRpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWFiaWxpdHktT25lVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsU2FsZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Mb2NhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LU1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uTWlzY2VsbGFuZW91c0NoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheE9uVHJhbnNwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1SZWd1bGF0b3J5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU2FsZXNhbmRVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc1RheFN0YXRlQW5kTG9jYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdGF0ZUhhemFyZG91c1N1YnN0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3VwZXJGdW5kRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtVmFsdWVBZGRlZFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVhRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobm9sb2d5RXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVncmFtQ2hhcmdlYmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmUtRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlUHJvdGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlWb2x1bnRhcnlBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVkQXNUcnVja2xvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbERpZmZlcmVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxIYW5kbGluZ0NoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsU2VydmljZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlc0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFF1YWxpZmljYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlQYWxsZXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdocHV0Q29udGFpbmVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJ1d2F5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXRpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb2JhY2NvUHJvZHVjdHNSZXBvcnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRPRkNTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nUmV3b3JrQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29sc0ZvclByaW50aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEFzc2Vzc29yaWFsQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEZlZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52b2ljZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Tm9uLVVTRG9sbGFycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50VVNEb2xsYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE1hdGVyaWFsSW52b2ljZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2luZ0luYm91bmRWaWFPdGhlckNhcnJpZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nU2VydmljZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyUmVudGFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJPZkxhZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQW5kU2V0dXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ2hhcmdlTWluaW11bVJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uRGlyZWN0QmlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25UaGlyZFBhcnR5QmlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25WZW5kb3JQcm92aWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbW1pbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrRGV0ZW50aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWREaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVybmluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvLURheVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3b0Rvb3JQaWNrVXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuYWJzb3JiZWRTd2l0Y2hpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZ0xhYm9yQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nUmVsb2FkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNhbGVhYmxlTWVyY2hhbmRpc2VBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2NoZWR1bGVkRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VQbGFuRGV0YWlsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlRmxhdEFzc2lzdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZU1heGltdW1Bc3Npc3RBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTREFJbnNwZWN0ZWRTdGFtcGluZ0NlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZUNoYXJnZVRvb2xpbmdQZXJzb25uZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZS1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTVmVoaWNsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuQ2xlYW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVPcmRlcmVkQnV0Tm90VXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVByZXBDaGFyZ2VDb3VydGVzeURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUm9hZENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVudGluZ0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlyZ2luSXNsYW5kVHJhbnNmZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlDb250cmlidXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrQ3Jld0luc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza0luc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmlza1N1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVkRnV0aWxlVHJpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJtZWxvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbEFuZEludm9pY2VEaXN0cmlidXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlYXRoZXJQcm90ZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRWZXJpZmljYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUJyZWFrYnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoYXJmYWdlLUNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2VIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZUFyZWFUZWxlcGhvbmVTZXJ2aWNlVXNhZ2VDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbGxDYWxsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcml0dGVuUHJvb2ZPZkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYLXJheUNoYXJnZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIj4KKyAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVJhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeUxpbWl0Ii8+CisgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzaXNNb25ldGFyeVJhbmdlIiB0eXBlPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1pbmltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1heGltdW1Nb25ldGFyeVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5UmFuZ2UiIHR5cGU9Ik1vbmV0YXJ5UmFuZ2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbmV0YXJ5TGltaXQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXRWYWx1ZSIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkN1cnJlbmN5Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1vbmV0YXJ5TGltaXQiIHR5cGU9Ik1vbmV0YXJ5TGltaXQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIj4KKyAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KKyAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1YW50aXR5TW9uZXRhcnlWYWx1ZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIgdHlwZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmF0ZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZVBlclVuaXQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJVbml0UHJpY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZUJhc2lzIiB0eXBlPSJEZWNpbWFsMThfMyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZSIgdHlwZT0iUmF0ZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEZWNpbWFsMThfMyI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgorICAgICAgICAgICAgPHhzZDp0b3RhbERpZ2l0cyB2YWx1ZT0iMTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZnJhY3Rpb25EaWdpdHMgdmFsdWU9IjMiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQZXJjZW50UXVhbGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudCIgdHlwZT0iRGVjaW1hbDEwXzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmNlbnRhZ2VNb25ldGFyeVZhbHVlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGVyY2VudFF1YWxpZmllciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGVkIiB0eXBlPSJQZXJjZW50UXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRRdWFsaWZpZXIiIHR5cGU9IlBlcmNlbnRRdWFsaWZpZXIiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTGlzdENvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1OZXRDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1Hcm9zcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtTmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZUFtb3VudExlc3NQcmV2aW91c0Rpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRNb250aGx5T25BbGxJbnZvaWNlc1Bhc3REdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50Q2hhcmdlQmFzZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFJhdGUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkltbXV0YWJsZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlTGluayIgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcGxpZXJTaG9wcGluZ0NhcnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iUm91bmRUcmlwT3JkZXIiIHR5cGU9InhjYmxCb29sZWFuIiBmaXhlZD0idHJ1ZSIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIgdHlwZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTdHJ1Y3R1cmVkTm90ZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiIHR5cGU9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3R1cmVkTm90ZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJHZW5lcmFsTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTm90ZVVSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGV4dFR5cGVDb2RlZCIgdHlwZT0iVGV4dFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0cnVjdHVyZWROb3RlIiB0eXBlPSJTdHJ1Y3R1cmVkTm90ZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXh0VHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkbGluZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmFsdHlGb3JCcmVhY2hPZkNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFJpZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQ29udHJhY3R1YWxTdGlwdWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9SZWNvcmRQT1RleHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsUE9UZXh0Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVNldCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mTmFtZVZhbHVlU2V0IiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVTZXQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVNldCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2V0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2V0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVNldCIgdHlwZT0iTmFtZVZhbHVlU2V0Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJOYW1lVmFsdWVQYWlyIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIiB0eXBlPSJMaXN0T2ZOYW1lVmFsdWVQYWlyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOYW1lVmFsdWVQYWlyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lVmFsdWVQYWlyIiB0eXBlPSJOYW1lVmFsdWVQYWlyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBdHRhY2htZW50Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBdHRhY2htZW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBdHRhY2htZW50IiB0eXBlPSJMaXN0T2ZBdHRhY2htZW50Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBdHRhY2htZW50Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZCIgdHlwZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRBY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudFB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBdHRhY2htZW50VGl0bGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMYW5ndWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTUlNRVR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlcGxhY2VtZW50RmlsZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50TG9jYXRpb24iIHR5cGU9InhzZDphbnlVUkkiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9IkF0dGFjaG1lbnQiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwZGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYW5nZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJEZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mSXRlbURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlRGV0YWlsIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckRldGFpbCIgdHlwZT0iT3JkZXJEZXRhaWwiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ikl0ZW1EZXRhaWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkl0ZW1EZXRhaWwiIHR5cGU9Ikxpc3RPZkl0ZW1EZXRhaWwiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQmFzZUl0ZW1EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2luZ0RldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJEZWxpdmVyeURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1Ob3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1BdHRhY2htZW50cyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCIgdHlwZT0iSXRlbURldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZUl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGluZUl0ZW1OdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGluZUl0ZW1UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJlbnRJdGVtTnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJdGVtSWRlbnRpZmllcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFF1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWF4QmFja09yZGVyUXVhbnRpdHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9mZkNhdGFsb2dGbGFnIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRhbG9nUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ29udHJhY3RSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udHJhY3RJdGVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkl0ZW1SZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeU9mT3JpZ2luIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ291bnRyeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmluYWxSZWNpcGllbnQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29uZGl0aW9uc09mU2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzTWF0ZXJpYWxzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSGF6YXJkb3VzIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2VJdGVtRGV0YWlsIiB0eXBlPSJCYXNlSXRlbURldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1OdW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJ1eWVyTGluZUl0ZW1OdW0iIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlckxpbmVJdGVtTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbU51bSIgdHlwZT0iTGluZUl0ZW1OdW0iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtVHlwZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZWQiIHR5cGU9IkxpbmVJdGVtVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtVHlwZSIgdHlwZT0iTGluZUl0ZW1UeXBlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxpbmVJdGVtVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0SXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludCI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iTGluZUl0ZW1OdW1UeXBlQ29kZWQiIHR5cGU9IkxpbmVJdGVtTnVtVHlwZUNvZGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IkJ1eWVyIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIiB0eXBlPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMaW5lSXRlbU51bVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtSWRlbnRpZmllcnMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQYXJ0TnVtYmVycyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbW1vZGl0eUNvZGUiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0ZWdvcnkiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1JZGVudGlmaWVycyIgdHlwZT0iSXRlbUlkZW50aWZpZXJzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0TnVtYmVycyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJQYXJ0TnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydE51bSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXllclBhcnROdW1iZXIiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0TnVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTWFudWZhY3R1cmVyUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RhbmRhcmRQYXJ0TnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJzdGl0dXRlUGFydE51bWJlcnMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVySXRlbUlkZW50aWZpZXJzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0TnVtYmVycyIgdHlwZT0iUGFydE51bWJlcnMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnROdW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydElERXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXZpc2lvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydE51bSIgdHlwZT0iUGFydE51bSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciI+CisgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJQYXJ0TnVtIj4KKyAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYW51ZmFjdHVyZXJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIiB0eXBlPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGVkIiB0eXBlPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUHJvZHVjdElkZW50aWZpY2F0aW9uQXNzaWduZWRCeVRoZU1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdQYWNrYWdlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0YXRpb25Bc3NvY2lhdGlvblByb3ByaWV0YXJ5UmlnaHRzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGlvbk1ldGhvZG9sb2d5SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVJU0JOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkRlbnRhbEFzc29jaWF0aW9uQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNBc3NlbWJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc1BhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkNvbXBsZXRpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbFByb2R1Y3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUk5JQ1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseUxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb3J0YWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRQYXJ0c0xpc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRpY1RyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV4aWxpYXJ5VHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGxhcnlUcmFuc21pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVSYXRpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyLUNvZGVkU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNvbW1vbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxib2FyZHNDb21tZXJjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQ3JlZGl0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFN1Ymdyb3VwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluZGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kT3JMYWJlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUHJpY2VPcGluaW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzQm9keVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJHcm91bmRTaGFkZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhdGFsb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNFbmRQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNFbmdpbmVlcmluZ0NoYW5nZUxldmVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJbnRlcm5hbFByb2R1Y3RHcm91cENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1F1YWxpZmllckZvclNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1NpemVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTdHlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU3VibGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBR0VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGVPaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJ5LU92ZXJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFubmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEFic3RyYWN0U2VydmljZVJlZ2lzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZkNvbnRyYWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFSUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZ25pemFuY2VTeW1ib2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGRSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWROQ0NNQU9yQmFua1NlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZUZvclVuaWZvcm1TZWN1cml0eUlkZW50aWZpY2F0aW9uUHJvY2VkdXJlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlHcm91cGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uTGFuZ3VhZ2VFcXVpcG1lbnRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkVW5pdFRyYWluTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55UGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGF0aWJsZUN1dE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uQWxsb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXB0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlndXJhdGlvbkl0ZW1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0b3JUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWN0aXZpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJyZWFrZG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDaGFuZ2VBdXRob3JpemF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JFc3RhYmxpc2htZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUcmFuc2ZlclJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlGcm9tV2hpY2hQcm9jdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uRmFtaWx5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZVJpc2tUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb21wYW55UmVnaXN0cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUHJvdmlkZWRFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRmFtaWx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNDb2RlUG9pbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGllTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb250aW51ZWRQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudEdyb3VwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aWRlbmRVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdVUENDb25zdW1lclBhY2thZ2VDb2RlMS00LTYtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1VQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi00LTYtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldFN0YW5kYXJkUHJvZHVjdEFuZFNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTjItNS01LTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTi05OUluLVN0b3JlQ291cG9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZC1JdGVtRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZURpc3BsYWNlbWVudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZUxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvZGVQZXJDT1BBU1N0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRIaWVyYXJjaGljYWxTZXF1ZW5jZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZWRQYXJ0T3JBc3NlbWJseU9yUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdElkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRMaW5lSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5kYWJsZUNvbnRhaW5lcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFBU2VydmljZUJ1bGxldGluTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNQaWVjZXNQZXJSb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRTdWJhc3NlbWJseU1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRTdWJhc3NlbWJseVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlQWZmb3JkYWJsZUxlbmRpbmdQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlUHJvamVjdENvbmRvbWluaXVtQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5Q2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZnRoV2hlZWxTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsVGVzdExvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGhhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaExvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPckhhbmRTdGFuZGFyZFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZVB1bXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHJpb3JJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQdWJsaXNoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNBZmZvcmRhYmxlTGVuZGluZ1Byb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjUHJvamVjdENvbmRvbWluaXVtQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGUtUmVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlRHJpdmVuU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVOb25Ecml2ZW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFRhbmtTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRBYmJyZXZpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kU3ViLUFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQVNGTE9XSW52b2ljZVBvc3RpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQVNGTE9XUHJvZHVjdG9yU2VydmljZUNoYXJnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGhlcmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VhclJhdGlvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJpY05hbWVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xpZGVyS2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5EaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBoaWNzSW5kdXN0cnlCYXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmRTaGFkZVN0YW5kYXJkUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbmlzZWRTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhDUENTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDLUhlYWx0aEluZHVzdHJ5QmFyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQ1N1cHBsaWVyTGFiZWxpbmdTdGFuZGFyZFByaW1hcnlEYXRhTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElFQ1Byb2R1Y3RPclNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3RSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0QtOS1DTS1Qcm9jZWR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklnbml0aW9uS2V5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXByaW50LVRyYWRlbWFya0NvZGVPZlN1YnNpZGlhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5Q29tbW9kaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25NZWRpYVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ3JlZGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYW5EZXNjcmlwdGlvbkNoYXJhY3RlcmlzdGljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlcnNGdW5kQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VhYmlsaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpb3JDb2xvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBcnRpY2xlTnVtYmVyaW5nQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRC05LUNNLURpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEhhcm1vbml6ZWRDb21tb2RpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRCb29rTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSU1F1YWxpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0JOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1UeXBlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYlNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludExpZmVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25TcGVjaWZpY1Byb2NlZHVyZUFuZFN1cHBseUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5iYW5QbGFuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5U2FtcGxlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlUZXN0Q29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYnJhcnlPZkNvbmdyZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U2VydmljZUZlYXR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0R2F0ZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFNlcXVlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGx5QXNzaWduZWRDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxPSU5DQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90UHJpY2luZ1VuaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlSW5kZXhQYWdlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvclByb2R1Y3RPck1hdGVyaWFsT3JNYWNoaW5lVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJvZ3JhbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNjaGFyZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVtZW50VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvbkJ1cmVhdUF1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc0NvdmVyYWdlQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc0xldmVsQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc1Byb2R1Y3RMaW5lQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRU1BUHJvZHVjdFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RPZkRlbGl2ZXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXN0b25lRXZlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTFNQRUNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUNyZWRpdERhdGFPcmRlclR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlUHJvZHVjdENvZGVPck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VVbmRlcndyaXRpbmdUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVJZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlLUxpbmVEZXNpZ25hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNC00LTJGb3JtYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTMtMkZvcm1hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtNC0xRm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS00LTJGb3JtYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZUluNC02Rm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZUluNS01Rm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb2R1Y3RHcm91cENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvbkNvbG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uU2l6ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5EQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWljcm9jb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdSZXBsYWNlbWVudFBhcnRPckFzc2VtYmx5RGVmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SGlnaGVyQXNzZW1ibHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRIaWdoZXJVc2VkQXNzZW1ibHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmZvcmZlaXR1cmVPcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNhbGVhYmxlSXRlbUV4Y2x1ZGluZ0RlcG9zaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5TTi1Ob3J0aEF0bGFudGljVHJlYXR5T3JnYW5pemF0aW9uU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VQkNVQjgyQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VQkNVQjkyQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUG9zaXRpb25zT25NYWNoaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZVBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRNaWNyb2NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOQ2FzZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOQ29uc3VtZXJQYWNrYWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5Nb2R1bGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTk11bHRpcGFja0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQXNzaWduZWRQcm9wZXJ0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHBvc2l0ZS1IYW5kUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbENhYmxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5UHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRXF1aXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUHJvZHVjdGlvbk9wZXJhdGlvblNoZWV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0RyYXdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnREcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHRlcm5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NDRUMtR29vZHNBbmRTZXJ2aWNlc1RheEZvcndhcmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ0NFQy1Hb29kc0FuZFNlcnZpY2VzVGF4Tm90QXBwbGljYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQy1Ob25UdWJ1bGFyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ09NQy1Hb29kc0FuZFNlcnZpY2VzVGF4Rm9yd2FyZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDT01DLUdvb2RzQW5kU2VydmljZXNUYXhOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1BY2NvdW50YW50c1NvY2lldHlPZkNhbmFkYVR1YnVsYXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzSW5Sb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWdneWJhY2tDb21tZXJjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVRyYW5zYWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50RXF1aXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZE5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1SYXRlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NhbXBsZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxvb2tVcE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRDb2xvclN0YW5kYXJkUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludE9yRHJhd2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE9yU2VydmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlTm90aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RJZEF0dHJpYnV0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFZlcnNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtRGVzY3JpcHRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsVmFyaWFudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlBbmRDYXN1YWx0eVNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc0l0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzT3JkZXJMaW5lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJwb3NlT2ZJbnN1cmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlhdG9yU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZC1Pd25lZFVuaXRUcmFpbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZG9tV2VpZ2h0QWdncmVnYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlRGV0YWlsQ2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5SW5mb3JtYXRpb25TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZUV4dGVuZGVkVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZUZyb250UmVhckRyaXZlblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVNaWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUHVzaGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVJlYXJEcml2ZW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUmVhck5vbkRyaXZlblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblByb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEtlZXBpbmdPck1vZGVsWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlT2lsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVkUHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE1vZGVsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFBvbGljeUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVZhbHVlVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlnaW91c1JldGFpbE5vbi1Cb29rSXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRnJvbVByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJJbmR1Y3Rpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJUYWdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnROYXRpb25hbFN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFByb2R1Y3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50U3ViYXNzZW1ibHlNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRTdWJhc3NlbWJseVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFBMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSU0tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcmVzZW50YXRpb25JRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlbWF0aWNEaWFncmFtUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0U2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFByaW9ySWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblByaW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbEl0ZW1BbmRDb250cmlidXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmllc0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb2RlUGVyQ09QQVNTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyb2xJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZlYXR1cmVJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlbmRlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPclBheW91dE9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUFjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdFdvcmtlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZVVwT3JTaWRlRG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTS1UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYWJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWVwZXJCb3hLZXlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWVwZXJCb3hTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOT01FRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVSZXZpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEZXBvc2l0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU0NDLTE4QW5kQXBwbGljYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VwT2ZQcm9kdWN0cy1NaXhlZEFzc29ydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMYWJlbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FtcGxlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJ0b3BpY0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZFB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQnJhbmRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckNvbXBhbnlSZWdpc3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQXJ0aWNsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3VwcGxpZXJBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW50aGV0aWNMdWJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUNUQ29tbW9kaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsTWFudWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUGhhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0NpcmN1aXRJZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnlTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbVNlcnZpY2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVJbmR1c3RyeU1hbnVmYWN0dXJlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RlZE1hdGVyaWFsSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQcmlvcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVDb21wbGlhbnRUZWNobmljYWxPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BpY0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUluSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJDYXNlU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZUFuZEJhbmtTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrQm9keVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVNlbHZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDQ09yRUFOLTEyOENvdXBvbkV4dGVuZGVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nTWV0aG9kT2ZEaXJlY3RXcml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1TdG9ja1N5bWJvbFN5c3RlbUNvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFByb2R1Y3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOTnVtYmVyRGFuZ2Vyb3VzR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0Nhc2VDb2RlTnVtYmVyMS0xLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNS01Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb25zdW1lclBhY2thZ2VDb2RlMS01LTUtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ291cG9uQ29kZTEtNS01LTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ2FzZUNvZGUyLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Db25zdW1lclBhY2thZ2VDb2RlMi01LTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ291cG9uQ29kZTItNS01Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTk1vZHVsZUNvZGUyLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5NdWx0aXBhY2tDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTlNoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi01LTUtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTdWZmaXgtRGVmaW5lc1BhY2tpbmdWYXJpYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VyLURlZmluZWRTaGlwcGluZ0NvbnRhaW5lcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVWTVJQTUxpbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVVk1VTGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVNZWFzdXJlUHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcnlJdGVtUHJvZHVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU1haW50ZW5hbmNlUmVwb3J0aW5nU3RhbmRhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JBbHBoYW51bWVyaWNTaXplQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29sb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckdyb3VuZFNoYWRlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9ySXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0NhdGFsb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0Jhc2ljVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0VuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1N0eWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzU3VwcGxlbWVudGFsSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmludGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVUeXBlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVVc2FnZUlkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FmZXJMb3RJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVlbENoYWlyTGlmdFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbGVuQ3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sZW5SdW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUYXNrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ybGRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQtRW5nbGlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50LU1ldHJpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50V29yc3RlZCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIgdHlwZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZWQiIHR5cGU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZWQiIHR5cGU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIgdHlwZT0iSXRlbUNoYXJhY3RlcmlzdGljIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsU2VjdG9yaWFsQ2hhcmFjdGVyaXN0aWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZUNsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxveSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hdG9taWNhbE9yaWdpbk9mU2FtcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5UmVxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZU91dEFydGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0U2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVoaW5kLXRoZS1Db3VudGVyRHJ1Z3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUJyYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNvbnRhaW5lckNoYXJhY3RlcmlzdGljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VGbGF2b3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZVNlZ21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbWhvbGVMb2NhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9taG9sZVByZXNzdXJlTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZEdyb3VwLUFHcm91cGluZ09mU2ltaWxhckJyYW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1b2ZBbGNvaG9sVG9iYWNjb0FuZEZpcmVhcm1zQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVPZkFsY29ob2xUb2JhY2NvQW5kRmlyZWFybXNUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29sb3JEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbVNpemVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nLUxpbmVyLVR1YmluZ1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ09yTGluZXJUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxGYW1pbHlOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRC1Db21tZXJjaWFsSXRlbURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3lzdGVtTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvci1Mb3dlckJvZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yLVVwcGVyQm9keSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uQ2hlbWljYWxOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55RmllbGRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWFibGVSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xJdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczNOYXJjb3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczNOTm9uLW5hcmNvdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGVEZXNjcmlwdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jyb3Npb25SZXNpc3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VwbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFydGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBcnRpY2xlU3BhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3BlY2lmaWNhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUZhdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3Rpb25hbEluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGVyc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zYWdlRm9ybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VmZmljYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRWZmaWNhY3lTdHVkeUltcGxlbWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGdlVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNhbGx5Q2xlYW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0ZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRzLVNsaXR0aW5nLVNwbGl0dGluZy1DdXR0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRUcmVhdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZXdpdGhUcmFuc21pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5Db21tdW5pdHlSaXNrQ2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVBbmFseXNpc1Byb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRFNQRUMtRmVkZXJhbFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRC1TVEQtRmVkZXJhbFN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicmVUb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkQ29kZS1FSUFPckRPRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRUZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9yU3VyZmFjZVJvdWdobmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbHVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sZENvbmZpZ3VyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0RGV2aWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtdWxhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFncmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxQZXJmb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVydGhlcklkZW50aWZ5aW5nQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUHJvZHVjdEZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyaWNEcnVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwZVZhcmlldHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRSYXRpbmdTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEFuZEJlYXV0eUFpZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRUcmVhdE9yQW5uZWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXVsaWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdyZWRpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU2FtcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmplY3RhYmxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5LVdvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJEb3VibGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJPdmVydGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZE9yQ29wcGVyU2FtcGxlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VkUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0aW5nT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVSdW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0U2VnbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3RhdHVzLU91dHNpZGVQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxsb2dyYXBoaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTFNQRUMtTWlsaXRhcnlTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVNCTE0tSW5kaWFuTGFuZFByb3BlcnR5T3JVbml0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktTWVkaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11c2ljU3R5bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dHVhbGx5RGVmaW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhhemFyZG91c01hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlc2NyaXB0aW9uRHJ1ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmVjdXJyaW5nUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51dHJpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jzb2xldGVBcnRpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZG9yaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGlyZWN0UmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGh5c2ljYWxEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlci10aGUtQ291bnRlckRydWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VJbnRlZ3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0dGVybiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZU9mQWxjb2hvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25Db250aW51aXR5SW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvbkludGVydmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1BZXJvc29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQXNEaWx1dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQ29uY2VudHJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1FbXVsc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUdhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUxpcXVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVBvd2RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVNlbWlzb2xpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVNvbGlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlQ291cGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU3RyZWFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjYXV0aW9uYXJ5SW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25EcnVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25FZmZlY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUdyYXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludE9yaWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTGFiZWxOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzQWN0aW9uVGFrZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NPclByb2R1Y3Rpb25Vbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0QXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRhQmFzZU1hbmFnZW1lbnREZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpZmVDeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFN1YmplY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsRXZlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsT2ZmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyZUZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1dC11cERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5LVF1YWxpdHlMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkaW5nTWVkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXJiaXNoZWRBcnRpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5T3JTdGF0ZURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5LVN0YXRlT3JFbnRpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3RhdGVkQXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0aW9uUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXJDb2RlLUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdHNNZXRob2RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZERlc2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPZkFkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlHcmFwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0T3JDb25maWRlbnRpYWxJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblByb2ZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmllc1RpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRmVhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZUYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nVW5pdENvbXBvbmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvTGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGhvdWV0dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlHb3Zlcm5tZW50QW5kT3JDdXN0b21lclNwZWNpZmljYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2x1YmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb250cm9sbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQW5kRGlzcGxheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVByb2R1Y3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VMb2NhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVByb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VUcmVhdG1lbnQtQ2hlbWljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VUcmVhdG1lbnQtTWVjaGFuaWNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lub255bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nQW5kSW5zcGVjdGlvbkFnZW5jaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGFuZWxUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsV2VpZ2h0Rm9ybXVsYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNFcXVpdmFsZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVJbnN1cmFuY2VGb3JtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNsYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd2lzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFuZE9yUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZWZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlNhbXBsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mVGVzdC1JbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlU3Bpbm5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbG9yRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclNpemVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmludGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzdWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2xhdGlsZU9yZ2FuaWNDb21wb3VuZENvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVRpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eVR5cGVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGRzT3JTcGxpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxEaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQZXJmb3JhdGlvbkNvbnRpbnVpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQZXJmb3JhdGlvbkludGVydmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsVGVzdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmRpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVGcnVpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUdyb3dpbmdSZWdpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPZkNhYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsYXRlcmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9sc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90aFNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdIZWFkRmxhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5lckRpYWdvbmFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlRW5kT3ZlcmhhbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1UYXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxGdWVsVGFua1Bvc2l0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZXJpb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udFNwYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZUxlZnRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVSaWdodFJlYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWxseUJ1c2hpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRGcm9udCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdFJlYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NDcml0aWNhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcmVDcml0aWNhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVsYXRpdmVQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVTaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wcG9zaXRlQ29ybmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUxlZnRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUmlnaHRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyU3BhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb241Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb242Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb245Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0RnJvbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0UmVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZU9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZVR3byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUVuZE92ZXJoYW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2x1YmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFyZVRpcmVQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcmJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1Y2NvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQm90dG9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEJ1Y2NhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoRGlzdGFsU3VyZmFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhGYWNpYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEluY2lzYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aExpbmd1YWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aE1lc2lhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoT2NjbHVzYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3b1NpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlckNhYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pbGF0ZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtVGFwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXRlZ29yeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRlZ29yeUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcnkiIHR5cGU9IkNhdGVnb3J5Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdGFuZGFyZENhdGVnb3J5SUQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb25JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVjaG5pY2FsSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIgdHlwZT0iU3RhbmRhcmRDYXRlZ29yeUlEIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZRdWFudGl0eUNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJRdWFudGl0eUNvZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZRdWFudGl0eUNvZGVkIiB0eXBlPSJMaXN0T2ZRdWFudGl0eUNvZGVkIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eUNvZGVkIj4KKyAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KKyAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IlF1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlZCIgdHlwZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlDb2RlZCIgdHlwZT0iUXVhbnRpdHlDb2RlZCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhYmxlVW5zZXJ2aWNlYWJsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVBdmVyYWdlT3ZlcmR1ZURheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUGxhY2VkRm9yQ29sbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUFjY291bnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUNvbnRyYWN0c0RlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudERvc2VQZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50RG9zZVBlclVuaXREaXNwZW5zZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaXN0aW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTWFpbnRlbmFuY2VUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3Rpdml0eUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxVbml0c0N1bXVsYXRpdmVUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGVkRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVtYW5kUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQcm9tb3Rpb25TYWxlc0ZvcmVjYXN0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxSZXBsZW5pc2htZW50RGVtYW5kUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxVc2FnZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZENvcnJlY3RvclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRUb0ludmVudG9yeVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VBdERlYXRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkQWN0aXZlTGluZUl0ZW1zRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkTGluZUl0ZW1zQ29tcGxldGVkLUNvbnRyYWN0b3JDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZWRMaW5lSXRlbXNEZWxpbnF1ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VIaWdoVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZUxvd1ZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VNb2RpZnlpbmdVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTmVhcmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTmV4dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VPZkZpbmFuY2lhbEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2dyZWdhdGVCZW5lZml0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JpY3VsdHVyYWxXb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdFJhZGlvcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZUF0dGVuZGFudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG9jYXRlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvdHRlZFVzYWdlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsVGltZUJ1eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpc2F0aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXphdGlvbkN1bXVsYXRlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25PcmRlclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25UZXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25Ub3RhbFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpY2lwYXRlZExlbmd0aE9mU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm92YWxPck9mZmVyRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3hpbWF0ZU51bWJlck9mSG9sZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZlVuaXRzRm9yU2FsZVByb2plY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZlVuaXRzUHJvamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhRGFtYWdlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYU9mTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFQZXJVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNJc1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldFNlaXplcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Q29tcGxldGVWYXJpYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRDb21wbGV0aW9uUXVhbnRpdHlFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGVuZGFudC1IYW5kbGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3Jpc2VkU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmV0ZW50aW9uTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVSZXNvdXJjZVRhc2tRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VOdW1iZXJPZkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tvcmRlckxpbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3JkZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua1JlamVjdEl0ZW1Db3VudC4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lQZXRpdGlvbnNGaWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0aHJvb21Db3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmF0aHJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcm9vbUNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRyb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ1NoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nVW5pdFBlclByaWNpbmdVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaXJ0aFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtWb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvb2RSZWNvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tPcmRlclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnNMZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9uc093bmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hPZmZpY2VMb2NhdGlvbnNFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb3RoZXJzRGVjZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb3RoZXJzTGl2aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldEF0Q29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldEN1bXVsYXRpdmVUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldGVkSG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2xhc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlQ2xhc3NJbmNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZUluZHVzdHJ5SW5jaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVOYXRpb25hbEF2ZXJhZ2VJbmNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXl1cE9yQnV5ZG93blJhdGVQZXJCYXNpc1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCeXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YWxDaGFuZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRSZWdpc3RlcmVkTnVyc2VBbmVzdGhldGlzdE51bWJlck9mQ29uY3VycmVudFByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZXNJbkNhcGl0YWxTdHJ1Y3R1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUN1YmljTWVhc3VyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlRGlzdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZUxlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mQXhsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZkNvbnRhaW5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZlBhY2thZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZSYWlsV2Fnb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVUYXJlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXRpbmdPaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0YXRlbWVudEJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdG9ja0JhbGFuY2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28ySW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnN1cmVkLUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJlZC1Fc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdG1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlTZXJ2aWNlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luY2x1ZGVkSW5Db25zb2xpZGF0ZWRGaW5hbmNpYWxTdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbmllc0luY2x1ZGVkSW5Db25zb2xpZGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJblNhbWVBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyaXNvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRDb250cmFjdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZExpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkUHJvamVjdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudE1ldGVyUmVhZGluZ0NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jdXJyZW50SXRlbU91dHB1dE9mVG9vbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWREaXNjb3VudEludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJSZXNlcnZlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YW5jZUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJ1eWRvd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QnV5dXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Q29tcGxldGVkRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdExpbmVJdGVtUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JBdENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQ3VtdWxhdGl2ZVRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RzQ29tcGxldGVkRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RzQ29tcGxldGVkRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25Ub3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxNb2JpbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0aW9uc1NlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2REIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLVZlcmJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLVdyaXR0ZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50ZXJDbGVya3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJzZVNlZ21lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJlZC1BY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWQtRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUJ1ZGdldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUVhcm5lZFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlRWZmZWN0T2ZQcmlvclBlcmlvZEFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVHYXNJbmplY3Rpb25Wb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVHYXNWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVMaXF1aWRJbmplY3Rpb25Wb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVPaWxPckNvbmRlbnNhdGVWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlBY3R1YWxNZWFzdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5T3JkZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlQcmVjZWRpbmdQZXJpb2RNZWFzdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kUmVhY2hlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlY2VpdmVkRW5kT2ZQcmlvclllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvbkNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25QZW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblJlcGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZXF1aXJlZFByaW9yVG9UaGVGaXJzdFNjaGVkdWxlZFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTY2hlZHVsZWRVcFRvQWNjdW11bGF0aW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkTG9uZy1EaXNwb3NpdGlvbkNoYWxsZW5nZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRMb25nLURpc3Bvc2l0aW9uUGVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZFNob3J0LURpc3Bvc2l0aW9uQ2hhbGxlbmdlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZFNob3J0LURpc3Bvc2l0aW9uUGVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVNjaGVkdWxlVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVTY3JhcFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVXYXRlclZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERheXNPbk1hcmtldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aWJsZUJsb29kVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHROb3RpZmljYXRpb25SZXNwb25zZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVncmVlU2VnbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QmF0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QmF0Y2hNdWx0aXBsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlRdWFudGl0eUJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50c0FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50VG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3Ryb3llZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRyaW1lbnRhbExlZ2FsRmlsaW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxMZWdhbEZpbGluZ3NBZ2FpbnN0RGlyZWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lbnNpb25hbFNhbXBsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFNoaXBtZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFdvcmtlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlZXRRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25DcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblBlbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXRlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbC1EaXNwb3NpdGlvblJlcGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zaXRpb25VbmRldGVybWluZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9ySW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0FmZmlsaWF0ZWRDb21wYW5pZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljVXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhZnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZS1JbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYXRpb25JbkN1cnJlbnRKb2IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR3ZWxsaW5nQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlQ3VtdWxhdGl2ZVRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmVkVmFsdWVIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGFwc2VkRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNTaWduYXR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QtQWNjaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kLVNpY2tuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lNb2RpZnlpbmdVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRBdExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEF0VGhpc0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEJ5VGhpc0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUHJvZmVzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRPblRoaXNKb2IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlQXZlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1Ob25vd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTm90SW5jbHVkaW5nT3duZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNOdW1iZXJPZkRheXNBd2F5RnJvbVdvcmtEdWVUb0luanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTnVtYmVyT2ZEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9Jbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1Pd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVBhcnRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtU2FtZUR1dGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVNhbWVPY2N1cGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNTaGFyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc1RvdGFsTnVtYmVyT2ZEYXlzQXdheUZyb21Xb3JrRHVlVG9JbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsRmlyc3RNb250aE9mUXVhcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbFNlY29uZE1vbnRoT2ZRdWFydGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRvdGFsVGhpcmRNb250aE9mUXVhcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZE9mTW9udGhJbnZlbnRvcnlQcmlvclRvU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyZWRTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXR5U2VjdXJpdHlIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlQXRDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRBY2NvdW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQW5udWFsVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWREdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkSG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZWFkaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlbWFpbmluZ0Vjb25vbWljTGlmZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVtYWluaW5nUGh5c2ljYWxMaWZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRUb3RhbEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhcG9yYXRlZFdhdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGlzdGVuY2VMaW1pdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5kaXR1cmVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRUZXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYVVucGxhbm5lZERlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnk0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZFBheW1lbnRNYW5kYXRlLUNhdGVnb3J5NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFBlbnNpb25NYW5kYXRlLUNhdGVnb3J5NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZFdvcmtlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVTaXplQWZ0ZXJDb21wcmVzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZVNpemVCZWZvcmVDb21wcmVzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxEZWxpdmVyeVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDb3ZlcmFnZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPZmZzZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFyZU9yRmxhc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYVByZW1pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JzT2NjdXBpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdEF0Q29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0ZWRTY2FubmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0VG9Db21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlbGF0ZWRFbnRpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZW1lbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRmxvYXQtSW5DYWxlbmRhclVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlRmxvYXRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZWxhbmNlRGVidENvbGxlY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVsYW5jZVNhbGVzcGVyc29ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVF1YW50aXR5SW5jbHVkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVRdWFudGl0eU5vdEluY2x1ZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxDb25zdW1lZE9yQnVybmVkQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsUHVtcHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxCYXRocyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbEdyb3VwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbFNhbXBsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXJuaXNoZWRCbG9vZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VPckNhcnBvcnRBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNJbmplY3Rpb25Wb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0xpZnRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JlY2VpcHRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JldHVybmVkVG9FYXJ0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzUmV0dXJuZWRUb1Byb3BlcnR5Rm9yRnVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU2hyaW5rYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNTb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yRHJpbGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1VzZWRGb3JGdWVsU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yUGxhbnRGdWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yUmVwcmVzc3VyaW5nT3JQcmVzc3VyZU1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkT25Qcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVmVudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxFbGltaW5hdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlcG9ydGluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZVRyYW5zZmVyQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0FubnVhbEluY29tZU11bHRpcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzQnVpbGRpbmdBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0VzdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpdmluZ0FyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzTGl2aW5nRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1JlbnRNdWx0aXBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlQnV5dXBNYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVSYXRlQWZ0ZXJBbHRlcm5hdGVQYXltZW50TWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyYW50ZWVGZWVSYXRlQWZ0ZXJCdXl1cE9yQnV5ZG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvbkF1dGhvcml6YXRpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkaW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdE9yVHlwZUZseWluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnNGbG93bi1BaXJjcmFmdFR5cGVPckxpZmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRUeXBlT3JQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tTGlmZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tVHlwZUZseWluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWlybWVudER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhaXJtZW50RnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNyZW1lbnRhbE9yZGVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGlyZWN0RW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeUJ1c2luZXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uUHJvdmlkZXJTdGFuZGFyZGl6ZWRNb3RvclZlaGljbGVQZW5hbHR5UG9pbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlYWRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGVkQ2FwYWNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxtZW50RnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudFBheW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VmZmljaWVudEZ1bmRzUmV0dXJuZWRDaGVxdWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlbmRlZENoYW5nZVRpbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0Rm9yT3ZlcmRyYXduQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVRlcm1QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydGFua1RyYW5zZmVyQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDYXRlZ29yeVRyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlEaXNjcmVwYW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5TW92ZW1lbnRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5T25TaGVsZldvcmtJblByb2dyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlRdWFudGl0eUF0U3VwcGxpZXJzTm90U3ViamVjdFRvSW5zcGVjdGlvbkJ5Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVF1YW50aXR5QXRTdXBwbGllcnNTdWJqZWN0VG9JbnNwZWN0aW9uQnlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5V2l0aGRyYXdhbFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2x2ZW1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlZFNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmFpbFNlbnRlbmNlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdlbWVudHNSZWdpc3RlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsU3RheUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VySG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhZ1RpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRIb2xkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kU2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RDdW11bGF0aXZlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd1N1aXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VQZXJpb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5ndGhPZlJlc2lkZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxSZXNvdXJjZS1RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxSZXNvdXJjZVRhc2tRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWxzT2NjdXBpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VXaXRoZHJhd2FsRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VXaXRoZHJhd2Fsc1NlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZW5zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVuc1JlZ2lzdGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmV0aW1lQ2FwYWNpdHlPZlRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmUtVGltZVJlc2VydmUtQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZldGltZVJlc2VydmVEYXlzLUFwcGxpZWRUb1RoaXNDbGFpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZS1UaW1lUmVzZXJ2ZS1Fc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbXNDb21wbGV0ZWREZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVUaHJlYWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkSW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXZlc3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmVwYXltZW50VG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NPckdhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RHYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdE9pbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdFdvcmtUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0V29ya1RpbWVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZVVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVSYWRpb3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldFByaWNlQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRjaGluZ0VxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxPbi1Cb2FyZFF1YW50aXR5UHJpb3JUb0xvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1BZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZC1BY2NpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2RBY2NpZGVudFRvQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZC1TaWNrbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2RTaWNrbmVzc1RvQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtRGVsaXZlcnlCYXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUZvcmVjYXN0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1JbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1NYXR1cml0eUV4dGVuc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZFbXBsb3llZXNBdExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZQdXJjaGFzZU9yZGVyc0FsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZlNoaXBtZW50c0FsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcmRlclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUHJvZHVjdGlvbkJhdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUXVhbnRpdHlUb1doaWNoVGF4UmF0ZUFwcGxpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1SZXF1ZXN0YWJsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU2hpcFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RhY2thYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtU3RvY2tMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN1cHBseVF1YW50aXR5U3VwcGxpZXJFbmRvcnNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVRyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pY3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb25EdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyc0luR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NlbmdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U2FsZXNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGlvbkRvbGxhclJvdW5kdGFibGVDcmVkaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQXZlcmFnZVRpbWVSZXF1aXJlbWVudFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQ29udHJhY3RRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bURlbGl2ZXJ5QmF0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1FbXBsb3llZXNBdExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRmFicmljYXRpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUZvcmVjYXN0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1JbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1OdW1iZXJPZkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUGFja2FnZUxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtT3JkZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVByb2R1Y3Rpb25CYXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVF1YW50aXR5VG9XaGljaFRheFJhdGVBcHBsaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVxdWVzdGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNoaXBRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVN0b2NrTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1UcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9iaWxlTG9hZGluZ0FsbG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsT3JUYXJnZXRTdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlUG9vbENvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQnVzaW5lc3NGYWlsdXJlSW5jaWRlbmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRRdWFudGl0eURlY3JlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRRdWFudGl0eUluY3JlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRUb1BheUl0ZW1Db3VudC4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vRGVsaXZlcnlSZXF1aXJlbWVudEluVGhpc0luc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQmlsbGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29tbWl0dGVkSW52ZW50b3J5T25TaGVsZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29uZm9ybWFuY2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnNvbGlkYXRlZFRvdGFsLURvbWVzdGljU3Vic2lkaWFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29uc29saWRhdGVkVG90YWwtRm9yZWlnblN1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY292ZXJlZC1BY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db3ZlcmVkLUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLURvbWVzdGljU3RvY2tob2xkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25leGNsdXNpdmVVc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVW5pb25FbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1VcmdlbnREZWxpdmVyeVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsUmVhZGluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZXBsYWNlZEJsb29kVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQWNjb3VudHNQYXN0RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFjdGl2ZUFjY291bnRzVGhpc0N5Y2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFkZGVkTG9jYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFkanVzdG1lbnRQZXJpb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkF0dGFja3NPck9jY3VycmVuY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkJhdGNoZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQm9ycm93ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNhcmRzTm90UmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2FyZHNPdXRzdGFuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDaGVja3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2xhaW1hbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNsb3NlZExvY2F0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDby1JbnN1cmFuY2VEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNvcGllc09mQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNyZXciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGF5c0NvdmVyZWRCeUludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlbGlucXVlbnRJbnN0YWxsbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVsaXZlcmllc1BlckRlc3BhdGNoUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlcGVuZGVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRW5kVXNlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRW50aXRsZWRFeGVtcHRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkZhaWxlZEJ1c2luZXNzZXNPZkRpcmVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGcmFuY2hpc2VlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGdWxsLVRpbWVFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSG9zcGl0YWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZklkZW50aWNhbEhhbmRsaW5nVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSW5zdXJlZExpdmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkludGVyZXN0UGF5bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXJyZWd1bGFySW50ZXJlc3RQYXltZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0F1dGhvcml6ZWRBdFN0b3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zQXV0aG9yaXplZEF0V2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkl0ZW1zSW5TdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMYXRlQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMZXZlbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGltaXRlZFBhcnRuZXJzaGlwU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxpdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMb2FucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMb3N0Q2FyZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTWVtYmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNZXNzYWdlUmVjaXBpZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb250aHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW9ydGdhZ29ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZNb3VsZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTm9uLUNvdmVyZWREYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk5vbnN1ZmZpY2llbnRGdW5kSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlbkFjY291bnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZXJhdGluZ1BlcmlvZHNBdEZhaWx1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mT3BlcmF0b3JDcmVkaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9yaWdpbmFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYWNrYWdlc0luSGFuZGxpbmdVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhc3NlbmdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGF0aWVudEFkbWlzc2lvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGVvcGxlTGl2aW5nQXRSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGh5c2ljaWFucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQcm9kdWNpbmdXZWxsc1JlbWFpbmluZ09uUHJvcGVydHlPckZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlByb2R1Y2luZ1dlbGxzUmVtYWluaW5nT25Sb3lhbHR5QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZRdWFudGl0YXRpdmVJbmNlbnRpdmVTY2hlbWVVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTZXJ2aWNlc09yUHJvY2VkdXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaGVsZkZhY2luZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2hlbGZUYWdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNpZ25lZEJpbGxzT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RvbGVuQ2FyZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU3RvcHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGhlYXRyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGltZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVGltZXNEZXBvcnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUcmFuc3BvcnREb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHMtSG91c2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c0luVGhlRGVwdGhPZkFMYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c0luVGhlV2lkdGhPZkFMYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbnNpZ25lZEJpbGxzT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mV2l0aGhvbGRpbmdFeGVtcHRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJzT2ZDb25zdW1lclVuaXRzSW5UaGVUcmFkZWRVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJXZWVrc1BhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2VtSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTaXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VXb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZMZWFzZUZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlByZW1pc2VTYWxlc1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQcmVtaXNlc1NhbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxDb25kZW5zYXRlU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQ29uZGVuc2F0ZVVzZWRPblByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxPckNvbmRlbnNhdGVWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFNlZGltZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFRoZWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhhbmRBbmREdWUtSW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSG9sZEZvclNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbk9yZGVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUHJlbWlzZVNhbGVzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUHJlbWlzZXNTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ1N0YXRlbWVudEJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdTdG9ja0JhbGFuY2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdCZWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdEaXZpc2lvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yc1dvcmtpbmdJbnRlcmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1hbFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJRdWFudGl0eU11bHRpcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2FuVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQYXltZW50SXRlbUNvdW50LiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxUZXJtSW5ZZWFycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR2FzRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck1pc2NlbGxhbmVvdXNEaXNwb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJPaWxDb25kZW5zYXRlRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRQYXJ0aWNpcGFudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRTdG9ja2hvbGRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyV2FyUmVzZXJ2ZU1hdGVyaWFsUmVxdWlyZW1lbnRzUHJvdGVjdGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXRlckRpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRsaWVyRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZJbnZlbnRvcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c3RhbmRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c3RhbmRpbmdTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1UdXJuZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmZsb3dRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlclNoaXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNFcXVpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENoYW5nZUFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bk9jY3VwYXRpb25RdWFsaWZpY2F0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5Db21tb25TaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5QcmVmZXJyZWRTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtSW5TZWN1cml0eVNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFya2luZ1NwYWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEJhdGhzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGFudFRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW9uU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFRpbWVFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3REdWVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRDYW5jZWxsYXRpb25JdGVtQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdXJhdGlvbldlZWtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RXhwZXJpZW5jZXNJblRoZUxhc3QxMk1vbnRocyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEV4cGVyaWVuY2VzSW5UaGVMYXN0M01vbnRocyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyc0ZpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50c051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZU9mT3JkZXJlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY0NhcGFjaXR5T2ZUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPZkVtcGxveW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5TWVhc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5UGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kUXVhbnRpdHlSZWFjaGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzaXN0ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0aXRpb25zRmlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsU3RhdHVzSWlpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c0l2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzRGVsaXZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxmZXJhZ2VHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZUFkanVzdG1lbnRPckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpdHRlZFdhdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRQZXJpb2RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmVkVW5pdERldmVsb3BtZW50VW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50U2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRXb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybUNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0YWJsZVJhZGlvcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGVkVGVsZXBob25lTGluZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtT3BEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3VsdHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkb21pbmF0ZUFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLU9wRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFF1YW50aXR5Tm90U2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZFF1YW50aXR5U2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLVByb2R1Y3Rpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25Eb3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkVmZmVjdGl2ZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnRpYWxWb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3N1cmVCYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0JlbmVmaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0N1bXVsYXRpdmVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNIaWdoZXN0Q3VtdWxhdGl2ZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5QW1vcnRpc2VkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTW9udGhzVXNhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZBY2NvdW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkJyYW5jaExvY2F0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOdW1iZXJPZkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNPcmRlclF1YW50aXR5VG9CZUNhbmNlbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNXZWVrUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQnJlYWtGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNpbmdVbml0UGVyQmlsbGluZ1VuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlNYW5hZ2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU1ldGVyUmVhZGluZ1ZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TmV0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbHNJbmNsdWRlZEFzRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckN1bXVsYXRpdmVJbWJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yVW5pdHNBY2NlcHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvYmF0aW9uRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2luZ1dlbGxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RXhjaGFuZ2VBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25SZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25Xb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2FsZXNBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3NvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkQXZhaWxhYmxlSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGhhc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0c0luUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFVuaXRzU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVzdGVkQmlsbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY2F0aW9uVHVyblNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT2ZQcm9kdWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZpY2F0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZ5aW5nV2Vla3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlDb250cm9sRmFpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbEhlbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXRhdGl2ZUluY2VudGl2ZVNjaGVtZUJhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QWR2aXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBcHByb3ZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdDEwMFBjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVGb3JSZXR1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlRm9yU2FsZS1TdG9ja1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZU9uU2hlbGYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXdhaXRpbmdEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlCeVBvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUNhbmNlbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlDYXJyaWVkRm9yd2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEZWZlcnJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEZWxpdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzYXBwcm92ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGlzcGVuc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc3BsYXllZE5vdEF2YWlsYWJsZUZvclNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RWFybmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUhlbGRCeURlbGl2ZXJ5VmVoaWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlMb2dpc3RpY1NlcnZpY2VQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlSZXRhaWxPdXRsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5GbG9hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJbkhvbGRPdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5NYW51ZmFjdHVyaW5nUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblBoeXNpY2FsSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluUXVhcmFudGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TGFuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUxvYWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlNYW5pZmVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU5vdEF2YWlsYWJsZUZvckRlc3BhdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9mRGVhbGVyTGljZW5zZVBsYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPZk1hdGVyaWFsSW5PcmRlcmVkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPbkhhbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T25Ib2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlck5leHRIaWdoZXJBc3NlbWJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJQYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclNraWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyVW5pdE9mSXNzdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVtYWluaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmVtZW50Rm9yTWFpbnRlbmFuY2VBbmRSZXBhaXJPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJlbWVudEZvclNhbXBsZUluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyaW5nTWFuaXB1bGF0aW9uQmVmb3JlRGVzcGF0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmV0dXJuZWREZWZlY3RpdmVPckRhbWFnZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNlcnZpY2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U29sZE5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXNwZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VG9CZURlbGl2ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlVc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVdpdGhkcmF3biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlXaXRoaGVsZEJ5T3duZXJPZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVF1YW50aXR5T25JbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlQXZlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VNYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU1pbmltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVQZXJEYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEFuZEFjY2VwdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZE5vdEFjY2VwdGVkVG9CZURlc3Ryb3llZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROb3RBY2NlcHRlZFRvQmVSZXR1cm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kZWRNYWludGVuYW5jZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbW1lbmRlZE92ZXJoYXVsQW5kUmVwYWlyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lkZXJhdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeUFmdGVyUG9zdFByb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmlsbHNBdXRob3JpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnJhbmRzRGlzdHJpYnV0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCcmFuZHNNYW51ZmFjdHVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkUmV0dXJuUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRCdXNpbmVzc0VudGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkRW50aXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aW9uc2hpcER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZXNFbXBsb3llZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nQXV0aG9yaXplZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlb3JkZXJpbmdMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVvcmRlclBvaW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZEJsb29kVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxlbmlzaG1lbnRPdmVycmlkZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydERpZmZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGVkRGVmaWNpZW5jaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50UXVhbnRpdHlUaGF0V2FzUHJldmlvdXNseVJlbGVhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXNpdGlvbmluZ09iamVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eUN1c3RvbWVyRGlyZWN0RGVsaXZlcnlTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZXJ2ZWRRdWFudGl0eVJldGFpbFNhbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2UtUXVhbnRpdHktQXZhaWxhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0aW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0aW9uRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFNhbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRCeUNvbnN1bWVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5zUmVwbGFjZW1lbnRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbUNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb29tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNwZXJzb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1F1YW50aXR5Tm90SW5jbHVkZWRJblRoZVJlcGxlbmlzaG1lbnRDYWxjdWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNRdWFudGl0eVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhdHRlcmVkVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwQWxsb3dlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NyYXBRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeU5ldFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkQ2hhcmdlc1JlZ2lzdGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXRpZXNTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlZ21lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXJzSG9sZGluZ1JlbWFpbmRlck9mU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc0FkZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNEZWxldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNIZWxkQXNUcmVhc3VyeVN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPZkNvbW1vblN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPZlByZWZlcnJlZFN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPd25lZEJ5SW4tU3RhdGVSZXNpZGVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc093bmVkQnlPdXQtT2YtU3RhdGVSZXNpZGVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc1N1YnNjcmliZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlc1N1YnNjcmliZWRCdXROb3RJc3N1ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90aWNlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0LUxhbmRlZEdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydFNoaXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGVudFBhcnRuZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5jZUxhc3RUcmF2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZURlbGl2ZXJ5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpc3RlcnNEZWNlYXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lzdGVyc0xpdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2l6ZU9mSG91c2Vob2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkV29ya2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzVXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydGVkUXVhbnRpdHlSZWplY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2VPY2N1cGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhcnRuZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVlZENhcGFjaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdFNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRPZmZzZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jZU1vdG9yVmVoaWNsZVBlbmFsdHlQb2ludHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsU2FsZXNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tUcmFuc2ZlcnNJbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tUcmFuc2ZlcnNPdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2xlbkNoZXF1ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JBdENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yQ3VtdWxhdGl2ZVRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlZFF1YW50aXR5UmV0dXJuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlZFF1YW50aXR5U29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2VxdWVudERlbGl2ZXJ5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0aW9uYWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckVzdGltYXRlZExhdGVzdE1ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJFc3RpbWF0ZWRQcmV2aW91c01ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJMYXRlc3RNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyUHJldmlvdXNNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJwbHVzR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnZleXNJbkF2ZXJhZ2VSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1c3BlbmRlZER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTd2FuLUdhbnoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhYmxlc0F2YWlsYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFsa1BhdGhzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZMb3NzQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYWNoZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljaWFucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyTm9uLVJlY3VycmluZ0RlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFF1YXJ0ZXJSZWN1cnJpbmdPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVFeHBlbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUZyYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5Db3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5Qb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlSG9zcGl0YWxpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0QXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RDaXZpbGlhbkZsaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdEluc3VyYW5jZU1lZGljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RNaWxpdGFyeUZsaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTWVkaWNhbENvbnN1bHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYXRpb25FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYXRpb25TdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlT25zZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZVN1cmdlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZVRyaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzS25vd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c1BlclNoaWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNTcGVudE9uRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvQ29tcGxldGVRdWFudGl0eUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sZXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBZGp1c3RtZW50c1ZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBbW9ydGlzYXRpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBdENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEF1dGhvcml6ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxCZWdpbm5pbmdJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zQXNzb2NpYXRlZFdpdGhSZXBlYXRlZFRyYXVtYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRGlzb3JkZXJzRHVlVG9QaHlzaWNhbEFnZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoRHVzdERpc2Vhc2VzT2ZUaGVMdW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRob3V0RGF5c0F3YXlGcm9tV29ya0FuZFdpdGhvdXRSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhQb2lzb25pbmdJbGxuZXNzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFJlc3BpcmF0b3J5Q29uZGl0aW9uc0R1ZVRvVG94aWNBZ2VudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aFNraW5EaXNlYXNlc09yRGlzb3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZERvbWVzdGljU3Vic2lkaWFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZEZvcmVpZ25TdWJzaWRpYXJpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ29uc29saWRhdGVkU3Vic2lkaWFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c0FjY2VwdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrRHVlVG9JbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmtEdWVUb0luanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPZlJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0lsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09uTWFya2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNXaXRoUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSW5qdXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoQ2xhaW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYXRoc0FzQVJlc3VsdE9mSWxsbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aHNBc0FSZXN1bHRPZkluanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWJpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVsaXZlcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZW1hbmRPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVtYW5kUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEVuZGluZ0ludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxGbG9hdFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR2FzRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsR2FzSW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRoRGF5c0F3YXlGcm9tV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aE9jY3VwYXRpb25hbElsbG5lc3Nlc05vdE90aGVyd2lzZUNsYXNzaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhvdXRMb3N0V29ya0RheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc1dpdGhMb3N0V29ya0RheXNPclJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmtPclJlc3RyaWN0ZWRXb3JrQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW5qdXJ5Q2xhaW1zV2l0aG91dExvc3RXb3JrRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTm9uLUNvbnNvbGlkYXRlZFN1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkNvbnZpY3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRG9tZXN0aWNTdWJzaWRpYXJpZXNJbmNsdWRlZEluRmluYW5jaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRG9tZXN0aWNTdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRm9yZWlnblN1YnNpZGlhcmllc0luY2x1ZGVkSW5GaW5hbmNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZGb3JlaWduU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkxvYW5EZXRhaWxSZWNvcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mTW9ydGdhZ2VlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlBhcmtpbmdTcGFjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZTdWJzaWRpYXJpZXNOb3RJbmNsdWRlZEluVGhlRmluYW5jaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZVbml0c0ZvclNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uQ29tYmluZWRSZXBvcnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvbkZpcnN0UmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25TdWJzZXF1ZW50UmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZklzc3VhYmxlQXNzZXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9pbEFuZE9yQ29uZGVuc2F0ZURpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9pbEFuZE9yQ29uZGVuc2F0ZUluamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPdGhlclByb3BlcnRpZXNPd25lZEFuZEZpbmFuY2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBheW1lbnRzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUG9zdC1BZHZpY2VzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNBY2NlcHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc1JlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNBY2NlcHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc1JlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJvZHVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcm9wZXJ0aWVzT3duZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUXVhbnRpdHlQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFJlc291cmNlLVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFJvb21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNhbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFNlcnZpY2VCYWNrb3JkZXJRdWFudGl0eUhpZ2hQcmlvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTZXJ2aWNlQmFja29yZGVyUXVhbnRpdHlMb3dQcmlvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGFyZXNPZlN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFN5c3RlbUJhY2tvcmRlclF1YW50aXR5SGlnaFByaW9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFN5c3RlbUJhY2tvcmRlclF1YW50aXR5TG93UHJpb3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRyYW5zYWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxVbmlkZW50aWZpZWRUcmFuc2FjdGlvbnNSZWplY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXYXRlckRpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdhdGVySW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdvcmtlZEJ5QWxsRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFdvcmtpbmdJbnRlcmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVtYXJrUmVwcmVzZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbWFya3NVc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbmVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zYWN0aW9uU2V0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRJblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZE91dFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxGcmVxdWVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbGxpbmdFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1bmtlZENoYW5uZWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFja25vd2xlZGdlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFkanVzdGVkQ29ycmVjdG9yUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb3ZlcmVkQ2hlcXVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvbW1lcmNpYWxDb2RlRmlsaW5ncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25FbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c0NvbXBsZXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNGb3JTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1BlclVuaXRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNQcm9kdWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNSZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkTGFzdERheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJEYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyUXVhcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNXb3JrZWRQZXJXZWVrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2FsZWFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zb2xkUXVhbnRpdHlIZWxkQnlXaG9sZXNhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnRpbE5leHRUcmF2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudXNhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudXNlZEFjY3VtdWxhdGVkU2lja0RheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVudmVyaWZpZWRSZWNlaXB0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJnZW50RGVsaXZlcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZFeHRyYWNvcnBvcmVhbENpcmN1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cGVyYmFyaWNQcmVzc3VyaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBlcnRlbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwb3RlbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwb3RoZXJtaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY2FuY2llcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhbmNlQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWN1bGFyUmFkaW9zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmllZFJlY2VpcHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNpdGF0aW9uRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXNpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvaWNlU3RvcmFnZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2lkVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVNocmlua2FnZUFkanVzdG1lbnRPckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGluZ1NoYXJlc0hlbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlU2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F0ZXJSZS1JbmplY3RlZE9uUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWVrc1dvcmtlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDaGFuZ2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodEdhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodExvc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXJUb1dob2xlc2FsZXJTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lkZUFyZWFUZWxlcGhvbmVTZXJ2aWNlUGVyODAwU2VydmljZVVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrQ2FsZW5kYXJVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0RheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtJblByb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUaW1lVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUaW1lVW5pdHNQZXJTaGlmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzSW5TY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzSW5UaGlzTGluZU9mV29ya09yUHJvZmVzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNPbkpvYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVhcnNSZW1haW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlc1ZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRJbnZlbnRvcnlRdWFudGl0eUF2YWlsYWJsZUZvclNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UGVyaW9kSW1iYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2VydmljZUxpZmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTaGFyZUJhbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyRXN0aW1hdGVkTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVzdGltYXRlZFByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlYWRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlBZGp1c3RtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFpbHlBdmVyYWdlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5V29ya1NoaWZ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZEdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhU3RvcmFnZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzT3BlcmF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNQcm9kdWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c1N1cHBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViZW50dXJlQm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViZW50dXJlc0ZpbGVkQWdhaW5zdERpcmVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidENvbGxlY3RvcnMiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhdGFsb2dSZWZlcmVuY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGFsb2dVUkwiIHR5cGU9InhzZDphbnlVUkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhdGFsb2dJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0l0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSIgdHlwZT0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250cmFjdEl0ZW0iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRyYWN0SXRlbSIgdHlwZT0iTGlzdE9mQ29udHJhY3RJdGVtIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdEl0ZW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRyYWN0SXRlbU51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RJdGVtIiB0eXBlPSJDb250cmFjdEl0ZW0iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmRpdGlvbnNPZlNhbGUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNhbGVzUmVxdWlyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uQ29kZWQiIHR5cGU9IlNhbGVzQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvblZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb25kaXRpb25zT2ZTYWxlIiB0eXBlPSJDb25kaXRpb25zT2ZTYWxlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZWQiIHR5cGU9IlNhbGVzUmVxdWlyZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2FsZXNSZXF1aXJlbWVudCIgdHlwZT0iU2FsZXNSZXF1aXJlbWVudCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTYWxlc1JlcXVpcmVtZW50Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZFF1YW50aXR5VG9NYWtlTWluaW11bVdlaWdodFJlcXVpcmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJJZkl0ZW1zQXJlT3V0T2ZTdG9ja09yTm90WWV0UHVibGlzaGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJJZk91dE9mU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPcmRlck9ubHlJZk5ld0l0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZEd1YXJhbnRlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc0FuZExhYm9yU3VycGx1c0FyZWFTZXQtQXNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdFByZXNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWFsUHJvZHVjdEFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1ZGVJbXBvcnRRdW90YUluRmlyc3RDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3J5U2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlZFNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2x1ZGVJbXBvcnRRdW90YUluRmlyc3RDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN1cnBsdXNBcmVhU2V0LUFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXJnZVB1cmNoYXNlU2V0LUFzaWRlRm9yU21hbGxCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF5UHJlc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGkteWVhckF3YXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0JhY2tPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TdWJzdGl0dXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UHJpb3JUb1NoaXBtZW50SWZRdWFudGl0eVNwZWNpZmllZElzTm90QXZhaWxhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblF1YWxpZmllZEJpZGRlcnNMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblF1YWxpZmllZE1hbnVmYWN0dXJlcnNMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkU2FsZXNDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxMYWJvclN1cnBsdXNBcmVhU2V0QXNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0FwcHJvdmVkU291cmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0hpc3RvcmljYWxseUJsYWNrQ29sbGVnZU9yVW5pdmVyc2l0eU9yTWlub3JpdHlJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvSW5kdXN0cmlhbFByZXBhcmVkbmVzc1Byb2dyYW1QYXJ0aWNpcGFudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1F1YWxpZmllZFByb2R1Y3RzTGlzdFByb2R1Y3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9VU0FuZENhbmFkaWFuU291cmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvWW91bmdJbnZlc3RpZ2F0b3JQcm9ncmFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uOGFTZXQtQXNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldC1hc2lkZUZvckFtZXJpY2FuSW5kaWFuLW93bmVkQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBBc1Nvb25Bc1Bvc3NpYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQ29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGdWxsVHJ1Y2tPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwSW4tUGxhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsLUJhbGFuY2VCYWNrT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQmFsYW5jZUNhbmNlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxCYWxhbmNlU3Vic3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxDYXJsb2FkTG90c09ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsSXRlbVF0eVByb3BvcnRpb25hbFRvVG90YWxPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBhcnRpYWxUcnVja2xvYWRMb3RzT25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFBlclJlbGVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJSZWxlYXNlb3JCdXllckF1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzc1dpdGhTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc0NvbnNpZGVyYXRpb25TZXQtQXNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzU2V0LUFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFB1cmNoYXNlU2V0QXNpZGVGb3JTbWFsbEJ1c2luZXNzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUmVtYWluaW5nQmFsYW5jZUNhbmNlbGxhdGlvbkFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUmVtYWluaW5nQmFsYW5jZUNhbmNlbGxhdGlvbk5vdEFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVJdGVtQWxsb3dlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5yZXN0cmljdGVkUHJvY3VyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNhbGVzQWN0aW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEJhbGFuY2VUaGF0RXhjZWVkc1NhbGVzQWN0aW9uVmFsdWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxFbnRpcmUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91cyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDbGFzc0NvZGVkIiB0eXBlPSJIYXphcmRDbGFzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENsYXNzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1JlZmVyZW5jZXMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNDb250YWN0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVTkRHTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFTVNOdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1mYWciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91cyIgdHlwZT0iSGF6YXJkb3VzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkhhemFyZG91c0lkZW50aWZpZXJzIiB0eXBlPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1JlZ3VsYXRpb25zQ29kZWQiIHR5cGU9IkFnZW5jeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1JlZ3VsYXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUV4dGVuc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZVZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZE9mZmljaWFsVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJlbUNhcmROdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c0lkZW50aWZpZXJzIiB0eXBlPSJIYXphcmRvdXNJZGVudGlmaWVycyIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRDbGFzc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnkiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSWRlbnRpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1BsYWNhcmRUZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iIHR5cGU9IkhhemFyZG91c1BsYWNhcmRJbmZvcm1hdGlvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZsYXNocG9pbnQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFbWVyZ2VuY3kiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250cm9sIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mVGVtcGVyYXR1cmVDb2RlZCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiIHR5cGU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRQYWNraW5nQ29kZWQiIHR5cGU9IkhhemFyZFBhY2tpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRQYWNraW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlZCIgdHlwZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGVkIiB0eXBlPSJIYXphcmRvdXNab25lQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzWm9uZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iIHR5cGU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0RGFuZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1EYW5nZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yRGFuZ2VyIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZXNjcmlwdGl2ZUluZm9ybWF0aW9uTm90UmVxdWlyZWRCeVJlZ3VsYXRpb25CdXREZXNpcmVkVG9BY2NvbXBhbnlUaGVNb3ZlbWVudEJ5VGhlU2hpcHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BaXJsaWZ0T25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE9ULTExM0RvTm90QnVtcE9yQ3V0T2ZmQ2FyV2hpbGVJbk1vdGlvbkRlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkQ2FyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW5nZXJvdXNXaGVuV2V0RGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNU1BhZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpZXNQcm9kdWN0c0luQUhlYXRlZE1vbHRlblN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNTdWJzdGFuY2VDb25zdGl0dWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaGFsYXRpb25IYXphcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRRdWFudGl0eURlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRkFHUGFnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU9wZXJhdGluZ1NwZWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpbmVQb2xsdXRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaXNvbi1JbmhhbGF0aW9uSGF6YXJkRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaXNvbkRlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2ZU1hdGVyaWFsRGF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JDaGVtaWNhbEdyb3VwTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZURlY2xhcmF0aW9uIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByaWNpbmdEZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlRheCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUFsbG93YW5jZXNPckNoYXJnZXMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsVmFsdWUiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNpbmdEZXRhaWwiIHR5cGU9IlByaWNpbmdEZXRhaWwiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5RGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb0xvY2F0aW9uIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcEZyb21Mb2NhdGlvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2NoZWR1bGVMaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNpbXBsZVBhY2thZ2VOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUZXJtc09mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcnlEZXRhaWwiIHR5cGU9IkRlbGl2ZXJ5RGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTY2hlZHVsZUxpbmUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNjaGVkdWxlTGluZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2NoZWR1bGVMaW5lIiB0eXBlPSJMaXN0T2ZTY2hlZHVsZUxpbmUiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNjaGVkdWxlTGluZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2hlZHVsZUxpbmVJRCIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGVkIiB0eXBlPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzUmVhc29ucyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlN0YXR1c1JlYXNvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVxdWVzdGVkRGVsaXZlcnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZk90aGVyRGVsaXZlcnlEYXRlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGF0ZUNvZGVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjaGVkdWxlTGluZU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZmVyZW5jZSIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2NoZWR1bGVMaW5lIiB0eXBlPSJTY2hlZHVsZUxpbmUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RZZXRTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyU2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JQaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbGx5U2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbGx5RGVsaXZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0YXR1c1JlYXNvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU3RhdHVzUmVhc29uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdGF0dXNSZWFzb24iIHR5cGU9Ikxpc3RPZlN0YXR1c1JlYXNvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RhdHVzUmVhc29uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0dXNSZWFzb25Db2RlZCIgdHlwZT0iU3RhdHVzUmVhc29uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RhdHVzUmVhc29uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhdHVzUmVhc29uIiB0eXBlPSJTdGF0dXNSZWFzb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3RhdHVzUmVhc29uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZFNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNBd2FpdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlZnVzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5T25JbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkluY29ycmVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVzdHJpY3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRSZXN0cmljdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnROb3RSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEaWZmZXJlbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRvb0xhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvU2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1RoZUJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1RoZUNhcnJpZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9Ikxpc3RPZlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViTG9jYXRpb24iPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViUXVhbnRpdHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJMb2NhdGlvbkl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIiB0eXBlPSJTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIgdHlwZT0iSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlEUmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlBhY2thZ2VSZWZlcmVuY2UiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VSZWZlcmVuY2UiIHR5cGU9IlBhY2thZ2VSZWZlcmVuY2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcmdvQ2xhc3NpZmljYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmF0dXJlT2ZHb29kcyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZWQiIHR5cGU9Ik9wZXJhdGlvbmFsVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlR5cGVPZkNhcmdvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXJnb0NsYXNzaWZpY2F0aW9uIiB0eXBlPSJDYXJnb0NsYXNzaWZpY2F0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlTm9uLUR1dGlhYmxlQ29uc2lnbm1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZUR1dGlhYmxlQ29uc2lnbm1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoVmFsdWVDb25zaWdubWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTm9uLUNvbnRhaW5lcml6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsLU9uUm9sbC1PZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldGl6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrYnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENhcmdvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUG9sbHV0YW50Q2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdC1IYXphcmRvdXNDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlwbG9tYXRpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibm94aW91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZHYXVnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkR29vZHNBbmRQZXJzb25hbEVmZmVjdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkNhcmdvIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlRGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlRGV0YWlsIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlRGV0YWlsIiB0eXBlPSJMaXN0T2ZQYWNrYWdlRGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlRGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhY2thZ2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTnVtYmVyT2ZQYWNrYWdlcyIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlRGV0YWlsIiB0eXBlPSJQYWNrYWdlRGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlVHlwZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZVR5cGVDb2RlZCIgdHlwZT0iUGFja2FnZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VUeXBlRGVzY3JpcHRpb24iPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlVHlwZSIgdHlwZT0iUGFja2FnZVR5cGUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2FnZVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWVyb3NvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWludW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtbW9QYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbXBvdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbXBvdWxlLU5vbi1Qcm90ZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtcG91bGUtUHJvdGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc1NwZWNpZmllZEJ5VGhlRE9UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdG9taXplciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxlLUNvbXByZXNzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGUtTm9uLUNvbXByZXNzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGxvb24tTm9uLVByb3RlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsbG9vbi1Qcm90ZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcnJlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFycy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZXJDcmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVsdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaW5nQ2hlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZC1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2JiaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlY3JhdGUtQm90dGxlcmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlLU5vbi1Qcm90ZWN0ZWQtQnVsYm91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dGxlLU5vbi1Qcm90ZWN0ZWQtQ3lsaW5kcmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZS1Qcm90ZWN0ZWRCdWxib3VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0bGUtUHJvdGVjdGVkQ3lsaW5kcmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94V2l0aElubmVyQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFjaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWNrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstR2FzLUF0MTAzMU1iYXJBbmQxNURlZ0MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstTGlxdWVmaWVkR2FzLUF0QWJub3JtYWxUZW1wZXJhdHVyZU9yUHJlc3N1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstTGlxdWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrLVNvbGlkLUZpbmVQYXJ0aWNsZXMtUG93ZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsay1Tb2xpZC1HcmFudWxhclBhcnRpY2xlcy1HcmFpbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGstU29saWQtTGFyZ2VQYXJ0aWNsZXMtTm9kdWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVuY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybGFwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXR0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWJpbmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5DYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW4tQ3lsaW5kcmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmlzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW4tUmVjdGFuZ3VsYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbnZhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYm95Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJib3ktTm9uLVByb3RlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYm95LVByb3RlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyTG9hZC1SYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJ0b24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWVzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsbHlIYXJkZW5lZEZpYnJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2h1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG90aE9yRmFicmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG90aFRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29mZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2ZmaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhcHNpYmxlVHViZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcHJlc3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmV4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1Db21tZXJjaWFsSGlnaHdheUxpZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1FbmdpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1NYWMtSXNvLUx0LldndDhYOFgyMEZvb3RBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1NdWx0aS1XYWxsZWQtU2VjdXJlZFRvV2FyZWhvdXNlUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTmF2eUNhcmdvVHJhbnNwb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcnNPZkJ1bGtDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ybmVyUmVpbmZvcmNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycnVnYXRlZE9yU29saWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmFkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWxpbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtaWpvaG4tTm9uLVByb3RlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtaWpvaG4tUHJvdGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtTGVuZ3RoUmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLUxlbmd0aFNraWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvdWJsZS1MZW5ndGhUb3RlQmluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGVXYWxsQ29ycnVnYXRlZEJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtV2FsbFBhcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlCdWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWZmZWxiYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkZ2VQcm90ZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZ2dDcmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZlbG9wZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmliZXJib2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmliZXJib2FyZE1ldGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicmUtUGFwZXJib2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsbXBhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcmtpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhc2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsby1CaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvb3Rsb2NrZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRSZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbWVkQ3JhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZydWl0Q3JhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc0JvdHRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lyZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaXJkZXJzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmLVN0YW5kYXJkUmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZi1TdGFuZGFyZFRvdGVCaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbXBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZHNPZkJlZWYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvZ3NoZWFkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkR29vZHNDb250YWluZXItV29vZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5nb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ290cy1JbkJ1bmRsZUJ1bmNoVHJ1c3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluSW5uZXJDb250YWluZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtb2RhbFRyYWlsZXJPckNvbnRhaW5lckxvYWQtUmFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbk9yU3RlZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkphciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSmVycmljYW4tQ3lsaW5kcmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkplcnJpY2FuLVJlY3Rhbmd1bGFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bWJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXRlYmFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS25vY2tkb3duUmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS25vY2tkb3duVG90ZUJpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZnRWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlwT3JUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZEJ1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9ncy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb29zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGNoQm94Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxDYW5zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxrQ3JhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbHZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1peGVkQ29udGFpbmVyVHlwZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vaXN0dXJlUmVzaXN0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2xkZWRQbGFzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNc2N2YW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlLVdhbGxQYXBlci0yT3JNb3JlV2FsbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlLVdhbGxQYXBlcjNPck1vcmVXYWxscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbHlCYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLVJvbGxQYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXdhbGxTYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdE90aGVyd2lzZVNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IYW5nZXJPclJhY2tJbkJveGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbk93bldoZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclRoYW5HbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUaGFuTWV0YWxPclBsYXN0aWNUdWJlc09yR2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlZC1Ob3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW51bVBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxQYWxsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbFBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZFBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0UGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJET1RQYWxsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldC0yV2F5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXQtNFdheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcGVyLVZjaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyY2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aXRpb25pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVSYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXJucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGl0Y2hlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5rcy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLUluamVjdGlvbk1vbGRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1SZWdyaW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVN0cnVjdHVyYWxGb2FtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFzdGljLVZhY3V1bUZvcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhc3RpYy1WaXJnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXN0aWMtV3JhcHBlZFRyYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0ZXMtSW5CdW5kbGVPckJ1bmNoT3JUcnVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbHlldGh5bGVuZUxpbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2x5c3R5cmVuZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG90Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3VjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUxpZnRDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVWZWhpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWxwYm9hcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJPZkJlZWYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWwtU2VtaWNvbmR1Y3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkbmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluZm9yY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlcnNlUmVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2RzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1YmJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnViYmVyQW5kRmFicmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWNoZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYS1DaGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXBhcmF0b3JPckRpdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYWxsb3dDcmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0bWV0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWV0cy1JbkJ1bmRsZU9yQnVuY2hPclRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9vayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rV3JhcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rd3JhcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZU9mQmVlZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlV2FsbENvcnJ1Z2F0ZWRCb2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tlbGV0b25DYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lkLUVsZXZhdGluZ09yTGlmdFRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVldmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBzaGVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEp1bWJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGluQ3lsaW5kZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGluZGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhaW5sZXNzU3RlZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVlbC1WaW55bENvYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZXRjaFdyYXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1aXRjYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rLUN5bGluZHJpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rLVJlY3Rhbmd1bGFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYS1DaGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGllcmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGVCaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXlQYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwbGVXYWxsQ29ycnVnYXRlZEJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1bmtBbmRDaGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1bmstU2FsZXNtZW5TYW1wbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmUtQ29sbGFwc2libGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmVzLUluQnVuZGxlT3JCdW5jaE9yVHJ1c3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1YmVzLU1ldGFsT3JQbGFzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucGFja2VkT3JVbnBhY2thZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWN1dW0tUGFja2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5QYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVJbk9wZXJhdGluZ0NvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZWVsZWRDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWNrZXJib3R0bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpcmVNZXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXJlT3JDb3JkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXcmFwcGVkIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlIiB0eXBlPSJMaXN0T2ZQYWNrYWdlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSUQiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkl0ZW1SZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZPcmRlclJlZmVyZW5jZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlTWFyayIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlNwZWNpYWxIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGFja2FnaW5nIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSGF6YXJkb3VzIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQXNzb2NpYXRlZERvY3VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdJbnN0cnVjdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUmV0dXJuYWJsZUNvbnRhaW5lckluZm8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VEZXRhaWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2UiIHR5cGU9IlBhY2thZ2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iT3JkZXJSZWZlcmVuY2VzIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZPcmRlclJlZmVyZW5jZXMiIHR5cGU9Ikxpc3RPZk9yZGVyUmVmZXJlbmNlcyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZU1hcmsiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VNYXJrIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlTWFyayIgdHlwZT0iTGlzdE9mUGFja2FnZU1hcmsiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VNYXJrIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlTWFya0NvZGVkIiB0eXBlPSJQYWNrYWdlTWFya0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VNYXJrQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZU1hcmtWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZU1hcmsiIHR5cGU9IlBhY2thZ2VNYXJrIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhY2thZ2VNYXJrQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllci1Bc3NpZ25lZFBhY2thZ2VJZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllcnNJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90TWFya1N1cHBsaWVyc0NvbXBhbnlOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpcmVTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsUmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbU9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtBZGRpdGlvbmFsbHlDdXN0b21lcnNBcnRpY2xlRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtBcnRpY2xlTnVtYmVyQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtCYXRjaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0Nhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtDdXN0b21lcnNDb21wYW55TmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya0N1c3RvbWVyc1JlZmVyZW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtEYXRlT2ZQcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrRXhjbHVzaXZlbHlDdXN0b21lcnNBcnRpY2xlRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtFeHBpcnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrRnJlZVRleHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya05ldFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1BhY2thZ2VzRGltZW5zaW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya1J1bm5pbmdOdW1iZXJPZlBhY2thZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrU2VyaWFsU2hpcHBpbmdDb250YWluZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrU3VwcGxpZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtUYXJlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJDYXJ0b25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JBc3NpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0Q29uZmlndXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVNYXJrZWRCeUJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFzc2lnbmVkRHJvcFpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGYtSWRlbnRpZnlpbmdDb250YWluZXJWaWFSYWRpb0ZyZXF1ZW5jeUlkRGV2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXNzaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXItQXNzaWduZWRDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXNzaWduZWRSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQXNzaWduZWRTa2lkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU0NDLTE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU0NDLTE4QW5kQXBwbGljYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTaGlwcGluZ0NvbnRhaW5lckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDQ09yRUFOMTI4QXBwbGljYXRpb25JZGVudGlmaWVyQW5kRGF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybUNvZGVDb3VuY2lsRm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb25zdW1lclBhY2thZ2VDb2RlLTEtNS01LTEiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFja2FnZUNoYXJhY3RlcmlzdGljIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiIHR5cGU9Ikxpc3RPZlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlZCIgdHlwZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZUNoYXJhY3RlcmlzdGljQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpY0Rlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWMiIHR5cGU9IlBhY2thZ2VDaGFyYWN0ZXJpc3RpYyIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQYWNrYWdlQ2hhcmFjdGVyaXN0aWNDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdQYWNrYWdlTGFiZWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nUGFja2FnZVNlYWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYXJraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlb2ZQYWNrYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlU3BlY2lmaWNhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VQcm90ZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0Zm9ybU9yU2tpZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFyaW5nUGllY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50b25DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nRGlyZWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nRGV2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RNYXJraW5nUGF0dGVybiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hcmtpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZU9yQ29udGFpbmVyTWFya0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlQ2hhcmFjdGVyaXN0aWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdGYWNpbGl0eUxpbWl0YXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWdnaW5nT3JCYXJDb2RlSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lkT3JQYWxsZXRUeXBlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYWNrYWdlRGVzY3JpcHRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VEZXNjcmlwdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFja2FnZURlc2NyaXB0aW9uIiB0eXBlPSJMaXN0T2ZQYWNrYWdlRGVzY3JpcHRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VEZXNjcmlwdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhY2thZ2VJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWluZXJDb3VudGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2FkT3JkZXJDb3VudGVyIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlRGVzY3JpcHRpb24iIHR5cGU9IlBhY2thZ2VEZXNjcmlwdGlvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFja2FnZUlkZW50aWZpZXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlBhY2thZ2VJZGVudGlmaWVyIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQYWNrYWdlSWRlbnRpZmllciIgdHlwZT0iTGlzdE9mUGFja2FnZUlkZW50aWZpZXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSWRlbnRpZmllckNvZGVkIiB0eXBlPSJQYWNrYWdlSWRlbnRpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFja2FnZUlkZW50aWZpZXJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZUlkZW50aWZpZXIiIHR5cGU9IlBhY2thZ2VJZGVudGlmaWVyIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhY2thZ2VJZGVudGlmaWVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTjhPckVBTjEzQmFyY29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklURjE0T3JJVEY2QmFyY29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDQ09yRUFOMTI4QmFyY29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFEUiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3BlY2lhbEhhbmRsaW5nIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTcGVjaWFsSGFuZGxpbmdDb2RlZCIgdHlwZT0iU3BlY2lhbEhhbmRsaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3BlY2lhbEhhbmRsaW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3BlY2lhbEhhbmRsaW5nTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3BlY2lhbEhhbmRsaW5nIiB0eXBlPSJTcGVjaWFsSGFuZGxpbmciLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3BlY2lhbEhhbmRsaW5nQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkVG8xNU1pbGVzUGVySG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkVG8yNU1pbGVzUGVySG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkVG8zNU1pbGVzUGVySG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRSZXN0cmljdGVkVG80NU1pbGVzUGVySG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9GYWNpYWxIYWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJJc0FpckJyYWtlQ29udHJvbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZXF1aXJlZFBhY2tpbmdMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlcXVpcmVkUFJPTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlcXVpcmVkQXBwb2ludG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRPblRvcE9mUmVzaWR1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zZU9mUmVzaWR1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1BdXRvS2V5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudFRvTW92ZVdpdGhDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudHMtQWR2YW5jZU9ubHlXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ2hvdXNlQmFsYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvd2FibGVMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZkJhZE9yZGVyZWROb3RpZnlTaGlwcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsU2hpcHBlckZvcldlaWdoQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJDb25zb2xpZGF0b3JMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50LUN1c3RvbWVyc0RvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmVkRm9yRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJGYWN0b3J5TG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0luc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtQ290dG9uTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vTWFyc2hhbGxpbmdSZXF1aXJlZEZvckhhemFyZG91c01hdGVyaWFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VzUmFtcE9ubHlUT0ZDVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQ29uc2lnbmVlRm9yV2VpZ2hDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BMb2FkT25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblRoYXRUaGlzU2hpcG1lbnRJc0ZvclJlY3ljbGluZ0FzRGVmaW5lZEluQXBwbGljYWJsZVRhcmlmZnNDb250YWluaW5nU3VjaFByb3Zpc2lvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtdXJyYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckF1dGhvcml6YXRpb25SZXF1aXJlZEZvckRpdmVyc2lvbk9yQ29uc2lnbm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BZYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9ubHlPblN1cnJlbmRlck9mV3JpdHRlbk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFkSW5Ub3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90VW5jb3VwbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25XZWlnaHRzQXBwbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc2l2ZURpbWVuc2lvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNFcXVpcG1lbnRUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbENvbnRyb2xMaW1pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5FbXB0eVZpYVJldmVyc2VSb3V0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlc0luY3VycmVkSWZTaGlwbWVudEZhaWxzVG9NZWV0VmVzc2VsTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBsb3NpdmVGbGFtbWFibGVHYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2VBLUVuZFRvSGVhZE9mVHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2VCLUVuZFRvSGVhZE9mVHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmluZ1VuZGVyRm9yRnVydGhlcmFuY2VJbnN0cnVjdGlvbnNBbmRNYXlCZURlbGl2ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYW1tYWJsZUdhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhbW1hYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGFtbWFibGVQb2lzb25HYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYWdpbGUtSGFuZGxlV2l0aENhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbnRyYW5zaXRGbGF0U2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluSW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZEVuZENhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRvcnNlZEFzSGF6YXJkb3VzTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRGb3JPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRlZFByaW9yVG9Mb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lRm9yUmVwYWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoVmFsdWVMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoV2lkZUxvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRUb0JlSW5zcGVjdGVkQXREZXN0aW5hdGlvbkFuZERpc3Bvc2l0aW9uSW5zdHJ1Y3Rpb25zV2lsbEJlRnVybmlzaGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm9mZmljZU1vdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsSW5jZW50aXZlUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmVpbGxhbmNlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVuY3Rpb25TZXR0bGVtZW50QWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEJyaWRnZUltcG9ydE9yRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJUcmlwTGVhc2VkVG9Db25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdEZXZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRUb0Z1bGxWaXNpYmxlQ2FwYWNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuQ29udGFpbmVyQ29uc29saWRhdG9yTG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdExvd2VzdFRocm91Z2hSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lckZhY3RvcnlMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNlcnZpY2VPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkZ1bGxDYXJsb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25JbkNoYXJnZU9mQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmVkRm9yQm9yZGVyQ3Jvc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pY2FsUmVmcmlnZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlQmVmb3JlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGl2ZXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1NwZWNpYWxFbnRyYWlubWVudFJlcXVpcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdEh1bXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0VxdWlwbWVudEZpcnN0VHJhbnNib3JkZXJNb3ZlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RQb29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlTaGlwcGVyQmVmb3JlUmVjb25zaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RUcmFuc2ZlckNvbnRlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhc2VPZkZpcmVEb05vdFVzZVdhdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RGb3JFeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eUxvYWRlZExlc3NUaGFuT3JFcXVhbFRvVGhlQ2FyT3JkZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcndlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaXNoYWJsZUluQm94Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlbHlDb250cm9sbGVkUHJpdmF0ZUVxdWlwbWVudFN1YmplY3RUb0RlbXVycmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9pc29ub3VzR2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJY2VkUHJpb3JUb0xvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQcm90ZWN0aW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1QcmVwYWlkV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQXV0aG9yaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZGVyQmlsbEZvckNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29udHJvbGxlZFByaXZhdGVFcXVpcG1lbnRTdWJqZWN0VG9EZW11cnJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvYWN0aXZlTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1c2hPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhclJpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0SG91cmx5SWZDYXJTdG9wcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRGb3JUcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZE9yQ2FycmllckNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG92ZVRvUmVzdEFuZENvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0VG9TcGVjaWFsRGV0ZW50aW9uUnVsZXNPckNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtU2hpcHBlcnNFeHBvcnREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRhYmxlTG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvQ3Jvc3NEb2NrT3JQb29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlc1NoZWxmQ291cGxlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnQtU2hpcHBlcnNNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0YWNobWVudC1TaGlwcGVyc1BhY2tpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWVkUmVzdHJpY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZXRjaFdyYXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnNUZW1wb3JhcmlseUFydGljdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyQ29uc29saWRhdG9yTG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlckZhY3RvcnlMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2l0U2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW1UcmFja0RlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVm9sdW1lUmF0ZXNPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRBdEJ1bXBlckNpcmN1c1JhbXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRGcm9tTGVmdFNpZGVPZkNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkQXNQbGFjYXJkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucHJvdGVjdGVkUGVyaXNoYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkRnJvbVJpZ2h0U2lkZU9mQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQ2VydGlmaWVzR3Jvc3NXZWlnaHRVbmRlcjI0MDAwMFBvdW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uV2VpZ2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbnRpbGF0aW9uSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlLUJvZHlQaWNrdXBUcnVja0FwcGxpZXNUb0ZpbmlzaGVkVmVoaWNsZUxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXZlZEluc3BlY3Rpb24tU2V0RGlyZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaEVtcHR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRhY2htZW50cy1IaWdoV2lkZU5vdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdmVJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5pZmVzdE11c3RBY2NvbXBhbnlXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaFRvQ2hlY2tGb3JPdmVybG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVXYXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc1Rvd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VkRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VyY2hhcmdlQXV0aG9yaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2hvcmUtQWxhc2thT3JIYXdhaWlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZWRQcmVtaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mQWlyV2F5YmlsbC1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDYW5hZGlhbkN1c3RvbXNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mRXhwb3J0RW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZlUuUy5FeHBvcnREb2N1bWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2stVXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2lnbmF0dXJlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV3JpdHRlblByb29mT2ZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlMTAwMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlMzAwMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlNTAwMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW50c0FjY29tcGFueWluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZUxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNyYWZ0RnVybmlzaGVkQW5kTm90VXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlVGVuZGVyRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybWVkR3VhcmRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsSW5qZWN0aW9uT3JCbGVuZGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFuZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkFsdGVybmF0ZVRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBLk0uRGVsaXZlcnlSZXF1aXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5jaG9yaW5nQW5kVW5hbmNob3JpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb3B5T2ZTaGlwcGluZ1BhcGVyc0ZvclByb29mT2ZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGlhbmNlU2VydmljaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDb25kaXRpb25pbmdEaXNjb25uZWN0QW5kQ29ubmVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEFybWVkR3VhcmRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVHJhY3RvclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVUcnVja1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5U2VydmljZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV4aWxpYXJ5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnlwYXNzQ29uc29saWRhdGlvblBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxreUFydGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NraW5nQW5kQnJhY2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxpbmRTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9sc3RlckxvYWREb05vdFN3aXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94aW5nU2VydmljZS1EcnlCdWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJTdXJjaGFyZ2VBdXRob3JpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyQWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC0yMEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudC00MEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvZWVDYXJPclBpY2stVXBUcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydENvbW1lcmNpYWxCaWxsT2ZMYWRpbmdCb2xUb0dvdmVybm1lbnRCb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJDYWJvb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jyb3Npb25BZGRpdGl2ZVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGZWVzLUNvbnRhaW5lckxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1MaWZ0TGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJHdWFyZENhclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNhcnJpZXJHdWFyZENhclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvVGF4ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYWluQW5kQmluZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbEludm9pY2VQcmVwYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc1JhdGVzQXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYi5SYXRlc092ZXJEZXRyb2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uQW5kTGluZUhhdWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmF0ZXNBcHBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblRoYXRUaGVOZXdzcHJpbnRXaW5kaW5nQ29yZXNCZWluZ1JldHVybmVkRW1wdHlXZXJlUmVjZWl2ZWRGaWxsZWRCeVJhaWxGcmVpZ2h0U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlVW5sb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VyaWVyT3Zlcm5pZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3BpbG90U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1BhcGVyc01haWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyTGVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJpZXJTYW1lRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50Q2Fib29zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEF0bW9zcGhlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck1vdW50aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0b3VzUm91dGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LUJyZWFrQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlV2lkZVNlcGFyYXRlQW5kUmVhc3NlbWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tQmFyZ2VUb1BpcGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2RDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxEcml2ZXJXaXRoTmF0aW9uYWxBZ2VuY3lDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVhbERyaXZlclByb3RlY3RpdmVTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3REZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUF0UG9ydE9mRGViYXJrYXRpb25SYXRlWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZkNvbnZleWluZ0VxdWlwbWVudEFuZFRoZVBvd2VyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZW50aW9uT2ZDb252ZXlpbmdFcXVpcG1lbnRFeGNsdWRpbmdUaGVQb3dlclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkVtYmFya2F0aW9uUmF0ZVpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBGcm9tRnJlZXppbmdQZXJjZW50RGlmZmVyZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MTBEcm9tZWRhcnlXaXRoTWVjaGFuaWNhbFJlc3RyYWluaW5nRGV2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDEwRHJvbWVkYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25TZXJ2aWNlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21SYWlsVGFua0NhclRvUGlwZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVNoaXBwZXJJbW1lZGlhdGVseUlmU2hpcG1lbnRJc0RlbGF5ZWRFblJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdENvdXBsZVRvT3RoZXJEaWFwaHJhZ21lZENhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RnJlZXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdENvdXBsZVRvVGFua0NhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXRpb24tU3BlY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGl2ZXJzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21QaXBlbGluZVRvQmFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXlhZ2VBdFBvcnRPZkRlYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPZkZ1ZWxGcm9tUGlwZWxpbmVUb1JhaWxUYW5rQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9mRnVlbEZyb21QaXBlbGluZVRvVGFua1RydWNrT3JUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25XaXRoUG93ZXJVbml0czMwTWludXRlUGVyaW9kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bW1pbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdENvdXBsZVRvRG91YmxlU2hlbGZDb3VwbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9tZWRhcnlXaXRoTWVjaGFuaWNhbFJlc3RyYWluaW5nRGV2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvbWVkYXJ5U2VydmljZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9vclNpZGVWYW5uaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckFzc29jaWF0ZWRXaXRoRGV0ZW50aW9uT2ZDb252ZXlpbmdFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5T2ZGdWVsRnJvbVRhbmtUcnVja09yVHJhaWxlclRvUGlwZWxpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvblZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbldpdGhQb3dlclVuaXRzNjBNaW51dGVQZXJpb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUF4bGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRPckNvdXJpZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVJhaWxjYXJPcmRlcmVkQnV0Tm90VXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50SG9zZUF0RGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudEhvc2VBdE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxpZ2h0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlNb3ZlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmV0dXJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZhY3RvcnlTZXJ2aWNlU3RhbmRhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NpdmVWYWx1YXRpb25BdXRob3JpemVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2VPZlZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhRHJpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxlbmd0aFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UHJlcGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFJhdGVzQXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMYWJvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlT2ZWZWhpY2xlRGFtYWdlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwYW5kUmVtb3ZlQW5kSW5zdGFsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHdheUVhc3lSYXRlc0FwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlRnJlaWdodEFsbEtpbmRzU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZWFybXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pc2hpbmdDaGFzc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsRmlsdGVyc0Z1cm5pc2hlZEJ5Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbEZpbHRlcnNGdXJuaXNoZWRCeVNoaXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRyYWNrU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JQcm9jZXNzaW5nSW5UcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRlZEJ5Q2FycmllckF0T3duZXJTUmlza09mRnJlZXppbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclN0b3JhZ2VJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbHRyYXRpb25TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LU93bmVkQ29udGFpbmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEd1YXJkQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyU2VjdXJpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb2xkQXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRCcmFrZXNBdEVhY2hFbmRNdXN0QmVSZWxlYXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkb3ZlckZvckhvbGlkYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyRm9yV2Vla2VuZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXQtU3BlY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFdpdGhTdGVhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzaWJsZUhhemFyZG91c01hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjY2Vzc2libGVIYXphcmRvdXNNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VuZGF5T3JIb2xpZGF5UGlja3VwT3JEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjRIb3VyQXZhaWxhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSG9zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEN1YmVUcmFpbGVyUmF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRlck9yUmVmcmlnZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGl0Y2hJbnN0YWxsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc1N1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29PbkRlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkbGVyQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWNpbmdJbmhpYml0b3JTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RvZ3JhcGhzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1vZGFsU2hpcG1lbnRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYS1QbGFudE1vdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJsaW5lVHJhbnNmZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXN0LUluLVRpbWVKaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50TGluZUV4Y2VwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblRoYXRUaGVDb250YWluZXJzQmVpbmdSZXR1cm5lZEVtcHR5V2VyZVJlY2VpdmVkRmlsbGVkQnlSYWlsRnJlaWdodFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBNYXRlcmlhbERyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JEaXN0dXJiYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbHlBVUNDT3JFQU5TZXJpYWxTaGlwcGluZ0NvbnRhaW5lckxhYmVsVG9UaGVTaGlwcGluZ0NvbnRhaW5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0QmFyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93Qm95VHJhaWxlck9yRmxhdEJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZEN1cnJlbmN5QWRqdXN0bWVudEZhY3Rvci0yMEZvb3RDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnQtNDBGb290Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50RGlmZmVyZW50aWFsLUxlc3NUaGFuQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxGcm9tUG9ydE9mRGViYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5T2ZDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRW1iYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsUGVyY2VudERpZmZlcmVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxUb1BvcnRPZkVtYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhblRydWNrbG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3ZlclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWVkQXRtb3NwaGVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0U2VydmljZVdpdGhPdmVybmlnaHRTdWJzaXN0ZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRTZXJ2aWNlc1RlbGVwaG9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclN1cnZlaWxsYW5jZVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5VHJhZmZpY0V4cGVkaXRpbmdTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTW90b3JTdXJ2ZWlsbGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90SHVtcE9ySHVtcEludG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90VXNlSGVscGVyTG9jb21vdGl2ZVRvUHVzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9QbGFjYXJkc1JlcXVpcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3NlU2lkZVZhbm5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3dBd2F5RnJvbUhlYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NrU3Rvd2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BYm9hcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJMb2FkQW5kQ29uc2lnbmVlVW5sb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVySGVpZ2h0Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW5nU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uTm90UmVxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3dXaXRoRG9vcnNGYWNpbmdJbndhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdENvbW1vZGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5Gcm9udE9mSG91c2VTdG93YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW1pZ2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJtbGVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsRmllbGRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VOb0hvb2tzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZXN0cmljdGVkQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvT25Cb2FyZENlcnRpZmljYXRpb25SZXF1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25EZWNrU3Rvd2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckxvYWRBbmRDYXJyaWVyVW5sb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpc2hhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3dCZWxvd0RlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3dCZXR3ZWVuRGVja3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZU9mRGVsaXZlcnlBbmRTaWduYXR1cmVSZXF1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25Ub3BJbi1IYXRjaFN0b3dhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uVG9wT24tRGVja1N0b3dhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyQ29udGFpbmVyT24tRGVja1N0b3dhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbG93V2F0ZXJMaW5lU3Rvd2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcmZsb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJXaWR0aENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lV2F5UmF0ZXNBcHBsaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1waW5nRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBPZlNoaXBtZW50c09uU2F0dXJkYXlTdW5kYXlBbmRPckhvbGlkYXlzUmVxdWlyaW5nQWJzb2x1dGVOZXh0RGF5RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cEFuZERlbGl2ZXJ5RnJvbVN0b3JhZ2VJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cEFuZERlbGl2ZXJ5QmV5b25kU2VydmljZUFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQZXJtaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0RnJvbUhlYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckhvdXJSYXRlc0FwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWxsZXRzT3JTa2lkc09yUGxhdGZvcm1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQLk0uRGVsaXZlcnlSZXF1aXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyTWlsZVJhdGVzQXBwbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cE9mU2hpcG1lbnRzUmVxdWlyaW5nU2FtZURheURlbGl2ZXJ5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwT2ZTaGlwbWVudHNSZXF1aXJpbmdTYW1lRGF5RGVsaXZlcnlTZXJ2aWNlQW5kT3JEZWxpdmVyeUF0QVNwZWNpZmllZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpYW5vT3JPcmdhbkNhcnJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0F0T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBBbmREZWxpdmVyeVNlcnZpY2VGb3JQZXJpc2hhYmxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbG9kZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWZmaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VydmljZVNlY3VyaXR5V2l0aEFybWVkR3VhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlU2VjdXJpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0aXZlVGFycEZvclNlY3VyaXR5UHVycG9zZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja3VwQW5kRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tBbmRVbnBhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVUFRyYWlsZXJSYXRlc0FwcGx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb25kZWRQcml2YXRlbHlPd25lZFZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mUHJpdmF0ZWx5T3duZWRWZWhpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbm9wZXJhYmxlUHJpdmF0ZWx5T3duZWRWZWhpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nT3JVbmxvYWRpbmdPZlByaXZhdGVseU93bmVkVmVoaWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZU93bmVkVmVoaWNsZVByb2Nlc3NpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2Zmc0ZvclByaXZhdGVseU93bmVkVmVoaWNsZVNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlbHlPd25lZFZlaGljbGVJblRydWNrYXdheVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25zaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbGhlYWRIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHJhaWxlclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvdHRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlck1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFZhbHVlQ2hhcmdlSW5FeGNlc3NPZkNhcnJpZXJNYXhpbXVtTGlhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxvY2F0aW9uT2ZWZWhpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5PZkVtcHR5Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Nb3ZlbWVudE9mUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsU3VydmVpbGxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJDYXJnb1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdW5kVHJpcFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRTcGVlZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV3ZWlnaHRSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJPbldlZWtlbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2t1cE9yRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb250YWluZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZEFuZENvbnNpZ25lZVVubG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXREZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERyb21lZGFyeVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxFcXVpcG1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJFeHBvcnREZWNsYXJhdGlvblJlcXVpcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFpcnNFbGV2YXRvckV4Y2Vzc0NhcnJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlQXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlFc2NvcnRWZWhpY2xlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlRmFjdG9yT3JpZ2luYXRpb25PckRlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVGYWN0b3JPcmlnaW5hdGlvbk9yUG9ydE9mRGViYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3RvclBvcnRPZkVtYmFya2F0aW9uT3JEZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRyYWluTW92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEhvbGRvdmVyT25Ib2xpZGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50SG9sZG92ZXJPbldlZWtkYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lydGluZ0FuZFVuc2tpcnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsUGFja2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXRBU2hpcE5vdGljZU9yTWFuaWZlc3RUcmFuc2FjdGlvblNldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0ZWxsaXRlU3VydmVpbGxhbmNlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRGcm9tTm9uLVRlbXBTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWRBbmRDYXJyaWVyVW5sb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUGVybWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcHJlYWRlclNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3RGb3JTdG9yYWdlLU5vU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlpbmdSb3V0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmlwcGluZ1NvcnRpbmdBbmRDb25zb2xpZGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlU2VydmljZU5vdFRvQmVVc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xlTGFzaGluZ0VxdWlwbWVudFBsZVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdGl2aXR5T3JBbnRpLVN0YXRpY0FkZGl0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLU9mZkF0RGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3dhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3AtT2ZmQXRPcmlnaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmF0dXJlQW5kVGFsbHlSZWNvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3RGb3JVbmxvYWRpbmdGcm9tQUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdEZvclVubG9hZGluZ0Zyb21CQnJha2VFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3JSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VPZlZlaGljbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWQtRG91YmxlT3BlcmF0b3ItQ29tbW9uQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tsb2FkLURvdWJsZU9wZXJhdG9yLVBhZGRlZFZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxIYW5kbGluZ0NoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlcmVkQXNUcnVja2xvYWRUcnVja2xvYWRTZXJ2aWNlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aS1UYW5rU3VydmVpbGxhbmNlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyaW5nT2ZNdWx0aXBsZVZlaGljbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyT25GbGF0Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3Rvck9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrUmF0ZXNBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyUHJlcGFyYXRpb24tU3BlY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlyZVJlcGFpckFuZFJlcGxhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlU2hvdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY3RvckFuZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZC1TaW5nbGVPcGVyYXRvci1Db21tb25DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja2xvYWQtU2luZ2xlT3BlcmF0b3ItUGFkZGVkVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rU3VydmVpbGxhbmNlU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJDYXJyaWFnZUZ1cm5pc2hlZEJ5Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWNraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdPclJlbG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0aWVzRGlzY29ubmVjdEFuZENvbm5lY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhY3V1bVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvZWVWYW5UeXBlVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbkNsZWFuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlc0Z1cm5pc2hlZEJ1dE5vdFVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzSW5vcGVyYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1PZmZEZWxpdmVyeU9mUGVyc29uYWxWZWhpY2xlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZXNJblRydWNrYXdheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQnJlYWtidWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZS1Db250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyZnJvbnREZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tDcmV3Qm9udXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tJbnN1cmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhaXRpbmdUaW1lQXV0aG9yaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0VmVyaWZpY2F0aW9uIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBc3NvY2lhdGVkRG9jdW1lbnRzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRG9jdW1lbnRMb29zZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NvY2lhdGVkRG9jdW1lbnRzIiB0eXBlPSJBc3NvY2lhdGVkRG9jdW1lbnRzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEb2N1bWVudExvb3NlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iRG9jdW1lbnRMb29zZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhY2thZ2VEb2MiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRG9jdW1lbnRMb29zZSIgdHlwZT0iTGlzdE9mRG9jdW1lbnRMb29zZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZURvYyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEb2N1bWVudFRpdGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJEb2N1bWVudFR5cGVDb2RlZCIgdHlwZT0iRG9jdW1lbnRUeXBlQ29kZSIgdXNlPSJyZXF1aXJlZCIvPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJEb2N1bWVudFR5cGVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2VEb2MiIHR5cGU9IlBhY2thZ2VEb2MiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRG9jdW1lbnRUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZBbmFseXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZRdWFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UGVyZm9ybWFuY2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTcGVjaWZpY2F0aW9uUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzRGF0YVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTYW1wbGVUZXN0UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZVNhbGVzQ2F0YWxvZ3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTGFiZWxBcHByb3ZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0UmVjZWlwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodExpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5lZENlcnRpZmljYXRlT2ZWYWx1ZUFuZE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92ZW1lbnRDZXJ0aWZpY2F0ZUFUcjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eURhdGFNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1F1ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG93Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXNjaGFyZ2VMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdXBlcmFubnVhdGlvbkNvbnRyaWJ1dGlvbnNBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5U3VwZXJhbm51YXRpb25Db250cmlidXRpb25zQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVTdXBlcmFubnVhdGlvbk1lbWJlck1haW50ZW5hbmNlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlTdXBlcmFubnVhdGlvbk1lbWJlck1haW50ZW5hbmNlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZVBheXJvbGxEZWR1Y3Rpb25zQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmJvbmRSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmJvbmRBcHByb3ZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZlNlYWxpbmdPZkV4cG9ydE1lYXRMb2NrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1N0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eUNhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9BVHJhZGVTdGF0aXN0aWNzTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjY2luYXRpb25DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZpbmdMaWNlbmNlTmF0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZpbmdMaWNlbmNlSW50ZXJuYXRpb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVBhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXNvblRpY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0U3RhdHVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTdGF0dXNSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5raW5nU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYS1Db21tdW5pdHlUcmFkZVN0YXRpc3RpY2FsRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5JbnN0cnVjdGlvbnNJbkNvbmZvcm1hbmNlV2l0aEFkckFydGljbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUNlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkYXRlZFByaWNlZFRlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZU5lZ290aWF0aW9uUmVzdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRIYXphcmREYXRhU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU3RhdGVtZW50T2ZBbkFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdTdGF0ZW1lbnRPZkFuQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ1N0YXRlbWVudE9mQW5BY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbi1IaXJlUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmYtSGlyZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LU5pbE91dHR1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1UaW1lLVVwVW5kZXJib25kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnQtVW5kZXJib25kQnlTZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudC1QZXJzb25hbEVmZmVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50LVRpbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlDcmVkaXRBc3Nlc3NtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRDb3ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxEaXNwdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2ViYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzc2lnbm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGlwUGVybWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERlZmluaXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbERhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JTdGF0aXN0aWNhbERhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGwtT2ZmRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50U3RhdHVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlNb3ZlbWVudEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5U3RhdHVzQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVSZWxhdGVkVG9Hb29kc09yU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVSZWxhdGVkVG9Hb29kc09yU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyZWRTZXJ2aWNlc0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdE5vdGVSZWxhdGVkVG9GaW5hbmNpYWxBZGp1c3RtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXROb3RlUmVsYXRlZFRvRmluYW5jaWFsQWRqdXN0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsVW5wYWNrUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29TdW1tYXJ5TWFuaWZlc3RSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25tZW50VW5wYWNrUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0QW5kTWVhdEJ5LVByb2R1Y3RzU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdEZvb2RQcm9kdWN0c1Nhbml0YXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdWx0cnlTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3JzZW1lYXRTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjZXV0aWNhbFNhbml0YXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZWRpYmxlU2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wZW5kaW5nQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1JlbGVhc2VOb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25Eb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Tm90aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnREaXJlY3RJbnRlcmNoYW5nZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50SW1wZW5kaW5nQXJyaXZhbEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGFtYWdlUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRNYWludGVuYW5jZUFuZFJlcGFpcldvcmtFc3RpbWF0ZUFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RW1wdHlSZWxlYXNlSW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydE1vdmVtZW50R2F0ZUluUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRNb3ZlbWVudEdhdGVPdXRSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFVucGFja2luZ0luc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRVbnBhY2tpbmdSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFBpY2stVXBBdmFpbGFiaWxpdHlSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrLVVwQXZhaWxhYmlsaXR5Q29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQaWNrLVVwUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTaGlmdFJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RGlzY2hhcmdlSW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydERpc2NoYXJnZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVzUmVxdWlzaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydExvYWRpbmdJbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0TG9hZGluZ1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnREZXBhcnR1cmVSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVtcHR5RXF1aXBtZW50QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRBY2NlcHRhbmNlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFNwZWNpYWxTZXJ2aWNlSW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0b2NrUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDYXJnb1JlbGVhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nRGF0YVNoZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRQYWNraW5nSW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDbGVhcmFuY2VOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEb2N1bWVudHNFeHBpcmF0aW9uTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPbi1IaXJlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50T24tSGlyZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRPZmYtSGlyZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlPcmRlclJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzaW5nSXRlbXNUb0JlQm9va2VkVG9BRmluYW5jaWFsQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJXb3JrRXN0aW1hdGVPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50TWFpbnRlbmFuY2VBbmRSZXBhaXJOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5Q29udGFpbmVyRGlzcG9zaXRpb25PcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxEaXNjaGFyZ2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29WZXNzZWxMb2FkaW5nT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpZHJvcE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudENvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0FncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxUcmFuc3BvcnRPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGVmaW5pdGVEZWxpdmVyeUluZGVmaW5pdGVRdWFudGl0eUNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlZmluaXRlRGVsaXZlcnlEZWZpbml0ZVF1YW50aXR5Q29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVtZW50c0NvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXNrT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ha2VPckJ1eVBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0RGF0YVN1bW1hcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZENvc3RBbmRQcmljZURhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEZ1bmRzU3RhdHVzUmVwb3J0Q2ZzciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkSW5zcGVjdGlvbkFuZFRlc3RSZXN1bHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbEluc3BlY3Rpb25BbmRSZWNlaXZpbmdSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50T3JQZXJmb3JtYW5jZUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0U2VjdXJpdHlDbGFzc2lmaWNhdGlvblNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXlBbWVyaWNhQ2VydGlmaWNhdGVPZkNvbXBsaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9mZi1IaXJlTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FjY2VwdGFuY2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGljay1VcE5vdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvblRvUGxhbkFuZFN1Z2dlc3RPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcmlzYXRpb25Ub1BsYW5BbmRTaGlwT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRDcHJGb3JtYXQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0U2NoZWR1bGVTdGF0dXNSZXBvcnRDc3NyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRDcHJGb3JtYXQxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRDcHJGb3JtYXQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRDcHJGb3JtYXQ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGVyZm9ybWFuY2VSZXBvcnRDcHJGb3JtYXQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc2l2ZURpc2NoYXJnZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZUNvbmZpcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU3RyaXBwaW5nT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkFycml2YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VEZWNsYXJhdGlvbkRlcGFydHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmV5YW5jZURlY2xhcmF0aW9uQ29tYmluZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RSZWNvdmVyeVBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQcm9kdWN0aW9uUGxhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxBbmRPdGhlckFkbWluaXN0cmF0aXZlSW50ZXJuYWxEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYXN0ZXJTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VkQWx0ZXJuYXRlVGVuZGVyQmlsbE9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFByaWNlZEJpbGxPZlF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdEJpbGxPZlF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdENvbGxlY3Rpb25JbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckFuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50SW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQW5BbWVuZG1lbnRPZkFEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb0FuQW1lbmRtZW50T2ZBRG9jdW1lbnRhcnlDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0SXNzdWFuY2VJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheW1lbnRWYWx1YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsUGF5bWVudFZhbHVhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlWYWx1YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCaWxsT2ZRdWFudGl0aWVzLUJvcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wcmljZWRCaWxsT2ZRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VkVGVuZGVyQm9xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnF1aXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltQXBwbGljYXRpb25Gb3JQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnRUb1BheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckZpbmFuY2lhbENhbmNlbGxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mSW50ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZFVucHJpY2VkQmlsbE9mUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25Gb3JVbnNjaGVkdWxlZEl0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFBheW1lbnRSZXF1ZXN0QmFzZWRPbkNvbXBsZXRpb25PZldvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRSZXF1ZXN0Rm9yQ29tcGxldGVkVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3RPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVzaE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhcE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyQ2hhbmdlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlclJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYXJlUGFydHNPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FtcGFpZ25QcmljZVNhbGVzQ2F0YWxvZ3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUZvcmVjYXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdTZXJ2aWNlc09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlLUF1dGhvcmlzZWREaXJlY3REZWJpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlamVjdGVkRGlyZWN0RGViaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlKdXN0LUluLVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXRSZXF1ZXN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByZS1BdXRob3Jpc2VkRGlyZWN0RGViaXRSZXF1ZXN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T2ZBTGV0dGVyT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUb0JhbmtGdW5kc1RyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBheW1lbnRPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlUGF5bWVudE9yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld0xpc3REZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2VUb1ByZXZpb3VzQmFua2luZ1N0YXR1c01lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYXN0ZXJQbGFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UGxhbm5pbmdBdmFpbGFibGVSZXNvdXJjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RQbGFubmluZ0NhbGVuZGFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb01vdmVtZW50RXZlbnRMb2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQW5hbHlzaXNWb3lhZ2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZCaWxsZWRDcmVkaXROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRDcmVkaXROb3RlLUdvb2RzQW5kU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeUFkanVzdG1lbnRTdGF0dXNSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50SW5zdHJ1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudE1vdmVtZW50UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdGF0dXNDaGFuZ2VSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb25DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSGVhbHRoQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0NvZGVSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2RlQ2hhbmdlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltcGxlRGF0YUVsZW1lbnRSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW1wbGVEYXRhRWxlbWVudENoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvc2l0ZURhdGFFbGVtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9zaXRlRGF0YUVsZW1lbnRDaGFuZ2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50UmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VnbWVudENoYW5nZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld01lc3NhZ2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlSW5EZXZlbG9wbWVudFJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGlmaWNhdGlvbk9mRXhpc3RpbmdNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja2luZ051bWJlckFzc2lnbm1lbnRSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJEaXJlY3RvcnlEZWZpbml0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zU3RhbmRhcmRNZXNzYWdlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZURpcmVjdG9yeURlZmluaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2FuYmFuU2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRhTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNsYWltRm9yUGFydHNBbmRPckxhYm91ckNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVSZXNwb25zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvblJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25SZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQWNrbm93bGVkZ2VtZW50QW5kRXJyb3JSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlVmFyaWF0aW9uSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZUZvclByaWNlVmFyaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvblRvQ29sbGVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25SZW5ld2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25DaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlVG9SZWdpc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGxlbWVudGF0aW9uR3VpZGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RQZXJmb3JtYW5jZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvckFuZEFja25vd2xlZGdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xGaW5hbmNpYWxTdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcXVlbmNlZERlbGl2ZXJ5U2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGNyZWRlcmVDcmVkaXROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlclF1b3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvclF1b3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkVycm9yTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Nb3ZlbWVudFZveWFnZVN1bW1hcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclVzYWdlT2ZCZXJ0aE9yTW9vcmluZ0ZhY2lsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRGVzaWduYXRpb25PZkJlcnRoaW5nUGxhY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclNoaWZ0aW5nRnJvbVRoZURlc2lnbmF0ZWRQbGFjZUluUG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFyeURvY3VtZW50Rm9yQXBwbGljYXRpb25Gb3JDYXJnb09wZXJhdGlvbk9mRGFuZ2Vyb3VzR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudE9mT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlEb2N1bWVudEZvckFwcGxpY2F0aW9uRm9yVHJhbnNwb3J0T2ZEYW5nZXJvdXNHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbENoYXJhY3RlclJlYWRpbmdPY3JQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVNhbGVzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbWVyZ2VuY3lDYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVQcm9kdWN0UGxhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyYW5jZUNlZGluZ0JvcmRlcmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdEZvckRlbGl2ZXJ5SW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZVdoaWNoSW5jbHVkZXNBUGFja2luZ0xpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uRm9yQ2FyZ29FeGFtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uRm9yQ2FyZ29FeGFtaW5hdGlvbkFsdGVybmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ1JlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDcmV3QW5kQ29udmV5YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N1bW1hcnlEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsRGV0YWlsQWx0ZXJuYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtc0Jvb2tlZFRvQUZpbmFuY2lhbEFjY291bnRSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydE9mVHJhbnNhY3Rpb25zV2hpY2hOZWVkRnVydGhlckluZm9ybWF0aW9uRnJvbVRoZVJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNMZXR0ZXJPZkluc3RydWN0aW9uc0FpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0T2ZUcmFuc2FjdGlvbnNGb3JJbmZvcm1hdGlvbk9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnRhZ2VPcmRlckxvY2FsVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlBc3NvY2lhdGVkT2JqZWN0QWRtaW5pc3RyYXRpb25NZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckRlc3BhdGNoQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tYXJ5U2FsZXNSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyU3RhdHVzRW5xdWlyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGF0dXNSZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmF0aW9uUmVnYXJkaW5nVGhlSW53YXJkQW5kT3V0d2FyZE1vdmVtZW50T2ZWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZlVzYWdlT2ZCZXJ0aE9yTW9vcmluZ0ZhY2lsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yVmVzc2Vsc0VudGVyaW5nSW50b1BvcnRBcmVhSW5OaWdodC1UaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZkVtZXJnZW5jeVNoaWZ0aW5nRnJvbVRoZURlc2lnbmF0ZWRQbGFjZUluUG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N1bW1hcnlEZWNsYXJhdGlvbldpdGhvdXRDb21tZXJjaWFsRGV0YWlsQWx0ZXJuYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRCb25kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkRpc3RyaWJ1dGlvbk9mRG9jdW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbk5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGF5bWVudEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpcmVJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmLUJpbGxlZEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGNyZWRlcmVJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3JlZEludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm1lbnRJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWN0b3JlZENyZWRpdE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxBY2NvdW50U3VtbWFyeVJlc3BvbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc0RvY2tpbmdEZXNwYXRjaEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudERlc3BhdGNoQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlcHRpb25hbE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3NoaXBtZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzRG9ja2luZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWFuc09mVHJhbnNwb3J0YXRpb25BdmFpbGFiaWxpdHlJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydGF0aW9uU2NoZWR1bGVJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50RGVsaXZlcnlOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc0ZvckJhbmtUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JCYW5rZXJzRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QYXltZW50QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFBheW1lbnRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjZXB0YW5jZUFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXROZWdvdGlhdGlvbkFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JCYW5rZXJzR3VhcmFudGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzR3VhcmFudGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdExldHRlck9mSW5kZW1uaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVhZHZpY2VPZkFDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25PcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRzUHJlc2VudGF0aW9uRm9ybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZFBheW1lbnRPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVQYXltZW50T3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRDcmVkaXRBZHZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0QWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZlcnNhbE9mRGViaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmVyc2FsT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE5vdGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRUcmFuc2ZlckFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnROb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1pdHRhbmNlQWR2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXJzRHJhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkV4Y2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9taXNzb3J5Tm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50T2ZBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnRPZkFjY291bnRNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VEZWNsYXJhdGlvblNoZWV0Qm9yZGVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyc0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyTm90ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ0luc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0FkdmljZVRvSW1wb3J0QWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNBZHZpY2VUb0V4cG9ydGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0NlcnRpZmljYXRlT2ZSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ05vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRlcnNXYXJlaG91c2VSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc1JlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFyZ2VzRG9jdW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VXYXJyYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXRlUGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsTXVsdGlwdXJwb3NlVHJhbnNwb3J0RG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdENhcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdPcmlnaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ29weSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJCaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rZXJCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYVdheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5QmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tTmVnb3RpYWJsZU1hcml0aW1lVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlc1JlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkluZGVtbml0eUZvck5vbi1TdXJyZW5kZXJPZkJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyc0JpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbENvbnNpZ25tZW50Tm90ZUdlbmVyaWNUZXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkTGlzdC1TbWdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2NvcnRPZmZpY2lhbFJlY29nbml0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNoYXJnaW5nRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRDb25zaWdubWVudE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcldheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFpcldheWJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVBaXJXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmV3c0VmZmVjdHNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpY2VSYWlsVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVQb3N0UGFyY2VscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGltb2RhbENvbWJpbmVkVHJhbnNwb3J0RG9jdW1lbnRHZW5lcmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdoQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzQ2VydGlmaWNhdGVPZlRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWRUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpbW9kYWxUcmFuc3BvcnREb2N1bWVudEdlbmVyaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkVHJhbnNwb3J0QmlsbE9mTGFkaW5nTXVsdGltb2RhbEJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ0NvbmZpcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbGluZ0ZvcndhcmROb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsTm90aWNlR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZU9mQ2lyY3Vtc3RhbmNlc1ByZXZlbnRpbmdEZWxpdmVyeUdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2VPZkNpcmN1bXN0YW5jZXNQcmV2ZW50aW5nVHJhbnNwb3J0R29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Tm90aWNlR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5pZmVzdFVuaXRQYWNraW5nTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc05vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmljZU9mQ29sbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZTaGlwQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eU9mUmFkaW9DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5T2ZFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l2aWxMaWFiaWxpdHlGb3JPaWxDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGxpbmVEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVyYXREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVEZWNsYXJhdGlvbk9mSGVhbHRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUmVnaXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzU3RvcmVzRGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydExpY2VuY2VBcHBsaWNhdGlvbkZvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjaGFuZ2VDb250cm9sRGVjbGFyYXRpb25FeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hOb3RlTW9kZWxUMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbERvY3VtZW50VDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLVNlbmRpbmdDb25zaWdubWVudE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZU1vZGVsVDJMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9yRXhwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvRGVjbGFyYXRpb25EZXBhcnR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yR29vZHNDb250cm9sQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29udHJvbENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkZvclBoeXRvc2FuaXRhcnlDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5dG9zYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW5pdGFyeUNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJ5Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9ySW5zcGVjdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlT2ZPcmlnaW5BcHBsaWNhdGlvbkZvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25PZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxBcHBlbGxhdGlvbkNlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJlbmNlQ2VydGlmaWNhdGVPZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZk9yaWdpbkZvcm1Hc3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFySW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzR29vZHNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEb2N1bWVudEV4cG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50cmFzdGF0RGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VmVyaWZpY2F0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VBcHBsaWNhdGlvbkZvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aG91dENvbW1lcmNpYWxEZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbldpdGhDb21tZXJjaWFsQW5kSXRlbURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uV2l0aG91dEl0ZW1EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRm9yRXhjaGFuZ2VBbGxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduRXhjaGFuZ2VQZXJtaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQ29udHJvbERlY2xhcmF0aW9uSW1wb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9ySW1wb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25Gb3JIb21lVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW1tZWRpYXRlUmVsZWFzZURlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRGVsaXZlcnlOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0RlY2xhcmF0aW9uQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvblBvc3RQYXJjZWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhEZWNsYXJhdGlvblZhbHVlQWRkZWRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheERlY2xhcmF0aW9uR2VuZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0RlY2xhcmF0aW9uRm9yQ3VzdG9tc1RyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpZkZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpckNhcm5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNDYXJuZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV1cjFDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUFkbWluaXN0cmF0aXZlRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxSZXNwb25zZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVzcG9uc2VDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcnJvclJlc3BvbnNlQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZVJlc3BvbnNlQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q2FsY3VsYXRpb25Db25maXJtYXRpb25SZXNwb25zZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhUHJpb3JBbGxvY2F0aW9uQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlzdGljYWxEb2N1bWVudEltcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25Gb3JEb2N1bWVudGFyeUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdXN0b21zRG9jdW1lbnRNZXNzYWdlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEb2N1bWVudEF0dGFjaGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iRG9jdW1lbnRBdHRhY2hlZCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhY2thZ2VEb2MiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRG9jdW1lbnRBdHRhY2hlZCIgdHlwZT0iTGlzdE9mRG9jdW1lbnRBdHRhY2hlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV0dXJuYWJsZUNvbnRhaW5lckluZm8iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV0dXJuYWJsZUNvbnRhaW5lclBhcnROdW1iZXIiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0TnVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGVkIiB0eXBlPSJQYXltZW50UmVzcG9uc2liaWxpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXltZW50UmVzcG9uc2liaWxpdHlDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5Mb2FkQ29kZWQiIHR5cGU9IlJldHVybkxvYWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXR1cm5Mb2FkQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmV0dXJuTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuYWJsZUNvbnRhaW5lckluZm8iIHR5cGU9IlJldHVybmFibGVDb250YWluZXJJbmZvIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBheW1lbnRSZXNwb25zaWJpbGl0eUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkQnlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5U3VwcGxpZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmV0dXJuTG9hZENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRFaXRoRW1wdHk0QmxvY2tGb3JCbG9ja2luZ1B1cnBvc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lcldpdGhEdW5uYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkV2l0aFByb2R1Y3Rpb25NYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWRFbXB0eUFuZExvYWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jzb2xldGVNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkV2l0aEV4Y2Vzc1JldHVybmVkUHJvZHVjdGlvbk1hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkZWRXaXRoUmVqZWN0ZWRNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBhcnRPYnNvbGV0ZUNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkV2l0aFJldHVybmVkUHJvY2Vzc2VkTWF0ZXJpYWwiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyU3VtbWFyeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOdW1iZXJPZkxpbmVzIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFRheCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5VmFsdWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxBbW91bnQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNb25ldGFyeVZhbHVlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNwb3J0UGFja2FnaW5nVG90YWxzIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdW1tYXJ5Tm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJTdW1tYXJ5IiB0eXBlPSJPcmRlclN1bW1hcnkiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zcG9ydFBhY2thZ2luZ1RvdGFscyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFBhY2thZ2VzIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFBhY2thZ2VEZXB0aCIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxUcmFuc3BvcnQiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsR3Jvc3NXZWlnaHQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbE5ldFdlaWdodCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRvdGFsTmV0TmV0V2VpZ2h0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVG90YWxUYXJlV2VpZ2h0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR3Jvc3NWb2x1bWUiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRQYWNrYWdpbmdUb3RhbHMiIHR5cGU9IlRyYW5zcG9ydFBhY2thZ2luZ1RvdGFscyIvPgorICAgIDwhLS0gU09YIGZvcm1hdCBkYXRhdHlwZXMgd2hlcmUgdGhleSBkaWZlciBmcm9tIHN0YW5kYXJkIFhTREwgZGF0YXR5cGVzLS0+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV17NH0oKCgwMXwwM3wwNXwwN3wwOHwxMHwxMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pfCgzWzAtMV0pKSl8KCgwNHwwNnwwOXwxMSkoKDBbMS05XSl8KFsxLTJdWzAtOV0pfDMwKSl8KCgwMikoKDBbMS05XSl8KFsxLTJdWzAtOV0pKSkpIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxUaW1lIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRGF0ZXRpbWUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSlUKCgoWzAtMV1bMC05XSl8KDJbMC0zXSkpKDooWzAtNV1bMC05XSkpezJ9KChcK3wtKSgoWzAtMV1bMC05XSl8KDJbMC0zXSkpOihbMC01XVswLTldKSk/KSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsQm9vbGVhbiI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJ0cnVlfGZhbHNlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxGbG9hdCI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmZsb2F0Ij4KKyAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4Y2JsRG91YmxlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZG91YmxlIj4KKyAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iKFwrfC0pP1swLTldKlwuP1swLTldKihFfGUpP1swLTldKiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL09yZGVyQ29uZmlybWF0aW9uLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlckNvbmZpcm1hdGlvbi54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNTZhYwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9PcmRlckNvbmZpcm1hdGlvbi54c2QKQEAgLTAsMCArMSwxNzA2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9InB1YmxpY2lkOm9yZy54Q0JMOnNjaGVtYXMvWENCTDM1L09yZGVyQ29uZmlybWF0aW9uLnhzZCIgdGFyZ2V0TmFtZXNwYWNlPSJwdWJsaWNpZDpvcmcueENCTDpzY2hlbWFzL1hDQkwzNS9PcmRlckNvbmZpcm1hdGlvbi54c2QiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgorICAgICAgICAgICAgWE1MIENvbW1vbiBCdXNpbmVzcyBMaWJyYXJ5IDMuNQorICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDAgQ29tbWVyY2UgT25lLCBJbmMuCisgICAgICAgICAgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICAgICAgICBEVEQncywgc2NoZW1hcyBhbmQgbW9kdWxlcyBpbiB0aGUgQ29tbWVyY2UgT25lIFhNTCBDb21tb24gQnVzaW5lc3MKKyAgICAgICAgICAgIExpYnJhcnkgVmVyc2lvbiAzLjUgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgc3BlY2lmaWVkCisgICAgICAgICAgICBhdCBodHRwOi8vd3d3LnhjYmwub3JnL2xpY2Vuc2UuaHRtbAorICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIAlQTEVBU0UgTk9URTogVGhpcyBzY2hlbWEsIHdoaWxzdCBpdCBkZXNjcmliZXMgaW4gZW50aXJldHkgYSB2YWxpZCwgc2luZ2xlLAorICAgICAgICAJeENCTCAzLjUgZG9jdW1lbnQsIGlzIGRlZmluZWQgdG8gYmUgaW4gYSBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0aGUgbWFpbiB4Q0JMIDMuNQorICAgICAgICAJbmFtZXNwYWNlLiBUaGVyZWZvcmUgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZnVsbCB4Q0JMIDMuNSBzY2hlbWEgaXMgdXNlZAorICAgICAgICAJZm9yIGZ1bGwgcHJvZHVjdGlvbiBzaXR1YXRpb25zLiBQbGVhc2Ugc2VlIHRoZSBub3RlcyBhdAorICAgICAgICAJPGEgaHJlZj0iaHR0cDovL3d3dy54Y2JsLm9yZy94Y2JsMzUveHNkL3NjaGVtYXMuaHRtbCI+d3d3LnhDQkwub3JnPC9hPi4KKyAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iT3JkZXJDb25maXJtYXRpb25IZWFkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbiIgdHlwZT0iT3JkZXJDb25maXJtYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZWxsZXJPcmRlckNvbmZpcm1hdGlvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlbGxlck9yZGVyTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25Jc3N1ZURhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckNvbmZpcm1hdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGFuZ3VhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iT3JkZXJDb25maXJtYXRpb25QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25IZWFkZXJTaG9ydERlc2NyaXB0aW9uIiB0eXBlPSJBbHBoYU51bTQwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlck5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mTmFtZVZhbHVlU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSGVhZGVyIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkhlYWRlciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvblR5cGVDb2RlZCIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvblR5cGUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25UeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyQ29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5EZWxpdmVyeSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGFuZ3VhZ2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxhbmd1YWdlQ29kZWQiIHR5cGU9Ikxhbmd1YWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGFuZ3VhZ2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhbGVDb2RlZCIgdHlwZT0iTG9jYWxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYWxlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iTGFuZ3VhZ2VEZXBlbmRlbnQiIHR5cGU9InhjYmxCb29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxhbmd1YWdlIiB0eXBlPSJMYW5ndWFnZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMYW5ndWFnZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZHoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImduIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im10Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJxdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJybyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1eiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InlpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iemEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InpoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6dSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMb2NhbGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImF3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJheiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJiIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYmgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJiaiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJidCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImJ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJieSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYnoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImN6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImR6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZqIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdiIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ2kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJnbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJncSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJndCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imd3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJneSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJociIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imh1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iam8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImpwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJraSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImtuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJrcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imt3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJreSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ia3oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibGMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibHUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imx2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1oIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtcSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im12Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJtdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im15Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJteiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJucCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im51Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJueiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icG4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InB5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJxYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJydSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icnciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRqIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idG4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0diIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InV6Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InZuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ2dSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inl1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ6YSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iem0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Inp3Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXJyZW5jeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3lDb2RlZCIgdHlwZT0iQ3VycmVuY3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDdXJyZW5jeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkN1cnJlbmN5IiB0eXBlPSJDdXJyZW5jeSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDdXJyZW5jeUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQURGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVJTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVdGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVpNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCU0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJIRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkRUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJZQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlROIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCT0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJBSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQldQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkdMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktIUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktZRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWE9GIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhQRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFJLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1pLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJES0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESkYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWENEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQ1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVHUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ZDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVRCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhFVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRktQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUkYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0VMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdJUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR05GIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHV1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFRHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhLRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBT1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMU0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFlEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNS0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVdLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1VUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVhOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNREwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1OVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWk0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1LIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5HIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBV0ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU9OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUV0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlpEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSU8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5HTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQR0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBZRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUExaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJPTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlVSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSV0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1REIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0tLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09TIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktSVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVNQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMS1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNIUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0RBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTREQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1JHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRKUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFpTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUVEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVR1giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVpTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWVVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVk5EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZRVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllVTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWk1LIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaV0QiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uUGFydHkiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnV5ZXJQYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBhcnR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlclBhcnR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcFRvUGFydHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uUGFydHkiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uUGFydHkiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnR5Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eUlEIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ERkJ1c2luZXNzIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJOYW1lQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb250YWN0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWNlaXZpbmdDb250YWN0Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udGFjdCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTaGlwcGluZ0NvbnRhY3QiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250YWN0Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVyQ29udGFjdHMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZDb250YWN0Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvcnJlc3BvbmRlbmNlTGFuZ3VhZ2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMYW5ndWFnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0eSIgdHlwZT0iUGFydHkiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IklkZW50aWZpZXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSWRlbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IklkZW50aWZpZXIiIHR5cGU9IklkZW50aWZpZXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFnZW5jeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWdlbmN5Q29kZWQiIHR5cGU9IkFnZW5jeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFnZW5jeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFnZW5jeURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29kZUxpc3RJZGVudGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWdlbmN5IiB0eXBlPSJBZ2VuY3kiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWdlbmN5Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFBTVZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQkNELVRoZU1pY3JvY29tcHV0ZXJJbmR1c3RyeUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0dJSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNPUkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVydGlzaW5nSW5kdXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFFQ01BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSUhBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxhYmFtYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxhc2thIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHVtaW51bUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkFwcGFyZWxNYW51ZmFjdHVyZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuRnVybml0dXJlTWFudWZhY3R1cmVyc0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbklyb25BbmRTdGVlbEluc3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5MYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5NZWRpY2FsQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGFwZXJJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUFdBQW5kT0NTSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Tb2NpZXR5Rm9yQXV0b21hdGlvbkluUGhhcm1hY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVGV4dGlsZU1hbnVmYWN0dXJlcnNJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOU0lBY2NyZWRpdGVkU3RhbmRhcmRzQ29tbWl0dGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcml6b25hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmthbnNhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNNRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeUJ1eWVyT3JCdXllcnNBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlEaXN0cmlidXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU1hcmtldFBsYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5TmF0aW9uYWxUcmFkZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeU93bmVyT2ZPcGVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlQYXJ0eU9yaWdpbmF0aW5nVGhlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVNlbGxlck9yU2VsbGVyc0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5VHJhbnNwb3J0Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNUTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFULUdlbGRhdXNnYWJlYXV0b21hdGVuU2VydmljZUdlc2VsbHNjaGFmdE1CSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtQXVzdHJpYW5DdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVC1BdXN0cmlhblBUVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVQtVmVyYmFuZE9lc3RlcnJlaWNoaXNjaGVyQmFua2VuVW5kQmFua2llcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFDT1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUFEQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQUlIVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQVBDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQVFJUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtQXVzdHJpYW5DdXN0b21zU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtRE9IIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1ISUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLUxJRkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLU5DQ0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVLVJPQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVUtU0FBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVS1UcmFkZWdhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFXUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVlTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFLUJlbGdpYW5DdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRS1CZWxnaWFuTWluaXN0cnlPZkZpbmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbGxjb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQklDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rSW5kdXN0cnlTeXN0ZW1zQWR2aXNvcnlDb21taXR0ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJSLUJhbmNvQ2VudHJhbERvQnJhemlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUi1NQUFuZFJBQUFuZExJTU5FVEFuZFJJTkVUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1DUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBLUNTSU8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGlmb3JuaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGlmb3JuaWFMYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5GcmVpZ2h0Q2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmJpZGVNYW51ZmFjdHVyZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1SZXZlbnVlQ2FuYWRhQ3VzdG9tc0FuZEV4Y2lzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQS1TQ0MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUNER1hJSUlENSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWEkwMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWElCMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VDREdYWFhJViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0VGSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1BZG1pbmlzdHJhdGlvbkZlZGVyYWxlRGVzQ29udHJpYnV0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtQXNzb2NpYXRpb25TdWlzc2VDb2RlRGVzQXJ0aWNsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUNhcmJ1cmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNILUNlbnRyYWxlU3Vpc3NlUG91ckxJbXBvcnRhdGlvbkR1Q2hhcmJvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0gtRGlyZWN0aW9uR2VuZXJhbGVEZXNEb3VhbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1EaXZpc2lvbkRlc0ltcG9ydGF0aW9uc0V0RXhwb3J0YXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1FbnRyZXByaXNlRGVzUFRUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1NaW5pc3RyeU9mVGF4YXRpb25DZW50cmFsQ3VzdG9tc0FuZFRheEFkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1PZmZpY2VGaWR1Y2lhaXJlRGVzSW1wb3J0YXRldXJzRGVEZW5yZWVzQWxpbWVudGFpcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1Td2lzc1NlY3VyaXRpZXNDbGVhcmluZ0NvcnBvcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSC1UZWxla3Vyc0FHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSURYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSUVDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZUFzc2lnbmVkQnlUaGVPcmdhbml6YXRpb25UaGF0SXNUaGVVbHRpbWF0ZURlc3RpbmF0aW9uT2ZUaGVUcmFuc2FjdGlvblNldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ08tRElBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3JhZG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1hbmRlclJvbWVBaXJEZXZlbG9wbWVudENlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY29yZEVESUdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aWN1dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbnNPblNBREFuZFRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHBlckFuZEJyYXNzRmFicmljYXRvcnNDb3VuY2lsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTy1TQkRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlEZXNpZ25hdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1NJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDU0lFeHRlbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VTSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQVJFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1CREkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUJJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtQlJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1ESU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLURUQUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUVESUJBVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZUxvZ2lzdGljc0FnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREUtR0RWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1HZXJtYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdlcm1hbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLUdNQkgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGF3YXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZBaXJGb3JjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mQXJteSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSGVhbHRoQW5kSHVtYW5TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSG91c2luZ0FuZFVyYmFuRGV2ZWxvcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkxhYm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZUaGVOYXZ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERS1TaWVtZW5zQUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFLVZEQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREZBUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRElOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3Rpb25HZW5lcmFsZURlc0RvdWFuZXNFdERyb2l0c0luZGlyZWN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZkNvbHVtYmlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstRUFOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESy1NSEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRLLU5CSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREstUEJTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5BbmRCcmFkc3RyZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkaWJ1aWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGllbE5vcmRpY0ZvcnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElGSUNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElURVVSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRElURVgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVFRzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVJRFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljVXRpbGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljSW5kdXN0cmllc0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFU0RYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUy1PREVUVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMtU3BhbmlzaEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVVLUVESUZJQ0FTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1FVElTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFVS1ST0ZFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFTTElOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQ0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZEQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEdvdmVybm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIaWdod2F5QWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1BVEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJLUZpbm5pc2hDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSS1UQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkktVGhlRmlubmlzaEJhbmtlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmlkYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUFHRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQXJ2QSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItQmFucXVlRGVGcmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUNGT05CIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1DTkFNVFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLURDUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItREdJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElGQ0FTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUi1FRElGUkFOQ0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUVESVRSQU5TUE9SVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItR0FMSUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLUdFTkNPRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlItSU5TRUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSLVJDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQUJJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BQlRBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1BcnRpY2xlTnVtYmVyQXNzb2NpYXRpb25MaW1pdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1Bc3NvY2lhdGlvbkZvclBheW1lbnRDbGVhcmluZ1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1CQUNTTGltaXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItQ0hBUFNBbmRUb3duQ2xlYXJpbmdDb21wYW55TGltaXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItRkxFRVRORVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCLUhNQ3VzdG9tc0FuZEV4Y2lzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0ItT0RFVFRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQi1UaGVDbGVhcmluZ0hvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9yZ2lhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwaGljc0NvbW11bmljYXRpb25zQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ItR3JlZWtDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhd2FpaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VBc3NvY2lhdGlvbk9mQW1lcmljYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEstSG9uZ0tvbmdDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUFQU08iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBUkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDQU8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGFobyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFLVJldmVudWVDb21taXNzaW9uZXJzQ3VzdG9tc0FFUHJvamVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwtSXNyYWVsQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsaW5vaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaWFuYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJDb250YWluZXJJbnRlckZyaWdvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQXNzb2NpYXRpb25PZkNvcnBvcmF0aW9uQWRtaW5pc3RyYXRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3NvY2lhdGlvbk9mSW5kdXN0cmlhbEFjY2lkZW50Qm9hcmRzQW5kQ29tbWlzc2lvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZHNPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklvd2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcm9uQW5kU3RlZWxTdGFuZGFyZHNDb21taXR0ZWVJU00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTLUljZWxhbmRDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU08iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVNlcnZpY2VzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtQXNzb2NpYXppb25lQmFuY2FyaWFJdGFsaWFuYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtSXRhbGlhbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklULU9ERVRURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQtU29jaWVhdGFJbnRlcmJhbmNhcmlhUGVyTEF1dG9tYXppb25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKYXBhbmVzZVN0YW5kYXJkc0Fzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1KYXBhbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpQLU1PVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAtTVNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUC1OQUNDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2Fuc2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZW50dWNreSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2luZ0luZHVzdHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlQW5kQW5udWl0eUluZHVzdHJ5Q29tbWl0dGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSS1MaWVjaHRlbnN0ZWluQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMbG95ZHNSZWdpc3Rlck9mU2hpcHBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdWlzaWFuYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVLUx1eGVtYm91cmdDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcnlsYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXNzYWNodXNldHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFNhZmV0eURhdGFTaGVldFByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWNoaWdhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlubmVzb3RhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaXNzaXBwaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzc291cmkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRhbmEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFua2Vyc0Fzc29jaWF0aW9uT2ZBbWVyaWNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWS1EYWdhbmdOZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLU1hbGF5c2lhQ2VudHJhbEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZLU1hbGF5c2lhQ3VzdG9tc0FuZEV4Y2lzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxBbGNvaG9sQmV2ZXJhZ2VDb250cm9sQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkJ1c2luZXNzQW5kRWR1Y2F0aW9uYWxSYWRpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxCdXNpbmVzc0Zvcm1zQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ2VudGVyZm9yU3RhdGVDb3VydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ290dG9uQ291bmNpbE9mQW1lcmljYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsTWVyY2hhbnRzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsV2hvbGVzYWxlRHJ1Z2dpc3RzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BVE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyYWxHYXNVdGlsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lYnJhc2thIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORU1BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZhZGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0hhbXBzaGlyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3SmVyc2V5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdNZXhpY28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld3NwYXBlckFzc29jaWF0aW9uT2ZBbWVyaWNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORlBBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSUNCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSU9TSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldGhlcmxhbmRzUmFpbHdheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUJhbmtHaXJvY2VudHJhbGVCViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtQkVBTkVUQlYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLUVBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtSW50ZXJwYXlDYXJkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtSW50ZXJwYXlHaXJhYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5MLU5ldGhlcmxhbmRzQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkwtT0RFVFRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J3ZWlnaWFuU3RhdGVSYWlsd2F5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8tTk9SUFJPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTy1Ob3J3ZWdpYW5CYW5rZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PLU5vcndlZ2lhbkludGVyYmFua1Jlc2VhcmNoT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2EtVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnlGb3J1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhDYXJvbGluYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhEYWtvdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlotTmV3WmVhbGFuZEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ERVRURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlT2ZNYW5hZ2VtZW50QW5kQnVkZ2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlUHJvZHVjdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9oaW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9rbGFob21hIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpY2FsSW5kdXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZWdvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1NIQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVubnN5bHZhbmlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5uc3lsdmFuaWFDb3VydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFQtQ0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBULVBvcnR1Z3Vlc2VDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVC1TSUJTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlSW5mb3JtYXRpb25JbmR1c3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmhvZGVJc2xhbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJJTkVUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlUtQklDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVS1TRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EtU2F1ZGlBcmFiaWFDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtQ2VudHJhbEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFLU9ERVRURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtU3ZlbnNrYUJhbmtmb2VyZW5pbmdlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0UtU3dlZGlzaEN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJzQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJU0FDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291dGhDYXJvbGluYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291dGhEYWtvdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQWdlbmN5QXNzaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRMb2FuR3VhcmFudG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTV0lGVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeUhlbHBJbmR1c3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVubmVzc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4YXNMYW5kVGl0bGVBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dGlsZURpc3RyaWJ1dG9yc0Fzc29jaWF0aW9uSW5jIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURENDLUVESUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRXLUNoaW5lc2VUYWlwZWlDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVy1UcmFkZS12YW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUlDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU5FQ0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOQ1RBRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzQ291cnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNNYXJpbmVDb3JwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzTnVjbGVhclJlZ3VsYXRvcnlDb21taXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQUlBRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQWlyVHJhbnNwb3J0QXNzb2NpYXRpb25PZkFtZXJpY2EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFJU0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFtZXJpY2FuUGV0cm9sZXVtSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BTlNJQVNDWDEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1BUEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFTVE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUFURiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQkFURiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQlhBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1DSElQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ0lEWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtQ00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUNPUEFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EQW5kQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRENJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ERUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURISFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURJU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURJU0NVUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRExNU08iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1ET0RBQUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLURPTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRE9UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1EU0FBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1FSUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtRkRBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GSVBTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1GTUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUZXUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtR1NBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1IQklDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLUhMNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtSVNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1NQVJBRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkFCQ0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5BSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTTmF0aW9uYWxDZW50ZXJGb3JIZWFsdGhTdGF0aXN0aWNzQ29tbWlzc2lvbk9mUHJvZmVzc2lvbmFsQW5kSG9zcGl0YWxBY3Rpdml0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1OYXRpb25hbE1vdG9yRnJlaWdodENsYXNzaWZpY2F0aW9uQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTkNDTUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5JU1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLU5SQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtTldEQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT0RUQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT0ZBQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtT01CIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1TdGFuZGFyZENhcnJpZXJBbHBoYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVREQ0MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVVDQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVU4tU1BTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVU9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUy1VU0NlbnN1c0J1cmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNDdXN0b21zU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVVNQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVMtVkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVZJQ1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVdTU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0YWgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpdHlJbmR1c3RyeUdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJtb250Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSUNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXJnaW5pYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzaGluZ3RvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VzdFZpcmdpbmlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSE1JUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lzY29uc2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXeW9taW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvckdlbmVyYWxPZkNhbmFkYSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb2RlTGlzdElkZW50aWZpZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZVNpdGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudFBhcmFtZXRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY29yZEV1cm9wZWVuUmVsYXRpZkF1VHJhbnNwb3J0SW50ZXJuYXRpb25hbERlc01hcmNoYW5kaXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudEFuYWx5c2lzQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50UmVsYXRpb25zaGlwVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNxdWlzaXRpb25BZHZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbk1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcXVpc2l0aW9uTWV0aG9kU3VmZml4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdGVQcmluY2lwYWxlRXhlcmNlZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdEaWFnbm9zaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2VFdmVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmVyc2VFdmVudE91dGNvbWVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpZFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDb21tb2RpdHlBbmRTcGVjaWFsSGFuZGxpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdE1pc3Npb25EZXNpZ25TZXJpZXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJEaW1lbnNpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0T3JDaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0VGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRlcm1pbmFsSWRlbnRpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnYXRpb25UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsUGF0aWVudERpYWdub3Npc1JlbGF0ZWRHcm91cHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBhdGllbnRSZWZpbmVkRGlhZ25vc2lzUmVsYXRlZEdyb3VwcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx0ZXJhdGlvbkxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1idWxhdG9yeVBhdGllbnRHcm91cHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudENvZGUtQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Qc3ljaGlhdHJpY0Fzc29jaWF0aW9uRGlhZ25vc3RpY1N0YXRpc3RpY2FsTWFudWFsT2ZNZW50YWxEaXNvcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuU29jaWV0eUZvclRlc3RpbmdBbmRNYXRlcmlhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFQb2xhcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGVubmFTdHJ1Y3R1cmVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRDbGFzc2lmaWNhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uQWNrbm93bGVkZ2VtZW50QW5kRXJyb3JDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25FcnJvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUXVlc3Rpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0UmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpY2xlU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldERldGFpbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0UmVjdXJyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRTdGF0dXNPclRyYW5zYWN0aW9uUmVwb3J0aW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRUcmFuc2ZlclN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRCeVJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZEJ5U2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbk9mQW1lcmljYW5SYWlscm9hZHNEZXByZXNjcmlwdGlvbkRpc3RyaWJ1dGlvbkxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc0RlcHJlc2NyaXB0aW9uRXhjZXB0aW9uTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzUmF0ZUVkaU5ldHdvcmtFcnJvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlRGVzY3JpcHRpb25RdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0aW9uT2ZBbWVyaWNhblJhaWxyb2Fkc1N0YW5kYXJkVHJhbnNwb3J0YXRpb25Db21tb2RpdHlDb2RlTWFzdGVyRGVzY3JpcHRpb25JbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzU3dpdGNoUmVsZWFzZUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3N1cmVkRGVsaXZlcnlJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ0hvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWREYXRhUHJvY2Vzc2luZ0VxdWlwbWVudElkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXdhcmRTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua0FkbWluaXN0cmF0aW9uSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rQnJhbmNoU29ydGluZ0lkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtTZWN1cml0aWVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNPZkp1cmlzZGljdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkUmVqZWN0aW9uUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsZWRPZmZpY2VJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQWR2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1N0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ0NsYXVzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZJbnNwZWN0aW9uQW5kU3VydmV5UGFydExvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlSZXNwb25zaWJpbGl0eUxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkluc3BlY3Rpb25BbmRTdXJ2ZXlTaGlwTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQ2hhbmdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDcmVkaXRSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nRGV0YWlsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nUmVwb3J0VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRW50aXR5RmlsaW5nU2VjdXJpdGllc0luZm9ybWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlGaWxpbmdTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eUZpbmFuY2lhbEluZm9ybWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFbnRpdHlTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0Z1bmN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0xlZ2FsU3RydWN0dXJlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NTaXplQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsU2lnbkRpcmVjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5JbnRlckVkaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZURlc2lnbmF0b3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VPcmlnaW5Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNoRGlzY291bnRTdGlwdWxhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdXNlTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXVzZU9mSW5qdXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F1c2VPZkxvc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWlsaW5nVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25SZXF1aXJlbWVudHNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVN1YmRpdmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVBheW1lbnRSZW1hcmtDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc09mUGl0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZVN0YXR1c1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUF1dG9tYXRlZFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtUGFydGljaXBhbnRzSWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtVW5pdmVyc2FsSWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXN0RGVzaWduYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2duaXphbmNlU3ltYm9sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLUluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxpc2lvbkluZHVzdHJ5RWxlY3Ryb25pY0NvbW1lcmNlQXNzb2NpYXRpb24tTG9zc0NhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLVBvaW50c09mSW1wYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsaXNpb25JbmR1c3RyeUVsZWN0cm9uaWNDb21tZXJjZUFzc29jaWF0aW9uLVByb2ZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpdGVybXMxOTkwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQW5kR292ZXJubWVudEVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERyaXZlcnNMaWNlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNDb21tb2RpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZU9wZXJhdGlvbnNIYXphcmRvdXNNYXRlcmlhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlT3BlcmF0aW9uc0luc3VyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zU2FmZXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVPcGVyYXRpb25zU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVSZWdpc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxWZWhpY2xlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVRpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsVmVoaWNsZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vZGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNSb3V0aW5nSWRlbnRpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvblR5cGVDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVDaGFyYWN0ZXJpc3RpY3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGFpbnRSZXF1ZXN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZVJldmlld0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNsdXNpb25FdmFsdWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNQcmVtaXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yc1ByZW1pc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uQW5kQ29udGFpbmVyaXphdGlvblBvaW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbkRldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RvckFsZXJ0TGlzdFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckFuZFJvbGwtT25PclJvbGwtT2ZmTnVtYmVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRlbnRJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENsb3NlLU91dEdyb3VwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REZWxpdmVyeURhdGVSZXZpc2lvbkFnZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RGdW5kUmVwb3J0aW5nVHJhbnNhY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQWxlcnRMaXN0U3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yUmV2aWV3TGlzdFN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXltZW50RGVkdWN0aW9uT3JDb2xsZWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXltZW50TGluZUl0ZW1TdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFNoaXBtZW50QWR2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZEludmVudG9yeUl0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sVW5pdERlc2lnbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb3ZlcnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252aWN0aW9uT2ZmZW5zZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlTG9naXN0aWNzUHJvZ3JhbVN1cHBvcnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVGaW5hbmNpYWxGaWxpbmdDcml0ZXJpYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlU3RhdGVtZW50RmlsaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbk9yQ2hhbmdlRm9yU3RvcmFnZUl0ZW1SZWNvcmRzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUFuZEFjdGl2aXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeUNvZGUtRmluYW5jZUFuZEFjcXVpc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5U3ViLUVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlEZXNpZ25hdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uQWRqdXN0bWVudFJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0QXBwZWFyYW5jZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydENhc2VTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydERpc3Bvc2l0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnREb2N1bWVudFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydElzc3VlZFdhcnJhbnRUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRPZkxhd0V2ZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRPZkxhd1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UGFydHlTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UGxlYWRpbmdUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VNb2RpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3BhLUNhbmFkaWFuUGF5bWVudHNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaW1pbmFsQ2hhcmdlR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyaXRpY2FsaXR5RGVzaWduYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1aXNpbmVUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFzc2V0RGV0YWlscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERlbnRhbFRlcm1pbm9sb2d5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpYWJpbGl0eURldGFpbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJNYWludGVuYW5jZUxldmVsTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcldpdGhpbkNvdW50cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21pemVkTm90aWNlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNBcmVhT2ZUcmFuc2FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RlY2xhcmF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RvbWVzdGljUG9ydExvY2F0aW9uQ29kZXMtVVNTY2hlZHVsZUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNGb3JlaWduUG9ydExvY2F0aW9uQ29kZXMtVVNTY2hlZHVsZUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnNwZWN0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ByZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNQcm9jZWR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWxlYXNlTm90aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU2ltcGxpZmllZFByb2NlZHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1NwZWNpYWxDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1N0YXR1c09mR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNUcmFuc2l0R3VhcmFudGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zVHJhbnNpdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNWYWx1YXRpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzUGFja2luZ1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVNoaXBwZWRPclJlY2VpdmVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yQnVzaW5lc3NUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuZGFudFBsZWFUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5zZVByaW9yaXRpZXNBbmRBbGxvY2F0aW9uc1N5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmFsTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2llbmN5Q2F1c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaWVuY3lJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGlucXVlbmN5SW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNvdXJjZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGVybUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWFuZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbWlsaXRhcml6YXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T2ZEZWZlbnNlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VBdmFpbGFiaWxpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VFdmFsdWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRXZlbnRQcm9ibGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlT3BlcmF0b3JUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlVXNhZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc0VuY291bnRlcmVkRHVyaW5nRXhhbWluYXRpb25BbmRJbnZlc3RpZ2F0aW9uT2ZJbmRpdmlkdWFsc0FuZFBvcHVsYXRpb25zQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlhZ25vc2lzUmVsYXRlZEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zdGljQW5kU3RhdGlzdGljYWxNYW51YWxPZk1lbnRhbERpc29yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0TnVtZXJpY2FsQ29udHJvbFN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeUFkdmljZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JlcGFuY3lJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmVwYW5jeVN0YXR1c09yRGlzcG9zaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NhbEF1dGhvcml0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsQ29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVxdWVzdGVkQnlDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2RhYWMtRGVwYXJ0bWVudE9mRGVmZW5zZUFjdGl2aXR5QWRkcmVzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljTGluZU9mQnVzaW5lc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3NlRm9ybUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlclBhcmFtZXRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbEJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxEdWVQcm9jZXNzU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZVdpdGhkcmF3YWxFeHRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlcnNMaWNlbnNlV2l0aGRyYXdhbFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc0xpY2Vuc2VXaXRoZHJhd2FsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0RldGFpbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdTdGF0dXNBZHZlcnNlRXZlbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVtcGluZ09yQ291bnRlcnZhaWxpbmdBc3Nlc3NtZW50TWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW1waW5nU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldENhbmFkYXM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bnMtRHVuQW5kQnJhZHN0cmVldFBsdXM0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5zU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb24yUGx1czJEdW5BbmRCcmFkc3RyZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5VGF4T3JGZWVQYXltZW50TWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeW5hbWljR2VuZXJhdG9yU2V0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHluYW1pY0xvY29tb3RpdmVUYWdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGlyYS1JZC1FZGlSZWdpc3RyYXRpb25BdXRob3JpdHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdEVycm9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsU3R1ZHlBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbWFnbmV0aWNUcmFuc21pdHRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmhhbmNlZFBhcnR5SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0bGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlSZWxhdGlvbnNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0YXR1c0xvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXJyb3JDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzc2VudGlhbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFRpbWVPZkFycml2YWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZVR5cGVMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRpbmdNZXRob2RTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdGhuaWNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YWx1YXRlV29ya0NhbmRpZGF0ZUxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGVXb3JrQ2FuZGlkYXRlUmVhc29uTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdmVudEFiYXRlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50Q29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50T3JFeHBvc3VyZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50UmVhcHBlYXJhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluYXRpb25GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjYXZhdGlvbkluZm9ybWF0aW9uQ29kZUxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc01hdGVyaWFsRGlzcG9zaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDb21tb2RpdHlDbGFzc2lmaWNhdGlvbi1VU1NjaGVkdWxlQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbnNpb25SZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV5ZUNvbG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlTZWN1cml0eUNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZVRvQXdhcmRSZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZUFkanVzdGFibGVSYXRlTW9ydGdhZ2VQbGFuQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLU1vcnRnYWdlSW5zdXJhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlLUZlZGVyYWxOYXRpb25hbE1vcnRnYWdlQXNzb2NpYXRpb24tUG9vbEZlYXR1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW5uaWVNYWUtRmVkZXJhbE5hdGlvbmFsTW9ydGdhZ2VBc3NvY2lhdGlvbi1SZW1pdHRhbmNlUHJvZ3JhbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbm5pZU1hZS1GZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uLVNwZWNpYWxGZWF0dXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlUmVmaW5hbmNlUGxhbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxGaW5hbmNlQ29kZUxpc3QxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSGVhbHRoQ2FyZUNvZGVMaXN0MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbExvZ2lzdGljc0NvZGVMaXN0MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFByb2N1cmVtZW50Q29kZUxpc3QxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVHJhbnNwb3J0YXRpb25Db2RlTGlzdDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEFuYWx5c2lzQ2F0ZWdvcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtQWxsb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSXRlbUF0dHJpYnV0ZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJdGVtUmVjbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsTWFuYWdlbWVudFNlcnZpY2VDYXNoLUxpbmtDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFJlZ2ltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUm91dGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50Rm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGVldFBhcmFtZXRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dPZlRoZUdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb2xsb3ctVXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25MaW5lT2ZCdXNpbmVzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzQ291bnRyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1UeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGluZ1Jlc3RyaWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLU1vcnRnYWdlSW5zdXJhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLVJlbWl0dGFuY2VQcm9ncmFtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZGRpZU1hYy1GZWRlcmFsSG9tZUxvYW5Nb3J0Z2FnZUNvcnBvcmF0aW9uLVNwZWNpYWxDaGFyYWN0ZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjUmVmaW5hbmNlUGxhbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVPbkJvYXJkU2l0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Rm9yd2FyZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVxdWVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW5jeUJhbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kUHVycG9zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2Fpbk9yTG9zc0luZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uQ3VzdG9tZXJTdXBwbHlDZW50ZXJOdW1iZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsVGVycml0b3J5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0TW91bnRpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9ncmFwaGljTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdsYXNzQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFnZW5jeVByb2NlZHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVPZkRpZmZpY3VsdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFpckNvbG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdBY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbml6ZWRTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxzQ3JlZGVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzUmVzcG9uc2VDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUNsYWltU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uQ29tbW9uUHJvY2VkdXJhbENvZGluZ1N5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uQ29tbW9uUHJvY2VkdXJhbENvZGluZ1N5c3RlbVByaW5jaXBhbFByb2NlZHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uRHVyYWJsZU1lZGljYWxFcXVpcG1lbnRSZWdpb25hbENhcnJpZXJDZXJ0aWZpY2F0ZU9mTWVkaWNhbE5lY2Vzc2l0eUZvcm1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvdmlkZXJDaGFyYWN0ZXJpc3RpY3NBbmRSZXNvdXJjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVQcm92aWRlclRheG9ub215Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbmR1c3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5kdXN0cnlPcmdhbml6YXRpb25JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9iYnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkljZDEwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZ5aW5nQ2hhcmFjdGVyaXN0aWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGl0eURpc2Nsb3N1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW11bml6YXRpb25JbmplY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RBeGlzT3JBbmFsb2dQb3J0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWN0UmVjb3JkZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudENvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Q29uc2VxdWVuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudExvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnRSZWxhdGVkQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Rlcm1zMTk4MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbEluc3VyYW5jZUZpbmFuY2lhbERldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFBhcnRpY2lwYXRpb25JbkNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxTZWN1cml0eUNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZXF1ZXN0UmVzdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblJlcXVlc3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxUcmVhdG1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5U2VsZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUGFyYW1ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ292ZXJhZ2VEZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUluZm9ybWF0aW9uSW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VQbGFuRGVzY3JpcHRpb25DaGFyYWN0ZXJpc3RpY3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnRhaW5lckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUNvbnRhaW5lclF1YW50aXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENsYXNzaWZpY2F0aW9uT2ZEaXNlYXNlc0NsaW5pY2FsTW9kaWZpY2F0aW9uUHJvY2VkdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsQ2xhc3NpZmljYXRpb25PZkRpc2Vhc2VzQ2xpbmljYWxNb2RpZmljYXRpb25QcmluY2lwYWxQcm9jZWR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxDbGFzc2lmaWNhdGlvbk9mRGlzZWFzZXNDbGluaWNhbE1vZGlmaWNhdGlvbi1JY2QtOS1DbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxTdGFuZGFyZERlc2lnbmF0aW9uU3lzdGVtRm9yVGVldGhBbmRBcmVhc09mVGhlT3JhbENhdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q2F0ZWdvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0aWdhdGlvblN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRGdW5kVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0bWVudFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklyc1F1YWxpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1Tb3VyY2luZ0NhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iQ2hhcmFjdGVyaXN0aWNzTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPcmlnaW5hdG9yTG9va3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludExpZmVJbnN1cmFuY2VJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsSGVhcmluZ1R5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbE9yZGVyVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGljaWFsU2VudGVuY2VUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5RXZlbnRMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpbmRPZkNvbnRyYWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2luZE9mTW9kaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JhdG9yeVJlc3VsdHNJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlUZXN0Q29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxDYXNlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxFdmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdHJ1Y3R1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZlJlY29tbWVuZGF0aW9uUmF0aW5nQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eURldGFpbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYWJpbGl0eVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVPckFubnVpdHlQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVNlcnZpY2VGZWF0dXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVN0YXR1c0NvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlUmVpbnN1cmFuY2VNZXNzYWdlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Db25kaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVPZkJ1c2luZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsZU9mQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsU291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uc0ZvclRhcmlmZkNhbGN1bGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naWNhbE9ic2VydmF0aW9uSWRlbnRpZmllck5hbWVzQW5kQ29kZXNDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naXN0aWNzQ29kZUxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NEZXNjcmlwdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NTZXZlcml0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckZvcmNlUHJvZ3JhbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VtZW50SW5kaWNhdG9yQ29kZS1QZXRyb2xldW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVhbENsYXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lQmVydGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVdoYXJmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQbGFjZU9yZ2FuaXphdGlvbklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQbGFjZVRyYWRpbmdQYXJ0bmVySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29udHJvbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZkNvbW11bmljYXRpb25zSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhbnNPZlRyYW5zcG9ydElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWNoYW5pemF0aW9uT2ZDb250cmFjdEFkbWluaXN0cmF0aW9uU2VydmljZXNTeXN0ZW1FcnJvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGlhQW5kU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEJlbmVmaXRzU2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bU9mVHJhbnNtaXNzaW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVyT3JnYW5pemF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0aG9kRXZhbHVhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZHNPZlBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QW5kQ2l2aWxpYW5HcmFkZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5QXNzaXN0YW5jZVByb2dyYW1BZGRyZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlub3JpdHlJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3Npb25JbXBhY3RTdGF0ZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUZ1bmN0aW9uRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluZGV4U291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktTWVkaWFPYmplY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hY2hhLU5hdGlvbmFsQXV0b21hdGVkQ2xlYXJpbmdIb3VzZUFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENvdW5jaWxGb3JQcmVzY3JpcHRpb25EcnVnUHJvZ3JhbXNSZWplY3RPclBheW1lbnRDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxDb3VuY2lsT25Db21wZW5zYXRpb25JbnN1cmFuY2VOYXR1cmVPZkluanVyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlUGFydE9mQm9keUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ291bmNpbE9uQ29tcGVuc2F0aW9uSW5zdXJhbmNlU291cmNlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE1vdG9yRnJlaWdodENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdGFuZGFyZFRvb3RoTnVtYmVyaW5nU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZkJ1eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZEZWJ0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZFdmVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdHVyZU9mSW5qdXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJlT2ZTdWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlN1aXRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXR1cmVPZlRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0xvbmdlckNvbnNpZGVyZWRGb3JBd2FyZFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9tZW5jbGF0dXJlQWN0aXZpdHlDbGFzc2lmaWNhdGlvbkVjb25vbXlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUG9zdGFsVG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWVBY3Rpdml0ZUZyYW5jYWlzZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGljZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibGlnYXRpb25WYXJpYW5jZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFNhZmV0eUFuZEhlYWx0aEFkbWluaXN0cmF0aW9uTmF0dXJlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvblBhcnRPZkJvZHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxTYWZldHlBbmRIZWFsdGhBZG1pbmlzdHJhdGlvblNvdXJjZU9mSW5qdXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ2FycmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyQW5kUmVsZWFzZU9wdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU9mV29ya2Vyc0NvbXBlbnNhdGlvblByb2dyYW1zTmF0dXJlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc09jY3VwYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc1BhcnRPZkJvZHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VPZldvcmtlcnNDb21wZW5zYXRpb25Qcm9ncmFtc1NvdXJjZU9mSW5qdXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyc2l6ZU9yT3ZlcndlaWdodENyZWRlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcFJpZ2h0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZUZhaWx1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nQW5kT3JVbnBhY2tpbmdGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxBQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxCQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1JlcXVpcmVtZW50TGV2ZWxDQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydE9mQm9keUFmZmVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0T2ZCb2R5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc3BvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRFdmVudFByb2JsZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50QmVoYXZpb3VyUmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZGVzdHJpYW5Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5QW5kQ29udGVudHNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1CaWxsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtTGFuZENhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1MZWFzZVN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdERpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Qcm9kdWN0UG9pbnQtT2YtU2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFNlbGxpbmdBcnJhbmdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUHJvZHVjdFZhbHVlQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUmVndWxhdG9yeVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVJveWFsdHlDYWxjdWxhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtUm95YWx0eVRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Vbml0ZWRTdGF0ZXNHZW9sb2dpY2FsU3VydmV5Rm9ybWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbEFjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGV0cm9sZXVtV2VsbENsYXNzaWZpY2F0aW9uU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVdlbGxTaHV0LUluUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1XZWxsVGVzdEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbENoYXJhY3RlcmlzdGljc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Q2xlYXJhbmNlT2ZmaWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXNJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lPbkNsYWltSW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lSZXNlcnZlVmFsdWF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGFsSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWxTZXJ2aWNlQ2FycmllclJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0Y29kZURpcmVjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdE1hcmtldFN0dWR5U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2lvdXNNZXRhbHNJbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZXJ2YXRpb25EYXRhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VydmF0aW9uTWF0ZXJpYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2ZW50aXZlTWVhc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeURpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsRGlhZ25vc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxQYXJ0eUNpdGl6ZW5zaGlwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlEZXNpZ25hdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VyRmluYW5jaWFsSGlzdG9yeUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFF1YWxpdHlEZWZpY2llbmN5UmVwb3J0U3VtbWFyeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTdXBwbHlDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Zlc3Npb25hbERlc2lnbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1PcmlnaW5hdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbVllYXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5T3duZXJzaGlwRXh0ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU93bmVyc2hpcFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVJlY29yZFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5U291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eVVuZGVyd3JpdGluZ0NvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ByaWV0YXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udHJhY3RPZmZpY2VySW5zdHJ1Y3Rpb25zQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVycG9zZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBbGVydExpc3RSZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlBc3N1cmFuY2VTaXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyVW5pdFBhY2tDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWVyeU9wdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXJ5U3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb0ZyZXF1ZW5jeVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU2VydmljZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvU3lzdGVtVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEFkZGl0aW9uYWxDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsY2FyTGV0dGVyTWFya2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbERvY3VtZW50TmFtZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYW5kbGluZ1Jlc3RyaWN0aW9uc0FuZEluc3RydWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbEhhcm1vbml6ZWRDb2RpZmljYXRpb25PZlRhcmlmZnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxIYXJtb25pemVkRXF1aXBtZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFJvdXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFVuaWZpZWROb21lbmNsYXR1cmVPZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5Q29tcGFueU5ldHdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWx3YXlDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUZyb250aWVyQW5kVHJhbnNpdFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5TG9jYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsd2F5U2VydmljZXNIYXJtb25pemVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRpbmdTdW1tYXJ5VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVBc3NldFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvckNvbnRyYWN0RGVsaXZlcnlEYXRlUmV2aXNpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JEZWxheWVkQ2xvc2luZ09mQ29udHJhY3RGaWxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yRGlzcG9zYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JGaW5hbmNpYWxJdGVtRGV0YWlsQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Gb3JQdWJsaWNSZWNvcmRGaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXNvbkZvclJlcXVpc2l0aW9uaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50T2ZCaWxsaW5nU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kYXRpb25zUmVnYXJkaW5nRGVsYXllZERlbGl2ZXJpZXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRQcmVjZWRlbmNlQmFzZWRPbkl0c0N1cnJlbmN5SW5UaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VBbmRTdGF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGlvblVuaXRPcGVyYXRpbmdNb2RlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3RvckFjdGl2aXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VNb25ldGFyeVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUG9saWN5QXR0cmlidXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0QWR2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0SW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZERldmljZUFwcGxpY2FiaWxpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpZ2lvdXNBZmZpbGlhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWVkaWFsQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhYmxlQWNjZXNzb3JpZXNBbmRTcGVjaWFsRXF1aXBtZW50T25SYWlsY2FycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0YWJsZUV2ZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0YWJsZUV2ZW50U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0RGlzdHJpYnV0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0U291cmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmVCdXlJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudHNJbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jeUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRpYWxBbmRDb21tZXJjaWFsUm9vbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNlU3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3Rpb25zQW5kUHJvaGliaXRpb25zUGxhY2VkT25UaGVSZS1Vc2VPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWx0RXZhbHVhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZEluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENoYXJhY3RlcmlzdGljQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHdheURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZHdheVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVuVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5QW5kRml0bmVzc0VsZWN0cm9uaWNSZWNvcmRTeXN0ZW1zRXJyb3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlBbmRGaXRuZXNzRWxlY3Ryb25pY1JlY29yZFN5c3RlbXNTdWJzY3JpcHRpb25PcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhZmV0eUhhemFyZExvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5UmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcmljZUNvbmRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbHZhZ2VEaXNwb3NpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUV4dHJhY3Rpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VhdmFuT3duZXJzaGlwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5RGlhZ25vc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlTb3VyY2VPZkluanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaGFyZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBbmRBZ2VuY3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPY2N1cGF0aW9uQ2F0ZWdvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPY2N1cGF0aW9uQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3RBY3RPcGVyYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50T3JQYXlvdXRPcHRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudEFjY2VwdGFuY2VEaXNjcmVwYW5jeUV4cGxhbmF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRIb2xkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnRSZWxlYXNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlU3RhdGVSZWdpc3RyYXRpb25TeXN0ZW1BbmRPcGVyYXRpbmdBdXRob3JpdHlDcmVkZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVVc2VMYWJlbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVBbmRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2luVG9uZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQXJtc0Vycm9yVHJhbnNhY3Rpb25SZWplY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEFybXNUcmFuc2FjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbkNhbmNlbGxhdGlvblJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VuZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlTWFpbnRlbmFuY2VBbmRSZWNvdmVyYWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGVwb3NpdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZU9mRGlzY2xvc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZJbmp1cnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxlYWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkxvc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2F0ZWdvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ29udHJhY3RQcm92aXNpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsRGF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxNYXJrZXRpbmdUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hcmtpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWF0ZXJpYWxJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9ncmFtUmVxdWlyZW1lbnRTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUmVpbWJ1cnNhYmxlUHJvdmlzaW9uc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxSZXF1aXJlbWVudExvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFJlcXVpcmVtZW50c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZE9jY3VwYXRpb25DbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGV4dEFjY29yZGluZ1VTRW1iYXJnb1JlZ3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRDbGF1c2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRleHRGb3JFeHBvcnRBY2NvcmRpbmdOYXRpb25hbFByZXNjcmlwdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGlvbkNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aW9uQ2xhc3NpZmljYXRpb25UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbEFkbWluaXN0cmF0aXZlSW5mb3JtYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbE5hdHVyZU9mVHJhbnNhY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY2FsT2JqZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpc3RpY0J1bmRlc0FtdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrRXhjaGFuZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0Z1bmRPck5vbi1TdG9ja0Z1bmRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRBY3Rpdml0eVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50QXdhcmRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvbkFjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUGF5bWVudE9wdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnJvZ2F0aW9uUmVxdWVzdENvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJyb2dhdGlvblJlc3BvbnNlQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlVHlwZU9mUGFja0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1ZmZpeE9yTGltaXRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tb25zVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbERhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhcnlBY2NvdW50aW5nQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNTdG9ja1R1cm5vdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlDb25kaXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRGVzY3JpcHRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW50YXhOb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtYXRpemVkTm9tZW5jbGF0dXJlT2ZIdW1hbkFuZFZldGVyaW5hcnlNZWRpY2luZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QXNzZXNzbWVudE1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T3JGZWVFeGVtcHRpb25SZWFzb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQYXJ0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxBc3Nlc3NtZW50Q2hlY2tsaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVEaXJlY3RvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlQ2hhcmFjdGVyaXN0aWNMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlT3duZXJMb29rdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBsYXRlVHlwZUxvb2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zT2ZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVydGlhcnlEaWFnbm9zaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdEZW1vZ3JhcGhpY0NhdGVnb3J5Q29kZUxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdTZXJ2aWNlUXVlc3Rpb25Db2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1N0YXRpc3RpY2FsQ2F0ZWdvcnlDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFJlc3VsdHNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZURvY3VtZW50Q29kZUxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRXhjZXB0aW9uQW5kUmVxdWlyZW1lbnRDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblN0YXR1c0luZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQmlsbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uSG9sZGluZ0RlbGF5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25Nb2RlT3JNZXRob2RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbk1vZGVSZWFzb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblByaW9yaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZUFuZEJhbmtTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlTeW1ib2xDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlbmRSZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVBZGp1c3RtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFuZENhdXNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUR1ZS1JbkluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUlkZW50aXR5Q2hhbmdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUluc3BlY3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlTnVtZXJpY2FsQ29udHJvbFN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkFzc2V0c0FuZExpYWJpbGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZBc3Npc3RhbmNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQmlsbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkJ1c2luZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ2FyZ29Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZDb250cmFjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkNvbnRyYWN0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZEZWxheUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkZpbmFuY2lhbEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkZpcm1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbmR1c3RyaWFsQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZklucXVpcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZJc3N1ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkxvY2F0aW9uUmVjb25jaWxpYXRpb25SZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZNZWRpYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlBhY2thZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlByb2N1cmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZTdG9yYWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mU3VydmV5UXVlc3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVQYWNrQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVBoeXNpY2FsSW52ZW50b3J5T3JUcmFuc2FjdGlvbkhpc3RvcnlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVJlY2lwaWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY2xhaW1lZFByb3BlcnR5QWRkaXRpb25zRGVsZXRpb25zQW5kRGVkdWN0aW9uc0NvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNsYWltZWRQcm9wZXJ0eVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlmb3JtRnJlaWdodENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pZm9ybVJlc2lkZW50aWFsQXBwcmFpc2FsQXR0cmlidXRlc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zQ29tbW9uQ29kaW5nU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWROYXRpb25zU3RhbmRhcmRQcm9kdWN0c0FuZFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0ZWRTdGF0ZXNEZXBhcnRtZW50T2ZIZWFsdGhBbmRIdW1hblNlcnZpY2VzT2ZmaWNlT2ZWaXRhbFN0YXRpc3RpY3NFLUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc29saWNpdGVkUHJvcG9zYWxSZWplY3Rpb25SZWFzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpemF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjY2luYXRpb25Jbm5vY3VsYXRpb25Pcklzb2xhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWVBZGRlZFRheElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlQ2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVPY2N1cGFudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVQYXJhbWV0ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdGF0dXNBbmRUZXJtc09mQ2FycmlhZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdG93YWdlTG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxTdXN0YWluaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlld1BhcmFtZXRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpb2xhdGlvblR5cGVDb2RlTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm95YWdlRG9jdW1lbnROdW1iZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VNYW5pZmVzdFJlZmVyZW5jZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyUmVzZXJ2ZU1hdGVyaWFsUmVxdWlyZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckNvbW1vZGl0eUFuZFNwZWNpYWxIYW5kbGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyVGVybWluYWxJZGVudGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0T3JGcmFnaWxpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVuRGlzY292ZXJlZExvb2t1cCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSWRlbnRpZmllciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mSWRlbnRpZmllciIgdHlwZT0iTGlzdE9mSWRlbnRpZmllciIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZUFkZHJlc3MiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXh0ZXJuYWxBZGRyZXNzSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lMSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmFtZTIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5hbWUzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUE9Cb3giLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSG91c2VOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN0cmVldFN1cHBsZW1lbnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdHJlZXRTdXBwbGVtZW50MiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnVpbGRpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZsb29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSb29tTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmhvdXNlTWFpbCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVwYXJ0bWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUG9zdGFsQ29kZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2l0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJlZ2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGlzdHJpY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUaW1lem9uZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlZCIgdHlwZT0iQWRkcmVzc1R5cGVDb2RlIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkFkZHJlc3NUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lQWRkcmVzcyIgdHlwZT0iTmFtZUFkZHJlc3MiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBPQm94Ij4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iUE9Cb3hQb3N0YWxDb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBPQm94IiB0eXBlPSJQT0JveCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVnaW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWdpb25Db2RlZCIgdHlwZT0iUmVnaW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVnaW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVnaW9uIiB0eXBlPSJSZWdpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVnaW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVQUNUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVU5TVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVRTEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVEFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVZJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJERiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJFUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJHTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJSUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlJUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FBQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FCQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FNQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FORiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FPTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FRQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JCWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JDViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JERiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JERyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JETyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JEWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JFUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JGTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JHWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JISSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JITCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JIVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JJVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JLRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JLSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JNWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JOVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JPWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JQWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JSVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JTWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JURCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JXVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0JZVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRBViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRCWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRDWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRGUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRJTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRJUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVROVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRQWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRSViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRTViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRUViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRVRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVRWViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNBWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNERSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNISSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNJTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNLUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNLWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNMQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNNVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNORCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNOWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNPUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNQQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNSSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNUWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNVVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNXWSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ291bnRyeSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ291bnRyeUNvZGVkIiB0eXBlPSJDb3VudHJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvdW50cnkiIHR5cGU9IkNvdW50cnkiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ291bnRyeUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1LIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1aIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5aIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWlciLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRpbWV6b25lIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUaW1lem9uZUNvZGVkIiB0eXBlPSJUaW1lem9uZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRpbWV6b25lQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGltZXpvbmUiIHR5cGU9IlRpbWV6b25lIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRpbWV6b25lQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTIuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTEuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEwLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA5LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOS4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDkuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwOC4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDguMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA4LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDcuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA3LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNy4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA2LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNi4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDYuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDUuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA1LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDQuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjA0LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwNC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAzLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMy4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDMuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMi4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDIuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAyLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDEuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAxLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMS4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjAwLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIwMC4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMDAuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMC4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAwLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDAuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAxLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDEuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMS40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDIuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMi4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAyLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wMy4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTAzLjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDMuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA0LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDQuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDUuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA1LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNi4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA2LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDYuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA3LjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDcuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wNy40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDguMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOC4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA4LjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0wOS4xNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTA5LjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMDkuNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC4wMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTEwLjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTAuMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMC40NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjAwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTEuMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii0xMS4zMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iLTExLjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSItMTIuMDAiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQWRkcmVzc1R5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BheWFibGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlbWVudFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxEZWxpdmVyeUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxQaWNrVXBBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVSZXR1cm5BZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUFkZHJlc3NlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhaWxtZW50V2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRPcGVuaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxBbmRTaGlwVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5keUFuZENvbmZlY3Rpb25zRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBc3NpZ25lZFdlbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRPaWxGaWVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsdGFudHNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3B5TWVzc2FnZVRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25NYWlsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpZmZlcmVudFByZW1pc2VBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50T3JNZXNzYWdlSXNzdWVyT3JTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcC1PZmZMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YWJsaXNoZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsaW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNZXNzYWdlUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmFsRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkRpc2Nsb3N1cmVJbmZvcm1hdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblJlZ2lzdHJhdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlb25Cb2FyZFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm96ZW5EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJhZ2VkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1BsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvbkVuZGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblBvaW50MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uU3RhcnRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVkRnJvbUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUGxhY2VPZkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uU3RhdGVQcmluY2lwYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZWRBdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW4tU3RvcmVCYWtlcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RCcmVha1Rlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbENoYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kc0ZvckN1c3RvbXNFeGFtaW5hdGlvbkJlZm9yZUNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkxvYWRFeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZlNwb3RGb3JTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNwb3NpdGlvbkF1dGhvcml6YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhdERlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3Job29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdXBwbHlTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVGVtcG9yYXJ5U3RvcmFnZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luTWFpbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5TdWJsb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGVwYXJ0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkFyZWFMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25pbmdJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoYXJtYWN5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrVXBBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVTZWdtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnRCb3VuZGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJvdHRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbE1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUluc3BlY3Rpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWlzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U2VydmljZXNBbmRSZXBhaXJzQ2VudHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29vcmRpbmF0aW9uT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRNZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0Wm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlclNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQb2ludEZvckN1c3RvbWVyU2FtcGxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nU3ViLUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkLUtlZXBpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyaW5nT3V0bGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJPclJlZnVyYmlzaExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW5jZU9yRG9taWNpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZXNUb0JlUmV0dXJuZWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5TG9jYXRpb25BZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRIb21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWx0ZXJlZFdvcmtzaG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJhc2VTdGF0aW9uTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvQW5kU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG9JZkRpZmZlcmVudEZyb21CaWxsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlhdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlRmFjaWxpdHlBdE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RPckNvZ25pemFudFNlY3VyaXR5T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpZGlhcnlEaXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJPck1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29ycG9yYXRlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2xsZWN0b3JzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nTGFib3JhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZUN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVBhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1NZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhdGlvbkhvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlkZW9EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3QiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdElEIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29udGFjdEZ1bmN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb250YWN0RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mQ29udGFjdE51bWJlciIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdCIgdHlwZT0iQ29udGFjdCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0RnVuY3Rpb25Db2RlZCIgdHlwZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdEZ1bmN0aW9uIiB0eXBlPSJDb250YWN0RnVuY3Rpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdEZ1bmN0aW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGluZ09mZmljaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nY29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEluc3VyYW5jZUluZm9ybWF0aW9uQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmVDb250cmFjdGluZ09mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmdGVyLUhvdXJzQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnRTY2hlZHVsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW50aW9uLVRvUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRGaW5hbmNpYWxDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkTmVnb3RpYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2luZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxJbnF1aXJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRTdGFmZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1VuaXRNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllck5hbWVvckRlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBREFuZENBTVNwZWNpYWxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpcm1hbk9mVGhlQm9hcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT3JkZXJBcHByb3ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpZWZFeGVjdXRpdmVPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkZpbmFuY2lhbE9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWVmSW5mb3JtYXRpb25PZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZk9wZXJhdGluZ09mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlXb3Jrc0F1dGhvcml0eUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFwcHJvdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1zQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdob3VzZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrT2ZDb3VydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tQm9ycm93ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUludmVzdGlnYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWdlb2ZFZHVjYXRpb25BZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcG9uZW50RW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXB1dGVyU3lzdGVtc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRFbXBsb3llckNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZFdpdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jwb3JhdGVQdXJjaGFzaW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbmRTY2hlZHVsZUNvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckNvbnRhY3RHcmFudGluZ0FwcG9pbnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVuZ2luZWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUluc3RydWN0aW9uc0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRhbFNjaG9vbEFkbWlzc2lvbnNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPckVtcGxveWVlVG9FeGVjdXRlRXhwb3J0UHJvY2VkdXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9yRW1wbG95ZWVUb0V4ZWN1dGVJbXBvcnRQcm9jZWR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JQZXJzb25SZXNwb25zaWJsZUZvclByb2Nlc3NpbmdQdXJjaGFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2ZWxvcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RvcnlBZHZlcnRpc2luZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uRGlyZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlzaW9uTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRURJQ29vcmRpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkNvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2l0eVN1cHBseUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1N1Ym1pc3Npb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeUNvbnRhY3QtQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LU1pbGl0YXJ5VHJhZmZpY01hbmFnZW1lbnRDb21tYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lDb250YWN0LVNoaXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeURhbmdlcm91c0dvb2RzQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbmluZ1Byb2dyYW1zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVWaWNlLVByZXNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxBaWRPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nTGVuZGVyQWRtaW5pc3RyYXRpdmVDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU3VwcGx5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWl2aW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZHVhdGVBZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUJ1c2luZXNzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUVuZ2luZWVyaW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0ZUZpbmVBcnRzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWlkYW5jZUNvdW5zZWxvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25EaXNzZW1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0Rm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZVbml0T3JDb21wdXRlckRhdGFQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh1bWFuUmVzb3VyY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlckNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1aW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRXb3JrQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kcmVnaXN0cnlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdGaXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdTY2hvb2xBZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEF1ZGl0aW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsUHVyY2hhc2luZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmdQbGFudENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldGluZ0RpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbENvbnRyb2xDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxIYW5kbGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU2FmZXR5RGF0YVNoZWV0Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJlY2lwaWVudENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlU3RhZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VWZW5kb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0J1c2luZXNzUHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RGV2ZWxvcG1lbnRzQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90YXJ5UHVibGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcmljYWxDb250cm9sRW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZVN0YWZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckFkdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2FnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudG9yR3VhcmRpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdMYWJvcmF0b3J5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0aWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNDbGFpbU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9ybWFuY2VFdmFsdWF0aW9uQ29tbWl0dGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25uZWxDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZDb2xsZWN0aW9uQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRlbGl2ZXJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbnRNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudE9yRXF1aXBtZW50Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1NYWludGVuYW5jZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRFbmdpbmVlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlYXdhcmRTdXJ2ZXlNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q29udHJvbFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5VGF4cGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFN0dWR5Q29udGFjdG9yQXV0aG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9iYXRpb25vckxlZ2FsT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc0VuZ2luZWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25SZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE1hbmFnZW1lbnRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtRGlyZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1NYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0RGlyZWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RNYW5hZ2VtZW50Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZUNvb3JkaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljUmVsYXRpb25zQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzaW5nQ29udHJhY3RpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvb3JkaW5hdG9yQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VydmV5b3JDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVTdXBlcnZpc29yT3JDbGVyayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5S2V5SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlUHJvcGVydHlPY2N1cGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlT3JDaGFyZ2ViYWNrQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRG9ja0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGFsQ29tcGFueUFkbWluaXN0cmF0aXZlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0QXV0aG9yaXplciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UHJlcGFyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uZGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9yQ29tcHV0ZXJEYXRhUHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG9uc2libGVQZXJzb25mb3JJbmZvcm1hdGlvbkRpc3NlbWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlUGVyc29uRm9ySW5mb3JtYXRpb25Qcm9kdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdBbmRSZXByaWNpbmdDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0FkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlcHJlc2VudGF0aXZlT3JEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZUNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbENsZXJrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xvZlRoZW9sb2d5QWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sb2ZWZXRlcmluYXJ5TWVkaWNpbmVBZG1pc3Npb25zT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xQcmluY2lwYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVRheHBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyV3JpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlVGVhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVRlY2huaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlcnZpY2VzV29ya2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2Z0d2FyZUhvdXNlQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFByb2dyYW1Db250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVkZW50aW5BYnNlbnRpYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHlTdWJtaXR0ZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0aW5nQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1zQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnRhdGlvblJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsTWFya2V0aW5nUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFdyaXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zTmV0d29ya0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZUFuc3dlcmluZ1NlcnZpY2VDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlckRldmVsb3BlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkLVBhcnR5QWRtaW5pc3RyYXRvckNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd25QbGFubmluZ0NvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWZmaWNBZG1pbmlzdHJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFmZmljQXV0aG9yaXR5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEluZnJhc3RydWN0dXJlQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbHRpbWF0ZVJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcmdyYWR1YXRlQWRtaXNzaW9uc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uUHJlc2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaWNlUHJlc2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXJDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyU3VwcGx5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0Jyb2tlck1haW50ZW5hbmNlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3Nob3BDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc01hbmFnZW1lbnRDb250YWN0Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJDb250YWN0TnVtYmVyIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250YWN0TnVtYmVyIiB0eXBlPSJMaXN0T2ZDb250YWN0TnVtYmVyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250YWN0TnVtYmVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGVkIiB0eXBlPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbnRhY3ROdW1iZXJUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFjdE51bWJlciIgdHlwZT0iQ29udGFjdE51bWJlciIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDb250YWN0TnVtYmVyVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZheE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1haWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2JpbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVBhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldXVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUkxPdGhlciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGFjdCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQ29udGFjdCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udGFjdCIgdHlwZT0iTGlzdE9mQ29udGFjdCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUGFydHlDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUGFydHlDb2RlZCIgdHlwZT0iTGlzdE9mUGFydHlDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFydHlDb2RlZCI+CisgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJQYXJ0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Um9sZUNvZGVkIiB0eXBlPSJQYXJ0eVJvbGVDb2RlIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBhcnR5Um9sZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnR5Q29kZWQiIHR5cGU9IlBhcnR5Q29kZWQiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFydHlSb2xlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRDb29yZGluYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1N0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mRGVzdGluYXRpb25QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9mLU9yaWdpblBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRPd25lcnNTZXJ2aWNpbmdCYW5rT25UaGVSZWNlaXZpbmdTaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50T3duZXJzU2VydmljaW5nQmFua09uVGhlU2VuZGluZ1NpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2tub3dsZWRnZW1lbnRSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjcm9ueW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvblBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxQdXJjaGFzZXJzQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlZmVycmVkQnlPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlQ2FyZUhvc3BpdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbGl2ZXJ5QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFBpY2tVcEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pbmlzdHJhdGlvbkNlbnRyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pdHRpbmdTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaXR0aW5nU3VyZ2VvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR1bHREYXlDYXJlUHJvZ3JhbUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2luZ0dyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VUaHJvdWdoQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlsaWF0ZWRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZmZpbGlhdGVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5R3JhbnRpbmdTZWN1cml0eUNsZWFyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSURTT3JBUkNVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJBbWJ1bGFuY2VTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ29Db21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGb3JjZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9saXNtQW5kT3RoZXJDaGVtaWNhbERlcGVuZGVuY3lGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE9yRHJ1Z0FidXNlT3JEZXBlbmRlbmN5SW5wYXRpZW50VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbE9yRHJ1Z0FidXNlT3JEZXBlbmRlbmN5T3V0cGF0aWVudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGlhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxpZW5BZmZpbGlhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGVnZWREZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbGlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxpZWRIZWFsdGhQcm9mZXNzaW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudEN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FibGVSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVJldHVybkFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0aXZlQWRkcmVzc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZU1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx6aGVpbWVyc0RpYWdub3N0aWNPckFzc2Vzc21lbnRTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRlZE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuSW5kaWFuLU93bmVkQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtaWN1c0N1cmlhZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5lc3RoZXNpb2xvZ3lTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5naW9wbGFzdHlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsQmVpbmdJbnZlc3RpZ2F0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuaW1hbFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWl0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRhbnRQYXlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50ZW5uYVNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVsbGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwZWxsZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Q29tYWtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50Rm9ySm9iIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0Nvc2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhbnRzRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlck5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmVkQ29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZEltcG9ydGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJiaXRyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJjaGl0ZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmNoaXRlY3QtRGVzaWduZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRTZXJ2aWNlc0xvY2F0aW9uRGVzaWduYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFybXlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0aW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJ0aHJpdGlzVHJlYXRtZW50Q2VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldEFjY291bnRIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdGFudFN1cmdlb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lzdGFudFVTVHJ1c3RlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlR2VuZXJhbEFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kaW5nUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JEZWZlbmRhbnRQcml2YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leUZvckRlZmVuZGFudFB1YmxpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0b3JuZXlGb3JQbGFpbnRpZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dG9ybmV5T2ZSZWNvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1Y3Rpb25lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1ZGl0T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml0eUZvclNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uQXNzaWduZWRCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZEFjY2VwdGluZ09mZmljaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkRXhwb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkSW1wb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRNYXJrZXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZE9mZmljaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRUcmFkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6aW5nT2ZmaWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZERhdGFQcm9jZXNzaW5nUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZFVuZGVyd3JpdGluZ1N5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlV2l0aEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJpbGl0eVNoaXBUb1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsaWZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWlsbWVudFdhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFpbFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWtlcnlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lSZWZlcmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5VHJ1c3RlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUp1cmlzZGljdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZVBlcmlvZEVtcGxveWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXR0ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFsT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZmljaWFyeXNCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZE9wZW5pbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZFNoaXBUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1Byb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGwtVG9QYXJ0eUZvckRpdmVyc2lvbkNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoaW5nUm9vbU9yTERSUFJvb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRoTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhwbGFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvb2RCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mUmVhbHRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYnRhaWxTZXJ2aWNlUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvbmRzbWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29raW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2trZWVwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlckNyb3NzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3Jyb3dlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9ycm93ZXJzRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYWtlbWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrQmVydGhPcGVyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtCdWxrUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2FkY2FzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlckRlYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3Bpbmlvbk9yQW5hbHlzaXNSZXF1ZXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlck9yU2FsZXNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlcnNBc3Npc3RhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkZXJOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWlsZGluZ0luc3BlY3RvcmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlRW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1aWxkaW5nU2l0ZUZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVpbGRpbmdTaXRlUHVyY2hhc2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVPZkxhbmRNYW5hZ2VtZW50UHJvcGVydHlVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJuQ2FyZVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0FyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzQXNzb2NpYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0VudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NQYXJ0bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJBc09mZmljaWFsbHlSZWdpc3RlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvcnBvcmF0ZU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1BhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1F1YWxpdHlSZXZpZXdCb2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5aW5nR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1c3RvbXNCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmRpZGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuZHlBbmRDb25mZWN0aW9uc0RlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNDYXRoZXJpemF0aW9uTGFib3JhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZGlhY0ludGVuc2l2ZUNhcmVVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkaWFjUmVoYWJpbGl0YXRpb25Qcm9ncmFtRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRpYWNSZWhhYmlsaXRhdGlvblNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJuZXRJc3N1ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJzQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlT2ZOZWVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sTGV2ZWxBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hQb29sU3ViLUFjY291bnRTZXJ2aWNpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaFBvb2xUb3BBY2NvdW50U2VydmljaW5nRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGluZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxCYW5rT3JSZWd1bGF0b3J5QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQ2F0YWxvZ3VlUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZEFjY291bnRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZnlpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhaXJwZXJzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlc1BheWVyQXREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlclNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npc1Byb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVja2luZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVxdWVEcmF3bkJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGllZkRlcHV0eUNsZXJrT2ZDb3VydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0Nocm9uaWNEaXNlYXNlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0RheUNhcmVDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc0V5ZUVhck5vc2VBbmRUaHJvYXRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zR2VuZXJhbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZHJlbnNIb3NwaXRhbFVuaXRPZkFuSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaWxkcmVuc09ydGhvcGVkaWNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zT3RoZXJTcGVjaWFsdHlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zUHN5Y2hpYXRyaWNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zUmVoYWJpbGl0YXRpb25GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW5zVHViZXJjdWxvc2lzQW5kT3RoZXJSZXNwaXJhdG9yeURpc2Vhc2VzRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoaXJvcHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb25pY0Rpc2Vhc2VGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb25pY09ic3RydWN0aXZlUHVsbW9uYXJ5RGlzZWFzZVNlcnZpY2VGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2h1cmNoT3BlcmF0ZWRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lnYXJldHRlc0FuZFRvYmFjY29EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXJjdWl0TG9jYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudEF1dGhvcml6ZWRSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZXJrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya09mQ291cnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkRG9vclBoYXJtYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUJvcnJvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Db250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1Db3Vuc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1EZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLURlZmVuZGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tRHJpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1JbnZlc3RpZ2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxBc3NpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25QcmluY2lwYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxJbnN1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uYWJsZUFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uUHJvY2Vzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pdHlBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5SGVhbHRoUHJvbW90aW9uRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBc3NpZ25lZFdlbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlJbnRlcnZpZXdlcldvcmtzRm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SW5XaGljaEludGVyZXN0SGVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueU1lcmdlZFdpdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnktT3duZWRPaWxGaWVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueVdoaWNoSG9sZHNGaW5hbmNpYWxJbnRlcmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlMaXN0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUmVudGFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aW5nUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlUHJvcGVydHlMaXN0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21waWxhdGlvbkFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW5hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWluYW50c0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZWhlbnNpdmVHZXJpYXRyaWNBc3Nlc3NtZW50RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmN1cnJlbnRFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kdWN0b3JQaWxvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZHVpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGluZ0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbm5lY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlQ291cmllclRyYW5zZmVyU3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlT2ZWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZXNBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlVG9CZVNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlLVRvUmVjZWl2ZUxhcmdlUGFyY2Vsc0FuZEZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZS1Ub1JlY2VpdmVNYWlsQW5kU21hbGxQYXJjZWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdub3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vckNvdXJpZXJUcmFuc2ZlclN0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkRGVidG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkNvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cnVjdGlvbkZpcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bHRhbnRzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0aW5nUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lckNyZWRpdEFjY291bnRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lclJlZmVycmFsQ29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyU2VydmljZVByb3ZpZGVyQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RCYW5rMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFjdEJhbmsyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0T2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWN0UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQYXJ0eTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhY3RQZXJzb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb2NhdGlvblBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPcGVyYXRvck9yTGVzc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJSZXR1cm5Db21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTdXJ2ZXlBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudEFubnVpdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGluZ2VudEJlbmVmaWNpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW50T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWRtaW5pc3RyYXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0ZWRTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdGluZ09mZmljZXJSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1HZW5lcmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3ItTGVhZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3Rvci1NYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbERlbGl2ZXJ5TWV0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0dWFsUmVjZWlwdE1ldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVyUXVhbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252b3lpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tT2NjdXBhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU9wZXJhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcGVyYXRpdmVCdXlpbmdHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLU93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDby1QYXJ0aWNpcGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tUHJvZHVjZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlNZXNzYWdlVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0ZU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnBvcmF0aW9uRm9yLVByb2ZpdEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWROYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3NpZ25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXJzRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW5jaWxPZkdvdmVybm1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVyQ2xhaW1hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZkRlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHJ5T2ZFeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlPZk9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRBcHBvaW50ZWRBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0R3JhbnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yc0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSYXRpbmdBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlcG9ydGluZ0FnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jld01lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWVWaWN0aW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzQ2xhaW1hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzLVRvd25Td2l0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNUU2Nhbm5lclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRFbXBsb3llci1QcmltYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50RW1wbG95ZXItU2Vjb25kYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmVjZWl2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvZGlhbFBhcmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9kaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJGT3JXaG9tU2FtZU9yU2ltaWxhcldPcmtXYXNQZXJGb3JtZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVySWRlbnRpZmljYXRpb25GaWxlQ3VzdG9tZXJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQnJva2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZDbGVhcmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaXJ5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVByb2Nlc3NpbmdTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWFsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9ySW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidG9yLUluLVBvc3Nlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidFBheW1lbnRBdXRob3Jpc2F0aW9uUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2lzaW9uTWFrZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYW50c0FnZW50T3JSZXByZXNlbnRhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjb25zb2xpZGF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmF1bHRPckZvcmVjbG9zdXJlU3BlY2lhbGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZW5kYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpY2F0ZXNzZW5EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Wm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVudGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mSnVzdGljZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudEluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzaWduYXRlZEhhemFyZG91c1dhc3RlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbkVuZ2luZWVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hDaGFyZ2VQYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkRyYXltYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uSW50ZXJtb2RhbFJhbXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uTWFpbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvblRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zdGljUmFkaW9pc290b3BlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWx5c2lzQ2VudGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlmZmVyZW50UHJlbWlzZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZEluZGl2aWR1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNpbmdPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjaGFyZ2VQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2lwbGluYXJ5Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGF0Y2hlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdGlsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRpb25SZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckJyYW5jaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0QXR0b3JuZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0SnVzdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3Rvck9mT3B0b21ldHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N0b3JPZk9zdGVvcGF0aHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QWNjb3VudFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFjY291bnRQYXJ0eXNCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEFwcGxpY2FudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRCZW5lZmljaWFyeXNCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdFJlaW1idXJzaW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRTZWNvbmRCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRDdXN0b2RpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50T3JNZXNzYWdlSXNzdWVyT3JTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2luZ0J1c2luZXNzQXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1GaXJzdFN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duc3RyZWFtTWV0ZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG93bnN0cmVhbVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaWxsaW5nQ29udHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wLU9mZkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlHcm9jZXJ5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyYWJsZU1lZGljYWxFcXVpcG1lbnRTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNvbm9taWNhbGx5RGlzYWR2YW50YWdlZEluZGl2aWR1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbmFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNEYXRhSW50ZXJjaGFuZ2VDb29yZGluYXRvclBvaW50QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0ZpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUmVnaXN0cmF0aW9uVXRpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY1JldHVybk9yaWdpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZW1lbnRhcnlTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaWdpYmxlUGFydHlUb1RoZUNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJsZVBhcnR5VG9UaGVSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEZXBhcnRtZW50U29jaWFsV29ya1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lNZWRpY2FsVGVjaG5pY2lhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtZXJnZW5jeVJlc3BvbnNlVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdpbmdTbWFsbEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wdHlDb250YWluZXJSZXNwb25zaWJsZVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lclJldHVybkFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUVxdWlwbWVudERlc3BhdGNoUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5RXF1aXBtZW50UmV0dXJuUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1NYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneUluZm9ybWF0aW9uQWRtaW5pc3RyYXRpb24tT3duZWRPaWxGaWVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLUNvbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXItQ29uc3VsdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyUGlsb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVyLVJlc2lkZW50Q29uc3RydWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnJvbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5SG9sZGluZ1RoZUluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlJbldoaWNoQUZpbmFuY2lhbEludGVyZXN0SXNIZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlQcm92aWRpbmdUaGVTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRpdHlSZXNwb25zaWJsZUZvckZvbGxvdy1VcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlQb2ludFRlY2huaWNhbEFzc2Vzc21lbnRHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50RHJvcC1PZmZQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlcGFpclBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RhYmxpc2hlZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4YW1pbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2lzZVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdWRlZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVjdXRpdmVDb21taXR0ZWVNZW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dG9yT2ZFc3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZXJ0V2l0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4LVNwb3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWRDYXJlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhY29ycG9yZWFsU2hvY2stV2F2ZUxpdGhvdHJpcHRlclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV5ZUVhck5vc2VBbmRUaHJvYXRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yLUNvcnJlc3BvbmRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhbWlseU1lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF0aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxHb3Zlcm5tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsbHlDaGFydGVyZWRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFN0YXRlQ291bnR5T3JDaXR5RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlbGxvd3NoaXBJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVsb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZG9yQnJhbmNoT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlck5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsQ3VzdG9tZXJPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWFpbnRlbmFuY2VPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsTWFpbnRlbmFuY2VQZXJpb2REZXNpZ25hdGluZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxNZXNzYWdlUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFJlY2lwaWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxSZWZlcnJlZFRvT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNjaGVkdWxlZERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGxhbm5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsU3RhdGVtZW50UmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJlbWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEFwcHJhaXNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RCcmVha1Rlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpdG5lc3NDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29kQ2VydGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vZERldGVybWluYXRpb25Qcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvcmFsRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZFNlcnZpY2VPcGVyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNsb3NpbmdMZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25EaXNjbG9zdXJlSW5mb3JtYXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25MYW5ndWFnZVN5bm9ueW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWdpc3RyYXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnblN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lckFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lcmx5RG9pbmdCdXNpbmVzc0FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJseUtub3duQXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclByZXNpZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWVyUmVnaXN0ZXJlZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1lclJlc2lkZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdW5kYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVvbkJvYXJkUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRNYW5hZ2VtZW50RmFjaWxpdGF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRPckNoYXJnZXNQYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWVyT25CZWhhbGZPZlRoZUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFBheWVyT25CZWhhbGZPZlRoZUNvbnNpZ25vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnV0dXJlQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FpbmluZ0ludmVudG9yeU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhcmFnZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybmlzaGVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQbGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25FbmRpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVHJhbnNhY3Rpb25Qb2ludDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1RyYW5zYWN0aW9uUG9pbnQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUcmFuc2FjdGlvblN0YXJ0aW5nUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGV3YXlQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbEFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbElucGF0aWVudENhcmVGb3JBSURTT3JBUkNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lZGljYWxBbmRTdXJnaWNhbEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTWVyY2hhbmRpc2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5ldGljQ291bnNlbGluZ09yU2NyZWVuaW5nU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlcmlhdHJpY0FjdXRlQ2FyZVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlcmlhdHJpY0NsaW5pY3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdpZnRSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQ29sbGVjdGlvblBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0N1c3RvZGlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNSZWxlYXNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1Db21iaW5lZENvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnQtRmVkZXJhbC1NaWxpdGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudC1GZWRlcmFsLU90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUZlZGVyYWwtVmV0ZXJhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRGdXJuaXNoZWRQcm9wZXJ0eUZPQlBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50TG9hbkFnZW5jeVNwb25zb3JPckFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50LUxvY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFuZHBhcmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhbnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdW5kQW1idWxhbmNlU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cEFmZmlsaWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBBZmZpbGlhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBpbmdDZW50cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUHJhY3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwUHVyY2hhc2luZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWFyZGlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzTWF0ZXJpYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlR2VuZXJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhBbmRCZWF1dHlEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhjYXJlUHJvZmVzc2lvbmFsU2hvcnRhZ2VBcmVhRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aE1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNaXNjZWxsYW5lb3VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhTY2llbmNlc0xpYnJhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlbW9kaWFseXNpc0ZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXNvcGF0aG9sb2d5TGFib3JhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlzcGFuaWNTZXJ2aWNlSW5zdGl0dXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhDYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lSGVhbHRoQ29ycG9yYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVIZWFsdGhTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZVN0YXRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsQXV4aWxpYXJ5VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zcGl0YWxEaXN0cmljdE9yQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbFVuaXRPZkFuSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsVW5pdFdpdGhpbkFuSW5zdGl0dXRpb25Gb3JUaGVNZW50YWxseVJldGFyZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3N0aWxlV2l0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZWRGcm9tTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhcmVPZlBhcnR5Tm8xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbkNhcmVPZlBhcnR5Tm8yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25KdXJpc2RpY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25TdGF0ZVBsYWNlT2ZCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb3Jwb3JhdGlvblN0YXRlUHJpbmNpcGFsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudEFkanVzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRlcGVuZGVudExhYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kZXBlbmRlbnRQaHlzaWNpYW5zQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxGb3ItUHJvZml0RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5QnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmVsaWdpYmxlUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uRGlzc2VtaW5hdGlvbkFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25NYWludGVuYW5jZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25Qcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWZlcmVuY2VBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsTWVkaWNhbFByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU3Vic2NyaWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qZWN0aW9uUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVBhdGllbnRQaGFybWFjeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5xdWlyaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1TZXJ2aWNlU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkFuZEFjY2VwdGFuY2VQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbkNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25MZWFkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25PblNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZEF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbmFsUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uRm9yTWVudGFsUmV0YXJkYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVN0b3JlQmFrZXJ5RGVwYXJ0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQmVuZWZpY2lhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNsYWltQWRqdXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUluc3RpdHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkT3JTdWJzY3JpYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlZ3JhdGVkTWF0ZXJpYWxNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlbGxlY3R1YWxQcm9wZXJ0eU93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdGVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1GdW5kaW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltVHJ1c3RlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJsaW5lU2VydmljZUNvbW1pdG1lbnRDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhcnlCYW5rMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXJ5QmFuazIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeU9yQnJva2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1lZGlhdGVDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUxldmVsUGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZyZWlnaHRGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybnNoaXBFbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycHJldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJ2aWV3ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDb250cm9sbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlDb250cm9sUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG1lbnRBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RlYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2x2ZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJyZXZvY2FibGVCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZkRlYml0T3JDcmVkaXRNZW1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJPZkludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vlck9mV2F5YmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWluZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1NYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtU2hpcEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50QW5udWl0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludEFubnVpdGFudE93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludERlYnRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnREZWJ0b3JBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckFubnVpdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRPd25lckFubnVpdGFudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVySm9pbnRBbm51aXRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50T3duZXJKb2ludEFubnVpdGFudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludE93bmVyUGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50VmVudHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmlvckhpZ2hTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnV2ZW5pbGVEZWZlbmRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1dmVuaWxlVmljdGltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXZlbmlsZVdpdG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleVBlcnNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2lkbmV5RGlhbHlzaXNVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclN1cnBsdXNBcmVhRmlybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZGxvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhcmdlQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RCcmVha1Rlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RLbm93blNvdXJjZU9mU3VwcGx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0U3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhd0VuZm9yY2VtZW50QWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdGaXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFRpdGxlSG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRpbmdJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzZWVzU3VydmV5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlhYmlsaXR5SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbkhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZExpYWJpbGl0eUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0ZWRMaWFiaWxpdHlQYXJ0bmVyc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGltaXRlZFBhcnRuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdGluZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RpbmdPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RNYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGl0ZXJhbGx5VHJhbnNsYXRlZE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkFwcGxpY2FudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkJyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbkNvcnJlc3BvbmRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5Ib2xkZXJGb3JSZWFsRXN0YXRlQXNzZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5PcmlnaW5hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuU2VydmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ2hhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsR292ZXJubWVudFNwb25zb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25PZkdvb2RzRm9yQ3VzdG9tc0V4YW1pbmF0aW9uQmVmb3JlQ2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mTG9hZEV4Y2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mUHJpbmNpcGFsQXNzZXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbk9mU3BvdEZvclN0b3JhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdUZXJtQ2FyZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25nLVRlcm1EaXNhYmlsaXR5Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zaW5nSW52ZW50b3J5TWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc1BheWVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ2lzdHJhdGVKdWRnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnbmV0aWNSZXNvbmFuY2VJbWFnaW5nRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWRlbk5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haWxBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5saW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZU9yZ2FuaXphdGlvblVzZWRGb3JFc3RpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFtbW9ncmFwaHlTY3JlZW5pbmdDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudENvbnRyb2xBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudE5vbi1PZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2luZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2luZ0dlbmVyYWxBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc1JlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUGxhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmluZVN1cnZleW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0VGltZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmstRm9yUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJHZW5lcmFsQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2VBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbERpc3Bvc2l0aW9uQXV0aG9yaXphdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbElzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxTYWZldHlEYXRhU2hlZXRSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYW5zT2ZUcmFuc3BvcnRDaGFydGVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXREZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsRG9jdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5zdXJhbmNlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbE51cnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsU3VyZ2ljYWxPck90aGVySW50ZW5zaXZlQ2FyZVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxUcmVhdG1lbnRFeGVjdXRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxUcmVhdG1lbnRQcmVzY3JpYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWV0aW5nTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZ2F2b2x0YWdlUmFkaWF0aW9uVGhlcmFweVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbnRCYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmdlZENvbXBhbnlXaXRoUmV0YWluZWRJZGVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyZ2VkTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV4aWNhbkN1c3RvbXNCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZGRsZVNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlncmFudEhlYWx0aENsaW5pYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlCcmFuY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Sb3lhbHR5UGF5b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmlzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eUluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vcml0eS1Pd25lZEJ1c2luZXNzTGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbm9yaXR5LU93bmVkQnVzaW5lc3NTbWFsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c0hlYWx0aENhcmVGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9uaXRvcmluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VMaWFiaWxpdHlBY2NvdW50SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50RW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVSZXBvcnRQcm92aWRlckNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZUNoYW5nZWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZU5vdFRvQmVDb25mdXNlZFdpdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVvbkNyZWRpdENhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVVbmRlcldoaWNoRmlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVWYXJpYXRpb25TeW5vbnltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbENoYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aXZlSGF3YWlpYW5Pcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdnlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnbGVjdGVkT3JEZWxpbnF1ZW50SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0aW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVpZ2hib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5laWdoYm9yaG9vZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVvbmF0YWxJbnRlbnNpdmVDYXJlVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0d29ya05hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Fzc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1NlY3VyZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3U2VydmljZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdzcGFwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N1cHBseVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0U2NoZWR1bGVkRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5pY2tuYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0hlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRlZEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbWluYXRlZEZyZWlnaHRDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRG9tZXN0aWNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZW1wbG95bWVudEluY29tZVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhlYWx0aENhcmVNaXNjZWxsYW5lb3VzRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1JbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tSW52YXNpdmVDYXJkaWFjQXNzZXNzbWVudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tTW9ydGdhZ2VMaWFiaWxpdHlBY2NvdW50SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tT2NjdXBhbnRDby1Cb3Jyb3dlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByb2R1Y3Rpb25TdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVByb2ZpdEhlYWx0aENhcmVQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ucHJvZml0SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SYWlscm9hZEVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmVnaXN0ZXJlZEJ1c2luZXNzTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlZ2lzdGVyZWRJbnZlc3RtZW50QWR2aXNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVJlc2lkZW50QmVuZWZpY2lhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudENyZWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnREZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNpZGVudEdyb3VwQ29tcGFueVdpdGhXaG9tRmluYW5jaWFsQWNjb3VudElzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRJbnN0cnVjdGluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUmVzaWRlbnRUaGlyZFBhcnR5Q29tcGFueVdpdGhXaG9tRmluYW5jaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVGVtcG9yYXJ5U3RvcmFnZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGFyeVB1YmxpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90ZUNvLVNpZ25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Rm9yUHJvZml0SGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlGb3JTaGlwcGVyc09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZnlQYXJ0eU5vMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5UGFydHlObzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzaW5nSG9tZUNoYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZhdGlvblJvb21TZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzdGV0cmljc0FuZEd5bmVjb2xvZ3lGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JzdGV0cmljc1VuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cGF0aW9uYWxIZWFsdGhTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsVGhlcmFweVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhblRhcmlmZkNvbmZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZnNldE9wZXJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxBbmRHYXNDdXN0b2RpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbEFuZEdhc1JlZ3VsYXRvcnlBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZEFzc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGREZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFNlY3VyZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25CZWhhbGZPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24tQ2FsbFByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmNvbG9neUNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1IZWFydFN1cmdlcnlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvci1Db21tdW5pY2F0aW9uQ2hhbm5lbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3ItRXNzZW50aWFsU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZQcm9wZXJ0eU9yRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mUHJvcGVydHlPclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yT2ZUaGVTb3VyY2VUcmFuc2ZlclBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvck9mVGhlVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJlZEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyZWRCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ0N1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmluZ1BoeXNpY2lhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJPZlNoaXBwZXJzT3JkZXJzLVRyYW5zcG9ydGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck9mVGhlU2hpcHBlclBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcldyaXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbml6YXRpb25Db21wbGV0aW5nQ29uZmlndXJhdGlvbkNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXphdGlvbkhhdmluZ1NvdXJjZUNvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZ2FuaXplZE91dHBhdGllbnRTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVkU29jaWFsV29ya1NlcnZpY2VGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmdhbk9yVGlzc3VlVHJhbnNwbGFudFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsQ2xhaW1hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSW50ZXJtb2RhbFJhbXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU2hpcHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JPZkFydGljbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkRyYXltYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbk1haWxGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luU3VibG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpblRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob3BlZGljRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ydGhvcGVkaWNTdXJnZXJ5RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGVwYXJ0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluZGl2aWR1YWxEaXNhYmlsaXR5Q2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck5vdC1Gb3ItUHJvZml0RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGVyc29uT3JFbnRpdHlBc3NvY2lhdGVkV2l0aFN0dWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclJlbGF0ZWRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJTcGVjaWFsdHlGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFR5cGVPZk9yZ2FuaXphdGlvbmFsRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dC1PZi1TdGF0ZVByaW5jaXBhbE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFNvY2lhbFdvcmtTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0cGF0aWVudFN1cmdpY2VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlSW5zcGVjdGlvbkFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVByb2Nlc3NvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZVRlc3RBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJyaWRlSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lckFubnVpdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJBbm51aXRhbnRQYXlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJKb2ludEFubnVpdGFudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mTWVhbnNPZlRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJPZlByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mUHJvcGVydHlPclVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyT2ZWZWhpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9mVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lck9yTGVzc29yc1N1cnZleW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lclBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0ludmVudG9yeUNvbnRyb2xQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZWRpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljYWxDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW5nQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGluZ0xhYm9yYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRuZXJzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0bmVyc2hpcEZvci1Qcm9maXRGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFJlbWFudWZhY3R1cmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0c0Rpc3RyaWJ1dG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0U291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUFjY29yZGluZ1RvRG9jdW1lbnRhcnlDcmVkaXRUcmFuc2FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBc3NpZ25pbmdBU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF0RmluYWxQbGFjZU9mUG9zaXRpb25pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXRQaWNrLVVwTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5QXV0aG9yaXplZHRvRGVmaW5pdGl6ZUNvbnRyYWN0QWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6ZWRUb01ha2VEZWZpbml0ZUFDb250cmFjdEFjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlBdXRob3JpemluZ0Rpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUF1dGhvcml6aW5nUmVsZWFzZU9mU2VjdXJpdHlJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEYXRhUmVzcG9uc2libGVQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZWNsYXJpbmdUaGVWYWx1ZUFkZGVkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb0V4ZWN1dGVSZS1JY2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlEZXNpZ25hdGVkVG9FeGVjdXRlU2FuaXRhcnlQcm9jZWR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eURlc2lnbmF0ZWRUb1Byb3ZpZGVMaXZpbmdBbmltYWxDYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUV4ZWN1dGluZ0FuZFZlcmlmeWluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGaWxsaW5nU2hpcHBlcnNPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGb3JXaG9tSXRlbUlzVWx0aW1hdGVseUludGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZyb21XaG9tQ3VzdG9tc0RvY3VtZW50c0FyZVRvQmVQaWNrZWRVcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlGcm9tV2hvbU5vbi1DdXN0b21zRG9jdW1lbnRzQXJlVG9CZVBpY2tlZFVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUZ1bGZpbGxpbmdBbGxPcGVyYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eUluUG9zc2Vzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJc3N1aW5nTXV0dWFsbHlBZ3JlZWRDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYWludGFpbmluZ1RoZUNvZGVzVXNlZEluVGhlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYWludGFpbmluZ1RoZUlkZW50aWZpZXJzVXNlZEluVGhlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlNYW5kYXRlZFRvTGlxdWlkYXRlQW5FbnRlcnByaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eU1hbnVmYWN0dXJlZEZvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlOb3RUb0JlQ29uZnVzZWRXaXRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVBhc3NpbmdUaGVUcmFuc2FjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nQ2VydGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQZXJmb3JtaW5nQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ0luc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ1Rhc2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UGVyZm9ybWluZ1ZlcmlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlQcm92aWRpbmdGaW5hbmNpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5UHJvdmlkaW5nR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlY292ZXJpbmdUaGVWYWx1ZUFkZGVkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlcHJlc2VudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yRGlzaW5mZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVJlc3BvbnNpYmxlRm9yRmluYW5jaWFsU2V0dGxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlSZXNwb25zaWJsZUZvclJlZnVlbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlTdWJtaXR0aW5nUXVvdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VGhhdFJlY2VpdmVkRGlzY2xvc3VyZVN0YXRlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUaGF0UmVtaXRzUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0FwcGVhckJlZm9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0FwcHJvdmVTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvYmVhZHZpc2VkLVdyaXR0ZW5PcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9CZUJpbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb0JlQmlsbGVkRm9yT3RoZXJUaGFuRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b0NvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvRmlsZVBlcnNvbmFsUHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9MZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1BlcmZvcm1QYWNrYWdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9QcmludFNvbWVEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1Byb3ZpZGVEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVBbGxEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmljYXRlT2ZDb21wbGlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmljYXRlT2ZDb25mb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDZXJ0aWZpZWRJbnNwZWN0aW9uUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNlcnRpZmllZFRlc3RSZXN1bHRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvbW1lcmNpYWxJbnZvaWNlUmVtaXR0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVDb250cmFjdFNlY3VyaXR5Q2xhc3NpZmljYXRpb25TcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUNvcHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlQ29ycmVzcG9uZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUN1c3RvbXNEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRWxlY3Ryb25pY01lbW9PZkludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUZyZWlnaHRCaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZUluc3BlY3Rpb25SZXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlSW52aXRhdGlvblRvT2ZmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlSW52b2ljZUZPckdvb2RzT3JTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVJbnZvaWNlRm9yTGVhc2VQYXltZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVMaW1pdGF0aW9uc09mSGVhdnlFbGVtZW50c1JlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVNYXRlcmlhbFJlbGVhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlTm9uLUN1c3RvbXNEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlT3JkZXJUb1N1cHBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQYWNraW5nQ3JhdGluZ0FuZEhhbmRsaW5nQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVBhcGVyTWVtb09mSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVQcm9wb3NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVQdXJjaGFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVJlcG9ydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU2NhbGVUaWNrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9SZWNlaXZlU2hpcHBpbmdNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVTaGlwcGluZ05vdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTb2xpY2l0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlU3RhdGVtZW50T2ZBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvUmVjZWl2ZVN0YXRlbWVudE9mRmVlc0R1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHl0b1JlY2VpdmVTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5VG9SZWNlaXZlVGVjaG5pY2FsRG9jdW1lbnRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlUb1JlY2VpdmVUZXN0UmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvUmVjZWl2ZVRyYW5zcG9ydGF0aW9uQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eXRvV2hvbUFja25vd2xlZGdtZW50U2hvdWxkQmVTZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVRvV2hvbURvY3VtZW50c0FyZVRvQmVQcmVzZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5dG9XaG9tUHJvdGVzdFN1Ym1pdHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXYWl2aW5nUmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdoaWNoRGVsaXZlcnNDb25zaWdubWVudHNUb1RoZVRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0eVdoaWNoUGlja3NVcENvbnNpZ25tZW50c0Zyb21UaGVUZXJtaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaG9TaWduZWRUaGVEZWxpdmVyeVJlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5V2l0aEtub3dsZWRnZU9mQWZmYWlyc09mVGhlQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlXaXRoUG93ZXJUb1ZvdGVTZWN1cml0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzZW5nZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRDb21wYW5pb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRFZHVjYXRpb25Vbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50RmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRSZXByZXNlbnRhdGl2ZVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzQ29tcGFueU5hbWVPcklkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJPZkxhc3RSZXNvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0NvbXBhbnlOYW1lT3JJZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlpbmdGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXktVG9Qcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkZXN0cmlhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVkaWF0cmljQWN1dGVJbnBhdGllbnRVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtZWRBdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Gb3JXaG9zZUJlbmVmaXRQcm9wZXJ0eXdhc1NlaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29ubmVsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25PbkNsYWltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5TGVnYWxseVJlc3BvbnNpYmxlRm9yQUNoaWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5TGVnYWxseVJlc3BvbnNpYmxlRm9yQW5kV2l0aFdob21BQ2hpbGRSZXNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25Pck90aGVyRW50aXR5V2l0aFdob21BQ2hpbGRSZXNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbmluZ0NyZWRpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRpdGlvbmluZ0NyZWRpdG9yc0F0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhhcm1hY3lEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsVGhlcmFweVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbkNsaW5pY09yR3JvdXBQcmFjdGljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljaWFuSG9zcGl0YWxPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2lhbi1TcGVjaWFsaXN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllck5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVNlZ21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU2VnbWVudEJvdW5kYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mQm90dGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRpc3RpbGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlT2ZPY2N1cnJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZU9mUGVyZm9ybWFuY2VDb2duaXphbnRTZWN1cml0eU9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhaW50aWZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5pbmdPck1haW50ZW5hbmNlT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ0NvbW1pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uaW5nU2NoZWR1bGVPck1hdGVyaWFsUmVsZWFzZUlzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblNwb25zb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudENsZWFyYW5jZU9mZmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvZGlhdHJpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvaW50T2ZTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lIb2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeVdyaXRpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sbGluZ1NpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhbE1haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0c2Vjb25kYXJ5RWR1Y2F0aW9uUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0c2Vjb25kYXJ5RWR1Y2F0aW9uU2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVNlY29uZGFyeUluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3RlbnRpYWxTb3VyY2VPZlN1cHBseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJPZkF0dG9ybmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUtEYXlDYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUta2luZGVyZ2FydGVuVG9HcmFkZTEyUmVjaXBpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUta2luZGVyZ2FydGVuVG9HcmFkZTEyU2VuZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUN1c3RvbWVyT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeUluc3BlY3Rpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlNYWludGVuYW5jZU9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbGltaW5hcnlNYWludGVuYW5jZVBlcmlvZERlc2lnbmF0aW5nT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVsaW1pbmFyeVJlZmVycmVkVG9Pcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRpbmdCYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQnVzaW5lc3NQYXJ0bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NyZWRpdEdyYW50b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVidEhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEaXN0cmlidXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3llciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01lbWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c05hbWVPZkZpcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTmVpZ2hib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT2NjdXBhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1N0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGl0bGVDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1RyYWRlVW5pb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRtaW5pc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlCZW5lZmljaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDaGVja1NoaXBUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNvbnRyb2xQb2ludExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW5zdXJlZE9yU3Vic2NyaWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUludGVyZXhjaGFuZ2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50ZXJuYXRpb25hbFRlbGVjb21DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5SW50cmEtTEFUQUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlJbnZlbnRvcnlDb250cm9sQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UGh5c2ljaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UmVzaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U3VwcG9ydE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVN1cmdlb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlUYXhwYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbEJvcnJvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxFeGVjdXRpdmVPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbFBlcnNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCYXNlSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdEluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ySW5zdXJhbmNlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUaXRsZUV2aWRlbmNlSG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlUHJlLUtFZHVjYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVTY2hvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb0Jvbm9BdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudFJlc3BvbnNpYmlsaXR5Rm9yT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbk1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RQb3NpdGlvbkhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNlcnZpY2VzQW5kUmVwYWlyc0NlbnRyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29vcmRpbmF0aW9uT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0TWFuYWdlbWVudE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3ROYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0UHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eU9yQnVpbGRpbmdNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZEluc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9TZUNvdW5zZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RvdHlwZVN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNDaGlsZE9yQWRvbGVzY2VudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQc3ljaGlhdHJpY0NvbnN1bHRhdGlvbi1MaWFpc29uU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRWR1Y2F0aW9uU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRW1lcmdlbmN5U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljR2VyaWF0cmljU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljSGVhbHRoRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljSW5wYXRpZW50VW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hpYXRyaWNPdXRwYXRpZW50U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmljUGFydGlhbEhvc3BpdGFsaXphdGlvblByb2dyYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBzeWNoaWF0cmlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHN5Y2hvbG9naXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNBbHRlcm5hdGl2ZVNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSGVhbHRoU2VydmljZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhTZXJ2aWNlSW5kaWFuU2VydmljZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNvclByaXZhdGVPcmdhbml6YXRpb25Gb3JUaGVEaXNhYmxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljUHJlLUtFZHVjYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1YmxpY1NjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlZENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlcnNEZXBhcnRtZW50QnV5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlU2VydmljZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaWZ5aW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhdGlvblJlcXVlc3RpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVJbXBsYW50c1VuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlvQ29udHJvbFN0YXRpb25Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9TdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWlwdE1ldGVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHRab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlck1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyT2ZDaGVxdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyT2ZGdW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzQ29ycmVzcG9uZGVudEJhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU2l0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzU3ViLUVudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRmFjaWxpdHlTY2hlZHVsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0ZpbmFuY2lhbEluc3RpdHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nUG9pbnRGb3JDdXN0b21lclNhbXBsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ1N1Yi1Mb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50T2ZDaXZpbG9yTGVnYWxMaWFiaWxpdHlQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvbkNlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkLUtlZXBpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeVJvb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY3JlYXRpb25hbFRoZXJhcHlTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VzRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmFsUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmluZ0hlYWx0aENhcmVQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyaW5nUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVyeU9wZXJhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1c2FsUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRCdXNpbmVzc05hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRJbnZlc3RtZW50QWR2aXNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkUHJpbmNpcGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ05vbnBhcmVudFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ1BhcmVudFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmluZ1BhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvblRyaWJ1bmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGFyRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5U3RhdGVEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVN0YXRlRW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbkZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhhYmlsaXRhdGlvbklucGF0aWVudFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaGFiaWxpdGF0aW9uT3V0cGF0aWVudFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWltYnVyc2luZ0JhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlSW50ZXJtZWRpYXJ5T3JCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEcmF5bWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlVG9QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXR0aW5nQmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVuZGVyaW5nUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFBheW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJpbmdPdXRsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yUmVmdXJiaXNoTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2luZ01hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0NhcnJpZXJzTm9taW5hdGVkQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nT2ZmaWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJvZHVjdGl2ZUhlYWx0aFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRMZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzYWxlQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2FsZURlYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hJbnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2Vydm9pciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlT3JEb21pY2lsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmN5SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50QmVuZWZpY2lhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50SW5zdHJ1Y3RpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcGlyYXRvcnlUaGVyYXB5U2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BpdGVDYXJlRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlRXhoaWJpdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZUdvdmVybm1lbnRBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlSW5zdGFsbGF0aW9uRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3BvbnNpYmxlSW5zdGFsbGF0aW9uT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zaWJsZVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxQaGFybWFjeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0cm9jZXNzaW9uYWlyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9hZENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvdXRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3lhbHR5T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1cmFsSGVhbHRoQ2xpbmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0Fzc2lzdGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzcGVyc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1Jlc3BvbnNpYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlc1RvQmVSZXR1cm5lZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGluZ0xvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2wtQmFzZWRTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ29ycG9yYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmVlbmluZ1BvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsaW5nQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5SW52ZW50b3J5Q29udHJvbEFjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlMb2NhdGlvbkFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZGFyeVBheWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlUYXhwYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5V2FycmFudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRDb250YWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRDb250YWN0T3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRIb21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRMZXZlbFBhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3JldGFyaWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uOEFQcm9ncmFtUGFydGljaXBhbnRGaXJtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cmVkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyZWRQYXJ0eUluZGl2aWR1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckFzT2ZmaWNpYWxseVJlZ2lzdGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNBZ2VudE9yUmVwcmVzZW50YXRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNGaW5hbmNpYWxJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ0FnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlck9mRnVuZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNDb3JyZXNwb25kZW50QmFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuaW9yTWVtYmVyc2hpcFByb2dyYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VCdXJlYXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU1hbmFnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtYW5jZVNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQZXJmb3JtZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlcXVlc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljaW5nQnJva2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNpbmdEZWFsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2luZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVob2xkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWx0ZXJlZFdvcmtzaG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdMaW5lU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdTY2hlZHVsZUlzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG93aW5nQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpYmxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpZ25hdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lnbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduaWZpY2FudE90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVQaG90b25FbWlzc2lvbkNvbXB1dGVyaXplZFRvbW9ncmFwaHlVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXRlT3BlcmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNraWxsZWROdXJzaW5nb3JPdGhlckxvbmctVGVybUNhcmVVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTa2lsbGVkTnVyc2luZ1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xvdENoYXJ0ZXJQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCYXNlU3RhdGlvbkxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbENvbnRyb2xTdGF0aW9uTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsRGlzYWR2YW50YWdlZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxseURpc2FkdmFudGFnZWRCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlEaXNhZHZhbnRhZ2VkSW5kaXZpZHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsbHlJbnN1cmVkUGVyc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2NpYWxTZWN1cml0aWVzQ29sbGVjdG9yc09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWV0eU9mUHJvcGVydHlJbmZvcm1hdGlvbkNvbXBpbGVyc0FuZEFuYWx5c3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGRUb0FuZFNoaXBUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvSWZEaWZmZXJlbnRGcm9tQmlsbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2xlUHJvcHJpZXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VNZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VPZkluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VQYXJ0eU9mSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ291bnNlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbGl6ZWRNb2JpbGVSYWRpb1NlcnZpY2VMaWNlbnNlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbGl6ZWRPdXRwYXRpZW50UHJvZ3JhbUZvckFJRFNPckFSQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWNoVGhlcmFweVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9ydHNNZWRpY2luZUNsaW5pY09yU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdXNlSW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3B1ZENvbnRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNoYXJ0ZXJlZEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZURpdmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbXNoaXBDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja2hvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmFnZUFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eWF0RGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VGYWNpbGl0eUF0T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcmVLZWVwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHlTdWJtaXR0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1BY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE9yQ29nbml6YW50U2VjdXJpdHlPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3ItTm9taW5hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yV2l0aERpcmVjdFBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1FbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ymdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0T2ZJbnF1aXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pdHRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibWl0dGVyT2ZTYW1wbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJzRW1wbG95ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJzU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzZXF1ZW50T3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Yi1TZXJ2aWNlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2lkaWFyeURpdmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Y2Nlc3NmdWxKb2JBcHBsaWNhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzaW5nSGVhbHRoQ2FyZVByb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc2luZ1BoeXNpY2lhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvcnlBcHByYWlzZXJOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJPck1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29ycG9yYXRlT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcldvcmtUZWFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbHlTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRpbmdQZXJzb25uZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJldHlGb3JBZGRpdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmV0eUZvckFudGlkdW1waW5nT3JDb3VudGVydmFpbGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VEaXNjaGFyZ2VBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VNYW5hZ2VtZW50RW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJnZW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJwbHVzRGVhbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvci1Qb2Zlc3Npb25hbFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlvclRvcG9ncmFwaGljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0Zhcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtGYXJtT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZklzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDb2xsZWN0b3JzT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHRPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lQW5zd2VyaW5nU2VydmljZUJ1cmVhdSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnRNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5kZXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcnRpYXJ5UGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RpbmdMYWJvcmF0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdFNwb25zb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0ZXJDaXJjdWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVhdHJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGVyYXBldXRpY1JhZGlvaXNvdG9wZUZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5QWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUludmVzdG1lbnRBZHZpc29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5TWFya2V0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXByaWNpbmdPcmdhbml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlSZXByaWNpbmdQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJldmlld2luZ09yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVJldmlld2luZ1ByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZWhvbGRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVJbnN1cmFuY2VTZXJ2aWNlc1Byb3ZpZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVVuZGVyd3JpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nRGVzaWduIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb29saW5nRmFicmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvcFBhcmVudENvbXBhbnlJblNhbWVDb3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3dpbmdBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVOYW1lU3lub255bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVVbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdJbnN0aXR1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRDaGFyZ2VQYXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNpdEZyZWlnaHRGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRQcmluY2lwYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRQcmluY2lwYWxzQWdlbnRPclJlcHJlc2VudGF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pdHRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25PZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGVyT2ZIYXphcmRvdXNXYXN0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNzaGlwbWVudFBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF1bWFDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudEZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmliYWxHb3Zlcm5tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZXNBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RPZmZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdE9yRXN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdWJlcmN1bG9zaXNBbmRPVGhlclJlc3BpcmF0b3J5RGlzZWFzZXNGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlUGFyZW50Q29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVTYW1lQ291bnRyeVBhcmVudENvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdHJhc291bmRVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFzc2lnbmVkQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuZGVyd3JpdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmV4cGVjdGVkSGFuZGxpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc0N1c3RvbXNCcm9rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc092ZXJzZWFzU2VjdXJpdHlBZG1pbmlzdHJhdGlvbk9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzaXR5LUNvbGxlZ2VPclNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2VydmljZWFibGVNYXRlcmlhbENvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBzdHJlYW1NZXRlckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVBhcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU1RydXN0ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlV0aWxpemF0aW9uTWFuYWdlbWVudE9yZ2FuaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb25Ib21lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0aW5nUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWROZXR3b3JrUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVDdXN0b2RpYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVTYWx2YWdlQXNzaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxNYXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZldGVyYW4tT3duZWRCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkZhY2lsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uTG9hbkF1dGhvcml6ZWRTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJhbnNBZG1pbmlzdHJhdGlvbkxvYW5HdWFyYW50eUF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmV0ZXJpbmFyaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmluYXJ5SG9zcGl0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpY3RpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlkZW9EZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRlZXJTZXJ2aWNlc0RlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlRWFybmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZURlcG9zaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNlS2VlcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyQW1idWxhbmNlU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyU3lzdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRpbmdQYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VsbENhc2luZ0RlcHRoQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsUGFkQ29uc3RydWN0aW9uQ29udHJhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGx5LU93bmVkU3Vic2lkaWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lubmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JEZWZlbmRhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JQbGFpbnRpZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdG5lc3NGb3JQcm9zZWN1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29tYW4tT3duZWRCdXNpbmVzc0xhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb21hbi1Pd25lZEJ1c2luZXNzU21hbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvbWVuc0hlYWx0aENlbnRlck9yU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzaXRlSGVhbHRoUHJvbW90aW9uRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzTWFuYWdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1RlYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXRpbmdBZ2VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWC1SYXlSYWRpYXRpb25UaGVyYXB5VW5pdCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZWQiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uQWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbiIgdHlwZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25BY3Rpb25Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcGRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGV0ZSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBbHBoYU51bTQwIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSI0MCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlN0cnVjdHVyZWROb3RlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVkTm90ZSIgdHlwZT0iTGlzdE9mU3RydWN0dXJlZE5vdGUiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdHVyZWROb3RlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdlbmVyYWxOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJOb3RlVVJMIiB0eXBlPSJ4c2Q6YW55VVJJIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUZXh0VHlwZUNvZGVkIiB0eXBlPSJUZXh0VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRleHRUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RydWN0dXJlZE5vdGUiIHR5cGU9IlN0cnVjdHVyZWROb3RlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRleHRUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRsaW5lcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUZvckJyZWFjaE9mQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJDb250cmFjdHVhbFN0aXB1bGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb1JlY29yZFBPVGV4dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxQT1RleHQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVNldCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iTmFtZVZhbHVlU2V0Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOYW1lVmFsdWVTZXQiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZVZhbHVlU2V0Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mTmFtZVZhbHVlUGFpciIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmFtZVZhbHVlU2V0IiB0eXBlPSJOYW1lVmFsdWVTZXQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Ik5hbWVWYWx1ZVBhaXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiIHR5cGU9Ikxpc3RPZk5hbWVWYWx1ZVBhaXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVWYWx1ZVBhaXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5hbWVWYWx1ZVBhaXIiIHR5cGU9Ik5hbWVWYWx1ZVBhaXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkF0dGFjaG1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkF0dGFjaG1lbnQiIHR5cGU9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkIiB0eXBlPSJBdHRhY2htZW50QWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudEFjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmlsZU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkF0dGFjaG1lbnRUaXRsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQXR0YWNobWVudERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxhbmd1YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNSU1FVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVwbGFjZW1lbnRGaWxlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRMb2NhdGlvbiIgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0iQXR0YWNobWVudCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJBdHRhY2htZW50QWN0aW9uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBkYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhbmdlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uRGV0YWlsIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZk9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIgdHlwZT0iTGlzdE9mT3JkZXJDb25maXJtYXRpb25JdGVtRGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9yZGVyQ29uZmlybWF0aW9uSXRlbU51bSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkFjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxTaG9ydERlc2NyaXB0aW9uIiB0eXBlPSJBbHBoYU51bTQwIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbFJlZmVyZW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlbGl2ZXJ5Q29tcGxldGUiIHR5cGU9InhjYmxCb29sZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJdGVtRGV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZkFjY291bnRBc3NpZ25tZW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPcmRlckNvbmZpcm1hdGlvbkl0ZW1EZXRhaWwiIHR5cGU9Ik9yZGVyQ29uZmlybWF0aW9uSXRlbURldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0YWxvZ1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT3JkZXJDb25maXJtYXRpb25EZXRhaWxSZWZlcmVuY2VzIiB0eXBlPSJPcmRlckNvbmZpcm1hdGlvbkRldGFpbFJlZmVyZW5jZXMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cmNoYXNlT3JkZXJSZWZlcmVuY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cmNoYXNlT3JkZXJOdW1iZXIiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVyY2hhc2VPcmRlckRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVyY2hhc2VPcmRlckxpbmVJdGVtTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJ0aWFsT3JkZXJDb2RlZCIgdHlwZT0iQVNOUGFydGlhbE9yZGVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydGlhbE9yZGVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHVyY2hhc2VPcmRlclJlZmVyZW5jZSIgdHlwZT0iUHVyY2hhc2VPcmRlclJlZmVyZW5jZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZOdW0iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZkRhdGUiIHR5cGU9InhjYmxEYXRldGltZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlIiB0eXBlPSJSZWZlcmVuY2UiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQVNOUGFydGlhbE9yZGVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxPcmRlciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0ZWdvcnkiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0ZWdvcnlJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTdGFuZGFyZENhdGVnb3J5SUQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3J5IiB0eXBlPSJDYXRlZ29yeSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RhbmRhcmRDYXRlZ29yeUlEIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFuZGFyZENhdGVnb3J5VHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNsYXNzaWZpY2F0aW9uSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlY2huaWNhbElEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGFuZGFyZENhdGVnb3J5SUQiIHR5cGU9IlN0YW5kYXJkQ2F0ZWdvcnlJRCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0YWxvZ1JlZmVyZW5jZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0YWxvZ1VSTCIgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ2F0YWxvZ0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXRhbG9nSXRlbUlEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRhbG9nUmVmZXJlbmNlIiB0eXBlPSJDYXRhbG9nUmVmZXJlbmNlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdElEIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0SUQiIHR5cGU9IkNvbnRyYWN0SUQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0QW5kU3lzdGVtUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRyYWN0SUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW1JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3lzdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0QW5kU3lzdGVtUmVmZXJlbmNlIiB0eXBlPSJDb250cmFjdEFuZFN5c3RlbVJlZmVyZW5jZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZUNvZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VDb2RlZCIgdHlwZT0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZUNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWQiIHR5cGU9IlJlZmVyZW5jZVR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaW1hcnlSZWZlcmVuY2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VwcG9ydGluZ1JlZmVyZW5jZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlJlZmVyZW5jZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdXBwb3J0aW5nU3ViUmVmZXJlbmNlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmVmZXJlbmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlZmVyZW5jZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VDb2RlZCIgdHlwZT0iUmVmZXJlbmNlQ29kZWQiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVmZXJlbmNlVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYmJyZXZpYXRlZE5ld0RydWdBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZURVTlNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVNvdXJjZVN1cHBsaWVySUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc29yaWFsUmFpbERpdmVyc2lvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzb3JpYWxTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ0VxdWlwbWVudExvY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nRmlsZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGluZ1BlcmlvZFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE1hbmFnZXJzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudFBhcnR5c0JhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXJ0eXNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRQYXlhYmxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U2VydmljaW5nQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRzUmVjZWl2YWJsZUN1c3RvbWVyQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1JlY2VpdmFibGVPcGVuSXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlU3RhdGVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50U3VmZml4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ2VtZW50T2ZPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkT25TeXN0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NlZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFJlcHJpY2VkTGluZUl0ZW1SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50TWVtb0NoYXJnZUJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnNhcnlDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZlcnRpc2VyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpY2VPZkNvbGxlY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZVRocm91Z2hCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNpbmdCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWVyb25hdXRpY2FsRXF1aXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmVjdGVkU3Vic3lzdGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZmaWxpYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUFzc2lnbmVkRW1wbG95ZWVJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5QXNzaWduZWROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW5jeUNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lDbGF1c2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFJREFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lIaWVyYXJjaGljYWxMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbmN5TG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VuY3lzU3R1ZGVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c0JhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50c1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnRzU2hpcG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFHRVJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmVlbWVudFRvUGF5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJDYXJnb1RyYW5zZmVyTWFuaWZlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckRpbWVuc2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckhhbmRsaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZXNGbGlnaHRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlybGluZVRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyV2F5YmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3RtZW50SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlY2lwaWVudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVDbGF1c2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtYnVsYXRvcnlQYXRpZW50R3JvdXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kZWRVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZW5kbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lbmRtZW50RmlsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkJhbmtlcnNBc3NvY2lhdGlvblRyYW5zaXRPclJvdXRpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuR2FzQXNzb2NpYXRpb25FcXVhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5Pc3Rlb3BhdGhpY0Fzc29jaWF0aW9uQ2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5QZXRyb2xldW1JbnN0aXR1dGVEZWR1Y3Rpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZVdlbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTnVtYmVyT3JUZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmVzdGhlc2lhTGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3BlY2llcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5pbWFsU3RyYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbnRpRHVtcGluZ0Nhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYWJsZUNvZWZmaWNpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FibGVJbnN0cnVjdGlvbnNPclN0YW5kYXJkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYW50c0JhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudHNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25UcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNlckxpY2Vuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvcHJpYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydGljbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5TGluZUZlZWRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2Vzc21lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbmVkQnlUcmFuc2FjdGlvblNldFNlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWduZWRTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzaWdubWVudFJlY29yZGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRlZENhc2VDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkSW52b2ljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWROdW1iZXJGb3JKb2luZWRVbml0Tm90UmVzdWJkaXZpZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yTGltaXRlZENvbW1vbkVsZW1lbnRQYXJraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkTnVtYmVyRm9yVW5pdFBhcmtpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVkUHJvcGVydHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc29jaWF0ZWRQdXJjaGFzZU9yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb2NpYXRpb25PZkFtZXJpY2FuUmFpbHJvYWRzUmFpbHdheUFjY291bnRpbmdSdWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzdW1pbmdDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdGFDYXJuZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0b21pY1NhZmV0eWFuZExpY2Vuc2luZ0JvYXJkUGFuZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaGVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRvcm5leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNhdGlvbkZvclJlcGFpclJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXR5SXNzdWVkRXF1aXBtZW50SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6YXRpb25OdW1iZXJGb3JFeGNlcHRpb25Ub0Rhbmdlcm91c0dvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemF0aW9uVG9NZWV0Q29tcGV0aXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9Mb3NzSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIUmV0dXJuT3JOb3RpZmljYXRpb25PZkNoYW5nZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSEVudHJ5RGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFDSFN0YW5kYXJkRW50cnlDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNIVHJhY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRlZFVuZGVyd3JpdGluZ1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVJhdGlvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3V0UHJvY2VkdXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFkZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbGFuY2VEdWVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZEJhbmtlcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtBc3NpZ25lZFNlY3VyaXR5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFua2Vyc0FjY2VwdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtydXB0Y3lQcm9jZWR1cmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtzSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rVGVsZWdyYXBoaWNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtUb0JhbmtJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRMYWJlbFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyQ29kZWRTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlUGVybWl0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNpY0NvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoTnVtYmVyT3JMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGNoU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW1Bc3NlbWJseUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luTWlsZU1hcmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0thbmJhblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVnaW5uaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ1NlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGF0ZXJhbENhclNlcnZpY2VBZ3JlZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsaW5nQ2VudGVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxpbmdUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxvZk1hdGVyaWFsUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZlF1YW50aXRpZXNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmFyeU9iamVjdElkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbkxvY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFua2V0T3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoQmF0Y2hOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsZW5kZWRXaXRoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZUNyb3NzUHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsdWVTaGllbGRQcm92aWRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZGVkQ2FycmllckludGVybmFsUmV2ZW51ZVNlcnZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va2luZ1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9yZGVyZWF1TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyT3JTYWxlc09mZmljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUmVmZXJlbmNlMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2Vyc09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1ZGdldENoYXB0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdW9mTGFib3JhbmRTdGF0aXN0aWNzU2NoZWR1bGVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVTaWduaW5nT1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cmVhdVNpZ25pbmdTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NUYXhOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0FwcHJvdmFsTWFyayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ2F0YWxvZ3VlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ3JlZGl0TWVtbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRGViaXRNZW1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNEZWJ0b3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTaGlwbWVudE1hcmtOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhZEZpbGVMYXllckNvbnZlbnRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsbE9mZk9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsU2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5FeGNpc2VFbnRyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5GaW5hbmNpYWxJbnN0aXR1dGlvbkJyYW5jaEFuZEluc3RpdHV0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkdvb2RzQW5kU2VydmljZXNvclF1ZWJlY1NhbGVzVGF4UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblByb3ZpbmNlT3BlcmF0aW5nQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhblNvY2lhbEluc3VyYW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5XaGVhdEJvYXJkUGVybWl0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxlZFJldmlzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJkQWNjb3VudFJlcG9ydGluZ0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50UmVwb3J0aW5nTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmRBY2NvdW50U3RhdHVzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEFjY291bnRUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZEJpbGxpbmdUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZElzc3VlclRyYW5zYWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29BY2NlcHRhbmNlT3JkZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29NYW5pZmVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FybmV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRDb25zaWduZWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJBc3NpZ25lZFBhY2thZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmllckFzc2lnbmVkUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyQXNzaWduZWRTaGlwcGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0FnZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc0N1c3RvbXNCb25kTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzZU9mTmVlZFBhcnR5c1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdWFsdHlSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc3VhbHR5UmVwb3J0U2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9ndWVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YXN0cm9waGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhdGVnb3J5T2ZXb3JrUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWRlbnRzQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlZGluZ0NvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlaWxpbmdGb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNBdXRvbWF0ZWRGaWxlc0lEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNCbG9ja0dyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTdGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNUcmFjdFN1ZmZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsU2VjcmV0YXJpYXRMb2dOdW1iZXJDaGlsZERhdGFNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VudHJhbFNlY3JldGFyaWF0TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1pdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRlb2ZJbmNvcnBvcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZW9mVHJhbnNwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmllZE1haWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFtYmVyT2ZDb21tZXJjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTVBVU0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VEb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VPcmRlckF1dGhvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlVmVyaWZpY2F0aW9uUHJvY2VkdXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlQ2FyZEFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUNhcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU5vdGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrTGlzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsQWJzdHJhY3RTZXJ2aWNlUmVnaXN0cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZXF1ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VpdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VsYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGFyUHVibGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbk9mT3BpbmlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0YXRpb25PZlN0YXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdGl6ZW5zaGlwRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdmlsQWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXZpbExpYWJpbGl0aWVzb2ZPaWxDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbWFudHNDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltT2ZmaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXNzT2ZDb250cmFjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYXVzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJpbmdIb3VzZUludGVyYmFua1BheW1lbnRzU3lzdGVtU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtUGFydGljaXBhbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyaW5nSG91c2VJbnRlcmJhbmtQYXltZW50U3lzdGVtVXNlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVhcmluZ1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJUZXh0Q2xhdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRDb21wYW55Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGllbnRSZXBvcnRpbmdDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xpbmljYWxMYWJvcmF0b3J5SW1wcm92ZW1lbnRBbWVuZG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsaW5pY051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29hbEF1dGhvcml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29kZU9mRmVkZXJhbFJlZ3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xkUm9sbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGluZ0JhbmtzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0b3JJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbG9jYXRpb25JbmRpY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxPclByaXZhdGVQYXNzZW5nZXJWZWhpY2xlUXVhbGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsQWNjb3VudFN1bW1hcnlSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxhbmRHb3Zlcm5tZW50RW50aXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbERyaXZlcnNMaWNlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tZXJjaWFsSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFZlaGljbGVTYWZldHlBc3N1cmFuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZU9uVW5pZm9ybVNlY3VyaXR5SWRlbnRpZmljYXRpb25Qcm9jZWR1cmVzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1vbkFjY2Vzc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRQbGFjZVJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFueUFuZFN5bmRpY2F0ZVJlZmVyZW5jZTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlBbmRTeW5kaWNhdGVSZWZlcmVuY2UyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55SXNzdWVkRXF1aXBtZW50SWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYXJhYmxlUHJvcGVydHlQZW5kaW5nU2FsZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5U2FsZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyYWJsZVByb3BlcnR5VmVyaWZpY2F0aW9uU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRlbnRBdXRob3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsYWludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkVW5pdHNQYXltZW50UmVxdWVzdFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZUNvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uT2ZQdXJjaGFzZURvY3VtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25kaXRpb25PZlNhbGVEb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZG9taW5pdW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ3Jlc3Npb25hbERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0aW5nQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzRnVydGhlck9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVzUmVsZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbmVlc1NoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudENsYXNzaWZpY2F0aW9uSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNGdXJ0aGVyT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25vcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRpb25TaGlwbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yc1JlY2VpcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN0cmFpbnROb3RhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1wdGlvbkRhdGFSZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJPckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9yUGFja2FnaW5nU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGlzcG9zaXRpb25PcmRlclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyT3BlcmF0b3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJvckVxdWlwbWVudFJlY2VpcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclByZWZpeCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldvcmtPcmRlclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWF0aW9uRmlsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb25Vbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNNb3ZlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzVHJhbnNmZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWRkZW5kdW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXVkaXRvcklETnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJyZWFrZG93blJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb29wTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEhvbGRlckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RPcHRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JEYXRhUmVxdWlyZW1lbnRzTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckVzdGFibGlzaG1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yUmVxdWVzdFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQYXJ0eVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZleWFuY2VSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aW9uQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5ib3JlQ2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkQmF0Y2hOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZENvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdEFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RBbGxvY2F0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0YVJpY2FuSnVkaWNpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RDZW50cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RFbGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlCdXNpbmVzc1JlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5TGVnaXNsYXRpdmVEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uRGlzdHJpYnV0aW9uTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vwb25SZWRlbXB0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdENvdW5zZWxpbmdJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0TWVtb051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0Tm90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdG9yRGViaXRBZGp1c3RtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRvcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJhdGluZ0FnZW5jeXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0UmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXRSZXBvc2l0b3J5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxBcHBsaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpdGljYWxpdHlEZXNpZ25hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9wWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3Jvc3NMaXN0ZWRDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyb3NzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUzU0S2V5VHJhaW5JbmRpY2F0b3JHcm91cE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRvckxhdGVzdENvdXJzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFByb2NlZHVyYWxUZXJtaW5vbG9neUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRSZXZpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDYXRhbG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck1haW50ZW5hbmNlUGVyaW9kU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyTWF0ZXJpYWxTcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lck9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclByb2Nlc3NTcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXJBc3NpZ25lZFRvUHJldmlvdXNCYWxhbmNlT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc0NvbW1vblRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lcnNJbmRpdmlkdWFsVHJhbnNhY3Rpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyc1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzUmVsZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJzVW5pdEludmVudG9yeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJUcmFja2luZ051bWJlckZvckxvYW5lZE1hdGVyaWFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0JhckNvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNpc2lvblJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEZWNsYXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0RyYXdiYWNrRW50cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNHdWFyYW50ZWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNob3VzZUJyb2tlckxpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zUHJlZmVyZW5jZUlucXVpcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNSZWxlYXNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RhcmlmZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1RyYW5zaGlwbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1ZhbHVhdGlvbkRlY2lzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbmdlcm91c0dvb2RzVHJhbnNwb3J0TGljZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YUF1dGhlbnRpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhSXRlbURlc2NyaXB0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhUXVhbGl0eVJlamVjdFJlYXNvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVJlbGlhYmlsaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVN0cnVjdHVyZVRhZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlcnB1cmNoYXNlb3JkZXJudW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWxlclR5cGVJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdE5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRvcnNBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJ0b3JzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzQ3VzdG9tc0lkZW50aXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhbnRzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlY3RDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlbnNlRmVkZXJhbEFjcXVpc2l0aW9uUmVndWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVuc2VQcmlvcml0aWVzQWxsb2NhdGlvblN5c3RlbVByaW9yaXR5UmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcm1lbnRBcHByb3ZhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVF1b3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSZWdpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5VGlja2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRyYWlsZXJNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlWZXJpZmljYXRpb25DZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsUmVhc29uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW50YWxJbnN1cmFuY2VQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnRpc3RMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50T3JBZ2VuY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkFncmljdWx0dXJlQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZDb21tZXJjZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUZvcm0yNTBSZXF1aXJlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkRlZmVuc2VJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkREVFNDTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mRWR1Y2F0aW9uQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZFbmVyZ3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhIU0FSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVURBUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mSW50ZXJpb3JBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkp1c3RpY2VBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRvZkxhYm9yQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZTdGF0ZUFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mdGhlVHJlYXN1cnlBY3F1aXNpdGlvbk9yUHJvY3VyZW1lbnRSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkFjcXVpc2l0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mVHJhbnNwb3J0YXRpb25Cb25kTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50b2ZUcmFuc3BvcnRhdGlvbkhhemFyZG91c051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudG9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudFdoZXJlSW5qdXJ5T2NjdXJyZWRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlZnJvbVNwZWNpZmljYXRpb25DbGFzc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZWZyb21TcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVmcm9tU3BlY2lmaWNhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBlbmRlbnRzSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBvc2l0b3JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRvcnlUcnVzdENvbXBhbnlJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhdENlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNjcmlwdGlvbk9mQ2hhbmdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hBZHZpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVBvc3RQYXJjZWxzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaE5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9ub2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0RGViaXRSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdG9yeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5bWVudFZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FiaWxpdHlJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5SW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudGVyUmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwZW5zYXRpb25SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsVHVybkluRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3B1dGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkNlbnRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU3RhdGVtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JBc3NpZ25lZE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckFzc2lnbmVkVHJhbnNhY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dE9ySW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzQWNjb3VudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvcnNTcGxpdEFnZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmljdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpc2lvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja1JlY2VpcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50YXJ5Q3JlZGl0QW1lbmRtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlQYXltZW50UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQWZmZWN0ZWROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRWb2x1bWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljRmxpZ2h0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY0ludmVudG9yeU1hbmFnZW1lbnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21pY2lsZUJyYW5jaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9taW5pb25PZkNhbmFkYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1TaGlwcGVyQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFpbmhvbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdlZXNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdMaXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYXdpbmdUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJzTGljZW5zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VuZm9yY2VtZW50QWRtaW5pc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uT3JkZXJCbGFua051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0Zvcm11bGFyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldENhbmFkYXM4RGlnaXRTdGFuZGFyZEluZHVzdHJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1bkFuZEJyYWRzdHJlZXRVUzhEaWdpdFN0YW5kYXJkSW5kdXN0cmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFVOU051bWJlcndpdGhGb3VyQ2hhcmFjdGVyU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEVU5TTnVtYmVyRHVuQW5kQnJhZHN0cmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlQmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVwbGljYXRlV2F5YmlsbGluUm91dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZVdheWJpbGxOb3RJblJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RnJlZVByb2R1Y3RzUmVjZWlwdEF1dGhvcmlzYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1dHlGcmVlUHJvZHVjdHNTZWN1cml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHV0eU1lbW9OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUNDTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWR1Y2F0aW9uYWxJbnN0aXR1dGlvbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdGlvbkRpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRGF0YUludGVyY2hhbmdlQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljZGV2aWNlcGlubnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljRnVuZHNUcmFuc2ZlcklETnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljUGF5bWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxldmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWJhcmdvUGVybWl0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1pc3Npb25EZXNpZ25hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZU9yTm9uRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUYXhGaWxpbmdTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcklkZW50aWZpY2F0aW9uTnVtYmVyT2ZTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llcnNJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZXJzU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRWaXNhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eUNvbnRhaW5lckJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5UmVwb3NpdGlvbmluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nSm9iU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ0thbmJhblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTWV0ZXJSZWFkaW5nQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRpbmdNZXRlclJlYWRpbmdFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1BhY2thZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1NlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kTWlsZU1hcmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kVXNlcnNQdXJjaGFzZU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZVByb3Bvc2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVucXVpcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5UG9pbnRBc3Nlc3NtZW50TG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlckNoaWxkRG1yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRyeVBvaW50QXNzZXNzbWVudExvZ051bWJlclBhcmVudERtciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lBY3F1aXNpdGlvblJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uQWdlbmN5VGVzdFR5cGVQdXJwb3NlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW52aXJvbm1lbnRhbFByb3RlY3Rpb25BZ2VuY3lUcmFuc3BvcnRlcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRJbml0aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudE93bmVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VHJhbnNwb3J0Q2hhcmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpdmFsZW50Q291cnNlTnVtYmVyYXRSZXF1ZXN0aW5nSW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVycm9ySWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc2Nyb3dGaWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVPcmRlclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXRlcm1zUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NUcmFuc3BvcnRhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdERpc3RyaWJ1dGlvbkxpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBhbnNpb25vbkVmZmVjdG9mQ2hhbmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGVyc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0RXN0YWJsaXNobWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0TGljZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UGVybWl0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkT3JFeGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY2lsaXR5Q2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlJRE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjaWxpdHlNZWFzdXJlbWVudFBvaW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWNpbGl0eU5ldHdvcmtJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFpbHVyZUFuYWx5c2lzUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsdXJlbWVjaGFuaXNtbnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYW1pbHlNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFtaWx5VW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlU2VsbGVyU2VydmljZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQnVyZWF1T2ZJbnZlc3RpZ2F0aW9uSW5kaXZpZHVhbElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsQ29tbXVuaWNhdGlvbnNDb21taXNzaW9uQ29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbENvbW11bmljYXRpb25zQ29tbWlzc2lvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxDb21tdW5pY2F0aW9uc0NvbW1pc3Npb25UcmFkZU9yQnJhbmRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRW5lcmd5UmVndWxhdG9yeUNvbW1pc3Npb25DZXJ0aWZpY2F0ZU9mUHVibGljQ29udmVuaWVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZITE1DRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvbWVMb2FuTW9ydGdhZ2VDb3Jwb3JhdGlvbkxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQWRtaW5pc3RyYXRpb25DYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSFVNUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBZG1pbmlzdHJhdGlvbk9yaWdpbmF0b3JJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluZm9ybWF0aW9uUmVzb3VyY2VzTWFuYWdlbWVudFJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNYXJpdGltZUNvbW1pc3Npb25Gb3J3YXJkZXJzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWFyaXRpbWVDb21taXNzaW9uVGFyaWZmTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTmF0aW9uYWxNb3J0Z2FnZUFzc29jaWF0aW9uTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFJlZ3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxTdXBwbHlTY2hlZHVsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFRheHBheWVyc0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsV2lyZVRyYW5zZmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRURXSVJFQ29uZmlybWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVTY2hlZHVsZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlQ29udmVyc2lvbkpvdXJuYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVMaW5lSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkYnlCdXJlYXVPZkNlbnN1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZXJDb2RlSXNzdWVkQnlDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJGb3JtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlVHJhbnNmZXJQcm90b2NvbExvY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVWZXJzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFdvcmtDYW5kaWRhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsRGV0YWlsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsTWFuYWdlbWVudFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGhhc2VSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFNldHRsZW1lbnRQYXJ0eXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5kZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmVMaW5lQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaExvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RUcmFuc2Zlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzY2FsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGVldFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxleGlibGVTcGVuZGluZ0FjY291bnRJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGV4aWJsZVNwZW5kaW5nQWNjb3VudEluc3VyYW5jZVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2REYXRhSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb2Rab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxvb3JQbGFuQXBwcm92YWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbGRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvbkFjY2Vzc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZERydWdBZG1pbmlzdHJhdGlvblByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb29kQW5kRHJ1Z0FkbWluaXN0cmF0aW9uUHJvZHVjdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjbG9zaW5nU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2xvc3VyZUFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25FeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkV4Y2hhbmdlQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzQ2FzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNOb3RpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlaWduVHJhZGVab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3Jlc3RyeVBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWFsU3RhdGVtZW50UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1hdGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvclBpY2t1cExpbWl0ZWRGcmVpZ2h0VGFyaWZmTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJzT3JBZ2VudHNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRpbmdPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJhbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyYW5jaGlzZVRheEFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNTZWxsZXJTZXJ2aWNlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZVpvbmVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEZvcndhcmRlcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXlvclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRpbWVPclBhcnRUaW1lRW1wbG95ZWVDbGFzc2lmaWNhdGlvblF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuY3Rpb25hbENhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsV29ya0dyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kQ29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kTWFuYWdlcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRzQXV0aG9yaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQW5hbHlzaXNTb3VyY2VNZXRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzQ3VzdG9kaWFuSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdWdlVGlja2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQWdlbmN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsQ2FyZ29Db25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbERlY2xhcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsTGVkZ2VyQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUHVycG9zZU1lc3NhZ2VSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNEZXN0aW5hdGlvblpvbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNJbmRleCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY0tleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1Njb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHaW5uaWVNYWVQb29sUGFja2FnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc2FuZFNlcnZpY2VUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzRGVjbGFyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybmluZ0NsYXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFjY291bnRpbmdDbGFzc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFkdmFuY2VQcm9ncmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEFnZW5jeVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEJpbGxvZkxhZGluZ09mZmljZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaW9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50UXVhbGl0eUFzc3VyYW5jZUFuZENvbnRyb2xMZXZlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFRyYW5zcG9ydGF0aW9uUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5CbG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5PcmRlclJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jhdml0eVNvdXJjZU1ldGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVlbkNhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwQWNjb3VudGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwT3JQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm93dGhGYWN0b3JSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvckxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRvclVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXNlZFN5c3RlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFybW9uaXplZENvZGVTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhc3RlbmluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzRXhlbXB0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNXYXN0ZU1hbmlmZXN0RG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENhcmVGaW5hbmNpbmdBZG1pbmlzdHJhdGlvbk5hdGlvbmFsUGF5ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoQ2FyZUZpbmFuY2luZ0FkbWluaXN0cmF0aW9uTmF0aW9uYWxQcm92aWRlcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aGNhcmVNYW5wb3dlclNob3J0YWdlQXJlYUZhY2lsaXR5SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aENlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDQ0xhYmVsZXJJZGVudGlmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEluZHVzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhJbnN1cmFuY2VSYXRpbmdTdWZmaXhDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhbHRoTWFpbnRlbmFuY2VPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFsdGhNYWludGVuYW5jZU9yZ2FuaXphdGlvbkNvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoT3JXaWRlRmlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEZhYnJpY2F0aW9uQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFJhd01hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdENlbnN1c1RyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0QmxvY2tOdW1iZXJBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lTW9ydGdhZ2VEaXNjbG9zdXJlQWN0Q291bnR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdE1ldHJvcG9saXRhblN0YXRpc3RpY2FsQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZU1vcnRnYWdlRGlzY2xvc3VyZUFjdFN0YXRlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9yaXpvbnRhbENvb3JkaW5hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcnNlcG93ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdFJvbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VzZVdheWJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q2Fzc0FkZHJlc3NOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGFDYXJnb0FnZW50Q29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUNEOUNNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWNhdGlvbkNhcmRTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aXR5Q2FyZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1hZ2VJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbW1lZGlhdGVFeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWVkaWF0ZVRyYW5zcG9ydGF0aW9uTm9Gb3JJbkJvbmRNb3ZlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGVtZW50YXRpb25WZXJzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRDbGVhcmFuY2VJbnN0cnVjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGVyc1JlZmVyZW5jZU51bWJlclRvTGV0dGVyT2ZDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydExpY2VuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydFBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wdXRhdGlvbkFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluQm9uZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvT3JPdXRib3VuZEZyb21QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5ib3VuZFRvUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0ZWRMZWdhbFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kaXZpZHVhbFRyYW5zYWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsRGVhbGVyQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGYWlsdXJlQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxTYW1wbGVJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJvdWJsZUluZGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnF1aXJ5UmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zcGVjdGlvbmFuZFN1cnZleVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0aW9uUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0b3JJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRlT2ZTZWN1cml0eUFuZEZ1dHVyZU1hcmtldERldmVsb3BtZW50U2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbkxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RpdHV0aW9uTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0aXR1dGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNlcnRpZmljYXRlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb250cmFjdFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlTGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkTG9jYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVkUGFyY2VsUG9zdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlZHNMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmVyQXNzaWduZWRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3Vyb3JQb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRMb2dpc3RpY1N1cHBvcnRDcm9zc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdyYXRlZE1hc3RlclBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVncmF0ZWRNYXN0ZXJTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyY2hhbmdlTnVtYmVyTmV3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmNoYW5nZU51bWJlck9sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VUcmFpbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmdvdmVybm1lbnRhbE1hcml0aW1lT3JnYW5pemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmltRnVuZGluZ09yZ2FuaXphdGlvbkxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWFyeUJyb2tlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbEN1c3RvbWVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbERhdGFQcm9jZXNzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hbFZlbmRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRMb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyQ2hpbGREYXRhTWFpbnRlbmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBc3Nlc3NtZW50TG9nTnVtYmVyUGFyZW50RGF0YU1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRmxpZ2h0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsRnVlbFRheEFncmVlbWVudEFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxSZWdpc3RyYXRpb25QbGFuQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJlZ2lzdHJhdGlvblBsYW5TdGlja2VyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRJbmR1c3RyaWFsQ2xhc3NpZmljYXRpb25Eb21pbmlvbk9mQ2FuYWRhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFN0YW5kYXJkSW5kdXN0cnlDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyc3RhdGVDb21tZXJjZUNvbW1pc3Npb25BY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlcklEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRyYVBsYW50Um91dGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UmVwb3J0UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0b3JpYWxOZXdEcnVnTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZXN0b3JBc3NpZ25lZElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RvckxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdG9yTm90ZUhvbGRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VOdW1iZXJTdWZmaXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2luZ0RhdGFTaGVldFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbkNoYXJnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNGTUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VpbmdCYW5rc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iT3JQcm9qZWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9iU2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50Q3JlZGl0U3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSm9pbnRseUFkbWluaXN0ZXJlZENhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW50VmVudHVyZVJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1ZGdtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOYW1lSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVyaXNkaWN0aW9uYWxDb21tdW5pdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yT3BlcmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcm9yQWZmaWxpYXRpb25JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFRyYW5zZmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZUV4cHJlc3NlZGluU2Vjb25kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZENhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlQWdyZWVtZW50QW1lbmRtZW50TnVtYmVyTWFzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbnRyYWN0UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VSaWRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlckJsYW5rZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlU2NoZWR1bGVOdW1iZXJQcmlvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTY2hlZHVsZU51bWJlclJlcGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJFbnRpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlbmRlclVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc2VlQmlsbENvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NlZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJvZkNyZWRpdERyYWZ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkNyZWRpdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyb2ZDcmVkaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlcnNvck5vdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZ5aW5nT2ZmaWNlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUGxhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmVJbnN1cmFuY2VCaWxsaW5nQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZUluc3VyYW5jZUJpbGxpbmdTdWZmaXhDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlSW5zdXJhbmNlUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUGFydG5lcnNoaXBJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1Db250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lb2ZCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQ3JlZGl0Q2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmtTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlzdEJpbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RPZk1hdGVyaWFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGxveWRzQ2xhaW1zT2ZmaWNlUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZExpbmVDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFBsYW5uaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuQWNxdWlzaXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWF0dXJlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblByb3NwZWN0b3JLZXlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5SZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxKdXJpc2RpY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsbHlBc3NpZ25lZENvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsTWVkaWFJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNjaG9vbENvdXJzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTY2hvb2xEaXN0cmljdENvdXJzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxTdHVkZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbm9uUHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uU3BlY2lmaWNTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25XaXRoaW5FcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2tib3giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9naWNhbE9ic2VydmF0aW9uSWRlbnRpZmllck5hbWVzYW5kQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvZ2lzdGljc1N1cHBvcnREb2N1bWVudGF0aW9uVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkZUV4cHJlc3NlZEluRGVncmVlc01pbnV0ZXNhbmRTZWNvbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb25naXR1ZGVFeHByZXNzZWRpblNlY29uZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdUZXJtRGlzYWJpbGl0eVBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zc09yRXZlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3NSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJBcnRpY2xlTnVtYmVyT2ZSYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFnYXppbmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsYm94Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsU2xvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VBdmFpbGFiaWxpdHlUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZVJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ham9yRm9yY2VQcm9ncmFtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvclN5c3RlbUFmZmVjdGVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsTGluZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFtbW9ncmFwaHlDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5hZ2VkQ2FyZU9yZ2FuaXphdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZWRDYXJlT3JnYW5pemF0aW9uSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0S2V5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51YWxQcm9jZXNzaW5nQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJEZWZpbmVkUmVwYWlyUmF0ZXNSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyc01hdGVyaWFsU2FmZXR5RGF0YVNoZWV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ0RpcmVjdGl2ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09wZXJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmluZ09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaXRpbWVEZWNsYXJhdGlvbm9mSGVhbHRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJraW5nT3JMYWJlbFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQWlyV2F5YmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyTGFiZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlckxlYXNlQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclByb3BlcnR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hc3RlclNvbGljaXRhdGlvblByb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2hhbmdlTm90aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXRlcmlhbFN0b3JhZ2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJlZENlcnRpZmljYXRlT2ZEZXBvc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0UHJvY2Vzc2luZ0VzdGFibGlzaG1lbnRSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUHJvdmlkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWlkUmVjaXBpZW50SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxBc3Npc3RhbmNlQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxSZWNvcmRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQcm92aWRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVWZXJzaW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtYmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbmRpc2VUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVyY2hhbnRDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VBZGRyZXNzb3JJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUJhdGNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzYWdlRGVzaWduR3JvdXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VSZWNpcGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2VTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclByb3ZpbmdSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZ0F0VGhlQmVnaW5uaW5nT2ZUaGVEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJSZWFkaW5nQXRUaGVFbmRPZkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0ZXJVbml0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSUNSTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWNyb2ZpbG1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZ3JhbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzdG9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlDYWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUlEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeUludGVyZGVwYXJ0bWVudGFsUHVyY2hhc2VSZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeU9yZG5hbmNlU2VjdXJpdHlSaXNrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVJhbmtPckNpdmlsaWFuUGF5R3JhZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlTdGFuZGFyZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbGluZ2luVHJhbnNpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsbE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUm95YWx0eVBheW9ySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmlzdGVyaWFsQ2VydGlmaWNhdGVPZkhvbW9sb2dhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbHllYXJudW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT1JORVRQbHVzSW5zdGl0dXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PUk5FVFBsdXNVc2VySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlQmFja2VkU2VjdXJpdHlMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUJhY2tlZFNlY3VyaXR5UG9vbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VFbGVjdHJvbmljUmVnaXN0cmF0aW9uU3lzdGVtT3JnYW5pemF0aW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VJbnN1cmFuY2VDb21wYW55TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUluc3VyYW5jZUluZGljYXRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yQ2FycmllcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvckZ1ZWxDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlSUROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpZmFtaWx5UHJvamVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZUJvb2tUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdWx0aXBsZUxpc3RpbmdTZXJ2aWNlTWFwWENvb3JkaW5hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlTGlzdGluZ1NlcnZpY2VNYXBZQ29vcmRpbmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVMaXN0aW5nU2VydmljZVN1YkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlUE9PZkFuSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGlwbGVab25lT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbGl0eUFzc2lnbmVkQnVzaW5lc3NSZWdpc3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFDRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkFGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lZEJhbmtzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEFlcm9uYXV0aWNzYW5kU3BhY2VBZG1pbmlzdHJhdGlvbkZBUlN1cHBsZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkJvYXJkc09mUGhhcm1hY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQXNzb2NpYXRpb25PZkluc3VyYW5jZUNvbW1pc3Npb25lcnNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsQ3JpbWluYWxJbmZvcm1hdGlvbkNlbnRlck9yaWdpbmF0aW5nQWdlbmN5SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ29tbXVuaXR5TmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1Db21tdW5pdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRmxvb2RJbnN1cmFuY2VQcm9ncmFtQ291bnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEZsb29kSW5zdXJhbmNlUHJvZ3JhbU1hcE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxGbG9vZEluc3VyYW5jZVByb2dyYW1TdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxHb3Zlcm5tZW50QnVzaW5lc3NJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxQcm9wZXJ0eVJlZ2lzdHJ5U3lzdGVtTGV2ZWwxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb3BlcnR5UmVnaXN0cnlTeXN0ZW1MZXZlbDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUHJvcGVydHlSZWdpc3RyeVN5c3RlbUxldmVsMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxTdG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0dXJhbEdhc1BvbGljeUFjdENhdGVnb3J5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3RHJ1Z0FwcGxpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdIZWFsdGhJbnN1cmFuY2VDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3UGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFJlbnRhbEFncmVlbWVudFJlYXNvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFNoaXBtZW50SWRlbnRpZmljYXRpb25OdW1iZXJDb250aW51b3VzTW92ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTklUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb21pbmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25BbWVyaWNhbklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Db25mb3JtYW5jZVJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uTmVnb3RpYWJsZU1hcml0aW1lVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk9yaWdpbmF0aW5nVGhpcmRQYXJ0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUGlja3VwTGltaXRlZFRhcmlmZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uU3BvdXNlVGllIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb09UNUF1dGhvcml0eVplcm9NaWxlYWdlUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ydGhBbWVyaWNhbkRhdHVtU3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5GcmVlVHJhZGVBZ3JlZW1lbnRDb21wbGlhbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSGF6YXJkb3VzQ2xhc3NpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcnRoQW1lcmljYW5IYXphcmRvdXNHb29kc0NsYXNzaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3J0aEFtZXJpY2FuSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uU3lzdGVtQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9USUNPTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZUZW1wb3JhcnlJbXBvcnRhdGlvbkRvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUNlZHVsYWRlSWRlbnRpZGFkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1lcm9kZUlkZW50aWZpY2FjaW9uVHJpYnV0YXJpYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbmFsU2FmZXR5YW5kSGVhbHRoQWRtaW5pc3RyYXRpb25DbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQmlsbG9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2VhbkNvbnRhaW5lck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5NYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5kZXJUcmFja2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmZW5zZVRyYWNraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VyTGljZW5zZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU3ltYm9sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRNZXRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lQ2FsbEFnZW5jeVRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25saW5lUHJvY3VyZW1lbnRhbmRBY2NvdW50aW5nQ29udHJvbFRyYW5zYWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuYW5kUHJlcGFpZFN0YXRpb25MaXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQXNzaWduZWRVbml0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvckxlYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25Qb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyT3JQYXJhZ3JhcGhOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyaW5nQ3VzdG9tZXJDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJpbmdDdXN0b21lcnNTZWNvbmRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JnYW5pemF0aW9uQnJlYWtkb3duU3RydWN0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbENlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZkb1RyYW5zYWN0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxGaWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQdXJjaGFzZU9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZXR1cm5SZXF1ZXN0UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFNoaXBwZXJzQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFN1Ym1pdHRlckNoaWxkRGF0YU1haW50ZW5hbmNlUmVxdWVzdExvZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxTdWJtaXR0ZXJMb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsU3VibWl0dGVyUGFyZW50RGF0YU1haW50ZW5hbmNlUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxVbmlmb3JtQ29tbWVyY2lhbENvZGVGaWxpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVm91Y2hlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYXRpbmdDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0NvbXBhbnlJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hdGluZ0RlcG9zaXRvcnlGaW5hbmNpYWxJbnN0aXR1dGlvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmF0b3JzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5Ib3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luT2ZTaGlwbWVudEhhcm1vbml6ZWRCYXNlZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9UNUF1dGhvcml0eUNvbmRpdGlvbk9yUmVzdHJpY3Rpb25vbkNhckhpcmVSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkVHlwZU9mUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRib3VuZEZyb21QYXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0ZXJDb250aW5lbnRhbFNoZWxmQXJlYUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxTaGVsZkJsb2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlcnBhY2thZ2luZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0bGV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRvZlNlcnZpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmluZ0J1cmVhdUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrQW5kSG9sZEludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0dyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdTcGVjaWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmdVbml0SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nR3JvdXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nTGlzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja2luZ1BsYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhZ3JhcGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFncmFwaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyYW1lZGljYWxJRE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50RmlsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydENhdXNpbmdSZXBhaXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRDb25zaWdubWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbFBheW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpY2lwYXRpbmdBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0SW50ZXJjaGFuZ2VhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0UmVmZXJlbmNlSW5kaWNhdG9ySW5BRHJhd2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydHlJbmZvcm1hdGlvbk1lc3NhZ2VSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnR5U2VxdWVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3Nwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50Q29vcGVyYXRpb25UcmVhdHlBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0ZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRlbnRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXRpZW50QWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0cm9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZUxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVlc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZWVzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllZXNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQXNzaWduZWRSZXN1Ym1pc3Npb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyQ2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWVyc0ZpbmFuY2lhbEluc3RpdHV0aW9uQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5ZXJzRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2l0Um91dGluZ05vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXllcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheUdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q2F0ZWdvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRIaXN0b3J5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5BZHZhbmNlUmVxdWVzdFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEluc3RhbG1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGxhblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudFZhbHVhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5b3JzQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQY3NDYXRhc3Ryb3BoZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvbkFwcHJvdmFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQ2FzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuc2lvbkNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RpY2l0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc29uYWxJZGVudGl0eUNhcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsSUROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVBvb2xDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFybWFjeVByZXNjcmlwdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvbmVDYWxscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxJbnZlbnRvcnlSZWNvdW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXBSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFjdHVhbFByb2R1Y3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY3R1cmVPZkFHZW5lcmljUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlnZ3liYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWxvdExpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFubmluZ1BhY2thZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1JZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxvdEZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUZvcm1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUxpbmtOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sbHV0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sQ29udHJhY3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RFbnRyeVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlQXdhcmRTdXJ2ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNpbmN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkZWNlc3NvckFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWRldGVybWluYXRpb25vZkJlbmVmaXRzSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZENhbGxTaWduIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvbkF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFByb3ZpZGVyT3JnYW5pemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRQcm92aWRlck9yZ2FuaXphdGlvblNpdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxpbWluYXJ5V29ya0NhbmRpZGF0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWFya2V0QXBwbGljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1hcmtldE5vdGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0UHJpb3JpdHlJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQXVkaXRQdXJwb3NlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bUF1ZGl0VHlwZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1SYXRlVGFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmVyc1ZlcmlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGluZ0JhbmtzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0Zvcm1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzc0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQmlsbG9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NhcmdvQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDbGFpbUhpc3RvcnlJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRPckRlYml0QWRqdXN0bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDcmVkaXRBZHZpY2VSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VzdG9tZXJSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRGVsaXZlcnlJbnN0cnVjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNEZWxpdmVyeVNjaGVkdWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0Rpc3RyaWJ1dG9yTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RyaXZlcnNMaWNlbnNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0RydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0hpZ2hlc3RTY2hlZHVsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNJbnZvaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVwb3J0ZWRTb2NpYWxTZWN1cml0eU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZW1iZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1JlbnRhbEFncmVlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVxdWVzdEZvck1ldGVyZWRSZWFkaW5nUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NjaGVtZU9yUGxhbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTZXF1ZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNTaGlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyQ29udGludW91c01vdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGF4Q29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlT3JTYWxlc0NhdGFsb2d1ZVJlc3BvbnNlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFyZWFOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdENoYW5nZW9ySXNzdWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlTGlzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VMaXN0VmVyc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VRdW90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VWYXJpYXRpb25Gb3JtdWxhUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5UmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltZUNvbnRyYWN0b3JDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzQmFua1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbmNpcGFsc1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ2VydGlmaWNhdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yRGF0YVVuaXZlcnNhbE51bWJlclN5c3RlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIZWFsdGhJbmR1c3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJZGVudGlmaWVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdEJhdGNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckluY29ycmVjdFNvY2lhbFNlY3VyaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVJhdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JMb2FuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBob25lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclBvbGljeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JQb3N0YWxaaXBDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9ycHVyY2hhc2VvcmRlcm51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUYXhJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclVuaXZlcnNhbFByb3ZpZGVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2NlZWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NIYW5kbGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NpbmdBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nUGxhbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NvcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzb3JzSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyZW1lbnRCdWRnZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2N1cmVtZW50UmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY3VyaW5nQWdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlSW5mb3JtYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RDaGFuZ2VOb3RpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaWNlbnNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RMaW5lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0UGVyaW9kRm9yV2hpY2hMYWJvckNvc3RzQXJlRmlybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFJlc2VydmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0U291cmNpbmdBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RTcGVjaWZpY2F0aW9uRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9maWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mb3JtYUludm9pY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1JZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3Jlc3NQYXltZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBhcmFncmFwaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFByb3BlcnR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9qZWN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JEZWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnlSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29tcG9uZW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3BlcnR5Q29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlMb3NzSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcG9zYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Bvc2FsUGFyYWdyYXBoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZENvbnRyYWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZEdyb3VwV29ya0NhbmRpZGF0ZVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wb3NlZFdvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG9jb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RyYWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlckNvbW1lcmNpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJPcmRlclRpY2tldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJQbGFuTmV0d29ya0lkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlclNpdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVyVVBJTk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmluY2lhbENhbmFkaWFuU2FsZXNUYXhFeGVtcHRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpbmNpYWxUYXhJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQYXRlbnRBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljYXRpb25Jc3N1ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRGVlZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljRmlsaW5nUmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNVdGlsaXRpZXNDb21taXNzaW9uQ2VydGlmaWNhdGVPZlB1YmxpY0NvbnZlbmllbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbkFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckNoYW5nZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlckxpbmVJdGVtSWRlbnRpZmllckJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVySW5jbHVkZWRpbk9uT3JkZXJQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlck9mT3JkZXJSZWNlaXZlZFNpbmNlTGFzdFJlcG9ydGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJOdW1iZXJPZlNoaXBtZW50UmVjZWl2ZWRTaW5jZUxhc3RSZXBvcnRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyTnVtYmVyU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9yZGVyUmVzcG9uc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZXZpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VSZXF1aXNpdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc1JlcXVlc3RSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNpbmdBY3Rpdml0eUNsYXVzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkTWF0ZXJpYWxzTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWVkUHJvZHVjdHNMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q2xhdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5RGlzcG9zaXRpb25BcmVhSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUluc3BlY3Rpb25BcmVhSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJlcG9ydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eVJldmlld01hdGVyaWFsQ3JpYklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VmFsdWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVZhbHVhdGlvblJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJhbnRpbmVPclRyZWF0bWVudFN0YXR1c1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhcnRlclF1YXJ0ZXJTZWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyUXVhcnRlclNwb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1ZXN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90YU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVPclNob3BwaW5nQ2FydElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWNrVHlwZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbE9yUm9hZFJvdXRpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZENvbW1pc3Npb25PaWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxyb2FkQ29tbWlzc2lvblJlY29yZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFJvdXRpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsV2F5QmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheUNvbnNpZ25tZW50Tm90ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHdheVdhZ29uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZUNhcmROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlQ29uZmVyZW5jZUlEQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU5vdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF3bWF0ZXJpYWxTdXBwbGllckR1bkFuZEJyYWRzdHJlZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVPd25lZFByb3BlcnR5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhc29uRm9yQ2hhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFzb25Ob3RMb3dlc3RDb3N0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNhbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFzc2lnbmVkRHJvcFpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVySURRdWFsaWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVyU3ViSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZ0FkdmljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nQmFua3NBdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdDb21wYW55SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nRGVwb3NpdG9yeUZpbmFuY2lhbEluc3RpdHV0aW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2aW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZpbmdQYXJ0eXNNZW1iZXJJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25jaWxpYXRpb25SZXBvcnRTZWN0aW9uSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvcmRpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZHVjZWRFYXJuaW5nV2Vla0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZWRCeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlZFBhdHRlcm5JZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlRHJhd2luZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyQXNzaWduZWRCeVRoaXJkUGFydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlck9mQVJlcXVlc3RGb3JNZXRlcmVkUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlTnVtYmVyUXVvdGVkT25TdGF0ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZU51bWJlclRvUHJldmlvdXNNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VWZXJzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yQ2hlbWljYWxBbmFseXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyZWRQcm9kdWN0Rm9yTWVjaGFuaWNhbEFuYWx5c2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaW9uYWxBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpcmlzdG9GZWRlcmFsRGVDb250cmlidXllbnRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXJpc3RvRmVkZXJhbGRlQ29udHJpYnV5ZW50ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdGVyZWRDYXBpdGFsUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQ29udHJhY3RvckFjdGl2aXR5VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZE1haWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uTnVtYmVyT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9JbmZvcm1hY2lvbkZpc2NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9OYWNpb25hbGRlQ29udHJpYnV5ZW50ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cm9Vbmljb2RlQ29udHJpYnV5ZW50ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdGlvblByaW1hcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRpb25TZWNvbmRhcnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ3VsYXRvcnlHdWlkZWxpbmVJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmVyc0NsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlQ2Vzc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQ2FzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZENvbnRyYWN0TGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWREb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE5vbmNvbmZvcm1hbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkT2JqZWN0SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFZlbmRvck9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVByaW9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlSW52b2ljZU51bWJlckZvclByaW9yQmlsbEFuZEhvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2VBZHZpY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGluZ0JhbmtzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRQYXlvcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckNhdGVnb3J5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJEYXRhUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRXN0aW1hdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpck9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBlYXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwZXRpdGl2ZUJvb2tpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVDYXJnb1NoaXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBldGl0aXZlUGF0dGVybkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGV0aXRpdmVXYXliaWxsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRBc3NlbWJseU1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEFzc2VtYmx5U2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudENsYWltTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudEN1c3RvbWVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudERydWdFbmZvcmNlbWVudEFkbWluaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNpbmdQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50UHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZUVuZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFB1cmNoYXNlT3JkZXJSYW5nZVN0YXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRpbmdGb3JtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcHJlc2VudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByZXNlbnRhdGl2ZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZENsYWltUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXByaWNlZExpbmVJdGVtUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yQ2FuY2VsbGF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Zm9yUXVvdGF0aW9uUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0Rm9yUXVvdGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZlQXNzZW1ibHlMaW5lRmVlZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvdXJjZVNjcmVlbmluZ1JlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VVdGlsaXphdGlvbkdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNwb25zZXRvYVJlcXVlc3Rmb3JRdW90YXRpb25SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRBdmFpbGFiaWxpdHlBdXRob3JpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkQXZhaWxhYmlsaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN1Ym1pc3Npb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWlzc2lvblJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VibWl0bnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxNZXJjaGFudHNDZXJ0aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRpcmVtZW50UGxhbkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnRQbGFuUG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZEdvb2RzQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuR29vZHNCaWxsT2ZMYWRpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybk1hdGVyaWFsQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuc05vdGljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2ZW51ZVNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aWV3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpZXdlckZpbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJJRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkQ29uc2lnbm1lbnROb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPcmRlck51bWJlckRvbWVzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRW1lcmdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZU9yZGVyTnVtYmVyRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0aW5nSW5zdHJ1Y3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJVQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVsZVNlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZWtlZXBpbmdBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlFcXVpcG1lbnRDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5b2ZSYWRpb0NlcnRpZmljYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWZldHlvZlNoaXBDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNPclRlcnJpdG9yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzQWxsb3dhbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RlcGFydG1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzRm9yZWNhc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzT2ZmaWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1BlcnNvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcm9ncmFtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc1JlZ2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUmVwcmVzZW50YXRpdmVPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNSZXNwb25zaWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXZpbmdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2FuTGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVtZU9yUGxhbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sTG9hbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Nob29sVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT2ZmTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWFsT25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXJjaEtleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDZXJ0aWZpY2F0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q292ZXJhZ2VDb21wYW55TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlDdXN0b21zUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlFbXBsb3llZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlIZWFsdGhJbnN1cmFuY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQcm92aWRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5U3VmZml4Q29kZUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kQmVuZWZpY2lhcnlzUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmlhZGVDb21lcmNpYXlGYW1lbnRhSW5kdXN0cmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0YXJ5b2ZTdGF0ZUFzc2lnbmVkSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3Rpb25PZlRoZU5hdGlvbmFsSG91c2luZ0FjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5SW5zdHJ1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJhbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZJbnN1cmVyQXV0aG9yaXphdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxmSW5zdXJlck9yZ2FuaXphdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlckxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDYXRhbG9ndWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNDcmVkaXRNZW1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRGViaXRNZW1vIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzSW52b2ljZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyc1NhbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxpbmdBcnJhbmdlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyRGVmaW5lZENsYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0NsYXVzZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGVyc0ZpbGVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRlcnNSZWZlcmVuY2VUb1RoZU9yaWdpbmFsTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VuZGluZ0JhbmtSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdDb21wYW55QXVkaXROdW1iZXJBdXRvbWF0ZWRDbGVhcmluZ2hvdXNlVHJhbnNmZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQXV0aG9yaXphdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUJ1bGxldGluTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhbmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ2hhcmdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFc3RpbWF0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUdyb3VwSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VJbnRlcnJ1cHRUcmFja2luZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZU9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUGVyZm9ybWVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VSZXF1ZXN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmTGlmZUluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGVzdGluYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudE9yaWdpbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90aWNlT3JNYW5pZmVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG93bmVyc0F1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJDYXJPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNCb25kTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyc0hhemFyZG91c051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdMYWJlbFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdOb3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGluZ1VuaXRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydFRlcm1EaXNhYmlsaXR5UG9saWN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG93SWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYWxDb2RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVUcmFuc2FjdGlvblNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSVJFTk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lSRVROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGVTcGVjaWZpY1Byb2NlZHVyZXNUZXJtc0FuZENvbmRpdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdHVhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xhdWdodGVyUGxhbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbEluc3VyYW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29jaWFsU2VjdXJpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlvZlByb3BlcnR5SW5mb3JtYXRpb25Db21waWxlcnNhbmRBbmFseXN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVBcHBsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29saWNpdGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3J0QW5kU2VncmVnYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2VEb2N1bWVudEludGVybmFsUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFjaW5nVW5pdE9yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQXBwcm92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdWRnZXRBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2hhcmdlT3JBbGxvd2FuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsQ2xhdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsR292ZXJubWVudEFjY291bnRpbmdDbGFzc2lmaWNhdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEluc3RydWN0aW9uc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1vdmVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYWNrYWdpbmdJbnN0cnVjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBheW1lbnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9jZXNzaW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFF1b3RlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsdHlMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uQ2xhc3NOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpZmljYXRpb25SZXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2ltZW5JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGxpdEJvb2tpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UHJlbWl1bUF1ZGl0Q2hhbmdlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRTaGlwbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvbnNvcnNSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVRpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhY2tUcmFpbklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDYXJyaWVyQWxwaGFDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZENsYXVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRJbmR1c3RyeUNsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmROdW1iZXJPZkluc3BlY3Rpb25Eb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRQb2ludExvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzQ29kZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRzTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZHNWZXJzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFRyYW5zcG9ydGF0aW9uQ29tbW9kaXR5Q29kZUJyaWRnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRUcmFuc3BvcnRhdGlvbkNvbW1vZGl0eUNvZGVSZXBsYWNlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0aW5nUGFja2FnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVBc3NlbWJseURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUNoYXJ0ZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ29udHJvbGxlZFN1YnN0YW5jZUxpY2Vuc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlQ3JpbWluYWxIaXN0b3J5UmVwb3NpdG9yeUluZGl2aWR1YWxJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50STIwRm9ybU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVEZXBhcnRtZW50SUFQNjZGb3JtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUhhemFyZG91c1dhc3RlRW50aXR5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVJbmR1c3RyaWFsQWNjaWRlbnRQcm92aWRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMZWdpc2xhdGl2ZURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUxpY2Vuc2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMaWNlbnNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudE9mV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVOb25SZXNpZGVudFZpb2xhdG9yQ29tcGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNlQXNzaWduZWRCdXNpbmVzc1JlZ2lzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2VBc3NpZ25lZEVudGl0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVNhbGVzVGF4SWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2VuYXRlRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3R1ZGVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRheElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZXdpZGVDb3Vyc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRpb25SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzUmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0NlcnRpZmljYXRlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0V4Y2hhbmdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvY2tFeGNoYW5nZUNvbXBhbnlJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja0tlZXBpbmdVbml0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlSW5mb3JtYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmFzc2VtYmx5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdExpbmVJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckRhdGFSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmRheU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViZGl2aXNpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJleGhpYml0TGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YkZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlOb25TYWxlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJqZWN0UHJvcGVydHlSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RQcm9wZXJ0eVZlcmlmaWNhdGlvblNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibGluZW9mSW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXNzaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic2NyaWJlckF1dGhvcml6YXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNjcmliZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcnZpY2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJTZXJ2aWNlckxvYW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0YW50aXZlbHlDb25zb2xpZGF0ZWRDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlQWlyV2F5YmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZU1hbnVmYWN0dXJlcnNQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlTmF0aW9uYWxTdG9ja051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Vic3RpdHV0ZVBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YlN1YmhvdXNlQmlsbE9mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWNjZXNzb3JBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmaXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyaW50ZW5kZW5jaWFkZUludmVyc2lvbmVzRXh0cmFuamVyYXNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVydmlzb3J5QXBwcmFpc2VyQ2VydGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWNjb3VudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsQWdyZWVtZW50QXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGVtZW50YWxDbGFpbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyUmVwbGFjZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRG9jdW1lbnRJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQ3JlZGl0Q2xhaW1SZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRpbmdEb2N1bWVudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3YXBPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1dJRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQxMDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUTVQyMDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNXSUZUQ29uZmlybWF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1ib2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bWJvbE51bWJlckZvck1pbGVzdG9uZU9yTE9CUmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtYXRpemVkTm9tZW5jbGF0dXJlb2ZIdW1hbmFuZFZldGVyaW5hcnlNZWRpY2luZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFbnRyZXByaXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtZUluZm9ybWF0aXF1ZVBvdXJMZVJlcGVydG9pcmVEZXNFdGFibGlzc2VtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhcmlmZk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUGFnZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmUnVsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU2VjdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmU3VmZml4TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJpZmZTdXBwbGVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXNrT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEFnZW5jeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4RXhjaGFuZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHRpb25MaWNlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhFeGVtcHROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheEZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Rm9ybUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGluZ0F1dGhvcml0eUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWNlbnNlRXhlbXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhMaWVuSnVyaXNkaWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFNjaGVkdWxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4U2hlbHRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4V29ya3NoZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQ04iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlYW1Bc3NpZ25tZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxEb2N1bWVudGF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsRG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbEluZm9ybWF0aW9uUGFja2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbFBoYXNlUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbkNpcmN1aXRTdXBwbGVtZW50YWxJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXhNZXNzYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wbGF0ZVNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbE9wZXJhdG9yTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbFJlbGVhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRpb25GaWxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UmVwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGV4dEVsZW1lbnRJZGVudGlmaWVyRGVsZXRpb25SZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZWF0ZXJTY3JlZW5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkQmFua3NSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlBZG1pbmlzdHJhdG9yQ2xhaW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlOb3RlSG9sZGVySWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlPcmdhbml6YXRpb25BdXRob3JpemF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5T3JpZ2luYXRvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVB1cmNoYXNlT3JkZXJSZWxlYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJvdWdoQmlsbE9mTGFkaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaWNrZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVGYWlsdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJDYXJuZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJUk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVDb21wYW55Q29kZUJvb2tSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlRG9jdW1lbnRTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVQb2xpY3lOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGxlUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZVhJWElkZW50aWZpZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRva3lvU2hva29SZXNlYXJjaEJ1c2luZXNzSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9sbEJpbGxpbmdUZWxlcGhvbmVSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3ljbGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3JkZXJDeWNsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG93bnNoaXBOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRveGljb2xvZ3lJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2VyQWN0aW9uUmVxdWVzdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZXJBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkaW5nUGFydG5lcklkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyVHlwZVF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlclVzZUFncmVlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRmxpZ2h0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNhdGVnb3J5T3JUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRHdWFyYW50ZWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9uZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvbkFjY291bnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25FeHBvcnRhdGlvbk5vRm9ySW5Cb25kTW92ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydGF0aW9uUHJpb3JpdHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRyYWN0UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRDb3N0c1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RG9jdW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFJldHVyblJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3RyaXBwaW5nT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN0dWZmaW5nT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEVxdWlwbWVudFN1cnZleVJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50U3VydmV5UmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdXJ2ZXlSZXBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFJvdXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRTZWN0aW9uUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxNYW5pZmVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5SWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbExvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcGxlYmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tlcnNCaWxsT2ZMYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTUkJ1c2luZXNzSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mQ29tbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mRXNjcm93TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlT2ZIb3VzZWhvbGRHb29kc0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZkxhd1N1aXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZk91dHN0YW5kaW5nSnVkZ21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlNjaWVuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVmZW5zZUZlZGVyYWxBY3F1aXNpdGlvblJlZ3VsYXRpb25TdXBwbGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuRGVwYXJ0bWVudE9mVmV0ZXJhbnNBZmZhaXJzQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuR292ZXJubWVudFRyYW5zcG9ydGF0aW9uQ29udHJvbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDb25zaWduZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVsdGltYXRlQ3VzdG9tZXJzUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VEVU5TTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmFjY2VwdGFibGVTb3VyY2VQdXJjaGFzZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2NlcHRhYmxlU291cmNlU3VwcGxpZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0ZXJJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nQWxlcnRSZWZlcmVuY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRJbnN1cmFuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ0NvbGxhdGVyYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1SZXNvdXJjZUxvY2F0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDbGFpbXNSZWZlcmVuY2VOdW1iZXJPZlRoZVNlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ29uc2lnbm1lbnRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmlxdWVDb25zaWdubWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlQ3VycmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZU1hcmtldFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pcXVlUmVpbmFjUmVmZXJlbmNlTnVtYmVyT2ZUaGVTZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXF1ZVN1cHBsaWVySWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZE5hdGlvbnNIYXphcmRvdXNDbGFzc2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkU3RhdGVzR292ZXJubWVudFZpc2FOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRlZFN0YXRlc1N0YW5kYXJkTWV0cm9wb2xpdGFuU3RhdGlzdGljYWxBcmVhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2VJZGVudGlmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdFByb3BlcnR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVsaWVmTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UmVwb3J0UGVyaW9kSUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRUcmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdmVyc2FsUmFpbHJvYWRSZXZlbnVlV2F5YmlsbElkZW50aWZpZWROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvckVhc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFRyYW5zdmVyc2VNZXJjYXRvck5vcnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3Jab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnBhaWRJbnN0YWxsbWVudFJlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBwZXJTZXJpYWxOdW1iZXJPZlJhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVcHN0cmVhbVNoaXBwZXJDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDRlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VBbnRpRHVtcGluZ0R1dHlDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlQmluZGluZ1J1bGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvbW1lcmNpYWxEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUNvdW50ZXJ2YWlsaW5nRHV0eUNhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VFbnRyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZUVudHJ5VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VQcmVBcHByb3ZhbFJ1bGluZ051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNDdXN0b21zU2VydmljZVByZUNsYXNzaWZpY2F0aW9uUnVsaW5nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlU3RhdGVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0RPRUFuZE5DRVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTRE9UQm9uZFN1cmV0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZXJJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZDQ0ltcG9ydENvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNGZWRlcmFsQWNxdWlzaXRpb25SZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0ZlZGVyYWxJbmZvcm1hdGlvblJlc291cmNlc01hbmFnZW1lbnRSZWd1bGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0Zvb2RBbmREcnVnQWRtaW5pc3RyYXRpb25Fc3RhYmxpc2htZW50SW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0dlbmVyYWxTZXJ2aWNlc0FkbWluaXN0cmF0aW9uUmVndWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNHb3Zlcm5tZW50QWdlbmN5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4UmVnaXN0cmF0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXRSZWdpc3RyYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVCdXNpbmVzc1VzZVF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZUxpY2VuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSYWRpdXNvZk9wZXJhdGlvblF1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVJlbGF0ZWRTZXJ2aWNlc1JlZmVyZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZVNpemVDbGFzc1F1YWxpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQWJicmV2aWF0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ2hhbmdlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGFuZ2VQcm9jZWR1cmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDb250cmFjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9ySUROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvck9yZGVyTnVtYmVyU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzUHJldmlvdXNKb2JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclRlcm1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJpZmljYXRpb25Tb3VyY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZUxvY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uQ29kZU5hdGlvbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJ0aWNhbENvb3JkaW5hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsQWdlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FkbWluaXN0cmF0aW9uT3JpZ2luYXRvcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXRlcmFuc0FmZmFpcnNDYXNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpc2FUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVB1cmNoYXNlQWdyZWVtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3VjaGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3lhZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VEZXRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl2ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZUVudHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VQaWNrVGlja2V0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VSZWNlaXB0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTdG9yYWdlTG9jYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnR5Q292ZXJhZ2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eVJlZ2lzdHJhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2F5YmlsbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhcG9uU3lzdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRBZ3JlZW1lbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxDbGFzc2lmaWNhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpdGhkcmF3YWxBY2NvdW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaXRoZHJhd2FsUmVjb3JkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvb2xUYXhSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtDYW5kaWRhdGVTZXF1ZW5jZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NlbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1NoaWZ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrSXRlbVF1YW50aXR5RGV0ZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya09yZGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGFja2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1NoaWZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3Jrc2l0ZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1Rhc2tDaGFyZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUZWFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJkUG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpvbmUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQmFzZUl0ZW1EZXRhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUHJpY2luZ0RldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJEZWxpdmVyeURldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1Ob3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlN0cnVjdHVyZWROb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGluZUl0ZW1BdHRhY2htZW50cyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkF0dGFjaG1lbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCIgdHlwZT0iSXRlbURldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZUl0ZW1EZXRhaWwiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGluZUl0ZW1OdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGluZUl0ZW1UeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYXJlbnRJdGVtTnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGluZUl0ZW1OdW1iZXJSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJJdGVtSWRlbnRpZmllcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFF1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTWF4QmFja09yZGVyUXVhbnRpdHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlF1YW50aXR5Q29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9mZkNhdGFsb2dGbGFnIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDYXRhbG9nUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJdGVtQ29udHJhY3RSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQ29udHJhY3RJdGVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkl0ZW1SZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ291bnRyeU9mT3JpZ2luIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ291bnRyeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3VudHJ5T2ZEZXN0aW5hdGlvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvdW50cnkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRmluYWxSZWNpcGllbnQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlBhcnR5Q29kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ29uZGl0aW9uc09mU2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzTWF0ZXJpYWxzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iSGF6YXJkb3VzIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2VJdGVtRGV0YWlsIiB0eXBlPSJCYXNlSXRlbURldGFpbCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGluZUl0ZW1OdW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJ1eWVyTGluZUl0ZW1OdW0iIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNlbGxlckxpbmVJdGVtTnVtIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaW5lSXRlbU51bSIgdHlwZT0iTGluZUl0ZW1OdW0iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtVHlwZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGluZUl0ZW1UeXBlQ29kZWQiIHR5cGU9IkxpbmVJdGVtVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxpbmVJdGVtVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtVHlwZSIgdHlwZT0iTGluZUl0ZW1UeXBlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxpbmVJdGVtVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBvbmVudEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXh0SXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludCI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iTGluZUl0ZW1OdW1UeXBlQ29kZWQiIHR5cGU9IkxpbmVJdGVtTnVtVHlwZUNvZGUiIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9IkJ1eWVyIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkxpbmVJdGVtTnVtYmVyUmVmZXJlbmNlIiB0eXBlPSJMaW5lSXRlbU51bWJlclJlZmVyZW5jZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJMaW5lSXRlbU51bVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtSWRlbnRpZmllcnMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQYXJ0TnVtYmVycyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZSIgdHlwZT0ieGNibEJvb2xlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvbW1vZGl0eUNvZGUiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2F0ZWdvcnkiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1JZGVudGlmaWVycyIgdHlwZT0iSXRlbUlkZW50aWZpZXJzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJ0TnVtYmVycyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWxsZXJQYXJ0TnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUGFydE51bSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCdXllclBhcnROdW1iZXIiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQYXJ0TnVtIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTWFudWZhY3R1cmVyUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RhbmRhcmRQYXJ0TnVtYmVyIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTdWJzdGl0dXRlUGFydE51bWJlcnMiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZQcm9kdWN0SWRlbnRpZmllckNvZGVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik90aGVySXRlbUlkZW50aWZpZXJzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJ0TnVtYmVycyIgdHlwZT0iUGFydE51bWJlcnMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhcnROdW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBhcnRJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGFydElERXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXZpc2lvbk51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFydE51bSIgdHlwZT0iUGFydE51bSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWFudWZhY3R1cmVyUGFydE51bWJlciI+CisgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJQYXJ0TnVtIj4KKyAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYW51ZmFjdHVyZXJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIiB0eXBlPSJNYW51ZmFjdHVyZXJQYXJ0TnVtYmVyIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGVkIiB0eXBlPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByb2R1Y3RJZGVudGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9kdWN0SWRlbnRpZmllckV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcm9kdWN0SWRlbnRpZmllclF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUHJvZHVjdElkZW50aWZpY2F0aW9uQXNzaWduZWRCeVRoZU1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdQYWNrYWdlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZ3JlZ2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0YXRpb25Bc3NvY2lhdGlvblByb3ByaWV0YXJ5UmlnaHRzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGlvbk1ldGhvZG9sb2d5SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVJU0JOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhbkRlbnRhbEFzc29jaWF0aW9uQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNBc3NlbWJseSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1lcmljYW5UcnVja2luZ0Fzc29jaWF0aW9uc1BhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtZXJpY2FuVHJ1Y2tpbmdBc3NvY2lhdGlvbnNTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWNhdGlvbkNvbXBsZXRpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbFByb2R1Y3RUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByYWlzYWxTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUk5JQ1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NlbWJseUxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzb3J0YWJpbGl0eUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvcml6ZWRQYXJ0c0xpc3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRpY1RyYW5zbWlzc2lvblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV4aWxpYXJ5VHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXhpbGxhcnlUcmFuc21pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVSYXRpbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXhsZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyLUNvZGVkU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXRjaE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNvbW1vbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxib2FyZHNDb21tZXJjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsQ3JlZGl0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbFN1Ymdyb3VwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmluZGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5kT3JMYWJlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyUHJpY2VPcGluaW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzQm9keVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJHcm91bmRTaGFkZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhdGFsb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NvbG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNFbmRQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNFbmdpbmVlcmluZ0NoYW5nZUxldmVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNJbnRlcm5hbFByb2R1Y3RHcm91cENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0l0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1BhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1F1YWxpZmllckZvclNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc1NpemVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllcnNTdHlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzU3VibGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBR0VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5kaWRhdGVPaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJ5LU92ZXJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFubmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaWNhbEFic3RyYWN0U2VydmljZVJlZ2lzdHJ5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhc3NPZkNvbnRyYWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xFSUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZ25pemFuY2VTeW1ib2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGRSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZWROQ0NNQU9yQmFua1NlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXNzaW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvblllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1pdHRlZUZvclVuaWZvcm1TZWN1cml0eUlkZW50aWZpY2F0aW9uUHJvY2VkdXJlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlHcm91cGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9kaXR5TmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uTGFuZ3VhZ2VFcXVpcG1lbnRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55LU93bmVkVW5pdFRyYWluTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55UGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGF0aWJsZUN1dE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGVuc2F0aW9uQWxsb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBlbnNhdGlvblR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25jZXB0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlndXJhdGlvbkl0ZW1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25uZWN0b3JUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QWN0aXZpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJyZWFrZG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDaGFuZ2VBdXRob3JpemF0aW9uVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0b3JFc3RhYmxpc2htZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUcmFuc2ZlclJlYXNvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyaWJ1dGlvblllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50cnlGcm9tV2hpY2hQcm9jdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uRmFtaWx5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cG9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZVJpc2tUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmFnZVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRQcm9jZWR1cmFsVGVybWlub2xvZ3lDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb21wYW55UmVnaXN0cnlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyUHJvdmlkZWRFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFDYXRlZ29yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudE9mRGVmZW5zZUlkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdEl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlRmFtaWx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXZpY2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWFnbm9zaXNDb2RlUG9pbnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGllTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb250aW51ZWRQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudEdyb3VwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2aWRlbmRVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50SWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF3aW5nUmV2aXNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydWdVUENDb25zdW1lclBhY2thZ2VDb2RlMS00LTYtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z1VQQ1NoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi00LTYtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVuQW5kQnJhZHN0cmVldFN0YW5kYXJkUHJvZHVjdEFuZFNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTjItNS01LTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBTi05OUluLVN0b3JlQ291cG9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWRpdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZEl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZC1JdGVtRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZURpc3BsYWNlbWVudElkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZUxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0RhdGFMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvZGVQZXJDT1BBU1N0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRIaWVyYXJjaGljYWxTZXF1ZW5jZUlkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudElkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZlbnRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZWRQYXJ0T3JBc3NlbWJseU9yUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhoaWJpdElkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRMaW5lSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZW5kYWJsZUNvbnRhaW5lcklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlbnNlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFBU2VydmljZUJ1bGxldGluTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNQaWVjZXNQZXJSb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRTdWJhc3NlbWJseU1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRTdWJhc3NlbWJseVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlQWZmb3JkYWJsZUxlbmRpbmdQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFubmllTWFlUHJvamVjdENvbmRvbWluaXVtQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsU3VwcGx5Q2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZnRoV2hlZWxTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsVGVzdExvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsUGhhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaExvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hPckhhbmRTdGFuZGFyZFJlZmVyZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyZVB1bXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UHJpb3JJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtZXJQdWJsaXNoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcm1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWRkaWVNYWNBZmZvcmRhYmxlTGVuZGluZ1Byb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVkZGllTWFjUHJvamVjdENvbmRvbWluaXVtQ2xhc3NpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGUtUmVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbnRBeGxlRHJpdmVuU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udEF4bGVOb25Ecml2ZW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250QXhsZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFRhbmtTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRBYmJyZXZpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRNYW5hZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5kU3ViLUFkdmlzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmRUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQVNGTE9XSW52b2ljZVBvc3RpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQVNGTE9XUHJvZHVjdG9yU2VydmljZUNoYXJnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhdGhlcmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VhclJhdGlvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJpY05hbWVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xpZGVyS2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5EaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYXBoaWNzSW5kdXN0cnlCYXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91bmRTaGFkZVN0YW5kYXJkUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cElEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm91cFF1YWxpZmllckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdUSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhhcm1vbmlzZWRTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhDUENTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISUJDLUhlYWx0aEluZHVzdHJ5QmFyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElCQ1N1cHBsaWVyTGFiZWxpbmdTdGFuZGFyZFByaW1hcnlEYXRhTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSElFQ1Byb2R1Y3RPclNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3RSb2xsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQ0QtOS1DTS1Qcm9jZWR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklnbml0aW9uS2V5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXByaW50LVRyYWRlbWFya0NvZGVPZlN1YnNpZGlhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJ5Q29tbW9kaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25NZWRpYVR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZ3JlZGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZVBsYW5EZXNjcmlwdGlvbkNoYXJhY3RlcmlzdGljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJlcnNGdW5kQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJjaGFuZ2VhYmlsaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpb3JDb2xvck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBcnRpY2xlTnVtYmVyaW5nQXNzb2NpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklDRC05LUNNLURpYWdub3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEhhcm1vbml6ZWRDb21tb2RpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm5hdGlvbmFsU3RhbmRhcmRCb29rTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50RnVuZFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklSU1F1YWxpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU0JOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTWFuYWdlbWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1UeXBlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2JOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvYlNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2ludExpZmVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdXJpc2RpY3Rpb25TcGVjaWZpY1Byb2NlZHVyZUFuZFN1cHBseUNvZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLYW5iYW5QbGFuTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvcmF0b3J5U2FtcGxlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yYXRvcnlUZXN0Q29uZGl0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpYnJhcnlPZkNvbmdyZXNzQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZU9yQW5udWl0eVByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlT3JBbm51aXR5U2VydmljZUZlYXR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZ0R2F0ZVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZU9mQXV0aG9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lT2ZCdXNpbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZFNlcXVlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbGx5QXNzaWduZWRDb250cm9sTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxPSU5DQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90UHJpY2luZ1VuaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW50ZW5hbmNlSW5kZXhQYWdlUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvclByb2R1Y3RPck1hdGVyaWFsT3JNYWNoaW5lVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWFsVHJhbnNtaXNzaW9uU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlcnNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0UHJvZ3JhbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDb250cm9sQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxEaXNjaGFyZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lYXN1cmVtZW50VHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxJbmZvcm1hdGlvbkJ1cmVhdUF1dGhvcml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc0NvdmVyYWdlQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc0xldmVsQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdG9wTG9zc1Byb2R1Y3RMaW5lQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRU1BUHJvZHVjdFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRob2RPZkRlbGl2ZXJ5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsZXN0b25lRXZlbnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGl0YXJ5U3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTFNQRUNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZUNyZWRpdERhdGFPcmRlclR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcnRnYWdlSW5zdXJhbmNlUHJvZHVjdENvZGVPck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VQcm9kdWN0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VVbmRlcndyaXRpbmdUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvclZlaGljbGVJZE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JWZWhpY2xlLUxpbmVEZXNpZ25hdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZlbWVudFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNC00LTJGb3JtYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsRHJ1Z0NvZGU1LTMtMkZvcm1hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxEcnVnQ29kZTUtNC0xRm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbERydWdDb2RlNS00LTJGb3JtYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsSGVhbHRoUmVsYXRlZEl0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZUluNC02Rm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEhlYWx0aFJlbGF0ZWRJdGVtQ29kZUluNS01Rm9ybWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbFByb2R1Y3RHcm91cENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsUmV0YWlsRmVkZXJhdGlvbkNvbG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSZXRhaWxGZWRlcmF0aW9uU2l6ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5EQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3TWljcm9jb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdSZXBsYWNlbWVudFBhcnRPckFzc2VtYmx5RGVmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0SGlnaGVyQXNzZW1ibHlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRIaWdoZXJVc2VkQXNzZW1ibHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmZvcmZlaXR1cmVPcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1SZXNhbGVhYmxlSXRlbUV4Y2x1ZGluZ0RlcG9zaXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5TTi1Ob3J0aEF0bGFudGljVHJlYXR5T3JnYW5pemF0aW9uU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VQkNVQjgyQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5VQkNVQjkyQ29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUG9zaXRpb25zT25NYWNoaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYmxpZ2F0aW9uQXV0aG9yaXR5TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNvbGV0ZVBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRNaWNyb2NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOQ2FzZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9sZFVQQ09yRUFOQ29uc3VtZXJQYWNrYWdlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2xkVVBDT3JFQU5Nb2R1bGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRVUENPckVBTk11bHRpcGFja0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQXNzaWduZWRQcm9wZXJ0eUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHBvc2l0ZS1IYW5kUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbENhYmxlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aWNhbEluZHVzdHJ5UHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRXF1aXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUHJvZHVjdGlvbk9wZXJhdGlvblNoZWV0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0RyYXdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NwZWNpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnREcmF3aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0TnVtYmVyRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRSZWZlcmVuY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdHRlcm5OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBU0NDRUMtR29vZHNBbmRTZXJ2aWNlc1RheEZvcndhcmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ0NFQy1Hb29kc0FuZFNlcnZpY2VzVGF4Tm90QXBwbGljYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQy1Ob25UdWJ1bGFyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFTQ09NQy1Hb29kc0FuZFNlcnZpY2VzVGF4Rm9yd2FyZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVNDT01DLUdvb2RzQW5kU2VydmljZXNUYXhOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1BY2NvdW50YW50c1NvY2lldHlPZkNhbmFkYVR1YnVsYXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaGFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllY2VzSW5Sb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWdneWJhY2tDb21tZXJjaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZVRyYW5zYWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50RXF1aXBtZW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmZXJyZWRNYW51ZmFjdHVyZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZE5hdGlvbmFsU3RvY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcnJlZFBhcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1SYXRlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlbWl1bVVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1NhbXBsZUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUxvb2tVcE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWVDb250cmFjdG9yUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbnRDb2xvclN0YW5kYXJkUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludE9yRHJhd2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc051bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdE9yU2VydmljZUlkZW50aWZpY2F0aW9uTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Q2hhbmdlTm90aWNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0RGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RJZEF0dHJpYnV0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFZlcnNpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyYW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtRGVzY3JpcHRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmFtTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsVmFyaWFudE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlBbmRDYXN1YWx0eVNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGlzaGVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2VPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyY2hhc2Vyc0l0ZW1Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZXJzT3JkZXJMaW5lTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJwb3NlT2ZJbnN1cmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhY2tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGlhdG9yU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZC1Pd25lZFVuaXRUcmFpbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZG9tV2VpZ2h0QWdncmVnYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlRGV0YWlsQ2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVByb3BlcnR5SW5mb3JtYXRpb25TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZUV4dGVuZGVkVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZUZyb250UmVhckRyaXZlblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVNaWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUHVzaGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyQXhsZVJlYXJEcml2ZW5TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlUmVhck5vbkRyaXZlblNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhckF4bGVTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXJBeGxlVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblByb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEtlZXBpbmdPck1vZGVsWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVlZmVyU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJlbmNlT2lsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbmVkUHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0ZWRNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZE1vZGVsVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZFBvbGljeUlkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVZhbHVlVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlnaW91c1JldGFpbE5vbi1Cb29rSXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyRnJvbVByb2R1Y3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJJbmR1Y3Rpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJUYWdOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnROYXRpb25hbFN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudFByb2R1Y3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VtZW50U3ViYXNzZW1ibHlNb2RlbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRTdWJhc3NlbWJseVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzb3VyY2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbFBMVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuYWJsZUNvbnRhaW5lck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbFNlcXVlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSU0tOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQcmVzZW50YXRpb25JRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlbWF0aWNEaWFncmFtUmVmZXJlbmNlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWF0U2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlQbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFByaW9ySWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblByaW50TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJzRGF0ZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNMb3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmlhbEl0ZW1BbmRDb250cmlidXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmllc0lkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VDb2RlUGVyQ09QQVNTdGFuZGFyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbnRyb2xJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUZlYXR1cmVJRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVJlbmRlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnRPclBheW91dE9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGYtTGlmZUFjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWxmLUxpZmVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdFdvcmtlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZVVwT3JTaWRlRG93biIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTS1UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsYWJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWVwZXJCb3hLZXlOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsZWVwZXJCb3hTZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOT01FRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29mdHdhcmVSZXZpc2lvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZEZXBvc2l0Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlT2ZMZWFkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbE1hdGVyaWFsSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTU0NDLTE4QW5kQXBwbGljYXRpb25JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VwT2ZQcm9kdWN0cy1NaXhlZEFzc29ydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkSW5kdXN0cmlhbENsYXNzaWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVMYWJlbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FtcGxlSWRlbnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHlsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VibGluZUl0ZW1OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNpc3RlbmNlSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGVQcm9kdWN0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJ0b3BpY0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJzZWRlZFB1cmNoYXNlT3JkZXJOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyQnJhbmRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllckNvbXBhbnlSZWdpc3RyeU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzQXJ0aWNsZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJzU3VwcGxpZXJBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW50aGV0aWNMdWJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeXN0ZW1JZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUNUQ29tbW9kaXR5Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsTWFudWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2FsUGhhc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVjb21tdW5pY2F0aW9uc0NpcmN1aXRJZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zSW5kdXN0cnlTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbVNlcnZpY2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVJbmR1c3RyeU1hbnVmYWN0dXJlckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RlZE1hdGVyaWFsSWRlbnRpZmljYXRpb25OdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRleCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQcmlvcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVDb21wbGlhbnRUZWNobmljYWxPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3BpY0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZUluSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJDYXNlU2VyaWFsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25TZXJpYWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydEdyb3VwTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhc3VyeU1hbmFnZW1lbnRBc3NvY2lhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXN1cnlNYW5hZ2VtZW50QXNzb2NpYXRpb25TZXJ2aWNlQ29kZUFuZEJhbmtTZXJ2aWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Q29kZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrQm9keVNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZVNlbHZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDQ09yRUFOLTEyOENvdXBvbkV4dGVuZGVkQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVWx0aW1hdGVDdXN0b21lcnNBcnRpY2xlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVTkNDUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZXJ3cml0aW5nTWV0aG9kT2ZEaXJlY3RXcml0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1TdG9ja1N5bWJvbFN5c3RlbUNvZGVOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXZlcnNhbFByb2R1Y3ROdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVOTnVtYmVyRGFuZ2Vyb3VzR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ0Nhc2VDb2RlTnVtYmVyMS0xLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ29uc3VtZXJQYWNrYWdlQ29kZTEtNS01Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENDb25zdW1lclBhY2thZ2VDb2RlMS01LTUtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDQ291cG9uQ29kZTEtNS01LTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ2FzZUNvZGUyLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5Db25zdW1lclBhY2thZ2VDb2RlMi01LTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVQQ09yRUFOQ291cG9uQ29kZTItNS01Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTk1vZHVsZUNvZGUyLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDT3JFQU5NdWx0aXBhY2tDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENPckVBTlNoaXBwaW5nQ29udGFpbmVyQ29kZTEtMi01LTUtMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU2hpcHBpbmdDb250YWluZXJDb2RlMS0yLTUtNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVBDU3VmZml4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVUENTdWZmaXgtRGVmaW5lc1BhY2tpbmdWYXJpYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VyLURlZmluZWRTaGlwcGluZ0NvbnRhaW5lcklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVWTVJQTUxpbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVVk1VTGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVNZWFzdXJlUHJvZHVjdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcnlJdGVtUHJvZHVjdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU1haW50ZW5hbmNlUmVwb3J0aW5nU3RhbmRhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JBbHBoYW51bWVyaWNTaXplQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yQ29sb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckdyb3VuZFNoYWRlSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9ySXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0NhdGFsb2dOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNJdGVtTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzUGFydE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0Jhc2ljVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc0VuZ2luZWVyaW5nQ2hhbmdlTGV2ZWxOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvcnNPcmRlck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yU3BlY2lmaWNhdGlvbk51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVuZG9yc1N0eWxlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JzU3VwcGxlbWVudGFsSXRlbU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmludGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVUeXBlSWRlbnRpZmljYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVVc2FnZUlkZW50aWZpY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FmZXJMb3RJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVlbENoYWlyTGlmdFNlcmlhbE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vbGVuQ3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29sZW5SdW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUYXNrTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVW5pdE51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ybGRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZYXJuQ291bnQtRW5nbGlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50LU1ldHJpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWFybkNvdW50V29yc3RlZCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIgdHlwZT0iTGlzdE9mUHJvZHVjdElkZW50aWZpZXJDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJJdGVtQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkl0ZW1DaGFyYWN0ZXJpc3RpYyIgdHlwZT0iTGlzdE9mSXRlbUNoYXJhY3RlcmlzdGljIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtQ2hhcmFjdGVyaXN0aWMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljQ29kZWQiIHR5cGU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZWQiIHR5cGU9IlN1cmZhY2VMYXllclBvc2l0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3VyZmFjZUxheWVyUG9zaXRpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSXRlbUNoYXJhY3RlcmlzdGljVmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSWRlbnRpZmllciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpYyIgdHlwZT0iSXRlbUNoYXJhY3RlcmlzdGljIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ikl0ZW1DaGFyYWN0ZXJpc3RpY0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsU2VjdG9yaWFsQ2hhcmFjdGVyaXN0aWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xCZXZlcmFnZUNsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGNvaG9sQmV2ZXJhZ2VUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxveSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5hdG9taWNhbE9yaWdpbk9mU2FtcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5UmVxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZU91dEFydGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2lzV2VpZ2h0U2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVoaW5kLXRoZS1Db3VudGVyRHJ1Z3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJldmVyYWdlQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUJyYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNhdGVnb3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZUNvbnRhaW5lckNoYXJhY3RlcmlzdGljcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV2ZXJhZ2VGbGF2b3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXZlcmFnZVNlZ21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdHRvbWhvbGVMb2NhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90dG9taG9sZVByZXNzdXJlTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZEdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuZEdyb3VwLUFHcm91cGluZ09mU2ltaWxhckJyYW5kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVyZWF1b2ZBbGNvaG9sVG9iYWNjb0FuZEZpcmVhcm1zQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJlYXVPZkFsY29ob2xUb2JhY2NvQW5kRmlyZWFybXNUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzQ29sb3JEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzSXRlbVNpemVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaW5nLUxpbmVyLVR1YmluZ1R5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2luZ09yTGluZXJUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mQ29uZm9ybWl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlbWljYWxGYW1pbHlOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGVtaXN0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNJRC1Db21tZXJjaWFsSXRlbURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nT3JQYWludFN5c3RlbUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYXRpbmdPclBhaW50U3lzdGVtTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbk1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xvci1Mb3dlckJvZHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbG9yLVVwcGVyQm9keSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFN0YXR1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uQ2hlbWljYWxOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW55RmllbGRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGlhbmNlTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb3NlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uZWRDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdHJ1Y3Rpb25NZXRob2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWFibGVSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xJdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczNOYXJjb3RpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczNOTm9uLW5hcmNvdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkU3Vic3RhbmNlLUNsYXNzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbGxlZFN1YnN0YW5jZS1DbGFzczUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGVEZXNjcmlwdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3JkaW5hdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Jyb3Npb25SZXNpc3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VwbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFydGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRBcnRpY2xlU3BhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zU3BlY2lmaWNhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZUZhdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbnNpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpbWVuc2lvbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3Rpb25hbEluZGljYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcGVyc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9zYWdlRm9ybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1Z0VmZmljYWN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVnRWZmaWNhY3lTdHVkeUltcGxlbWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEeWVMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR5ZUxvdERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGdlVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZGl0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0cm9uaWNhbGx5Q2xlYW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxlY3Ryb25pY0ZpZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRzLVNsaXR0aW5nLVNwbGl0dGluZy1DdXR0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRUcmVhdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFVzZUFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZXdpdGhUcmFuc21pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5Db21tdW5pdHlSaXNrQ2xhc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhYnJpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFicmljRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVBbmFseXNpc1Byb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRFNQRUMtRmVkZXJhbFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFRC1TVEQtRmVkZXJhbFN0YW5kYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlicmVUb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkQ29kZS1FSUFPckRPRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRUZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxhbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmlzaE9yU3VyZmFjZVJvdWdobmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG93Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbHVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9sZENvbmZpZ3VyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0RGV2aWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JtdWxhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFncmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxQZXJmb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVydGhlcklkZW50aWZ5aW5nQ2hhcmFjdGVyaXN0aWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbE1lcmNoYW5kaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsUHJvZHVjdEZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyaWNEcnVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyYWluRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwZVZhcmlldHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRSYXRpbmdTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWx0aEFuZEJlYXV0eUFpZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYXRUcmVhdE9yQW5uZWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIeWRyYXVsaWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmdyZWRpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsU2FtcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmplY3RhYmxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2V5LVdvcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJEb3VibGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvdXJPdmVydGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZE9yQ29wcGVyU2FtcGxlVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VkUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWl0aW5nT3BlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMdXN0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmVSdW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25ldGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWpvckdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nTWV0aG9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyaW5nUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2V0U2VnbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3RhdHVzLU91dHNpZGVQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lY2hhbmljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxTdXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWV0YWxsb2dyYXBoaWMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTFNQRUMtTWlsaXRhcnlTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVNCTE0tSW5kaWFuTGFuZFByb3BlcnR5T3JVbml0TnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2lzdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGktTWVkaWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11c2ljU3R5bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dHVhbGx5RGVmaW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV3QXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhhemFyZG91c01hdGVyaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tUHJlc2NyaXB0aW9uRHJ1ZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uUmVjdXJyaW5nUmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51dHJpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jzb2xldGVBcnRpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZG9yaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRGlyZWN0UmVzb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyUGh5c2ljYWxEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Zlci10aGUtQ291bnRlckRydWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2VJbnRlZ3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmFtZXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0dGVybiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudGFnZU9mQWxjb2hvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyZm9yYXRpb25Db250aW51aXR5SW5kaWNhdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvbkludGVydmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JhdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1BZXJvc29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQXNEaWx1dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbEZvcm0tQ29uY2VudHJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBoeXNpY2FsRm9ybS1FbXVsc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUdhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLUxpcXVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVBvd2RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVNlbWlzb2xpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxGb3JtLVNvbGlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlQ291cGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lU3RyZWFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVjYXV0aW9uYXJ5SW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25EcnVnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25FZmZlY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlcnZhdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUdyYXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludE9yaWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlTGFiZWxOYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzQWN0aW9uVGFrZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NPclByb2R1Y3Rpb25Vbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0QXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3REYXRhQmFzZU1hbmFnZW1lbnREZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdExpZmVDeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFN1YmplY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsRXZlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsT2ZmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wcmlldGFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVibGljSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1Ymxpc2hlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHVyZUZvcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1dC11cERlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5QXNzdXJhbmNlU3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5LVF1YWxpdHlMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkaW5nTWVkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXJiaXNoZWRBcnRpY2xlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5T3JTdGF0ZURpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWd1bGF0b3J5LVN0YXRlT3JFbnRpdHlDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3RhdGVkQXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVqZWN0aW9uUmVhc29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNlcnZvaXJDb2RlLUNvbXBhbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3VsdHNNZXRob2RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQXJ0aWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZERlc2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVPZkFkbWluaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlHcmFwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjcmV0T3JDb25maWRlbnRpYWxJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblByb2ZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcmllc1RpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRmVhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZi1MaWZlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hlbGZUYWciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nVW5pdENvbXBvbmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvTGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRvU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbGhvdWV0dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVTeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lldHlHb3Zlcm5tZW50QW5kT3JDdXN0b21lclNwZWNpZmljYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2x1YmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVDb250cm9sbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlQW5kRGlzcGxheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RSZXNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViLVByb2R1Y3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VMb2NhdGlvbk1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZVByb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VUcmVhdG1lbnQtQ2hlbWljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VUcmVhdG1lbnQtTWVjaGFuaWNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lub255bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0aW5nQW5kSW5zcGVjdGlvbkFnZW5jaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGFuZWxUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U2FtcGxlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsV2VpZ2h0Rm9ybXVsYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFwZXV0aWNFcXVpdmFsZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhyZXNob2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXRsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVJbnN1cmFuY2VGb3JtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNsYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd2lzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZUFuZE9yUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZWZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR5cGVPZlNhbXBsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHlwZU9mVGVzdC1JbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlU3Bpbm5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvckNvbG9yRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlbmRvclNpemVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmludGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzdWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2xhdGlsZU9yZ2FuaWNDb21wb3VuZENvbnRyb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVRpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eURlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eVR5cGVEZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldheENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGRzT3JTcGxpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxEaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQZXJmb3JhdGlvbkNvbnRpbnVpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlbGxQZXJmb3JhdGlvbkludGVydmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsVGVzdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmRpbmdJbnN0cnVjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbmVGcnVpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2luZUdyb3dpbmdSZWdpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illhcm5Db3VudCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdXJmYWNlTGF5ZXJQb3NpdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPZkNhYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsYXRlcmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9sc3RlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm90aFNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3R0b20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXNpbmdIZWFkRmxhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcm5lckRpYWdvbmFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlRW5kT3ZlcmhhbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd25zdHJlYW1UYXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxGdWVsVGFua1Bvc2l0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZXJpb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb250Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9udFNwYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZUxlZnRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNpZGVSaWdodFJlYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWxseUJ1c2hpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZnRGcm9udCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdFJlYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NDcml0aWNhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vcmVDcml0aWNhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpcGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0UmVsYXRpdmVQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVTaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wcG9zaXRlQ29ybmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUxlZnRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRzaWRlUmlnaHRSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFyU3BhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24xNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24yNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjMyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb24zNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjM4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uMzkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb240NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjQ4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNDkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb241Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb242Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGl2ZVBvc2l0aW9uNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVQb3NpdGlvbjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF0aXZlUG9zaXRpb245Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdGbG9vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0RnJvbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ2h0UmVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZU9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZVR3byIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUVuZE92ZXJoYW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTb2x1YmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGFyZVRpcmVQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcmJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1Y2NvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWItU2VhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQm90dG9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEJ1Y2NhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoRGlzdGFsU3VyZmFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vdGhGYWNpYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aEluY2lzYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aExpbmd1YWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb290aE1lc2lhbFN1cmZhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb3RoT2NjbHVzYWxTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR3b1NpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlckNhYiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pbGF0ZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwc3RyZWFtVGFwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb29kIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbml0T2ZNZWFzdXJlbWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVU9NQ29kZWQiIHR5cGU9IlVPTUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlVPTUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRPZk1lYXN1cmVtZW50IiB0eXBlPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJVT01Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNDYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjYyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjY2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjgwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iODciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijg5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ijk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjFMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMVgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMkgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIySiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMlciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjJYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMloiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjNJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0QSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0RSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0SSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjROIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0TyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0UiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjRVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0VyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1QiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1SSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNUoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1UCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iNVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkExNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBMzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkEzOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE0OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE1NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTU3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTYyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE2NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTY4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBNzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE3OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTc5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTgzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBODciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE4OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTg5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTkwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkE5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQTk3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBOTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUNSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU1QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQU5OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVBaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFSRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkIzOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjQ3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI0OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjU3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI1OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjYxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI2NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjY3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI3NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjc4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCNzkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjg3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCODgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI4OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjkxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQjk3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCOTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkI5OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCRlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkhQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQkxMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJRTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJUVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlVJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQlgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMyNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzMyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDMzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkMzOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM1OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzYzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM2OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzY5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzcwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM3NiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzc3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDNzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzgyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM4NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzg4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDODkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkM5NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQzk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDOTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQ1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDREwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDRUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNFTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0tHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0xGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ01RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNOUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ05UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09VIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1RNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ1dBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDV0kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQxOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDE5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDMzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEMzgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQzOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ0OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ1OCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDYwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ2NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDY5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDcwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3MiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3NSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDc2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJENzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ3OSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDgxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4MyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ4NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDg4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEODkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDkyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkQ5NyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRDk4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEOTkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJESiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRExUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJETiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRQQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFBSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRSTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFJNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRXVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEWk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRaUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkUzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkU5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkYxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZUSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkczIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRzciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHQlEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHR1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0lBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdMRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0xJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR08iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdSTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1JUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR1YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHV0giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkgyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhCWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhHTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhKIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJISyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhMVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE1UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJITiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFRaIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5IIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKRyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSksiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9VIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IksyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSzUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iks2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktCQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktFTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLR00iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktHUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0haIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktKTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktOUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS05UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUEgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktQTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1BQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1NIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS01UIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktVUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ZBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLVlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktWVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktXSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS1dUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTDIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxCVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxLIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFBBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxUTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFRSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMVU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxVWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTFgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik0yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik03Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1BTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQkUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1CRiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUJSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUNVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1HTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1IWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSU4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1JTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUlVIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUxEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1NSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTU1RIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1PTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVBBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUVMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1TSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1USyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVRRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNVFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1UUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1WQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1XSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTVgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNWiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik4yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5BUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5CQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5DTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORVciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5GIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSVUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5KIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk1JIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOTVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5QUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOUSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5STCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5UVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5WIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOWCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9BIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPSE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9OIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPTloiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1oiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9aQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1pJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlAyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlA4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBBTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQR0wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVEQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBUSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBXIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQWSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFoiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlExIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUTYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlE3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUFOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFTIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVREIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRVEkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlFUTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUVRSIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSSyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUk8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSUE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJQUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUlMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSVSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlM3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNBTiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NPIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTQ1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNHIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTUkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNOIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTTyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNTVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUSSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ROIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTViIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNYIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVDciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlQ4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlREIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRMIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRORSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRQUiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRRRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFNIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlUxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlU1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVGIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVSCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVUwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWTFQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlcyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0EiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldCIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXQ0QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFRSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldIIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXSFIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldJIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1RUIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXVyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWDEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IllESyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWURRIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWVJEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZVCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IloyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ilo1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlpQIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEaW1lbnNpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkRpbWVuc2lvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGltZW5zaW9uIiB0eXBlPSJMaXN0T2ZEaW1lbnNpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpbWVuc2lvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRpbWVuc2lvbkNvZGVkIiB0eXBlPSJEaW1lbnNpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEaW1lbnNpb25Db2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaW1lbnNpb24iIHR5cGU9IkRpbWVuc2lvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDpjaG9pY2U+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTWVhc3VyZW1lbnRWYWx1ZSIvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1lYXN1cmVtZW50UmFuZ2UiLz4KKyAgICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZWFzdXJlbWVudCIgdHlwZT0iTWVhc3VyZW1lbnQiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1lYXN1cmVtZW50VmFsdWUiPgorICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWQiIHR5cGU9IlNpZ25pZmljYW5jZUNvZGUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkIiB0eXBlPSJDb25kaXRpb25zQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1lYXN1cmVtZW50VmFsdWUiIHR5cGU9Ik1lYXN1cmVtZW50VmFsdWUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWFsVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJUaGFuT3JFcXVhbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdGVyVGhhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuT3JFcXVhbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFcXVhbFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1ZVZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPYnNlcnZlZFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZlJhbmdlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkNvbmRpdGlvbnNDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hlcmVBaXJFcXVhbHMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUJ1dHlsQWNldGF0ZUVxdWFsczEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlSDJPRXF1YWxzMU9yV2F0ZXJFcXVhbHMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWRUbzYwRGVncmVlc0ZhaHJlbmhlaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldoZXJlVG9sdWVuZUVxdWFsczEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcG9ySW5BaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcG9ySW5PdGhlclRoYW5BaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkVGVtcGVyYXR1cmVBbmRQcmVzc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uc090aGVyVGhhblN0YW5kYXJkVGVtcGVyYXR1cmVBbmRQcmVzc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5FdGh5bEFsY29ob2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluRXRoeWxFdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5XYXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXQxQXRtb3NwaGVyZVByZXNzdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGVyZUV0aGVyRXF1YWxzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVkaWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpci1EcmllZEJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcy1SZWNlaXZlZEJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnlCYXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aWxpYnJpdW1CYXNpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmVBbmRBc2gtRnJlZUJhc2lzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeGlkaXppbmdBdG1vc3BoZXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWR1Y2luZ0F0bW9zcGhlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0Y2hldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJhdGVkVmFwb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY29uZGl0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0LVRlcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWUtV2VpZ2h0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5jb3JyZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZlBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJHYWxsb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZG9taW5hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW5hbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFsRXN0YXRlT3duZWRPckNvcnBvcmF0ZU93bmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZGVkT3JCbG9ja2VkVXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50TGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0V2hlblNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbExpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzUmVwYWlyZWRPckltcHJvdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YW50YW5lb3VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1RvR29vZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9IaWdoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dUb01lZGl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93VG9Nb2RlcmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpdW1Ub0dvb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGl1bVRvSGlnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVyYXRlVG9Hb29kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlcmF0ZVRvSGlnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZXJhdGVUb01lZGl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZFRvSGlnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb2NhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNyZWFzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xpbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9kZWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVhc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck9uLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bW1lck1pZC1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJPZmYtUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyU3VwZXJPbi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJTdXBlck9mZi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJPbi1QZWFrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJNaWQtUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyT2ZmLVBlYWsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpbnRlclN1cGVyT24tUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyU3VwZXJPZmYtUGVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXJOaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXJOaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VtbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaW50ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWstMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVhay0zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWFrLTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3VsZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25UaW1lUmVsYXRlZERlbWFuZCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWVhc3VyZW1lbnRSYW5nZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNaW5pbXVtVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1heGltdW1WYWx1ZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWVhc3VyZW1lbnRSYW5nZSIgdHlwZT0iTWVhc3VyZW1lbnRSYW5nZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWluaW11bVZhbHVlIj4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNaW5pbXVtVmFsdWUiIHR5cGU9Ik1pbmltdW1WYWx1ZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWF4aW11bVZhbHVlIj4KKyAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU2lnbmlmaWNhbmNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkNvbmRpdGlvbnNDb2RlZCIgdHlwZT0iQ29uZGl0aW9uc0NvZGUiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNYXhpbXVtVmFsdWUiIHR5cGU9Ik1heGltdW1WYWx1ZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEaW1lbnNpb25Db2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0TmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0R3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdyb3NzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldE5ldFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZVbml0c1BlclBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF0Q29udGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1Rvbm5hZ2VPZlRoZVZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0VG9ubmFnZU9mVGhlVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIdW1pZGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJDb25zdW1wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdERpc3NpcGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJGbG93Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ja0ltcGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aXZlVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbk9wZXJhdGl2ZVRlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1ZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0Vm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlckNvbnRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbnNpbGVTdHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpYnJvc2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2VMZW5ndGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhZGl1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyYWlnaHRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0T2ZDb252ZXlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlU3VtbWVyRGVhZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZENhcmdvT25WZXNzZWxzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ29udGFpbmVyaXplZENhcmdvT25WZXNzZWxzV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRBc2NlcnRhaW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsT3ZlcmFsbExlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGluZ01ldGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBeGxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnRQb3NpdGlvbkluVGhlTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRQb3NpdGlvbkluVGhlTGVuZ3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVXaWR0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kUG9zaXRpb25JblRoZVdpZHRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFBvc2l0aW9uSW5UaGVUaGlja25lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFBvc2l0aW9uSW5UaGVUaGlja25lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhaW5lckFjdHVhbEZpbGxpbmdXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbnRhaW5lck1heGltdW1DYXBhY2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyZWROZXRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdIZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWNraW5nSGVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZXJyaXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXB1cml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5TaXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW50aGFuaWRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxhc3RpY2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhaW5lZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FsbGl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Ryb250aXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVpcG1lbnRTdG9yYWdlTGltaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVJbmRleE9mVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWRpb2FjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmREcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWZ0ZXJEcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0RXF1aXBtZW50R3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVHJhbnNwb3J0RXF1aXBtZW50R3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjaWRpdHlPZkp1aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5ldHJvbWV0cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cm9mZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1aWNlV2VpZ2h0UGVyMTAwR3JhbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZydWl0U2tpbkNvbG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5nbGVPZkJlbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkSW5jcmVtZW50YWxNZWFzdXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVyb2ZlbEQ1MCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0YWNraW5nV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc01lYXN1cmVDdWJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50YWdlRmF0Q29udGVudEluRHJ5TWF0dGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWNjaGFyb21ldHJpY0NvbnRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhdGVDb250ZW50T2ZBbkFsY29ob2xpY1Byb2R1Y3RBZnRlckJvdHRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbmh5ZHJvdXNDb250ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpZWRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGF0aW51bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lsdmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlV2F0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVyaWNhblBldHJvbGV1bUluc3RpdHV0ZUdyYXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUdyb3NzT2JzZXJ2ZWRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bUdyb3NzU3RhbmRhcmRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVtZVZhcmlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1OZXRTdGFuZGFyZFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxPbi1Cb2FyZFF1YW50aXR5LUFmdGVyRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1Ub3RhbENhbGN1bGF0ZWRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bVRvdGFsT2JzZXJ2ZWRWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubmFnZUdhdWdlRGlzdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldHJvbGV1bU5ldFN0YW5kYXJkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWRpbWVudEFuZFdhdGVySW5QZXRyb2xldW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ic2VydmVkUmVmZXJlbmNlSGVpZ2h0LVRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZUhlaWdodC1UYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbGxhZ2VHYXVnZURpc3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltQ29ycmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm93VG9CcmlkZ2VEaXN0YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpZ2h0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJha2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmVhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdTdHJlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtpbmdTdHJlbmd0aFdldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaXNXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sb3VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250ZW50c09mUGFja2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVyY2lhbFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29yZUxlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25XZWlnaHRBZ3JlZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYW1ldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWx0YVZhbHVlTCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuc2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwdGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdGFuY2VCZXR3ZWVuUG9pbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1Cb3hjYXJEb29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWROZXdXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsb25nYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmljaXRXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGFtZW50Q291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvbmdpdHVkaW5hbEZsYXRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0bmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnN2ZXJzZUZsYXRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc1dlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F1Z2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzV2VpZ2h0LU1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmRuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWlnaHQtTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0RGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBhY3RFbmVyZ3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZURpYW1ldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoLU1heGltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxlbmd0aERpbWVuc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9pc3R1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1XZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbE5ldFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZURpYW1ldGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVTdHJldGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb25uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVIdW1pZGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaXN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvY2t3ZWxsQyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWN0aW9uT2ZBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSdW4tUHJvY2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0aW8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyZVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaWNrbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0UGVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0LVZhbkRvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoLVZhbkRvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXRPZkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZHRoRGltZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWR0aC1NYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFBlclVuaXRPZkxlbmd0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lkZUhlaWdodC1GbGF0QmVkV2l0aFJlbW92YWJsZVNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3F1YXJlbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3Bvb2xTaXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZaWVsZFN0cmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWx1bWluaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnNlbmljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3JvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlzbXV0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyYm9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2x1bWJpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcml1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hsb3JpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvYmFsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hyb21pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXJvblBsdXNTaWxpY29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZXJtYW5pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJvZ2VuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3Rhc3NpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hZ25lc2l1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZ2FuZXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2x5YmRlbnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaXRyb2dlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29kaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaW9iaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOaWNrZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGhvc3Bob3J1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VscGh1ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aW1vbnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVuaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxpY29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxpY2l1bU94eWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFudGFsaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxsdXJpdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpdGFuaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5hZGl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVuZ3N0ZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildhc3RlQ29udGVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmluYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmlyY29uaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yYWdlVGVtcGVyYXR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydFRlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb09wZXJhdGluZ1RlbXBlcmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFbWVyZ2VuY3lUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0Q29udHJvbFRlbXBlcmF0dXJlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJRdWFudGl0eSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eVZhbHVlIi8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHlSYW5nZSIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdE9mTWVhc3VyZW1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5IiB0eXBlPSJRdWFudGl0eSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlWYWx1ZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTaWduaWZpY2FuY2VDb2RlZCIgdHlwZT0iU2lnbmlmaWNhbmNlQ29kZSIgdXNlPSJvcHRpb25hbCIvPgorICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJDb25kaXRpb25zQ29kZWQiIHR5cGU9IkNvbmRpdGlvbnNDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQ29uZGl0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlWYWx1ZSIgdHlwZT0iUXVhbnRpdHlWYWx1ZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlSYW5nZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJNaW5pbXVtVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1heGltdW1WYWx1ZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUXVhbnRpdHlSYW5nZSIgdHlwZT0iUXVhbnRpdHlSYW5nZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUXVhbnRpdHlDb2RlZCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCIgdHlwZT0iTGlzdE9mUXVhbnRpdHlDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlDb2RlZCI+CisgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJRdWFudGl0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZWQiIHR5cGU9IlF1YW50aXR5UXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJRdWFudGl0eVF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlF1YW50aXR5Q29kZWQiIHR5cGU9IlF1YW50aXR5Q29kZWQiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUXVhbnRpdHlRdWFsaWZpZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YWJsZVVuc2VydmljZWFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNQYXlhYmxlQXZlcmFnZU92ZXJkdWVEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50c1BsYWNlZEZvckNvbGxlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVBY2NvdW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1CdXlpbmdQYXJ0eUNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlQ29udHJhY3RzRGVsaW5xdWVudC1Db250cmFjdG9yQ2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVDb250cmFjdHNEZWxpbnF1ZW50LVVua25vd25DYXVzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUluZ3JlZGllbnREb3NlUGVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlSW5ncmVkaWVudERvc2VQZXJVbml0RGlzcGVuc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUJ1eWluZ1BhcnR5Q2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVMaW5lSXRlbXNEZWxpbnF1ZW50LUNvbnRyYWN0b3JDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZlTGlzdGluZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2ZU1haW50ZW5hbmNlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlDb2RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsSG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbFN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsVW5pdHNDdW11bGF0aXZlVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRlZEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpb25hbERlbWFuZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUHJvbW90aW9uU2FsZXNGb3JlY2FzdFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsUmVwbGVuaXNobWVudERlbWFuZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsVXNhZ2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRDb3JyZWN0b3JSZWFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50VG9JbnZlbnRvcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlQXREZWF0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZEFjdGl2ZUxpbmVJdGVtc0RlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlZExpbmVJdGVtc0NvbXBsZXRlZC1Db250cmFjdG9yQ2F1c2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VkTGluZUl0ZW1zRGVsaW5xdWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlSGlnaFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VMb3dWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlTW9kaWZ5aW5nVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU5lYXJlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZU5leHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlT2ZGaW5hbmNpYWxJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdncmVnYXRlQmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsV29ya2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRSYWRpb3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVBdHRlbmRhbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvY2F0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3R0ZWRVc2FnZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFRpbWVCdXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFtb3J0aXNhdGlvblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbW9ydGl6YXRpb25DdW11bGF0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uT3JkZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW1vcnRpemF0aW9uVG90YWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRMZW5ndGhPZlNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT3JPZmZlckR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHByb3ZlZEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwcm94aW1hdGVOdW1iZXJPZkhvbGRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZVbml0c0ZvclNhbGVQcm9qZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJveGltYXRlTnVtYmVyT2ZVbml0c1Byb2plY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJlYURhbWFnZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyZWFPZkxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhUGVyVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycmVzdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzSXNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXRTZWl6ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NvY2lhdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdENvbXBsZXRlVmFyaWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Q29tcGxldGlvblF1YW50aXR5RXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdHRlbmRhbnQtSGFuZGxlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXNlZFNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXplZFJldGVudGlvbkxldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZhaWxhYmxlUmVzb3VyY2VUYXNrUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlTnVtYmVyT2ZFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF4bGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrb3JkZXJMaW5lcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja29yZGVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtSZWplY3RJdGVtQ291bnQuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5UGV0aXRpb25zRmlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGhyb29tQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhdGhyb29tc0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZHJvb21Db3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVkcm9vbXNGaW5pc2hlZEFyZWFBYm92ZUdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWdpbm5pbmdTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGluZ1VuaXRQZXJQcmljaW5nVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsYW5rVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb29kUmVjb3JkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rT3JkZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaExvY2F0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoTG9jYXRpb25zTGVhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcmFuY2hMb2NhdGlvbnNPd25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJhbmNoT2ZmaWNlTG9jYXRpb25zRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm90aGVyc0RlY2Vhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm90aGVyc0xpdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRBdENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRDdW11bGF0aXZlVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWRnZXRlZEhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzRmFpbHVyZUNsYXNzSW5jaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0ZhaWx1cmVJbmR1c3RyeUluY2lkZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NGYWlsdXJlTmF0aW9uYWxBdmVyYWdlSW5jaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5dXBPckJ1eWRvd25SYXRlUGVyQmFzaXNQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnl0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGFsQ2hhbmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWVkUmVnaXN0ZXJlZE51cnNlQW5lc3RoZXRpc3ROdW1iZXJPZkNvbmN1cnJlbnRQcm9jZWR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VzSW5DYXBpdGFsU3RydWN0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVDdWJpY01lYXN1cmVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZURpc3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVMZW5ndGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVOdW1iZXJPZkF4bGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZDb250YWluZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlTnVtYmVyT2ZQYWNrYWdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mUmFpbFdhZ29ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZU51bWJlck9mVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZWFibGVTdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VhYmxlVGFyZVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlYWJsZVdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRyZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpcmN1bGF0aW5nT2lsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGVya3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTdGF0ZW1lbnRCYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zaW5nU3RvY2tCYWxhbmNlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvMkluamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tSW5zdXJlZC1BY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvLUluc3VyZWQtRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsYXRlcmFsUmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXRtZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXR0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaXR5U2VydmljZUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJbmNsdWRlZEluQ29uc29saWRhdGVkRmluYW5jaWFsU3RhdGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wYW5pZXNJbmNsdWRlZEluQ29uc29saWRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFuaWVzSW5TYW1lQWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhcmlzb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGVkQ29udHJhY3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRMaW5lSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlZFByb2plY3RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wb25lbnRNZXRlclJlYWRpbmdDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uY3VycmVudEl0ZW1PdXRwdXRPZlRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkRGlzY291bnRJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVyUmVzZXJ2ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWFuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCdXlkb3duIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEJ1eXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENvbXBsZXRlZERlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RMaW5lSXRlbVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdG9yQXRDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RvckN1bXVsYXRpdmVUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0c0NvbXBsZXRlZERlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0c0NvbXBsZXRlZERlbGlucXVlbnQtVW5rbm93bkNhdXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uVG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsTW9iaWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGlvbnNTZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29wZXJhdGl2ZVNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1NZXRob2RDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0aXZlQWN0aW9uUmVxdWVzdHMtTWV0aG9kRCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGl2ZUFjdGlvblJlcXVlc3RzLU1ldGhvZEUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1WZXJiYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcnJlY3RpdmVBY3Rpb25SZXF1ZXN0cy1Xcml0dGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVyQ2xlcmtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3Vyc2VTZWdtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWQtQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkLUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVCdWRnZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVFYXJuZWRWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZUVmZmVjdE9mUHJpb3JQZXJpb2RBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlR2FzSW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlR2FzVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlTGlxdWlkSW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlT2lsT3JDb25kZW5zYXRlVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbEVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5QWN0dWFsTWVhc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eUFjdHVhbFBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eU9yZGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZEVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UHJlY2VkaW5nUGVyaW9kTWVhc3VyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZFBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVByZWNlZGluZ1BlcmlvZFJlYWNoZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlSZWNlaXZlZEVuZE9mUHJpb3JZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25DcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uUGVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25SZXBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5UmVxdWlyZWRQcmlvclRvVGhlRmlyc3RTY2hlZHVsZWRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2NoZWR1bGVkVXBUb0FjY3VtdWxhdGlvblN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVF1YW50aXR5U2hpcHBlZExvbmctRGlzcG9zaXRpb25DaGFsbGVuZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTaGlwcGVkTG9uZy1EaXNwb3NpdGlvblBlbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRTaG9ydC1EaXNwb3NpdGlvbkNoYWxsZW5nZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVRdWFudGl0eVNoaXBwZWRTaG9ydC1EaXNwb3NpdGlvblBlbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1bXVsYXRpdmVTY2hlZHVsZVZhcmlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlU2NyYXBRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VtdWxhdGl2ZVZhcmlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlV2F0ZXJWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREYXlzT25NYXJrZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZHVjdGlibGVCbG9vZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZhdWx0Tm90aWZpY2F0aW9uUmVzcG9uc2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZ3JlZVNlZ21lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUJhdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUJhdGNoTXVsdGlwbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UXVhbnRpdHlCYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwZW5kZW50Q291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudHNBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGVuZGVudFRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNpZ25FbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0cm95ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0cmltZW50YWxMZWdhbEZpbGluZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsTGVnYWxGaWxpbmdzQWdhaW5zdERpcmVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGltZW5zaW9uYWxTYW1wbGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RTaGlwbWVudFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RXb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNidXJzZW1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZWV0UXVhbnRpdHktUmVqZWN0ZWRNYXRlcmlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY3JldGVRdWFudGl0eS1SZWplY3RlZE1hdGVyaWFsLURpc3Bvc2l0aW9uQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25QZW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjcmV0ZVF1YW50aXR5LVJlamVjdGVkTWF0ZXJpYWwtRGlzcG9zaXRpb25SZXBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcG9zZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2l0aW9uVW5kZXRlcm1pbmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXN0cmlidXRvckludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9tZXN0aWNBZmZpbGlhdGVkQ29tcGFuaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb21lc3RpY1VzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWZ0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdWUtSW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmF0aW9uSW5DdXJyZW50Sm9iIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEd2VsbGluZ0FyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJuZWRWYWx1ZUN1bXVsYXRpdmVUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcm5lZFZhbHVlSG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZUFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxhcHNlZER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJvbmljU2lnbmF0dXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpbWluYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsaW1pbmF0aW9uUGVyaW9kLUFjY2lkZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGltaW5hdGlvblBlcmlvZC1TaWNrbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5TW9kaWZ5aW5nVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkQXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRBdFRoaXNMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWRCeVRoaXNDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZEluVGhpc1Byb2Zlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkT25UaGlzSm9iIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZUF2ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtTm9ub3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc05vdEluY2x1ZGluZ093bmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzTnVtYmVyT2ZEYXlzQXdheUZyb21Xb3JrRHVlVG9Jbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlc051bWJlck9mRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eUR1ZVRvSW5qdXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXMtT3duZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1QYXJ0VGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzLVNhbWVEdXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlcy1TYW1lT2NjdXBhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVzU2hhcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZXNUb3RhbE51bWJlck9mRGF5c0F3YXlGcm9tV29ya0R1ZVRvSWxsbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbEZpcnN0TW9udGhPZlF1YXJ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVG90YWxTZWNvbmRNb250aE9mUXVhcnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVUb3RhbFRoaXJkTW9udGhPZlF1YXJ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZGluZ1N0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmRPZk1vbnRoSW52ZW50b3J5UHJpb3JUb1NoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmVkU3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZ2luZWVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWl0eVNlY3VyaXR5SG9sZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZUF0Q29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQWNjb3VudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFubnVhbFZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEVtcGxveWVlc0F0TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkUmVhZGluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRSZW1haW5pbmdFY29ub21pY0xpZmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFJlbWFpbmluZ1BoeXNpY2FsTGlmZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkVG90YWxFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2YXBvcmF0ZWRXYXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlVXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlY3V0aXZlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhpc3RlbmNlTGltaXRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuZGl0dXJlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkVGVybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFVbnBsYW5uZWREZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5MSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRDbGFpbU1hbmRhdGUtQ2F0ZWdvcnkzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsTWVkaWNhcmVPck1lZGljYWlkQ2xhaW1NYW5kYXRlLUNhdGVnb3J5NCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbE1lZGljYXJlT3JNZWRpY2FpZENsYWltTWFuZGF0ZS1DYXRlZ29yeTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxNZWRpY2FyZU9yTWVkaWNhaWRQYXltZW50TWFuZGF0ZS1DYXRlZ29yeTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxQZW5zaW9uTWFuZGF0ZS1DYXRlZ29yeTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmllbGRXb3JrZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxlU2l6ZUFmdGVyQ29tcHJlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVTaXplQmVmb3JlQ29tcHJlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsRGVsaXZlcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsQ292ZXJhZ2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFuY2lhbEluc3RpdHV0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoT2Zmc2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFF1YXJ0ZXJSZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UXVhcnRlclJlY3VycmluZ09yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhcmVPckZsYXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFQcmVtaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsb29yc09jY3VwaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RBdENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdGVkU2Nhbm5lZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3JlY2FzdFRvQ29tcGxldGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25SZWxhdGVkRW50aXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVtZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvdXJ0aFF1YXJ0ZXJOb24tUmVjdXJyaW5nRGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3VydGhRdWFydGVyTm9uLVJlY3VycmluZ09yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm91cnRoUXVhcnRlclJlY3VycmluZ09yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUZsb2F0LUluQ2FsZW5kYXJVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUZsb2F0VGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVsYW5jZURlYnRDb2xsZWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlbGFuY2VTYWxlc3BlcnNvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVRdWFudGl0eUluY2x1ZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlUXVhbnRpdHlOb3RJbmNsdWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsQ29uc3VtZWRPckJ1cm5lZEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFB1bXBzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsQmF0aHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxHcm91cHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bmN0aW9uYWxTYW1wbGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVybmlzaGVkQmxvb2RVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FyYWdlT3JDYXJwb3J0QXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzSW5qZWN0aW9uVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNMaWZ0Vm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZWNlaXB0Vm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNSZXR1cm5lZFRvRWFydGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1JldHVybmVkVG9Qcm9wZXJ0eUZvckZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1Nocmlua2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvckRyaWxsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNVc2VkRm9yRnVlbFN5c3RlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvclBsYW50RnVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZEZvclJlcHJlc3N1cmluZ09yUHJlc3N1cmVNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVXNlZE9uUHJvcGVydHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdhc1ZlbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FzVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW5lcmFsRWxpbWluYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRSZXBvcnRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhZGVUcmFuc2ZlckFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NBbm51YWxJbmNvbWVNdWx0aXBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0J1aWxkaW5nQXJlYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NFc3RpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NMaXZpbmdBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcm9zc0xpdmluZ0ZpbmlzaGVkQXJlYUFib3ZlR3JhZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUHJvZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZW50TXVsdGlwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZUZlZUJ1eXVwTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlUmF0ZUFmdGVyQWx0ZXJuYXRlUGF5bWVudE1ldGhvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlRmVlUmF0ZUFmdGVyQnV5dXBPckJ1eWRvd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoRmFicmljYXRpb25BdXRob3JpemF0aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hSYXdNYXRlcmlhbEF1dGhvcml6YXRpb25RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZGluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91cnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRPclR5cGVGbHlpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXJzRmxvd24tQWlyY3JhZnRUeXBlT3JMaWZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUFpcmNyYWZ0VHlwZU9yUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLUxpZmV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Vyc0Zsb3duLVR5cGVGbHlpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcGFpcm1lbnREdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wYWlybWVudEZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jcmVtZW50YWxPcmRlclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpcmVjdEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5kdXN0cnlCdXNpbmVzc0ZhaWx1cmVJbmNpZGVuY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvblByb3ZpZGVyU3RhbmRhcmRpemVkTW90b3JWZWhpY2xlUGVuYWx0eVBvaW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWFkaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxlZENhcGFjaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsbWVudEZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRQYXltZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1ZmZpY2llbnRGdW5kc1JldHVybmVkQ2hlcXVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZW5kZWRDaGFuZ2VUaW1lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdEZvck92ZXJkcmF3bkFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyaW1UZXJtUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnRhbmtUcmFuc2ZlckFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5UcmFuc2l0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluLVVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5Q2F0ZWdvcnlUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5RGlzY3JlcGFuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU1vdmVtZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeU9uU2hlbGZXb3JrSW5Qcm9ncmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52ZW50b3J5UXVhbnRpdHlBdFN1cHBsaWVyc05vdFN1YmplY3RUb0luc3BlY3Rpb25CeUN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnlRdWFudGl0eUF0U3VwcGxpZXJzU3ViamVjdFRvSW5zcGVjdGlvbkJ5Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVdpdGhkcmF3YWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9sdmVtZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZWRTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkphaWxTZW50ZW5jZUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRnZW1lbnRzUmVnaXN0ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKdWRpY2lhbFN0YXlEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91ckhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWdUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kSG9sZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFuZFNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0Q3VtdWxhdGl2ZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXdTdWl0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlUGVyaW9kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVuZ3RoT2ZSZXNpZGVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsUmVzb3VyY2UtUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsUmVzb3VyY2VUYXNrUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsc09jY3VwaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlV2l0aGRyYXdhbER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlV2l0aGRyYXdhbHNTZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWVucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbnNSZWdpc3RlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZldGltZUNhcGFjaXR5T2ZUb29saW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlLVRpbWVSZXNlcnZlLUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmZXRpbWVSZXNlcnZlRGF5cy1BcHBsaWVkVG9UaGlzQ2xhaW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZmUtVGltZVJlc2VydmUtRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtQnV5aW5nUGFydHlDYXVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtc0NvbXBsZXRlZERlbGlucXVlbnQtQ29udHJhY3RvckNhdXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1zQ29tcGxldGVkRGVsaW5xdWVudC1Vbmtub3duQ2F1c2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lVGhyZWFkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZEluamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGl2ZXN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblJlcGF5bWVudFRvdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3NzT3JHYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0R2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3N0R29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RPaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvc3RXb3JrVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zdFdvcmtUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3RTaXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWNoaW5lcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZWRVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lUmFkaW9zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXRQcmljZUNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0Y2hpbmdFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsT24tQm9hcmRRdWFudGl0eVByaW9yVG9Mb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtQmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QtQWNjaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kQWNjaWRlbnRUb0FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUJlbmVmaXRQZXJpb2QtU2lja25lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1CZW5lZml0UGVyaW9kU2lja25lc3NUb0FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUNyaW1pbmFsU2VudGVuY2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bURlbGl2ZXJ5QmF0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1Gb3JlY2FzdFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTWF0dXJpdHlFeHRlbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1OdW1iZXJPZkVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bU51bWJlck9mUHVyY2hhc2VPcmRlcnNBbGxvd2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtTnVtYmVyT2ZTaGlwbWVudHNBbGxvd2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtT3JkZXJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVByb2R1Y3Rpb25CYXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVF1YW50aXR5VG9XaGljaFRheFJhdGVBcHBsaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUmVxdWVzdGFibGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVNoaXBRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0YWNrYWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVN0b2NrTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1TdXBwbHlRdWFudGl0eVN1cHBsaWVyRW5kb3JzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1UcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVjaGFuaWNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2F0aW9uRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lbWJlcnNJbkdyb3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVNhbGVzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGxpb25Eb2xsYXJSb3VuZHRhYmxlQ3JlZGl0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUF2ZXJhZ2VUaW1lUmVxdWlyZW1lbnRVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUNvbnRyYWN0UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1DcmltaW5hbFNlbnRlbmNlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1EZWxpdmVyeUJhdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtRW1wbG95ZWVzQXRMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bUZhYnJpY2F0aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Gb3JlY2FzdFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtTnVtYmVyT2ZFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclBhY2thZ2VMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1Qcm9kdWN0aW9uQmF0Y2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1RdWFudGl0eVRvV2hpY2hUYXhSYXRlQXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVJlcXVlc3RhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGlwUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TdG9ja0xldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vYmlsZUxvYWRpbmdBbGxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RlbE9yVGFyZ2V0U3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZVBvb2xDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYXRpb25hbEJ1c2luZXNzRmFpbHVyZUluY2lkZW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0UXVhbnRpdHlEZWNyZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0UXVhbnRpdHlJbmNyZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0VG9QYXlJdGVtQ291bnQuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0RlbGl2ZXJ5UmVxdWlyZW1lbnRJblRoaXNJbnN0cnVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUJpbGxhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbW1pdHRlZEludmVudG9yeU9uU2hlbGYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbmZvcm1hbmNlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Db25zb2xpZGF0ZWRUb3RhbC1Eb21lc3RpY1N1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUNvbnNvbGlkYXRlZFRvdGFsLUZvcmVpZ25TdWJzaWRpYXJpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvdmVyZWQtQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tQ292ZXJlZC1Fc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Eb21lc3RpY1N0b2NraG9sZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZXhjbHVzaXZlVXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLVVuaW9uRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tVXJnZW50RGVsaXZlcnlRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vcm1hbFJlYWRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90UmVwbGFjZWRCbG9vZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1ZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkFjY291bnRzUGFzdER1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBY3RpdmVBY2NvdW50c1RoaXNDeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBZGRlZExvY2F0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBZGp1c3RtZW50UGVyaW9kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZBdHRhY2tzT3JPY2N1cnJlbmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZCYXRjaGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkJvcnJvd2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDYXJkc05vdFJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNhcmRzT3V0c3RhbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ2hlY2tzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkNsYWltYW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDbG9zZWRMb2NhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mQ28tSW5zdXJhbmNlRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDb3BpZXNPZkJpbGxPZkxhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZDcmV3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRheXNDb3ZlcmVkQnlJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRGVhZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZWxpbnF1ZW50SW5zdGFsbG1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkRlbGl2ZXJpZXNQZXJEZXNwYXRjaFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZEZXBlbmRlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkVuZFVzZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkVudGl0bGVkRXhlbXB0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZGYWlsZWRCdXNpbmVzc2VzT2ZEaXJlY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRnJhbmNoaXNlZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mRnVsbC1UaW1lRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkhvc3BpdGFscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJZGVudGljYWxIYW5kbGluZ1VuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkluc3VyZWRMaXZlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJbnRlcmVzdFBheW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZklycmVndWxhckludGVyZXN0UGF5bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mSXRlbXNBdXRob3JpemVkQXRTdG9yZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0F1dGhvcml6ZWRBdFdhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZJdGVtc0luU3RvY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGF0ZUNoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTGV2ZWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZkxpbWl0ZWRQYXJ0bmVyc2hpcFNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZMaXZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTG9hbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTG9zdENhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1lbWJlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTWVzc2FnZVJlY2lwaWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW9udGhzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk1vcnRnYWdvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mTW91bGRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk5vbi1Db3ZlcmVkRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZOb25zdWZmaWNpZW50RnVuZEl0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZW5BY2NvdW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcGVyYXRpbmdQZXJpb2RzQXRGYWlsdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZk9wZXJhdG9yQ3JlZGl0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZPcmlnaW5hbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUGFja2FnZXNJbkhhbmRsaW5nVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQYXNzZW5nZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBhdGllbnRBZG1pc3Npb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBlb3BsZUxpdmluZ0F0UmVzaWRlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlBoeXNpY2lhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUHJvZHVjaW5nV2VsbHNSZW1haW5pbmdPblByb3BlcnR5T3JGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZQcm9kdWNpbmdXZWxsc1JlbWFpbmluZ09uUm95YWx0eUFjY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mUXVhbnRpdGF0aXZlSW5jZW50aXZlU2NoZW1lVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2VydmljZXNPclByb2NlZHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mU2hlbGZGYWNpbmdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlNoZWxmVGFncyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyT2ZTaWduZWRCaWxsc09mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0YXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0b2xlbkNhcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlN0b3BzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRoZWF0cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRpbWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlRpbWVzRGVwb3J0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVHJhbnNwb3J0RG9jdW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZlVuaXRzLUhvdXNpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNJblRoZURlcHRoT2ZBTGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5pdHNJblRoZVdpZHRoT2ZBTGF5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51bWJlck9mVW5zaWduZWRCaWxsc09mTGFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdW1iZXJPZldpdGhob2xkaW5nRXhlbXB0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyc09mQ29uc3VtZXJVbml0c0luVGhlVHJhZGVkVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVtYmVyV2Vla3NQYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOdXJzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9lbUludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlU2l6ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNlV29ya2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmTGVhc2VGdWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZQcmVtaXNlU2FsZXNRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmUHJlbWlzZXNTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsQ29uZGVuc2F0ZVNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbENvbmRlbnNhdGVVc2VkT25Qcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2lsT3JDb25kZW5zYXRlVm9sdW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxTZWRpbWVudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPaWxUaGVmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25IYW5kQW5kRHVlLUluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhvbGRGb3JTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25PcmRlclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblByZW1pc2VTYWxlc1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPblByZW1pc2VzU2FsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5pbmdTdGF0ZW1lbnRCYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuaW5nU3RvY2tCYWxhbmNlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nQmVkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0aW5nRGl2aXNpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRpbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlcmF0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVyYXRvcnNXb3JraW5nSW50ZXJlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltYWxRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0R1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlckNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlcmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyUXVhbnRpdHlNdWx0aXBsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsTG9hblRlcm0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUGF5bWVudEl0ZW1Db3VudC4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsVGVybUluWWVhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckdhc0Rpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckluamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJNaXNjZWxsYW5lb3VzRGlzcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyT2lsQ29uZGVuc2F0ZURpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkUGFydGljaXBhbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkU3RvY2tob2xkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlcldhclJlc2VydmVNYXRlcmlhbFJlcXVpcmVtZW50c1Byb3RlY3RhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyV2F0ZXJEaXNwb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0bGllckRheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mSW52ZW50b3J5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHN0YW5kaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHN0YW5kaW5nU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXQtVHVybmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJmbG93UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzRXF1aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBDaGFuZ2VBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik93bmVyc2hpcER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25lcnNoaXBQZXJjZW50YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPd25PY2N1cGF0aW9uUXVhbGlmaWNhdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFnZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluQ29tbW9uU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluUHJlZmVycmVkU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLUluU2VjdXJpdHlTaGFyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcmtpbmdTcGFjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxCYXRocyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhbnRUb3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGljaXBhdGlvblNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydG5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRUaW1lRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXN0RHVlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q2FuY2VsbGF0aW9uSXRlbUNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RHVyYXRpb25XZWVrcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudEV4cGVyaWVuY2VzSW5UaGVMYXN0MTJNb250aHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRFeHBlcmllbmNlc0luVGhlTGFzdDNNb250aHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRGcmVxdWVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRPcmRlcnNGaWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudHNOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRhZ2VPZk9yZGVyZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kaWNDYXBhY2l0eU9mVG9vbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZFbXBsb3ltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eU1lYXN1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RRdWFudGl0eVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZFF1YW50aXR5UmVhY2hlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyc2lzdGVuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBldGl0aW9uc0ZpbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNhbFN0YXR1c0lpaSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNJdiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGh5c2ljYWxTdGF0dXNWIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaHlzaWNpYW5zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWN0dXJlQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZWNlc0RlbGl2ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsZmVyYWdlR29vZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpbG90cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlwZWxpbmVBZGp1c3RtZW50T3JBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXR0ZWRXYXRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50UGVyaW9kRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbm5lZFVuaXREZXZlbG9wbWVudFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFudFNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50V29ya2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhdGZvcm1Db3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydGFibGVSYWRpb3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRlZFRlbGVwaG9uZUxpbmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LU9wRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG91bHRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZG9taW5hdGVBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1PcERheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRRdWFudGl0eU5vdFNoaXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRRdWFudGl0eVNoaXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Qcm9kdWN0aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRG9zYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzY3JpcHRpb25FZmZlY3RpdmVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2lkZW50aWFsVm90ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNzdXJlQmFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCZW5lZml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNDdW11bGF0aXZlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSGlnaGVzdEN1bXVsYXRpdmVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNseUFtb3J0aXNlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01vbnRoc1VzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c051bWJlck9mQWNjb3VudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZCcmFuY2hMb2NhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzTnVtYmVyT2ZFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzT3JkZXJRdWFudGl0eVRvQmVDYW5jZWxsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzV2Vla1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUJyZWFrRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1RvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljaW5nVW5pdFBlckJpbGxpbmdVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5TWFuYWdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlNZXRlclJlYWRpbmdWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeU5ldFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxzSW5jbHVkZWRBc0VtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JDdW11bGF0aXZlSW1iYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvclVuaXRzQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2JhdGlvbkR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNpbmdXZWxscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEV4Y2hhbmdlQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uUmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uV29ya2VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdFNhbGVzQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzaW9uYWxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9mZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RlZEF2YWlsYWJsZUludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdFBoYXNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdHNJblByb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2plY3RVbml0c1NvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Rlc3RlZEJpbGxzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvblR1cm5TaXplIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9mUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmaWNhdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGlmeWluZ1dlZWtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFsaXR5Q29udHJvbEZhaWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUNvbnRyb2xIZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0YXRpdmVJbmNlbnRpdmVTY2hlbWVCYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUFkdmlzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXBwcm92ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXQxMDBQY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QXZhaWxhYmxlRm9yUmV0dXJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF2YWlsYWJsZUZvclNhbGUtU3RvY2tRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlBdmFpbGFibGVPblNoZWxmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUF3YWl0aW5nRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5QnlQb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlDYW5jZWxsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Q2FycmllZEZvcndhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGVmZXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5RGVsaXZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc2FwcHJvdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eURpc3BlbnNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNwbGF5ZWROb3RBdmFpbGFibGVGb3JTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUVhcm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlIZWxkQnlEZWxpdmVyeVZlaGljbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5TG9naXN0aWNTZXJ2aWNlUHJvdmlkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SGVsZEJ5UmV0YWlsT3V0bGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluRmxvYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5Ib2xkT3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUluTWFudWZhY3R1cmluZ1Byb2Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5QaHlzaWNhbEludmVudG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlJblF1YXJhbnRpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5SW5UcmFuc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eUxhbmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlMb2FkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5TWFuaWZlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlOb3RBdmFpbGFibGVGb3JEZXNwYXRjaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlPZkRlYWxlckxpY2Vuc2VQbGF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T2ZNYXRlcmlhbEluT3JkZXJlZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5T25IYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eU9uSG9sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJOZXh0SGlnaGVyQXNzZW1ibHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UGVyUGFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlQZXJTa2lkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVBlclVuaXRPZklzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlbWFpbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlSZXF1aXJlbWVudEZvck1haW50ZW5hbmNlQW5kUmVwYWlyT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5UmVxdWlyZW1lbnRGb3JTYW1wbGVJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJlcXVpcmluZ01hbmlwdWxhdGlvbkJlZm9yZURlc3BhdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVJldHVybmVkRGVmZWN0aXZlT3JEYW1hZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTZXJ2aWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVNvbGROZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5U3VzcGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFudGl0eVRvQmVEZWxpdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5VXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlXaXRoZHJhd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5V2l0aGhlbGRCeU93bmVyT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGVRdWFudGl0eU9uSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZUF2ZXJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFuZ2VNaW5pbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUGVyRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXB0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWRBbmRBY2NlcHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZWROb3RBY2NlcHRlZFRvQmVEZXN0cm95ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkTm90QWNjZXB0ZWRUb0JlUmV0dXJuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tbWVuZGVkTWFpbnRlbmFuY2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb21tZW5kZWRPdmVyaGF1bEFuZFJlcGFpclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZGVyYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnlBZnRlclBvc3RQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZpbGxzQXV0aG9yaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZEJyYW5kc0Rpc3RyaWJ1dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RlcmVkQnJhbmRzTWFudWZhY3R1cmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZFJldHVyblF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGVkQnVzaW5lc3NFbnRpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRlZEVudGl0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxhdGlvbnNoaXBEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsYXRpdmVzRW1wbG95ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ0F1dGhvcml6ZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtYWluaW5nRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbmluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW9yZGVyaW5nTGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlb3JkZXJQb2ludFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZWRCbG9vZFVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsZW5pc2htZW50T3ZlcnJpZGVRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGVuaXNobWVudFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnREaWZmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlZERlZmljaWVuY2llcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlbWVudFF1YW50aXR5VGhhdFdhc1ByZXZpb3VzbHlSZWxlYXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlzaXRpb25pbmdPYmplY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHlDdXN0b21lckRpcmVjdERlbGl2ZXJ5U2FsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmVkUXVhbnRpdHlSZXRhaWxTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbmNlRHVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc291cmNlLVF1YW50aXR5LUF2YWlsYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdGluZ1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGlvbkR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRhaWxTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0ZW50aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkQnlDb25zdW1lclF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuc1JlcGxhY2VtZW50UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21Db3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9vbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvb21zRmluaXNoZWRBcmVhQWJvdmVHcmFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FmZXR5TGV2ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzcGVyc29ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNRdWFudGl0eU5vdEluY2x1ZGVkSW5UaGVSZXBsZW5pc2htZW50Q2FsY3VsYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVzUXVhbnRpdHlQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYXR0ZXJlZFZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZVZhcmlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcEFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjcmFwUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRhcnlOZXRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFF1YXJ0ZXJOb24tUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyUmVjdXJyaW5nRGVtYW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNyZXRhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJlZENoYXJnZXNSZWdpc3RlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN1cml0aWVzU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWhvbGRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlaG9sZGVyc0hvbGRpbmdSZW1haW5kZXJPZlNoYXJlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNBZGRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzRGVsZXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzSGVsZEFzVHJlYXN1cnlTdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT2ZDb21tb25TdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT2ZQcmVmZXJyZWRTdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVzT3duZWRCeUluLVN0YXRlUmVzaWRlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNPd25lZEJ5T3V0LU9mLVN0YXRlUmVzaWRlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNTdWJzY3JpYmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZXNTdWJzY3JpYmVkQnV0Tm90SXNzdWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdGljZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNob3J0YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydC1MYW5kZWRHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWxlbnRQYXJ0bmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luY2VMYXN0VHJhdmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVEZWxpdmVyeVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaXN0ZXJzRGVjZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpc3RlcnNMaXZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpemVPZkhvdXNlaG9sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2tpbGxlZFdvcmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxCdXNpbmVzc1VzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29ydGVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvcnRlZFF1YW50aXR5UmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwYWNlT2NjdXBpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQYXJ0bmVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlZWRDYXBhY2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0T2Zmc2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2VNb3RvclZlaGljbGVQZW5hbHR5UG9pbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFNhbGVzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrVHJhbnNmZXJzSW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b2NrVHJhbnNmZXJzT3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9sZW5DaGVxdWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yQXRDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3ViY29udHJhY3RvckN1bXVsYXRpdmVUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZWRRdWFudGl0eVJldHVybmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0ZWRRdWFudGl0eVNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnREZWxpdmVyeVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzaWRpYXJpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnN0aXR1dGlvbmFsUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1aXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnZpc29ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXJFc3RpbWF0ZWRMYXRlc3RNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyRXN0aW1hdGVkUHJldmlvdXNNZXRlclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyTGF0ZXN0TWV0ZXJSZWFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllclByZXZpb3VzTWV0ZXJSZWFkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyc0NyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VycGx1c0dvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXlzSW5BdmVyYWdlUmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dhbi1HYW56Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWJsZXNBdmFpbGFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbGtQYXRocyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFyaWZmTG9zc0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4YWJsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFjaGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVjaG5pY2lhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoZW9yZXRpY2FsUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlck5vbi1SZWN1cnJpbmdEZW1hbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlck5vbi1SZWN1cnJpbmdPcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUXVhcnRlclJlY3VycmluZ0RlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRRdWFydGVyUmVjdXJyaW5nT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lRXhwZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVGcmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUluUG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUhvc3BpdGFsaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVNpbmNlTGFzdEFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0Q2l2aWxpYW5GbGlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZUxhc3RJbnN1cmFuY2VNZWRpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VMYXN0TWlsaXRhcnlGbGlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU1lZGljYWxDb25zdWx0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2F0aW9uRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VNZWRpY2F0aW9uU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVTaW5jZU9uc2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VTdXJnZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lU2luY2VUcmlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVVbml0c0tub3duIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lVW5pdHNQZXJTaGlmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVVuaXRzU3BlbnRPbkR1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb0NvbXBsZXRlUXVhbnRpdHlFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbGVyYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQWRqdXN0bWVudHNWb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQW1vcnRpc2F0aW9uUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXRDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxBdXRob3JpemVkUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQmVnaW5uaW5nSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc0Fzc29jaWF0ZWRXaXRoUmVwZWF0ZWRUcmF1bWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aERpc29yZGVyc0R1ZVRvUGh5c2ljYWxBZ2VudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aER1c3REaXNlYXNlc09mVGhlTHVuZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ2xhaW1zV2l0aG91dERheXNBd2F5RnJvbVdvcmtBbmRXaXRob3V0UmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDbGFpbXNXaXRoUG9pc29uaW5nSWxsbmVzc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhSZXNwaXJhdG9yeUNvbmRpdGlvbnNEdWVUb1RveGljQWdlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENsYWltc1dpdGhTa2luRGlzZWFzZXNPckRpc29yZGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWREb21lc3RpY1N1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDb25zb2xpZGF0ZWRGb3JlaWduU3Vic2lkaWFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENvbnNvbGlkYXRlZFN1YnNpZGlhcmllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbENyZWRpdHNBY2NlcHRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxDcmVkaXRzUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQ3JlZGl0c1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNBd2F5RnJvbVdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c0F3YXlGcm9tV29ya0R1ZVRvSWxsbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzQXdheUZyb21Xb3JrRHVlVG9Jbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGF5c09mUmVzdHJpY3RlZFdvcmtBY3Rpdml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzT2ZSZXN0cmljdGVkV29ya0FjdGl2aXR5RHVlVG9JbGxuZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERheXNPbk1hcmtldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEYXlzV2l0aFJlc3RyaWN0ZWRXb3JrQWN0aXZpdHlEdWVUb0luanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aENsYWltcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxEZWF0aHNBc0FSZXN1bHRPZklsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVhdGhzQXNBUmVzdWx0T2ZJbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGViaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c0FjY2VwdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c1JlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlYml0c1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbGl2ZXJ5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRGVtYW5kT3JkZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbERlbWFuZFF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxFbmRpbmdJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRmxvYXRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdhc0Rpc3Bvc2l0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEdhc0luamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbGxuZXNzQ2xhaW1zV2l0aERheXNBd2F5RnJvbVdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSWxsbmVzc0NsYWltc1dpdGhPY2N1cGF0aW9uYWxJbGxuZXNzZXNOb3RPdGhlcndpc2VDbGFzc2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NDbGFpbXNXaXRob3V0TG9zdFdvcmtEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbElsbG5lc3NXaXRoTG9zdFdvcmtEYXlzT3JSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhEYXlzQXdheUZyb21Xb3JrT3JSZXN0cmljdGVkV29ya0FjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEluanVyeUNsYWltc1dpdGhvdXRMb3N0V29ya0RheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsSW52ZW50b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE5vbi1Db25zb2xpZGF0ZWRTdWJzaWRpYXJpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZDb252aWN0aW9ucyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkRvbWVzdGljU3Vic2lkaWFyaWVzSW5jbHVkZWRJbkZpbmFuY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkRvbWVzdGljU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZkZvcmVpZ25TdWJzaWRpYXJpZXNJbmNsdWRlZEluRmluYW5jaWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mRm9yZWlnblN1YnNpZGlhcmllc05vdEluY2x1ZGVkSW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZMb2FuRGV0YWlsUmVjb3JkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZk1vcnRnYWdlZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZQYXJraW5nU3BhY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mU3Vic2lkaWFyaWVzTm90SW5jbHVkZWRJblRoZUZpbmFuY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZlVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mVW5pdHNGb3JTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE51bWJlck9mV29ya2Vyc0NvbXBlbnNhdGlvbkNvbWJpbmVkUmVwb3J0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxOdW1iZXJPZldvcmtlcnNDb21wZW5zYXRpb25GaXJzdFJlcG9ydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTnVtYmVyT2ZXb3JrZXJzQ29tcGVuc2F0aW9uU3Vic2VxdWVudFJlcG9ydHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZJc3N1YWJsZUFzc2V0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPaWxBbmRPckNvbmRlbnNhdGVEaXNwb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPaWxBbmRPckNvbmRlbnNhdGVJbmplY3Rpb25Wb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXJQcm9wZXJ0aWVzT3duZWRBbmRGaW5hbmNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQYXltZW50c1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc0FjY2VwdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc1JlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFBvc3QtQWR2aWNlc1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZS1BZHZpY2VzQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlLUFkdmljZXNSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmUtQWR2aWNlc1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByZW5vdGVzQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJlbm90ZXNSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxQcmVub3Rlc1JlamVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFByb2R1Y3Rpb25Wb2x1bWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsUHJvcGVydGllc093bmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFF1YW50aXR5UGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxSZXNvdXJjZS1RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxSb29tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTYWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTZXJ2aWNlQmFja29yZGVyUXVhbnRpdHlIaWdoUHJpb3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2VydmljZUJhY2tvcmRlclF1YW50aXR5TG93UHJpb3JpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsU2hhcmVzT2ZTdG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTeXN0ZW1CYWNrb3JkZXJRdWFudGl0eUhpZ2hQcmlvcml0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTeXN0ZW1CYWNrb3JkZXJRdWFudGl0eUxvd1ByaW9yaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbFRvRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxUcmFuc2FjdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsVW5pZGVudGlmaWVkVHJhbnNhY3Rpb25zUmVqZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsV2F0ZXJEaXNwb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXYXRlckluamVjdGlvblZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXb3JrZWRCeUFsbEVtcGxveWVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxXb3JraW5nSW50ZXJlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlbWFya1JlcHJlc2VudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFkZW1hcmtzVXNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5lZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvblNldHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVycmVkSW5RdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWRPdXRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhdmVsRnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxsaW5nRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmF2ZWxQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaXBEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpcHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydW5rZWRDaGFubmVscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hY2tub3dsZWRnZWRRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hZGp1c3RlZENvcnJlY3RvclJlYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuY292ZXJlZENoZXF1ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uRW1wbG95ZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNDb21wbGV0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzRm9yU2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdHNQZXJVbml0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUHJvZHVjZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzUmVudGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZExhc3REYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0c1dvcmtlZFBlclF1YXJ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRzV29ya2VkUGVyV2VlayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5wYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNhbGVhYmxlUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc29sZFF1YW50aXR5SGVsZEJ5V2hvbGVzYWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW50aWxOZXh0VHJhdmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnVzYWJsZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnVzZWRBY2N1bXVsYXRlZFNpY2tEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnZlcmlmaWVkUmVjZWlwdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVyZ2VudERlbGl2ZXJ5UXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mRXh0cmFjb3Jwb3JlYWxDaXJjdWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlT2ZIeXBlcmJhcmljUHJlc3N1cml6YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZU9mSHlwZXJ0ZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cG90ZW5zaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2VPZkh5cG90aGVybWlhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWNhbmNpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYW5jZUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljdWxhclJhZGlvcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpZWRSZWNlaXB0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzaXRhdGlvbkZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmlzaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2ljZVN0b3JhZ2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9pZFZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bWVTaHJpbmthZ2VBZGp1c3RtZW50T3JBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb3RpbmdTaGFyZXNIZWxkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VFbXBsb3llZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZVNpemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyUmUtSW5qZWN0ZWRPblByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlclZvbHVtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2Vla3NXb3JrZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VpZ2h0Q2hhbmdlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRHYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRMb3NzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVyVG9XaG9sZXNhbGVyU2FsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldpZGVBcmVhVGVsZXBob25lU2VydmljZVBlcjgwMFNlcnZpY2VVbml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya0NhbGVuZGFyVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrSW5Qcm9jZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGltZVVuaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVGltZVVuaXRzUGVyU2hpZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc0luU2Nob29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyc0luVGhpc0xpbmVPZldvcmtPclByb2Zlc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzT25Kb2IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlllYXJzUmVtYWluaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZXNWb3RlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50SW52ZW50b3J5UXVhbnRpdHlBdmFpbGFibGVGb3JTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFBlcmlvZEltYmFsYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNlcnZpY2VMaWZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50U2hhcmVCYWxhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckVzdGltYXRlZExhdGVzdE1ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFc3RpbWF0ZWRQcmV2aW91c01ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJSZWFkaW5nUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5QWRqdXN0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhaWx5QXZlcmFnZVF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYWlseVdvcmtTaGlmdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVN0b3JhZ2VRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF5c09wZXJhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlzUHJvZHVjZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNTdXBwbHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYmVudHVyZUJvbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYmVudHVyZXNGaWxlZEFnYWluc3REaXJlY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYml0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRDb2xsZWN0b3JzIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250cmFjdEl0ZW0iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkNvbnRyYWN0SXRlbSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29udHJhY3RJdGVtIiB0eXBlPSJMaXN0T2ZDb250cmFjdEl0ZW0iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0SXRlbSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDb250cmFjdCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RJdGVtTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW0iIHR5cGU9IkNvbnRyYWN0SXRlbSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3QiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ29udHJhY3RJRCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDb250cmFjdFR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVmFsaWRpdHlEYXRlcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3lzdGVtSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbnRyYWN0IiB0eXBlPSJDb250cmFjdCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udHJhY3RUeXBlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb250cmFjdFR5cGVDb2RlZCIgdHlwZT0iQ29udHJhY3RUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJhY3RUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29udHJhY3RUeXBlIiB0eXBlPSJDb250cmFjdFR5cGUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ29udHJhY3RUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpYWdub3Npc1JlbGF0ZWRHcm91cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyRGllbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVQZXJEaWVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRHcm93aW5nRXF1aXR5TW9ydGdhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFudGljaXBhdGVkQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5QWRqdXN0YWJsZVJhdGVNb3J0Z2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEhvdXNpbmdBdXRob3JpdHlWZXRlcmFuc0FmZmFpcnNGaXhlZFJhdGVNb3J0Z2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsU2Vjb25kTW9ydGdhZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZW50aW9uYWxGaXhlZFJhdGVNb3J0Z2FnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIb3VzaW5nQXV0aG9yaXR5VmV0ZXJhbnNBZmZhaXJzR3JhZHVhdGVkUGF5bWVudE1vcnRnYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZWdvdGlhdGVkQ29udmVudGlvbmFsR3JhZHVhdGVkUGF5bWVudE9yU3RlcFJhdGVNb3J0Z2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVudGlvbmFsQWRqdXN0YWJsZVJhdGVNb3J0Z2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNJbmNlbnRpdmVGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RTaGFyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UGx1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNBd2FyZEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdFBsdXNGaXhlZEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZUFnZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjbHVzaXZlUmlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcm1vckFjdHVhbENvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlSW5jZW50aXZlRmlybVRhcmdldFdpdGhQZXJmb3JtYW5jZUluY2VudGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZUZpcm1UYXJnZXRXaXRob3V0UGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VSZWRldGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2V3aXRoRXNjYWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWRQcmljZUluY2VudGl2ZVN1Y2Nlc3NpdmVUYXJnZXRXaXRoUGVyZm9ybWFuY2VJbmNlbnRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmVTdWNjZXNzaXZlVGFyZ2V0V2l0aG91dFBlcmZvcm1hbmNlSW5jZW50aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFByaWNlQXdhcmRGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VJbmNlbnRpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2VMZXZlbG9mRWZmb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0Nvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJvYWN0aXZlRml4ZWRQcmljZVJlZGV0ZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlybUZpeGVkUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUHJpY2V3aXRoRWNvbm9taWNQcmljZUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXZlbG9mRWZmb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckhvdXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckNvbnRyYWN0VHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvc3BlY3RSZXNlcnZhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZVBlcmNlbnRhZ2Vhc0ZpbG1SZW50YWxFYXJuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpbWVhbmRNYXRlcmlhbHMiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlZhbGlkaXR5RGF0ZXMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlN0YXJ0RGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRW5kRGF0ZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZGl0eURhdGVzIiB0eXBlPSJWYWxpZGl0eURhdGVzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25kaXRpb25zT2ZTYWxlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJTYWxlc1JlcXVpcmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTYWxlc0FjdGlvbkNvZGVkIiB0eXBlPSJTYWxlc0FjdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzQWN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNBY3Rpb25WYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29uZGl0aW9uc09mU2FsZSIgdHlwZT0iQ29uZGl0aW9uc09mU2FsZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2FsZXNSZXF1aXJlbWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGVkIiB0eXBlPSJTYWxlc1JlcXVpcmVtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlNhbGVzUmVxdWlyZW1lbnQiIHR5cGU9IlNhbGVzUmVxdWlyZW1lbnQiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2FsZXNSZXF1aXJlbWVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRRdWFudGl0eVRvTWFrZU1pbmltdW1XZWlnaHRSZXF1aXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVySWZJdGVtc0FyZU91dE9mU3RvY2tPck5vdFlldFB1Ymxpc2hlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVySWZPdXRPZlN0b2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJPbmx5SWZOZXdJdGVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRHdWFyYW50ZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbWJpbmVkU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NBbmRMYWJvclN1cnBsdXNBcmVhU2V0LUFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RQcmVzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbFByb2R1Y3RBbGxvd2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdWRlSW1wb3J0UXVvdGFJbkZpcnN0Q29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjdG9yeVNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZWRTYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNsdWRlSW1wb3J0UXVvdGFJbkZpcnN0Q29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdXJwbHVzQXJlYVNldC1Bc2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFyZ2VQdXJjaGFzZVNldC1Bc2lkZUZvclNtYWxsQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heVByZXNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bHRpLXllYXJBd2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9CYWNrT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vU3Vic3RpdHV0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeVByaW9yVG9TaGlwbWVudElmUXVhbnRpdHlTcGVjaWZpZWRJc05vdEF2YWlsYWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25RdWFsaWZpZWRCaWRkZXJzTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25RdWFsaWZpZWRNYW51ZmFjdHVyZXJzTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJVbmxpc3RlZFNhbGVzQ29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWFsTGFib3JTdXJwbHVzQXJlYVNldEFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9BcHByb3ZlZFNvdXJjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0VkdWNhdGlvbmFsSW5zdGl0dXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9IaXN0b3JpY2FsbHlCbGFja0NvbGxlZ2VPclVuaXZlcnNpdHlPck1pbm9yaXR5SW5zdGl0dXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb0luZHVzdHJpYWxQcmVwYXJlZG5lc3NQcm9ncmFtUGFydGljaXBhbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXN0cmljdGVkVG9RdWFsaWZpZWRQcm9kdWN0c0xpc3RQcm9kdWN0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZFRvVVNBbmRDYW5hZGlhblNvdXJjZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RyaWN0ZWRUb1lvdW5nSW52ZXN0aWdhdG9yUHJvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvbjhhU2V0LUFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXQtYXNpZGVGb3JBbWVyaWNhbkluZGlhbi1vd25lZEJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwQXNTb29uQXNQb3NzaWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRnVsbFRydWNrT25seSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcEluLVBsYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbC1CYWxhbmNlQmFja09yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEJhbGFuY2VDYW5jZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQmFsYW5jZVN1YnN0aXR1dGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsQ2FybG9hZExvdHNPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGFydGlhbEl0ZW1RdHlQcm9wb3J0aW9uYWxUb1RvdGFsT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQYXJ0aWFsVHJ1Y2tsb2FkTG90c09ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBQZXJSZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyUmVsZWFzZW9yQnV5ZXJBdXRob3JpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwUGVyU2NoZWR1bGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsQnVzaW5lc3NXaXRoU21hbGxEaXNhZHZhbnRhZ2VkQnVzaW5lc3NDb25zaWRlcmF0aW9uU2V0LUFzaWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbERpc2FkdmFudGFnZWRCdXNpbmVzc1NldC1Bc2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU21hbGxQdXJjaGFzZVNldEFzaWRlRm9yU21hbGxCdXNpbmVzc2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFJlbWFpbmluZ0JhbGFuY2VDYW5jZWxsYXRpb25BbGxvd2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbWFsbFJlbWFpbmluZ0JhbGFuY2VDYW5jZWxsYXRpb25Ob3RBbGxvd2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJzdGl0dXRlSXRlbUFsbG93ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVucmVzdHJpY3RlZFByb2N1cmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJlaG91c2VTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJyYW50eSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTYWxlc0FjdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxCYWxhbmNlVGhhdEV4Y2VlZHNTYWxlc0FjdGlvblZhbHVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsRW50aXJlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlZCIgdHlwZT0iSGF6YXJkQ2xhc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRDbGFzc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mUmVmZXJlbmNlQ29kZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzQ29udGFjdCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkNvbnRhY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkTm90ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVU5ER051bSIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iSGF6YXJkb3VzU2hpcG1lbnRJbmZvcm1hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRU1TTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNZmFnIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXMiIHR5cGU9IkhhemFyZG91cyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IkhhemFyZG91c0lkZW50aWZpZXJzIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZIYXphcmRvdXNJZGVudGlmaWVycyIgdHlwZT0iTGlzdE9mSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c0lkZW50aWZpZXJzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNSZWd1bGF0aW9uc0NvZGVkIiB0eXBlPSJBZ2VuY3lDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNSZWd1bGF0aW9uc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZENvZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVFeHRlbnNpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNvZGVWZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRPZmZpY2lhbFRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyZW1DYXJkTnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNJZGVudGlmaWVycyIgdHlwZT0iSGF6YXJkb3VzSWRlbnRpZmllcnMiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSGF6YXJkQ2xhc3NDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZElkZW50aWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNQbGFjYXJkVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzUGxhY2FyZEluZm9ybWF0aW9uIiB0eXBlPSJIYXphcmRvdXNQbGFjYXJkSW5mb3JtYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1RlbXBlcmF0dXJlcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGbGFzaHBvaW50Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRW1lcmdlbmN5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJvbCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZlRlbXBlcmF0dXJlQ29kZWQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMaXN0T2ZEaW1lbnNpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSGF6YXJkb3VzVGVtcGVyYXR1cmVzIiB0eXBlPSJIYXphcmRvdXNUZW1wZXJhdHVyZXMiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkhhemFyZG91c1NoaXBtZW50SW5mb3JtYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGVkIiB0eXBlPSJIYXphcmRQYWNraW5nQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkUGFja2luZ0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1NoaXBtZW50Q29kZWQiIHR5cGU9IkhhemFyZG91c1NoaXBtZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSGF6YXJkb3VzU2hpcG1lbnRDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJIYXphcmRvdXNTaGlwbWVudE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlZCIgdHlwZT0iSGF6YXJkb3VzWm9uZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkhhemFyZG91c1pvbmVDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIiB0eXBlPSJIYXphcmRvdXNTaGlwbWVudEluZm9ybWF0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkhhemFyZFBhY2tpbmdDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmVhdERhbmdlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaXVtRGFuZ2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5vckRhbmdlciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRvdXNTaGlwbWVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsRGVzY3JpcHRpdmVJbmZvcm1hdGlvbk5vdFJlcXVpcmVkQnlSZWd1bGF0aW9uQnV0RGVzaXJlZFRvQWNjb21wYW55VGhlTW92ZW1lbnRCeVRoZVNoaXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvQWlybGlmdE9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRPVC0xMTNEb05vdEJ1bXBPckN1dE9mZkNhcldoaWxlSW5Nb3Rpb25EZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlZENhck51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFuZ2Vyb3VzV2hlbldldERlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVNQYWdlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGVudGlmaWVzUHJvZHVjdHNJbkFIZWF0ZWRNb2x0ZW5TdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzU3Vic3RhbmNlQ29uc3RpdHVlbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmhhbGF0aW9uSGF6YXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW1pdGVkUXVhbnRpdHlEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTUZBR1BhZ2VOdW1iZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcGVyYXRpbmdTcGVlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFyaW5lUG9sbHV0YW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb24tSW5oYWxhdGlvbkhhemFyZERlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2lzb25EZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFkaW9hY3RpdmVNYXRlcmlhbERhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2huaWNhbE9yQ2hlbWljYWxHcm91cE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlTmFtZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FzdGVEZWNsYXJhdGlvbiIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJIYXphcmRvdXNab25lQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVBIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRab25lQiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkWm9uZUMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZFpvbmVEIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljaW5nRGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikl0ZW1BbGxvd2FuY2VzT3JDaGFyZ2VzIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mQWxsb3dPckNoYXJnZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUb3RhbFZhbHVlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQcmljaW5nRGV0YWlsIiB0eXBlPSJQcmljaW5nRGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQcmljZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iUHJpY2UiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlByaWNlIiB0eXBlPSJMaXN0T2ZQcmljZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJpY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJQcmljaW5nVHlwZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVW5pdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZUJhc2lzUXVhbnRpdHkiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYWxjdWxhdGVkUHJpY2VCYXNpc1F1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJWYWxpZGl0eURhdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZVF1YW50aXR5UmFuZ2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlByaWNlTXVsdGlwbGllciIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2UiIHR5cGU9IlByaWNlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljaW5nVHlwZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUHJpY2VUeXBlQ29kZWQiIHR5cGU9IlByaWNlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByaWNlVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNpbmdUeXBlIiB0eXBlPSJQcmljaW5nVHlwZSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJQcmljZVR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsbGF0aW9uUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclRvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bU9yZGVyUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYW5nZURlcGVuZGVudFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmVJbmdyZWRpZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc0lzUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0aW9uTmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkdyb3NzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhJbmNsdWRlZEFsbG93YW5jZXNBbmRDaGFyZ2VzTm90SW5jbHVkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVNlbGxpbmdQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZVRheEluY2x1ZGVkRXhjbHVkaW5nQWxsb3dhbmNlc09yQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZUV4Y2x1ZGluZ0FsbG93YW5jZXNPckNoYXJnZXNBbmRUYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRkaXRpdmVVbml0UHJpY2VDb21wb25lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VHZW5lcmljUHJvZHVjdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGVQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXZlcmFnZVdob2xlc2FsZVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXI5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjEyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMTciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjE4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIxOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjIxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyNSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjI3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFRpZXIyOCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RUaWVyMjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0VGllcjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvblByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRhbG9nUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnRyYWxEaXN0cmlidXRpb25GYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERvbWVzdGljVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWRVbml0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkQ3VzdG9tc1VuaXRWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhbGVyQWRqdXN0ZWRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JzUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50QW1vdW50QWxsb3dlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U3RvcmVEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0U2hpcFByb2dyYW1QcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWNzY1ByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VPcmlnaW5hbEVxdWlwbWVudE1hbnVmYWN0dXJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbWVyZ2VuY3lEaXJlY3RTaGlwUHJpY2VTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5RGlyZWN0U2hpcFByaWNlV2FyZWhvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWN0ZWRVbml0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZXF1ZW50RGVsaXZlcnlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlR29vZHNQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFVwcGVyTGltaXRQcmljZU1heGltdW1BbGxvd2FibGVDb3N0UHJpY2luZ0ZvckRydWdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJtUHJpY2VEb05vdEFkdmlzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VUaHJvdWdoUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZHVzdHJpYWxQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25QcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGl0dXRpb25hbFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQmlsbGluZ1ByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeVRvQWR2aXNlVW5pdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtQWN0aXZpdHlTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1heGltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1PcmRlclF1YW50aXR5UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1SZWxlYXNlUXVhbnRpdHlQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bVByaWNlUmVkdWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJzU3VnZ2VzdGVkUmV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtUmVsZWFzZVF1YW50aXR5UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjEzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE2Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIxNyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMTgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjE5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjIyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyNiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMjciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmNvbnRyYWN0VGllcjI4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25jb250cmFjdFRpZXIyOSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uY29udHJhY3RUaWVyMzAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldEl0ZW1QcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFRvQWR2aXNlVW5pdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbFB1cmNoYXNlT3JkZXJQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1F1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml0UHJpY2VCZWdpbm5pbmdRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCcmVha1B1cmNoYXNlT3JkZXJDb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VDYXRhbG9ndWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckVhY2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlSW5FZmZlY3RBdFRpbWVPZlNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJLaWxvZ3JhbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyTGl0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRGcmVpZ2h0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2Vyc1ByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25hbFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJUb25uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lmaWVkVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdW90ZVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkRGVhbGVyTmV0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2dlc3RlZEZsZWV0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBBbmREZWJpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkTGlzdFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVByaWNlRmFjdG9yc0VxdWFsaXplZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkUmV0YWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkxpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VnZ2VzdGVkV2hvbGVzYWxlUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvQmVOZWdvdGlhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRQcmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVkVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlb3JldGljYWxXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaXRDb3N0UHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildob2xlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWm9uZVByaWNlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbml0UHJpY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVuaXRQcmljZVZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJVbml0T2ZNZWFzdXJlbWVudCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiB0eXBlPSJVbml0UHJpY2UiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDIxXzYiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjIxIi8+CisgICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI2Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmljZU11bHRpcGxpZXIiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGVkIiB0eXBlPSJQcmljZU11bHRpcGxpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcmljZU11bHRpcGxpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTXVsdGlwbGllciIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlByaWNlTXVsdGlwbGllciIgdHlwZT0iUHJpY2VNdWx0aXBsaWVyIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlByaWNlTXVsdGlwbGllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0TWFya3VwTXVsdGlwbGllci1PcmlnaW5hbENvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvc3RNYXJrdXBNdWx0aXBsaWVyLVJldGFpbENvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50TXVsdGlwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdE1hcmt1cE11bHRpcGxpZXItV2hvbGVzYWxlQ29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudFNvbHV0aW9uTXVsdGlwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGluZ011bHRpcGxpZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRheCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlZCIgdHlwZT0iVGF4RnVuY3Rpb25RdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhDYXRlZ29yeUNvZGVkIiB0eXBlPSJUYXhDYXRlZ29yeUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheENhdGVnb3J5Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZWQiIHR5cGU9IlJlYXNvblRheEV4ZW1wdENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvblRheEV4ZW1wdENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXhUeXBlQ29kZWQiIHR5cGU9IlRheFR5cGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhUeXBlQ29kZWRPdGhlciI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4UGVyY2VudCIgdHlwZT0iRGVjaW1hbDEwXzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlZCIgdHlwZT0iVGF4UGF5bWVudE1ldGhvZENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXhhYmxlQW1vdW50IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4YWJsZUFtb3VudEluVGF4QWNjb3VudGluZ0N1cnJlbmN5IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRheEFtb3VudCIgdHlwZT0iRGVjaW1hbDIxXzYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRheEFtb3VudEluVGF4QWNjb3VudGluZ0N1cnJlbmN5IiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGF4TG9jYXRpb24iPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJMb2NhdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUYXgiIHR5cGU9IlRheCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUYXhGdW5jdGlvblF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsRHV0eVRheE9yRmVlQ3VzdG9tc0l0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT2ZBbGxEdXRpZXNUYXhlc0FuZEZlZXNDdXN0b21zSXRlbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxPZkVhY2hEdXR5VGF4T3JGZWVUeXBlQ3VzdG9tc0RlY2xhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE9mQWxsRHV0aWVzVGF4ZXNBbmRGZWVUeXBlc0N1c3RvbXNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhSZWxhdGVkSW5mb3JtYXRpb24iLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVGF4Q2F0ZWdvcnlDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpcmVjdFBheUlEIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRWZXRlcmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5UGFpZEJ5U3VwcGxpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZvckV4cG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Rm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tQ291bnR5UHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRmcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdGZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRHb29kc2FuZFNlcnZpY2VzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMZXR0ZXJPbkZpbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdExvY2FsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0Tm90Rm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUGVyU3RhdGVMYXciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdFByb3ZpbmNpYWxTYWxlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0U2FsZVRvVVNHb3Zlcm5tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRUb2xsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUV4cG9ydEl0ZW1UYXhOb3RDaGFyZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoZXJSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yVGF4YWJsZU1hdGVyaWFsRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dlclJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXhlZFRheFJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1Ib21lc3RlYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0Rm9yUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RFeGVtcHROb3RGb3JSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFRheGFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5TcGFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJQcm9wZXJ0eVRheEV4ZW1wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VzT3V0c2lkZVNjb3BlT2ZUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzYWdlRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4RHVlRnJvbUFQcmV2aW91c0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhOb3ROb3dEdWVGb3JQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWWVzLVRheEV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWmVyb1JhdGVkR29vZHMiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmVhc29uVGF4RXhlbXB0Q29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Gb3JFeHBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Illlcy1UYXhFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vLU5vdFRheEV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0LUZvclJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90RXhlbXB0T3JGb3JSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Ob3RGb3JSZXNhbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdEV4ZW1wdE5vdEZvclJlc2FsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0UGF5SWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1TYWxlVG9VU0dvdmVybm1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1QZXJTdGF0ZUxhdyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JUYXhhYmxlTWF0ZXJpYWxFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsVGF4YWJsZUxhYm9yRXhlbXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RUYXhhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhlbXB0VG9sbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdC1Hb29kc0FuZFNlcnZpY2VzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtUHJvdmluY2lhbFNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nRmFybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlblNwYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRMb2NhbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2FibGVkVmV0ZXJhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uLUhvbWVzdGVhZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcjY1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHRGcm9tU2Nob29sUHJvcGVydHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Mb2NhbFByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21Db3VudHlQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxseUV4ZW1wdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNhZ2VFeGVtcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZW1wdEZyb21TdGF0ZVByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclByb3BlcnR5VGF4RXhlbXB0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGVtcHQtTGV0dGVyT25GaWxlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFR5cGVDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ2l0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTExQ291bnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFFeGNpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjkxMVN0YXRlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5MTFUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY29tbW9kYXRpb25zVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW1UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFncmljdWx0dXJhbEV4cG9ydFJlYmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyaWN1bHR1cmFsbGV2eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxjb2hvbGljQmV2ZXJhZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xNYXJrVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxUYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1EdW1waW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXNzbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NMaWNlbnNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1ByaXZpbGVnZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5UmVudGFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5U2FsZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvZmZlZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbk9wZXJhdGVkRGV2aWNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21tb2RpdHlTcGVjaWZpY1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycG9yYXRlSW5jb21lVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoU2FsZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eVJlbnRhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmYXVsdExhYm9yVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3lUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuaGFuY2VkOTExU3RhdGVFeGNpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0YXRlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNpc2VEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsSW5jb21lVGF4V2l0aGhvbGRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxWYWx1ZUFkZGVkVGF4T25Hb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbFZhbHVlQWRkZWRUYXhPblNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWVJbkxpZXUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJQ0FNZWRpY2FyZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRklDQVNvY2lhbFNlY3VyaXR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUNBVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxMVVNUVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3BpbGxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1ZWxTdXBlckZ1bmRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbWluZ1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhbENvbnN0cnVjdGlvblRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2lmdFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNBbmRTZXJ2aWNlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3Jvc3NSZWNlaXB0c1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGljYXBUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c1dhc3RlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5VXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGx1bWluYW50c1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsSW5jb21lVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmRpdmlkdWFsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmhlcml0YW5jZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEZ1ZWxUYXhBZ3JlZW1lbnRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yQnlUcmFkZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4RmVkZXJhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha3lVbmRlcmdyb3VuZFN0b3JhZ2VUYW5rVGF4U3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0RHVlc1BheWFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQ29uc3RydWN0aW9uVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTHVzdFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldHJvcG9saXRhblRyYW5zaXRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc2NlbGxhbmVvdXNDYXNoRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlzY2VsbGFuZW91c1N0YXRlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUNvbXBlbnNhdG9yeUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3JGdWVsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNdW5pY2lwYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jY3VwYXRpb25hbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJUYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFwZXJDb25zb3J0aXVtVGF4LUl0YWx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5VGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXRyb2xldW1UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RUaHJlc2hvbGRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWZlcmVuY2VEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVUaHJlc2hvbGRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3Zpc2lvbmFsY291bnRlcnZhaWxpbmdEdXR5Qm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlzaW9uYWxDb3VudGVydmFpbGluZ0R1dHlDYXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlCb25kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aXNpb25hbER1dHlDYXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNIZWFsdGhBbmRFZHVjYXRpb25UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxQcm9wZXJ0eVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNBbmRVc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5UGVyY2VudGFnZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V2ZXJhbmNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlmdGVkU29jaWFsU2VjdXJpdGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpZnRlZFdhZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGlkV2FzdGVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDb25zdHJ1Y3Rpb25UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YWRpdW1UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW1wRHV0eS1JbXBvc3RhZGlCb2xsbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVhbmRMb2NhbFNhbGVzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZExvY2FsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZUFuZFByb3ZpbmNpYWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlRXhjaXNlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZW9yUHJvdmluY2lhbEZ1ZWxUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlT3JQcm92aW5jaWFsU2FsZXNUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlb3JQcm92aW5jaWFsVGF4T25Hb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVvclByb3ZpbmNpYWxUYXhPblNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVJlbnRhbFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVUYXhvblNwZWNpZmljTGFib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cGVyZnVuZFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXNwZW5kZWREdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlY29tbXVuaWNhdGlvbnNEZXZpY2VGb3JUaGVEZWFmU2VydmljZUV4Y2lzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWNvbW11bmljYXRpb25zVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlc2hvbGRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvbm5hZ2VUYXhlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXJpc21UYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlR1cm5PdmVyVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmVtcGxveW1lbnRUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXRpbGl0eVVzZXJzVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EZXBvc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZUFkZGVkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhvbGRpbmdUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtlcnNDb21wZW5zYXRpb25UYXgiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDEwXzQiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjEwIi8+CisgICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI0Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlRheFBheW1lbnRNZXRob2RDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ybWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGZBc3Nlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheVZlbmRvciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlZCIgdHlwZT0iTG9jYXRpb25RdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMb2NhdGlvblF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uSWRlbnRpZmllciIvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbEFkZHJlc3NJRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik5hbWVBZGRyZXNzIi8+CisgICAgICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkdQU0Nvb3JpZGluYXRlcyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb24iIHR5cGU9IkxvY2F0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvY2F0aW9uUXVhbGlmaWVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1cmlzZGljdGlvblRvUmVjZWl2ZUNyZWRpdEZvclVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNtaXR0aW5nVXRpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTY2hlZHVsZUQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuaWZvcm1Db21tZXJjaWFsQ29kZUZpbGluZ09mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c0Jsb2NrR3JvdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWVBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lQmFzZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbnN1c1RyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW5zdXNTY2hlZHVsZUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZ0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZUFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1hbmVudEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpcnRocGxhY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ildvcmxkd2lkZUdlb2dyYXBoaWNMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lYXJlc3RDcm9zc1N0cmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Q3Jvc3NTdHJlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJRdWFydGVyU2VjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFya2VySWRlbnRpZmllckxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb3V0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVTdWJkaXZpc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpZExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJrZXJUeXBlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRpdHVkZS1Mb25naXR1ZGVTb3VyY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFNvdXJjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFwUmVmZXJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmlkU291cmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGlxdW90Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyYWluaG9sZU51bWJlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eUJsb2NrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb290YWdlQ2FsbERpcmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYXRpb25EaXJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dGVyQ29udGluZW50YWxMZWFzZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcFF1YWRyYW5nbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW5jaXBhbE1lcmlkaWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRlckNvbnRpbmVudGFsU2hlbGZCbG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmaWNpYWxQcm90cmFjdGlvbkRpYWdyYW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyUXVhcnRlclNlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJRdWFydGVyU2VjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdGlvblR5cGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFic3RyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZ3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJ2ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbml2ZXJzYWxUcmFuc3ZlcnNlTWVyY2F0b3JRdWFkcmFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnNlRGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcmVhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZW5kZXJzTG9jYXRpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNMb2NhdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5udWFsU3RhdGVtZW50c01haWxpbmdBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5YW5kU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbFBvaW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRTZXJ2aWNlc0xvY2F0aW9uRGVzaWduYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyYW5jaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NFY29ub21pY0FyZWFSZWdpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50QmlsbG9mTGFkaW5nT2ZmaWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkJ1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHZW9wb2xpdGljYWxOYW1lQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtYXRpb25NYWlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5DdXN0b21zT2ZmaWNlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVzcG9uZGVuY2VNYWlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmF0aW9uYWxSYXRlQmFzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdW50eU9yUGFyaXNoQW5kU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVGFua0NhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5TUExDIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudHlPclBhcmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uQ2VudGVyTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbi1TaGlwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpY3RPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWN0T2ZSZXNpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWljaWxlVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50TG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3RvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRFcXVhbGl6YXRpb25Qb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbkZyZWlnaHRGb3J3YXJkZXJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmVkZXJhbEluZm9ybWF0aW9uUHJvY2Vzc2luZ1N0YW5kYXJkczU1LU5hbWVkUG9wdWxhdGVkUGxhY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVLlMuQ3VzdG9tc0ZhY2lsaXRpZXNJbmZvcm1hdGlvbmFuZFJlc291cmNlTWFuYWdlbWVudFN5c3RlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRTdGF0aW9uQWNjb3VudGluZ0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25UcmFkZVpvbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVBbG9uZ3NpZGVWZXNzZWwtRnJlZU9uQm9hcmRQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN0YXRpb25HZW9ncmFwaGljTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbkxvY2F0aW9uUXVhbGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxpdGFyeVN0YW5kYXJkTW92ZW1lbnRQcm9jZWR1cmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluU3RvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybWVkaWF0ZUZPQlBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFbWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudEZ1cm5pc2hlZFByb3BlcnR5Rk9CUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsT2ZmaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRyb3BvbGl0YW5TYW1wbGluZ0FyZWFSZWdpb25Db2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXhpY2FuUG9zdGFsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU9yU3RhdGVGcm9tUG9pbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4tQWZ0ZXJMb2FkaW5nT25FcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyVW5saXN0ZWRGcmVlT25Cb2FyZFBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuYW5kUHJlcGF5U3RhdGlvbkxpc3RDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlclVubGlzdGVkQWNjZXB0YW5jZVBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4tU2hpcHBpbmdQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25WZXNzZWwtRnJlZU9uQm9hcmRQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydG9mQXJyaXZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydG9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lNYWlsaW5nQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyZW50c0FkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQnVzaW5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmluY2lwYWxTZXJ2aWNpbmdPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xQb2ludCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0RpZ2l0VVNaSVAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjREaWdpdFVTWklQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1RGlnaXRVU1pJUCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iM0RpZ2l0Q2FuYWRpYW5Qb3N0YWxDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2RGlnaXRDYW5hZGlhblBvc3RhbENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVBcmVhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5SYWlsQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpb25hbEVkdWNhdGlvblNlcnZpY2VBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVyYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYXJkQ2FycmllckFscGhhQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm91dGVBZG1pbmlzdHJhdGl2ZU1lc3NhZ2VUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJ1cmJhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eU9yU3RhdGVBbmRQb2ludHNXaXRoaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbENhbXB1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTLVNQTEMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JlTnVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZU9yUHJvdmluY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5TdG9yYWdlVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoaW5nRGlzdHJpY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zY29udGluZW50YWxGcmVpZ2h0QnVyZWF1Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbENhcmdvTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3duc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsVGVycml0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhpbmdEaXN0cmljdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGVkTmF0aW9uc0xvY2F0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXJiYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1c2luZXNzVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFjYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZpbGxhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbFN0b3dhZ2VMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2ludGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJab25lQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnNlYXNBbmRQb2ludExvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbFBvcnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdENoYXJnZUxvY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zT2ZmaWNlT2ZNYW5pZmVzdE9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc09mZmljZU9mTWFuaWZlc3REZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luUmFpbEludGVybW9kYWxUZXJtaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzdGluYXRpb25SYWlsSW50ZXJtb2RhbFRlcm1pbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdE9wdGlvbmFsUG9ydE9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRPcHRpb25hbFBvcnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkFjY2VwdGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc29saWRhdGlvblBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZS1Db25zb2xpZGF0aW9uUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkRpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0UGF5YWJsZUF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0T2ZFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9ydE9mRXhpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVBvaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdQb3J0T2ZMb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsT2ZMYWRpbmdQb3J0T2ZEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRPZkxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BhdGNoaW5nUG9vbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nT3JpZ2luT2ZHb29kcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VPZlJlY2VpcHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVyblBvb2wiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zc2hpcG1lbnRQb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQ2hhcmdlTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxPZkxhZGluZ1JlbGVhc2VPZmZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkT3B0aW9uYWxQb3J0T2ZEaXNjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGF5UG9ydCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTG9jYXRpb25JZGVudGlmaWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb2NJRCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTG9jYXRpb25EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTG9jYXRpb25JZGVudGlmaWVyIiB0eXBlPSJMb2NhdGlvbklkZW50aWZpZXIiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkdQU0Nvb3JpZGluYXRlcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR1BTU3lzdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGF0aXR1ZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMb25naXR1ZGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkdQU0Nvb3JpZGluYXRlcyIgdHlwZT0iR1BTQ29vcmlkaW5hdGVzIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJBbGxvd09yQ2hhcmdlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIiB0eXBlPSJMaXN0T2ZBbGxvd09yQ2hhcmdlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBbGxvd09yQ2hhcmdlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbmRpY2F0b3JDb2RlZCIgdHlwZT0iSW5kaWNhdG9yQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW5kaWNhdG9yQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQmFzaXNDb2RlZCIgdHlwZT0iQmFzaXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNpc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWQiIHR5cGU9Ik1ldGhvZE9mSGFuZGxpbmdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93YW5jZU9yQ2hhcmdlRGVzY3JpcHRpb24iPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJBbGxvd09yQ2hnRGVzYyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlZhbGlkaXR5RGF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2lzUXVhbnRpdHlSYW5nZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJCYXNpc01vbmV0YXJ5UmFuZ2UiLz4KKyAgICAgICAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUYXgiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNlcU5vIiB0eXBlPSJ4c2Q6aW50IiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIxIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkFsbG93T3JDaGFyZ2UiIHR5cGU9IkFsbG93T3JDaGFyZ2UiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iSW5kaWNhdG9yQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZUxpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyQ2FsbE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VSZXF1ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZUl0ZW1BbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhpbXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1BbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbnVzLVBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0FsbG93YW5jZU9yQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1cy1BbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtUGVyY2VudGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXNPckFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbE90aGVyIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkJhc2lzQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb25ldGFyeUFtb3VudCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJNZXRob2RPZkhhbmRsaW5nQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxCYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JDaGVja1RvQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEN1c3RvbWVyQWNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeVZlbmRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlVG9CZVBhaWRCeUN1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmR3Jvc3NRdWFudGl0eUludm9pY2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VUb0JlSXNzdWVkQnlWZW5kb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVRvQmVJc3N1ZWRCeVJlc2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VEZW5pZWRCeVZlbmRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbk9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbi1QYXlhYmxlVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NydWFsRnVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hJbkFkdmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGN1bGF0ZUFuZEFkZHRvSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVmSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlQ29kZWQiIHR5cGU9IlNlcnZpY2VDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWxsb3dPckNoZ0Rlc2MiIHR5cGU9IkFsbG93T3JDaGdEZXNjIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEZXNjcmlwdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGVzY3JpcHRpb24iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkRlc2NyaXB0aW9uIiB0eXBlPSJMaXN0T2ZEZXNjcmlwdGlvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uVGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGFuZ3VhZ2UiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJEZXNjcmlwdGlvbiIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTZXJ2aWNlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFib3V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBYnNvbHV0ZU1pbmltdW1DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc0NoYXJnZS1GZWRlcmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2Nlc3NDaGFyZ2UtU3RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnROdW1iZXJDb3JyZWN0aW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2lkQmF0dGVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNrbm93bGVkZ21lbnRvZkRlbGl2ZXJ5RmVlQU9EIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3RpdmF0aW9uT2ZDYXJuZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb21tZXJjaWFsSW52b2ljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxDb3BpZXNPZkZyZWlnaHRCaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRpdGlvbmFsTWF0ZXJpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGl0aW9uYWxUYXJpZmZDbGFzc2lmaWNhdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZE9uLURlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRPbi1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZHJlc3NDb3JyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRUb01ha2VNYXJrZXRWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1heGltdW1DaGFyZ2VzQmlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudEZvck1pbmltdW1BdmVyYWdlVGltZVJlcXVpcmVtZW50QmlsbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkbWluaXN0cmF0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZFZhbG9yZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VDaGFyZ2VzSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmFuY2VEZXN0aW5hdGlvbkFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZURlc3RpbmF0aW9uRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlTGFkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlT3JpZ2luRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFmZmlkYXZpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdlbnREaXNidXJzZW1lbnQtRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZW50RGlzYnVyc2VtZW50LU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnRPbkdyb3VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRXhwb3J0Q2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cHJlc3NDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpcmxpbmVPcGVuaW5nRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJwb3J0VGVybWluYWxIYW5kbGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyVHJhbnNwb3J0YXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsY29ob2xpY0JldmVyYWdlUmVwb3J0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxlZ2hlbnlDb3VudHlQQURlbGl2ZXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZUxpbmVJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlTWVzc2FnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsb3dhbmNlUGVyQ2FsbE9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VBZHZhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VGb3JDb25zaWdubWVudE1lcmNoYW5kaXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FuY2VOb24tUGVyZm9ybWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93YW5jZVJlcXVlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVyYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbWVuZGluZ0V4cG9ydERvY3VtZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubmVhbEhlYXRTdGVlbG9yR2xhc3NUcmVhdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFub2RpemluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aS1kdW1waW5nRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwb2ludG1lbnROb3RpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFyYml0cmFyeUluQWRkaXRpb25Ub1Rocm91Z2hSYXRlc2FuZENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFydFdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2VtYmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3Npc3RBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dGFjaG1lbnRzVG9CaWxsT2ZMYWRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhZERlYnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhbmtpbmdEcmFmdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlRnJlaWdodEFsbEtpbmRzU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzaWNSZW9yZGVyQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFtaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWRkaW5nRmVlZGluZ0Rpc2luZmVjdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVlZkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmV5b25kQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXlvbmRGcmVpZ2h0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbEFuZEhvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGxlZERlbWFuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQXR0ZW5kYW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbGFja0x1bmdUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJsb2NraW5nQW5kQnJhY2luZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxvd2VyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2J0YWlsQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9uZENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9wU2hlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvcmRlYXV4QXJiaXRyYXJpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvdGgtRmxhdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJlYWtidWxrU2VydmljZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrQnVsa1N1cmZhY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyaWRnZVRvbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlbkxvdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuUGFja2FnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VyYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCcm9rZXJhZ2VPckR1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bmtlckFkanVzdG1lbnQtMjBGb290Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdW5rZXJBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVua2VyU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXJkZW5PdmVyaGVhZE9yQWxsb3dhbmNlRm9ySW5kaXJlY3RDb3N0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVybmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJIYW5kQ2FycnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1eWVyc0NhckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVQcmVzc3VyaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FibGVzU2VuZGluZ09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxsVGFnIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW1wQXJiaXRyYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGFHcmVhdExha2VzQWRkaXRpb25hbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuQ1FDdXN0b21zQ2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5hZGlhbkN1cnJlbmN5RXhjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuSW1wb3J0VGVybWluYXRpb25GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmFkaWFuUmVjb25zaWdubWVudEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuYWRpYW5SZW1hbmlmZXN0RmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxsYXRpb25DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxlZE9yZGVySGVhdnlEdXR5RmxhdGNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FwdHVyZUFkZGl0aW9uYWxEYXRhIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb1RheGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJMb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJSZW50YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJDcmVkaXRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJEZWJpdEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fycmllck5vdGlmaWNhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FydGFnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2F0YWxvZ2luZ1NlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50cmFsQnV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZW50c09mZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGVPZkNvbmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZU9mUmVnaXN0cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFpbkFuZEJpbmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW1iZXJPZkNvbW1lcmNlU2VydmljZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlT2ZBaXJiaWxsLVNlcnZpY2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlTGluZUl0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VNZXNzYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VQZXJDYWxsT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZXNGb3J3YXJkQWR2YW5jZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcnRlclNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFzc2lzVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZW1pY2FsTWlsbGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpY2Fnb0xvb3BDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpZ2FyZXR0ZVN0YW1waW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlNYWludGVuYW5jZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0eVBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNpdHlUZXJtaW5hbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYW5pbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdTZWFsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2F0aW5nRGlwUnVzdHByb29mRURQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT0RBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPRENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5QWx0ZXJhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdE9uRGVsaXZlcnlEZWxldGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tbWFudWZhY3R1cmluZ0Rpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21iaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluYXRpb25QZXJmb3JtYW5jZUFuZE5vbi1wZXJmb3JtYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tYmluZUFsbFNhbWVEYXlTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWlzc2lvbkFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXVuaWNhdGlvbnNDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wZXRpdGl2ZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGV0aXRpdmVDYXJBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBldGl0aXZlUHJpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXByZXNzb3JDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25DcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmNlc3Npb25Nb25leSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZ2VzdGlvblN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc2VydmF0aW9uUmVzZWFyY2hGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNpZ25lZVVubG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RhbnRTdXJ2ZWlsbGFuY2VTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFN1cnZlaWxsYW5jZVNlcnZpY2UtQXJtZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bGFyaXphdGlvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VsYXJMZWdhbGl6YXRpb25TZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdWx0aW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXJTZXJ2aWNlUHJvdmlkZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyRGVwb3NpdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRlc3R1ZmZpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckRpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJEaXZlcnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMZWFzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJMb3NzRGFtYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJTZXJ2aWNlQ2hhcmdlVUtFVVIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNlcnZpY2VDaGFyZ2VVU0FDYW5hZGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJUcmFpbGVyQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzTWlsZWFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXNjYWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkQXRtb3NwaGVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmVydGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ28tb3BDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdNZXJjaGFuZGlzaW5nQWxsb3dhbmNlUGVyZm9ybWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvcHlPZkJpbGxPZkxhZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29weU9mRGVsaXZlcnlSZWNlaXB0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0UmVjb3ZlcnlGYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdHRvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291bnRBbmRSZWNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3VudGVydmFpbGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXBvblJlaW1idXJzZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyYWZ0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmF0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5QWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTIwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LTQwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50LUJyZWFrQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW5jeURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckFjY291bnRJZGVudGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJFcXVpcG1lbnRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNCcm9rZXJGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNFeGFtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRmVlcy1Db250YWluZXJMZXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc0ZlZXMtTGlmdExldmVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRm9ybWFsaXRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXNJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zSW52b2ljZS1BZGRpdGlvbmFsUGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1BlbmFsdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0QW5kUGFyYWxsZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dHRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZWRNZXJjaGFuZGlzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGFtYWdlVG9DYXJyaWVyRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VUb0NhcnJpZXJWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhbWFnZVRvR292ZXJubWVudEVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YURyYXdpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYWRoZWFkTWlsZWFnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhZkFuZERpc2FibGVkU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9yQ2FycmlhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY2xhcmVkVmFsdWVGb3JDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJlZFZhbHVlRm9ySW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWR1Y3RUb01ha2VNYXJrZXRWYWx1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZWN0aXZlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpY2l0RnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGUtSW5zdGFsbGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheUZ1cm5pc2hpbmdEZXN0aW5hdGlvbldlaWdodHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVtYW5kQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbXVycmFnZS1BdmVyYWdlQWdyZWVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW11cnJhZ2UtU3BlY2lhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcG9zaXRJbkxpZXVPZk9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXJhbXBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcnJpY2tDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc2lnbmF0ZWRTdXBwbGllckluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3RpbmF0aW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25Mb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXRlbnRpb25PZlBvd2VyVW5pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbk9mVHJhaWxlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvbi1TcGVjaWFsVHlwZUZsYXRDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldGVudGlvblVubG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGV0ZXJtaW5lZEZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldmVsb3BtZW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaWVTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXJlY3RQcm9kdWN0SGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2J1cnNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY29ubmVjdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LURyb3BCb3hDb252ZW5pZW5jZUN0ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtSW5jZW50aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1NdWx0aXBsZVNoaXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1TZXJ2aWNlT3B0aW9uRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNlcnZpY2VPcHRpb25QaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdW50LVNwZWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BsYXlBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dGlvbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0aW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JEaXNjb3VudEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQW5kUmVjb25zaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGl2ZXJzaW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZlcnNpb25Ub0FpckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9ja2FnZS1Cb2F0RGV0ZW50aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGF0aW9uQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yLVRvLURvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvd2VsUGluQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdBdFBvcnRPZkRlYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlYXRQb3J0T2ZEZWJhcmthdGlvblJhdGVab25lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmF5YWdlQXRQb3J0T2ZFbWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZWF0UG9ydE9mRW1iYXJrYXRpb25SYXRlWm9uZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJheWFnZUxpbmVIYXVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcml2ZXJBc3Npc3RlZFVubG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVyc1dhZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wRG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcFlhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRydW1Db3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnVtRGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ1bVVwQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcnllckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5SWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdW5uYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEdXR5RHJhd2JhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5QnV5QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJseVBheW1lbnRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U2hpcEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5UG9ydENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1lcmdlbmN5U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eVdlaWdoaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmNsb3N1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9yc2VtZW50RmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmVyZ3ljaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZXJneVN1cmNoYXJnZUZ1ZWxBZGp1c3RtZW50RmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdTdXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5ncmF2aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnRlcmVkVmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudmlyb25tZW50YWxQcm90ZWN0aW9uU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TWFudWZhY3R1cmVyUmVzdG9yYXRpb25BdWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjb3J0U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjcm93Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXIxUHJlc2VudGF0aW9uRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvcGVhblBvcnRDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhjZXNzaXZlVmFsdWVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc01pbGVhZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1BlcmlvZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2Vzc1ZhbHVlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNlc3NXZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2hhbmdlQWNjZXNzQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNsdXNpdmVVc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2x1c2l2ZVVzZU9mRXF1aXBtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGhpYml0aW9uRGVsaXZlcnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4aGliaXRpb25QaWNrdXBDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGFuZGVkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT25lRGF5Q29uc3VsYXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTaGlwbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRpbmdQcmVtaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRDdXN0b21zQ2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtQXV0b21hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnREZWNsYXJhdGlvbnMtVVNTaGlwcGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0SW1wb3J0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvcnRMaWNlbnNlQXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydFNoaXBwaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUNvcGllc2FuZE1haWxpbmdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYUxhYm9ySGVscGVyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0cmFMZW5ndGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhTGVuZ3RoU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRyYVNlcnZpY2UtQ291bnRlci1Uby1Db3VudGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWJyaWNhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmFjc2ltaWxlQ2hhcmdlcy1BZGRpdGlvbmFsUGFnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZExhbXBQYW5lbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmF4UHJlLWFsZXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWRlcmFsVHJhbnNmZXJTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RBcnRpY2xlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdEZsaWdodE91dCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdHJhY2tTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRSYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbG9vclN0b2NrUHJvdGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9vZEFuZExvZGdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25DdXN0b21zRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk1pbGl0YXJ5U2FsZXNSZW50YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVpZ25NaWxpdGFyeVNhbGVzU3BlY2lhbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWlnbk9mZmljZUFkdmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcndhcmRDb3Vwb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQWdlbnRDb21taXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmFuY2hpc2VGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVEb21pY2lsZVNoaXBtZW50UHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmFzZWRPbkRvbGxhck1pbmltdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9Cb3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRDaGFyZ2VzVG9EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEVxdWFsaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRJbnRlcm5hdGlvbmFsTm9uLVVTRG9sbGFycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodEludGVybmF0aW9uYWxVU0RvbGxhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWlnaHRQYXNzdGhyb3VnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlaWdodFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlc2huZXNzTGVha2VyQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWVsU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVsbFRydWNrbG9hZEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVtaWdhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2FybWVudERpc3RyaWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXJtZW50U3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNQcmVzc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2F0ZXdheUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2xhemUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbGRGYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNDcmVkaXRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzQW5kU2VydmljZXNUYXhDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvdmVybm1lbnRJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLURlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb3Zlcm5tZW50V2FyZWhvdXNlRmVlLU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5Eb29ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5GbG93Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF0dWl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JpbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3NzUmVjZWlwdHNTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwYWdlRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwZWRJdGVtcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudGVlZEluc3BlY3Rpb25UZWNobmljYWxTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHdWxmUG9ydERlbGl2ZXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFuZGxpbmdDaGFyZ2VzT25EaXN0cmlidXRpb25GcmVpZ2h0Rm9yd2FyZGVkQmV5b25kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYW5kbGluZ0ZyZWlnaHRBdFBvc2l0aW9uc05vdEltbWVkaWF0ZWx5QWRqYWNlbnRUb1ZlaGljbGVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhcmJvck1haW50ZW5hbmNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXJib3JNYWludGVuYW5jZVJlcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF1bGluZ0FuZEhvaXN0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsaW5nQW5kSG9pc3RpbmdUb0JlRGlyZWN0QmlsbGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNDYXJnb0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ29PbkRlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhemFyZG91c01hdGVyaWFsc0hhbmRsaW5nRmVlLURvbWVzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNNYXRlcmlhbHNIYW5kbGluZ0ZlZS1JbnRlcm5hdGlvbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXphcmRvdXNTdG9yYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF0SW5UcmFuc2l0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhdFRyZWF0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUR1dHlGbGF0Q2FyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWF2eUxpZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hTZWN1cml0eVJlZEluLWJvbmRTZWFsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdod2F5SW50ZXJjaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvaW50aW5zQW5kSGF1bGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZUxpbmVGcmVpZ2h0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb25leUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9vay11cGNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9zZUNoYXJnZVNwZWNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvdXNlaG9sZEdvb2RzUGljay11cE9yRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFBaXJiaWxsUHJlcGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklBVEFGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklkZW50aWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRTZXJ2aWNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXByb3BlckRvY3VtZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYm91bmRGcmVpZ2h0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRnJlaWdodE1hbnVmYWN0dXJpbmdUb1NoaXBwaW5nUG9pbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycmVjdEJpbGxpbmdBY2NvdW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmR1c3RyeVByaWNlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsTGljZW5zZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kVHJhbnNwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZUNhYmxlQ29ubmVjdG9ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zaWRlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2lkZVBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3RBdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNwZWN0QXRPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbGF0aW9uQW5kVHJhaW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RhbGxhdGlvbldhcnJhbnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1bGF0ZWRUYW5rQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUGxhY2VtZW50Q29zdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJlbWl1bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlUHJvdmlkZWRCeUxlc3NvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmRpdmlzaW9uUHJvZml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblJlZnVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RPblNlY3VyaXR5RGVwb3NpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJpbVVzZVBlcm1pdHRlZEF0U3BlY2lhbFJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbkNvbW1pc3Npb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxBaXJUcmFuc3BvcnRBc3NvY2lhdGlvbk1hcmt1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbENvdXJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVybmF0aW9uYWxEb29yLXRvLURvb3JIYW5kbGluZ0ZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJwbGFudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJzdGF0ZUhpZ2h3YXlUb2xsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblRyYW5zaXRQcmljZVByb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludHJhLXBsYW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlQWRkaXRpb25hbEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VBdC1Db3N0QW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGVsaXZlcnlUZXJtc0Ftb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZU5vLUNoYXJnZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljZVNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlV2l0aEdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcmlzaEFyYml0cmFyaWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc2xhbmREZWxpdmVyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNsYW5kUGljay1VcENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRhbGlhblJlbGVhc2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1QZXJjZW50YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtLVVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBGcm9tRnJlZXppbmdQZXJjZW50RGlmZmVyZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLb3NoZXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYmVsQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJlbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvckNvc3RPZlJlbW92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yTW9kaWZ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck5vVHJvdWJsZUZvdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvck92ZXJ0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclByZW1pdW1PdmVydGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JSZXBhaXJBbmRSZXR1cm5PcmRlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm9yU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFib3JTdHJhaWdodC10aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYWJvclRlc3RBbmRDYWxpYnJhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhZGluZ0FkanVzdG1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhbmRDdXJyZW5jeUFkanVzdG1lbnRGYWN0b3ItMjBGb290Q29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYW5kQ3VycmVuY3lBZGp1c3RtZW50RmFjdG9yLTQwRm9vdENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzaGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZU9yZGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlUGF5bWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5b3V0RGVzaWduIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXlvdmVyQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhZEZhY3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVha2luZ1VuZGVyZ3JvdW5kU3RvcmFnZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VTaG9ydGZhbGxDb25zaWRlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbkNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcnVja2xvYWRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxldHRlck9mQ3JlZGl0UHJvY2Vzc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZUFuZFRpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWZlbGluZVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlmdEdhdGVUcnVja09yRm9ya2xpZnRTZXJ2aWNlQXRQaWNrLXVwRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbWVGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVJdGVtQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lSXRlbUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxGcm9tUG9ydE9mRGViYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVoYXVsUGVyY2VudERpZmZlcmVudGlhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZWhhdWxUb1BvcnRPZkVtYmFya2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaW5lclRlcm1zQXRQb3J0T2ZEZWJhcmthdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGluZXJUZXJtc0F0UG9ydE9mRW1iYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0ZWREYW1hZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvbkFudGktRHVtcGluZ0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1aWRhdGlvblRheEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25Ub3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVpZGF0aW9uVG90YWxGZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkaW5nTGFib3JDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkV2VpZ2hpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYW5GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsRGVsaXZlcnlEcmF5YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NvbW90aXZlRGVsYXllZEluU3dpdGNoaW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZVVuZGVyT3duUG93ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90dGVyeUNoYXJnZUJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvdHRlcnlDcm9zc1JlZGVlbWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3ctVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvdy1UaWVyTG90dGVyeVdpbm5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikx1bXBTdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hY2hpbmluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1Qb3N0YWdlQ29zdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbGluZy1TZXJ2aWNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEludm9pY2VUb0VhY2hMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuaWZlc3RDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtldERldmVsb3BtZW50RnVuZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcmtpbmdPclRhZ2dpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hcnJpYWdlUnVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVtb1JldHVybmFibGVDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lcmNoYW5kaXNlUHJvY2Vzc2luZ0ZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVzc2FnZVJhdGVBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXNzZW5nZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRhbHNTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaWQtVGllckxvdHRlcnlDYXNoaW5nQm9udXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pZC1UaWVyTG90dGVyeVdpbm5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VGZWVGb3JSZXBhaXJBbmRSZXR1cm4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbGVhZ2VPclRyYXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWludXMtQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW51cy1QZXJjZW50YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb2RpZmllZEF0bW9zcGhlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vbnRobHlSZW50YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdW50RGVtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW91bnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11bmljaXBhbFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVzaHJvb21GZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0Rpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdEaXN0cmlidXRpb25BbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld0l0ZW1BbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1N0b3JlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdTdG9yZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdXYXJlaG91c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1dhcmVob3VzZURpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXdZb3JrRGVsaXZlcnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ld1lvcmtQaWNrLXVwQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOSERXaGFyZmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9BbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQWxsb3dhbmNlT3JDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tRHV0aWFibGVDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25HZW5lcmF0ZWRGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb24tcmV0dXJuYWJsZUNvbnRhaW5lcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vUmV0dXJuQ3JlZGl0QWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxQdW1wQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3Rhcml6ZWRBZmZpZGF2aXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmeUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90aWZ5Q29uc2lnbmVlQmVmb3JlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5venpsZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5DaGFyZ2VzLUhhemFyZG91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5GcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2VTdXBwbGllcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2hvcmUtQWxhc2thSGF3YWlpIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkNhcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkRlY2tCcmVha0J1bGtEaWZmZXJlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1EYXlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmVUaW1lRW5naW5lZXJpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZS1UaW1lTGljZW5zZUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lLVRpbWUtT25seUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25ldGltZVRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uSGFuZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yQ3JlZGl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uYWxTb2Z0d2FyZVN1cHBvcnRGb3JPcGVyYXRpb25hbFN1cHBvcnRTeXN0ZW1zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpb25hbFNvZnR3YXJlU3VwcG9ydEZvclN3aXRjaGluZ1N5c3RlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGlvbkNoYXJnZUNvbG9yRmFicmljT2ZmaWNlRnVybml0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlci1GbGF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlck5vdGlmeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJBY2Nlc3NvcmlhbFNlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyQWR2YW5jZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyRXhwb3J0Q2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJHb3Zlcm5tZW50QWdlbmN5RGVjbGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyR292ZXJubWVudEFnZW5jeUV4YW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVySW1wb3J0Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlck1pc2NlbGxhbmVvdXNFYXJuaW5nT3JBZGRpdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJTZWVSZWxhdGVkRGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mUm91dGVNaWxlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2Zab25lUGljay11cE9yRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik91dHNpZGVDYWJsZUNvbm5lY3RvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJEaW1lbnNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJIZWlnaHRDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJydW5DaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJzaXplZFByZW1pdW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJ0aW1lTG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcldpZHRoQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNrYWdpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nQW5kSGFuZGxpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdDcmF0aW5nSGFuZGxpbmdBbmRUcmFuc3BvcnRhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFja0ludm9pY2VXaXRoU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaW50aW5nUHJpbWVyT3JGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFsbGV0RXhjaGFuZ2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldGl6aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJhbGxlbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFyaXNoQ291bnR5U2FsZXNUYXhPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXNzaW5nU2hpcHBlcnNFeHBvcnRFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbEFkZGl0aXZlc092ZXJ0aW1lTGFib3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxBZGRpdGl2ZXNTdHJhaWdodFRpbWVMYWJvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbFRheGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZWNhbkZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudERpZmZlcmVudGlhbC1MZXNzVGhhbkNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mUHJvZHVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY2VudE9mU2hpcG1lbnRWYWx1ZVRoYXRJc1JldHVybmFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmNlbnRPZlNoaXBwZWRRdWFudGl0eVRoYXRJc1JldHVybmFibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmZvcm1hbmNlQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJmb3JtYW5jZUF3YXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJJdGVtQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJtaXRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdHNCb25kc0VzY29ydEF0dGVuZGFudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyT3JkZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlclBvdW5kQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5TWVtYmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJzb25hbFByb3BlcnR5U3BvdXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaG9zcGhhdGl6aW5nU3RlZWxUcmVhdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2tsZUFuZE9pbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLXVwQW5kRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cC1PdXRPZkFyZWEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpY2t1cFN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXNPdGhlclRoYW5XaGFyZmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllckNoYXJnZXMtV2hhcmZhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpZXJQaWNrLXVwQW5kT3JEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGllclVubG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlsb3RJbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnRBbmRPclJlbW92YWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXMtQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbHVzLVBlcmNlbnRhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdXNPck1pbnVzLUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGx1c09yTWludXMtUGVyY2VudGFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9sZUxhc2hpbmdFcXVpcG1lbnRTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGVXb29kLVNlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcmtGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvcnRDaGFuZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3J0SGFuZGxpbmdBbmRVbmxvYWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nQXRPcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3RhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3REYW1hZ2VkSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvdGF0b0ZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG93ZXJGYWN0b3JBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtY2FycmlhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1jYXJyaWFnZUV4Y2VzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlY2lvdXNNZXRhbENvbnRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvYWRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWxvZGdlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXNlVXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtVHJhbnNwb3J0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRVc2FnZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uQW5kRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZBaXJXYXliaWxsLU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkNhbmFkaWFuQ3VzdG9tc0ludm9pY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZDb21tZXJjaWFsSW52b2ljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25PZkV4cG9ydEVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYXJhdGlvbk9mSW5zdXJhbmNlQ2VydGlmaWNhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhcmF0aW9uT2ZVU0V4cG9ydERvY3VtZW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZS1Qb3NpdGlvbmVkSW52ZW50b3J5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNCaWxsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRQZXJjZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFuZE1hcmtldGluZ0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VEZXZpYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQmFsYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JCaWxsaW5nQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckRlbGl2ZXJ5T2ZCaWxsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvcml0eVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yTW9udGhDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVPd25lZFZlaGljbGVQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzSW5UcmFuc2l0UHJpdmlsZWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jdXJlbWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZmVzc2lvbmFsRmVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZm9ybWFJbnZvaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9ncmVzc1BheW1lbnRSZXF1aXJlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uYWxBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbmFsRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mQ29tcG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb29mT2ZEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdGVjdGl2ZVNlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUNvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RpdmVTZXJ2aWNlLUhlYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3ZpZGVIb3VzZWhvbGRJZGVudGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm92aWRlTmFtZUFuZEFkZHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1bGxpbmdFeWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQWlyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdW1wQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdXJjaGFzZU9wdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlEaXNjb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbnRpdHlTdXJjaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxoZWFkSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhbXBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlUmVkdWN0aW9uQm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmViYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1CaWxsQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWJpbGxlZERyYXlhZ2UtRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYmlsbGVkRHJheWFnZS1PcmlnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjaXBpZW50QWRkcmVzc0NvcnJlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2xhbWF0aW9uQ2VudGVySGFuZGxpbmdDaHV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjbGFtYXRpb25GZWRlcmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblNoYXJlZFJlc3BvbnNpYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYW1hdGlvblN0YXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbmNpbGlhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb25uZWN0Y2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25Db25zaWduZWVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29uc2lnbkRlbGl2ZXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvbnNpZ25tZW50Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvb3BlcmluZ0F0T3duZXJzT3JTaGlwcGVyc0V4cGVuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29yZEZpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5RmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNyYXRpbmdSZWNvb3BlcmluZy1EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjcmF0aW5nUmVjb29wZXJpbmctT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdIYXJkd2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdMaWNlbnNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWN1cnJpbmdTb2Z0d2FyZU1haW50ZW5hbmNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWRpc3RyaWJ1dGlvbkFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVkdWN0aW9uUHJlcGFsbGV0aXplZENhcmdvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVmZXJDYXJnb1BlcmNlbnREaWZmZXJlbnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWZlck1haW50ZW5hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWVsQ2FibGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZWxEZXBvc2l0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0aW9uTWVjaGFuaWNhbERldGVudGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZ1cmJpc2hpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZ2FpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZFeHBvcnRGb3JSZWVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25PZkV4cG9ydFNoaXBtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeUZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVndWxhdG9yeVJlcXVpcmVkUmVmdW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpYWJpbGl0eUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsaW5xdWlzaG1lbnRDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGlxdWlkYXRpb25BbnRpLUR1bXBpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uQ291bnRlcnZhaWxpbmdEdXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVGF4QW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxEdWVVU0N1c3RvbXNTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxpcXVpZGF0aW9uVG90YWxGZWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRhbERlZHVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudHNBbmRMZWFzZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFja0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEJ1eWVyc0V4cGVuc2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpckF0Q3VzdG9tZXJFeHBlbnNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBhaXJBdEdvdmVybm1lbnRFeHBlbnNlQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdFZpYUNhbmFkYSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWFyY2hEZXZlbG9wbWVudEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzZWxsZXJzRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lkZW50aWFsUGljay11cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzcG90dGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdG9ja2luZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdHJpY3RlZEFydGljbGVGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5hYmxlQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5DYXJnb0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuZWRMb2FkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXdvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZGluZ0F0dGVuZGFudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9ja3lNb3VudGFpbkJ1cmVhdTU4M0l0ZW0xMTAwQXJiaXRyYXJ5Q2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsT3V0QWRqdXN0bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sbFJlYmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUm95YWx0aWVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWx2YWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1lLURheVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhdHVyZGF5UGljay1VcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2F0dXJkYXlQaWNrLXVwT3JEZWxpdmVyeUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NhbGVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYWxlQ2hhcmdlVW5sb2FkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY3JhcEFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VjdXJpdHlTaWduYXR1cmVTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWdyZWdhdGluZ1NvcnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsZlVubG9hZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJIYW5kQ2FycnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VBc3Npc3RhbmNlUHJvZ3JhbVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNoYXJnZVdpdGhDYXNoRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VVcGdyYWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXQtdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoZWFyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVlcEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckxvYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQW5kQ291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJMb2FkQ2FycmllckNvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyTG9hZENvbnNpZ25lZVVubG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nQW5kSGFuZGxpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBzaWRlUGlja3VwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwVG9TdG9ja1F1YWxpdHlBdWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvdGJsYXN0aW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaHJpbmthZ2VBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNocmlua0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hyaW5rLVdyYXBDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3Rvck9yaWdpbmF0aW9uUG9ydE9mRGViYXJrYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUZhY3RvclBvcnRPZkVtYmFya2F0aW9uRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZUludm9pY2VBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVBpY2stdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbmdsZVNoaXBtZW50RmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGVldmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0UmFpbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xpcFNoZWV0VHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNsaXBTaGVldFVubG9hZGluZ0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2xvdHRpbmdBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNtYWxsT3JkZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvZnR3YXJlU3VwcG9ydFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvdXJjZUluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxCdXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDaXJjdXNUcmFpbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbERldGVudGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEVxdWlwbWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZpbmlzaENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEZyZWlnaHRTdXBwbGVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbEhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsTWlsZWFnZU1vdmVtZW50cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBhY2thZ2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFBlcm1pdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxQdW1wQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsU2VhbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFNlcnZpY2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVGVzdEVxdWlwbWVudENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFRvb2xpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwZWNpYWxUb29saW5ncmV3b3JrY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWFsVHJhaW5Nb3ZlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BlY2lhbFZlaGljbGVSZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY2F0aW9uUmV2aWV3Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcGVjaWZpY0R1dHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwbGl0UGljay11cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BsaXRQaWNrLVVwQXRQaWVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9vbENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BvdHRpbmdPZlRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwcmVhZGVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFtcEZlZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbXBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YW5kYnlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlTWV0cm9wb2xpdGFuVHJhbnNpdEF1dGhvcml0eVN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVNb3RvckZ1ZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU2FsZXNDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbWluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RlbmNpbGluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcGNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcC1vZmZBdERlc3RpbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkF0T3JpZ2luYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3Atb2ZmQXRQaWVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wLW9mZkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcHBpbmdJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0b3JhZ2VJblRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFpZ2h0ZW5pbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmFwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZWV0TGFtcHNDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmlwcGluZ1NvcnRpbmdBbmRDb25zb2xpZGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdHVmZmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3R1ZmZpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb0Nvb3BlcmF0aXZlQWR2ZXJ0aXNpbmdBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmplY3RUb1RheE9uUmVzYWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWZmZXJhbmNlV2FyZWhvdXNlQ2hhcmdlRXhwb3J0T3JJbXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Z2FyRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdW1PZkFkZHNBbmREZWR1Y3RzVG9NYWtlTWFya2V0VmFsdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1bmRheU9ySG9saWRheVBpY2stdXBPckRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlckJhZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwZXJ2aXNvckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsRHV0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxlbWVudGFsSXRlbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZXR5Qm9uZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dlbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN3aXRjaENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dpdGNoaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ2FyQWxsb3dhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rUmVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXJwaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4RGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1BaXJwb3J0VGF4T3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtQmV2ZXJhZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1DaXR5U2FsZXNUYXhPbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhDcmVkaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtRGVzdGluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1FeGNpc2VUYXgtT3JpZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtRmVkZXJhbEV4Y2lzZVRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUZlZGVyYWxFeGNpc2VUYXhPblRpcmVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtR292ZXJubWVudGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtSGFuZGxpbmdDaGFyZ2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1BbW9ydGl6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheExpYWJpbGl0eS1PbmVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTG9jYWxTYWxlc1RheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LUxvY2FsVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtTWV0cm9wb2xpdGFuVHJhbnNpdFRheCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25NaXNjZWxsYW5lb3VzQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4T25UcmFuc3BvcnRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVJlZ3VsYXRvcnlUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TYWxlc2FuZFVzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVNhbGVzVGF4U3RhdGVBbmRMb2NhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4LVN0YXRlSGF6YXJkb3VzU3Vic3RhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXgtU3RhdGVUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1TdXBlckZ1bmRFeGNpc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1Vc2VUYXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheC1WYWx1ZUFkZGVkVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWFGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlY2hub2xvZ3lFeGNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZWdyYW1DaGFyZ2ViYWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWxlcGhvbmVDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVwaG9uZS1EZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXBob25lLU9yaWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcGVyYXR1cmVQcm90ZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wb3JhcnlBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBvcmFyeVZvbHVudGFyeUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVuZGVyZWRBc1RydWNrbG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsRGlmZmVyZW50aWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hbEhhbmRsaW5nQ2hhcmdlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYWxTZXJ2aWNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtc0FsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdGluZ1NlcnZpY2VzQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UXVhbGlmaWNhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhpcmRQYXJ0eVBhbGxldHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRBbGxvd2FuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocm91Z2hwdXRDb250YWluZXJDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRocnV3YXlDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpY2tldGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvYmFjY29Qcm9kdWN0c1JlcG9ydENoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVE9GQ1NlcnZpY2VDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xpbmdSZXdvcmtDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvb2xzRm9yUHJpbnRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsQXNzZXNzb3JpYWxDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbER1ZVVTQ3VzdG9tc1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsRmVlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxJbnZvaWNlQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnROb24tVVNEb2xsYXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RhbEludm9pY2VBbW91bnRVU0RvbGxhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdGFsTWF0ZXJpYWxJbnZvaWNlQW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjaW5nSW5ib3VuZFZpYU90aGVyQ2FycmllcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWNpbmdTZXJ2aWNlRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFja1N0b3JhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlSW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXJSZW50YWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zZmVyQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2Zlck9mTGFkaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZENoYXJnZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWlzc2lvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25BbmRTZXR1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25DaGFyZ2VNaW5pbXVtUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNwb3J0YXRpb25EaXJlY3RCaWxsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblRoaXJkUGFydHlCaWxsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRhdGlvblZlbmRvclByb3ZpZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmltbWluZ0NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tEZXRlbnRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrbG9hZERpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJuaW5nQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUd28tRGF5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHdvRG9vclBpY2tVcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5hYnNvcmJlZFN3aXRjaGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdGl6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVubG9hZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5sb2FkaW5nTGFib3JDaGFyZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRpbmdSZWxvYWRpbmdDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2FsZWFibGVNZXJjaGFuZGlzZUFsbG93YW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zY2hlZHVsZWRGZWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVwQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVc2FnZVBsYW5EZXRhaWxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVTQ3VzdG9tc1NlcnZpY2VGbGF0QXNzaXN0QW1vdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVU0N1c3RvbXNTZXJ2aWNlTWF4aW11bUFzc2lzdEFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNEQUluc3BlY3RlZFN0YW1waW5nQ2VydGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlQ2hhcmdlVG9vbGluZ1BlcnNvbm5lbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlLVNwZWNpYWxUeXBlRmxhdENhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVVNWZWhpY2xlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYW5DbGVhbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVoaWNsZU9yZGVyZWRCdXROb3RVc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZWhpY2xlUHJlcENoYXJnZUNvdXJ0ZXN5RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVSb2FkQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW5kb3JGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZW50aW5nSW5zdHJ1Y3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWaXJnaW5Jc2xhbmRUcmFuc2ZlckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm9sdW1lRGlzY291bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvbHVudGFyeUNvbnRyaWJ1dGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FpdGluZ1RpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcmVob3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FyZWhvdXNpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhcnJhbnRpZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhclJpc2tDcmV3SW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrSW5zdXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXJSaXNrU3VyY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXN0ZWRGdXRpbGVUcmlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXRlcm1lbG9uRmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsQW5kSW52b2ljZURpc3RyaWJ1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2VhdGhlclByb3RlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldlaWdodFZlcmlmaWNhdGlvbkNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQnJlYWtidWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hhcmZhZ2UtQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaGFyZmFnZUhhbmRsaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWRlQXJlYVRlbGVwaG9uZVNlcnZpY2VVc2FnZUNyZWRpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2lsbENhbGxDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldyaXR0ZW5Qcm9vZk9mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlgtcmF5Q2hhcmdlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiPgorICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5UmFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ik1vbmV0YXJ5TGltaXQiLz4KKyAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNpc01vbmV0YXJ5UmFuZ2UiIHR5cGU9IkJhc2lzTW9uZXRhcnlSYW5nZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlSYW5nZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWluaW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTWF4aW11bU1vbmV0YXJ5VmFsdWUiIHR5cGU9IkRlY2ltYWwyMV82Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlSYW5nZSIgdHlwZT0iTW9uZXRhcnlSYW5nZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlMaW1pdCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdFZhbHVlIiB0eXBlPSJEZWNpbWFsMjFfNiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iQ3VycmVuY3kiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkIiB0eXBlPSJTaWduaWZpY2FuY2VDb2RlIiB1c2U9Im9wdGlvbmFsIi8+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNpZ25pZmljYW5jZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlMaW1pdCIgdHlwZT0iTW9uZXRhcnlMaW1pdCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHlwZU9mQWxsb3dhbmNlT3JDaGFyZ2UiPgorICAgICAgICA8eHNkOmNob2ljZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5QWxsb3dhbmNlT3JDaGFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICA8L3hzZDpjaG9pY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJUeXBlT2ZBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUXVhbnRpdHlBbGxvd2FuY2VPckNoYXJnZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iUmF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUXVhbnRpdHlNb25ldGFyeVZhbHVlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIiB0eXBlPSJRdWFudGl0eUFsbG93YW5jZU9yQ2hhcmdlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlUGVyVW5pdCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlVuaXRQcmljZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlQmFzaXMiIHR5cGU9IkRlY2ltYWwxOF8zIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlVuaXRPZk1lYXN1cmVtZW50Ii8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlIiB0eXBlPSJSYXRlIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkRlY2ltYWwxOF8zIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGVjaW1hbCI+CisgICAgICAgICAgICA8eHNkOnRvdGFsRGlnaXRzIHZhbHVlPSIxOCIvPgorICAgICAgICAgICAgPHhzZDpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0iMyIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTW9uZXRhcnlWYWx1ZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTW9uZXRhcnlBbW91bnQiIHR5cGU9IkRlY2ltYWwyMV82Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkN1cnJlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlJhdGVPZkV4Y2hhbmdlRGV0YWlsIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNb25ldGFyeVZhbHVlIiB0eXBlPSJNb25ldGFyeVZhbHVlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlQ3VycmVuY3kiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGFyZ2V0Q3VycmVuY3kiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJDdXJyZW5jeSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbnZlcnNlUmF0ZU9mRXhjaGFuZ2UiIHR5cGU9IkRlY2ltYWwxOV85Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlT2ZSYXRlT2ZFeGNoYW5nZSIgdHlwZT0ieGNibERhdGV0aW1lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJMaXN0T2ZSYXRlT2ZFeGNoYW5nZVJlZmVyZW5jZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlJlZmVyZW5jZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSYXRlT2ZFeGNoYW5nZURldGFpbCIgdHlwZT0iUmF0ZU9mRXhjaGFuZ2VEZXRhaWwiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRGVjaW1hbDE5XzkiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgICAgICAgIDx4c2Q6dG90YWxEaWdpdHMgdmFsdWU9IjE5Ii8+CisgICAgICAgICAgICA8eHNkOmZyYWN0aW9uRGlnaXRzIHZhbHVlPSI5Ii8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWZlcmVuY2UiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlJlZmVyZW5jZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVmZXJlbmNlIiB0eXBlPSJMaXN0T2ZSZWZlcmVuY2UiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJQZXJjZW50UXVhbGlmaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudCIgdHlwZT0iRGVjaW1hbDEwXzQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmNlbnRhZ2VNb25ldGFyeVZhbHVlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTW9uZXRhcnlWYWx1ZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJjZW50YWdlQWxsb3dhbmNlT3JDaGFyZ2UiIHR5cGU9IlBlcmNlbnRhZ2VBbGxvd2FuY2VPckNoYXJnZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGVyY2VudFF1YWxpZmllciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGVkIiB0eXBlPSJQZXJjZW50UXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcmNlbnRRdWFsaWZpZXIiIHR5cGU9IlBlcmNlbnRRdWFsaWZpZXIiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGVyY2VudFF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtTGlzdENvc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikl0ZW1OZXRDb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjb3VudC1Hcm9zcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY291bnQtTmV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlUHJpY2VBbW91bnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhc2VQcmljZUFtb3VudExlc3NQcmV2aW91c0Rpc2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRNb250aGx5T25BbGxJbnZvaWNlc1Bhc3REdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVQYXltZW50Q2hhcmdlQmFzZUFtb3VudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVlbFJhdGUiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5RGV0YWlsIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBUb0xvY2F0aW9uIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTG9jYXRpb24iLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcEZyb21Mb2NhdGlvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2NoZWR1bGVMaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNpbXBsZVBhY2thZ2VOb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUZXJtc09mRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iQ2FyZ29DbGFzc2lmaWNhdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcnlEZXRhaWwiIHR5cGU9IkRlbGl2ZXJ5RGV0YWlsIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTY2hlZHVsZUxpbmUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNjaGVkdWxlTGluZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2NoZWR1bGVMaW5lIiB0eXBlPSJMaXN0T2ZTY2hlZHVsZUxpbmUiLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNjaGVkdWxlTGluZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY2hlZHVsZUxpbmVJRCIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGVkIiB0eXBlPSJTaGlwbWVudFN0YXR1c0V2ZW50Q29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50U3RhdHVzUmVhc29ucyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZlN0YXR1c1JlYXNvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJRdWFudGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVxdWVzdGVkRGVsaXZlcnlEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZk90aGVyRGVsaXZlcnlEYXRlIj4KKyAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iTGlzdE9mRGF0ZUNvZGVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNjaGVkdWxlTGluZU5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0iVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFJlZmVyZW5jZSIgdHlwZT0ieHNkOmludCIvPgorICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2NoZWR1bGVMaW5lIiB0eXBlPSJTY2hlZHVsZUxpbmUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2hpcG1lbnRTdGF0dXNFdmVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBcHBsaWNhYmxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RZZXRTaGlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWNrT3JkZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyU2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlGb3JQaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluVHJhbnNpdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbGx5U2hpcHBlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbGx5RGVsaXZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudENvbXBsZXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWQiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0YXR1c1JlYXNvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU3RhdHVzUmVhc29uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdGF0dXNSZWFzb24iIHR5cGU9Ikxpc3RPZlN0YXR1c1JlYXNvbiIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RhdHVzUmVhc29uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdGF0dXNSZWFzb25Db2RlZCIgdHlwZT0iU3RhdHVzUmVhc29uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RhdHVzUmVhc29uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU3RhdHVzUmVhc29uIiB0eXBlPSJTdGF0dXNSZWFzb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU3RhdHVzUmVhc29uQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhbmdlZFNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0cnVjdGlvbnNBd2FpdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tc1JlZnVzYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcHR5T25JbnNwZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXN0aW5hdGlvbkluY29ycmVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0UmVzdHJpY3Rpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnRSZXN0cmljdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnROb3RSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEaWZmZXJlbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRvb0xhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY2lkZW50QXR0cmlidXRlZFRvU2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1RoZUJ1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNpZGVudEF0dHJpYnV0ZWRUb1RoZUNhcnJpZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGVDb2RlZCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iRGF0ZUNvZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEYXRlQ29kZWQiIHR5cGU9Ikxpc3RPZkRhdGVDb2RlZCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGF0ZUNvZGVkIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlIiB0eXBlPSJ4Y2JsRGF0ZXRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkRhdGVRdWFsaWZpZXIiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkRhdGVDb2RlZCIgdHlwZT0iRGF0ZUNvZGVkIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWQiIHR5cGU9IkRhdGVRdWFsaWZpZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRGF0ZVF1YWxpZmllciIgdHlwZT0iRGF0ZVF1YWxpZmllciIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJEYXRlUXVhbGlmaWVyQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjM2MDMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUzMCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMzY1NjMwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjAyODMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjUyODMxIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzNjU2MjgzMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMXN0U2NoZWR1bGVTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlbGVyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2VwdGFuY2VEYXRlT2ZEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXB0YW5jZURhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NlcHRhbmNlRGF0ZVRpbWVPZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudEJlbmVmaXRBZ2VMaW1pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjaWRlbnRCZW5lZml0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NpZGVudERhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50SW5zdXJhbmNlRWxpbWluYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2lkZW50TGlmZXRpbWVCZW5lZml0UXVhbGlmaWNhdGlvbkFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudGFudHNPcGluaW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudENsb3NlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdNZXRob2RvbG9neUNoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjY291bnRpbmdQZXJpb2RFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nUGVyaW9kU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVHJhbnNhY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nVmFsdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50aW5nWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudE9wZW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjb3VudHNSZWNlaXZhYmxlLVN0YXRlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFja25vd2xlZGdtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3F1aXNpdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGlvbkVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdGl2aXR5UmVwb3J0aW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0aXZpdHlQZXJpb2REYXRlUmFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsQXJjaGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyaXZhbERhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZURhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY3R1YWxQb3J0T2ZFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmVsZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWN0dWFsUmV0dXJuVG9Xb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFjdXRlTWFuaWZlc3RhdGlvbk9mQUNocm9uaWNDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGRyZXNzUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGpvdXJubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkQ29udGVzdGFiaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdGVkRGVhdGhCZW5lZml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0ZWRIaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RlZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50RWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRqdXN0bWVudFBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvY2Vzc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZGp1c3RtZW50UHJvbWlzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkanVzdG1lbnRUb0JpbGxEYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWRtaW5pc3RyYXRvck9yZGVyZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZG1pc3Npb25EYXRlQW5kT3JUaW1lRXhwZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkb3B0aW9uRGF0ZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQWZ0ZXJEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2aXNlQmVmb3JlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFkdmlzZUNvbXBsZXRlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2VPbkRhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZpc2luZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWdyZWVtZW50VG9QYXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG90bWVudFBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbGxvd2FibGVFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsbG93ZWRSZW5ld2FsRHVyYXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZUJhc2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFsdGVybmF0ZVByb2JsZW1SZXNvbHV0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbHRlcm5hdGl2ZUR1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuYWx5c2lzTW9udGhFbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFuZXN0aGVzaWFBZG1pbmlzdHJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW5uaXZlcnNhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydERlbGlucXVlbnRPbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydER1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydEZpbGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFubnVhbFJlcG9ydE1haWxpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXRpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBbm51aXR5Q29tbWVuY2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQW50aWNpcGF0ZWRDbG9zaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBsaWFuY2VQbGFjZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2FudFNpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uTG9nZ2VkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb25TdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcG9pbnRtZW50RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcHBvaW50bWVudEV4cGlyeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJhaXNhbE9yZGVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsT2ZmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcHJvdmFsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJyZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUF0SW5pdGlhbFBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZUVhcmxpZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVPZlRyYW5zcG9ydExlYWRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFycml2YWxEYXRlVGltZVVsdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsSW5Db3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnRlcmlhbEJsb29kR2FzVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZW1ibHlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXNzZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2V0QW5kTGlhYmlsaXR5U2NoZWR1bGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NldERvY3VtZW50YXRpb25FeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3NpZ25lZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzc2lnbm1lbnRSZWNvcmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXR0ZW5kYW5jZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXVkaWVuY2VEZWZpY2llbmN5UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZEFmdGVyU3BsaXREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdWRpdFBlcmlvZFByaW9yVG9TcGxpdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0aW9uRGF0ZVRpbWVPZkRvY3VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRoZW50aWNhdGlvblZhbGlkYXRpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXV0aG9yaXphdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF1dG9tYXRpY1ByZW1pdW1Mb2FuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHlEdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmFpbGFiaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF2ZXJhZ2VEZWxpdmVyeURlbGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdmVyYWdlUGF5bWVudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXdhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhY2tPbk1hcmtldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja09yZGVyRGVsaXZlcnlEYXRlVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFsYW5jZURhdGVUaW1lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYWxhbmNlU2hlZXREYXRlTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlbGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVDb21wbGV0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFzZWxpbmVTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVmb3JlSW52ZW50b3J5SXNSZXBsZW5pc2hlZEJhc2VkT25TdG9ja0NoZWNrTGVhZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2lubmluZ0xheURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlZ2luVGhlcmFweSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpY2lhcnlzQmFua3NEdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0QWRqdXN0bWVudEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdEFkanVzdG1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBZGp1c3RtZW50U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRBcHBsaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdENoYW5nZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0Q3JlZGl0U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXREZWJpdEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdERlYml0U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRQYXltZW50c1Rlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFJlbGVhc2VBdXRob3JpemF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdHNQYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0VHJhbnNmZXJFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUcmFuc2ZlclBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFRyYW5zZmVyU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlR3Jvc3NXZWVrbHlBbW91bnRFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlbmVmaXRUeXBlTmV0V2Vla2x5QW1vdW50RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZW5lZml0UGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVuZWZpdFBlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVzdEJlZm9yZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlc3RUaW1lVG9DYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWFubnVhbFRlcm1pbmFsSW5zcGVjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpZEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlkT3BlbkRhdGVCaWRzV2lsbEJlT3BlbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWRQcmljZUV4Y2VwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbGVkVGhyb3VnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsbE9mTGFkaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlydGhEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmxhbmtzVmFsdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVlcHJpbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvYXJkT2ZEaXJlY3RvcnNJbmNvbXBsZXRlQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9hcmRPZkRpcmVjdG9yc05vdEF1dGhvcml6ZWRBc09mR2l2ZW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzTm90Q29tcGxldGVBc09mR2l2ZW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2FyZE9mRGlyZWN0b3JzUmVnaXN0cmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm9va0VudHJ5RGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJvb2tpbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpdGlzaFRoZXJtYWxVbml0VGVzdFBlcmZvcm1lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVkZ2V0TGluZUFwcGxpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NDb250cm9sQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVzaW5lc3NPcGVuZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc1Rlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzRG9jayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnV5ZXJzTG9jYWxUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxjdWxhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyQW5uaXZlcnNhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbGVuZGFyWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsQWZ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbEFmdGVyRXhDb3VudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxBZnRlckV4RmFjdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FuY2VsSWZOb3REZWxpdmVyZWRCeVRoaXNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYW5jZWxJZk5vdFB1Ymxpc2hlZEJ5VGhpc0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbElmTm90U2hpcHBlZEJ5VGhpc0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhbmNlbGxhdGlvbkRhdGVUaW1lTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXBpdGFsaXphdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGl0YXRpb25QZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyZ29Cb29raW5nQ29uZmlybWVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcmdvUmVsZWFzZURhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VDb252ZXJ0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2VSZW9wZW5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaENhbGxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXRlZ29yeUNoYW5nZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZWFzZWRPcGVyYXRpb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDZXJ0aWZpY2F0ZUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvbk9mV2VpZ2h0RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlcnRpZmljYXRpb25QZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2VydGlmaWNhdGlvblJldmlzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFuZ2VkQWNjb3VudGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYW5nZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFyZ2VCYWNrRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoYXJnZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhcmdlUGVyaW9kU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGFydE9mQWNjb3VudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hlY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNoZWNrZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaGlsZGJpcnRoRGF0ZUFuZE9yVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hpbGRiaXJ0aERhdGVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNocmlzdGVuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2l0aXplbnNoaXBDaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbUFkbWluaXN0cmF0b3JLbm93bGVkZ2VPZlRoZUluanVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1BZG1pbmlzdHJhdG9yTm90aWZpZWRPZkVtcGxveWVlTGVnYWxSZXByZXNlbnRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xhaW1JbmN1cnJlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTWFkZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltTm90aWZpY2F0aW9uUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltc01hZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsYWltU3RhdGVtZW50UGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGFpbVN0YXRlbWVudFBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGF1c2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyYW5jZURhdGVDdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbGluaWNhbEV4YW1pbmF0aW9uRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRVbnRpbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NpbmdEYXRlT2ZGaXJzdEJhbGFuY2VTaGVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2luZ0RhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zdXJlRGF0ZVRpbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxhdGVyYWxEZXBlbmRlbnRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGF0ZXJhbERlcGVuZGVudEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29sbGVjdGlvbkRhdGVUaW1lRWFybGllc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3Rpb25EYXRlVGltZUxhdGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkUHVtcGluZ0JhbGxhc3REYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbWVuY2VkVGFua0NsZWFuaW5nRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbW1lcmNpYWxSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnlUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGFyaXNvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGlsYXRpb25EYXRlQW5kVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxhaW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRQdW1waW5nQmFsbGFzdERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0ZWRUYW5rQ2xlYW5pbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxldGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QWZ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lTm90QmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21wbGV0aW9uRGF0ZU9yVGltZVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tcGxpYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZGl0aW9uSW5pdGlhbFRyZWF0bWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbmZpbmVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maW5lbWVudEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmluZW1lbnRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uZmlybWF0aW9uRGF0ZUxlYWRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maXJtZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0ZWRPbW5pYnVzQnVkZ2V0UmVjb25jaWxpYXRpb25BY3RDT0JSQSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGVkT21uaWJ1c0J1ZGdldFJlY29uY2lsaWF0aW9uQWN0Q09CUkFFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnNvbGlkYXRlZE9tbmlidXNCdWRnZXRSZWNvbmNpbGlhdGlvbkFjdENPQlJBUXVhbGlmeWluZ0V2ZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclNhZmV0eUNvbnZlbnRpb25Dc2NJbnNwZWN0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2FmZXR5Q29udmVudGlvbkNzY1BsYXRlRXhwaXJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0cmlwcGluZ0RhdGVUaW1lVWx0aW1hdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lclN0dWZmaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGVzdGFiaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbmdlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5nZW5jeUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGludWFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVhdGlvbk9mUGF5U3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51aW5nRWR1Y2F0aW9uUmVxdWlyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRpbnVvdXNDb3ZlcmFnZURhdGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW51b3VzUGFzc2l2ZU1vdGlvbkNQTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RBdWRpdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0QXdhcmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RCaW5kaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb21wbGV0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RDb3N0c1Rocm91Z2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3REZWZpbml0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdEVmZmVjdGl2ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0RXhwaXJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RNYWlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyYWN0UGVyZm9ybWFuY2VEZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RQZXJmb3JtYW5jZVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3RSZS1PcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdHVhbERlbGl2ZXJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJhY3R1YWxTdGFydERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmlidXRpb25QZXJpb2RFbmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uUGVyaW9kU3RhcnREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJpYnV0aW9uc0NlYXNpbmdEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb3ZlcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uUHJpdmlsZWdlRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJzaW9uVG9SZXBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlcnNpb25JbnRvSG9sZGluZ0NvbXBhbnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXJ0ZWRUb0VsZWN0cm9uaWNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb252ZXlhbmNlUmVnaXN0cmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udmljdGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29vcmRpbmF0aW9uT2ZCZW5lZml0c0JlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb29yZGluYXRpb25PZkJlbmVmaXRzRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3JyZWN0ZWREYXRlT2ZCaXJ0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29ycmVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zaWduZXJTaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0RGlzbWlzc2FsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnRFdmVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cnROb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdXJ0UmVnaXN0cmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ292ZXJhZ2VJc3N1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRJbmNvbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0RG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0ZWRTZXJ2aWNlQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNyZWRpdGVkU2VydmljZUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JlZGl0b3JzUmVxdWVzdGVkVmFsdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcmltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3JpbWluYWxTZW50ZW5jZUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDcm9zc2JvcmRlckRhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdW11bGF0aXZlUXVhbnRpdHlTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cmVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50QXV0aG9yaXR5Q29udHJvbFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnREaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudERpc2FiaWxpdHlQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudEluY29tZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExlZ2FsU3RydWN0dXJlRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudExpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRNb250aEVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudE5hbWVFZmZlY3RpdmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJyZW50UmVwb3J0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VycmVudFNjaGVkdWxlRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbnRTY2hlZHVsZVNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1cnRhaWxtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VydGFpbG1lbnREYXRlZnJvbUFkdmljZU9mUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJDb250cmFjdEV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbWVyVmFsdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2FyZ29SZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zQ2xlYXJhbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21zRW50cnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDeWNsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3ljbGVFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN5Y2xlVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQWNjb3VudE1hdHVyZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBY3F1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUFuZE9yVGltZU9mSGFuZGxpbmdFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVBc0F0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQXNzaWdubWVudEZpbGVkRm9yUmVjb3JkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYW5rcnVwdGN5RmlsZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlQmVjYW1lQXdhcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDbGFpbVBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVDb3Vyc2VPZk9ydGhvZG9udGljc1RyZWF0bWVudEJlZ2FuT3JJc0V4cGVjdGVkVG9CZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZWRGaWxlZEZvclJlY29yZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURlZmF1bHRXYXNDdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZURvY3VtZW50YXRpb25PclBhcGVyd29ya09yQm90aFdhc1NlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlSGVsZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUZvcmVjbG9zdXJlUHJvY2VlZGluZ3NJbnN0aXR1dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yZWNsb3N1cmVTYWxlU2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlRm9yVGhlTGFzdFVwZGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeUNhbmNlbGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZUhhemFyZEluc3VyYW5jZVBvbGljeVJlZnVzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVNYXRlcmlhbFVzYWdlU3VzcGVuZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBYmFuZG9ubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQWNxdWlzaXRpb25PZlRpdGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFkdmFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkFwcHJhaXNhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQXNzaWdubWVudEFwcHJvdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZBc3NpZ25tZW50UmVqZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZDbGFpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQ2xvc2luZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGFtYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNlYXNlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGVlZEluTGlldSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRGl2b3JjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRXh0ZW5zaW9uVG9Db252ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcm1Db21taXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZGaXJzdE1vcnRnYWdlUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mRmlyc3RSZWdpc3RyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZpcnN0VW5jdXJlZERlZmF1bHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkZvcmVjbG9zdXJlTm90aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0Q29udGFjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTGFzdERyYXciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZkxhc3RJbnN0YWxsbWVudFJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0UGF5bWVudFJlY2VpdmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMYXN0VXBkYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2FuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZVByb3BlcnR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZMb2NhbE9mZmljZUFwcHJvdmFsT2ZDb252ZXlhbmNlT2ZPY2N1cGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTG9jYWxPZmZpY2VDZXJ0aWZpY2F0aW9uT2ZDb252ZXlhbmNlT2ZEYW1hZ2VkUmVhbEVzdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTWF4aW11bU1lZGljYWxJbXByb3ZlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlT2ZQcm9iYWJsZUluZWxpZ2liaWxpdHlGb3JBc3NpZ25tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZOb3RpY2VPZlJlZmVycmFsRm9yQXNzaWdubWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mTm90aWNlVG9Db252ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mT3JkZXJMZWFkVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUG9zc2Vzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUHJvZHVjdEZhaWx1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZlByb3BlcnR5SW5zcGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyb21CYW5rcnVwdGN5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mUmVwYWlyT3JTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZWl6dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTZXBhcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlT2ZTb3VyY2VEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mU3RhbmRhcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPbldoaWNoQXNzZXRzSnVkZ2VkSW5zdWZmaWNpZW50VG9QYXlDcmVkaXRvcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPdXRzdGFuZGluZ0xvYW5CYWxhbmNlUmVwb3J0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2thZ2luZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUGxhY2VkSW5EaXNmYXZvdXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQb3NzZXNzb3J5QWN0aW9uSW5pdGlhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJhY3RpY2VDZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVQcmFjdGljZUVzdGFibGlzaGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUHJvcGVydHlTb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVhZHlGb3JDb2xsZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlUmVkZW1wdGlvblBlcmlvZEVuZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVSZWZlcnJlZFRvQXR0b3JuZXlGb3JGb3JlY2xvc3VyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVUaHJvdWdoV2hpY2hQcm9wZXJ0eVRheGVzSGF2ZUJlZW5QYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mRGlzY291bnRUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZVRpbWVPZkludGVyZXN0RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVGltZU9mTGF0ZXN0QWNjb3VudHNGaWxpbmdBdFB1YmxpY1JlZ2lzdHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRlVG90YWxBbW91bnRPZkRlbGlucXVlbmN5UmVwb3J0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVWb2x1bnRhcnlDb252ZXlhbmNlQWNjZXB0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVXaGVuQ29udGFpbmVyRXF1aXBtZW50QmVjb21lc0RvbWVzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYXlsaWdodE92ZXJkcmFmdFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRheXNPZk9wZXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVhdGhEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWJpdEFkdmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGViaXRWYWx1ZURhdGVSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlYnRJbmN1cnJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjaXNpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVjbGFyYXRpb25QcmVzZW50YXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWNsYXJhdGlvblJlZmVyZW5jZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVkdWN0aWJsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVlZE5vdEF2YWlsYWJsZUFzT2ZHaXZlbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlZmVycmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZERpc3RyaWJ1dGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmZXJyZWRQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVmaW5pdGlvbk9mRGlzYWJpbGl0eUR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxheWVkQmlsbGluZ05vdERlbGF5ZWRQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxldGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlck5vdEJlZm9yZUFuZE5vdEFmdGVyRGF0ZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5QXBwb2ludG1lbnREYXRlQW5kVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZTFTdFNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lQ3VycmVudFNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRGVmZXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFYXJsaWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZUV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lRmlyc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVMYXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVQcm9taXNlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUHJvbWlzZWRGb3JQcmlvclRvQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lU2NoZWR1bGVkRm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlPcmRlcklzc3VlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5UmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVRpY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVuaWFsRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZW5pYWxSZXNjaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnRtZW50QWRtaXNzaW9uRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0bWVudERpc2NoYXJnZURhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydG1lbnRPZkxhYm9yV2FnZURldGVybWluYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVFYXJsaWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwYXJ0dXJlRGF0ZVRpbWVGcm9tTGFzdFBvcnRPZkNhbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lU2NoZWR1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVEYXRlVGltZVVsdGltYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXBhcnR1cmVGcm9tU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVwb3NpdERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZXNwYXRjaERhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlc3BhdGNoTm90ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRldHJpbWVudGFsSW5mb3JtYXRpb25SZWNlaXB0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlyZWN0SW50ZXJjaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmlsaXR5V2FpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYnVyc2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NoYXJnZUFuZExvYWRpbmdDb21wbGV0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2hhcmdlLVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NyZXBhbmN5RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2VtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc21pc3NhbERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3Bvc2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNwb3NpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzdHJpYnV0b3JFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3RyaWJ1dG9yVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpdmlkZW5kQXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRBbWVuZG1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdEV4cGlyeURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudGFyeUNyZWRpdElzc3VlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnRhcnlDcmVkaXRQcmVzZW50YXRpb25QZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9jdW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50TWVzc2FnZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudFJlY2VpdmVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvY3VtZW50UmVxdWVzdGVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90RGVsaXZlckFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb05vdERlbGl2ZXJCZWZvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvTm90U2hpcEJlZm9yZUV4Q291bnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG9Ob3RTaGlwQmVmb3JlRXhGYWN0b3J5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJhd2luZ1JldmlzaW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJvcEFjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BwZWRUb0xlc3NUaGFuSGFsZlRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVMYXN0Q29tcGxldGVJbnN0YWxsbWVudFBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZURhdGVPZkZpcnN0UGF5bWVudFRvUHJpbmNpcGFsQW5kSW50ZXJlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1ZVRvQ3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cGxpY2F0ZUJpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFYXJsaWVzdEZpbGluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybGllc3RTYWxlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVhcmx5V2l0aGRyYXdhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWFybmluZ3NFZmZlY3RpdmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVkdWNhdGlvbkJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25FbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZHVjYXRpb25TdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVmZmVjdGl2ZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFZmZlY3RpdmVEYXRlT2ZDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVsZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbGlnaWJpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRWxpZ2liaWxpdHlFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtYmFya2F0aW9uRGF0ZUFuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUG9zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVkSW5UaGlzUHJvZmVzc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVFZmZlY3RpdmVEYXRlT2ZDb3ZlcmFnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95ZWVMYWlkT2ZmIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZVRlbXBvcmFyeUxhaWRPZmZQZXJpb2RTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlVGVtcG9yYXJ5TGFpZE9mZlBlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVlV2FnZXNDZWFzZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyS25vd2xlZGdlT2ZUaGVJbmp1cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveWVyUmVwb3J0ZWRJbmp1cnlUb0NsYWltQWRtaW5pc3RyYXRvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW1wbG95bWVudFBvc2l0aW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50T3JIaXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3ltZW50UG9zaXRpb25TdGFydERhdGVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVtcGxveW1lbnRQcm9mZXNzaW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kQXZhaWxhYmlsaXR5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZU9mU3VwcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kRGF0ZVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kaW5nTGF5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZHcmFjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZMYXN0RmlzY2FsWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZWRDZXJ0aWZpY2F0ZUlzc3VlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kb3JzZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbmdpbmVlcmluZ0NoYW5nZUxldmVsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5naW5lZXJpbmdEYXRhTGlzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5yb2xsbWVudFNpZ25hdHVyZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudHJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50cnlEYXRlRXN0aW1hdGVkQ3VzdG9tcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50Q29sbGVjdGlvbk9yUGlja1VwRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lRWFybGllc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudENvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50TG9nRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFBvc2l0aW9uaW5nRGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UHJlVHJpcERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlY29uZGl0aW9uaW5nRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFJlcGFpclJlYWR5RGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXF1aXBtZW50UmV0dXJuUGVyaW9kRXhwZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVxdWlwbWVudFN0b2NrQ2hlY2tEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXNjYWxhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzY2FsYXRpb25TdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGFibGlzaGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVDb21tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZEFjY2VwdGFuY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJpdmFsRGF0ZVRpbWVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRpb25EYXRlT3JUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLUZpcnN0UHJpb3JNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVkQ29tcGxldGlvbi1TZWNvbmRQcmlvck1vbnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRDb21wbGV0aW9uLVRoaXJkUHJpb3JNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3RydWN0aW9uRGF0ZUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0ZU9mQmlydGhFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5RGF0ZVRpbWVFc3RpbWF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlcGFydHVyZURhdGVUaW1lRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRFc2Nyb3dDbG9zaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRJbW1pZ3JhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFBvaW50T2ZBcnJpdmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb2ludE9mRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRQb3J0T2ZFbnRyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlRXN0aW1hdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFc3RpbWF0ZWRTdGFydC1GaXJzdFByaW9yTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVNlY29uZFByaW9yTW9udGgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVzdGltYXRlZFN0YXJ0LVRoaXJkUHJpb3JNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXN0aW1hdGVQcmVwYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXZhbHVhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV2ZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhhbWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1dGlvbkRhdGVUaW1lUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGl0UGxhbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZENvbnRhaW5lckhpcmVGcm9tRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkRnVuZGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVjdGVkUHJvYmxlbVJlc29sdXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFJlcGx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlY3RlZFZhbHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwZWRpdGVkT24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25EYXRlT2ZFeHRlbnNpb25Ub0Fzc2lnbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVPZkV4dGVuc2lvbnRvRm9yZWNsb3NlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uRGF0ZVRpbWVPZkN1c3RvbXNEb2N1bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwaXJhdGlvbkRhdGVUb1N1Ym1pdFRpdGxlRXZpZGVuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkV4dGVuc2lvblRvQ29udmV5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcmF0aW9uT2ZFeHRlbnNpb25Ub1N1Ym1pdEZpc2NhbERhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGlyYXRpb25PZkZvcmVjbG9zdXJlVGltZWZyYW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZFeHBvcnRMaWNlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBpcnlEYXRlT2ZJbXBvcnRMaWNlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBsYW50YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9ydGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0YXRpb25EYXRlRm9yVGV4dGlsZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cG9zdXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBvc3VyZVNvdXJjZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXh0ZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhY3NpbWlsZUR1ZUJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWx1cmVNb2RlRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZWFzaWJpbGl0eVNpZ25PZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZGVyYWxIaWdod2F5QWRtaW5pc3RyYXRpb25GaHdhSW5zcGVjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZlZUNhcGl0YWxpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZEZhaWx1cmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpZWxkVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlsZUdlbmVyYXRpb25EYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaWxpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsSXNzdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpbmFsUmVjb25jaWxpYXRpb25WYWx1ZUVzdGltYXRlQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYWxTY2hlZHVsZWRQYXltZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxDb3ZlcmFnZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluYW5jaWFsSW5mb3JtYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5hbmNpYWxJbmZvcm1hdGlvblN1Ym1pc3Npb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZU1hbmRhdG9yeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmluaXNoRGF0ZU9yVGltZUVhcmxpZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaW5pc2hEYXRlT3JUaW1lTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENvbnRhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0RGF0ZU9mT3JkZXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW50ZXJlc3RCZWFyaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RJbnRlcmVzdFBheW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SW52b2x2ZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0SXNzdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0TWFya2V0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UGF5bWVudENoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RQYXltZW50RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFByb2R1Y2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFB1Ymxpc2hlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0UmF0ZUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpcnN0U2FsZURhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlyc3RTdWJtaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpc2NhbEFubml2ZXJzYXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0RXh0cmFFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRFeHRyYVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZvcmVjYXN0UGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yZWNhc3RQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9ybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVpZ2h0QmlsbERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mQXdhcmRUb0NvbXBsZXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZBd2FyZFRvRWFybGllc3REZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZkF3YXJkVG9MYXRlc3REZWxpdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk5vdGljZVRvUHJvY2VlZFRvQ29tbWVuY2VtZW50T2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZOb3RpY2VUb1Byb2NlZWRUb0NvbXBsZXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZPcmRlclJlY2VpcHRUb0RlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcm9tRGF0ZU9mT3JkZXJSZWNlaXB0VG9TYW1wbGVSZWFkeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZk9yZGVyUmVjZWlwdFRvU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb21EYXRlT2ZSZWNlaXB0T2ZJdGVtVG9BcHByb3ZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlJlY2VpcHRPZlRvb2xpbmdBaWRzVG9TYW1wbGVSZWFkeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlNhbXBsZUFwcHJvdmFsVG9GaXJzdFByb2R1Y3RTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbURhdGVPZlRvb2xpbmdBdXRob3JpemF0aW9uVG9TYW1wbGVSZWFkeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvbUxhc3RCb29rZWRPcmRlclRvRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bWlnYXRpb25EYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdW5jdGlvbmFsVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnVuZHNBcHByb3ByaWF0aW9uLVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdXR1cmVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdhbGxvbnNQZXJNaW51dGVUZXN0UGVyZm9ybWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb29kc0NvbGxlY3Rpb25PclBpY2tVcERhdGVUaW1lUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29vZHNQb3NpdGlvbmluZ0RhdGVUaW1lRXhwZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUG9zaXRpb25pbmdEYXRlVGltZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdvb2RzUmVjZWlwdERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFkdWF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JvdXBDb250cmFjdEV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikd1YXJhbnRlZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3VhcmFudG9yUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbmRPdmVyRGF0ZVRpbWVQbGFubmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoQ2FwaXRhbFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hGYWJyaWNhdGlvblJlbGVhc2VBdXRob3JpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoUmF3TWF0ZXJpYWxBdXRob3JpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZEZyb21EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaXJlZFVudGlsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9sZEFzT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbGRBc1N0b2NrQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9saWRheVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lc3RlYWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvcml6b25FbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Jpem9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Nvbm5lY3RlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3Nlc0Rpc2Nvbm5lY3RlZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3NwaXRhbEFkbWlzc2lvbkRhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikhvc3BpdGFsRGlzY2hhcmdlRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcm90ZXN0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSWxsbmVzc0JlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbGxuZXNzUmVjb3ZlcnlEYXRlRXhwZWN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltbWlncmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wbGFudGF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBsZW1lbnRhdGlvbkRhdGVUaW1lUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkltcG9ydGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW1wb3J0TGljZW5jZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluYWN0aXZpdHlFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmFjdGl2aXR5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmJvdW5kTW92ZW1lbnRBdXRob3JpemF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jaWRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5jb21lRG9jdW1lbnRhdGlvbkV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29tZUluY3JlYXNlUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvbWVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY29ycG9yYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmNvcnBvcmF0aW9uRGlzc29sdXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluY3VtYmVuY3lQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZGl2aWR1YWxFZHVjYXRpb25QbGFuSUVQIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbi1mb3JjZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb3JtYXRpb25SZWxlYXNlQXV0aG9yaXphdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDbGFpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbENvbXBsZXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxDb250YWN0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kTGFzdERheVdvcmtlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbERpc2FiaWxpdHlQZXJpb2RSZXR1cm5Ub1dvcmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxEaXNhYmlsaXR5UGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGZWVEdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxGaW5hbmNpYWxBY2NvdW50c0ZpbGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50RGF0ZUluaXRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluaXRpYWxQcmVtaXVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsUHJlbWl1bUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5pdGlhbFJlcXVlc3REYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbml0aWFsVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5qdXJ5RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbmp1cnlPcklsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklucXVpcnlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblNlcnZpY2VTdXJ2ZXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNvbHZlbmN5RGlzY2hhcmdlR3JhbnRlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3BlY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxsYXRpb25EYXRlVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdGFsbG1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN0YWxtZW50UGF5bWVudER1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3RydWN0aW9uc09yaWdpbmFsRXhlY3V0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdWZmaWNpZW50QXNzZXRzSnVkZ2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5zdXJhbmNlQ2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RDYXBpdGFsaXphdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVGhyb3VnaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJlc3RQYWlkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVyZXN0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcmVzdFJhdGVWYWxpZGl0eVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbEFzc2Vzc21lbnRBcHByb3ZhbEZvclB1YmxpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJuYXRpb25hbFJldmlld0N5Y2xlU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnJ1cHRpb25FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVycnVwdGlvblN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcnZpZXdlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludGVydmlld2VyU2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlbnRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVudG9yeVJlcG9ydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkludmVzdGlnYXRpb25FbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RpZ2F0aW9uU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZlc3RtZW50TnVtYmVyQWxsb2NhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludml0YXRpb25Ub1RlbmRlckRhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZvaWNlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VEYXRlUmVxdWlyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikludm9pY2VQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW52b2ljaW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJcnJlZ3VsYXJJbnRlcmVzdFBheW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3VlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXRlbUNvbnRyYWN0RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJdGVtQ29udHJhY3RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKb2luZWRFbXBsb3llckRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpvaW5lZEZ1bmREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ2VtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnVkZ21lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktleUV2ZW50Q2FsZW5kYXJZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZXlFdmVudEZpc2NhbFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhYm91cldhZ2VEZXRlcm1pbmF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFjdGl2aXR5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEFubnVhbFJlcG9ydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDYXBpdGFsQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENlcnRpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGFuZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaGVja0ZvckJhbGFuY2VTaGVldFVwZGF0ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RDaXZpbGlhbkZsaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVGb3JBR292ZXJubWVudEFnZW5jeVRvRmlsZUFDbGFpbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdERhdGVPZkFjY291bnRzRmlsZWRBdFB1YmxpY1JlZ2lzdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZU9mT3JkZXJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3REYXRlVG9GaWxlQUNsYWltIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RGF0ZVRvT2JqZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0RXBpc29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZsaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEZvbGxvdy11cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdEluc3VyYW5jZU1lZGljYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RJbnRlcmVzdEJlYXJpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0SXRlbURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TG9nZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWFya2V0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0TWVuc3RydWFsQ3ljbGVTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNZW5zdHJ1YWxQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RNaWxpdGFyeUZsaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE5vdGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdE9mZkhpcmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0T25IaXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBhaWRJbnN0YWxsbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQYXltZW50TWFkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFBoeXNpY2FsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXN0UHJlbWl1bUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByZW1pdW1QYWlkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFByb2R1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RQdWJsaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFB1Ymxpc2hlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTYWxhcnlJbmNyZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFNhbGVEYXRlQW5kT3JUaW1lQW5kT3JQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTY3JlZW5pbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxhc3RTZWVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFZpc2l0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdFhSYXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RBYnNlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdEJhbGFuY2VTaGVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0Q2hlY2tJblRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdERlbGl2ZXJ5RGF0ZWF0UGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RGVsaXZlcnlEYXRlQXRSYWlsUmFtcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0RmlsaW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMYXRlc3RNYXRlcmlhbFNhZmV0eURhdGFTaGVldERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE1ldGVyUmVhZGluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdE9uQm9hcmRDYXJyaWVyRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UHJpY2VBZGp1c3RtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF0ZXN0UmVjZWl2aW5nRGF0ZUN1dG9mZkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVzdFZpc2l0b3JDb25zdWx0YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxheVRpbWVGaXJzdERheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGF5VGltZUxhc3REYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYWRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWFzZUNvbW1lbmNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVhc2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybUVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlYXNlVGVybVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVmdEVtcGxveWVyRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxBY3Rpb25DbG9zZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZWdhbEFjdGlvblN0YXJ0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxlZ2FsU2V0dGxlbWVudFRlcm1zTWV0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVnYWxTdHJ1Y3R1cmVDaGFuZ2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZW5kZXJDcmVkaXRDaGVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGV0dGVyT2ZBZ3JlZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMZXR0ZXJPZkxpYWJpbGl0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpY2Vuc2VFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaWNlbnNlUmVuZXdhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGljZW5zZVJlcXVlc3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGllbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXN0aW5nUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxpc3RQcmljZUNoYW5nZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZGVkb25WZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvYWRpbmdEYXRlVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hblB1cmNoYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FuU2VydmljaW5nVHJhbnNmZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2F0aW9uRXhjZXB0aW9uT3JkZXJOdW1iZXJBc3NpZ25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9zcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG90TnVtYmVyRXhwaXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXN0QWN0aXZpdHlQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbEJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbFJlY2VpcHREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbnRlbmFuY2VDb21tZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWludGVuYW5jZUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFrZWdvb2RDb21tZXJjaWFsRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuYWdlbWVudEF2YWlsYWJsZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmFnZXJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5T3JUYXJnZXRGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeU9yVGFyZ2V0U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0U2hpcE5vdGljZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnVmYWN0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGVPZk1hcnJpYWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXN0ZXJMZWFzZUFncmVlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0ZXJpYWxDaGFuZ2VOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsQ2xhc3NpZmljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdGVyaWFsU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF0dXJpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hdHVyaXR5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4aW11bUNyZWRpdEdyYW50ZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWF0QWdlaW5nUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhaWRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYWxDZXJ0aWZpY2F0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhbEluZm9ybWF0aW9uU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FsSW5mb3JtYXRpb25TeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUNvdmVyYWdlRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWVkaWNhcmVQYXJ0QUVsaWdpYmlsaXR5QmVnaW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBRWxpZ2liaWxpdHlFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRBVGVybWluYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCQ292ZXJhZ2VFZmZlY3RpdmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZWRpY2FyZVBhcnRCRWxpZ2liaWxpdHlCZWdpbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJFbGlnaWJpbGl0eUVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXJlUGFydEJUZXJtaW5hdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZGljYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lZXRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXJnZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGVyUmVhZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlkcG9pbnRPZlBlcmZvcm1hbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtUmVxdWlyZWREaXN0cmlidXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pbmltdW1TaGVsZkxpZmVSZW1haW5pbmdBdFRpbWVPZkRlc3BhdGNoUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaW5pbXVtU2hlbGZMaWZlUmVtYWluaW5nQXRUaW1lT2ZSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb250aEVuZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9udGhUb0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vb3JpbmdEYXRlQW5kVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VlT2ZmaWNpYWxTaWduYXR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3J0Z2FnZWVSZXBvcnRlZEN1cnRhaWxtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9ydGdhZ2VOb3RlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUVhcmx5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0TGlrZWx5RWFybHlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdExpa2VseUxhdGVGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RMaWtlbHlMYXRlU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vc3RSZWNlbnRIZW1vZ2xvYmluT3JIZW1hdG9jcml0T3JCb3RoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3N0UmVjZW50UmVuZXdhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFJldmlzaW9ub3JJbml0aWFsVmVyc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW9zdFJlY2VudFNlcnVtQ3JlYXRpbmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmVkRnJvbUxvY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRlZEV4dGVuc2lvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5lZ290aWF0ZWRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmVnb3RpYXRpb25zU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXRDcmVkaXRTZXJ2aWNlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV0V29ydGhEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0QWN0aXZpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRBbm5pdmVyc2FyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dEFubnVhbE1lZXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnN0YWxsbWVudER1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRJbnRlcmVzdENoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRQYXlJbmNyZWFzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV4dFBheW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRSZXZpZXdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb25Xb3JraW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb1Byb2R1Y3Rpb25TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9Qcm9taXNlQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9TaGlwcGluZ1NjaGVkdWxlRXN0YWJsaXNoZWRBc09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RBZnRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90QmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWNhdGlvbkRhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25PZkRlYXRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RpZmljYXRpb25UaW1lTGltaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdGlmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RSZWdpc3RlcmVkQXNPZkdpdmVuRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik51cnNpbmdIb21lRnJvbSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTnVyc2luZ0hvbWVUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXBhbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NjdXJyZW5jZVNwYW5Gcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPY2N1cnJlbmNlU3BhblRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZlckV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9mZkhpcmVTdXJ2ZXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZIb2xkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZpY2lhbFJhaWxDYXJJbnRlcmNoYW5nZUVpdGhlckFjdHVhbG9yQWdyZWVkVXBvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2ZmLU1hcmtldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRCZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2Zmc2V0RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPZmZzZXRGcm9tQ29vcmRpbmF0ZWRVbml2ZXJzYWxUaW1lVXRjIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbGRlc3RVbnBhaWRJbnN0YWxsbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uQm9hcmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhpcmVTdXJ2ZXlEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbkhvbGQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZDdXJyZW50U3ltcHRvbXNPcklsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uc2V0T2ZTaW1pbGFyU3ltcHRvbXNPcklsbG5lc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ib3VzZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3BlbmluZ0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdGlvbnNDZWFzZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGluaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljRWFybHlGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wdGltaXN0aWNFYXJseVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcHRpbWlzdGljTGF0ZUZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW1pc3RpY0xhdGVTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3B0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJBbWVuZG1lbnRCaW5kaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJDb21wbGV0aW9uRGF0ZVRpbWVVbHRpbWF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZGVyUmVjZWl2ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JkZXJUb1Byb2NlZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxEdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbER1cmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5RmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbEVhcmx5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsRXN0aW1hdGVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbElzc3VlQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbExpc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbmFsbHlTY2hlZHVsZWRTaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5hbE1hdHVyaXR5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxOYW1lQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxQb3N0aW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luYWxSZWNlaXB0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcnRob2RvbnRpY1RyZWF0bWVudFBlcmlvZFJlbWFpbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3J0aG9kb250aWNUcmVhdG1lbnRQZXJpb2RUb3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0LU9mLVBvY2tldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0c2lkZUF1ZGl0b3JzUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyaGF1bGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVycmlkZURhdGVGb3JTZXR0bGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVyVGFyZ2V0QmFzZWxpbmVNb250aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3ZlcnRpbWVFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVydGltZVN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwQ2hhbmdlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3duZXJzaGlwUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5TYXR1cmF0aW9uVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3h5Z2VuVGhlcmFweUV2YWx1YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik94eWdlblRoZXJhcHlGcm9tIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPeHlnZW5UaGVyYXB5VG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhY2tpbmdFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWNraW5nU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkSW5GdWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVGhyb3VnaERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JBY2NydWVkU2lja1BheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZFRocm91Z2hEYXRlRm9yTWluaW11bVBheW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWQtVGhyb3VnaERhdGVGb3JTYWxhcnlDb250aW51YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRUaHJvdWdoRGF0ZUZvclRvdGFsUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZC1UaHJvdWdoRGF0ZUZvclZhY2F0aW9uUGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYWlkLXVwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXBlcndvcmtNYWlsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhcnRpYWxBbm51aXRpemF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJ0aWNpcGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydFRpbWVXb3JraW5nQ2hhbmdlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3REdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhdGllbnRGaXJzdFZpc2l0Rm9yQ29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50Q29tbWVuY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudERhdGVUaW1lRGVmZXJyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnREdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50RWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5pdGlhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50SW5zdHJ1Y3Rpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5bWVudElzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXltZW50UGVyaW9kU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheW1lbnRWYWx1YXRpb25QcmVzZW50YXRpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF5cm9sbERlZHVjdGlvbkRhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXlyb2xsUGVyaW9kQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheXJvbGxQZXJpb2RFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlYWtBY3Rpdml0eVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVlclJldmlld09yZ2FuaXphdGlvblBST0FwcHJvdmVkU3RheUZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlZXJSZXZpZXdPcmdhbml6YXRpb25QUk9BcHByb3ZlZFN0YXlUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVuYWx0eUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5hbHR5RW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZW5kaW5nQXJjaGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyY29sYXRpb25UZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RBbkV2ZW50SXNMYXRlRHVlVG9DdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kQXNzaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEJldHdlZW5DaGFuZ2VzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RDb3ZlcmVkQnlTb3VyY2VEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kRXh0ZW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZGljSW5zcGVjdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZUVuZERhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcmlvZE9mQ2FyZVN0YXJ0RGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kT2ZJbGxuZXNzU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RPdmVyZHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJpb2RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVyaW9kV29ya2VkRm9yVGhlQ29tcGFueSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVybWl0VG9BZG1pdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlcm1pdFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlc3NpbWlzdGljRWFybHlTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGVzc2ltaXN0aWNMYXRlRmluaXNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQZXNzaW1pc3RpY0xhdGVTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwQ29sbGVjdGlvbkRhdGVUaW1lT2ZDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGlja1VwRGF0ZVRpbWVPZkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFjZW1lbnREYXRlUHJldmlvdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYWNlbWVudFBlcmlvZEV4cGlyYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5Bbm5pdmVyc2FyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhbkJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuRW50cnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWREdXJhdGlvbk9mV29ya3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5uZWRSZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuT2ZUcmVhdG1lbnRQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsYW5QYXJ0aWNpcGF0aW9uU3VzcGVuc2lvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuUGVyaW9kRWxlY3Rpb25CZWdpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGxhblBlcmlvZEVsZWN0aW9uRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQbGFuVGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBsdWdnZWRBbmRBYmFuZG9uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvbGljeUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9saWN5RWZmZWN0aXZlT25PckFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFZmZlY3RpdmVPbk9yQmVmb3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb2xpY3lTdXJyZW5kZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xTZXR0bGVtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZ0RhdGVUaW1lT2ZFcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc2l0aW9uaW5nRGF0ZVRpbWVPZkdvb2RzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0aW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdG1hcmtEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3N0LVJlY2xhc3NpZmljYXRpb25FbmRPZlNlY29uZFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvc3QtUmVjbGFzc2lmaWNhdGlvbkZpcnN0UmVwb3J0Q2FyZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uRmlyc3RTZW1pLWFubnVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdC1SZWNsYXNzaWZpY2F0aW9uU2Vjb25kU2VtaS1hbm51YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWFycmFuZ2VkRGVhbE1hdGNoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQXdhcmRTdXJ2ZXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWNlZGluZ1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLWNlcnRpZmljYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZUFjY2VwdGFuY2VEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVmb3JlY2xvc3VyZVNhbGVDbG9zaW5nRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlZ25hbmN5QmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZWduYW5jeUR1cmF0aW9uQWN0dWFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVnbmFuY3lFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1DaGFuZ2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1QYWlkVG9EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVtaXVtUGFpZFRvRGF0ZUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFyYXRpb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uRGlzcGVuc2luZ0RhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZpbGwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbkZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNjcmlwdGlvbklzc3VlRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2NyaXB0aW9uVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVMYXRlc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRhdGlvbkRhdGVPZkdvb2RzRGVjbGFyYXRpb25DdXN0b21zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50YXRpb25Ub0JhbmtydXB0Y3lSZWNlaXZlcnNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVzZW50Q29udHJvbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGVkVG9SZWNlaXZlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRMZWdhbFN0cnVjdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudGx5UmVzaWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRtZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc2VudE5hbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXNlbnRSZXNpZGVuY2VTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQm9va2luZ0RhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0NvdXJ0RXZlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzQ3VycmVudEFjY291bnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c0VtcGxveW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzRW1wbG95bWVudEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNFbXBsb3ltZW50U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzSW52b2ljZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzbHlSZXBvcnRlZERhdGVPZkJpcnRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c2x5UmVzaWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNNZXRlclJlYWRpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c01vbnRoRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXBvcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmV2aW91c1Jlc2lkZW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJldmlvdXNSZXNpZGVuY2VFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzUmVzaWRlbmNlU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXZpb3VzVGVybWluYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUFkanVzdG1lbnRMaW1pdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlQWRqdXN0bWVudFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpY2VCYXNlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlUHJvdGVjdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeUNhcmVQcm92aWRlckJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5Q2FyZVByb3ZpZGVyRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmludGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmlvckNvbnRyYWN0QW5uaXZlcnNhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yQ29udHJhY3RJc3N1ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JIb3NwaXRhbGl6YXRpb25EYXRlc1JlbGF0ZWRUb0N1cnJlbnRTZXJ2aWNlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JJbmNvcnJlY3REYXRlT2ZCaXJ0aCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JOb3RpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yUGxhY2VtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2aWxlZ2VEZXRhaWxzVmVyaWZpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0RhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nRGF0ZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvY2Vzc2luZ0VuZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9jZXNzaW5nU3RhcnREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdEF2YWlsYWJpbGl0eURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3RIZWxkVW50aWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y3Rpb25EYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjdGlvbkluc3BlY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0aW9uTWFudWZhY3R1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWN0TGlmZXNwYW5BdFRpbWVPZlByb2R1Y3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2ZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZENhbGVuZGFyWWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZ3JhbW1lZEZpc2NhbFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2dyZXNzUGF5bWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkQWN0aW9uRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdGVkRm9yZWNsb3N1cmVTYWxlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvamVjdE92ZXJUYXJnZXRCYXNlbGluZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JEZWxpdmVyeVByaW9yVG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yRGVsaXZlcnlXZWVrT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbWlzZWRGb3JTaGlwbWVudFByaW9ydG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21pc2VkRm9yU2hpcG1lbnRXZWVrT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkRhdGVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkVuZERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25GbG9vclN0b2NrUHJvdGVjdC1FbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbkZsb29yU3RvY2tQcm90ZWN0LVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25JbnZvaWNlUGVyZm9ybWFuY2UtU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvbk9yZGVyLUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uT3JkZXItU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblBlcmZvcm1hbmNlLUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUGVyZm9ybWFuY2UtU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblJlcXVlc3RlZERlbGl2ZXJ5LUVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvbW90aW9uUmVxdWVzdGVkRGVsaXZlcnktU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb21vdGlvblNoaXAtRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TaGlwLVN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9tb3Rpb25TdGFydERhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlBY3F1aXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvcGVydHlCdWlsdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdG90eXBlVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvdmlkZXJTaWduYXR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaWNhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJMYXRlc3RQb3NzaWJsZUNoYW5nZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlB1cmNoYXNlT3JkZXJSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHV0SW50b1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YWxpdHlSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJ0ZXJFbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RhRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVvdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1b3RlVG9CZVJlY2VpdmVkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhdGVBZGp1c3RtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYXRlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZU9mRXhjaGFuZ2VEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmF0ZVByaWNlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWNoZWRUb3RhbERlcHRoIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeUZvckluc3BlY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYWxFc3RhdGVQcm9wZXJ0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhbEVzdGF0ZVRheFllYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYnVpbHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2FwdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2YWJsZXNDb2xsZWN0aW9uUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZUF0TG9ja2JveERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY2VpdmVkSW5UaGVNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlckFwcG9pbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjZWl2ZXJzaGlwUGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNlaXZlcnNoaXBSZXN1bHREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNsYXNzaWZpY2F0aW9uRXhpdERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY29tcGxldGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3JkZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWNvdmVyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVjb3ZlcnlGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlY292ZXJ5U3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlLWVudHJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZS1ldmFsdWF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVFeHBvcnRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVyZW5jZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VkSXRlbUNyZWF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmZXJyYWxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcnJlZEZyb20iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmVycmVkVG8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZmluYW5jZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmdXNhbFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0ZXJlZENvbnRyYWN0b3JOdW1iZXJBc3NpZ25tZW50RGF0ZU9yaWdpbmFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWdpc3RyYXRpb25EYXRlT2ZQcmV2aW91c0N1c3RvbXNEZWNsYXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVnaXN0cmF0aW9uT2ZCb2FyZE9mRGlyZWN0b3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWhpcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW1idXJzZW1lbnRDbGFpbUlzc3VlRGF0ZUFuZE9yVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVJbXBvcnRhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdGF0ZW1lbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWluc3VyYW5jZUFjY291bnRpbmdQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlQ292ZXJhZ2VEdXJhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VDdXJyZW50QWNjb3VudFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlSXNzdWVBZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlaW5zdXJhbmNlUGFpZFVwRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVpbnN1cmFuY2VQYXltZW50RnJlcXVlbmN5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWlzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWplY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlRGF0ZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbGVhc2VEYXRlT2ZDdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZURhdGVPZlN1cHBsaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWxlYXNlZFJldHVyblRvV29yayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZWRUb1Zlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZUZyZXF1ZW5jeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsZWFzZU9mSW5mb3JtYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWl0dGFuY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW9kZWxpbmdDb21wbGV0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3YWxEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW50YWxQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbnRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVudFN1cnZleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwYWlyVHVybmFyb3VuZFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGF5bWVudEJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBheW1lbnRTY2hlZHVsZVNlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGxhY2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZW1lbnRFZmZlY3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGx5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcG9ydGluZ0N5Y2xlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBvcnRTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVhbGlmaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkQ29udHJhY3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZERlcGFydHVyZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZpbmlzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlEYXRlVGltZVJlcXVlc3RlZEZvckFmdGVyQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeURhdGVUaW1lUmVxdWVzdGVkRm9yUHJpb3JUb0FuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkRm9yRGVsaXZlcnlXZWVrT2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWRGb3JBZnRlckFuZEluY2x1ZGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcG1lbnREYXRlVGltZVJlcXVlc3RlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RlZEZvclNoaXBtZW50V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1ZXN0ZWRPZmZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkUGljay11cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2V0dGxlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWVzdGVkU3RhcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVlc3RGb3JRdW90YXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2VydmF0aW9uT2ZGYWNpbGl0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzaWRlbnRMaWNlbnNlRWZmZWN0aXZlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZGVudExpY2Vuc2VFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNpZ25hdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXNvbHZlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3REYXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlc3RTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVzdWJtaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXRlbnRpb25SZWxlYXNlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVudGlvblJlbGVhc2VEYXRlVGltZVBhcnRpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGVybWluYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldGlyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHJhbnNtaXNzaW9uVGltZVN0YW1wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5lZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybmVkVG9DdXN0b21lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV0dXJuVG9Xb3JrUGFydFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldmlld1BlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEFkanVzdGVkRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXZpc2VkQWRqdXN0ZWRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNlZEVzdGltYXRlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2aXNpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldm9rZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpZ0Fycml2YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRGdW5kVGF4RXhwaXJ5RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FpbGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5Q2hhbmdlRWZmZWN0aXZlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsYXJ5RGVmZXJyYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbGVhYmxlU3RvY2tEZW1hbmRDb3ZlclBlcmlvZEV4cGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWxlc0RhdGVBbmRPclRpbWVBbmRPclBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FsZXNQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUF2YWlsYWJsZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbXBsZUNvbGxlY3RlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxlUmVxdWlyZWREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYW1wbGVzVG9CZVJldHVybmVkQnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNhbmN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZhY3Rpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXRpc2ZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGaW5pc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5T25PckFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JEZWxpdmVyeU9uT3JCZWZvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvckRlbGl2ZXJ5V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudEFmdGVyQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRGb3JTaGlwbWVudFByaW9yVG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjaGVkdWxlZEZvclNoaXBtZW50V2Vla09mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRJbnRlcmNoYW5nZURlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hlZHVsZWRTdGFydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2NoZWR1bGVSZWxlYXNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTY2hvb2xSZWZ1bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZEFkbWlzc2lvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZERpc2NoYXJnZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5UmF0ZUFkanVzdG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY3VyaXR5U2hhcmVQcmljZUFzT2ZHaXZlbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGVjdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxlY3Rpb25QZXJpb2RTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxCeURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlcnNMb2NhbFRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWlhbm51YWxFbmRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbmRpbmdSb2FkVGltZVN0YW1wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXB0aWNBcHByb3ZhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNvbXBsZXRpb25EYXRlVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUludGVycnVwdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZEVuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZVBlcmlvZFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlUmVxdWVzdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlclNpZ25hdHVyZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldG9mZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2V0dGxlbWVudERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlQXNTcGVjaWZpZWRCeVRoZU9yaWdpbmF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREYXRlRnJvbUludGVybGluZVNldHRsZW1lbnRTeXN0ZW1Pbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50RGF0ZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNldHRsZW1lbnREdWVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXR0bGVtZW50U3RhdHVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZVByaWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGVsZkxpZmVFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwRGF0ZU9yaWdpbmFsbHlTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBEdXJpbmdEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwbWVudERhdGVUaW1lUHJvbWlzZWRGb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVQcm9taXNlZEZvclByaW9yVG9BbmRJbmNsdWRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBtZW50RGF0ZVRpbWVSZXF1ZXN0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBOb3RMYXRlclRoYW5EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE5vdEJlZm9yZURhdGVUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwTm90QmVmb3JlQW5kTm90QWZ0ZXJEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcE9uT3JBYm91dERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwaW5nRGF0ZUFuZE9yVGltZUN1cnJlbnRTY2hlZHVsZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBpbmdEYXRlTm9TY2hlZHVsZUVzdGFibGlzaGVkQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFdlZWtPZkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNodXRJbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NCZW5lZml0QWdlTGltaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpY2tuZXNzQmVuZWZpdFBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NJbnN1cmFuY2VFbGltaW5hdGlvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2lja25lc3NMaWZldGltZUJlbmVmaXRRdWFsaWZpY2F0aW9uQWdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWRldHJhY2tlZFdlbGxib3JlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaWduYXR1cmVSZWNlaXZlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2ltaWxhcklsbG5lc3NPbnNldERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNpbXBsZUludGVyZXN0RHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF1Z2h0ZXJpbmdTdGFydERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvY2lhbFNlY3VyaXR5Q2xhaW1zVmVyaWZpY2F0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZEJvb2tQdWJsaWNhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZURpcmVjdG9yc2hpcFJlZ2lzdHJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNvbGljaXRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlRG9jdW1lbnRDYXB0dXJlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3BhY2luZ09yZGVyVW5pdEFzc2lnbmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb25zb3JlZERlcGVuZGVudEJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTcG9uc29yZWREZXBlbmRlbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwb3VzZVJldGlyZW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNwdWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lRWFybGllc3QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZUVzdGltYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlT3JUaW1lTGF0ZXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVNYW5kYXRvcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZU5vdEFmdGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydERhdGVPclRpbWVOb3RCZWZvcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0RGF0ZU9yVGltZVNjaGVkdWxlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhcnREYXRlVGltZVBsYW5uZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0ZWREb2luZ0J1c2luZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFydE5vRWFybGllclRoYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXJ0Tm9MYXRlclRoYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVSZXNpZGVuY3lEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZVRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0aXN0aWNhbFRpbWVTZXJpZXNEYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0FmdGVyQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNBc3NpZ25tZW50RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdHVzQ2hhbmdlRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c0NvbW1lcmNpYWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c091dHNpZGVQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c1ByaW9yQW5kSW5jbHVkaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9wRGlzdHJpYnV0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RvcFdvcmtBc09mR2l2ZW5EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdG9yZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0dWRlbnRTaWduZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YmNvbnRyYWN0b3JQZXJpb2RPZkhpcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1Ym1pc3Npb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJtaXR0YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRJbnRlcmVzdFBheW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1YnNlcXVlbnRTdWJtaXNzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBlcnNlZGVkRGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsZW1lbnRhbElzc3VlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwbGllcnNBdmVyYWdlQ3JlZGl0UGVyaW9kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXJmYWNlQ2FzaW5nQXV0aG9yaXR5QXBwcm92YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmdlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cnJlbmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VydmV5WWVhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuZGVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvbkVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VzcGVuc2lvblBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3dvcm5BbmRTdWJzY3JpYmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW1wdG9tc09uc2V0UGF0aWVudEFsbGVnZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5c3RlbVN1cnZleSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3lzdGVtVGVzdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFibGVSYXRpbmdFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhaWxDb3ZlcmFnZUJlZ2luIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYWlsQ292ZXJhZ2VFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtzQWNjZXB0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua3NJbnNwZWN0ZWREYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZEVuZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheFBlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF4UG9pbnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXhZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZWNobmljYWxSYXRpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGV4RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVtcG9yYXJ5UHJvc3RoZXNpc0RhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbmRlclN1Ym1pc3Npb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybWluYXRlZERhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXJtaW5hdGlvbk9mRmFjaWxpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zRGlzY291bnREdWVEYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVybXNNZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1zTmV0RHVlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdENvbXBsZXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyZm9ybWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0UGVyaW9kRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXN0U3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZXhhc0xpbmVUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlcmFweSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUVtcGxveWVlQmVnYW5Xb3JrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lSW5VUyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZUxpbWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaW1lTm93RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltZVBlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGl0bGVUcmFuc2ZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG9vbGluZ1JlcXVpcmVkRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVG90YWxTaGVsZkxpZmVQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvdXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWRlRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhZGVTdHlsZVJlZ2lzdHJhdGlvbkRhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluaW5nRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbkNyZWF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNmZXJOb3RlQWNjZXB0YW5jZURhdGVBbmRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2ZlcnJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNoaXBtZW50RGF0ZVRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaXRUaW1lTGltaXRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc21pc3Npb25EYXRlVGltZU9mRG9jdW1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zbWl0dGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHJpcHBpbmdEYXRlQW5kT3JUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc3BvcnRFcXVpcG1lbnRTdHVmZmluZ0RhdGVBbmRPclRpbWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYXZlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJlYXRtZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmVhdG1lbnRFbmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyZWF0bWVudFN0YXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbEJhbGFuY2VQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWFsU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlhbFN0YXJ0RGF0ZUFjdHVhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpYWxTdGFydERhdGVTY2hlZHVsZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydXN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmRlcndyaXRpbmdZZWFyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbmxvYWRlZERhdGVBbmRUaW1lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZGF0aW9uRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsaWRpdHlQZXJpb2QiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbGlkaXR5U3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWxpZFVudGlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1YXRpb25EYXRlVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFsdWF0aW9uRGF0ZUN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlQWRkZWRUYXhDbGFpbXNWZXJpZmljYXRpb25EYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZURhdGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbHVlRGF0ZU9mSW5kZXgiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmJhbFJlcG9ydE5lZWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVyaWZpY2F0aW9uUmVjZWl2ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWNhdGlvblNlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlcmlmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXJzaW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWxSZWdpc3RyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzdGluZ1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlQmVnaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3RpbmdTZXJ2aWNlRW5kIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWb2x1bnRhcnlUZXJtaW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm91Y2hlckRhdGVPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZUVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FnZXNFYXJuZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhZ2VQZXJpb2RFbmREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWdlUGVyaW9kU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYWl0aW5nVGltZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2FycmFudHlFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXYXliaWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWVrRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWxsTG9nUnVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaG9sZXNhbGVDb250cmFjdEVmZmVjdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2hvbGVzYWxlQ29udHJhY3RFeHBpcmF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXaWxsQWR2aXNlQXNPZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGRyYXduRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV2l0aGhlbGREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrRWZmZWN0aXZlU3RhcnREYXRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JraW5nUGVyaW9kRW5kRGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ1BlcmlvZFN0YXJ0RGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya1BlcmlvZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya3NDb21wbGV0aW9uRGF0ZVRpbWVBY3R1YWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtzQ29tcGxldGlvbkRhdGVUaW1lUGxhbm5lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29yc3RUaW1lVG9DYWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyQmVnaW5uaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRHVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyRW5kaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyT2ZPY2N1cnJlbmNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJZZWFyVG9EYXRlIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydElEIiB0eXBlPSJ4c2Q6aW50Ii8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IlRyYW5zcG9ydE1vZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iVHJhbnNwb3J0TWVhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkNhcnJpZXJOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDYXJyaWVySUQiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJJZGVudGlmaWVyIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkN1c3RTaGlwcGluZ0NvbnRyYWN0TnVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZXJ2aWNlTGV2ZWxDb2RlZCIgdHlwZT0iU2VydmljZUxldmVsQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VydmljZUxldmVsQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2hpcHBpbmdJbnN0cnVjdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydExlZ0NvZGVkIiB0eXBlPSJUcmFuc3BvcnRMZWdDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRMZWdDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJUcmFuc2l0RGlyZWN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnROb3RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnQiIHR5cGU9IlRyYW5zcG9ydCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0TW9kZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGVkIiB0eXBlPSJUcmFuc3BvcnRNb2RlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1vZGUiIHR5cGU9IlRyYW5zcG9ydE1vZGUiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TW9kZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckNoYXJ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckV4cHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyaWVnaHRGb3J3YXJkZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRheGkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXJtZWRGb3JjZXNDb3VyaWVyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFja2hhdWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZXN0V2F5LVNoaXBwZXJzT3B0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb29rUG9zdGFsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhYk9yVGF4aSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbW9uSXJyZWd1bGFyQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyaXplZE9jZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cmFjdENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnZlbnRpb25hbE9jZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJQaWNrdXBPckN1c3RvbWVyc0V4cGVuc2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyaXZlYXdheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJpdmVhd2F5U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXVyb3BlYW5PclBhY2lmaWNEaXN0cmlidXRpb25TeXN0ZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFRyYW5zcG9ydEluc3RhbGxhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmx5YXdheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1JlY2VpdmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VvZ3JhcGhpY1JlY2VpdmluZ09yU2hpcHBpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdlb2dyYXBoaWNTaGlwcGluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW5sYW5kV2F0ZXJUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnRlcm1vZGFsLVBpZ2d5YmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGVzc1RoYW5UcmFpbGVyTG9hZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9nYWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYXJpdGltZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlJbnRyYXRoZWF0ZXJBaXJsaWZ0U2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnlPZmZpY2lhbE1haWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGVVbmtub3duIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RvciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW90b3ItQnVsa0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUNvbW1vbkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLUZsYXRiZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdG9yLVBhY2thZ2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3Rvci1WYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik11dGltb2RhbFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuQ29uZmVyZW5jZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuTm9uLUNvbmZlcmVuY2VDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJjZWxQb3N0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaXBlbGluZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9vbGVkQWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sZWRQaWdneWJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFJhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvb2xlZFRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb29sVG9Qb29sIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcml2YXRlQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpdmF0ZVBhcmNlbFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaXZhdGVWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1aWNrdHJhbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlYU9yQWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXJBZ2VudC1UcnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlckFzc29jaWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja1RyYWluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGVhbXNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBsaWVyVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRvd2F3YXlTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldhdGVyT3JQaXBlbGluZUludGVybW9kYWxNb3ZlbWVudCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNwb3J0TWVhbnMiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zcG9ydE1lYW5zQ29kZWQiIHR5cGU9IlRyYW5zcG9ydE1lYW5zQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRNZWFucyIgdHlwZT0iVHJhbnNwb3J0TWVhbnMiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TWVhbnNDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElMQ29udGFpbmVyLUNsb3NlZFRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMjBGdElMQ29udGFpbmVyLU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjQwRnRJTENvbnRhaW5lci1PcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SUxDb250YWluZXItQ2xvc2VkVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJjcmFmdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRnJlaWdodC1CcmVha0J1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJpZGVWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZUNoZW1pY2FsVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlFbmNsb3NlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJGdWxseU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLVdpdGhSb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2dpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXJDdXNoaW9uVW5kZXJGcmFtZU9GIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItRGFtYWdlRnJlZUVxdWlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW50ZXJpb3JCdWxraGVhZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGt0cnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kQnVsa1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEV4dGVuZGFibGVHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1bGtUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrVHJ1Y2tBbmRUYW5rVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnVsa1RydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJ1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fib29zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJnb0FuZFBhc3NlbmdlclZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FyV2l0aENhcmF2YW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNlbWVudFZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npcy1Hb29zZW5lY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyLUNvbnRyb2xsZWRUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FsVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2FzdGVyQ2hlbWljYWxUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWwtQ2FyQ292ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29pbENhck9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUFsdW1pbnVtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUNsb3NlZFRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSGlnaFNpZGVPcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItSW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItTG93U2lkZU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lck9ubHlWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1PcGVuLVNpZGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3BlblRvcC1MZW5ndGhVbnNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVBsYXRmb3JtIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJyZXN0aW5nb25hQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVN0ZWVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtDaGVtaWNhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rRm9vZEdyYWRlLUxpcXVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmtHYXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1VcGdyYWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVZlbnRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyd2l0aEJhZ0hhbmdlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhGbG9vclNlY3VyaW5nUmluZ3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcndpdGhGbHVzaERvb3JzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJ3aXRoSGFuZ2FyQmFycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFNtb290aFNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoV2F2eU9yUmlwcGxlU2lkZXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xsZWRUZW1wZXJhdHVyZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRyb2xVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3ZlcmVkQmFyZ2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNydWRlT2lsVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lckRldGVybWluZWREZWFuc09mVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclJhaWxUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1dC1JbkhlbHBlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVlcFNlYUNoZW1pY2FsVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUtRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRyb3BCYWNrVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHJ5QnVsa0NhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVuZG9mVHJhaW5EZXZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4Y2VwdGlvbmFsVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGZXJyeSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmlzaGluZ1Zlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRml4ZWQtUmFja0RvdWJsZURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZFJhY2stRmxhdEJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkUmFjay1TaW5nbGVEcm9wVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGJlZFNsaWRpbmdUYW5kZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlci1SZW1vdmFibGVTaWRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJ3aXRoSGVhZGJvYXJkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJ3aXRoTm9IZWFkYm9hcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyLUVuZEJ1bGtoZWFkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGNhcldpdGhQZWRlc3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGcmVlemVyVHJ1Y2tBbmRJc290aGVybWljVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kUmVmcmlnZXJhdGVkVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclRydWNrQW5kVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZXplclZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRm9vZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZ1cm5pdHVyZVRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHYXNUYW5rZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnb1Zlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR2VuZXJhdG9yU2V0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLUNvdmVyZWRJbnRlcmlvckJ1bGtoZWFkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1PcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ292ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR3JhaW5jYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmF2ZWxWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhhbGZIZWlnaHRGbGF0UmFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZC1FbmRIZWxwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIZWFkb2ZUcmFpbkRldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaEN1YmVWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvcHBlckNhci1Db3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZFBuZXVtYXRpY0Rpc2NoYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikh5ZHJhbnRDYXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGxlckNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJc290aGVybWljVHJ1Y2tBbmRGcmVlemVyVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSXNvdGhlcm1pY1RydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWN0cnVja2FuZHJlZnJpZ2VyYXRlZHRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Iklzb3RoZXJtaWNWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpcXVlZmllZE5hdHVyYWxHYXNDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMaXF1ZWZpZWRQZXRyb2xldW1HYXNDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2FkT3JVbmxvYWREZXZpY2VPbkVxdWlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jb21vdGl2ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT2NlYW5WZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9pbFByb2R1Y3RzVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuLVRvcE9yRmxhdEJlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Ub3BWYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yZUNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhc3NlbmdlclZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGF0cm9sVmVzc2VsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBpcGVsaW5lIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3dlclBhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb3RlY3RlZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJhaWxCdWxrQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsRXhwcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbHJvYWRNYWludGVuYW5jZU9mV2F5Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsU2lsb1RhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmFpbFRhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhci1FbmRIZWxwZXJVbml0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kRnJlZXplclRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kSXNvdGhlcm1pY1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZnJpZ2VyYXRlZFRydWNrQW5kVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmFibGVTaWRlVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3ZhbFRydWNrQW5kVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaWdpZFRydWNrV2l0aFRhbmtBbmRCdWxrVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlnaWRUcnVja1dpdGhUYW5rQW5kVGFua1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRSYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvYWRTaWxvVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkVGFua2VyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsT24tUm9sbE9mZlZlc3NlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FkZGxlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJEZXRlcm1pbmVkTWVhbnNPZlRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcFRhbmtlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlLURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja0NhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RBSy1SQUsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0ZWVsUHJvZHVjdHNWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lcjI1VG9ubmVXaXRoOTBDdWJpY01ldGVyVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEV4dGVuZGFibGVUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZEdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZFJlbW92YWxUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja0FuZFRyYWlsZXJXaXRoT3BlbmluZ0Zsb29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kRXh0ZW5kYWJsZUdvbmRvbGFUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mQW5kRXh0ZW5kYWJsZVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhdXRsaW5lclRydWNrV2l0aFJlbW92YWJsZVJvb2ZBbmRHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGF1dGxpbmVyVHJ1Y2tXaXRoUmVtb3ZhYmxlUm9vZkFuZFJlbW92YWxUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYXV0bGluZXJUcnVja1dpdGhSZW1vdmFibGVSb29mYW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRheGkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbGVzY29waW5nVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGltYmVyT3JMb2dDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXBBcnRpY3VsYXRlZFRydWNrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaXAtVXB0cnVjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGlwLVVwVHJ1Y2tBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRpcC1VcFRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWN0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQm9hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1DYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRHJ5RnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1FbGVjdHJpY0hlYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSGVhdGVkT3JJbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1Ob3RPdGhlcndpc2VTcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItUG5ldW1hdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVJlZnJpZ2VyYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUNoZW1pY2FscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUZvb2RHcmFkZUxpcXVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1UYW5rLUdhcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaW5pbmdWZXNzZWwiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aDIwT3JNb3JlV2Fnb25zIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbldpdGhNb3JlVGhhbk9uZUFuZExlc3NUaGFuMjBXYWdvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWluV2l0aE9uZVdhZ29uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXIyMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLUZ1bGx5RW5jbG9zZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aERvb3JzTm9Sb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXJTY3JlZW5lZC1XaXRoUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrQW5kVHJhaWxlcldpdGhPcGVuaW5nRmxvb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BIaWdoU2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcExvd1NpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrT3JUcmFpbGVyV2l0aFRpbHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLVZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2tXaXRoT3BlbmluZ0Zsb29yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRFeHRlbmRhYmxlR29uZG9sYVRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrV2l0aE9wZW5pbmdGbG9vckFuZEV4dGVuZGFibGVUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVja1dpdGhPcGVuaW5nRmxvb3JBbmRHb25kb2xhVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHVnYW5kT3JQdXNoYm9hdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmFuLVNwZWNpYWxJbnNpZGVMZW5ndGhXaWR0aE9ySGVpZ2h0UmVxdWlyZW1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtTGFrZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tQ29udGFpbmVyc2hpcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLUxhc2giLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Sb2xsT24tUm9sbE9mZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29vZGNoaXBjYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXb3JrVmVzc2VsIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlcnZpY2VMZXZlbENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdWxrQ29tbW9kaXR5VHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZW1pdW1TdXJmYWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaHJlZURheVNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjlBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckVjb25vbXkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXNpbmVzc0NsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zaWduZWVCaWxsaW5nU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ291cmllckV4cHJlc3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzc1NlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5U2NoZWR1bGVkTmV4dERheUJ5Q2FydGFnZUFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZFNlY29uZERheUJ5Q2FydGFnZUFnZW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeVNjaGVkdWxlZFRoaXJkRGF5QnlDYXJ0YWdlQWdlbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZmlybWF0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZlcnJlZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlbGl2ZXJ5Q29uZmlybWF0aW9uUmV0dXJuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb29yU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlOb3RpZmljYXRpb25Pbmx5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHBlZGl0ZWRTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9vZk9mRGVsaXZlcnlXaXRoU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXJzdENsYXNzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZFNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlUGx1cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhY2tpbmdHcm91bmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklhdGEiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cGVkaXRlZFNlcnZpY2VXb3JsZHdpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4cHJlc3NTZXJ2aWNlV29ybGR3aWRlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNZXRybyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXVsdGl3ZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREYXlBaXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHRGbGlnaHRPdXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5leHREYXlIdW5kcmVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXh0TW9ybmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U2VydmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdmVybmlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeTEwMzBBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlNYWlsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmltYXJ5U2VydmljZUFyZWFOZXh0RGF5Qnk5MzBBTSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpb3JpdHlNYWlsSW5zdXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYU5leHREYXlCeU5vb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPQm94WmlwQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJpbWFyeVNlcnZpY2VBcmVhTmV4dERheUJ5NTAwUE0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaW1hcnlTZXJ2aWNlQXJlYVNlY29uZERheUJ5Tm9vbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFzc2VuZ2VyU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUXVhbGl0eUludGVybW9kYWxIaWdoU3BlZWQ3ME1pbGVzUGVySG91ciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJJbnRlcm1vZGFsQW5kU3RhY2tTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2ME1pbGVzUGVySG91clNlcnZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmlmZXN0RnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2lyY3VzVHJhaW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldvcmtUcmFpbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29tbXV0ZXJTZXJ2aWNlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRob3JpemVkUmV0dXJuU2VydmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtZURheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5QWlyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFyZEdyb3VuZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vjb25kRGF5SHVuZHJlZFdlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRHcm91bmRIdW5kcmVkV2VpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWNvbmRNb3JuaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYXR1cmRheVBpY2t1cCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRhcmRDbGFzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGlnaFNwZWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3JtYWxTcGVlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUG9zdFNlcnZpY2UiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0TGVnQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXRUaGVTdGF0aXN0aWNhbFRlcnJpdG9yeUxpbWl0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmUtQ2FycmlhZ2VUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0Qm9yZGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBdERlcGFydHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXREZXN0aW5hdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUZvdXJ0aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1GaWZ0aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1TaXh0aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1TZXZlbnRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUVpZ2h0aENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW4tQ2FycmlhZ2VUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1GaXJzdENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haUNhcnJpYWdlLVNlY29uZENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1haW5DYXJyaWFnZS1UaGlyZENhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklubGFuZFdhdGVyd2F5VHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyeUNhcnJpZXJBbGxUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZFByZS1DYXJyaWFnZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlLUFjY2VwdGFuY2VUcmFuc3BvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlY29uZE9uLUNhcnJpYWdlVHJhbnNwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYWluQ2FycmlhZ2UtTmludGhDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbi1DYXJyaWFnZVRyYW5zcG9ydCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVRlbnRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLUVsZXZlbnRoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFpbkNhcnJpYWdlLVR3ZWxmdGhDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxc3RDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIybmRDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzcmRDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI1dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI2dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI3dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI4dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI5dGhDYXJyaWVyQWZ0ZXJPcmlnaW5DYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZ2VudHNSb3V0aW5nT3JpZ2luQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3JpZ2luRGVsaXZlcnlDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxZIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsYWdlUmlnaHRzQ2FycmllckFuZEp1bmN0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmlnaW5Td2l0Y2hDYXJyaWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYXVsYWdlTW92ZW1lbnRDYXJyaWVyQW5kSnVuY3Rpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXJBaXJNb3Rvck9yT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9yaWdpbkNhcnJpZXJSdWxlMTFTaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hpcHBlcnNSb3V0aW5nT3JpZ2luQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJtZWRpYXRlU3dpdGNoQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGFzdENhcnJpZXJJblJvdXRlT25SZXR1cm5Sb3V0ZU1vdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmN0aW9uU2V0dGxlbWVudENhcnJpZXJGb2xsb3dpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikp1bmN0aW9uU2V0dGxlbWVudENhcnJpZXJQcmVkZWNlc3NvciIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJUcmFuc3BvcnRFcXVpcG1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlRyYW5zcG9ydEVxdWlwbWVudCIgdHlwZT0iTGlzdE9mVHJhbnNwb3J0RXF1aXBtZW50Ii8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUcmFuc3BvcnRFcXVpcG1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlZCIgdHlwZT0iRXF1aXBtZW50UHJvdmlkZXJDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE93bmVyQ29kZWQiIHR5cGU9IkVxdWlwbWVudE93bmVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRXF1aXBtZW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFNpemVUeXBlQ29kZWQiIHR5cGU9IkVxdWlwbWVudFNpemVUeXBlQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBlbWVudFNpemVUeXBlQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXF1aXBtZW50U3RhdHVzQ29kZWQiIHR5cGU9IkVxdWlwbWVudFN0YXR1c0NvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlZCIgdHlwZT0iRnVsbEluZGljYXRvckNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bGxJbmRpY2F0b3JDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9IkNvbmRpdGlvbnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVxdWlwbWVudE5vdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iTGlzdE9mU2VhbEluZm8iLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ikxpc3RPZkVxdWlwbWVudE1lYXN1cmVtZW50cyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRFcXVpcG1lbnQiIHR5cGU9IlRyYW5zcG9ydEVxdWlwbWVudCIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcXVpcG1lbnRQcm92aWRlckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGlwcGVyU3VwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXJTdXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc29saWRhdG9yU3VwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRlY29uc29saWRhdG9yU3VwcGxpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRoaXJkUGFydHlTdXBwbGllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9yd2FyZGVyU3VwcGxpZWRGcm9tQUxlYXNpbmdDb21wYW55Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGb3J3YXJkZXJTdXBwbGllZEZyb21UaGVSYWlsd2F5c1Bvb2wiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRXF1aXBtZW50T3duZXJDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90Q3VzdG9tZXJPd25lZE9yTGVhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJPd25lZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3VzdG9tZXJPd25lZE9yTGVhc2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlwTGVhc2VkIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFNpemVUeXBlQ29kZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJbENvbnRhaW5lci1DbG9zZWRUb3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIwRnRJbENvbnRhaW5lci1PcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SWxDb250YWluZXItQ2xvc2VkVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSI0MEZ0SWxDb250YWluZXItT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyY3JhZnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFpckZyZWlnaHQtQnJlYWtCdWxrIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJSaWRlVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmFyZ2VPcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhckZ1bGx5RW5jbG9zZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJpbGV2ZWxSYWlsY2FyRnVsbHlPcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmlsZXZlbFJhaWxjYXJTY3JlZW5lZFdpdGhSb29mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb2dpZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQm94Y2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXJDdXNoaW9uVW5kZXJGcmFtZU9mIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItRGFtYWdlRnJlZUVxdWlwcGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW5zdWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCb3hjYXItSW50ZXJpb3JCdWxraGVhZHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJveFBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fib29zZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3NpcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhc3Npcy1Hb29zZW5lY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNsb3NlZENvbnRhaW5lciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkQ29udGFpbmVyLUNvbnRyb2xsZWRUZW1wZXJhdHVyZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2lsLUNhckNvdmVyZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvaWxDYXJPcGVuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1BbHVtaW51bSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUJ1bGsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1DbG9zZWRUb3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1IZWF0ZWRPckluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUhpZ2hTaWRlT3BlblRvcCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVySWMyMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lckljMzBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJJYzQwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUluc3VsYXRlZE9yVmVudGlsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLUxvd1NpZGVPcGVuVG9wIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItT3Blbi1TaWRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLU9wZW5Ub3AtTGVuZ3RoVW5zcGVjaWZpZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1QbGF0Zm9ybSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyUmVzdGluZ09uQUNoYXNzaXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1TdGVlbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmsiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1UYW5rLUNoZW1pY2FscyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstRm9vZEdyYWRlLUxpcXVpZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyLVRhbmstR2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXItVXBncmFkZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lci1WZW50ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhCYWdIYW5nZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoRmxvb3JTZWN1cmluZ1JpbmdzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXJXaXRoRmx1c2hEb29ycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aEhhbmdhckJhcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcldpdGhTbW9vdGhTaWRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyV2l0aFdhdnlPclJpcHBsZVNpZGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250cm9sbGVkVGVtcGVyYXR1cmVUcmFpbGVyLVJlZWZlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbFVuaXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvdmVyZWRCYXJnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ3V0LUluSGVscGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaW1lQ29hdGVkVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRG91YmxlLURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEcm9wQmFja1RyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkR1YWxUcmFpbGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW5kT2ZUcmFpbkRldmljZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXBveHlDb2F0ZWRUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFdXJvUGFsbGV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeGNoYW5nZWFibGVQYWxsZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stRG91YmxlRHJvcFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZpeGVkLVJhY2stRmxhdC1CZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGaXhlZC1SYWNrLVNpbmdsZS1Ecm9wVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGJlZFNsaWRpbmdUYW5kZW0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZsYXRCZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0QmVkVHJhaWxlci1SZW1vdmFibGVTaWRlcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJXaXRoSGVhZGJvYXJkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdEJlZFRyYWlsZXJXaXRoTm9IZWFkYm9hcmRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGbGF0Q2FyLUVuZEJ1bGtoZWFkcyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRmxhdGNhcldpdGhQZWRlc3RhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJvemVuRm9vZFRyYWlsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYXRvclNldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR29uZG9sYUNhci1Db3ZlcmVkLUludGVyaW9yQnVsa2hlYWRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHb25kb2xhQ2FyLU9wZW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdvbmRvbGFDb3ZlcmVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYWxmSGVpZ2h0RmxhdFJhY2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhlYWQtRW5kSGVscGVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGVhZE9mVHJhaW5EZXZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhpZ2hDdWJlVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItQ292ZXJlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9wcGVyQ2FyLUNvdmVyZWQtUG5ldW1hdGljRGlzY2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3BwZXJDYXItT3BlbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSHlkcmFudC1DYXJ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJZGxlckNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU1PMyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9hZE9yVW5sb2FkRGV2aWNlT25FcXVpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY29tb3RpdmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW4xMC45ME1BbmQxMy43NU0iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1vdmFibGVDYXNlLUJldHdlZW42LjE1TUFuZDcuODJNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1CZXR3ZWVuNy44Mk1BbmQ5LjE1TSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTW92YWJsZUNhc2UtQmV0d2VlbjkuMTVNQW5kMTAuOTBNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3ZhYmxlQ2FzZS1MZXNzVGhhbjYuMTVNIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb253b3JraW5nUmVlZmVyQ29udGFpbmVyMjBGdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9ud29ya2luZ1JlZWZlckNvbnRhaW5lcjQwRnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbldvcmtpbmdSZWZyaWdlcmF0ZWRPclJlZWZlckNvbnRhaW5lcjMwRnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9jZWFuVmVzc2VsLUJyZWFrQnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blbi1Ub3BPckZsYXRiZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcGVuVG9wVmFuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrLVVwVHJ1Y2siLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VyUGFjayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlc3N1cml6ZWRUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm90ZWN0ZWRUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlsQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSYWlscm9hZE1haW50ZW5hbmNlT2ZXYXlDYXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlYXItRW5kSGVscGVyVW5pdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkQ29udGFpbmVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRPclJlZWZlckNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazIwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazMwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFuazQwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVmcmlnZXJhdGVkVGFua0ljMjBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZyaWdlcmF0ZWRUYW5rSWM0MEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW92YWJsZVNpZGVUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2FkcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTYWRkbGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNjYW5kaW5hdmlhblBhbGxldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VtaS1SZWZyaWdlcmF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbWktVHJhaWxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUNhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2luZ2xlLURyb3BUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFja0NhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhaW5sZXNzU3RlZWxUYW5rIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGFrLVJhayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NhciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjIwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjMwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lcjQwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGFua0NvbnRhaW5lckljMjBGZWV0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUYW5rQ29udGFpbmVySWMzMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRhbmtDb250YWluZXJJYzQwRmVldCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGVsZXNjb3BpbmdUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXIyMEZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXIzMEZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUZW1wZXJhdHVyZUNvbnRyb2xsZWRDb250YWluZXI0MEZ0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUb3RlYmluIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUJvYXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItQ2FyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLURyeUZyZWlnaHQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItRWxlY3RyaWNIZWF0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUhlYXRlZE9ySW5zdWxhdGVkT3JWZW50aWxhdGVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLUluc3VsYXRlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1JbnN1bGF0ZWRPclZlbnRpbGF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItTm90T3RoZXJ3aXNlU3BlY2lmaWVkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVBuZXVtYXRpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhaWxlci1SZWZyaWdlcmF0ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1DaGVtaWNhbHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYWlsZXItVGFuay1Gb29kR3JhZGUtTGlxdWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFpbGVyLVRhbmstR2FzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmlsZXZlbFJhaWxjYXIyMEZlZXQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLUZ1bGx5RW5jbG9zZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyaWxldmVsUmFpbGNhclNjcmVlbmVkLU5vUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aERvb3JzLU5vUm9vZiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJpbGV2ZWxSYWlsY2FyU2NyZWVuZWQtV2l0aFJvb2YiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3AiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLU9wZW5Ub3BIaWdoU2lkZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1Y2stT3BlblRvcExvd1NpZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRydWNrLVZhbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pdExvYWREZXZpY2UiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZhbi1TcGVjaWFsSW5zaWRlTGVuZ3RoLVdpZHRoT3JIZWlnaHRSZXF1aXJlbWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1MYWtlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlc3NlbC1PY2Vhbi1Db250YWluZXJzaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWZXNzZWwtT2NlYW4tTGFzaCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVmVzc2VsLU9jZWFuLVJvbGxvbi1Sb2xsb2ZmIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkVxdWlwbWVudFN0YXR1c0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250aW5lbnRhbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXhwb3J0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbXBvcnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbWFpbk9uQm9hcmQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaWZ0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zaGlwbWVudCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hvcnRsYW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJsYW5kZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRvbWVzdGljIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGlvbmluZyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlZGVsaXZlcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcGFpciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVsb2FkZXIiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRnVsbEluZGljYXRvckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGdWxsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbXB0eSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uZGl0aW9ucyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZyaWdlcmF0aW9uT24iIHR5cGU9InhjYmxCb29sZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZXNpZHVlIiB0eXBlPSJ4Y2JsQm9vbGVhbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTGlzdE9mQ29uZGl0aW9ucyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikxpc3RPZkRpbWVuc2lvbiIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb25kaXRpb25zIiB0eXBlPSJDb25kaXRpb25zIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTZWFsSW5mbyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iU2VhbEluZm8iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZlNlYWxJbmZvIiB0eXBlPSJMaXN0T2ZTZWFsSW5mbyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbEluZm8iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxOdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iU2VhbElzc3VlciIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJTZWFsU3RhdHVzRGVzY3JpcHRpb24iLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJbmZvIiB0eXBlPSJTZWFsSW5mbyIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VhbElzc3VlciI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2VhbElzc3VlckNvZGVkIiB0eXBlPSJTZWFsSXNzdWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbElzc3VlckNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxJc3N1ZXIiIHR5cGU9IlNlYWxJc3N1ZXIiLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU2VhbElzc3VlckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zb2xpZGF0b3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVua25vd24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlF1YXJhbnRpbmVBZ2VuY3kiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhcnJpZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkN1c3RvbXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBwZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlcm1pbmFsT3BlcmF0b3IiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzQ29kZWQiIHR5cGU9IlNlYWxTdGF0dXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTZWFsU3RhdHVzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VhbFN0YXR1c0luZm8iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlNlYWxTdGF0dXNEZXNjcmlwdGlvbiIgdHlwZT0iU2VhbFN0YXR1c0Rlc2NyaXB0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlNlYWxTdGF0dXNDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQnJva2VuIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEYW1hZ2VkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJblJpZ2h0Q29uZGl0aW9uIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNaXNzaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXBsYWNlZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVGhlRWxlY3Ryb25pY1NlYWxJc0ZhdWx0eSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNpdERpcmVjdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGVkIiB0eXBlPSJUcmFuc2l0RGlyZWN0aW9uQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZWQiIHR5cGU9IlRyYW5zaXRUaW1lUXVhbGlmaWVyQ29kZSIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNpdFRpbWVRdWFsaWZpZXJDb2RlZE90aGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc2l0VGltZSIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IlRyYW5zaXREaXJlY3Rpb24iIHR5cGU9IlRyYW5zaXREaXJlY3Rpb24iLz4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNpdERpcmVjdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCdXllclRvU2VsbGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZWxsZXJUb0J1eWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdWJjb250cmFjdG9yVG9TZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvRHJvcFNoaXBEZXNpZ25hdGVkTG9jYXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlbGxlclRvRnJlaWdodEZvcndhcmRlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VsbGVyVG9TdWJjb250cmFjdG9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNb3RoZXJWZXNzZWxUb0xpZ2h0ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxpZ2h0ZXJUb01vdGhlclZlc3NlbCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUcmFuc2l0VGltZVF1YWxpZmllckNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBaXJIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWlyRGF5cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FsZW5kYXJEYXlzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxlbmRhcldlZWtzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VyZmFjZURheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cmZhY2VIb3VycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV29ya2luZ0RheXMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjVEYXlXb3JrV2VlayIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTaGlwVG9TdWJJbmZvcm1hdGlvbiIgdHlwZT0iTGlzdE9mU2hpcFRvU3ViSW5mb3JtYXRpb24iLz4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJMb2NhdGlvbiI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IkxvY2F0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwVG9TdWJRdWFudGl0eSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IlF1YW50aXR5Ii8+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YkxvY2F0aW9uSXRlbVBhY2thZ2luZ1JlZmVyZW5jZSI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9Ikl0ZW1QYWNrYWdpbmdSZWZlcmVuY2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2hpcFRvU3ViSW5mb3JtYXRpb24iIHR5cGU9IlNoaXBUb1N1YkluZm9ybWF0aW9uIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJQYWNrYWdlUmVmZXJlbmNlIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIiB0eXBlPSJJdGVtUGFja2FnaW5nUmVmZXJlbmNlIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYWNrYWdlUmVmZXJlbmNlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUXVhbnRpdHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdlSURSZWZlcmVuY2UiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iUGFja2FnZVJlZmVyZW5jZSIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnZVJlZmVyZW5jZSIgdHlwZT0iUGFja2FnZVJlZmVyZW5jZSIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5Ij4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGVkIiB0eXBlPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRlcm1zT2ZEZWxpdmVyeUZ1bmN0aW9uQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlZCIgdHlwZT0iVHJhbnNwb3J0VGVybXNDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUcmFuc3BvcnRUZXJtc0NvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGVkIiB0eXBlPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNoaXBtZW50TWV0aG9kT2ZQYXltZW50Q29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJMb2NhdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iVGVybXNPZkRlbGl2ZXJ5RGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlRyYW5zcG9ydERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzQ29kZWQiIHR5cGU9IlJpc2tPZkxvc3NDb2RlIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSaXNrT2ZMb3NzQ29kZWRPdGhlciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmlza09mTG9zc0Rlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXJtc09mRGVsaXZlcnkiIHR5cGU9IlRlcm1zT2ZEZWxpdmVyeSIvPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXJtc09mRGVsaXZlcnlGdW5jdGlvbkNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmljZUNvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVzcGF0Y2hDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByaWNlYW5kRGVzcGF0Y2hDb25kaXRpb24iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RlZEJ5Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcG9ydENvbmRpdGlvbiIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGVsaXZlcnlDb25kaXRpb24iLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVHJhbnNwb3J0VGVybXNDb2RlIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRXgtV29ya3MiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWUtQ2FycmllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRnJlZUFsb25nc2lkZVNoaXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyZWVPbkJvYXJkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb3N0QW5kRnJlaWdodCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29zdC1JbnN1cmFuY2VBbmRGcmVpZ2h0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWFnZVBhaWRUbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FycmlhZ2UtSW5zdXJhbmNlUGFpZFRvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRBdEZyb250aWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRFeC1TaGlwIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWRFeC1RdWF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWREdXR5VW5wYWlkIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWxpdmVyZWREdXR5UGFpZCIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTaGlwbWVudE1ldGhvZE9mUGF5bWVudENvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBY2NvdW50Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlQ29sbGVjdCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZVByZXBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNhc2hPbkRlbGl2ZXJ5U2VydmljZUNoYXJnZVBhaWRCeUNvbnNpZ25lZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzaE9uRGVsaXZlcnlTZXJ2aWNlQ2hhcmdlUGFpZEJ5Q29uc2lnbm9yIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb2xsZWN0RnJlaWdodENyZWRpdGVkVG9QYXltZW50Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbGxlY3RPbkRlbGl2ZXJ5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDdXN0b21lclBpY2stVXBPckJhY2toYXVsIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEZWZpbmVkQnlCdXllckFuZFNlbGxlciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRm9iUG9ydE9mQ2FsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGFsZlByZXBhaWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkluZm9ybWF0aW9uQ29weS1Ob1BheW1lbnREdWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikluc3VyYW5jZUNvc3RzUGFpZEJ5Q29uc2lnbmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJbnN1cmFuY2VDb3N0c1BhaWRCeUNvbnNpZ25vciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWl4ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vblJldmVudWUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFNwZWNpZmllZCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUGFpZEJ5QnV5ZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhaWRCeVN1cHBsaWVyT3JTZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBheWFibGVFbHNld2hlcmUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBlckNvbnRyYWN0Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQaWNrdXAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRBbmRTdW1tYXJ5QmlsbCIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZEJ1dENoYXJnZWRUb0N1c3RvbWVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcmVwYWlkQnlQcm9jZXNzb3IiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWQtQnlTZWxsZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByZXBhaWRMb2NhbENvbGxlY3RPdXRzdGF0ZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJlcGFpZE9ubHkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRGcmVlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXR1cm5Db250YWluZXJGcmVpZ2h0UGFpZEJ5Q3VzdG9tZXIiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJldHVybkNvbnRhaW5lckZyZWlnaHRQYWlkQnlTdXBwbGllciIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUnVsZTExU2hpcG1lbnQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VGcmVpZ2h0LU5vQ2hhcmdlIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUaGlyZFBhcnR5UGF5Ii8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXZWlnaHRDb25kaXRpb24iLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUmlza09mTG9zc0NvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9EZXN0aW5hdGlvbklzQnV5ZXJzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSaXNrT2ZMb3NzSW5UcmFuc2l0VG9GcmVpZ2h0RXF1YWxpemF0aW9uUG9pbnRJc1NlbGxlcnMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJpc2tPZkxvc3NJblRyYW5zaXRUb1Bvb2xQb2ludElzU2VsbGVycyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmlza09mTG9zc0luVHJhbnNpdFRvRGVzdGluYXRpb25Jc1NlbGxlcnMiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcmdvQ2xhc3NpZmljYXRpb24iPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iTmF0dXJlT2ZHb29kcyI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9IklkZW50aWZpZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iT3BlcmF0aW9uYWxUeXBlQ29kZWQiIHR5cGU9Ik9wZXJhdGlvbmFsVHlwZUNvZGUiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGVkT3RoZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlR5cGVPZkNhcmdvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDYXJnb0NsYXNzaWZpY2F0aW9uIiB0eXBlPSJDYXJnb0NsYXNzaWZpY2F0aW9uIi8+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik9wZXJhdGlvbmFsVHlwZUNvZGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEb2N1bWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ikxvd1ZhbHVlTm9uLUR1dGlhYmxlQ29uc2lnbm1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb3dWYWx1ZUR1dGlhYmxlQ29uc2lnbm1lbnRzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIaWdoVmFsdWVDb25zaWdubWVudHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik90aGVyTm9uLUNvbnRhaW5lcml6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZlaGljbGVzIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSb2xsLU9uUm9sbC1PZmYiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBhbGxldGl6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lcml6ZWQiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJyZWFrYnVsayIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGF6YXJkb3VzQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdlbmVyYWxDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTGlxdWlkQ2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRlbXBlcmF0dXJlQ29udHJvbGxlZENhcmdvIi8+CisgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFbnZpcm9ubWVudGFsUG9sbHV0YW50Q2FyZ28iLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdC1IYXphcmRvdXNDYXJnbyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlwbG9tYXRpYyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWlsaXRhcnkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9ibm94aW91cyIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT3V0T2ZHYXVnZSIvPgorICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG91c2Vob2xkR29vZHNBbmRQZXJzb25hbEVmZmVjdHMiLz4KKyAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZyb3plbkNhcmdvIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb3VuZFRyaXBJbmZvcm1hdGlvbiI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJJbW11dGFibGUiIHR5cGU9InhjYmxCb29sZWFuIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJSZUxpbmsiIHR5cGU9InhzZDphbnlVUkkiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1cHBsaWVyU2hvcHBpbmdDYXJ0SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlJvdW5kVHJpcE9yZGVyIiB0eXBlPSJ4Y2JsQm9vbGVhbiIgZml4ZWQ9InRydWUiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUm91bmRUcmlwSW5mb3JtYXRpb24iIHR5cGU9IlJvdW5kVHJpcEluZm9ybWF0aW9uIi8+CisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0iQWNjb3VudEFzc2lnbm1lbnQiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPHhzZDplbGVtZW50IG5hbWU9Ikxpc3RPZkFjY291bnRBc3NpZ25tZW50IiB0eXBlPSJMaXN0T2ZBY2NvdW50QXNzaWdubWVudCIvPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudEFzc2lnbm1lbnQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFjY291bnRBc3NpZ25tZW50SUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEaXN0cmlidXRpb25QZXJjZW50YWdlIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iR0xBY2NvdW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3N0Q2VudGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBY2NvdW50QXNzaWdubWVudE9yZGVyTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJPcGVyYXRpb25OdW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlNhbGVzT3JkZXJSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJ1c2luZXNzQXJlYSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQ29udHJvbGxpbmdBcmVhIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9maXRDZW50ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik5ldHdvcmsiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpeGVkQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZpeGVkQXNzZXRTdWIiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkZ1bmRzQ2VudGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJGdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb21taXRtZW50SXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRnVuY3Rpb25hbEFyZWEiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdlbmVyaWNBY2NvdW50aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Ikxpc3RPZk5hbWVWYWx1ZVNldCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQWNjb3VudEFzc2lnbm1lbnQiIHR5cGU9IkFjY291bnRBc3NpZ25tZW50Ii8+CisgICAgPCEtLSBTT1ggZm9ybWF0IGRhdGF0eXBlcyB3aGVyZSB0aGV5IGRpZmVyIGZyb20gc3RhbmRhcmQgWFNETCBkYXRhdHlwZXMtLT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibERhdGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XXs0fSgoKDAxfDAzfDA1fDA3fDA4fDEwfDEyKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8KDNbMC0xXSkpKXwoKDA0fDA2fDA5fDExKSgoMFsxLTldKXwoWzEtMl1bMC05XSl8MzApKXwoKDAyKSgoMFsxLTldKXwoWzEtMl1bMC05XSkpKSkiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibFRpbWUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEYXRldGltZSI+CisgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldezR9KCgoMDF8MDN8MDV8MDd8MDh8MTB8MTIpKCgwWzEtOV0pfChbMS0yXVswLTldKXwoM1swLTFdKSkpfCgoMDR8MDZ8MDl8MTEpKCgwWzEtOV0pfChbMS0yXVswLTldKXwzMCkpfCgoMDIpKCgwWzEtOV0pfChbMS0yXVswLTldKSkpKVQoKChbMC0xXVswLTldKXwoMlswLTNdKSkoOihbMC01XVswLTldKSl7Mn0oKFwrfC0pKChbMC0xXVswLTldKXwoMlswLTNdKSk6KFswLTVdWzAtOV0pKT8pIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxCb29sZWFuIj4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+CisgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9InRydWV8ZmFsc2UiLz4KKyAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieGNibEZsb2F0Ij4KKyAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhjYmxEb3VibGUiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkb3VibGUiPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoXCt8LSk/WzAtOV0qXC4/WzAtOV0qKEV8ZSk/WzAtOV0qIi8+CisgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZVR5cGU+Cis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvYW5udWl0eW5ldF9uZXcueHNkIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWY1OGUyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL2FubnVpdHluZXRfbmV3LnhzZApAQCAtMCwwICsxLDEzNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmFubnVpdHluZXQuY29tL25hbWVzcGFjZS9wcm9maWxlcyIKKworICB4bWxucz0iaHR0cDovL3d3dy5hbm51aXR5bmV0LmNvbS9uYW1lc3BhY2UvcHJvZmlsZXMiCisgIHhtbG5zOmN2b2U9Imh0dHA6Ly93d3cuY29udGl2by5jb20veG1sbnMvMjAwMi9lbnJpY2htZW50IgorICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUyIj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPREUiPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgIDx4c2Q6bGVuZ3RoIHZhbHVlPSIyIi8+CisgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJFR0lOX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFTkRfREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRFUk1fREFURSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUxIj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworICA8eHNkOmVsZW1lbnQgbmFtZT0iRU5WRUxPUEUiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSEVBREVSIj4KKyAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNFTkRJTkdfUEFSVFlfSUQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fQ09VTlQiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJURVNUIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIRUFERVIiPgorICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRUZGRUNUSVZFX0RBVEUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFTX09GX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZJVFkiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFERCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNT0RJRlkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fSUQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUlRZX0lEIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJST1VUSU5HIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1JERVIiIHR5cGU9InhzZDppbnRlZ2VyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUk9VVElOR19ISVNUT1JZIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNURVAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFQ0VJVklOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORElOR19QQVJUWV9JRCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU0VORF9EQVRFVElNRSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSRUNFSVZFX0RBVEVUSU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJVU0lORVNTX1VOSVRfREVGSU5JVElPTiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUkVRVUVTVCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDTEFTUyIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVElOIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09OVEFDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJFU1BPTlNJQklMSVRZIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUiIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSURTIiB0eXBlPSJUeXBlMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUSU4iIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MT0dPTl9JRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVNTV09SRCIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMQVNUX05BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRklSU1RfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNSURETEVfSU5JVElBTCIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNBTFVUQVRJT05fQ0QiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTXJzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1zIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1pc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRHIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmV2Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkF0dHkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVUZGSVhfQ0QiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSnIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3IiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSUlJIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklWIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1EIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRU1BSUwiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJQ0VOU0VTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTElDRU5TRSIgbWF4T2NjdXJzPSIyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVFMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBUFBPSU5UTUVOVCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVFVTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRU5ESU5HIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUE9JTlRFRCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJURVJNSU5BVEVEIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTkVXX0JVU0lORVNTIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTlMiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJXUklUSU5HX0NPTVBBTlkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJMSU5FU19PRl9CVVNJTkVTUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkxJTkVfT0ZfQlVTSU5FU1MiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkRJVklEVUFMX0xJRkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkFSSUFCTEVfQU5OVUlUSUVTIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJWEVEX0FOTlVJVElFUyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHUk9VUF9MSUZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZBUklBQkxFX0xJRkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTRVJfUk9MRVMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRFU0NSSVBUSU9OIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBQ0NPVU5UUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlQiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFDQ09VTlRfTkFNRSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPV05FUl9OQU1FIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFCQV9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQUNDT1VOVF9OVU1CRVIiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFVSUE9TRSIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUkVNSVVNIENPTExFQ1RJT04iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiBSRUNJRVBUUyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05UQUNUUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTlRBQ1QiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEUyIgdHlwZT0iVHlwZTEiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUEhPTkVfTlVNQkVSIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVNQUlMIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0FWQUlMQUJJTElUWSIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOS1MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFWQUlMQUJJTElUWSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUklERVJTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJJREVSX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfUExBTlNfUklERVJTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQTEFOX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUklERVJfTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSSURFUl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEVTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRVhDRVBUSU9OIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0iVHlwZTIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QVElPTkFMSVRZIiBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Ik9QVElPTkFMIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05BTCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVFNfU0VSVklDRV9QUk9HUkFNUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTktTIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNPTkZJR1VSQVRJT05fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTVEFURVMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJFWENFUFRJT04iIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJUeXBlMiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OQUxJVFkiIG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iT1BUSU9OQUwiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJUkVEIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElPTkFMIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX1BMQU5TX1NFUlZJQ0VfUFJPR1JBTVMiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUExBTl9MSU5LUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBMQU5fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTRVJWSUNFX1BST0dSQU1fTElOSyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05fX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BUSU9OX19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT05GSUdVUkFUSU9OX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09ORklHVVJBVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUFRJT05BTElUWSIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJPUFRJT05BTCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUlSRUQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OQUwiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RTX0lOVkVTVE1FTlRfT1BUSU9OUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBST0RVQ1RfTElOS1MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklOVkVTVE1FTlRfT1BUSU9OU19MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNUQVRFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVYQ0VQVElPTiIgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU1RBVEUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9IlR5cGUyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik9QRVJBVElOR19QUk9GSUxFIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJORVRUSU5HX09QVElPTiIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ09NTUlTU0lPTl9PUFRJT05fTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDT01NSVNTSU9OX09QVElPTl9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9UWVBFUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1RZUEUiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRZUEUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFQUExJQ0FUSU9OIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOSVRJQUxfUFJFTUlVTSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVUJTRVFVRU5UX1BSRU1JVU0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX0FDSF9QUk9HUkFNIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldJVEhEUkFXQUwiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1VSUkVOREVSIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQkFMQU5DRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkRfUFJPR1JBTSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNUkQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0NIRURVTEVEX1JFQkFMQU5DRV9QUk9HUkFNIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRDQSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQ0FfUFJPR1JBTSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTWVNURU1BVElDX1dJVEhEUkFXQUxfUFJPR1JBTSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRU5FV0FMIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOTlVJVElaQVRJT04iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEFZT1VUIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFQVRIX0NMQUlNX1BFTkRJTkciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVBVEhfQ0xBSU0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1lTVEVNQVRJQ19XSVRIRFJBV0FMIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVEVUxFRF9BQ0giLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJNT05FWV9GT1JNUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik1PTkVZX0ZPUk0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUUkFOU0FDVElPTl9ST1VUSU5HX0xJTksiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ldyBDaGFyYWN0ZXIgSXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRSQU5TQUNUSU9OX1JPVVRJTkdTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVFJBTlNBQ1RJT05fUk9VVElORyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRFMiIHR5cGU9IlR5cGUxIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOQU1FIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJGT1JNQVQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFOU0kiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlNDQyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTk5VSVRZTkVUX1BST0ZJTEVfVjEuMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYTUxJRkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFhNTElGRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlBBUkFNRVRFUlMiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJBTUVURVIiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5BTUUiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkdTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9UT19CVVNJTkVTU19VTklUX01BUFBJTkciIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfTElOSyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVVNFUl9MSU5LIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJVU0VSX1JPTEVfTElOSyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQUyIgbWluT2NjdXJzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJVU0lORVNTX1VOSVRfUkVMQVRJT05TSElQIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQQVJFTlRfQlVTSU5FU1NfVU5JVF9MSU5LIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDSElMRF9CVVNJTkVTU19VTklUX0xJTksiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSUQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IkBQQVJUWV9MSU5LX0lEIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX09QRVJBVElOR19QUk9GSUxFX0xJTktTIiBtaW5PY2N1cnM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQlVTSU5FU1NfVU5JVF9MSU5LUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCVVNJTkVTU19VTklUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUFJPRFVDVF9MSU5LUyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQUk9EVUNUX0xJTksiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IklEIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJAUEFSVFlfTElOS19JRCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iT1BFUkFUSU5HX1BST0ZJTEVfTElOS1MiIG1pbk9jY3Vycz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJPUEVSQVRJTkdfUFJPRklMRV9MSU5LIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJRCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iQFBBUlRZX0xJTktfSUQiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlNDSEVNQV9WRVJTSU9OIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQQVJUTkVSX1hNTF9JTlRFUkZBQ0VfVjEuMTAiLz4KKyAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KKyAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvY3htbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1OTljYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9jeG1sLnhzZApAQCAtMCwwICsxLDEwMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhLS1XM0MgU2NoZW1hIGdlbmVyYXRlZCBieSBYTUwgU3B5IHY0LjQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBY2NvdW50aW5nIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWdtZW50IiByZWY9IlNlZ21lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBY2NvdW50aW5nU2VnbWVudCIgcmVmPSJBY2NvdW50aW5nU2VnbWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpjaG9pY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBY2NvdW50aW5nU2VnbWVudCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBZGRyZXNzIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHJlZj0iTmFtZSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbEFkZHJlc3MiIHJlZj0iUG9zdGFsQWRkcmVzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWFpbCIgcmVmPSJFbWFpbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQaG9uZSIgcmVmPSJQaG9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGYXgiIHJlZj0iRmF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpc29Db3VudHJ5Q29kZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFkZHJlc3NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkFyZWFPckNpdHlDb2RlIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkJpbGxUbyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiByZWY9IkFkZHJlc3MiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkJyb3dzZXJGb3JtUG9zdCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCdXllckNvb2tpZSI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSIvPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDSUZDb250ZW50IiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDaGFuZ2V0aW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDaGFyZ2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNpdHkiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNsYXNzaWZpY2F0aW9uIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIj4KKwkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KKwkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgcmVmPSJBdHRhY2htZW50Ii8+CisJCQk8L3hzOmNob2ljZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyIgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiIHJlZj0iRW1haWwiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQaG9uZSIgcmVmPSJQaG9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkZheCIgcmVmPSJGYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb2xlIiB0eXBlPSJ4czpOTVRPS0VOIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1TZWdtZW50IiByZWY9Ikl0ZW1TZWdtZW50IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJlZmZlY3RpdmVEYXRlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZXhwaXJhdGlvbkRhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDb250cmFjdEl0ZW0iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgcmVmPSJVbml0UHJpY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXh0cmluc2ljIiByZWY9IkV4dHJpbnNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ291bnRyeSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpc29Db3VudHJ5Q29kZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNvdW50cnlDb2RlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Imlzb0NvdW50cnlDb2RlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ3JlZGVudGlhbCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJZGVudGl0eSIgcmVmPSJJZGVudGl0eSIvPgorCQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGFyZWRTZWNyZXQiIHJlZj0iU2hhcmVkU2VjcmV0Ii8+CisJCQkJCTx4czplbGVtZW50IG5hbWU9IkRpZ2l0YWxTaWduYXR1cmUiIHJlZj0iRGlnaXRhbFNpZ25hdHVyZSIvPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSI+CisJCQkJPHhzOnNpbXBsZVR5cGU+CisJCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFya2V0cGxhY2UiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iRGVsaXZlclRvIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlNob3J0TmFtZSIgcmVmPSJTaG9ydE5hbWUiLz4KKwkJCTwveHM6Y2hvaWNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iRGlnaXRhbFNpZ25hdHVyZSI+CisJCTx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iUEs3IHNlbGYtY29udGFpbmVkIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IkJhc2U2NCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEaXN0cmlidXRpb24iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQWNjb3VudGluZyIgcmVmPSJBY2NvdW50aW5nIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2hhcmdlIiByZWY9IkNoYXJnZSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iRG9jdW1lbnRSZWZlcmVuY2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InBheWxvYWRJRCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkVmZmVjdGl2ZURhdGUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFeHBpcmF0aW9uRGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRXh0ZW5zaW9uIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiPgorCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iRmF4Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUZWxlcGhvbmVOdW1iZXIiIHJlZj0iVGVsZXBob25lTnVtYmVyIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVtYWlsIiByZWY9IkVtYWlsIi8+CisJCQk8L3hzOmNob2ljZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkZvbGxvd3VwIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkZvcm1hdCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iRnJvbSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDcmVkZW50aWFsIiByZWY9IkNyZWRlbnRpYWwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkdldFBlbmRpbmdSZXF1ZXN0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VUeXBlIiByZWY9Ik1lc3NhZ2VUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhNZXNzYWdlcyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9Imxhc3RSZWNlaXZlZFRpbWVzdGFtcCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkdldFBlbmRpbmdSZXNwb25zZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjWE1MIiByZWY9ImNYTUwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkhlYWRlciI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGcm9tIiByZWY9IkZyb20iLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUbyIgcmVmPSJUbyIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlNlbmRlciIgcmVmPSJTZW5kZXIiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IklkZW50aXR5Ij4KKwkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibGFzdENoYW5nZWRUaW1lc3RhbXAiIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hHcm91cCIgcmVmPSJTZWFyY2hHcm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbSIgcmVmPSJJbmRleEl0ZW0iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpjaG9pY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtQWRkIiByZWY9IkluZGV4SXRlbUFkZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbURlbGV0ZSIgcmVmPSJJbmRleEl0ZW1EZWxldGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJbmRleEl0ZW1QdW5jaG91dCIgcmVmPSJJbmRleEl0ZW1QdW5jaG91dCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpjaG9pY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbUFkZCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCIgcmVmPSJJdGVtRGV0YWlsIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGV0YWlsIiByZWY9IkluZGV4SXRlbURldGFpbCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtRGVsZXRlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkluZGV4SXRlbURldGFpbCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJMZWFkVGltZSIgcmVmPSJMZWFkVGltZSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4cGlyYXRpb25EYXRlIiByZWY9IkV4cGlyYXRpb25EYXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkVmZmVjdGl2ZURhdGUiIHJlZj0iRWZmZWN0aXZlRGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hHcm91cERhdGEiIHJlZj0iU2VhcmNoR3JvdXBEYXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVGVycml0b3J5QXZhaWxhYmxlIiByZWY9IlRlcnJpdG9yeUF2YWlsYWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXhJdGVtUHVuY2hvdXQiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUlEIiByZWY9Ikl0ZW1JRCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlB1bmNob3V0RGV0YWlsIiByZWY9IlB1bmNob3V0RGV0YWlsIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcm5hbElEIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1EZXRhaWwiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVW5pdFByaWNlIiByZWY9IlVuaXRQcmljZSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVW5pdE9mTWVhc3VyZSIgcmVmPSJVbml0T2ZNZWFzdXJlIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2xhc3NpZmljYXRpb24iIHJlZj0iQ2xhc3NpZmljYXRpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIHJlZj0iTWFudWZhY3R1cmVyUGFydElEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlck5hbWUiIHJlZj0iTWFudWZhY3R1cmVyTmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyIgcmVmPSJFeHRyaW5zaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclBhcnRJRCIgcmVmPSJTdXBwbGllclBhcnRJRCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyUGFydEF1eGlsaWFyeUlEIiByZWY9IlN1cHBsaWVyUGFydEF1eGlsaWFyeUlEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbUluIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtRGV0YWlsIiByZWY9Ikl0ZW1EZXRhaWwiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllcklEIiByZWY9IlN1cHBsaWVySUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIiByZWY9IlNoaXBUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyIgcmVmPSJTaGlwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUYXgiIHJlZj0iVGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsaW5lTnVtYmVyIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbU91dCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJJdGVtSUQiIHJlZj0iSXRlbUlEIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbURldGFpbCIgcmVmPSJJdGVtRGV0YWlsIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlNoaXBwaW5nIiByZWY9IlNoaXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlRheCIgcmVmPSJUYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRGlzdHJpYnV0aW9uIiByZWY9IkRpc3RyaWJ1dGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHJlZj0iQ29udGFjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbW1lbnRzIiByZWY9IkNvbW1lbnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsaW5lTnVtYmVyIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlzaXRpb25JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVlc3RlZERlbGl2ZXJ5RGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1TZWdtZW50Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRyYWN0SXRlbSIgcmVmPSJDb250cmFjdEl0ZW0iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InNlZ21lbnRLZXkiIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJMZWFkVGltZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyUGFydElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXR1cyIgcmVmPSJTdGF0dXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmNob2ljZT4KKwkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRPcmRlck1lc3NhZ2UiIHJlZj0iUHVuY2hPdXRPcmRlck1lc3NhZ2UiLz4KKwkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ2hhbmdlTWVzc2FnZSIgcmVmPSJTdWJzY3JpcHRpb25DaGFuZ2VNZXNzYWdlIi8+CisJCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyQ2hhbmdlTWVzc2FnZSIgcmVmPSJTdXBwbGllckNoYW5nZU1lc3NhZ2UiLz4KKwkJCQk8L3hzOmNob2ljZT4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlcGxveW1lbnRNb2RlIiBkZWZhdWx0PSJwcm9kdWN0aW9uIj4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9kdWN0aW9uIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRlc3QiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5SZXBseVRvIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZVR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImN1cnJlbmN5IiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbHRlcm5hdGVBbW91bnQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFsdGVybmF0ZUN1cnJlbmN5IiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPcHRpb24iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iYS1kdHlwZSIgdHlwZT0ieHM6Tk1UT0tFTlMiIGZpeGVkPSJuYW1lIHN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlck1ldGhvZCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclRhcmdldCIgcmVmPSJPcmRlclRhcmdldCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUHJvdG9jb2wiIHJlZj0iT3JkZXJQcm90b2NvbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kcyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlck1ldGhvZCIgcmVmPSJPcmRlck1ldGhvZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHJlZj0iQ29udGFjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUHJvdG9jb2wiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclJlcXVlc3RIZWFkZXIiIHJlZj0iT3JkZXJSZXF1ZXN0SGVhZGVyIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbU91dCIgcmVmPSJJdGVtT3V0IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPcmRlclJlcXVlc3RIZWFkZXIiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVG90YWwiIHJlZj0iVG90YWwiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkJpbGxUbyIgcmVmPSJCaWxsVG8iLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyIgcmVmPSJTaGlwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUYXgiIHJlZj0iVGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlBheW1lbnQiIHJlZj0iUGF5bWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250YWN0IiByZWY9IkNvbnRhY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb21tZW50cyIgcmVmPSJDb21tZW50cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGb2xsb3d1cCIgcmVmPSJGb2xsb3d1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEb2N1bWVudFJlZmVyZW5jZSIgcmVmPSJEb2N1bWVudFJlZmVyZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRyaW5zaWMiIHJlZj0iRXh0cmluc2ljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcklEIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3JkZXJEYXRlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgZGVmYXVsdD0ibmV3Ij4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJuZXciLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIvPgorCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQkJCTwveHM6c2ltcGxlVHlwZT4KKwkJCTwveHM6YXR0cmlidXRlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXNpdGlvbklEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ic2hpcENvbXBsZXRlIj4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iT3JkZXJUYXJnZXQiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6Y2hvaWNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlBob25lIiByZWY9IlBob25lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRW1haWwiIHJlZj0iRW1haWwiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJGYXgiIHJlZj0iRmF4Ii8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik90aGVyT3JkZXJUYXJnZXQiIHJlZj0iT3RoZXJPcmRlclRhcmdldCIvPgorCQkJPC94czpjaG9pY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9Ik90aGVyT3JkZXJUYXJnZXQiPgorCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUENhcmQiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyIgcmVmPSJQb3N0YWxBZGRyZXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZXhwaXJhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQYXltZW50Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlBDYXJkIiByZWY9IlBDYXJkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQaG9uZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUZWxlcGhvbmVOdW1iZXIiIHJlZj0iVGVsZXBob25lTnVtYmVyIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUG9zdGFsQWRkcmVzcyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZWxpdmVyVG8iIHJlZj0iRGVsaXZlclRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiByZWY9IlN0cmVldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNpdHkiIHJlZj0iQ2l0eSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXRlIiByZWY9IlN0YXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIHJlZj0iUG9zdGFsQ29kZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiByZWY9IkNvdW50cnkiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQb3N0YWxDb2RlIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQcm9maWxlUmVxdWVzdCI+CisJCTx4czpjb21wbGV4VHlwZS8+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlByb2ZpbGVSZXNwb25zZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJPcHRpb24iIHJlZj0iT3B0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNhY3Rpb24iIHJlZj0iVHJhbnNhY3Rpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVmZmVjdGl2ZURhdGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhLWR0eXBlIiB0eXBlPSJ4czpOTVRPS0VOUyIgZml4ZWQ9ImVmZmVjdGl2ZURhdGUgZGF0ZVRpbWUiLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRPcmRlck1lc3NhZ2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQnV5ZXJDb29raWUiIHJlZj0iQnV5ZXJDb29raWUiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dE9yZGVyTWVzc2FnZUhlYWRlciIgcmVmPSJQdW5jaE91dE9yZGVyTWVzc2FnZUhlYWRlciIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JbiIgcmVmPSJJdGVtSW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlB1bmNoT3V0T3JkZXJNZXNzYWdlSGVhZGVyIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlRvdGFsIiByZWY9IlRvdGFsIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIiByZWY9IlNoaXBUbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwcGluZyIgcmVmPSJTaGlwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUYXgiIHJlZj0iVGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0aW9uQWxsb3dlZCIgdXNlPSJyZXF1aXJlZCI+CisJCQkJPHhzOnNpbXBsZVR5cGU+CisJCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY3JlYXRlIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imluc3BlY3QiLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZWRpdCIvPgorCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQkJCTwveHM6c2ltcGxlVHlwZT4KKwkJCTwveHM6YXR0cmlidXRlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVxdWVzdCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCdXllckNvb2tpZSIgcmVmPSJCdXllckNvb2tpZSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkV4dHJpbnNpYyIgcmVmPSJFeHRyaW5zaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VyRm9ybVBvc3QiIHJlZj0iQnJvd3NlckZvcm1Qb3N0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNvbnRhY3QiIHJlZj0iQ29udGFjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyU2V0dXAiIHJlZj0iU3VwcGxpZXJTZXR1cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTaGlwVG8iIHJlZj0iU2hpcFRvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlNlbGVjdGVkSXRlbSIgcmVmPSJTZWxlY3RlZEl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSXRlbU91dCIgcmVmPSJJdGVtT3V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRpb24iIHVzZT0icmVxdWlyZWQiPgorCQkJCTx4czpzaW1wbGVUeXBlPgorCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNyZWF0ZSIvPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnNwZWN0Ii8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVkaXQiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRTZXR1cFJlc3BvbnNlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXJ0UGFnZSIgcmVmPSJTdGFydFBhZ2UiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlB1bmNob3V0RGV0YWlsIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIiByZWY9IlVSTCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkNsYXNzaWZpY2F0aW9uIiByZWY9IkNsYXNzaWZpY2F0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgcmVmPSJNYW51ZmFjdHVyZXJOYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1hbnVmYWN0dXJlclBhcnRJRCIgcmVmPSJNYW51ZmFjdHVyZXJQYXJ0SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRXhwaXJhdGlvbkRhdGUiIHJlZj0iRXhwaXJhdGlvbkRhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRWZmZWN0aXZlRGF0ZSIgcmVmPSJFZmZlY3RpdmVEYXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaEdyb3VwRGF0YSIgcmVmPSJTZWFyY2hHcm91cERhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJUZXJyaXRvcnlBdmFpbGFibGUiIHJlZj0iVGVycml0b3J5QXZhaWxhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOmNob2ljZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQcm9maWxlUmVxdWVzdCIgcmVmPSJQcm9maWxlUmVxdWVzdCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyUmVxdWVzdCIgcmVmPSJPcmRlclJlcXVlc3QiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJQdW5jaE91dFNldHVwUmVxdWVzdCIgcmVmPSJQdW5jaE91dFNldHVwUmVxdWVzdCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN0YXR1c1VwZGF0ZVJlcXVlc3QiIHJlZj0iU3RhdHVzVXBkYXRlUmVxdWVzdCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkdldFBlbmRpbmdSZXF1ZXN0IiByZWY9IkdldFBlbmRpbmdSZXF1ZXN0Ii8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uTGlzdFJlcXVlc3QiIHJlZj0iU3Vic2NyaXB0aW9uTGlzdFJlcXVlc3QiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVxdWVzdCIgcmVmPSJTdWJzY3JpcHRpb25Db250ZW50UmVxdWVzdCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTGlzdFJlcXVlc3QiIHJlZj0iU3VwcGxpZXJMaXN0UmVxdWVzdCIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyRGF0YVJlcXVlc3QiIHJlZj0iU3VwcGxpZXJEYXRhUmVxdWVzdCIvPgorCQkJPC94czpjaG9pY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlcGxveW1lbnRNb2RlIiBkZWZhdWx0PSJwcm9kdWN0aW9uIj4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9kdWN0aW9uIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRlc3QiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzIiByZWY9IlN0YXR1cyIvPgorCQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorCQkJCQk8eHM6Y2hvaWNlPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHJvZmlsZVJlc3BvbnNlIiByZWY9IlByb2ZpbGVSZXNwb25zZSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iUHVuY2hPdXRTZXR1cFJlc3BvbnNlIiByZWY9IlB1bmNoT3V0U2V0dXBSZXNwb25zZSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iR2V0UGVuZGluZ1Jlc3BvbnNlIiByZWY9IkdldFBlbmRpbmdSZXNwb25zZSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uTGlzdFJlc3BvbnNlIiByZWY9IlN1YnNjcmlwdGlvbkxpc3RSZXNwb25zZSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudFJlc3BvbnNlIiByZWY9IlN1YnNjcmlwdGlvbkNvbnRlbnRSZXNwb25zZSIvPgorCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVzcG9uc2UiIHJlZj0iU3VwcGxpZXJMaXN0UmVzcG9uc2UiLz4KKwkJCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyRGF0YVJlc3BvbnNlIiByZWY9IlN1cHBsaWVyRGF0YVJlc3BvbnNlIi8+CisJCQkJCTwveHM6Y2hvaWNlPgorCQkJCTwveHM6Y2hvaWNlPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoQXR0cmlidXRlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlNlYXJjaERhdGFFbGVtZW50Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hHcm91cCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiByZWY9Ik5hbWUiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hBdHRyaWJ1dGUiIHJlZj0iU2VhcmNoQXR0cmlidXRlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTZWFyY2hHcm91cERhdGEiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU2VhcmNoRGF0YUVsZW1lbnQiIHJlZj0iU2VhcmNoRGF0YUVsZW1lbnQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlNlZ21lbnQiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU2VsZWN0ZWRJdGVtIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ikl0ZW1JRCIgcmVmPSJJdGVtSUQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlNlbmRlciI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDcmVkZW50aWFsIiByZWY9IkNyZWRlbnRpYWwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVc2VyQWdlbnQiIHJlZj0iVXNlckFnZW50Ii8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTaGFyZWRTZWNyZXQiPgorCQk8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiLz4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcFRvIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiIHJlZj0iQWRkcmVzcyIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU2hpcHBpbmciPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhY2tpbmdEb21haW4iIHR5cGU9InhzOnN0cmluZyIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFja2luZ0lkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHJhY2tpbmciIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTaG9ydE5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlN0YXJ0UGFnZSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImNvZGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9InRleHQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNVcGRhdGVSZXF1ZXN0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkRvY3VtZW50UmVmZXJlbmNlIiByZWY9IkRvY3VtZW50UmVmZXJlbmNlIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzIiByZWY9IlN0YXR1cyIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3RyZWV0IiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb24iPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW50ZXJuYWxJRCIgcmVmPSJJbnRlcm5hbElEIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ2hhbmdldGltZSIgcmVmPSJDaGFuZ2V0aW1lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iRm9ybWF0IiByZWY9IkZvcm1hdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgcmVmPSJEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNoYW5nZU1lc3NhZ2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uIiByZWY9IlN1YnNjcmlwdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCI+CisJCQkJPHhzOnNpbXBsZVR5cGU+CisJCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibmV3Ii8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZSIvPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiLz4KKwkJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCQk8L3hzOnNpbXBsZVR5cGU+CisJCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpjaG9pY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ0lGQ29udGVudCIgcmVmPSJDSUZDb250ZW50Ii8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXgiIHJlZj0iSW5kZXgiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDb250cmFjdCIgcmVmPSJDb250cmFjdCIvPgorCQkJPC94czpjaG9pY2U+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImZpbGVuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQ29udGVudFJlcXVlc3QiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iSW50ZXJuYWxJRCIgcmVmPSJJbnRlcm5hbElEIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25Db250ZW50UmVzcG9uc2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uIiByZWY9IlN1YnNjcmlwdGlvbiIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkNvbnRlbnQiIHJlZj0iU3Vic2NyaXB0aW9uQ29udGVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uTGlzdFJlcXVlc3QiPgorCQk8eHM6Y29tcGxleFR5cGUvPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25MaXN0UmVzcG9uc2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uIiByZWY9IlN1YnNjcmlwdGlvbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgcmVmPSJOYW1lIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ29tbWVudHMiIHJlZj0iQ29tbWVudHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJJRCIgcmVmPSJTdXBwbGllcklEIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMb2NhdGlvbiIgcmVmPSJTdXBwbGllckxvY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb3Jwb3JhdGVVUkwiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdG9yZUZyb250VVJMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJDaGFuZ2VNZXNzYWdlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyIiByZWY9IlN1cHBsaWVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KKwkJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJuZXciLz4KKwkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlIi8+CisJCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIvPgorCQkJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQkJCTwveHM6c2ltcGxlVHlwZT4KKwkJCTwveHM6YXR0cmlidXRlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckRhdGFSZXF1ZXN0Ij4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiIHJlZj0iU3VwcGxpZXJJRCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJEYXRhUmVzcG9uc2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXIiIHJlZj0iU3VwcGxpZXIiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVySUQiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU3VwcGxpZXJMaXN0UmVxdWVzdCI+CisJCTx4czpjb21wbGV4VHlwZS8+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyTGlzdFJlc3BvbnNlIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyIiByZWY9IlN1cHBsaWVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllckxvY2F0aW9uIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkFkZHJlc3MiIHJlZj0iQWRkcmVzcyIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik9yZGVyTWV0aG9kcyIgcmVmPSJPcmRlck1ldGhvZHMiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyUGFydEF1eGlsaWFyeUlEIj4KKwkJPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIi8+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlN1cHBsaWVyUGFydElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTdXBwbGllclNldHVwIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlVSTCIgcmVmPSJVUkwiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlRheCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNb25leSIgcmVmPSJNb25leSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiByZWY9IkRlc2NyaXB0aW9uIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUZWxlcGhvbmVOdW1iZXIiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iQ291bnRyeUNvZGUiIHJlZj0iQ291bnRyeUNvZGUiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBcmVhT3JDaXR5Q29kZSIgcmVmPSJBcmVhT3JDaXR5Q29kZSIvPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik51bWJlciIgcmVmPSJOdW1iZXIiLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb24iIHJlZj0iRXh0ZW5zaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iVGVycml0b3J5QXZhaWxhYmxlIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUbyI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDcmVkZW50aWFsIiByZWY9IkNyZWRlbnRpYWwiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlRvdGFsIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9Ik1vbmV5IiByZWY9Ik1vbmV5Ii8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2FjdGlvbiI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzZXF1ZW5jZT4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHJlZj0iVVJMIi8+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3B0aW9uIiByZWY9Ik9wdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdE5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhLWR0eXBlIiB0eXBlPSJ4czpOTVRPS0VOUyIgZml4ZWQ9InJlcXVlc3ROYW1lIE5NVE9LRU4iLz4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iVVJMIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVbml0T2ZNZWFzdXJlIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0iTW9uZXkiIHJlZj0iTW9uZXkiLz4KKwkJCTwveHM6c2VxdWVuY2U+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlVzZXJBZ2VudCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iY1hNTCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpjaG9pY2U+CisJCQkJPHhzOnNlcXVlbmNlPgorCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJIZWFkZXIiIHJlZj0iSGVhZGVyIi8+CisJCQkJCTx4czpjaG9pY2U+CisJCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlIiByZWY9Ik1lc3NhZ2UiLz4KKwkJCQkJCTx4czplbGVtZW50IG5hbWU9IlJlcXVlc3QiIHJlZj0iUmVxdWVzdCIvPgorCQkJCQk8L3hzOmNob2ljZT4KKwkJCQk8L3hzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlIiByZWY9IlJlc3BvbnNlIi8+CisJCQk8L3hzOmNob2ljZT4KKwkJCTx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIxLjEuMDA5Ii8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InBheWxvYWRJRCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9InRpbWVzdGFtcCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxhbmciIHR5cGU9InhzOnN0cmluZyIvPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX2ZpZWxkcy54c2QgYi92MS90ZXN0L2Nhc2VzL3NjaGVtYS93bGkvb2FnaXNfZmllbGRzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2RjOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX2ZpZWxkcy54c2QKQEAgLTAsMCArMSw5NDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhLS1HZW5lcmF0ZWQgYnkgWE1MIEF1dGhvcml0eS4gQ29uZm9ybXMgdG8gdzNjIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLS0+Cis8eHM6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX2ZpZWxkcyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisJPHhzOmFubm90YXRpb24+CisJCTx4czpkb2N1bWVudGF0aW9uPgorCisJCUxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCisJCW9uIHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCB3ZWIgc2l0ZS4gd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnCisKKwkJRm9yIHN1cHBvcnQsIG1vcmUgaW5mb3JtYXRpb24sIG9yIHRvIHJlcG9ydCBpbXBsZW1lbnRhdGlvbiBidWdzLAorCQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCisKKwkJJFJldmlzaW9uJAorCQkkRGF0ZSQKKwkJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWE1MCisJCUNvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworCQkkTmFtZTogICQKKworCQlhancJNy4yCQkwOS8xNC8yMDAxCUZpZWxkcyB0byBzdXBwb3J0IEVDYXRhbG9nOiBDTEFTU0ZOSUQsQ0xBU1NGTixDTEFTU0xFVkVMLENMU1NTQ0hNUlYsRlRHUk9VUCwKKwkJCQkJCQkJCUZUVkFMSU5ELEZUVkFMUVVBTCwJUFJJQ0VDT0RFLAlQUklDRVRZUEUsU0VRTkNFTlVNLFVTQUdFUkVTVE4KKwkJYWp3CTcuMgkJMDkvMTQvMjAwMQlGaWVsZHMgdG8gc3VwcG9ydCBDb25zdW1wdG46IENPTlNMSU5FTlVNLFJPVVRFTEVWRUwxLVJPVVRFTEVWRUw5CisJCW1scgk3LjIgCQkwOS8xNC8yMDAxCUFkZGVkIGZpZWxkcyB0byBzdXBwb3J0IHVwZGF0ZWQgZGVsaXZlcnk6IEFDS01PREUsIERJU0NSUFRZUEUsIFJFQ0VJUFRZUEUuCisJCWFqdwk3LjIuMQkxMC8zMS8yMDAxCVczQyBTY2hlbWEgUmVsZWFzZQorCisKKwkJU3RydWN0dXJlIE92ZXJ2aWV3CisKKwkJCVRoaXMgc2NoZW1hIGRlZmluZXMgdGhlIE9BR0kgRmllbGQgZGF0YXR5cGVzIHVzZWQgdGhyb3VnaG91dCB0aGUgc3BlY2lmaWNhdGlvbi4KKwkJCUJlbG93IGlzIGFuIG91dGxpbmUgZGVwaWN0aW5nIHRoZWlyIHBsYWNlbWVudCBhbmQgdXNhZ2UuCisKKwkJCUJPRCBOYW1lc3BhY2UgKCJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL25ubl92ZXJiX25vdW5fcmVsIikKKwkJCQl8CisJCQkJfC0tLSBTZWdtZW50cyBOYW1lc3BhY2UgLSBvYWdpc19zZWdtZW50cy54c2QgKG9zOiAiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIpCisJCQkJfAl8CisJCQkJfC0tLQl8LS0tIEZpZWxkcyBOYW1lc3BhY2UgLSBvYWdpc19maWVsZHMueHNkIChvZjoiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiKQorCisKKworCQk8L3hzOmRvY3VtZW50YXRpb24+CisJPC94czphbm5vdGF0aW9uPgorCTx4czplbGVtZW50IG5hbWU9IlZFUkIiIHR5cGU9IlZFUkIiLz4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJWRVJCIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDS05PV0xFREdFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTE9DQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFERCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQU5DRUwiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJUk0iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JFQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRVRMSVNUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklTU1VFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxJU1QiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9BRCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0NFU1MiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVDRUlWRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNQT05EIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNIT1ciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1lOQyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFOU0ZFUiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVUERBVEUiLz4KKwkJPC94czpyZXN0cmljdGlvbj4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iTk9VTiI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RJVklUWSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCT00iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQk9EIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNBVEFMT0ciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09BIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTlNVTVBUTiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDT1VOVElORk8iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JFRElUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNVU1RPTUVSIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRFTElWRVJZIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRTUFRDSExJU1QiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRUNBVEFMT0ciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU5HQ0hHT1JEUiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWENITkdSQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOU1BFQ1RJT04iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WRU5DT1VOVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZFTlRPUlkiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WT0lDRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJU1NVRUlORk8iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNQ0xBU1MiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSVRFTVNQRUNTIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU1YUkVGIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkpPVVJOQUwiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTERHUkFDVFVBTCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMREdSQlVER0VUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BSU5UT1JERVIiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFUQ0hET0MiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFUQ0hGQUlMIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BVENIT0siLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUZHVExDT0RFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1JU0NJVEVNIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUFCTEUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSU09OTkVMIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNPTlRJTUUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUElDS0xJU1QiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExBTlNDSEQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUExJTlZPSUNFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBPIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBSSUNFTElTVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9EQVZBSUwiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPRE9SREVSIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST0RVQ1RSRVEiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPSkFDQ1RORyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9KSU5GTyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVU9URSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUNFSVZBQkxFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVJU0lUTiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPVVJDRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRlEiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUk9VVElORyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQUxFU09SREVSIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVNDSEQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUE1FTlQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFNDSEQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0lURUxFVkVMIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNUQVRVUyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTVVBQTElFUiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVT01HUk9VUCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBDT05GSVJNIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUE1FUkdFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldJUE1PVkUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0lQUkVDT1ZFUiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBTUExJVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSVBTVEFUVVMiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV1JLU0NIRFVMRSIvPgorCQk8L3hzOnJlc3RyaWN0aW9uPgorCTwveHM6c2ltcGxlVHlwZT4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJSRVZJU0lPTiI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iTE9HSUNBTElEIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgorCTwveHM6c2ltcGxlVHlwZT4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJDT05GSVJNQVRJT04iPgorCQk8eHM6YW5ub3RhdGlvbj4KKwkJCTx4czpkb2N1bWVudGF0aW9uPgorCQkJMCAtIE5vIENvbmZpcm0gQk9EIHJlcXVlc3RlZCwgMSAtIFNlbmQgQ29uZmlybSBCT0Qgb25seSBvbiBlcnJvciwgMiAtIFNlbmQgQ29uZmlybSBCT0QgYWx3YXlzCQkJCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+CisJCTwveHM6YW5ub3RhdGlvbj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjAiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PQ09ORklSTSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPTkVSUk9SIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IllFU0NPTkZJUk0iLz4KKwkJPC94czpyZXN0cmljdGlvbj4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iTEFOR1VBR0UiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IkNIQVJHRVRZUEUiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1RZUEUiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1VNRU5USUQiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRPQ1VNRU5UUlYiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IklURU0iPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9Ik9SSUdSRUYiPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IlBBUlROUklEIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgorCTwveHM6c2ltcGxlVHlwZT4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJQQVJUTlJUWVBFIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBUbyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCaWxsVG8iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU29sZFRvIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBheUZyb20iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcGxpZXIiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtaXRUbyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDYXJyaWVyIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJyb2tlciIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFbXBsb3llZSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJKViIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQdWJsaXNoZXIiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTWFudWZhY3R1cmVyIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNoaXBGcm9tIi8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IlBBWU1FVEhPRCI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iUkVBU09OQ09ERSI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iU0NITElORU5VTSI+CisJCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIi8+CisJPC94czpzaW1wbGVUeXBlPgorCTx4czpzaW1wbGVUeXBlIG5hbWU9IlNUQVRVU0xWTCI+CisJCTx4czphbm5vdGF0aW9uPgorCQkJPHhzOmRvY3VtZW50YXRpb24+MDAgLSBTdWNjZXNzLCA5OSAtIEZhaWx1cmU8L3hzOmRvY3VtZW50YXRpb24+CisJCTwveHM6YW5ub3RhdGlvbj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIwMCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSI5OSIvPgorCQk8L3hzOnJlc3RyaWN0aW9uPgorCTwveHM6c2ltcGxlVHlwZT4KKwk8eHM6c2ltcGxlVHlwZSBuYW1lPSJTVUJMSU5FTlVNIj4KKwkJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFYQ09ERSI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFYSlJTRENUTiI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciLz4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEVSTUlEIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgorCTwveHM6c2ltcGxlVHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJOT1VOIiB0eXBlPSJOT1VOIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVWSVNJT04iIHR5cGU9IlJFVklTSU9OIi8+CisJPCEtLSBBVzogc3VwcG9ydCBCU1IgVHlwZSAtIEVuZCAtLT4KKwk8IS0tIEFXOiBCZWxvdyBzdXBwb3J0IFNFTkRFUiBUeXBlIC0gU3RhcnQgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iTE9HSUNBTElEIiB0eXBlPSJMT0dJQ0FMSUQiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT01QT05FTlQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRBU0siIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFRkVSRU5DRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT05GSVJNQVRJT04iIHR5cGU9IkNPTkZJUk1BVElPTiIvPgorCTx4czplbGVtZW50IG5hbWU9IkxBTkdVQUdFIiB0eXBlPSJMQU5HVUFHRSIvPgorCTx4czplbGVtZW50IG5hbWU9IkNPREVQQUdFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBVVRISUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gRW5kIC0gU3VwcG9ydCBTRU5ERVIgVHlwZSAtLT4KKwk8IS0tIFN0YXJ0IC0gU3VwcG9ydCBEQVRFVElNRSBUeXBlIC0tPgorCTx4czplbGVtZW50IG5hbWU9IllFQVIiIHR5cGU9InhzOmdZZWFyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTU9OVEgiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEQVkiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJIT1VSIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUlOVVRFIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0VDT05EIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU1VCU0VDT05EIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVElNRVpPTkUiIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gRW5kIC0gU3VwcG9ydCBEQVRFVElNRSBUeXBlIC0tPgorCTwhLS0gU3RhcnQgLSBBbHBoYWJldGljYWwgZnJvbSBoZXJlIG9uIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkFCU0VOQ0VUWVAiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkFDQ1RQRVJJT0QiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkFDQ1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBQ0NUWUVBUiIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9IkFDS0NPREUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkFDS01PREUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkFDS1JFUVVFU1QiPgorCQk8eHM6c2ltcGxlVHlwZT4KKwkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMCIvPgorCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgorCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMiIvPgorCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9BQ0siLz4KKwkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9OQ0hBTkdFIi8+CisJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJZRVNBQ0siLz4KKwkJCTwveHM6cmVzdHJpY3Rpb24+CisJCTwveHM6c2ltcGxlVHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQUNUSU9OQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQUNUSVZFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBQ1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBRERSTElORSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkFERFJUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJBTExPV1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkFMIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQVBQUk9WRSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IkFQUFJPVkVEIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQVBQUk9WRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQVVUSENPREUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkJBQ0tPUkRJTkQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCSUxMT0xBRE5HIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCS1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkJPTUFMVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCT01JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQk9NTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQk9NUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQk9NU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCT01UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCT01VU0FHRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQlVER1NUQVQiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCVURHVFhOIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQlVER1ZFUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQlVTTkFSRUEiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkJVWUVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNBUlJJRVIiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNBUlJTUlZMVkwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNBVEFMR05BTUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNBVEFMT0dSViIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ0hBUkdFSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNIQVJHRVRZUEUiIHR5cGU9IkNIQVJHRVRZUEUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDSEdMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDSVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDTEFTU0ZOIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ0xBU1NGTklEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDTEFTU0xFVkVMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDTFNTU0NITVJWIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDTFNFTE1MVkwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNMU1NFTE1UIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU0xNTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ0xTU1NDSE1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ01QUlNOSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNNUFJTTlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNOVENUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09NTUVOVFMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNPTU1PRElUWSI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkNPTVBMRVZFTCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09NUFJFRkRFUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09ORFNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNPTlNVTVBUTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OVEFJTlJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OVENUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OVE5SU0VBTCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OVE5SVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ09OVFJBQ1RCIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT05UUkFDVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT05UUkFDVFMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNPU1RDRU5URVIiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNPU1RUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZRFNUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFJZT1JHIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT1VOVFkiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNSQUZUSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNUQ0hXQ09OViIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ1RDSFdGTEFHIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ1VSUkVOQ1kiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkNVUlJGUk9NIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDVVJSVE8iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkRBVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEQVlPRk1PTlRIIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iREFZU05VTSIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9IkRFRkFVTFQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkRFRkxUVkFMVUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkRFTElWRVJUTyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iREVOU0lUWUZBQyIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9IkRFUEFSVE1FTlQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkRFU0NSSVBUTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRElTQ1JQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRElTUE9TSVROIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJESVNQT1NJVE9OIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJESVNUQ0VOVEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJESVZJU0lPTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRE9DS0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJET0NUWVBFIiB0eXBlPSJET0NUWVBFIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRE9DVU1FTlRJRCIgdHlwZT0iRE9DVU1FTlRJRCIvPgorCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNRU5UUlYiIHR5cGU9IkRPQ1VNRU5UUlYiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEUkFXSU5HIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEUkNSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEUk9QU0hJUCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRFNQU1ROSU5WIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEVU5TTlVNQkVSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFQ09BUFBTVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFQ09OQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFQ09QUklPUklUWSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRUNPUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRUNPVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRUxFTUVOVCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkVNQUlMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFTVBDQVRFR1JZIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFTVBERVBUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFTVBMT1lFRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFTVBOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFTVBRVUFMSUYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkVNUFNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRU5ESVRFTUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFWENMVVNJVkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFWENQTElOTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFWENQVE5DT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFWFBJUkVGTEFHIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJFWFBPUlRMSUMiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGQUNUT1IiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZBSUxDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGQUlMVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRkFJTFVSRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGQVgiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGRUFUVVJFSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZFQVRWQUwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZJRUxESUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZJRUxEVkFMVUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZJTEVOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGSUxFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRklYRFFUWUlORCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IkZJWEVEQVNTRVQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZMRVhCS1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRlJFSUdIVENMUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRlJHSFRDTFMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZSR0hUSVRFTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRlJHSFRURVJNUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRlJNSVRNQ0xTUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iRlJNSVRNTk0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZSTUlUTU5NUlYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZSTVNJVEVMVkwiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGUk9NUEFSVFkiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZUREFUQVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZUR1JPVVAiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZUVkFMSU5EIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJGVFZBTFFVQUwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkZVTkQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkdFT0dSQVBIWSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iR0xFTlRJVFlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJHTEVOVElUWVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkdMTk9NQUNDVCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSEFaUkRNQVRMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJIRFJTVEFUVVMiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8IS0tCTx4czplbGVtZW50IG5hbWU9IkhPVVIiIHR5cGU9InhzOmludGVnZXIiLz4gIGRlZidkIGFib3ZlIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkhST1JHIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU1QT1JUTElDIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5DUExBTkZMRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IklORExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IklOTVJQUExBTiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IklOUVVFVUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5TTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5TUERPQ1JFViIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5TUEVDVERPQyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5TUEVDVFJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSU5WRU5ESVNQIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJTlZMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNIiB0eXBlPSJJVEVNIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSVRFTVgiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IklURU1DQVRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSVRFTUNMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNQ0xBU1NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSVRFTURFRk4iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IklURU1ERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNUlYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IklURU1SVlgiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IklURU1TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IklURU1UWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJVEVNVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJJVE1GVFZBTCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iSVRNSURGTEciIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJKRUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJKT0JDT0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJKUElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJLQU5CQU4iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkxBQk9SSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkxFREdFUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTElORSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTElORUZFRUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkxJTkVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJMT0FEUE9JTlQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IkxPQ0siIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJMT1RMRVZFTCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IkxPVFNORkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFDSENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJNQUNISUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1BQ0hJTkVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFNUQVRFIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFDSFNVREVQIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJNQUNIVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRDQUxJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRMT0NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFJTlRPUkRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFOREFUT1JZIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUFUQ0hUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJNQ0hET0NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUNIRE9DVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTUNITElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iTU9QQVJFTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTU9QUklPUklUWSIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1PU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJNT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1TRFNJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iTVNHSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1TR1RFWFQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik1TR1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik5BTUUiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJORVdJVE1SRVYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik5FV1JFVkZMQUciIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik5PVEVTIiB0eXBlPSJOT1RFUyIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RFUyI+CisJCTx4czpzaW1wbGVDb250ZW50PgorCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJPC94czpleHRlbnNpb24+CisJCTwveHM6c2ltcGxlQ29udGVudD4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czplbGVtZW50IG5hbWU9Ik5VTU9GREVDIiB0eXBlPSJ4czppbnRlZ2VyIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT0lMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPTERJVE1SRVYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9ORVRJTUUiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPUEVOSVRFTSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9QRVJBVE5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFUTlNFUSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BFUkFUVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BSQU1UQVVUSCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BSR1JQTkFNRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BSR1JQVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9QVENMU05BTUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9QVENMU1NJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1BUSU9OSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9QVElPTk5BTUUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9Ik9SSUdSRUYiIHR5cGU9Ik9SSUdSRUYiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPVEVMSUdJQkxFIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1VUUVVFVUVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1ZFUklEUFJJQyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iT1ZFUlRJTUUiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPV05SU0hQQ0RFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQQUNLSU5HIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQQUNLTkdERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQQVJDTlROUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQQVJFTlRJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5UTE9UIiB0eXBlPSJQQVJFTlRMT1QiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iUEFSRU5UTE9UIj4KKwkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQk8L3hzOmV4dGVuc2lvbj4KKwkJPC94czpzaW1wbGVDb250ZW50PgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmVsZW1lbnQgbmFtZT0iUEFSRU5UU05VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUEFSVElBTFNIUCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlBBUlROUklEIiB0eXBlPSJQQVJUTlJJRCIvPgorCTx4czplbGVtZW50IG5hbWU9IlBBUlROUklEWCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUEFSVE5SUkFURyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUEFSVE5SUk9MRSIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9IlBBUlROUlRZUEUiIHR5cGU9IlBBUlROUlRZUEUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQQVlNRVRIT0QiIHR5cGU9IlBBWU1FVEhPRCIvPgorCTx4czplbGVtZW50IG5hbWU9IlBFUlNPTkNPREUiIHR5cGU9IlJFQVNPTkNPREUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQSUNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQTEFOTkVSSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBNSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBPRU5USVRZIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT0lEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlBPTE5TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBPUkVMRUFTRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUE9TSVRJT04iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBPU1RBTENPREUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBPU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQT1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBSQ0VTU0NPREUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBSRExJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlBSRUZFUkVOQ0UiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBSSUNFQ09ERSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VMU1RJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VMU1RSViIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJJQ0VUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUklOVCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlBSSU5UQ05UTCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJJT1JJVFkiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBSTlRDTFNFTE0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0RDVExJTkUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0RPUkRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPRE9SRElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1NUQVRTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUk9ET1RZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFCRUciIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFFTkQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0RTRVFOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlBST0ZJVENUUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkFDVFNUUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkFDVFZUWSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSkVDVCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlJFU0VMIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlNUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPSlRYVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFJPUEVSVFkiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQUk9YTU9OVEgiIHR5cGU9InhzOmludGVnZXIiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQU0JMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQU0NMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQU0RMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJQU1NUQVRVUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUFVCTElTSEVSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlFTTElORVNUQVQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlFTTElORVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlFURUlEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRVEVJRFgiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlFURUxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlFURUxOU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUVRFUkVWSVNPTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUVRFU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRVUFMRk5JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUVVBTEZOVkFMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRVUFMSUYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJBVEVUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUFTT05DT0RFIiB0eXBlPSJSRUFTT05DT0RFIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVDRUlQVElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUNFSVBUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUNFUFRESVNQIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUNMSU5FTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUYiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRUdJT04iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFTElURU1JRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVMTE9DSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFTE1BQ0hJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVNSVRUQU5DRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVQUlRHRkxBRyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVRTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVRTE5TVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRVFVRVNURVIiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFUVVJU1ROSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ0VVU0UiIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gRGVwcmVjYXRlZCAtLT4KKwkJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDS0lOIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIERlcHJlY2F0ZWQJLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1JDR1JQIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRVNPUkNMVkwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJFU09SQ1RZUCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVTT1VSQ0VJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVTVFJJQ1ROIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tCTx4czplbGVtZW50IG5hbWU9IlJFVklTSU9OIj4gICBBbHJlYWR5IGRlZmluZWQgYWJvdmUgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkVWSVRNU1RBVCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkZRSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJGUUlEWCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkZRTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUkZRTE5TVEFUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRlFOQU1FIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRlFSRVZJU09OIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSRlFTVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJGUVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJPVVRFSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJPVVRFTEVWRUwiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJST1VURVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJPVVRFVkFSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJST1VUSU5HSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJPVVRJTkdSRVYiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJPVVRJTkdWQVIiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJRU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlJTQkxJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlJTTElORU5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLSBmdXR1cmUgeHM6ZGVjaW1hbCAgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iUlNMSU5FVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iUlNQTElOTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8IS0tIGZ1dHVyZSB4czpkZWNpbWFsICAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJSU1BSRVZOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJTUFNDSEVESUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlJTUFNETE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0FGRVRZSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNBRkVUWVRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNBRlRZQ0xBU1MiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNBTEVTT1JESUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNBTEVTT1JHIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0FMRVNQRVJTTiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0FWRVNFVFVQIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0NIRFVMRVRZUCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0NIRURVTEVJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0NITElORU5VTSIgdHlwZT0iU0NITElORU5VTSIvPgorCTx4czplbGVtZW50IG5hbWU9IlNDUkFQIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0VSSUFMTlVNIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTRVFOQ0VOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNISUZUIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSElQTUFUTElEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSElQTk9URVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNISVBQRVJJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBFUk5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0hJUFBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSElQUFJJT1IiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSElQU1JWTFZMIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSFBNVExERVNDIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUU0VRIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUU1RTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSFBVTklUVE9UIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSUdOIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTSVRFTEVWRUwiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2ltcGxlQ29udGVudD4KKwkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgorCQkJCTwveHM6ZXh0ZW5zaW9uPgorCQkJPC94czpzaW1wbGVDb250ZW50PgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTT0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlNPTE5TVEFUVVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNPU0xJTkVOVU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gZnV0dXJlIHhzOmRlY2ltYWwgIC0tPgorCTx4czplbGVtZW50IG5hbWU9IlNPU1RBVFVTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTUEVDSUFMSE5EIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTUExJVEFCTEUiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTVEFHRVBPSU5UIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTVEFURVBST1ZOIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTVEFUVVNMVkwiIHR5cGU9IlNUQVRVU0xWTCIvPgorCTx4czplbGVtZW50IG5hbWU9IlNURVBJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU1RFUE5VTSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU1RFUFRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlNVQkxJTkVOVU0iIHR5cGU9IlNVQkxJTkVOVU0iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJTVUJTRkxBRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlNVRkZJWCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU1VQRVJWSVNPUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iU1lOQ0lORCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLSBTZWUgYWJvdmUKKwk8eHM6ZWxlbWVudCBuYW1lPSJUQVNLIiB0eXBlPSJUQVNLIi8+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iVEFTSyI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJPHhzOm1heExlbmd0aCB2YWx1ZT0iMTAiLz4KKwkJPC94czpyZXN0cmljdGlvbj4KKwk8L3hzOnNpbXBsZVR5cGU+IC0tPgorCTx4czplbGVtZW50IG5hbWU9IlRBWENPREUiIHR5cGU9IlRBWENPREUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUQVhFWEVNUFQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUQVhJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVEFYSlJTRENUTiIgdHlwZT0iVEFYSlJTRENUTiIvPgorCTx4czplbGVtZW50IG5hbWU9IlRBWExJTkUiIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUQVhXSEVYTVBUIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVEVMRVBIT05FIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKwkJCQk8L3hzOmV4dGVuc2lvbj4KKwkJCTwveHM6c2ltcGxlQ29udGVudD4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iVEVSTUZMQUciIHR5cGU9InhzOmJvb2xlYW4iLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJURVJNSUQiIHR5cGU9IlRFUk1JRCIvPgorCTx4czplbGVtZW50IG5hbWU9IlRJVExFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUT0lUTUNMU1MiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRPSVRNTk0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRPSVRNTk1SViIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVE9PTENMQVNTIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJUT09MSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRPUEFSVFkiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRPU0lURUxWTCI+CisJCTx4czpjb21wbGV4VHlwZT4KKwkJCTx4czpzaW1wbGVDb250ZW50PgorCQkJCTx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KKwkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJCQkJPC94czpleHRlbnNpb24+CisJCQk8L3hzOnNpbXBsZUNvbnRlbnQ+CisJCTwveHM6Y29tcGxleFR5cGU+CisJPC94czplbGVtZW50PgorCTx4czplbGVtZW50IG5hbWU9IlRSQUNLRkxHIiB0eXBlPSJ4czpib29sZWFuIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVFJBQ0tJTkdJRCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVFJBS05HRkxBRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlRSQU5TTUVUSEQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRSQU5TVEVSTVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRSTlNGUlRZUEUiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlRYQU5BTFlTSVMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVOSVQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVOSVRUWVBFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVT00iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVPTUdST1VQSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVPTU5VTURFQyIgdHlwZT0ieHM6aW50ZWdlciIvPgorCTx4czplbGVtZW50IG5hbWU9IlVPTVZBTFVFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVUEMiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVQQ1BLR0lORCIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVVBDU0NDMTQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVQRFRXSVBGRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlVSSSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPCEtLXhzOnVyaVJlZmVyZW5jZSAtLT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVUkwiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVTQUdFUkVTVE4iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVTRVJBUkVBIiB0eXBlPSJVU0VSQVJFQSIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJVU0VSQVJFQSIgbWl4ZWQ9InRydWUiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzOnNlcXVlbmNlPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmVsZW1lbnQgbmFtZT0iVVNFUklEIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJVU0VVUElURU0iIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlVTVVBJTlZGRyIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorCTx4czplbGVtZW50IG5hbWU9IlZBTFVFIiB0eXBlPSJ4czpkZWNpbWFsIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVkFMVUVDTEFTUyIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iVk9VQ0hFUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iV0FHRUdST1VQIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJXQUdFVFlQRSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iV0FSRUhPVVNFIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJXQVJSQU5UWSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iV09SS0NFTlRFUiIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPHhzOmVsZW1lbnQgbmFtZT0iV09SS09SREVSIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJXUktTQ0hESUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTx4czplbGVtZW50IG5hbWU9IlhSRUZUWVBFSUQiIHR5cGU9InhzOnN0cmluZyIvPgorCTwhLS0gRW5kIC0gU3VwcG9ydGluZyBGaWVsZHMgJiBUeXBlcyAtLT4KKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zY2hlbWEvd2xpL29hZ2lzX3NlZ21lbnRzLnhzZCBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4NjVmZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc2NoZW1hL3dsaS9vYWdpc19zZWdtZW50cy54c2QKQEAgLTAsMCArMSw1NzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL29hZ2lzX3NlZ21lbnRzIiB4bWxucz0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIgeG1sbnM6b2Y9Imh0dHA6Ly93d3cub3BlbmFwcGxpY2F0aW9ucy5vcmcvb2FnaXNfZmllbGRzIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKwk8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiIHNjaGVtYUxvY2F0aW9uPSJvYWdpc19maWVsZHMueHNkIi8+CisJPHhzOmFubm90YXRpb24+CisJCTx4czpkb2N1bWVudGF0aW9uPgorCisJCUxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZSBpcyBwcm92aWRlZCBpbiBMSUNFTlNFLlRYVCwgYXMgcHVibGlzaGVkCisJCW9uIHRoZSBPcGVuIEFwcGxpY2F0aW9ucyBHcm91cCB3ZWIgc2l0ZS4gd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnCisKKwkJRm9yIHN1cHBvcnQsIG1vcmUgaW5mb3JtYXRpb24sIG9yIHRvIHJlcG9ydCBpbXBsZW1lbnRhdGlvbiBidWdzLAorCQlwbGVhc2UgY29udGFjdCB0aGUgT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgYXQgeG1sQG9wZW5hcHBsaWNhdGlvbnMub3JnCisKKwkJJFJldmlzaW9uJAorCQkkRGF0ZSQKKwkJT3BlbiBBcHBsaWNhdGlvbnMgR3JvdXAgWE1MCisJCUNvcHlyaWdodCAxOTk4LTIwMDEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworCQkkTmFtZTogICQKKworCQlhancJNy4yLjEJMTAvMzEvMjAwMQlXM0MgU2NoZW1hIFJlbGVhc2UKKworCisJCVN0cnVjdHVyZSBPdmVydmlldworCisJCQlUaGlzIHNjaGVtYSBkZWZpbmVzIHRoZSBPQUdJIFNlZ21lbnQgZGF0YXR5cGVzIHVzZWQgdGhyb3VnaG91dCB0aGUgc3BlY2lmaWNhdGlvbi4KKwkJCUJlbG93IGlzIGFuIG91dGxpbmUgZGVwaWN0aW5nIHRoZWlyIHBsYWNlbWVudCBhbmQgdXNhZ2UuCisKKwkJCUJPRCBOYW1lc3BhY2UgKCJodHRwOi8vd3d3Lm9wZW5hcHBsaWNhdGlvbnMub3JnL25ubl92ZXJiX25vdW5fcmVsIikKKwkJCQl8CisJCQkJfC0tLSBTZWdtZW50cyBOYW1lc3BhY2UgLSBvYWdpc19zZWdtZW50cy54c2QgKG9zOiAiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19zZWdtZW50cyIpCisJCQkJfAl8CisJCQkJfC0tLQl8LS0tIEZpZWxkcyBOYW1lc3BhY2UgLSBvYWdpc19maWVsZHMueHNkIChvZjoiaHR0cDovL3d3dy5vcGVuYXBwbGljYXRpb25zLm9yZy9vYWdpc19maWVsZHMiKQorCisKKworCQk8L3hzOmRvY3VtZW50YXRpb24+CisJPC94czphbm5vdGF0aW9uPgorCTx4czplbGVtZW50IG5hbWU9IkNOVFJPTEFSRUEiIHR5cGU9IkNOVFJPTEFSRUEiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ05UUk9MQVJFQSI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0iQlNSIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9IlNFTkRFUiIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJEQVRFVElNRUFOWSIvPgorCQkJPCEtLSBFaXRoZXIgREFURVRJTUUgb3IgREFURVRJTUVJU08gLS0+CisJCTwveHM6c2VxdWVuY2U+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJCU1IiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpWRVJCIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1VOIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpSRVZJU0lPTiIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmVsZW1lbnQgbmFtZT0iU0VOREVSIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6TE9HSUNBTElEIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT01QT05FTlQiLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRBU0siLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlJFRkVSRU5DRUlEIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT05GSVJNQVRJT04iLz4KKwkJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkxBTkdVQUdFIi8+CisJCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT0RFUEFHRSIvPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6QVVUSElEIi8+CisJCQk8L3hzOnNlcXVlbmNlPgorCQk8L3hzOmNvbXBsZXhUeXBlPgorCTwveHM6ZWxlbWVudD4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEQVRFVElNRUFOWSIgYWJzdHJhY3Q9InRydWUiLz4KKwk8eHM6ZWxlbWVudCBuYW1lPSJEQVRFVElNRUlTTyIgdHlwZT0iREFURVRJTUVJU08iIHN1YnN0aXR1dGlvbkdyb3VwPSJEQVRFVElNRUFOWSIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJEQVRFVElNRUlTTyI+CisJCTx4czpzaW1wbGVDb250ZW50PgorCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlVGltZSI+CisJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHR5cGU9IkRBVEVUSU1FcXVhbCIvPgorCQkJPC94czpleHRlbnNpb24+CisJCTwveHM6c2ltcGxlQ29udGVudD4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTwhLS0gREFURVRJTUVJU08gLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iREFURVRJTUUiIHR5cGU9IkRBVEVUSU1FIiBzdWJzdGl0dXRpb25Hcm91cD0iREFURVRJTUVBTlkiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iREFURVRJTUUiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOllFQVIiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6TU9OVEgiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6REFZIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkhPVVIiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6TUlOVVRFIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNFQ09ORCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTVUJTRUNPTkQiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VElNRVpPTkUiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWFsaWZpZXIiIHR5cGU9IkRBVEVUSU1FcXVhbCIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHM6Y29tcGxleFR5cGU+CisJCTx4czpzaW1wbGVUeXBlIG5hbWU9IkRBVEVUSU1FdHlwZSI+CisJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0NPVU5USU5HIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVEVORCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RTVEFSVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBSRVEiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQVBQUk9WQUwiLz4KKwkJPC94czpyZXN0cmljdGlvbj4KKwk8L3hzOnNpbXBsZVR5cGU+CisJPHhzOnNpbXBsZVR5cGUgbmFtZT0iREFURVRJTUVxdWFsIj4KKwkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDQ09VTlRJTkciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNURU5EIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVFNUQVJUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFQUFJFUSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBST1ZBTCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBVkFJTEFCTEUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQktURU5EIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJLVFNUQVJUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNBTkNFTCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTVBEQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTlNVTUUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1JFQVRJT04iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ1VNVUxBVElWRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVkFDVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVlNDSEVEIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRJU0NOVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJET0NVTUVOVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEVUUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRUFSTFNURUZGIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVBUkxTVFNISVAiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRUZGRUNUSVZFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVOR0NIRyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWEVDRklOSVNIIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVYRUNTVEFSVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWFBJUkFUSU9OIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZBSUxEQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZPUkVDQVNURiIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JFQ0FTVFMiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRlJPTSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRU5FUkFUSU9OIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkpPQkRVRSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJTVBMIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklOVk9JQ0UiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEFCT1JGSU5TSCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMQUJPUlNUQVJUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxBU1RVU0VEIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPQURJTkciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFUQ0hJTkciLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTVNNRU5UREFURSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJORUVEREVMViIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUEZJTklTSCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUFNUQVJUIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBBWUVORCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTEFORU5EIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBMQU5TVEFSVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTyIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9NREVMViIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9NU0hJUCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQWU1UVEVSTSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUNFSVZFRCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVBPUlREQVRFIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFUE9SVE5HRk4iLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVQT1JUTkdTVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVNPUkNEV05GIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFU09SQ0RXTlMiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUlNQRERBVEUiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUlNQRE9DR0VOIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNDSEVORCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTQ0hTVEFSVCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTRVRVUEZJTlNIIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNFVFVQU1RBUlQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUCIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTSElQU0NIRUQiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1RBVFVTREFURSIvPgorCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJURUFSRE9XTkYiLz4KKwkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVEVBUkRPV05TIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPIi8+CisJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+CisJCTwveHM6cmVzdHJpY3Rpb24+CisJPC94czpzaW1wbGVUeXBlPgorCTwhLS0gREFURVRJTUUgLS0+CisJPHhzOmVsZW1lbnQgbmFtZT0iQUREUkVTUyIgdHlwZT0iQUREUkVTUyIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJBRERSRVNTIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBRERSTElORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpBRERSVFlQRSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNJVFkiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT1VOVFJZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09VTlRZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RkFYIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBPU1RBTENPREUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpSRUdJT04iIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTVEFURVBST1ZOIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEFYSlJTRENUTiIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRFTEVQSE9ORSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVUkwiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJDT05UQUNUIiB0eXBlPSJDT05UQUNUIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNPTlRBQ1QiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5BTUUiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q09OVENUVFlQRSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkVNQUlMIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RkFYIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5BTUUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VEVMRVBIT05FIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czplbGVtZW50IG5hbWU9IkFNT1VOVCIgdHlwZT0iQU1PVU5UIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFNT1VOVCI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkFMVUUiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6TlVNT0ZERUMiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0lHTiIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDVVJSRU5DWSIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpEUkNSIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB1c2U9InJlcXVpcmVkIj4KKwkJCTx4czpzaW1wbGVUeXBlPgorCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ1RVQUwiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUFBSVk9SRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFWQUlMQUJMRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJVREdFVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTU1JU1NJT04iLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUNMQVJFVkFMIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRFNDUFJDTlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEU0NWQUxVRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRJU0NOVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRPQ1VNRU5UIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNURU5HSU1QIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNURlJFSUdIVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVEhSUyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVTVElNQVRFIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUTUFOSU1QIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRVNUVUNPU1QiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFWFRFTkRFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZSRUlHSFQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJVEVNIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BFTklURU0iLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRFUiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRExJTUlUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEFZUkFURSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJBVEUiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUkNCUksiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUQVgiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUQVhCQVNFIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE9UQUwiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUT1RMSU1JVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+CisJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCTwveHM6c2ltcGxlVHlwZT4KKwkJPC94czphdHRyaWJ1dGU+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSI+CisJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkYiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUQVgiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgorCQkJCTwveHM6cmVzdHJpY3Rpb24+CisJCQk8L3hzOnNpbXBsZVR5cGU+CisJCTwveHM6YXR0cmlidXRlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImluZGV4IiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTwhLS0gQU1PVU5UIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkFUVENIUkVGIiB0eXBlPSJBVFRDSFJFRiIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJBVFRDSFJFRiI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0iREFURVRJTUUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJRVUFOVElUWSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNNUFJTTlRZUEUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDTVBSU05JRCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkZJTEVUWVBFIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Tk9URVMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VElUTEUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPCEtLSA8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4gLS0+CisJCQk8eHM6Y2hvaWNlPgorCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RklMRU5BTUUiLz4KKwkJCQk8eHM6c2VxdWVuY2U+CisJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVJJIi8+CisJCQkJCTx4czplbGVtZW50IHJlZj0ib2Y6RklMRU5BTUUiIG1pbk9jY3Vycz0iMCIvPgorCQkJCTwveHM6c2VxdWVuY2U+CisJCQk8L3hzOmNob2ljZT4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmVsZW1lbnQgbmFtZT0iQ0hBUkdFIiB0eXBlPSJDSEFSR0UiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ0hBUkdFIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q0hBUkdFSUQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDSEFSR0VUWVBFIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q0hHTElORU5VTSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRFU0NSSVBUTiIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0iRElTVFJJQlVUTiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InJldHVybmRhdGEiIHR5cGU9InhzOnN0cmluZyIvPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmVsZW1lbnQgbmFtZT0iRElTVFJJQlVUTiIgdHlwZT0iRElTVFJJQlVUTiIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJESVNUUklCVVROIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJPUEVSQU1UIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6QlVTTkFSRUEiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpDT1NUQ0VOVEVSIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVQQVJUTUVOVCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRJVklTSU9OIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RUxFTUVOVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpGVU5EIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6R0VPR1JBUEhZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6R0xFTlRJVFlTIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6R0xOT01BQ0NUIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFJPRklUQ1RSIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6UFJPSkVDVCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVOSVQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpXQVJFSE9VU0UiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJPUEVSQU1UIiB0eXBlPSJPUEVSQU1UIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik9QRVJBTVQiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6Q1VSUkVOQ1kiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VU9NVkFMVUUiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VU9NTlVNREVDIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVPTSIvPgorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+CisJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09TVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVYVEVOREVEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRlJFSUdIVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOSVQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUiIvPgorCQkJCTwveHM6cmVzdHJpY3Rpb24+CisJCQk8L3hzOnNpbXBsZVR5cGU+CisJCTwveHM6YXR0cmlidXRlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiPgorCQkJPHhzOnNpbXBsZVR5cGU+CisJCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KKwkJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQkJPC94czpzaW1wbGVUeXBlPgorCQk8L3hzOmF0dHJpYnV0ZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czplbGVtZW50IG5hbWU9IlBBUlRORVIiIHR5cGU9IlBBUlRORVIiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iUEFSVE5FUiI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6TkFNRSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpPTkVUSU1FIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SSUQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJUTlJUWVBFIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6U1lOQ0lORCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkFDVElWRSIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkNVUlJFTkNZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RFVOU05VTUJFUiIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkdMRU5USVRZUyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUkVOVElEIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SSURYIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6UEFSVE5SUkFURyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUlJPTEUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVlNRVRIT0QiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhFWEVNUFQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpUQVhJRCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlRFUk1JRCIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0iQUREUkVTUyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJDT05UQUNUIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJURU1QUkFUVVJFIiB0eXBlPSJURU1QRVJBVFVSRSIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJURU1QRVJBVFVSRSI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VkFMVUUiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6TlVNT0ZERUMiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0lHTiIvPgorCQk8L3hzOnNlcXVlbmNlPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1YWxpZmllciIgdXNlPSJyZXF1aXJlZCI+CisJCQk8eHM6c2ltcGxlVHlwZT4KKwkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUNUVUFMIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iREVMSVZFUlkiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0FESU5HIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1RIRVIiLz4KKwkJCQk8L3hzOnJlc3RyaWN0aW9uPgorCQkJPC94czpzaW1wbGVUeXBlPgorCQk8L3hzOmF0dHJpYnV0ZT4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIj4KKwkJCTx4czpzaW1wbGVUeXBlPgorCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDRUxTSVVTIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRkFIUkVOSEVJVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IktFTFZJTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+CisJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCTwveHM6c2ltcGxlVHlwZT4KKwkJPC94czphdHRyaWJ1dGU+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJRVUFOVElUWSIgdHlwZT0iUVVBTlRJVFkiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iUVVBTlRJVFkiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlZBTFVFIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOk5VTU9GREVDIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNJR04iLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VU9NIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGlmaWVyIiB1c2U9InJlcXVpcmVkIj4KKwkJCTx4czpzaW1wbGVUeXBlPgorCQkJCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQ0NFUFRFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVERVUiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFDVEhSUyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTE9DQVRFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMTE9XRURXVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFWQUlMQUJMRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFWR1JVTlNJWkUiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCQUNLT1JERVJEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFUQ0hTSVpFIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkFUQ0hUSU1FIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQkxPQ0tFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkJSRUFLVElNRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNBUFBFUkNFTlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDQVRDSFdFR0hUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ09NTUlTU0lPTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNPTVBMRVRFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNVTVVMQVRJVkUiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxJVkVSRUQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEVVJBVElPTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRVUk9WRVIiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEVVJVTkRFUiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVNUExPWUVFUyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFJFUUQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1REVVIiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RIUlMiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFU1RXRUlHSFQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUxFTkFNRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJTEVTSVpFIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklYRURUSU1FIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSEVJR0hUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5TUEVDVEVEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSU5TUEVDVElPTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklURU0iLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMRFRNT0ZGU0VUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEVOR1RIIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTEFCT1IiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT0FESU5HV1QiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT1RTSVpFTUFYIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTE9UU0laRU1JTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPVFNJWkVNTFQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMT1dFUkxJTUlUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFDSElORUhSUyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1BWElNVU0iLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNQVhQQVJMVE0iLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNSU5JTVVNIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTU9WRVRJTUUiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNU01FTlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNVUxUSVBMSUVSIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTkVUV0VJR0hUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT1BFTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9SREVSRUQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPVEhFUlJFSiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9WRVJTSElQIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEFDS0lORyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUkNFTlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQRVJDRU5UUkVRIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUEVSU0hCTk9QUiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBFUlNIV0lPUFIiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQTE5EUFJDVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBSQ0JSSyIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBSSU9SIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVFVUVUSU1FIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkFURSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFQ0VJVkVEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVKRUNURUQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRUpGSVhFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFSlBFUkNFTlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1EVVIiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRU1IUlMiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJFVFVSTkVEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUkVXT1JLIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUlVOVElNRSIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNDUkFQIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0VUVVBUSU1FIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hFTEZMSUZFIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU0hJUFBFRCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNISVBVTklUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU1RBUlQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJURUFSRE9XTiIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRPT0xSRVFEIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVE9UV0VJR0hUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBTlNGUkxPVCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOREVSU0hJUCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOSVQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVUFBFUkxJTUlUIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVk9MVU1FIi8+CisJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iV0FJVFRJTUUiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXRUlHSFQiLz4KKwkJCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJXSURUSCIvPgorCQkJCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9USEVSIi8+CisJCQkJPC94czpyZXN0cmljdGlvbj4KKwkJCTwveHM6c2ltcGxlVHlwZT4KKwkJPC94czphdHRyaWJ1dGU+CisJPC94czpjb21wbGV4VHlwZT4KKwk8IS0tIFFVQU5USVRZIC0tPgorCTx4czplbGVtZW50IG5hbWU9IkRPQ1VNTlRSRUYiIHR5cGU9IkRPQ1VNTlRSRUYiLz4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iRE9DVU1OVFJFRiI+CisJCTx4czpzZXF1ZW5jZT4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVFlQRSIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NVTUVOVElEIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUklEIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUlROUlRZUEUiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6REVTQ1JJUFROIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRSViIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkxJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpOT1RFUyIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlNDSExJTkVOVU0iIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpTVUJMSU5FTlVNIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6VVNFUkFSRUEiIG1pbk9jY3Vycz0iMCIvPgorCQk8L3hzOnNlcXVlbmNlPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmVsZW1lbnQgbmFtZT0iRE9DVU1FTlQiIHR5cGU9IkRPQ1VNRU5UIi8+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRPQ1VNRU5UIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpET0NVTUVOVElEIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6RE9DVU1FTlRSViIgbWluT2NjdXJzPSIwIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkRPQ1RZUEUiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpVU0VSQVJFQSIgbWluT2NjdXJzPSIwIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmV0dXJuZGF0YSIgdHlwZT0ieHM6c3RyaW5nIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJMT1RTRVJJQUwiIHR5cGU9IkxPVFNFUklBTCIvPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJMT1RTRVJJQUwiPgorCQk8eHM6c2VxdWVuY2U+CisJCQk8eHM6ZWxlbWVudCByZWY9IlFVQU5USVRZIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTwhLS0oJVFVQU5USVRZLklURU07KT8gLS0+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOkxPVExFVkVMIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlBBUkVOVExPVCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQkJPHhzOmVsZW1lbnQgcmVmPSJvZjpQQVJFTlRTTlVNIiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4czplbGVtZW50IHJlZj0ib2Y6U0VSSUFMTlVNIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisJCQk8eHM6ZWxlbWVudCByZWY9Im9mOlVTRVJBUkVBIiBtaW5PY2N1cnM9IjAiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5kYXRhIiB0eXBlPSJ4czpzdHJpbmciLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL0NvbnNvbGlkYXRlVGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL0NvbnNvbGlkYXRlVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjOWVlYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvQ29uc29saWRhdGVUZXN0LnhtbApAQCAtMCwwICsxLDUxIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxlbXBsb3llZXM+CisgIDxlbXBsb3llZT4KKyAgICA8bmFtZT5GcmVkIEpvbmVzPC9uYW1lPgorICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJob21lIj4KKyAgICAgIDxzdHJlZXQ+OTAwIEF1cm9yYSBBdmUuPC9zdHJlZXQ+CisgICAgICA8Y2l0eT5TZWF0dGxlPC9jaXR5PgorICAgICAgPHN0YXRlPldBPC9zdGF0ZT4KKyAgICAgIDx6aXA+OTgxMDk8L3ppcD4KKyAgICA8L2FkZHJlc3M+CisgICAgPGFkZHJlc3MgbG9jYXRpb249IndvcmsiPgorICAgICAgPHN0cmVldD4yMDExIDE1Mm5kIEF2ZW51ZSBORTwvc3RyZWV0PgorICAgICAgPGNpdHk+UmVkbW9uZDwvY2l0eT4KKyAgICAgIDxzdGF0ZT5XQTwvc3RhdGU+CisgICAgICA8emlwPjk4MDUyPC96aXA+CisgICAgPC9hZGRyZXNzPgorICAgIDxwaG9uZSBsb2NhdGlvbj0id29yayI+KDQyNSk2NDEtOTM4NTwvcGhvbmU+CisgICAgPHBob25lIGxvY2F0aW9uPSJob21lIj4oMjA2KTQ0MS0xNjk1PC9waG9uZT4KKyAgICA8cGhvbmUgbG9jYXRpb249Im1vYmlsZSI+KDIwNik3MTQtMjUxNTwvcGhvbmU+CisgIDwvZW1wbG95ZWU+CisgIDxlbXBsb3llZT4KKyAgICA8bmFtZT5TYWxseSBTbWl0aDwvbmFtZT4KKyAgICA8YWRkcmVzcyBsb2NhdGlvbj0iaG9tZSI+CisgICAgICA8c3RyZWV0PjE0MzAgT2FrIFBsYWNlPC9zdHJlZXQ+CisgICAgICA8Y2l0eT5TYWxlbTwvY2l0eT4KKyAgICAgIDxzdGF0ZT5PUjwvc3RhdGU+CisgICAgICA8emlwPjk3MTI1PC96aXA+CisgICAgPC9hZGRyZXNzPgorICAgIDxhZGRyZXNzIGxvY2F0aW9uPSJ3b3JrIj4KKyAgICAgIDxzdHJlZXQ+NzY1IE1haW4gU3QuPC9zdHJlZXQ+CisgICAgICA8Y2l0eT5LYWlzZXI8L2NpdHk+CisgICAgICA8c3RhdGU+T1I8L3N0YXRlPgorICAgICAgPHppcD45NzEwMzwvemlwPgorICAgIDwvYWRkcmVzcz4KKyAgICA8cGhvbmUgbG9jYXRpb249IndvcmsiPig1MDMpMjY0LTM4NTY8L3Bob25lPgorICAgIDxwaG9uZSBsb2NhdGlvbj0iaG9tZSI+KDUwMyk0MTYtNjk1MTwvcGhvbmU+CisgICAgPHBob25lIGxvY2F0aW9uPSJtb2JpbGUiPig1MDMpMjE0LTUxNTI8L3Bob25lPgorICA8L2VtcGxveWVlPgorPC9lbXBsb3llZXM+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3N0b3JlL2Vhc3lwbzEueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lYXN5cG8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2RhZjIzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lYXN5cG8xLnhtbApAQCAtMCwwICsxLDQyIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxwbzpwdXJjaGFzZS1vcmRlciB4bWxuczpwbz0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyI+CisgIDxwbzpjdXN0b21lcj4KKyAgICA8cG86bmFtZT5EYXZpZCBCYXU8L3BvOm5hbWU+CisgICAgPHBvOmFkZHJlc3M+R2xhZHd5bmUsIFBBPC9wbzphZGRyZXNzPgorICA8L3BvOmN1c3RvbWVyPgorICA8cG86ZGF0ZT4yMDAyLTA5LTMwVDE0OjE2OjAwLTA1OjAwPC9wbzpkYXRlPgorICA8cG86bGluZS1pdGVtPgorICAgIDxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMTwvcG86ZGVzY3JpcHRpb24+CisgICAgPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+CisgICAgPHBvOnByaWNlPjIxLjc5PC9wbzpwcmljZT4KKyAgICA8cG86cXVhbnRpdHk+MjwvcG86cXVhbnRpdHk+CisgIDwvcG86bGluZS1pdGVtPgorICA8cG86bGluZS1pdGVtPgorICAgIDxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMjwvcG86ZGVzY3JpcHRpb24+CisgICAgPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+CisgICAgPHBvOnByaWNlPjE5Ljg5PC9wbzpwcmljZT4KKyAgICA8cG86cXVhbnRpdHk+MjwvcG86cXVhbnRpdHk+CisgIDwvcG86bGluZS1pdGVtPgorICA8cG86bGluZS1pdGVtPgorICAgIDxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMzwvcG86ZGVzY3JpcHRpb24+CisgICAgPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+CisgICAgPHBvOnByaWNlPjE5Ljg5PC9wbzpwcmljZT4KKyAgICA8cG86cXVhbnRpdHk+MTwvcG86cXVhbnRpdHk+CisgIDwvcG86bGluZS1pdGVtPgorICA8cG86c2hpcHBlcj4KKyAgICA8cG86bmFtZT5VUFM8L3BvOm5hbWU+CisgICAgPHBvOnBlci1vdW5jZS1yYXRlPjAuNzQ8L3BvOnBlci1vdW5jZS1yYXRlPgorICA8L3BvOnNoaXBwZXI+Cis8L3BvOnB1cmNoYXNlLW9yZGVyPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy9zdG9yZS9lcmljdGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL2VyaWN0ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNmZjMwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9lcmljdGVzdC54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YmFyPjxmb28+MTwvZm9vPjxmb28+MjwvZm9vPjwvYmFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sIGIvdjEvdGVzdC9jYXNlcy9zdG9yZS9zbWFsbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmNGI3OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMvc3RvcmUvc21hbGwueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sCisKKyAgIHZlcnNpb24KKz0KKworCisiCisiCitzdGFuZGFsb25lPSd5ZXMnICAgPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGFhYWEgYT0iYV92YWx1ZSIgYjphID0gJ2JfdmFsdWUnICB4bWxuczpiPSJiX25zIj4KKyAgPD9waQl0YWIgIHRlc3h0IHJ0Pz4KKzwvYWFhYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMvc3RvcmUvdGVzdC54bWwgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDkyOGEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3N0b3JlL3Rlc3QueG1sCkBAIC0wLDAgKzEgQEAKKzxmb28geD0ieSI+YWI8L2Zvbz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzBfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzBfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiM2RhYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMF8wLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZmM0OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMC54bWwKQEAgLTAsMCArMSwxOSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhIHRlc3Q9InRlc3QiLz4KKyAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgorICAgIDxhLz4KKyAgPC9iPgorPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMS54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEwXzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIzNWUwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8yLnhtbApAQCAtMCwwICsxLDE2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YS8+Cis8L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMF8zLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyYWNlMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTBfMy54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzExXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzUzMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMV8wLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xMl8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTJfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzA1MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTJfMC54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50PjwhLS0gLS0+PC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xM18wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTNfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTNfMC54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YSB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzEzXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xM18xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhY2UxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xM18xLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTRfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzAueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE5OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8xLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgYXR0cjE9ImExIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE0XzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNF8yLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlmYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8wLnhtbApAQCAtMCwwICsxLDE5IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEgdGVzdD0idGVzdCIvPgorICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+CisgICAgPGEvPgorICA8L2I+Cis8L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE1XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIzNWUwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8xLnhtbApAQCAtMCwwICsxLDE2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YS8+Cis8L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNV8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyYWNlMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMTVfMi54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE2XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNl8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIzNWUwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xNl8wLnhtbApAQCAtMCwwICsxLDE2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YS8+Cis8L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhODkwOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMC54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50PgorICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZiYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8xLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHRlc3Q9InRlc3QiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTg5MDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzIueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudD4KKyAgPC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF8zLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfMy54bWwKQEAgLTAsMCArMSwxNiBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEvPgorPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjc4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzQueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudD4KKzwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTZhOWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzUueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICAgIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzYueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF83LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNTQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMThfNy54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50IHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+IAorICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE4XzgueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF84LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg0ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOF84LnhtbApAQCAtMCwwICsxLDE1IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzE5XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xOV8wLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDhmZjcKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMC54bWwKQEAgLTAsMCArMSwyMCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhIHRlc3Q9InRlc3QiLz4KKyAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgorICAgIDxhLz4KKyAgPC9iPgorPC9kb2M+Cis8IS0tIC0tPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWZjNDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMS54bWwKQEAgLTAsMCArMSwxOSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhIHRlc3Q9InRlc3QiLz4KKyAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgorICAgIDxhLz4KKyAgPC9iPgorPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzEwLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNTQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8xMC54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50IHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+IAorICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMTEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzExLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg0ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzExLnhtbApAQCAtMCwwICsxLDE1IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzA1MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8yLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQ+PCEtLSAtLT48L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMy54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhODkwOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV8zLnhtbApAQCAtMCwwICsxLDE1IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQ+CisgIDwveG1sLWZyYWdtZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV80LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV80LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZiYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzQueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzUueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTg5MDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNS54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50PgorICA8L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMV82LnhtbApAQCAtMCwwICsxLDE2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YS8+Cis8L2I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzcueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjc4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfNy54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50PgorPC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzgueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTZhOWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfOC54bWwKQEAgLTAsMCArMSwxNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50IHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgICAgPC94bWwtZnJhZ21lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzkueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8xXzkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzFfOS54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YSB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhY2UxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8wLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjBfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjM1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzEueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhLz4KKzwvYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlmYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8yLnhtbApAQCAtMCwwICsxLDE5IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEgdGVzdD0idGVzdCIvPgorICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+CisgICAgPGEvPgorICA8L2I+Cis8L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIwXzMueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ4ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMF8zLnhtbApAQCAtMCwwICsxLDIwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEgdGVzdD0idGVzdCIvPgorICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+CisgICAgPGEvPgorICA8L2I+Cis8L2RvYz4KKzwhLS0gLS0+CmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIxXzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhY2UxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8wLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjFfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIxXzEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjM1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIxXzEueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhLz4KKzwvYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIxXzIueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZiYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMV8yLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHRlc3Q9InRlc3QiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjJfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIyXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjM1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIyXzAueG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhLz4KKzwvYj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIyXzEueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMl8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhY2UxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yMl8xLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxhIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjNfMC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIzXzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmJjOGYKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzIzXzAueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yNF8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjRfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMjRfMC54bWwKQEAgLTAsMCArMSwxNiBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEvPgorPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMl8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfMl8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlmYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8yXzAueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YSB0ZXN0PSJ0ZXN0Ii8+CisgIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KKyAgICA8YS8+CisgIDwvYj4KKzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfM18wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfM18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZiYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF8zXzAueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzRfMC54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50IHRlc3Q9InRlc3QiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE5OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzEueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCBhdHRyMT0iYTEiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNF8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdlMWZhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF80XzIueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNV8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ4ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF81XzAueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YSB0ZXN0PSJ0ZXN0Ii8+CisgIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KKyAgICA8YS8+CisgIDwvYj4KKzwvZG9jPgorPCEtLSAtLT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ4ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzAueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YSB0ZXN0PSJ0ZXN0Ii8+CisgIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KKyAgICA8YS8+CisgIDwvYj4KKzwvZG9jPgorPCEtLSAtLT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlmYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzEueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGRvYyB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iPgorICA8YSB0ZXN0PSJ0ZXN0Ii8+CisgIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KKyAgICA8YS8+CisgIDwvYj4KKzwvZG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8yLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl8yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZiYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzIueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgdGVzdD0idGVzdCIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzMueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjM1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzZfMy54bWwKQEAgLTAsMCArMSwxNiBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEvPgorPC9iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl80LnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfNl80LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhY2UxCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF82XzQueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGEgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSIgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF83XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWZjNDkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzdfMC54bWwKQEAgLTAsMCArMSwxOSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhIHRlc3Q9InRlc3QiLz4KKyAgPGIgYXR0cjE9ImExIiBhdHRyMj0iYTIiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiPgorICAgIDxhLz4KKyAgPC9iPgorPC9kb2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzAueG1sIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzhfMC54bWwKQEAgLTAsMCArMSwxNCBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eG1sLWZyYWdtZW50IHRlc3Q9InRlc3QiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOF8xLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE5OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF84XzEueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCBhdHRyMT0iYTEiIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0L2phdmEiIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8wLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC9leHBlY3RlZC9KYXhlblhQYXRoVGVzdF85XzAueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhtbC1mcmFnbWVudCB0ZXN0PSJ0ZXN0IiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMS54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhOTk0NgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8xLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgYXR0cjE9ImExIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMi54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3ZTFmYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8yLnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQgYXR0cjI9ImEyIiB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIiB4bWxuczpleHQ9Imh0dHA6Ly9zb21lYm9keS5lbHNlcy5leHRlbnNpb24iLz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMy54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZmM0OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV8zLnhtbApAQCAtMCwwICsxLDE5IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzxkb2MgeG1sbnM6ZXh0PSJodHRwOi8vc29tZWJvZHkuZWxzZXMuZXh0ZW5zaW9uIj4KKyAgPGEgdGVzdD0idGVzdCIvPgorICA8YiBhdHRyMT0iYTEiIGF0dHIyPSJhMiIgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQvamF2YSI+CisgICAgPGEvPgorICA8L2I+Cis8L2RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfNC54bWwgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XzlfNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzA1MQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvZXhwZWN0ZWQvSmF4ZW5YUGF0aFRlc3RfOV80LnhtbApAQCAtMCwwICsxLDE0IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4bWwtZnJhZ21lbnQ+PCEtLSAtLT48L3htbC1mcmFnbWVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L2Nhc2VzL3hwYXRoL211Y2hfYWRvLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvbXVjaF9hZG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDhmYWQKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L2Nhc2VzL3hwYXRoL211Y2hfYWRvLnhtbApAQCAtMCwwICsxLDY4NTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPFBMQVk+Cis8VElUTEU+TXVjaCBBZG8gYWJvdXQgTm90aGluZzwvVElUTEU+CisKKzxGTT4KKzxQPlRleHQgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IE1vYnkgTGV4aWNhbCBUb29scywgMTk5Mi48L1A+Cis8UD5TR01MIG1hcmt1cCBieSBKb24gQm9zYWssIDE5OTItMTk5NC48L1A+Cis8UD5YTUwgdmVyc2lvbiBieSBKb24gQm9zYWssIDE5OTYtMTk5OC48L1A+Cis8UD5UaGlzIHdvcmsgbWF5IGJlIGZyZWVseSBjb3BpZWQgYW5kIGRpc3RyaWJ1dGVkIHdvcmxkd2lkZS48L1A+Cis8L0ZNPgorCisKKzxQRVJTT05BRT4KKzxUSVRMRT5EcmFtYXRpcyBQZXJzb25hZTwvVElUTEU+CisKKzxQRVJTT05BPkRPTiBQRURSTywgcHJpbmNlIG9mIEFycmFnb24uPC9QRVJTT05BPgorPFBFUlNPTkE+RE9OIEpPSE4sIGhpcyBiYXN0YXJkIGJyb3RoZXIuPC9QRVJTT05BPgorPFBFUlNPTkE+Q0xBVURJTywgYSB5b3VuZyBsb3JkIG9mIEZsb3JlbmNlLjwvUEVSU09OQT4KKzxQRVJTT05BPkJFTkVESUNLLCBhIHlvdW5nIGxvcmQgb2YgUGFkdWEuPC9QRVJTT05BPgorPFBFUlNPTkE+TEVPTkFUTywgZ292ZXJub3Igb2YgTWVzc2luYS48L1BFUlNPTkE+Cis8UEVSU09OQT5BTlRPTklPLCBoaXMgYnJvdGhlci48L1BFUlNPTkE+Cis8UEVSU09OQT5CQUxUSEFTQVIsIGF0dGVuZGFudCBvbiBEb24gUGVkcm8uPC9QRVJTT05BPgorCis8UEdST1VQPgorPFBFUlNPTkE+Q09OUkFERTwvUEVSU09OQT4KKzxQRVJTT05BPkJPUkFDSElPPC9QRVJTT05BPgorPEdSUERFU0NSPmZvbGxvd2VycyBvZiBEb24gSm9obi48L0dSUERFU0NSPgorPC9QR1JPVVA+CisKKzxQRVJTT05BPkZSSUFSIEZSQU5DSVM8L1BFUlNPTkE+Cis8UEVSU09OQT5ET0dCRVJSWSwgYSBjb25zdGFibGUuPC9QRVJTT05BPgorPFBFUlNPTkE+VkVSR0VTLCBhIGhlYWRib3JvdWdoLjwvUEVSU09OQT4KKzxQRVJTT05BPkEgU2V4dG9uLjwvUEVSU09OQT4KKzxQRVJTT05BPkEgQm95LjwvUEVSU09OQT4KKzxQRVJTT05BPkhFUk8sIGRhdWdodGVyIHRvIExlb25hdG8uPC9QRVJTT05BPgorPFBFUlNPTkE+QkVBVFJJQ0UsIG5pZWNlIHRvIExlb25hdG8uPC9QRVJTT05BPgorCis8UEdST1VQPgorPFBFUlNPTkE+TUFSR0FSRVQ8L1BFUlNPTkE+Cis8UEVSU09OQT5VUlNVTEE8L1BFUlNPTkE+Cis8R1JQREVTQ1I+Z2VudGxld29tZW4gYXR0ZW5kaW5nIG9uIEhlcm8uPC9HUlBERVNDUj4KKzwvUEdST1VQPgorCis8UEVSU09OQT5NZXNzZW5nZXJzLCBXYXRjaCwgQXR0ZW5kYW50cywgJmFtcDtjLiA8L1BFUlNPTkE+Cis8L1BFUlNPTkFFPgorCis8U0NOREVTQ1I+U0NFTkUgIE1lc3NpbmEuPC9TQ05ERVNDUj4KKworPFBMQVlTVUJUPk1VQ0ggQURPIEFCT1VUIE5PVEhJTkc8L1BMQVlTVUJUPgorCis8QUNUPjxUSVRMRT5BQ1QgSTwvVElUTEU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSS4gIEJlZm9yZSBMRU9OQVRPJ1MgaG91c2UuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBMRU9OQVRPLCBIRVJPLCBhbmQgQkVBVFJJQ0UsIHdpdGggYQorTWVzc2VuZ2VyPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIGxlYXJuIGluIHRoaXMgbGV0dGVyIHRoYXQgRG9uIFBldGVyIG9mIEFycmFnb248L0xJTkU+Cis8TElORT5jb21lcyB0aGlzIG5pZ2h0IHRvIE1lc3NpbmEuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5IZSBpcyB2ZXJ5IG5lYXIgYnkgdGhpczogaGUgd2FzIG5vdCB0aHJlZSBsZWFndWVzIG9mZjwvTElORT4KKzxMSU5FPndoZW4gSSBsZWZ0IGhpbS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Ib3cgbWFueSBnZW50bGVtZW4gaGF2ZSB5b3UgbG9zdCBpbiB0aGlzIGFjdGlvbj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KKzxMSU5FPkJ1dCBmZXcgb2YgYW55IHNvcnQsIGFuZCBub25lIG9mIG5hbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+QSB2aWN0b3J5IGlzIHR3aWNlIGl0c2VsZiB3aGVuIHRoZSBhY2hpZXZlciBicmluZ3M8L0xJTkU+Cis8TElORT5ob21lIGZ1bGwgbnVtYmVycy4gSSBmaW5kIGhlcmUgdGhhdCBEb24gUGV0ZXIgaGF0aDwvTElORT4KKzxMSU5FPmJlc3Rvd2VkIG11Y2ggaG9ub3VyIG9uIGEgeW91bmcgRmxvcmVudGluZSBjYWxsZWQgQ2xhdWRpby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KKzxMSU5FPk11Y2ggZGVzZXJ2ZWQgb24gaGlzIHBhcnQgYW5kIGVxdWFsbHkgcmVtZW1iZXJlZCBieTwvTElORT4KKzxMSU5FPkRvbiBQZWRybzogaGUgaGF0aCBib3JuZSBoaW1zZWxmIGJleW9uZCB0aGU8L0xJTkU+Cis8TElORT5wcm9taXNlIG9mIGhpcyBhZ2UsIGRvaW5nLCBpbiB0aGUgZmlndXJlIG9mIGEgbGFtYiw8L0xJTkU+Cis8TElORT50aGUgZmVhdHMgb2YgYSBsaW9uOiBoZSBoYXRoIGluZGVlZCBiZXR0ZXI8L0xJTkU+Cis8TElORT5iZXR0ZXJlZCBleHBlY3RhdGlvbiB0aGFuIHlvdSBtdXN0IGV4cGVjdCBvZiBtZSB0bzwvTElORT4KKzxMSU5FPnRlbGwgeW91IGhvdy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5IZSBoYXRoIGFuIHVuY2xlIGhlcmUgaW4gTWVzc2luYSB3aWxsIGJlIHZlcnkgbXVjaDwvTElORT4KKzxMSU5FPmdsYWQgb2YgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5JIGhhdmUgYWxyZWFkeSBkZWxpdmVyZWQgaGltIGxldHRlcnMsIGFuZCB0aGVyZTwvTElORT4KKzxMSU5FPmFwcGVhcnMgbXVjaCBqb3kgaW4gaGltOyBldmVuIHNvIG11Y2ggdGhhdCBqb3kgY291bGQ8L0xJTkU+Cis8TElORT5ub3Qgc2hvdyBpdHNlbGYgbW9kZXN0IGVub3VnaCB3aXRob3V0IGEgYmFkZ2Ugb2Y8L0xJTkU+Cis8TElORT5iaXR0ZXJuZXNzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkRpZCBoZSBicmVhayBvdXQgaW50byB0ZWFycz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KKzxMSU5FPkluIGdyZWF0IG1lYXN1cmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+QSBraW5kIG92ZXJmbG93IG9mIGtpbmRuZXNzOiB0aGVyZSBhcmUgbm8gZmFjZXM8L0xJTkU+Cis8TElORT50cnVlciB0aGFuIHRob3NlIHRoYXQgYXJlIHNvIHdhc2hlZC4gSG93IG11Y2g8L0xJTkU+Cis8TElORT5iZXR0ZXIgaXMgaXQgdG8gd2VlcCBhdCBqb3kgdGhhbiB0byBqb3kgYXQgd2VlcGluZyE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SSBwcmF5IHlvdSwgaXMgU2lnbmlvciBNb3VudGFudG8gcmV0dXJuZWQgZnJvbSB0aGU8L0xJTkU+Cis8TElORT53YXJzIG9yIG5vPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgorPExJTkU+SSBrbm93IG5vbmUgb2YgdGhhdCBuYW1lLCBsYWR5OiB0aGVyZSB3YXMgbm9uZSBzdWNoPC9MSU5FPgorPExJTkU+aW4gdGhlIGFybXkgb2YgYW55IHNvcnQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBpcyBoZSB0aGF0IHlvdSBhc2sgZm9yLCBuaWVjZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5NeSBjb3VzaW4gbWVhbnMgU2lnbmlvciBCZW5lZGljayBvZiBQYWR1YS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KKzxMSU5FPk8sIGhlJ3MgcmV0dXJuZWQ7IGFuZCBhcyBwbGVhc2FudCBhcyBldmVyIGhlIHdhcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SGUgc2V0IHVwIGhpcyBiaWxscyBoZXJlIGluIE1lc3NpbmEgYW5kIGNoYWxsZW5nZWQ8L0xJTkU+Cis8TElORT5DdXBpZCBhdCB0aGUgZmxpZ2h0OyBhbmQgbXkgdW5jbGUncyBmb29sLCByZWFkaW5nPC9MSU5FPgorPExJTkU+dGhlIGNoYWxsZW5nZSwgc3Vic2NyaWJlZCBmb3IgQ3VwaWQsIGFuZCBjaGFsbGVuZ2VkPC9MSU5FPgorPExJTkU+aGltIGF0IHRoZSBiaXJkLWJvbHQuIEkgcHJheSB5b3UsIGhvdyBtYW55IGhhdGggaGU8L0xJTkU+Cis8TElORT5raWxsZWQgYW5kIGVhdGVuIGluIHRoZXNlIHdhcnM/IEJ1dCBob3cgbWFueSBoYXRoPC9MSU5FPgorPExJTkU+aGUga2lsbGVkPyBmb3IgaW5kZWVkIEkgcHJvbWlzZWQgdG8gZWF0IGFsbCBvZiBoaXMga2lsbGluZy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5GYWl0aCwgbmllY2UsIHlvdSB0YXggU2lnbmlvciBCZW5lZGljayB0b28gbXVjaDs8L0xJTkU+Cis8TElORT5idXQgaGUnbGwgYmUgbWVldCB3aXRoIHlvdSwgSSBkb3VidCBpdCBub3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5IZSBoYXRoIGRvbmUgZ29vZCBzZXJ2aWNlLCBsYWR5LCBpbiB0aGVzZSB3YXJzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Zb3UgaGFkIG11c3R5IHZpY3R1YWwsIGFuZCBoZSBoYXRoIGhvbHAgdG8gZWF0IGl0OjwvTElORT4KKzxMSU5FPmhlIGlzIGEgdmVyeSB2YWxpYW50IHRyZW5jaGVybWFuOyBoZSBoYXRoIGFuPC9MSU5FPgorPExJTkU+ZXhjZWxsZW50IHN0b21hY2guPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5BbmQgYSBnb29kIHNvbGRpZXIgdG9vLCBsYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5BbmQgYSBnb29kIHNvbGRpZXIgdG8gYSBsYWR5OiBidXQgd2hhdCBpcyBoZSB0byBhIGxvcmQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5BIGxvcmQgdG8gYSBsb3JkLCBhIG1hbiB0byBhIG1hbjsgc3R1ZmZlZCB3aXRoIGFsbDwvTElORT4KKzxMSU5FPmhvbm91cmFibGUgdmlydHVlcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SXQgaXMgc28sIGluZGVlZDsgaGUgaXMgbm8gbGVzcyB0aGFuIGEgc3R1ZmZlZCBtYW46PC9MSU5FPgorPExJTkU+YnV0IGZvciB0aGUgc3R1ZmZpbmcsLS13ZWxsLCB3ZSBhcmUgYWxsIG1vcnRhbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Zb3UgbXVzdCBub3QsIHNpciwgbWlzdGFrZSBteSBuaWVjZS4gVGhlcmUgaXMgYTwvTElORT4KKzxMSU5FPmtpbmQgb2YgbWVycnkgd2FyIGJldHdpeHQgU2lnbmlvciBCZW5lZGljayBhbmQgaGVyOjwvTElORT4KKzxMSU5FPnRoZXkgbmV2ZXIgbWVldCBidXQgdGhlcmUncyBhIHNraXJtaXNoIG9mIHdpdDwvTElORT4KKzxMSU5FPmJldHdlZW4gdGhlbS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+QWxhcyEgaGUgZ2V0cyBub3RoaW5nIGJ5IHRoYXQuIEluIG91ciBsYXN0PC9MSU5FPgorPExJTkU+Y29uZmxpY3QgZm91ciBvZiBoaXMgZml2ZSB3aXRzIHdlbnQgaGFsdGluZyBvZmYsIGFuZDwvTElORT4KKzxMSU5FPm5vdyBpcyB0aGUgd2hvbGUgbWFuIGdvdmVybmVkIHdpdGggb25lOiBzbyB0aGF0IGlmPC9MSU5FPgorPExJTkU+aGUgaGF2ZSB3aXQgZW5vdWdoIHRvIGtlZXAgaGltc2VsZiB3YXJtLCBsZXQgaGltPC9MSU5FPgorPExJTkU+YmVhciBpdCBmb3IgYSBkaWZmZXJlbmNlIGJldHdlZW4gaGltc2VsZiBhbmQgaGlzPC9MSU5FPgorPExJTkU+aG9yc2U7IGZvciBpdCBpcyBhbGwgdGhlIHdlYWx0aCB0aGF0IGhlIGhhdGggbGVmdCw8L0xJTkU+Cis8TElORT50byBiZSBrbm93biBhIHJlYXNvbmFibGUgY3JlYXR1cmUuIFdobyBpcyBoaXM8L0xJTkU+Cis8TElORT5jb21wYW5pb24gbm93PyBIZSBoYXRoIGV2ZXJ5IG1vbnRoIGEgbmV3IHN3b3JuIGJyb3RoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5Jcyd0IHBvc3NpYmxlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5WZXJ5IGVhc2lseSBwb3NzaWJsZTogaGUgd2VhcnMgaGlzIGZhaXRoIGJ1dCBhczwvTElORT4KKzxMSU5FPnRoZSBmYXNoaW9uIG9mIGhpcyBoYXQ7IGl0IGV2ZXIgY2hhbmdlcyB3aXRoIHRoZTwvTElORT4KKzxMSU5FPm5leHQgYmxvY2suPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5JIHNlZSwgbGFkeSwgdGhlIGdlbnRsZW1hbiBpcyBub3QgaW4geW91ciBib29rcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+Tm87IGFuIGhlIHdlcmUsIEkgd291bGQgYnVybiBteSBzdHVkeS4gQnV0LCBJIHByYXk8L0xJTkU+Cis8TElORT55b3UsIHdobyBpcyBoaXMgY29tcGFuaW9uPyBJcyB0aGVyZSBubyB5b3VuZzwvTElORT4KKzxMSU5FPnNxdWFyZXIgbm93IHRoYXQgd2lsbCBtYWtlIGEgdm95YWdlIHdpdGggaGltIHRvIHRoZSBkZXZpbD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1lc3NlbmdlcjwvU1BFQUtFUj4KKzxMSU5FPkhlIGlzIG1vc3QgaW4gdGhlIGNvbXBhbnkgb2YgdGhlIHJpZ2h0IG5vYmxlIENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk8gTG9yZCwgaGUgd2lsbCBoYW5nIHVwb24gaGltIGxpa2UgYSBkaXNlYXNlOiBoZTwvTElORT4KKzxMSU5FPmlzIHNvb25lciBjYXVnaHQgdGhhbiB0aGUgcGVzdGlsZW5jZSwgYW5kIHRoZSB0YWtlcjwvTElORT4KKzxMSU5FPnJ1bnMgcHJlc2VudGx5IG1hZC4gR29kIGhlbHAgdGhlIG5vYmxlIENsYXVkaW8hIGlmPC9MSU5FPgorPExJTkU+aGUgaGF2ZSBjYXVnaHQgdGhlIEJlbmVkaWNrLCBpdCB3aWxsIGNvc3QgaGltIGE8L0xJTkU+Cis8TElORT50aG91c2FuZCBwb3VuZCBlcmUgYScgYmUgY3VyZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5JIHdpbGwgaG9sZCBmcmllbmRzIHdpdGggeW91LCBsYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5EbywgZ29vZCBmcmllbmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+WW91IHdpbGwgbmV2ZXIgcnVuIG1hZCwgbmllY2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk5vLCBub3QgdGlsbCBhIGhvdCBKYW51YXJ5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgorPExJTkU+RG9uIFBlZHJvIGlzIGFwcHJvYWNoZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIERPTiBQRURSTywgRE9OIEpPSE4sIENMQVVESU8sIEJFTkVESUNLLAorYW5kIEJBTFRIQVNBUjwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Hb29kIFNpZ25pb3IgTGVvbmF0bywgeW91IGFyZSBjb21lIHRvIG1lZXQgeW91cjwvTElORT4KKzxMSU5FPnRyb3VibGU6IHRoZSBmYXNoaW9uIG9mIHRoZSB3b3JsZCBpcyB0byBhdm9pZDwvTElORT4KKzxMSU5FPmNvc3QsIGFuZCB5b3UgZW5jb3VudGVyIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk5ldmVyIGNhbWUgdHJvdWJsZSB0byBteSBob3VzZSBpbiB0aGUgbGlrZW5lc3Mgb2Y8L0xJTkU+Cis8TElORT55b3VyIGdyYWNlOiBmb3IgdHJvdWJsZSBiZWluZyBnb25lLCBjb21mb3J0IHNob3VsZDwvTElORT4KKzxMSU5FPnJlbWFpbjsgYnV0IHdoZW4geW91IGRlcGFydCBmcm9tIG1lLCBzb3Jyb3cgYWJpZGVzPC9MSU5FPgorPExJTkU+YW5kIGhhcHBpbmVzcyB0YWtlcyBoaXMgbGVhdmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Zb3UgZW1icmFjZSB5b3VyIGNoYXJnZSB0b28gd2lsbGluZ2x5LiBJIHRoaW5rIHRoaXM8L0xJTkU+Cis8TElORT5pcyB5b3VyIGRhdWdodGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkhlciBtb3RoZXIgaGF0aCBtYW55IHRpbWVzIHRvbGQgbWUgc28uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldlcmUgeW91IGluIGRvdWJ0LCBzaXIsIHRoYXQgeW91IGFza2VkIGhlcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5TaWduaW9yIEJlbmVkaWNrLCBubzsgZm9yIHRoZW4gd2VyZSB5b3UgYSBjaGlsZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPllvdSBoYXZlIGl0IGZ1bGwsIEJlbmVkaWNrOiB3ZSBtYXkgZ3Vlc3MgYnkgdGhpczwvTElORT4KKzxMSU5FPndoYXQgeW91IGFyZSwgYmVpbmcgYSBtYW4uIFRydWx5LCB0aGUgbGFkeSBmYXRoZXJzPC9MSU5FPgorPExJTkU+aGVyc2VsZi4gQmUgaGFwcHksIGxhZHk7IGZvciB5b3UgYXJlIGxpa2UgYW48L0xJTkU+Cis8TElORT5ob25vdXJhYmxlIGZhdGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SWYgU2lnbmlvciBMZW9uYXRvIGJlIGhlciBmYXRoZXIsIHNoZSB3b3VsZCBub3Q8L0xJTkU+Cis8TElORT5oYXZlIGhpcyBoZWFkIG9uIGhlciBzaG91bGRlcnMgZm9yIGFsbCBNZXNzaW5hLCBhczwvTElORT4KKzxMSU5FPmxpa2UgaGltIGFzIHNoZSBpcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SSB3b25kZXIgdGhhdCB5b3Ugd2lsbCBzdGlsbCBiZSB0YWxraW5nLCBTaWduaW9yPC9MSU5FPgorPExJTkU+QmVuZWRpY2s6IG5vYm9keSBtYXJrcyB5b3UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldoYXQsIG15IGRlYXIgTGFkeSBEaXNkYWluISBhcmUgeW91IHlldCBsaXZpbmc/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPklzIGl0IHBvc3NpYmxlIGRpc2RhaW4gc2hvdWxkIGRpZSB3aGlsZSBzaGUgaGF0aDwvTElORT4KKzxMSU5FPnN1Y2ggbWVldCBmb29kIHRvIGZlZWQgaXQgYXMgU2lnbmlvciBCZW5lZGljaz88L0xJTkU+Cis8TElORT5Db3VydGVzeSBpdHNlbGYgbXVzdCBjb252ZXJ0IHRvIGRpc2RhaW4sIGlmIHlvdSBjb21lPC9MSU5FPgorPExJTkU+aW4gaGVyIHByZXNlbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGVuIGlzIGNvdXJ0ZXN5IGEgdHVybmNvYXQuIEJ1dCBpdCBpcyBjZXJ0YWluIEk8L0xJTkU+Cis8TElORT5hbSBsb3ZlZCBvZiBhbGwgbGFkaWVzLCBvbmx5IHlvdSBleGNlcHRlZDogYW5kIEk8L0xJTkU+Cis8TElORT53b3VsZCBJIGNvdWxkIGZpbmQgaW4gbXkgaGVhcnQgdGhhdCBJIGhhZCBub3QgYSBoYXJkPC9MSU5FPgorPExJTkU+aGVhcnQ7IGZvciwgdHJ1bHksIEkgbG92ZSBub25lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5BIGRlYXIgaGFwcGluZXNzIHRvIHdvbWVuOiB0aGV5IHdvdWxkIGVsc2UgaGF2ZTwvTElORT4KKzxMSU5FPmJlZW4gdHJvdWJsZWQgd2l0aCBhIHBlcm5pY2lvdXMgc3VpdG9yLiBJIHRoYW5rIEdvZDwvTElORT4KKzxMSU5FPmFuZCBteSBjb2xkIGJsb29kLCBJIGFtIG9mIHlvdXIgaHVtb3VyIGZvciB0aGF0OiBJPC9MSU5FPgorPExJTkU+aGFkIHJhdGhlciBoZWFyIG15IGRvZyBiYXJrIGF0IGEgY3JvdyB0aGFuIGEgbWFuPC9MSU5FPgorPExJTkU+c3dlYXIgaGUgbG92ZXMgbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkdvZCBrZWVwIHlvdXIgbGFkeXNoaXAgc3RpbGwgaW4gdGhhdCBtaW5kISBzbyBzb21lPC9MSU5FPgorPExJTkU+Z2VudGxlbWFuIG9yIG90aGVyIHNoYWxsICdzY2FwZSBhIHByZWRlc3RpbmF0ZTwvTElORT4KKzxMSU5FPnNjcmF0Y2hlZCBmYWNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5TY3JhdGNoaW5nIGNvdWxkIG5vdCBtYWtlIGl0IHdvcnNlLCBhbiAndHdlcmUgc3VjaDwvTElORT4KKzxMSU5FPmEgZmFjZSBhcyB5b3VycyB3ZXJlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XZWxsLCB5b3UgYXJlIGEgcmFyZSBwYXJyb3QtdGVhY2hlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+QSBiaXJkIG9mIG15IHRvbmd1ZSBpcyBiZXR0ZXIgdGhhbiBhIGJlYXN0IG9mIHlvdXJzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIHdvdWxkIG15IGhvcnNlIGhhZCB0aGUgc3BlZWQgb2YgeW91ciB0b25ndWUsIGFuZDwvTElORT4KKzxMSU5FPnNvIGdvb2QgYSBjb250aW51ZXIuIEJ1dCBrZWVwIHlvdXIgd2F5LCBpJyBHb2QnczwvTElORT4KKzxMSU5FPm5hbWU7IEkgaGF2ZSBkb25lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Zb3UgYWx3YXlzIGVuZCB3aXRoIGEgamFkZSdzIHRyaWNrOiBJIGtub3cgeW91IG9mIG9sZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQgaXMgdGhlIHN1bSBvZiBhbGwsIExlb25hdG8uIFNpZ25pb3IgQ2xhdWRpbzwvTElORT4KKzxMSU5FPmFuZCBTaWduaW9yIEJlbmVkaWNrLCBteSBkZWFyIGZyaWVuZCBMZW9uYXRvIGhhdGg8L0xJTkU+Cis8TElORT5pbnZpdGVkIHlvdSBhbGwuIEkgdGVsbCBoaW0gd2Ugc2hhbGwgc3RheSBoZXJlIGF0PC9MSU5FPgorPExJTkU+dGhlIGxlYXN0IGEgbW9udGg7IGFuZCBoZSBoZWFydGlseSBwcmF5cyBzb21lPC9MSU5FPgorPExJTkU+b2NjYXNpb24gbWF5IGRldGFpbiB1cyBsb25nZXIuIEkgZGFyZSBzd2VhciBoZSBpcyBubzwvTElORT4KKzxMSU5FPmh5cG9jcml0ZSwgYnV0IHByYXlzIGZyb20gaGlzIGhlYXJ0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPklmIHlvdSBzd2VhciwgbXkgbG9yZCwgeW91IHNoYWxsIG5vdCBiZSBmb3Jzd29ybi48L0xJTkU+Cis8U1RBR0VESVI+VG8gRE9OIEpPSE48L1NUQUdFRElSPgorPExJTkU+TGV0IG1lIGJpZCB5b3Ugd2VsY29tZSwgbXkgbG9yZDogYmVpbmcgcmVjb25jaWxlZCB0bzwvTElORT4KKzxMSU5FPnRoZSBwcmluY2UgeW91ciBicm90aGVyLCBJIG93ZSB5b3UgYWxsIGR1dHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPkkgdGhhbmsgeW91OiBJIGFtIG5vdCBvZiBtYW55IHdvcmRzLCBidXQgSSB0aGFuazwvTElORT4KKzxMSU5FPnlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5QbGVhc2UgaXQgeW91ciBncmFjZSBsZWFkIG9uPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+WW91ciBoYW5kLCBMZW9uYXRvOyB3ZSB3aWxsIGdvIHRvZ2V0aGVyLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGV1bnQgYWxsIGV4Y2VwdCBCRU5FRElDSyBhbmQgQ0xBVURJTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QmVuZWRpY2ssIGRpZHN0IHRob3Ugbm90ZSB0aGUgZGF1Z2h0ZXIgb2YgU2lnbmlvciBMZW9uYXRvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIG5vdGVkIGhlciBub3Q7IGJ1dCBJIGxvb2tlZCBvbiBoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SXMgc2hlIG5vdCBhIG1vZGVzdCB5b3VuZyBsYWR5PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5EbyB5b3UgcXVlc3Rpb24gbWUsIGFzIGFuIGhvbmVzdCBtYW4gc2hvdWxkIGRvLCBmb3I8L0xJTkU+Cis8TElORT5teSBzaW1wbGUgdHJ1ZSBqdWRnbWVudDsgb3Igd291bGQgeW91IGhhdmUgbWUgc3BlYWs8L0xJTkU+Cis8TElORT5hZnRlciBteSBjdXN0b20sIGFzIGJlaW5nIGEgcHJvZmVzc2VkIHR5cmFudCB0byB0aGVpciBzZXg/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+Tm87IEkgcHJheSB0aGVlIHNwZWFrIGluIHNvYmVyIGp1ZGdtZW50LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XaHksIGknIGZhaXRoLCBtZXRoaW5rcyBzaGUncyB0b28gbG93IGZvciBhIGhpZ2g8L0xJTkU+Cis8TElORT5wcmFpc2UsIHRvbyBicm93biBmb3IgYSBmYWlyIHByYWlzZSBhbmQgdG9vIGxpdHRsZTwvTElORT4KKzxMSU5FPmZvciBhIGdyZWF0IHByYWlzZTogb25seSB0aGlzIGNvbW1lbmRhdGlvbiBJIGNhbjwvTElORT4KKzxMSU5FPmFmZm9yZCBoZXIsIHRoYXQgd2VyZSBzaGUgb3RoZXIgdGhhbiBzaGUgaXMsIHNoZTwvTElORT4KKzxMSU5FPndlcmUgdW5oYW5kc29tZTsgYW5kIGJlaW5nIG5vIG90aGVyIGJ1dCBhcyBzaGUgaXMsIEk8L0xJTkU+Cis8TElORT5kbyBub3QgbGlrZSBoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VGhvdSB0aGlua2VzdCBJIGFtIGluIHNwb3J0OiBJIHByYXkgdGhlZSB0ZWxsIG1lPC9MSU5FPgorPExJTkU+dHJ1bHkgaG93IHRob3UgbGlrZXN0IGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+V291bGQgeW91IGJ1eSBoZXIsIHRoYXQgeW91IGlucXVpcmUgYWZ0ZXIgaGVyPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkNhbiB0aGUgd29ybGQgYnV5IHN1Y2ggYSBqZXdlbD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+WWVhLCBhbmQgYSBjYXNlIHRvIHB1dCBpdCBpbnRvLiBCdXQgc3BlYWsgeW91IHRoaXM8L0xJTkU+Cis8TElORT53aXRoIGEgc2FkIGJyb3c/IG9yIGRvIHlvdSBwbGF5IHRoZSBmbG91dGluZyBKYWNrLDwvTElORT4KKzxMSU5FPnRvIHRlbGwgdXMgQ3VwaWQgaXMgYSBnb29kIGhhcmUtZmluZGVyIGFuZCBWdWxjYW4gYTwvTElORT4KKzxMSU5FPnJhcmUgY2FycGVudGVyPyBDb21lLCBpbiB3aGF0IGtleSBzaGFsbCBhIG1hbiB0YWtlPC9MSU5FPgorPExJTkU+eW91LCB0byBnbyBpbiB0aGUgc29uZz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JbiBtaW5lIGV5ZSBzaGUgaXMgdGhlIHN3ZWV0ZXN0IGxhZHkgdGhhdCBldmVyIEk8L0xJTkU+Cis8TElORT5sb29rZWQgb24uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkkgY2FuIHNlZSB5ZXQgd2l0aG91dCBzcGVjdGFjbGVzIGFuZCBJIHNlZSBubyBzdWNoPC9MSU5FPgorPExJTkU+bWF0dGVyOiB0aGVyZSdzIGhlciBjb3VzaW4sIGFuIHNoZSB3ZXJlIG5vdDwvTElORT4KKzxMSU5FPnBvc3Nlc3NlZCB3aXRoIGEgZnVyeSwgZXhjZWVkcyBoZXIgYXMgbXVjaCBpbiBiZWF1dHk8L0xJTkU+Cis8TElORT5hcyB0aGUgZmlyc3Qgb2YgTWF5IGRvdGggdGhlIGxhc3Qgb2YgRGVjZW1iZXIuIEJ1dCBJPC9MSU5FPgorPExJTkU+aG9wZSB5b3UgaGF2ZSBubyBpbnRlbnQgdG8gdHVybiBodXNiYW5kLCBoYXZlIHlvdT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JIHdvdWxkIHNjYXJjZSB0cnVzdCBteXNlbGYsIHRob3VnaCBJIGhhZCBzd29ybiB0aGU8L0xJTkU+Cis8TElORT5jb250cmFyeSwgaWYgSGVybyB3b3VsZCBiZSBteSB3aWZlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Jcyd0IGNvbWUgdG8gdGhpcz8gSW4gZmFpdGgsIGhhdGggbm90IHRoZSB3b3JsZDwvTElORT4KKzxMSU5FPm9uZSBtYW4gYnV0IGhlIHdpbGwgd2VhciBoaXMgY2FwIHdpdGggc3VzcGljaW9uPzwvTElORT4KKzxMSU5FPlNoYWxsIEkgbmV2ZXIgc2VlIGEgYmFjaGVsb3Igb2YgdGhyZWUtc2NvcmUgYWdhaW4/PC9MSU5FPgorPExJTkU+R28gdG8sIGknIGZhaXRoOyBhbiB0aG91IHdpbHQgbmVlZHMgdGhydXN0IHRoeSBuZWNrPC9MSU5FPgorPExJTkU+aW50byBhIHlva2UsIHdlYXIgdGhlIHByaW50IG9mIGl0IGFuZCBzaWdoIGF3YXk8L0xJTkU+Cis8TElORT5TdW5kYXlzLiBMb29rIERvbiBQZWRybyBpcyByZXR1cm5lZCB0byBzZWVrIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+UmUtZW50ZXIgRE9OIFBFRFJPPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldoYXQgc2VjcmV0IGhhdGggaGVsZCB5b3UgaGVyZSwgdGhhdCB5b3UgZm9sbG93ZWQ8L0xJTkU+Cis8TElORT5ub3QgdG8gTGVvbmF0bydzPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIHdvdWxkIHlvdXIgZ3JhY2Ugd291bGQgY29uc3RyYWluIG1lIHRvIHRlbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JIGNoYXJnZSB0aGVlIG9uIHRoeSBhbGxlZ2lhbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Zb3UgaGVhciwgQ291bnQgQ2xhdWRpbzogSSBjYW4gYmUgc2VjcmV0IGFzIGEgZHVtYjwvTElORT4KKzxMSU5FPm1hbjsgSSB3b3VsZCBoYXZlIHlvdSB0aGluayBzbzsgYnV0LCBvbiBteTwvTElORT4KKzxMSU5FPmFsbGVnaWFuY2UsIG1hcmsgeW91IHRoaXMsIG9uIG15IGFsbGVnaWFuY2UuIEhlIGlzPC9MSU5FPgorPExJTkU+aW4gbG92ZS4gV2l0aCB3aG8/IG5vdyB0aGF0IGlzIHlvdXIgZ3JhY2UncyBwYXJ0LjwvTElORT4KKzxMSU5FPk1hcmsgaG93IHNob3J0IGhpcyBhbnN3ZXIgaXM7LS1XaXRoIEhlcm8sIExlb25hdG8nczwvTElORT4KKzxMSU5FPnNob3J0IGRhdWdodGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklmIHRoaXMgd2VyZSBzbywgc28gd2VyZSBpdCB1dHRlcmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5MaWtlIHRoZSBvbGQgdGFsZSwgbXkgbG9yZDogJ2l0IGlzIG5vdCBzbywgbm9yPC9MSU5FPgorPExJTkU+J3R3YXMgbm90IHNvLCBidXQsIGluZGVlZCwgR29kIGZvcmJpZCBpdCBzaG91bGQgYmU8L0xJTkU+Cis8TElORT5zby4nPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SWYgbXkgcGFzc2lvbiBjaGFuZ2Ugbm90IHNob3J0bHksIEdvZCBmb3JiaWQgaXQ8L0xJTkU+Cis8TElORT5zaG91bGQgYmUgb3RoZXJ3aXNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QW1lbiwgaWYgeW91IGxvdmUgaGVyOyBmb3IgdGhlIGxhZHkgaXMgdmVyeSB3ZWxsIHdvcnRoeS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Zb3Ugc3BlYWsgdGhpcyB0byBmZXRjaCBtZSBpbiwgbXkgbG9yZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkJ5IG15IHRyb3RoLCBJIHNwZWFrIG15IHRob3VnaHQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QW5kLCBpbiBmYWl0aCwgbXkgbG9yZCwgSSBzcG9rZSBtaW5lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BbmQsIGJ5IG15IHR3byBmYWl0aHMgYW5kIHRyb3RocywgbXkgbG9yZCwgSSBzcG9rZSBtaW5lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQgSSBsb3ZlIGhlciwgSSBmZWVsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+VGhhdCBzaGUgaXMgd29ydGh5LCBJIGtub3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQgSSBuZWl0aGVyIGZlZWwgaG93IHNoZSBzaG91bGQgYmUgbG92ZWQgbm9yPC9MSU5FPgorPExJTkU+a25vdyBob3cgc2hlIHNob3VsZCBiZSB3b3J0aHksIGlzIHRoZSBvcGluaW9uIHRoYXQ8L0xJTkU+Cis8TElORT5maXJlIGNhbm5vdCBtZWx0IG91dCBvZiBtZTogSSB3aWxsIGRpZSBpbiBpdCBhdCB0aGUgc3Rha2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UaG91IHdhc3QgZXZlciBhbiBvYnN0aW5hdGUgaGVyZXRpYyBpbiB0aGUgZGVzcGl0ZTwvTElORT4KKzxMSU5FPm9mIGJlYXV0eS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5BbmQgbmV2ZXIgY291bGQgbWFpbnRhaW4gaGlzIHBhcnQgYnV0IGluIHRoZSBmb3JjZTwvTElORT4KKzxMSU5FPm9mIGhpcyB3aWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGF0IGEgd29tYW4gY29uY2VpdmVkIG1lLCBJIHRoYW5rIGhlcjsgdGhhdCBzaGU8L0xJTkU+Cis8TElORT5icm91Z2h0IG1lIHVwLCBJIGxpa2V3aXNlIGdpdmUgaGVyIG1vc3QgaHVtYmxlPC9MSU5FPgorPExJTkU+dGhhbmtzOiBidXQgdGhhdCBJIHdpbGwgaGF2ZSBhIHJlY2hlYXQgd2luZGVkIGluIG15PC9MSU5FPgorPExJTkU+Zm9yZWhlYWQsIG9yIGhhbmcgbXkgYnVnbGUgaW4gYW4gaW52aXNpYmxlIGJhbGRyaWNrLDwvTElORT4KKzxMSU5FPmFsbCB3b21lbiBzaGFsbCBwYXJkb24gbWUuIEJlY2F1c2UgSSB3aWxsIG5vdCBkbzwvTElORT4KKzxMSU5FPnRoZW0gdGhlIHdyb25nIHRvIG1pc3RydXN0IGFueSwgSSB3aWxsIGRvIG15c2VsZiB0aGU8L0xJTkU+Cis8TElORT5yaWdodCB0byB0cnVzdCBub25lOyBhbmQgdGhlIGZpbmUgaXMsIGZvciB0aGUgd2hpY2g8L0xJTkU+Cis8TElORT5JIG1heSBnbyB0aGUgZmluZXIsIEkgd2lsbCBsaXZlIGEgYmFjaGVsb3IuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JIHNoYWxsIHNlZSB0aGVlLCBlcmUgSSBkaWUsIGxvb2sgcGFsZSB3aXRoIGxvdmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldpdGggYW5nZXIsIHdpdGggc2lja25lc3MsIG9yIHdpdGggaHVuZ2VyLCBteSBsb3JkLDwvTElORT4KKzxMSU5FPm5vdCB3aXRoIGxvdmU6IHByb3ZlIHRoYXQgZXZlciBJIGxvc2UgbW9yZSBibG9vZDwvTElORT4KKzxMSU5FPndpdGggbG92ZSB0aGFuIEkgd2lsbCBnZXQgYWdhaW4gd2l0aCBkcmlua2luZywgcGljazwvTElORT4KKzxMSU5FPm91dCBtaW5lIGV5ZXMgd2l0aCBhIGJhbGxhZC1tYWtlcidzIHBlbiBhbmQgaGFuZyBtZTwvTElORT4KKzxMSU5FPnVwIGF0IHRoZSBkb29yIG9mIGEgYnJvdGhlbC1ob3VzZSBmb3IgdGhlIHNpZ24gb2Y8L0xJTkU+Cis8TElORT5ibGluZCBDdXBpZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldlbGwsIGlmIGV2ZXIgdGhvdSBkb3N0IGZhbGwgZnJvbSB0aGlzIGZhaXRoLCB0aG91PC9MSU5FPgorPExJTkU+d2lsdCBwcm92ZSBhIG5vdGFibGUgYXJndW1lbnQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPklmIEkgZG8sIGhhbmcgbWUgaW4gYSBib3R0bGUgbGlrZSBhIGNhdCBhbmQgc2hvb3Q8L0xJTkU+Cis8TElORT5hdCBtZTsgYW5kIGhlIHRoYXQgaGl0cyBtZSwgbGV0IGhpbSBiZSBjbGFwcGVkIG9uPC9MSU5FPgorPExJTkU+dGhlIHNob3VsZGVyLCBhbmQgY2FsbGVkIEFkYW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XZWxsLCBhcyB0aW1lIHNoYWxsIHRyeTogJ0luIHRpbWUgdGhlIHNhdmFnZSBidWxsPC9MSU5FPgorPExJTkU+ZG90aCBiZWFyIHRoZSB5b2tlLic8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+VGhlIHNhdmFnZSBidWxsIG1heTsgYnV0IGlmIGV2ZXIgdGhlIHNlbnNpYmxlPC9MSU5FPgorPExJTkU+QmVuZWRpY2sgYmVhciBpdCwgcGx1Y2sgb2ZmIHRoZSBidWxsJ3MgaG9ybnMgYW5kIHNldDwvTElORT4KKzxMSU5FPnRoZW0gaW4gbXkgZm9yZWhlYWQ6IGFuZCBsZXQgbWUgYmUgdmlsZWx5IHBhaW50ZWQsPC9MSU5FPgorPExJTkU+YW5kIGluIHN1Y2ggZ3JlYXQgbGV0dGVycyBhcyB0aGV5IHdyaXRlICdIZXJlIGlzPC9MSU5FPgorPExJTkU+Z29vZCBob3JzZSB0byBoaXJlLCcgbGV0IHRoZW0gc2lnbmlmeSB1bmRlciBteSBzaWduPC9MSU5FPgorPExJTkU+J0hlcmUgeW91IG1heSBzZWUgQmVuZWRpY2sgdGhlIG1hcnJpZWQgbWFuLic8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JZiB0aGlzIHNob3VsZCBldmVyIGhhcHBlbiwgdGhvdSB3b3VsZHN0IGJlIGhvcm4tbWFkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+TmF5LCBpZiBDdXBpZCBoYXZlIG5vdCBzcGVudCBhbGwgaGlzIHF1aXZlciBpbjwvTElORT4KKzxMSU5FPlZlbmljZSwgdGhvdSB3aWx0IHF1YWtlIGZvciB0aGlzIHNob3J0bHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkkgbG9vayBmb3IgYW4gZWFydGhxdWFrZSB0b28sIHRoZW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XZWxsLCB5b3UgdGVtcG9yaXplIHdpdGggdGhlIGhvdXJzLiBJbiB0aGU8L0xJTkU+Cis8TElORT5tZWFudGltZSwgZ29vZCBTaWduaW9yIEJlbmVkaWNrLCByZXBhaXIgdG88L0xJTkU+Cis8TElORT5MZW9uYXRvJ3M6IGNvbW1lbmQgbWUgdG8gaGltIGFuZCB0ZWxsIGhpbSBJIHdpbGw8L0xJTkU+Cis8TElORT5ub3QgZmFpbCBoaW0gYXQgc3VwcGVyOyBmb3IgaW5kZWVkIGhlIGhhdGggbWFkZTwvTElORT4KKzxMSU5FPmdyZWF0IHByZXBhcmF0aW9uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIGhhdmUgYWxtb3N0IG1hdHRlciBlbm91Z2ggaW4gbWUgZm9yIHN1Y2ggYW48L0xJTkU+Cis8TElORT5lbWJhc3NhZ2U7IGFuZCBzbyBJIGNvbW1pdCB5b3UtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlRvIHRoZSB0dWl0aW9uIG9mIEdvZDogRnJvbSBteSBob3VzZSwgaWYgSSBoYWQgaXQsLS08L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPlRoZSBzaXh0aCBvZiBKdWx5OiBZb3VyIGxvdmluZyBmcmllbmQsIEJlbmVkaWNrLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5OYXksIG1vY2sgbm90LCBtb2NrIG5vdC4gVGhlIGJvZHkgb2YgeW91cjwvTElORT4KKzxMSU5FPmRpc2NvdXJzZSBpcyBzb21ldGltZSBndWFyZGVkIHdpdGggZnJhZ21lbnRzLCBhbmQ8L0xJTkU+Cis8TElORT50aGUgZ3VhcmRzIGFyZSBidXQgc2xpZ2h0bHkgYmFzdGVkIG9uIG5laXRoZXI6IGVyZTwvTElORT4KKzxMSU5FPnlvdSBmbG91dCBvbGQgZW5kcyBhbnkgZnVydGhlciwgZXhhbWluZSB5b3VyPC9MSU5FPgorPExJTkU+Y29uc2NpZW5jZTogYW5kIHNvIEkgbGVhdmUgeW91LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5NeSBsaWVnZSwgeW91ciBoaWdobmVzcyBub3cgbWF5IGRvIG1lIGdvb2QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5NeSBsb3ZlIGlzIHRoaW5lIHRvIHRlYWNoOiB0ZWFjaCBpdCBidXQgaG93LDwvTElORT4KKzxMSU5FPkFuZCB0aG91IHNoYWx0IHNlZSBob3cgYXB0IGl0IGlzIHRvIGxlYXJuPC9MSU5FPgorPExJTkU+QW55IGhhcmQgbGVzc29uIHRoYXQgbWF5IGRvIHRoZWUgZ29vZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5IYXRoIExlb25hdG8gYW55IHNvbiwgbXkgbG9yZD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk5vIGNoaWxkIGJ1dCBIZXJvOyBzaGUncyBoaXMgb25seSBoZWlyLjwvTElORT4KKzxMSU5FPkRvc3QgdGhvdSBhZmZlY3QgaGVyLCBDbGF1ZGlvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk8sIG15IGxvcmQsPC9MSU5FPgorPExJTkU+V2hlbiB5b3Ugd2VudCBvbndhcmQgb24gdGhpcyBlbmRlZCBhY3Rpb24sPC9MSU5FPgorPExJTkU+SSBsb29rJ2QgdXBvbiBoZXIgd2l0aCBhIHNvbGRpZXIncyBleWUsPC9MSU5FPgorPExJTkU+VGhhdCBsaWtlZCwgYnV0IGhhZCBhIHJvdWdoZXIgdGFzayBpbiBoYW5kPC9MSU5FPgorPExJTkU+VGhhbiB0byBkcml2ZSBsaWtpbmcgdG8gdGhlIG5hbWUgb2YgbG92ZTo8L0xJTkU+Cis8TElORT5CdXQgbm93IEkgYW0gcmV0dXJuJ2QgYW5kIHRoYXQgd2FyLXRob3VnaHRzPC9MSU5FPgorPExJTkU+SGF2ZSBsZWZ0IHRoZWlyIHBsYWNlcyB2YWNhbnQsIGluIHRoZWlyIHJvb21zPC9MSU5FPgorPExJTkU+Q29tZSB0aHJvbmdpbmcgc29mdCBhbmQgZGVsaWNhdGUgZGVzaXJlcyw8L0xJTkU+Cis8TElORT5BbGwgcHJvbXB0aW5nIG1lIGhvdyBmYWlyIHlvdW5nIEhlcm8gaXMsPC9MSU5FPgorPExJTkU+U2F5aW5nLCBJIGxpa2VkIGhlciBlcmUgSSB3ZW50IHRvIHdhcnMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UaG91IHdpbHQgYmUgbGlrZSBhIGxvdmVyIHByZXNlbnRseTwvTElORT4KKzxMSU5FPkFuZCB0aXJlIHRoZSBoZWFyZXIgd2l0aCBhIGJvb2sgb2Ygd29yZHMuPC9MSU5FPgorPExJTkU+SWYgdGhvdSBkb3N0IGxvdmUgZmFpciBIZXJvLCBjaGVyaXNoIGl0LDwvTElORT4KKzxMSU5FPkFuZCBJIHdpbGwgYnJlYWsgd2l0aCBoZXIgYW5kIHdpdGggaGVyIGZhdGhlciw8L0xJTkU+Cis8TElORT5BbmQgdGhvdSBzaGFsdCBoYXZlIGhlci4gV2FzJ3Qgbm90IHRvIHRoaXMgZW5kPC9MSU5FPgorPExJTkU+VGhhdCB0aG91IGJlZ2FuJ3N0IHRvIHR3aXN0IHNvIGZpbmUgYSBzdG9yeT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Ib3cgc3dlZXRseSB5b3UgZG8gbWluaXN0ZXIgdG8gbG92ZSw8L0xJTkU+Cis8TElORT5UaGF0IGtub3cgbG92ZSdzIGdyaWVmIGJ5IGhpcyBjb21wbGV4aW9uITwvTElORT4KKzxMSU5FPkJ1dCBsZXN0IG15IGxpa2luZyBtaWdodCB0b28gc3VkZGVuIHNlZW0sPC9MSU5FPgorPExJTkU+SSB3b3VsZCBoYXZlIHNhbHZlZCBpdCB3aXRoIGEgbG9uZ2VyIHRyZWF0aXNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBuZWVkIHRoZSBicmlkZ2UgbXVjaCBicm9hZGVyIHRoYW4gdGhlIGZsb29kPzwvTElORT4KKzxMSU5FPlRoZSBmYWlyZXN0IGdyYW50IGlzIHRoZSBuZWNlc3NpdHkuPC9MSU5FPgorPExJTkU+TG9vaywgd2hhdCB3aWxsIHNlcnZlIGlzIGZpdDogJ3RpcyBvbmNlLCB0aG91IGxvdmVzdCw8L0xJTkU+Cis8TElORT5BbmQgSSB3aWxsIGZpdCB0aGVlIHdpdGggdGhlIHJlbWVkeS48L0xJTkU+Cis8TElORT5JIGtub3cgd2Ugc2hhbGwgaGF2ZSByZXZlbGxpbmcgdG8tbmlnaHQ6PC9MSU5FPgorPExJTkU+SSB3aWxsIGFzc3VtZSB0aHkgcGFydCBpbiBzb21lIGRpc2d1aXNlPC9MSU5FPgorPExJTkU+QW5kIHRlbGwgZmFpciBIZXJvIEkgYW0gQ2xhdWRpbyw8L0xJTkU+Cis8TElORT5BbmQgaW4gaGVyIGJvc29tIEknbGwgdW5jbGFzcCBteSBoZWFydDwvTElORT4KKzxMSU5FPkFuZCB0YWtlIGhlciBoZWFyaW5nIHByaXNvbmVyIHdpdGggdGhlIGZvcmNlPC9MSU5FPgorPExJTkU+QW5kIHN0cm9uZyBlbmNvdW50ZXIgb2YgbXkgYW1vcm91cyB0YWxlOjwvTElORT4KKzxMSU5FPlRoZW4gYWZ0ZXIgdG8gaGVyIGZhdGhlciB3aWxsIEkgYnJlYWs7PC9MSU5FPgorPExJTkU+QW5kIHRoZSBjb25jbHVzaW9uIGlzLCBzaGUgc2hhbGwgYmUgdGhpbmUuPC9MSU5FPgorPExJTkU+SW4gcHJhY3Rpc2UgbGV0IHVzIHB1dCBpdCBwcmVzZW50bHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIElJLiAgQSByb29tIGluIExFT05BVE8ncyBob3VzZS48L1RJVExFPgorPFNUQUdFRElSPkVudGVyIExFT05BVE8gYW5kIEFOVE9OSU8sIG1lZXRpbmc8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkhvdyBub3csIGJyb3RoZXIhIFdoZXJlIGlzIG15IGNvdXNpbiwgeW91ciBzb24/PC9MSU5FPgorPExJTkU+aGF0aCBoZSBwcm92aWRlZCB0aGlzIG11c2ljPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkhlIGlzIHZlcnkgYnVzeSBhYm91dCBpdC4gQnV0LCBicm90aGVyLCBJIGNhbiB0ZWxsPC9MSU5FPgorPExJTkU+eW91IHN0cmFuZ2UgbmV3cyB0aGF0IHlvdSB5ZXQgZHJlYW10IG5vdCBvZi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5BcmUgdGhleSBnb29kPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkFzIHRoZSBldmVudCBzdGFtcHMgdGhlbTogYnV0IHRoZXkgaGF2ZSBhIGdvb2Q8L0xJTkU+Cis8TElORT5jb3ZlcjsgdGhleSBzaG93IHdlbGwgb3V0d2FyZC4gVGhlIHByaW5jZSBhbmQgQ291bnQ8L0xJTkU+Cis8TElORT5DbGF1ZGlvLCB3YWxraW5nIGluIGEgdGhpY2stcGxlYWNoZWQgYWxsZXkgaW4gbWluZTwvTElORT4KKzxMSU5FPm9yY2hhcmQsIHdlcmUgdGh1cyBtdWNoIG92ZXJoZWFyZCBieSBhIG1hbiBvZiBtaW5lOjwvTElORT4KKzxMSU5FPnRoZSBwcmluY2UgZGlzY292ZXJlZCB0byBDbGF1ZGlvIHRoYXQgaGUgbG92ZWQgbXk8L0xJTkU+Cis8TElORT5uaWVjZSB5b3VyIGRhdWdodGVyIGFuZCBtZWFudCB0byBhY2tub3dsZWRnZSBpdDwvTElORT4KKzxMSU5FPnRoaXMgbmlnaHQgaW4gYSBkYW5jZTogYW5kIGlmIGhlIGZvdW5kIGhlcjwvTElORT4KKzxMSU5FPmFjY29yZGFudCwgaGUgbWVhbnQgdG8gdGFrZSB0aGUgcHJlc2VudCB0aW1lIGJ5IHRoZTwvTElORT4KKzxMSU5FPnRvcCBhbmQgaW5zdGFudGx5IGJyZWFrIHdpdGggeW91IG9mIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkhhdGggdGhlIGZlbGxvdyBhbnkgd2l0IHRoYXQgdG9sZCB5b3UgdGhpcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5BIGdvb2Qgc2hhcnAgZmVsbG93OiBJIHdpbGwgc2VuZCBmb3IgaGltOyBhbmQ8L0xJTkU+Cis8TElORT5xdWVzdGlvbiBoaW0geW91cnNlbGYuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+Tm8sIG5vOyB3ZSB3aWxsIGhvbGQgaXQgYXMgYSBkcmVhbSB0aWxsIGl0IGFwcGVhcjwvTElORT4KKzxMSU5FPml0c2VsZjogYnV0IEkgd2lsbCBhY3F1YWludCBteSBkYXVnaHRlciB3aXRoYWwsPC9MSU5FPgorPExJTkU+dGhhdCBzaGUgbWF5IGJlIHRoZSBiZXR0ZXIgcHJlcGFyZWQgZm9yIGFuIGFuc3dlciw8L0xJTkU+Cis8TElORT5pZiBwZXJhZHZlbnR1cmUgdGhpcyBiZSB0cnVlLiBHbyB5b3UgYW5kIHRlbGwgaGVyIG9mIGl0LjwvTElORT4KKzxTVEFHRURJUj5FbnRlciBBdHRlbmRhbnRzPC9TVEFHRURJUj4KKzxMSU5FPkNvdXNpbnMsIHlvdSBrbm93IHdoYXQgeW91IGhhdmUgdG8gZG8uIE8sIEkgY3J5IHlvdTwvTElORT4KKzxMSU5FPm1lcmN5LCBmcmllbmQ7IGdvIHlvdSB3aXRoIG1lLCBhbmQgSSB3aWxsIHVzZSB5b3VyPC9MSU5FPgorPExJTkU+c2tpbGwuIEdvb2QgY291c2luLCBoYXZlIGEgY2FyZSB0aGlzIGJ1c3kgdGltZS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSUlJLiAgVGhlIHNhbWUuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBET04gSk9ITiBhbmQgQ09OUkFERTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+V2hhdCB0aGUgZ29vZC15ZWFyLCBteSBsb3JkISB3aHkgYXJlIHlvdSB0aHVzIG91dDwvTElORT4KKzxMSU5FPm9mIG1lYXN1cmUgc2FkPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5UaGVyZSBpcyBubyBtZWFzdXJlIGluIHRoZSBvY2Nhc2lvbiB0aGF0IGJyZWVkczs8L0xJTkU+Cis8TElORT50aGVyZWZvcmUgdGhlIHNhZG5lc3MgaXMgd2l0aG91dCBsaW1pdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5Zb3Ugc2hvdWxkIGhlYXIgcmVhc29uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5BbmQgd2hlbiBJIGhhdmUgaGVhcmQgaXQsIHdoYXQgYmxlc3NpbmcgYnJpbmdzIGl0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KKzxMSU5FPklmIG5vdCBhIHByZXNlbnQgcmVtZWR5LCBhdCBsZWFzdCBhIHBhdGllbnQ8L0xJTkU+Cis8TElORT5zdWZmZXJhbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5JIHdvbmRlciB0aGF0IHRob3UsIGJlaW5nLCBhcyB0aG91IHNheWVzdCB0aG91IGFydCw8L0xJTkU+Cis8TElORT5ib3JuIHVuZGVyIFNhdHVybiwgZ29lc3QgYWJvdXQgdG8gYXBwbHkgYSBtb3JhbDwvTElORT4KKzxMSU5FPm1lZGljaW5lIHRvIGEgbW9ydGlmeWluZyBtaXNjaGllZi4gSSBjYW5ub3QgaGlkZTwvTElORT4KKzxMSU5FPndoYXQgSSBhbTogSSBtdXN0IGJlIHNhZCB3aGVuIEkgaGF2ZSBjYXVzZSBhbmQgc21pbGU8L0xJTkU+Cis8TElORT5hdCBubyBtYW4ncyBqZXN0cywgZWF0IHdoZW4gSSBoYXZlIHN0b21hY2ggYW5kIHdhaXQ8L0xJTkU+Cis8TElORT5mb3Igbm8gbWFuJ3MgbGVpc3VyZSwgc2xlZXAgd2hlbiBJIGFtIGRyb3dzeSBhbmQ8L0xJTkU+Cis8TElORT50ZW5kIG9uIG5vIG1hbidzIGJ1c2luZXNzLCBsYXVnaCB3aGVuIEkgYW0gbWVycnkgYW5kPC9MSU5FPgorPExJTkU+Y2xhdyBubyBtYW4gaW4gaGlzIGh1bW91ci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5ZZWEsIGJ1dCB5b3UgbXVzdCBub3QgbWFrZSB0aGUgZnVsbCBzaG93IG9mIHRoaXM8L0xJTkU+Cis8TElORT50aWxsIHlvdSBtYXkgZG8gaXQgd2l0aG91dCBjb250cm9sbWVudC4gWW91IGhhdmUgb2Y8L0xJTkU+Cis8TElORT5sYXRlIHN0b29kIG91dCBhZ2FpbnN0IHlvdXIgYnJvdGhlciwgYW5kIGhlIGhhdGg8L0xJTkU+Cis8TElORT50YSdlbiB5b3UgbmV3bHkgaW50byBoaXMgZ3JhY2U7IHdoZXJlIGl0IGlzPC9MSU5FPgorPExJTkU+aW1wb3NzaWJsZSB5b3Ugc2hvdWxkIHRha2UgdHJ1ZSByb290IGJ1dCBieSB0aGU8L0xJTkU+Cis8TElORT5mYWlyIHdlYXRoZXIgdGhhdCB5b3UgbWFrZSB5b3Vyc2VsZjogaXQgaXMgbmVlZGZ1bDwvTElORT4KKzxMSU5FPnRoYXQgeW91IGZyYW1lIHRoZSBzZWFzb24gZm9yIHlvdXIgb3duIGhhcnZlc3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPkkgaGFkIHJhdGhlciBiZSBhIGNhbmtlciBpbiBhIGhlZGdlIHRoYW4gYSByb3NlIGluPC9MSU5FPgorPExJTkU+aGlzIGdyYWNlLCBhbmQgaXQgYmV0dGVyIGZpdHMgbXkgYmxvb2QgdG8gYmU8L0xJTkU+Cis8TElORT5kaXNkYWluZWQgb2YgYWxsIHRoYW4gdG8gZmFzaGlvbiBhIGNhcnJpYWdlIHRvIHJvYjwvTElORT4KKzxMSU5FPmxvdmUgZnJvbSBhbnk6IGluIHRoaXMsIHRob3VnaCBJIGNhbm5vdCBiZSBzYWlkIHRvPC9MSU5FPgorPExJTkU+YmUgYSBmbGF0dGVyaW5nIGhvbmVzdCBtYW4sIGl0IG11c3Qgbm90IGJlIGRlbmllZDwvTElORT4KKzxMSU5FPmJ1dCBJIGFtIGEgcGxhaW4tZGVhbGluZyB2aWxsYWluLiBJIGFtIHRydXN0ZWQgd2l0aDwvTElORT4KKzxMSU5FPmEgbXV6emxlIGFuZCBlbmZyYW5jaGlzZWQgd2l0aCBhIGNsb2c7IHRoZXJlZm9yZSBJPC9MSU5FPgorPExJTkU+aGF2ZSBkZWNyZWVkIG5vdCB0byBzaW5nIGluIG15IGNhZ2UuIElmIEkgaGFkIG15PC9MSU5FPgorPExJTkU+bW91dGgsIEkgd291bGQgYml0ZTsgaWYgSSBoYWQgbXkgbGliZXJ0eSwgSSB3b3VsZCBkbzwvTElORT4KKzxMSU5FPm15IGxpa2luZzogaW4gdGhlIG1lYW50aW1lIGxldCBtZSBiZSB0aGF0IEkgYW0gYW5kPC9MSU5FPgorPExJTkU+c2VlayBub3QgdG8gYWx0ZXIgbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+Q2FuIHlvdSBtYWtlIG5vIHVzZSBvZiB5b3VyIGRpc2NvbnRlbnQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPkkgbWFrZSBhbGwgdXNlIG9mIGl0LCBmb3IgSSB1c2UgaXQgb25seS48L0xJTkU+Cis8TElORT5XaG8gY29tZXMgaGVyZT88L0xJTkU+Cis8U1RBR0VESVI+RW50ZXIgQk9SQUNISU88L1NUQUdFRElSPgorPExJTkU+V2hhdCBuZXdzLCBCb3JhY2hpbz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+SSBjYW1lIHlvbmRlciBmcm9tIGEgZ3JlYXQgc3VwcGVyOiB0aGUgcHJpbmNlIHlvdXI8L0xJTkU+Cis8TElORT5icm90aGVyIGlzIHJveWFsbHkgZW50ZXJ0YWluZWQgYnkgTGVvbmF0bzogYW5kIEk8L0xJTkU+Cis8TElORT5jYW4gZ2l2ZSB5b3UgaW50ZWxsaWdlbmNlIG9mIGFuIGludGVuZGVkIG1hcnJpYWdlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5XaWxsIGl0IHNlcnZlIGZvciBhbnkgbW9kZWwgdG8gYnVpbGQgbWlzY2hpZWYgb24/PC9MSU5FPgorPExJTkU+V2hhdCBpcyBoZSBmb3IgYSBmb29sIHRoYXQgYmV0cm90aHMgaGltc2VsZiB0bzwvTElORT4KKzxMSU5FPnVucXVpZXRuZXNzPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5NYXJyeSwgaXQgaXMgeW91ciBicm90aGVyJ3MgcmlnaHQgaGFuZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+V2hvPyB0aGUgbW9zdCBleHF1aXNpdGUgQ2xhdWRpbz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+RXZlbiBoZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+QSBwcm9wZXIgc3F1aXJlISBBbmQgd2hvLCBhbmQgd2hvPyB3aGljaCB3YXkgbG9va3M8L0xJTkU+Cis8TElORT5oZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+TWFycnksIG9uIEhlcm8sIHRoZSBkYXVnaHRlciBhbmQgaGVpciBvZiBMZW9uYXRvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5BIHZlcnkgZm9yd2FyZCBNYXJjaC1jaGljayEgSG93IGNhbWUgeW91IHRvIHRoaXM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPkJlaW5nIGVudGVydGFpbmVkIGZvciBhIHBlcmZ1bWVyLCBhcyBJIHdhcyBzbW9raW5nIGE8L0xJTkU+Cis8TElORT5tdXN0eSByb29tLCBjb21lcyBtZSB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvLCBoYW5kPC9MSU5FPgorPExJTkU+aW4gaGFuZCBpbiBzYWQgY29uZmVyZW5jZTogSSB3aGlwdCBtZSBiZWhpbmQgdGhlPC9MSU5FPgorPExJTkU+YXJyYXM7IGFuZCB0aGVyZSBoZWFyZCBpdCBhZ3JlZWQgdXBvbiB0aGF0IHRoZTwvTElORT4KKzxMSU5FPnByaW5jZSBzaG91bGQgd29vIEhlcm8gZm9yIGhpbXNlbGYsIGFuZCBoYXZpbmc8L0xJTkU+Cis8TElORT5vYnRhaW5lZCBoZXIsIGdpdmUgaGVyIHRvIENvdW50IENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPkNvbWUsIGNvbWUsIGxldCB1cyB0aGl0aGVyOiB0aGlzIG1heSBwcm92ZSBmb29kIHRvPC9MSU5FPgorPExJTkU+bXkgZGlzcGxlYXN1cmUuIFRoYXQgeW91bmcgc3RhcnQtdXAgaGF0aCBhbGwgdGhlPC9MSU5FPgorPExJTkU+Z2xvcnkgb2YgbXkgb3ZlcnRocm93OiBpZiBJIGNhbiBjcm9zcyBoaW0gYW55IHdheSwgSTwvTElORT4KKzxMSU5FPmJsZXNzIG15c2VsZiBldmVyeSB3YXkuIFlvdSBhcmUgYm90aCBzdXJlLCBhbmQgd2lsbCBhc3Npc3QgbWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+VG8gdGhlIGRlYXRoLCBteSBsb3JkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5MZXQgdXMgdG8gdGhlIGdyZWF0IHN1cHBlcjogdGhlaXIgY2hlZXIgaXMgdGhlPC9MSU5FPgorPExJTkU+Z3JlYXRlciB0aGF0IEkgYW0gc3ViZHVlZC4gV291bGQgdGhlIGNvb2sgd2VyZSBvZjwvTElORT4KKzxMSU5FPm15IG1pbmQhIFNoYWxsIHdlIGdvIHByb3ZlIHdoYXQncyB0byBiZSBkb25lPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5XZSdsbCB3YWl0IHVwb24geW91ciBsb3Jkc2hpcC48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzwvQUNUPgorCis8QUNUPjxUSVRMRT5BQ1QgSUk8L1RJVExFPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIEkuICBBIGhhbGwgaW4gTEVPTkFUTydTIGhvdXNlLjwvVElUTEU+Cis8U1RBR0VESVI+RW50ZXIgTEVPTkFUTywgQU5UT05JTywgSEVSTywgQkVBVFJJQ0UsIGFuZCBvdGhlcnM8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPldhcyBub3QgQ291bnQgSm9obiBoZXJlIGF0IHN1cHBlcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5JIHNhdyBoaW0gbm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Ib3cgdGFydGx5IHRoYXQgZ2VudGxlbWFuIGxvb2tzISBJIG5ldmVyIGNhbiBzZWU8L0xJTkU+Cis8TElORT5oaW0gYnV0IEkgYW0gaGVhcnQtYnVybmVkIGFuIGhvdXIgYWZ0ZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+SGUgaXMgb2YgYSB2ZXJ5IG1lbGFuY2hvbHkgZGlzcG9zaXRpb24uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkhlIHdlcmUgYW4gZXhjZWxsZW50IG1hbiB0aGF0IHdlcmUgbWFkZSBqdXN0IGluIHRoZTwvTElORT4KKzxMSU5FPm1pZHdheSBiZXR3ZWVuIGhpbSBhbmQgQmVuZWRpY2s6IHRoZSBvbmUgaXMgdG9vPC9MSU5FPgorPExJTkU+bGlrZSBhbiBpbWFnZSBhbmQgc2F5cyBub3RoaW5nLCBhbmQgdGhlIG90aGVyIHRvbzwvTElORT4KKzxMSU5FPmxpa2UgbXkgbGFkeSdzIGVsZGVzdCBzb24sIGV2ZXJtb3JlIHRhdHRsaW5nLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlRoZW4gaGFsZiBTaWduaW9yIEJlbmVkaWNrJ3MgdG9uZ3VlIGluIENvdW50IEpvaG4nczwvTElORT4KKzxMSU5FPm1vdXRoLCBhbmQgaGFsZiBDb3VudCBKb2huJ3MgbWVsYW5jaG9seSBpbiBTaWduaW9yPC9MSU5FPgorPExJTkU+QmVuZWRpY2sncyBmYWNlLC0tPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPldpdGggYSBnb29kIGxlZyBhbmQgYSBnb29kIGZvb3QsIHVuY2xlLCBhbmQgbW9uZXk8L0xJTkU+Cis8TElORT5lbm91Z2ggaW4gaGlzIHB1cnNlLCBzdWNoIGEgbWFuIHdvdWxkIHdpbiBhbnkgd29tYW48L0xJTkU+Cis8TElORT5pbiB0aGUgd29ybGQsIGlmIGEnIGNvdWxkIGdldCBoZXIgZ29vZC13aWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkJ5IG15IHRyb3RoLCBuaWVjZSwgdGhvdSB3aWx0IG5ldmVyIGdldCB0aGVlIGE8L0xJTkU+Cis8TElORT5odXNiYW5kLCBpZiB0aG91IGJlIHNvIHNocmV3ZCBvZiB0aHkgdG9uZ3VlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkluIGZhaXRoLCBzaGUncyB0b28gY3Vyc3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlRvbyBjdXJzdCBpcyBtb3JlIHRoYW4gY3Vyc3Q6IEkgc2hhbGwgbGVzc2VuIEdvZCdzPC9MSU5FPgorPExJTkU+c2VuZGluZyB0aGF0IHdheTsgZm9yIGl0IGlzIHNhaWQsICdHb2Qgc2VuZHMgYSBjdXJzdDwvTElORT4KKzxMSU5FPmNvdyBzaG9ydCBob3JuczsnIGJ1dCB0byBhIGNvdyB0b28gY3Vyc3QgaGUgc2VuZHMgbm9uZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5TbywgYnkgYmVpbmcgdG9vIGN1cnN0LCBHb2Qgd2lsbCBzZW5kIHlvdSBubyBob3Jucy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SnVzdCwgaWYgaGUgc2VuZCBtZSBubyBodXNiYW5kOyBmb3IgdGhlIHdoaWNoPC9MSU5FPgorPExJTkU+Ymxlc3NpbmcgSSBhbSBhdCBoaW0gdXBvbiBteSBrbmVlcyBldmVyeSBtb3JuaW5nIGFuZDwvTElORT4KKzxMSU5FPmV2ZW5pbmcuIExvcmQsIEkgY291bGQgbm90IGVuZHVyZSBhIGh1c2JhbmQgd2l0aCBhPC9MSU5FPgorPExJTkU+YmVhcmQgb24gaGlzIGZhY2U6IEkgaGFkIHJhdGhlciBsaWUgaW4gdGhlIHdvb2xsZW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+WW91IG1heSBsaWdodCBvbiBhIGh1c2JhbmQgdGhhdCBoYXRoIG5vIGJlYXJkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5XaGF0IHNob3VsZCBJIGRvIHdpdGggaGltPyBkcmVzcyBoaW0gaW4gbXkgYXBwYXJlbDwvTElORT4KKzxMSU5FPmFuZCBtYWtlIGhpbSBteSB3YWl0aW5nLWdlbnRsZXdvbWFuPyBIZSB0aGF0IGhhdGggYTwvTElORT4KKzxMSU5FPmJlYXJkIGlzIG1vcmUgdGhhbiBhIHlvdXRoLCBhbmQgaGUgdGhhdCBoYXRoIG5vPC9MSU5FPgorPExJTkU+YmVhcmQgaXMgbGVzcyB0aGFuIGEgbWFuOiBhbmQgaGUgdGhhdCBpcyBtb3JlIHRoYW48L0xJTkU+Cis8TElORT5hIHlvdXRoIGlzIG5vdCBmb3IgbWUsIGFuZCBoZSB0aGF0IGlzIGxlc3MgdGhhbiBhPC9MSU5FPgorPExJTkU+bWFuLCBJIGFtIG5vdCBmb3IgaGltOiB0aGVyZWZvcmUsIEkgd2lsbCBldmVuIHRha2U8L0xJTkU+Cis8TElORT5zaXhwZW5jZSBpbiBlYXJuZXN0IG9mIHRoZSBiZWFyLXdhcmQsIGFuZCBsZWFkIGhpczwvTElORT4KKzxMSU5FPmFwZXMgaW50byBoZWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPldlbGwsIHRoZW4sIGdvIHlvdSBpbnRvIGhlbGw/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk5vLCBidXQgdG8gdGhlIGdhdGU7IGFuZCB0aGVyZSB3aWxsIHRoZSBkZXZpbCBtZWV0PC9MSU5FPgorPExJTkU+bWUsIGxpa2UgYW4gb2xkIGN1Y2tvbGQsIHdpdGggaG9ybnMgb24gaGlzIGhlYWQsIGFuZDwvTElORT4KKzxMSU5FPnNheSAnR2V0IHlvdSB0byBoZWF2ZW4sIEJlYXRyaWNlLCBnZXQgeW91IHRvPC9MSU5FPgorPExJTkU+aGVhdmVuOyBoZXJlJ3Mgbm8gcGxhY2UgZm9yIHlvdSBtYWlkczonIHNvIGRlbGl2ZXI8L0xJTkU+Cis8TElORT5JIHVwIG15IGFwZXMsIGFuZCBhd2F5IHRvIFNhaW50IFBldGVyIGZvciB0aGU8L0xJTkU+Cis8TElORT5oZWF2ZW5zOyBoZSBzaG93cyBtZSB3aGVyZSB0aGUgYmFjaGVsb3JzIHNpdCwgYW5kPC9MSU5FPgorPExJTkU+dGhlcmUgbGl2ZSB3ZSBhcyBtZXJyeSBhcyB0aGUgZGF5IGlzIGxvbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+PFNUQUdFRElSPlRvIEhFUk88L1NUQUdFRElSPiAgV2VsbCwgbmllY2UsIEkgdHJ1c3QgeW91IHdpbGwgYmUgcnVsZWQ8L0xJTkU+Cis8TElORT5ieSB5b3VyIGZhdGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+WWVzLCBmYWl0aDsgaXQgaXMgbXkgY291c2luJ3MgZHV0eSB0byBtYWtlIGN1cnRzeTwvTElORT4KKzxMSU5FPmFuZCBzYXkgJ0ZhdGhlciwgYXMgaXQgcGxlYXNlIHlvdS4nIEJ1dCB5ZXQgZm9yIGFsbDwvTElORT4KKzxMSU5FPnRoYXQsIGNvdXNpbiwgbGV0IGhpbSBiZSBhIGhhbmRzb21lIGZlbGxvdywgb3IgZWxzZTwvTElORT4KKzxMSU5FPm1ha2UgYW5vdGhlciBjdXJ0c3kgYW5kIHNheSAnRmF0aGVyLCBhcyBpdCBwbGVhc2U8L0xJTkU+Cis8TElORT5tZS4nPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2VsbCwgbmllY2UsIEkgaG9wZSB0byBzZWUgeW91IG9uZSBkYXkgZml0dGVkIHdpdGggYSBodXNiYW5kLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Ob3QgdGlsbCBHb2QgbWFrZSBtZW4gb2Ygc29tZSBvdGhlciBtZXRhbCB0aGFuPC9MSU5FPgorPExJTkU+ZWFydGguIFdvdWxkIGl0IG5vdCBncmlldmUgYSB3b21hbiB0byBiZTwvTElORT4KKzxMSU5FPm92ZXJtYXN0ZXJlZCB3aXRoIGEgcGllcmNlIG9mIHZhbGlhbnQgZHVzdD8gdG8gbWFrZTwvTElORT4KKzxMSU5FPmFuIGFjY291bnQgb2YgaGVyIGxpZmUgdG8gYSBjbG9kIG9mIHdheXdhcmQgbWFybD88L0xJTkU+Cis8TElORT5ObywgdW5jbGUsIEknbGwgbm9uZTogQWRhbSdzIHNvbnMgYXJlIG15IGJyZXRocmVuOzwvTElORT4KKzxMSU5FPmFuZCwgdHJ1bHksIEkgaG9sZCBpdCBhIHNpbiB0byBtYXRjaCBpbiBteSBraW5kcmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkRhdWdodGVyLCByZW1lbWJlciB3aGF0IEkgdG9sZCB5b3U6IGlmIHRoZSBwcmluY2U8L0xJTkU+Cis8TElORT5kbyBzb2xpY2l0IHlvdSBpbiB0aGF0IGtpbmQsIHlvdSBrbm93IHlvdXIgYW5zd2VyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5UaGUgZmF1bHQgd2lsbCBiZSBpbiB0aGUgbXVzaWMsIGNvdXNpbiwgaWYgeW91IGJlPC9MSU5FPgorPExJTkU+bm90IHdvb2VkIGluIGdvb2QgdGltZTogaWYgdGhlIHByaW5jZSBiZSB0b288L0xJTkU+Cis8TElORT5pbXBvcnRhbnQsIHRlbGwgaGltIHRoZXJlIGlzIG1lYXN1cmUgaW4gZXZlcnkgdGhpbmc8L0xJTkU+Cis8TElORT5hbmQgc28gZGFuY2Ugb3V0IHRoZSBhbnN3ZXIuIEZvciwgaGVhciBtZSwgSGVybzo8L0xJTkU+Cis8TElORT53b29pbmcsIHdlZGRpbmcsIGFuZCByZXBlbnRpbmcsIGlzIGFzIGEgU2NvdGNoIGppZyw8L0xJTkU+Cis8TElORT5hIG1lYXN1cmUsIGFuZCBhIGNpbnF1ZSBwYWNlOiB0aGUgZmlyc3Qgc3VpdCBpcyBob3Q8L0xJTkU+Cis8TElORT5hbmQgaGFzdHksIGxpa2UgYSBTY290Y2ggamlnLCBhbmQgZnVsbCBhczwvTElORT4KKzxMSU5FPmZhbnRhc3RpY2FsOyB0aGUgd2VkZGluZywgbWFubmVybHktbW9kZXN0LCBhcyBhPC9MSU5FPgorPExJTkU+bWVhc3VyZSwgZnVsbCBvZiBzdGF0ZSBhbmQgYW5jaWVudHJ5OyBhbmQgdGhlbiBjb21lczwvTElORT4KKzxMSU5FPnJlcGVudGFuY2UgYW5kLCB3aXRoIGhpcyBiYWQgbGVncywgZmFsbHMgaW50byB0aGU8L0xJTkU+Cis8TElORT5jaW5xdWUgcGFjZSBmYXN0ZXIgYW5kIGZhc3RlciwgdGlsbCBoZSBzaW5rIGludG8gaGlzIGdyYXZlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkNvdXNpbiwgeW91IGFwcHJlaGVuZCBwYXNzaW5nIHNocmV3ZGx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JIGhhdmUgYSBnb29kIGV5ZSwgdW5jbGU7IEkgY2FuIHNlZSBhIGNodXJjaCBieSBkYXlsaWdodC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5UaGUgcmV2ZWxsZXJzIGFyZSBlbnRlcmluZywgYnJvdGhlcjogbWFrZSBnb29kIHJvb20uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTVEFHRURJUj5BbGwgcHV0IG9uIHRoZWlyIG1hc2tzPC9TVEFHRURJUj4KKzxTVEFHRURJUj5FbnRlciBET04gUEVEUk8sIENMQVVESU8sIEJFTkVESUNLLCBCQUxUSEFTQVIsCitET04gSk9ITiwgQk9SQUNISU8sIE1BUkdBUkVULCBVUlNVTEEgYW5kIG90aGVycywgbWFza2VkPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkxhZHksIHdpbGwgeW91IHdhbGsgYWJvdXQgd2l0aCB5b3VyIGZyaWVuZD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5TbyB5b3Ugd2FsayBzb2Z0bHkgYW5kIGxvb2sgc3dlZXRseSBhbmQgc2F5IG5vdGhpbmcsPC9MSU5FPgorPExJTkU+SSBhbSB5b3VycyBmb3IgdGhlIHdhbGs7IGFuZCBlc3BlY2lhbGx5IHdoZW4gSSB3YWxrIGF3YXkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaXRoIG1lIGluIHlvdXIgY29tcGFueT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5JIG1heSBzYXkgc28sIHdoZW4gSSBwbGVhc2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5BbmQgd2hlbiBwbGVhc2UgeW91IHRvIHNheSBzbz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5XaGVuIEkgbGlrZSB5b3VyIGZhdm91cjsgZm9yIEdvZCBkZWZlbmQgdGhlIGx1dGU8L0xJTkU+Cis8TElORT5zaG91bGQgYmUgbGlrZSB0aGUgY2FzZSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk15IHZpc29yIGlzIFBoaWxlbW9uJ3Mgcm9vZjsgd2l0aGluIHRoZSBob3VzZSBpcyBKb3ZlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPldoeSwgdGhlbiwgeW91ciB2aXNvciBzaG91bGQgYmUgdGhhdGNoZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5TcGVhayBsb3csIGlmIHlvdSBzcGVhayBsb3ZlLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5EcmF3aW5nIGhlciBhc2lkZTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Cis8TElORT5XZWxsLCBJIHdvdWxkIHlvdSBkaWQgbGlrZSBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+U28gd291bGQgbm90IEksIGZvciB5b3VyIG93biBzYWtlOyBmb3IgSSBoYXZlIG1hbnk8L0xJTkU+Cis8TElORT5pbGwtcXVhbGl0aWVzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+V2hpY2ggaXMgb25lPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5JIHNheSBteSBwcmF5ZXJzIGFsb3VkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+SSBsb3ZlIHlvdSB0aGUgYmV0dGVyOiB0aGUgaGVhcmVycyBtYXkgY3J5LCBBbWVuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5Hb2QgbWF0Y2ggbWUgd2l0aCBhIGdvb2QgZGFuY2VyITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+QW1lbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+QW5kIEdvZCBrZWVwIGhpbSBvdXQgb2YgbXkgc2lnaHQgd2hlbiB0aGUgZGFuY2UgaXM8L0xJTkU+Cis8TElORT5kb25lISBBbnN3ZXIsIGNsZXJrLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+Tm8gbW9yZSB3b3JkczogdGhlIGNsZXJrIGlzIGFuc3dlcmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+SSBrbm93IHlvdSB3ZWxsIGVub3VnaDsgeW91IGFyZSBTaWduaW9yIEFudG9uaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+QXQgYSB3b3JkLCBJIGFtIG5vdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KKzxMSU5FPkkga25vdyB5b3UgYnkgdGhlIHdhZ2dsaW5nIG9mIHlvdXIgaGVhZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5UbyB0ZWxsIHlvdSB0cnVlLCBJIGNvdW50ZXJmZWl0IGhpbS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KKzxMSU5FPllvdSBjb3VsZCBuZXZlciBkbyBoaW0gc28gaWxsLXdlbGwsIHVubGVzcyB5b3Ugd2VyZTwvTElORT4KKzxMSU5FPnRoZSB2ZXJ5IG1hbi4gSGVyZSdzIGhpcyBkcnkgaGFuZCB1cCBhbmQgZG93bjogeW91PC9MSU5FPgorPExJTkU+YXJlIGhlLCB5b3UgYXJlIGhlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkF0IGEgd29yZCwgSSBhbSBub3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5Db21lLCBjb21lLCBkbyB5b3UgdGhpbmsgSSBkbyBub3Qga25vdyB5b3UgYnkgeW91cjwvTElORT4KKzxMSU5FPmV4Y2VsbGVudCB3aXQ/IGNhbiB2aXJ0dWUgaGlkZSBpdHNlbGY/IEdvIHRvLDwvTElORT4KKzxMSU5FPm11bSwgeW91IGFyZSBoZTogZ3JhY2VzIHdpbGwgYXBwZWFyLCBhbmQgdGhlcmUncyBhbjwvTElORT4KKzxMSU5FPmVuZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+V2lsbCB5b3Ugbm90IHRlbGwgbWUgd2hvIHRvbGQgeW91IHNvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5ObywgeW91IHNoYWxsIHBhcmRvbiBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+Tm9yIHdpbGwgeW91IG5vdCB0ZWxsIG1lIHdobyB5b3UgYXJlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Ob3Qgbm93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5UaGF0IEkgd2FzIGRpc2RhaW5mdWwsIGFuZCB0aGF0IEkgaGFkIG15IGdvb2Qgd2l0PC9MSU5FPgorPExJTkU+b3V0IG9mIHRoZSAnSHVuZHJlZCBNZXJyeSBUYWxlczonLS13ZWxsIHRoaXMgd2FzPC9MSU5FPgorPExJTkU+U2lnbmlvciBCZW5lZGljayB0aGF0IHNhaWQgc28uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldoYXQncyBoZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SSBhbSBzdXJlIHlvdSBrbm93IGhpbSB3ZWxsIGVub3VnaC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+Tm90IEksIGJlbGlldmUgbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkRpZCBoZSBuZXZlciBtYWtlIHlvdSBsYXVnaD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SSBwcmF5IHlvdSwgd2hhdCBpcyBoZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+V2h5LCBoZSBpcyB0aGUgcHJpbmNlJ3MgamVzdGVyOiBhIHZlcnkgZHVsbCBmb29sOzwvTElORT4KKzxMSU5FPm9ubHkgaGlzIGdpZnQgaXMgaW4gZGV2aXNpbmcgaW1wb3NzaWJsZSBzbGFuZGVyczo8L0xJTkU+Cis8TElORT5ub25lIGJ1dCBsaWJlcnRpbmVzIGRlbGlnaHQgaW4gaGltOyBhbmQgdGhlPC9MSU5FPgorPExJTkU+Y29tbWVuZGF0aW9uIGlzIG5vdCBpbiBoaXMgd2l0LCBidXQgaW4gaGlzIHZpbGxhbnk7PC9MSU5FPgorPExJTkU+Zm9yIGhlIGJvdGggcGxlYXNlcyBtZW4gYW5kIGFuZ2VycyB0aGVtLCBhbmQgdGhlbjwvTElORT4KKzxMSU5FPnRoZXkgbGF1Z2ggYXQgaGltIGFuZCBiZWF0IGhpbS4gSSBhbSBzdXJlIGhlIGlzIGluPC9MSU5FPgorPExJTkU+dGhlIGZsZWV0OiBJIHdvdWxkIGhlIGhhZCBib2FyZGVkIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XaGVuIEkga25vdyB0aGUgZ2VudGxlbWFuLCBJJ2xsIHRlbGwgaGltIHdoYXQgeW91IHNheS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+RG8sIGRvOiBoZSdsbCBidXQgYnJlYWsgYSBjb21wYXJpc29uIG9yIHR3byBvbiBtZTs8L0xJTkU+Cis8TElORT53aGljaCwgcGVyYWR2ZW50dXJlIG5vdCBtYXJrZWQgb3Igbm90IGxhdWdoZWQgYXQsPC9MSU5FPgorPExJTkU+c3RyaWtlcyBoaW0gaW50byBtZWxhbmNob2x5OyBhbmQgdGhlbiB0aGVyZSdzIGE8L0xJTkU+Cis8TElORT5wYXJ0cmlkZ2Ugd2luZyBzYXZlZCwgZm9yIHRoZSBmb29sIHdpbGwgZWF0IG5vPC9MSU5FPgorPExJTkU+c3VwcGVyIHRoYXQgbmlnaHQuPC9MSU5FPgorPFNUQUdFRElSPk11c2ljPC9TVEFHRURJUj4KKzxMSU5FPldlIG11c3QgZm9sbG93IHRoZSBsZWFkZXJzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JbiBldmVyeSBnb29kIHRoaW5nLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5OYXksIGlmIHRoZXkgbGVhZCB0byBhbnkgaWxsLCBJIHdpbGwgbGVhdmUgdGhlbSBhdDwvTElORT4KKzxMSU5FPnRoZSBuZXh0IHR1cm5pbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkRhbmNlLiBUaGVuIGV4ZXVudCBhbGwgZXhjZXB0IERPTiBKT0hOLCBCT1JBQ0hJTywKK2FuZCBDTEFVRElPPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+U3VyZSBteSBicm90aGVyIGlzIGFtb3JvdXMgb24gSGVybyBhbmQgaGF0aDwvTElORT4KKzxMSU5FPndpdGhkcmF3biBoZXIgZmF0aGVyIHRvIGJyZWFrIHdpdGggaGltIGFib3V0IGl0LjwvTElORT4KKzxMSU5FPlRoZSBsYWRpZXMgZm9sbG93IGhlciBhbmQgYnV0IG9uZSB2aXNvciByZW1haW5zLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5BbmQgdGhhdCBpcyBDbGF1ZGlvOiBJIGtub3cgaGltIGJ5IGhpcyBiZWFyaW5nLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5BcmUgbm90IHlvdSBTaWduaW9yIEJlbmVkaWNrPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPllvdSBrbm93IG1lIHdlbGw7IEkgYW0gaGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPlNpZ25pb3IsIHlvdSBhcmUgdmVyeSBuZWFyIG15IGJyb3RoZXIgaW4gaGlzIGxvdmU6PC9MSU5FPgorPExJTkU+aGUgaXMgZW5hbW91cmVkIG9uIEhlcm87IEkgcHJheSB5b3UsIGRpc3N1YWRlIGhpbTwvTElORT4KKzxMSU5FPmZyb20gaGVyOiBzaGUgaXMgbm8gZXF1YWwgZm9yIGhpcyBiaXJ0aDogeW91IG1heTwvTElORT4KKzxMSU5FPmRvIHRoZSBwYXJ0IG9mIGFuIGhvbmVzdCBtYW4gaW4gaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SG93IGtub3cgeW91IGhlIGxvdmVzIGhlcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SSBoZWFyZCBoaW0gc3dlYXIgaGlzIGFmZmVjdGlvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+U28gZGlkIEkgdG9vOyBhbmQgaGUgc3dvcmUgaGUgd291bGQgbWFycnkgaGVyIHRvLW5pZ2h0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5Db21lLCBsZXQgdXMgdG8gdGhlIGJhbnF1ZXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudCBET04gSk9ITiBhbmQgQk9SQUNISU88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlRodXMgYW5zd2VyIEkgaW4gdGhlIG5hbWUgb2YgQmVuZWRpY2ssPC9MSU5FPgorPExJTkU+QnV0IGhlYXIgdGhlc2UgaWxsIG5ld3Mgd2l0aCB0aGUgZWFycyBvZiBDbGF1ZGlvLjwvTElORT4KKzxMSU5FPidUaXMgY2VydGFpbiBzbzsgdGhlIHByaW5jZSB3b29lcyBmb3IgaGltc2VsZi48L0xJTkU+Cis8TElORT5GcmllbmRzaGlwIGlzIGNvbnN0YW50IGluIGFsbCBvdGhlciB0aGluZ3M8L0xJTkU+Cis8TElORT5TYXZlIGluIHRoZSBvZmZpY2UgYW5kIGFmZmFpcnMgb2YgbG92ZTo8L0xJTkU+Cis8TElORT5UaGVyZWZvcmUsIGFsbCBoZWFydHMgaW4gbG92ZSB1c2UgdGhlaXIgb3duIHRvbmd1ZXM7PC9MSU5FPgorPExJTkU+TGV0IGV2ZXJ5IGV5ZSBuZWdvdGlhdGUgZm9yIGl0c2VsZjwvTElORT4KKzxMSU5FPkFuZCB0cnVzdCBubyBhZ2VudDsgZm9yIGJlYXV0eSBpcyBhIHdpdGNoPC9MSU5FPgorPExJTkU+QWdhaW5zdCB3aG9zZSBjaGFybXMgZmFpdGggbWVsdGV0aCBpbnRvIGJsb29kLjwvTElORT4KKzxMSU5FPlRoaXMgaXMgYW4gYWNjaWRlbnQgb2YgaG91cmx5IHByb29mLDwvTElORT4KKzxMSU5FPldoaWNoIEkgbWlzdHJ1c3RlZCBub3QuIEZhcmV3ZWxsLCB0aGVyZWZvcmUsIEhlcm8hPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPlJlLWVudGVyIEJFTkVESUNLPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+Q291bnQgQ2xhdWRpbz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5ZZWEsIHRoZSBzYW1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Db21lLCB3aWxsIHlvdSBnbyB3aXRoIG1lPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPldoaXRoZXI/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkV2ZW4gdG8gdGhlIG5leHQgd2lsbG93LCBhYm91dCB5b3VyIG93biBidXNpbmVzcyw8L0xJTkU+Cis8TElORT5jb3VudHkuIFdoYXQgZmFzaGlvbiB3aWxsIHlvdSB3ZWFyIHRoZSBnYXJsYW5kIG9mPzwvTElORT4KKzxMSU5FPmFib3V0IHlvdXIgbmVjaywgbGlrZSBhbiB1c3VyZXIncyBjaGFpbj8gb3IgdW5kZXI8L0xJTkU+Cis8TElORT55b3VyIGFybSwgbGlrZSBhIGxpZXV0ZW5hbnQncyBzY2FyZj8gWW91IG11c3Qgd2VhcjwvTElORT4KKzxMSU5FPml0IG9uZSB3YXksIGZvciB0aGUgcHJpbmNlIGhhdGggZ290IHlvdXIgSGVyby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JIHdpc2ggaGltIGpveSBvZiBoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldoeSwgdGhhdCdzIHNwb2tlbiBsaWtlIGFuIGhvbmVzdCBkcm92aWVyOiBzbyB0aGV5PC9MSU5FPgorPExJTkU+c2VsbCBidWxsb2Nrcy4gQnV0IGRpZCB5b3UgdGhpbmsgdGhlIHByaW5jZSB3b3VsZDwvTElORT4KKzxMSU5FPmhhdmUgc2VydmVkIHlvdSB0aHVzPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkkgcHJheSB5b3UsIGxlYXZlIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5IbyEgbm93IHlvdSBzdHJpa2UgbGlrZSB0aGUgYmxpbmQgbWFuOiAndHdhcyB0aGU8L0xJTkU+Cis8TElORT5ib3kgdGhhdCBzdG9sZSB5b3VyIG1lYXQsIGFuZCB5b3UnbGwgYmVhdCB0aGUgcG9zdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JZiBpdCB3aWxsIG5vdCBiZSwgSSdsbCBsZWF2ZSB5b3UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BbGFzLCBwb29yIGh1cnQgZm93bCEgbm93IHdpbGwgaGUgY3JlZXAgaW50byBzZWRnZXMuPC9MSU5FPgorPExJTkU+QnV0IHRoYXQgbXkgTGFkeSBCZWF0cmljZSBzaG91bGQga25vdyBtZSwgYW5kIG5vdDwvTElORT4KKzxMSU5FPmtub3cgbWUhIFRoZSBwcmluY2UncyBmb29sISBIYT8gSXQgbWF5IGJlIEkgZ288L0xJTkU+Cis8TElORT51bmRlciB0aGF0IHRpdGxlIGJlY2F1c2UgSSBhbSBtZXJyeS4gWWVhLCBidXQgc28gSTwvTElORT4KKzxMSU5FPmFtIGFwdCB0byBkbyBteXNlbGYgd3Jvbmc7IEkgYW0gbm90IHNvIHJlcHV0ZWQ6IGl0PC9MSU5FPgorPExJTkU+aXMgdGhlIGJhc2UsIHRob3VnaCBiaXR0ZXIsIGRpc3Bvc2l0aW9uIG9mIEJlYXRyaWNlPC9MSU5FPgorPExJTkU+dGhhdCBwdXRzIHRoZSB3b3JsZCBpbnRvIGhlciBwZXJzb24gYW5kIHNvIGdpdmVzIG1lPC9MSU5FPgorPExJTkU+b3V0LiBXZWxsLCBJJ2xsIGJlIHJldmVuZ2VkIGFzIEkgbWF5LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5SZS1lbnRlciBET04gUEVEUk88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Tm93LCBzaWduaW9yLCB3aGVyZSdzIHRoZSBjb3VudD8gZGlkIHlvdSBzZWUgaGltPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Ucm90aCwgbXkgbG9yZCwgSSBoYXZlIHBsYXllZCB0aGUgcGFydCBvZiBMYWR5IEZhbWUuPC9MSU5FPgorPExJTkU+SSBmb3VuZCBoaW0gaGVyZSBhcyBtZWxhbmNob2x5IGFzIGEgbG9kZ2UgaW4gYTwvTElORT4KKzxMSU5FPndhcnJlbjogSSB0b2xkIGhpbSwgYW5kIEkgdGhpbmsgSSB0b2xkIGhpbSB0cnVlLDwvTElORT4KKzxMSU5FPnRoYXQgeW91ciBncmFjZSBoYWQgZ290IHRoZSBnb29kIHdpbGwgb2YgdGhpcyB5b3VuZzwvTElORT4KKzxMSU5FPmxhZHk7IGFuZCBJIG9mZmVyZWQgaGltIG15IGNvbXBhbnkgdG8gYSB3aWxsb3ctdHJlZSw8L0xJTkU+Cis8TElORT5laXRoZXIgdG8gbWFrZSBoaW0gYSBnYXJsYW5kLCBhcyBiZWluZyBmb3JzYWtlbiwgb3I8L0xJTkU+Cis8TElORT50byBiaW5kIGhpbSB1cCBhIHJvZCwgYXMgYmVpbmcgd29ydGh5IHRvIGJlIHdoaXBwZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UbyBiZSB3aGlwcGVkISBXaGF0J3MgaGlzIGZhdWx0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGUgZmxhdCB0cmFuc2dyZXNzaW9uIG9mIGEgc2Nob29sYm95LCB3aG8sIGJlaW5nPC9MSU5FPgorPExJTkU+b3ZlcmpveWVkIHdpdGggZmluZGluZyBhIGJpcmRzJyBuZXN0LCBzaG93cyBpdCBoaXM8L0xJTkU+Cis8TElORT5jb21wYW5pb24sIGFuZCBoZSBzdGVhbHMgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaWx0IHRob3UgbWFrZSBhIHRydXN0IGEgdHJhbnNncmVzc2lvbj8gVGhlPC9MSU5FPgorPExJTkU+dHJhbnNncmVzc2lvbiBpcyBpbiB0aGUgc3RlYWxlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+WWV0IGl0IGhhZCBub3QgYmVlbiBhbWlzcyB0aGUgcm9kIGhhZCBiZWVuIG1hZGUsPC9MSU5FPgorPExJTkU+YW5kIHRoZSBnYXJsYW5kIHRvbzsgZm9yIHRoZSBnYXJsYW5kIGhlIG1pZ2h0IGhhdmU8L0xJTkU+Cis8TElORT53b3JuIGhpbXNlbGYsIGFuZCB0aGUgcm9kIGhlIG1pZ2h0IGhhdmUgYmVzdG93ZWQgb248L0xJTkU+Cis8TElORT55b3UsIHdobywgYXMgSSB0YWtlIGl0LCBoYXZlIHN0b2xlbiBoaXMgYmlyZHMnIG5lc3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JIHdpbGwgYnV0IHRlYWNoIHRoZW0gdG8gc2luZywgYW5kIHJlc3RvcmUgdGhlbSB0bzwvTElORT4KKzxMSU5FPnRoZSBvd25lci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SWYgdGhlaXIgc2luZ2luZyBhbnN3ZXIgeW91ciBzYXlpbmcsIGJ5IG15IGZhaXRoLDwvTElORT4KKzxMSU5FPnlvdSBzYXkgaG9uZXN0bHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UaGUgTGFkeSBCZWF0cmljZSBoYXRoIGEgcXVhcnJlbCB0byB5b3U6IHRoZTwvTElORT4KKzxMSU5FPmdlbnRsZW1hbiB0aGF0IGRhbmNlZCB3aXRoIGhlciB0b2xkIGhlciBzaGUgaXMgbXVjaDwvTElORT4KKzxMSU5FPndyb25nZWQgYnkgeW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5PLCBzaGUgbWlzdXNlZCBtZSBwYXN0IHRoZSBlbmR1cmFuY2Ugb2YgYSBibG9jayE8L0xJTkU+Cis8TElORT5hbiBvYWsgYnV0IHdpdGggb25lIGdyZWVuIGxlYWYgb24gaXQgd291bGQgaGF2ZTwvTElORT4KKzxMSU5FPmFuc3dlcmVkIGhlcjsgbXkgdmVyeSB2aXNvciBiZWdhbiB0byBhc3N1bWUgbGlmZSBhbmQ8L0xJTkU+Cis8TElORT5zY29sZCB3aXRoIGhlci4gU2hlIHRvbGQgbWUsIG5vdCB0aGlua2luZyBJIGhhZCBiZWVuPC9MSU5FPgorPExJTkU+bXlzZWxmLCB0aGF0IEkgd2FzIHRoZSBwcmluY2UncyBqZXN0ZXIsIHRoYXQgSSB3YXM8L0xJTkU+Cis8TElORT5kdWxsZXIgdGhhbiBhIGdyZWF0IHRoYXc7IGh1ZGRsaW5nIGplc3QgdXBvbiBqZXN0PC9MSU5FPgorPExJTkU+d2l0aCBzdWNoIGltcG9zc2libGUgY29udmV5YW5jZSB1cG9uIG1lIHRoYXQgSSBzdG9vZDwvTElORT4KKzxMSU5FPmxpa2UgYSBtYW4gYXQgYSBtYXJrLCB3aXRoIGEgd2hvbGUgYXJteSBzaG9vdGluZyBhdDwvTElORT4KKzxMSU5FPm1lLiBTaGUgc3BlYWtzIHBvbmlhcmRzLCBhbmQgZXZlcnkgd29yZCBzdGFiczo8L0xJTkU+Cis8TElORT5pZiBoZXIgYnJlYXRoIHdlcmUgYXMgdGVycmlibGUgYXMgaGVyIHRlcm1pbmF0aW9ucyw8L0xJTkU+Cis8TElORT50aGVyZSB3ZXJlIG5vIGxpdmluZyBuZWFyIGhlcjsgc2hlIHdvdWxkIGluZmVjdCB0bzwvTElORT4KKzxMSU5FPnRoZSBub3J0aCBzdGFyLiBJIHdvdWxkIG5vdCBtYXJyeSBoZXIsIHRob3VnaCBzaGU8L0xJTkU+Cis8TElORT53ZXJlIGVuZG93ZWQgd2l0aCBhbGwgdGhhdCBBZGFtIGJhZCBsZWZ0IGhpbSBiZWZvcmU8L0xJTkU+Cis8TElORT5oZSB0cmFuc2dyZXNzZWQ6IHNoZSB3b3VsZCBoYXZlIG1hZGUgSGVyY3VsZXMgaGF2ZTwvTElORT4KKzxMSU5FPnR1cm5lZCBzcGl0LCB5ZWEsIGFuZCBoYXZlIGNsZWZ0IGhpcyBjbHViIHRvIG1ha2U8L0xJTkU+Cis8TElORT50aGUgZmlyZSB0b28uIENvbWUsIHRhbGsgbm90IG9mIGhlcjogeW91IHNoYWxsIGZpbmQ8L0xJTkU+Cis8TElORT5oZXIgdGhlIGluZmVybmFsIEF0ZSBpbiBnb29kIGFwcGFyZWwuIEkgd291bGQgdG8gR29kPC9MSU5FPgorPExJTkU+c29tZSBzY2hvbGFyIHdvdWxkIGNvbmp1cmUgaGVyOyBmb3IgY2VydGFpbmx5LCB3aGlsZTwvTElORT4KKzxMSU5FPnNoZSBpcyBoZXJlLCBhIG1hbiBtYXkgbGl2ZSBhcyBxdWlldCBpbiBoZWxsIGFzIGluIGE8L0xJTkU+Cis8TElORT5zYW5jdHVhcnk7IGFuZCBwZW9wbGUgc2luIHVwb24gcHVycG9zZSwgYmVjYXVzZSB0aGV5PC9MSU5FPgorPExJTkU+d291bGQgZ28gdGhpdGhlcjsgc28sIGluZGVlZCwgYWxsIGRpc3F1aWV0LCBob3Jyb3I8L0xJTkU+Cis8TElORT5hbmQgcGVydHVyYmF0aW9uIGZvbGxvd3MgaGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+TG9vaywgaGVyZSBzaGUgY29tZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIENMQVVESU8sIEJFQVRSSUNFLCBIRVJPLCBhbmQgTEVPTkFUTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPldpbGwgeW91ciBncmFjZSBjb21tYW5kIG1lIGFueSBzZXJ2aWNlIHRvIHRoZTwvTElORT4KKzxMSU5FPndvcmxkJ3MgZW5kPyBJIHdpbGwgZ28gb24gdGhlIHNsaWdodGVzdCBlcnJhbmQgbm93PC9MSU5FPgorPExJTkU+dG8gdGhlIEFudGlwb2RlcyB0aGF0IHlvdSBjYW4gZGV2aXNlIHRvIHNlbmQgbWUgb247PC9MSU5FPgorPExJTkU+SSB3aWxsIGZldGNoIHlvdSBhIHRvb3RoLXBpY2tlciBub3cgZnJvbSB0aGU8L0xJTkU+Cis8TElORT5mdXJ0aGVzdCBpbmNoIG9mIEFzaWEsIGJyaW5nIHlvdSB0aGUgbGVuZ3RoIG9mPC9MSU5FPgorPExJTkU+UHJlc3RlciBKb2huJ3MgZm9vdCwgZmV0Y2ggeW91IGEgaGFpciBvZmYgdGhlIGdyZWF0PC9MSU5FPgorPExJTkU+Q2hhbSdzIGJlYXJkLCBkbyB5b3UgYW55IGVtYmFzc2FnZSB0byB0aGUgUGlnbWllcyw8L0xJTkU+Cis8TElORT5yYXRoZXIgdGhhbiBob2xkIHRocmVlIHdvcmRzJyBjb25mZXJlbmNlIHdpdGggdGhpczwvTElORT4KKzxMSU5FPmhhcnB5LiBZb3UgaGF2ZSBubyBlbXBsb3ltZW50IGZvciBtZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk5vbmUsIGJ1dCB0byBkZXNpcmUgeW91ciBnb29kIGNvbXBhbnkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPk8gR29kLCBzaXIsIGhlcmUncyBhIGRpc2ggSSBsb3ZlIG5vdDogSSBjYW5ub3Q8L0xJTkU+Cis8TElORT5lbmR1cmUgbXkgTGFkeSBUb25ndWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgbGFkeSwgY29tZTsgeW91IGhhdmUgbG9zdCB0aGUgaGVhcnQgb2Y8L0xJTkU+Cis8TElORT5TaWduaW9yIEJlbmVkaWNrLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JbmRlZWQsIG15IGxvcmQsIGhlIGxlbnQgaXQgbWUgYXdoaWxlOyBhbmQgSSBnYXZlPC9MSU5FPgorPExJTkU+aGltIHVzZSBmb3IgaXQsIGEgZG91YmxlIGhlYXJ0IGZvciBoaXMgc2luZ2xlIG9uZTo8L0xJTkU+Cis8TElORT5tYXJyeSwgb25jZSBiZWZvcmUgaGUgd29uIGl0IG9mIG1lIHdpdGggZmFsc2UgZGljZSw8L0xJTkU+Cis8TElORT50aGVyZWZvcmUgeW91ciBncmFjZSBtYXkgd2VsbCBzYXkgSSBoYXZlIGxvc3QgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Zb3UgaGF2ZSBwdXQgaGltIGRvd24sIGxhZHksIHlvdSBoYXZlIHB1dCBoaW0gZG93bi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+U28gSSB3b3VsZCBub3QgaGUgc2hvdWxkIGRvIG1lLCBteSBsb3JkLCBsZXN0IEk8L0xJTkU+Cis8TElORT5zaG91bGQgcHJvdmUgdGhlIG1vdGhlciBvZiBmb29scy4gSSBoYXZlIGJyb3VnaHQ8L0xJTkU+Cis8TElORT5Db3VudCBDbGF1ZGlvLCB3aG9tIHlvdSBzZW50IG1lIHRvIHNlZWsuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaHksIGhvdyBub3csIGNvdW50ISB3aGVyZWZvcmUgYXJlIHlvdSBzYWQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+Tm90IHNhZCwgbXkgbG9yZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhvdyB0aGVuPyBzaWNrPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk5laXRoZXIsIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlRoZSBjb3VudCBpcyBuZWl0aGVyIHNhZCwgbm9yIHNpY2ssIG5vciBtZXJyeSwgbm9yPC9MSU5FPgorPExJTkU+d2VsbDsgYnV0IGNpdmlsIGNvdW50LCBjaXZpbCBhcyBhbiBvcmFuZ2UsIGFuZDwvTElORT4KKzxMSU5FPnNvbWV0aGluZyBvZiB0aGF0IGplYWxvdXMgY29tcGxleGlvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkknIGZhaXRoLCBsYWR5LCBJIHRoaW5rIHlvdXIgYmxhem9uIHRvIGJlIHRydWU7PC9MSU5FPgorPExJTkU+dGhvdWdoLCBJJ2xsIGJlIHN3b3JuLCBpZiBoZSBiZSBzbywgaGlzIGNvbmNlaXQgaXM8L0xJTkU+Cis8TElORT5mYWxzZS4gSGVyZSwgQ2xhdWRpbywgSSBoYXZlIHdvb2VkIGluIHRoeSBuYW1lLCBhbmQ8L0xJTkU+Cis8TElORT5mYWlyIEhlcm8gaXMgd29uOiBJIGhhdmUgYnJva2Ugd2l0aCBoZXIgZmF0aGVyLDwvTElORT4KKzxMSU5FPmFuZCBoaXMgZ29vZCB3aWxsIG9idGFpbmVkOiBuYW1lIHRoZSBkYXkgb2Y8L0xJTkU+Cis8TElORT5tYXJyaWFnZSwgYW5kIEdvZCBnaXZlIHRoZWUgam95ITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkNvdW50LCB0YWtlIG9mIG1lIG15IGRhdWdodGVyLCBhbmQgd2l0aCBoZXIgbXk8L0xJTkU+Cis8TElORT5mb3J0dW5lczogaGlzIGdyYWNlIGhhdGggbWFkZSB0aGUgbWF0Y2gsIGFuZCBhbjwvTElORT4KKzxMSU5FPmdyYWNlIHNheSBBbWVuIHRvIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5TcGVhaywgY291bnQsICd0aXMgeW91ciBjdWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+U2lsZW5jZSBpcyB0aGUgcGVyZmVjdGVzdCBoZXJhbGQgb2Ygam95OiBJIHdlcmU8L0xJTkU+Cis8TElORT5idXQgbGl0dGxlIGhhcHB5LCBpZiBJIGNvdWxkIHNheSBob3cgbXVjaC4gTGFkeSwgYXM8L0xJTkU+Cis8TElORT55b3UgYXJlIG1pbmUsIEkgYW0geW91cnM6IEkgZ2l2ZSBhd2F5IG15c2VsZiBmb3I8L0xJTkU+Cis8TElORT55b3UgYW5kIGRvdGUgdXBvbiB0aGUgZXhjaGFuZ2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlNwZWFrLCBjb3VzaW47IG9yLCBpZiB5b3UgY2Fubm90LCBzdG9wIGhpcyBtb3V0aDwvTElORT4KKzxMSU5FPndpdGggYSBraXNzLCBhbmQgbGV0IG5vdCBoaW0gc3BlYWsgbmVpdGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkluIGZhaXRoLCBsYWR5LCB5b3UgaGF2ZSBhIG1lcnJ5IGhlYXJ0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5ZZWEsIG15IGxvcmQ7IEkgdGhhbmsgaXQsIHBvb3IgZm9vbCwgaXQga2VlcHMgb248L0xJTkU+Cis8TElORT50aGUgd2luZHkgc2lkZSBvZiBjYXJlLiBNeSBjb3VzaW4gdGVsbHMgaGltIGluIGhpczwvTElORT4KKzxMSU5FPmVhciB0aGF0IGhlIGlzIGluIGhlciBoZWFydC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5BbmQgc28gc2hlIGRvdGgsIGNvdXNpbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+R29vZCBMb3JkLCBmb3IgYWxsaWFuY2UhIFRodXMgZ29lcyBldmVyeSBvbmUgdG8gdGhlPC9MSU5FPgorPExJTkU+d29ybGQgYnV0IEksIGFuZCBJIGFtIHN1bmJ1cm50OyBJIG1heSBzaXQgaW4gYTwvTElORT4KKzxMSU5FPmNvcm5lciBhbmQgY3J5IGhlaWdoLWhvIGZvciBhIGh1c2JhbmQhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5MYWR5IEJlYXRyaWNlLCBJIHdpbGwgZ2V0IHlvdSBvbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkkgd291bGQgcmF0aGVyIGhhdmUgb25lIG9mIHlvdXIgZmF0aGVyJ3MgZ2V0dGluZy48L0xJTkU+Cis8TElORT5IYXRoIHlvdXIgZ3JhY2UgbmUnZXIgYSBicm90aGVyIGxpa2UgeW91PyBZb3VyPC9MSU5FPgorPExJTkU+ZmF0aGVyIGdvdCBleGNlbGxlbnQgaHVzYmFuZHMsIGlmIGEgbWFpZCBjb3VsZCBjb21lIGJ5IHRoZW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaWxsIHlvdSBoYXZlIG1lLCBsYWR5PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5ObywgbXkgbG9yZCwgdW5sZXNzIEkgbWlnaHQgaGF2ZSBhbm90aGVyIGZvcjwvTElORT4KKzxMSU5FPndvcmtpbmctZGF5czogeW91ciBncmFjZSBpcyB0b28gY29zdGx5IHRvIHdlYXI8L0xJTkU+Cis8TElORT5ldmVyeSBkYXkuIEJ1dCwgSSBiZXNlZWNoIHlvdXIgZ3JhY2UsIHBhcmRvbiBtZTogSTwvTElORT4KKzxMSU5FPndhcyBib3JuIHRvIHNwZWFrIGFsbCBtaXJ0aCBhbmQgbm8gbWF0dGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+WW91ciBzaWxlbmNlIG1vc3Qgb2ZmZW5kcyBtZSwgYW5kIHRvIGJlIG1lcnJ5IGJlc3Q8L0xJTkU+Cis8TElORT5iZWNvbWVzIHlvdTsgZm9yLCBvdXQgb2YgcXVlc3Rpb24sIHlvdSB3ZXJlIGJvcm4gaW48L0xJTkU+Cis8TElORT5hIG1lcnJ5IGhvdXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk5vLCBzdXJlLCBteSBsb3JkLCBteSBtb3RoZXIgY3JpZWQ7IGJ1dCB0aGVuIHRoZXJlPC9MSU5FPgorPExJTkU+d2FzIGEgc3RhciBkYW5jZWQsIGFuZCB1bmRlciB0aGF0IHdhcyBJIGJvcm4uPC9MSU5FPgorPExJTkU+Q291c2lucywgR29kIGdpdmUgeW91IGpveSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5OaWVjZSwgd2lsbCB5b3UgbG9vayB0byB0aG9zZSB0aGluZ3MgSSB0b2xkIHlvdSBvZj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SSBjcnkgeW91IG1lcmN5LCB1bmNsZS4gQnkgeW91ciBncmFjZSdzIHBhcmRvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5CeSBteSB0cm90aCwgYSBwbGVhc2FudC1zcGlyaXRlZCBsYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlRoZXJlJ3MgbGl0dGxlIG9mIHRoZSBtZWxhbmNob2x5IGVsZW1lbnQgaW4gaGVyLCBteTwvTElORT4KKzxMSU5FPmxvcmQ6IHNoZSBpcyBuZXZlciBzYWQgYnV0IHdoZW4gc2hlIHNsZWVwcywgYW5kPC9MSU5FPgorPExJTkU+bm90IGV2ZXIgc2FkIHRoZW47IGZvciBJIGhhdmUgaGVhcmQgbXkgZGF1Z2h0ZXIgc2F5LDwvTElORT4KKzxMSU5FPnNoZSBoYXRoIG9mdGVuIGRyZWFtZWQgb2YgdW5oYXBwaW5lc3MgYW5kIHdha2VkPC9MSU5FPgorPExJTkU+aGVyc2VsZiB3aXRoIGxhdWdoaW5nLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+U2hlIGNhbm5vdCBlbmR1cmUgdG8gaGVhciB0ZWxsIG9mIGEgaHVzYmFuZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5PLCBieSBubyBtZWFuczogc2hlIG1vY2tzIGFsbCBoZXIgd29vZXJzIG91dCBvZiBzdWl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+U2hlIHdlcmUgYW4gZXhjZWxsZW50IHdpZmUgZm9yIEJlbmVkaWN0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk8gTG9yZCwgbXkgbG9yZCwgaWYgdGhleSB3ZXJlIGJ1dCBhIHdlZWsgbWFycmllZCw8L0xJTkU+Cis8TElORT50aGV5IHdvdWxkIHRhbGsgdGhlbXNlbHZlcyBtYWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Db3VudHkgQ2xhdWRpbywgd2hlbiBtZWFuIHlvdSB0byBnbyB0byBjaHVyY2g/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VG8tbW9ycm93LCBteSBsb3JkOiB0aW1lIGdvZXMgb24gY3J1dGNoZXMgdGlsbCBsb3ZlPC9MSU5FPgorPExJTkU+aGF2ZSBhbGwgaGlzIHJpdGVzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk5vdCB0aWxsIE1vbmRheSwgbXkgZGVhciBzb24sIHdoaWNoIGlzIGhlbmNlIGEganVzdDwvTElORT4KKzxMSU5FPnNldmVuLW5pZ2h0OyBhbmQgYSB0aW1lIHRvbyBicmllZiwgdG9vLCB0byBoYXZlIGFsbDwvTElORT4KKzxMSU5FPnRoaW5ncyBhbnN3ZXIgbXkgbWluZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkNvbWUsIHlvdSBzaGFrZSB0aGUgaGVhZCBhdCBzbyBsb25nIGEgYnJlYXRoaW5nOjwvTElORT4KKzxMSU5FPmJ1dCwgSSB3YXJyYW50IHRoZWUsIENsYXVkaW8sIHRoZSB0aW1lIHNoYWxsIG5vdCBnbzwvTElORT4KKzxMSU5FPmR1bGx5IGJ5IHVzLiBJIHdpbGwgaW4gdGhlIGludGVyaW0gdW5kZXJ0YWtlIG9uZSBvZjwvTElORT4KKzxMSU5FPkhlcmN1bGVzJyBsYWJvdXJzOyB3aGljaCBpcywgdG8gYnJpbmcgU2lnbmlvcjwvTElORT4KKzxMSU5FPkJlbmVkaWNrIGFuZCB0aGUgTGFkeSBCZWF0cmljZSBpbnRvIGEgbW91bnRhaW4gb2Y8L0xJTkU+Cis8TElORT5hZmZlY3Rpb24gdGhlIG9uZSB3aXRoIHRoZSBvdGhlci4gSSB3b3VsZCBmYWluIGhhdmU8L0xJTkU+Cis8TElORT5pdCBhIG1hdGNoLCBhbmQgSSBkb3VidCBub3QgYnV0IHRvIGZhc2hpb24gaXQsIGlmPC9MSU5FPgorPExJTkU+eW91IHRocmVlIHdpbGwgYnV0IG1pbmlzdGVyIHN1Y2ggYXNzaXN0YW5jZSBhcyBJPC9MSU5FPgorPExJTkU+c2hhbGwgZ2l2ZSB5b3UgZGlyZWN0aW9uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk15IGxvcmQsIEkgYW0gZm9yIHlvdSwgdGhvdWdoIGl0IGNvc3QgbWUgdGVuPC9MSU5FPgorPExJTkU+bmlnaHRzJyB3YXRjaGluZ3MuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QW5kIEksIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5BbmQgeW91IHRvbywgZ2VudGxlIEhlcm8/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+SSB3aWxsIGRvIGFueSBtb2Rlc3Qgb2ZmaWNlLCBteSBsb3JkLCB0byBoZWxwIG15PC9MSU5FPgorPExJTkU+Y291c2luIHRvIGEgZ29vZCBodXNiYW5kLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QW5kIEJlbmVkaWNrIGlzIG5vdCB0aGUgdW5ob3BlZnVsbGVzdCBodXNiYW5kIHRoYXQ8L0xJTkU+Cis8TElORT5JIGtub3cuIFRodXMgZmFyIGNhbiBJIHByYWlzZSBoaW07IGhlIGlzIG9mIGEgbm9ibGU8L0xJTkU+Cis8TElORT5zdHJhaW4sIG9mIGFwcHJvdmVkIHZhbG91ciBhbmQgY29uZmlybWVkIGhvbmVzdHkuIEk8L0xJTkU+Cis8TElORT53aWxsIHRlYWNoIHlvdSBob3cgdG8gaHVtb3VyIHlvdXIgY291c2luLCB0aGF0IHNoZTwvTElORT4KKzxMSU5FPnNoYWxsIGZhbGwgaW4gbG92ZSB3aXRoIEJlbmVkaWNrOyBhbmQgSSwgd2l0aCB5b3VyPC9MSU5FPgorPExJTkU+dHdvIGhlbHBzLCB3aWxsIHNvIHByYWN0aXNlIG9uIEJlbmVkaWNrIHRoYXQsIGluPC9MSU5FPgorPExJTkU+ZGVzcGl0ZSBvZiBoaXMgcXVpY2sgd2l0IGFuZCBoaXMgcXVlYXN5IHN0b21hY2gsIGhlPC9MSU5FPgorPExJTkU+c2hhbGwgZmFsbCBpbiBsb3ZlIHdpdGggQmVhdHJpY2UuIElmIHdlIGNhbiBkbyB0aGlzLDwvTElORT4KKzxMSU5FPkN1cGlkIGlzIG5vIGxvbmdlciBhbiBhcmNoZXI6IGhpcyBnbG9yeSBzaGFsbCBiZTwvTElORT4KKzxMSU5FPm91cnMsIGZvciB3ZSBhcmUgdGhlIG9ubHkgbG92ZS1nb2RzLiBHbyBpbiB3aXRoIG1lLDwvTElORT4KKzxMSU5FPmFuZCBJIHdpbGwgdGVsbCB5b3UgbXkgZHJpZnQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIElJLiAgVGhlIHNhbWUuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBET04gSk9ITiBhbmQgQk9SQUNISU88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5JdCBpcyBzbzsgdGhlIENvdW50IENsYXVkaW8gc2hhbGwgbWFycnkgdGhlPC9MSU5FPgorPExJTkU+ZGF1Z2h0ZXIgb2YgTGVvbmF0by48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+WWVhLCBteSBsb3JkOyBidXQgSSBjYW4gY3Jvc3MgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPkFueSBiYXIsIGFueSBjcm9zcywgYW55IGltcGVkaW1lbnQgd2lsbCBiZTwvTElORT4KKzxMSU5FPm1lZGljaW5hYmxlIHRvIG1lOiBJIGFtIHNpY2sgaW4gZGlzcGxlYXN1cmUgdG8gaGltLDwvTElORT4KKzxMSU5FPmFuZCB3aGF0c29ldmVyIGNvbWVzIGF0aHdhcnQgaGlzIGFmZmVjdGlvbiByYW5nZXM8L0xJTkU+Cis8TElORT5ldmVubHkgd2l0aCBtaW5lLiBIb3cgY2Fuc3QgdGhvdSBjcm9zcyB0aGlzIG1hcnJpYWdlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5Ob3QgaG9uZXN0bHksIG15IGxvcmQ7IGJ1dCBzbyBjb3ZlcnRseSB0aGF0IG5vPC9MSU5FPgorPExJTkU+ZGlzaG9uZXN0eSBzaGFsbCBhcHBlYXIgaW4gbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPlNob3cgbWUgYnJpZWZseSBob3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPkkgdGhpbmsgSSB0b2xkIHlvdXIgbG9yZHNoaXAgYSB5ZWFyIHNpbmNlLCBob3cgbXVjaDwvTElORT4KKzxMSU5FPkkgYW0gaW4gdGhlIGZhdm91ciBvZiBNYXJnYXJldCwgdGhlIHdhaXRpbmc8L0xJTkU+Cis8TElORT5nZW50bGV3b21hbiB0byBIZXJvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5JIHJlbWVtYmVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5JIGNhbiwgYXQgYW55IHVuc2Vhc29uYWJsZSBpbnN0YW50IG9mIHRoZSBuaWdodCw8L0xJTkU+Cis8TElORT5hcHBvaW50IGhlciB0byBsb29rIG91dCBhdCBoZXIgbGFkeSdzIGNoYW1iZXIgd2luZG93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5XaGF0IGxpZmUgaXMgaW4gdGhhdCwgdG8gYmUgdGhlIGRlYXRoIG9mIHRoaXMgbWFycmlhZ2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPlRoZSBwb2lzb24gb2YgdGhhdCBsaWVzIGluIHlvdSB0byB0ZW1wZXIuIEdvIHlvdSB0bzwvTElORT4KKzxMSU5FPnRoZSBwcmluY2UgeW91ciBicm90aGVyOyBzcGFyZSBub3QgdG8gdGVsbCBoaW0gdGhhdDwvTElORT4KKzxMSU5FPmhlIGhhdGggd3JvbmdlZCBoaXMgaG9ub3VyIGluIG1hcnJ5aW5nIHRoZSByZW5vd25lZDwvTElORT4KKzxMSU5FPkNsYXVkaW8tLXdob3NlIGVzdGltYXRpb24gZG8geW91IG1pZ2h0aWx5IGhvbGQ8L0xJTkU+Cis8TElORT51cC0tdG8gYSBjb250YW1pbmF0ZWQgc3RhbGUsIHN1Y2ggYSBvbmUgYXMgSGVyby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+V2hhdCBwcm9vZiBzaGFsbCBJIG1ha2Ugb2YgdGhhdD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+UHJvb2YgZW5vdWdoIHRvIG1pc3VzZSB0aGUgcHJpbmNlLCB0byB2ZXggQ2xhdWRpbyw8L0xJTkU+Cis8TElORT50byB1bmRvIEhlcm8gYW5kIGtpbGwgTGVvbmF0by4gTG9vayB5b3UgZm9yIGFueTwvTElORT4KKzxMSU5FPm90aGVyIGlzc3VlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5Pbmx5IHRvIGRlc3BpdGUgdGhlbSwgSSB3aWxsIGVuZGVhdm91ciBhbnkgdGhpbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPkdvLCB0aGVuOyBmaW5kIG1lIGEgbWVldCBob3VyIHRvIGRyYXcgRG9uIFBlZHJvIGFuZDwvTElORT4KKzxMSU5FPnRoZSBDb3VudCBDbGF1ZGlvIGFsb25lOiB0ZWxsIHRoZW0gdGhhdCB5b3Uga25vdzwvTElORT4KKzxMSU5FPnRoYXQgSGVybyBsb3ZlcyBtZTsgaW50ZW5kIGEga2luZCBvZiB6ZWFsIGJvdGggdG8gdGhlPC9MSU5FPgorPExJTkU+cHJpbmNlIGFuZCBDbGF1ZGlvLCBhcywtLWluIGxvdmUgb2YgeW91ciBicm90aGVyJ3M8L0xJTkU+Cis8TElORT5ob25vdXIsIHdobyBoYXRoIG1hZGUgdGhpcyBtYXRjaCwgYW5kIGhpcyBmcmllbmQnczwvTElORT4KKzxMSU5FPnJlcHV0YXRpb24sIHdobyBpcyB0aHVzIGxpa2UgdG8gYmUgY296ZW5lZCB3aXRoIHRoZTwvTElORT4KKzxMSU5FPnNlbWJsYW5jZSBvZiBhIG1haWQsLS10aGF0IHlvdSBoYXZlIGRpc2NvdmVyZWQ8L0xJTkU+Cis8TElORT50aHVzLiBUaGV5IHdpbGwgc2NhcmNlbHkgYmVsaWV2ZSB0aGlzIHdpdGhvdXQgdHJpYWw6PC9MSU5FPgorPExJTkU+b2ZmZXIgdGhlbSBpbnN0YW5jZXM7IHdoaWNoIHNoYWxsIGJlYXIgbm8gbGVzczwvTElORT4KKzxMSU5FPmxpa2VsaWhvb2QgdGhhbiB0byBzZWUgbWUgYXQgaGVyIGNoYW1iZXItd2luZG93LDwvTElORT4KKzxMSU5FPmhlYXIgbWUgY2FsbCBNYXJnYXJldCBIZXJvLCBoZWFyIE1hcmdhcmV0IHRlcm0gbWU8L0xJTkU+Cis8TElORT5DbGF1ZGlvOyBhbmQgYnJpbmcgdGhlbSB0byBzZWUgdGhpcyB0aGUgdmVyeSBuaWdodDwvTElORT4KKzxMSU5FPmJlZm9yZSB0aGUgaW50ZW5kZWQgd2VkZGluZywtLWZvciBpbiB0aGUgbWVhbnRpbWUgSTwvTElORT4KKzxMSU5FPndpbGwgc28gZmFzaGlvbiB0aGUgbWF0dGVyIHRoYXQgSGVybyBzaGFsbCBiZTwvTElORT4KKzxMSU5FPmFic2VudCwtLWFuZCB0aGVyZSBzaGFsbCBhcHBlYXIgc3VjaCBzZWVtaW5nIHRydXRoPC9MSU5FPgorPExJTkU+b2YgSGVybydzIGRpc2xveWFsdHkgdGhhdCBqZWFsb3VzeSBzaGFsbCBiZSBjYWxsZWQ8L0xJTkU+Cis8TElORT5hc3N1cmFuY2UgYW5kIGFsbCB0aGUgcHJlcGFyYXRpb24gb3ZlcnRocm93bi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+R3JvdyB0aGlzIHRvIHdoYXQgYWR2ZXJzZSBpc3N1ZSBpdCBjYW4sIEkgd2lsbCBwdXQ8L0xJTkU+Cis8TElORT5pdCBpbiBwcmFjdGlzZS4gQmUgY3VubmluZyBpbiB0aGUgd29ya2luZyB0aGlzLCBhbmQ8L0xJTkU+Cis8TElORT50aHkgZmVlIGlzIGEgdGhvdXNhbmQgZHVjYXRzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5CZSB5b3UgY29uc3RhbnQgaW4gdGhlIGFjY3VzYXRpb24sIGFuZCBteSBjdW5uaW5nPC9MSU5FPgorPExJTkU+c2hhbGwgbm90IHNoYW1lIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5JIHdpbGwgcHJlc2VudGx5IGdvIGxlYXJuIHRoZWlyIGRheSBvZiBtYXJyaWFnZS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSUlJLiAgTEVPTkFUTydTIG9yY2hhcmQuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBCRU5FRElDSzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkJveSE8L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RW50ZXIgQm95PC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJveTwvU1BFQUtFUj4KKzxMSU5FPlNpZ25pb3I/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkluIG15IGNoYW1iZXItd2luZG93IGxpZXMgYSBib29rOiBicmluZyBpdCBoaXRoZXI8L0xJTkU+Cis8TElORT50byBtZSBpbiB0aGUgb3JjaGFyZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJveTwvU1BFQUtFUj4KKzxMSU5FPkkgYW0gaGVyZSBhbHJlYWR5LCBzaXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkkga25vdyB0aGF0OyBidXQgSSB3b3VsZCBoYXZlIHRoZWUgaGVuY2UsIGFuZCBoZXJlIGFnYWluLjwvTElORT4KKzxTVEFHRURJUj5FeGl0IEJveTwvU1RBR0VESVI+Cis8TElORT5JIGRvIG11Y2ggd29uZGVyIHRoYXQgb25lIG1hbiwgc2VlaW5nIGhvdyBtdWNoPC9MSU5FPgorPExJTkU+YW5vdGhlciBtYW4gaXMgYSBmb29sIHdoZW4gaGUgZGVkaWNhdGVzIGhpczwvTElORT4KKzxMSU5FPmJlaGF2aW9ycyB0byBsb3ZlLCB3aWxsLCBhZnRlciBoZSBoYXRoIGxhdWdoZWQgYXQ8L0xJTkU+Cis8TElORT5zdWNoIHNoYWxsb3cgZm9sbGllcyBpbiBvdGhlcnMsIGJlY29tZSB0aGUgYXJndW1lbnQ8L0xJTkU+Cis8TElORT5vZiBoaXMgb3duIHNjb3JuIGJ5IGZhaWxpbmcgaW4gbG92ZTogYW5kIHN1Y2ggYSBtYW48L0xJTkU+Cis8TElORT5pcyBDbGF1ZGlvLiBJIGhhdmUga25vd24gd2hlbiB0aGVyZSB3YXMgbm8gbXVzaWM8L0xJTkU+Cis8TElORT53aXRoIGhpbSBidXQgdGhlIGRydW0gYW5kIHRoZSBmaWZlOyBhbmQgbm93IGhhZCBoZTwvTElORT4KKzxMSU5FPnJhdGhlciBoZWFyIHRoZSB0YWJvdXIgYW5kIHRoZSBwaXBlOiBJIGhhdmUga25vd248L0xJTkU+Cis8TElORT53aGVuIGhlIHdvdWxkIGhhdmUgd2Fsa2VkIHRlbiBtaWxlIGEtZm9vdCB0byBzZWUgYTwvTElORT4KKzxMSU5FPmdvb2QgYXJtb3VyOyBhbmQgbm93IHdpbGwgaGUgbGllIHRlbiBuaWdodHMgYXdha2UsPC9MSU5FPgorPExJTkU+Y2FydmluZyB0aGUgZmFzaGlvbiBvZiBhIG5ldyBkb3VibGV0LiBIZSB3YXMgd29udCB0bzwvTElORT4KKzxMSU5FPnNwZWFrIHBsYWluIGFuZCB0byB0aGUgcHVycG9zZSwgbGlrZSBhbiBob25lc3QgbWFuPC9MSU5FPgorPExJTkU+YW5kIGEgc29sZGllcjsgYW5kIG5vdyBpcyBoZSB0dXJuZWQgb3J0aG9ncmFwaHk7IGhpczwvTElORT4KKzxMSU5FPndvcmRzIGFyZSBhIHZlcnkgZmFudGFzdGljYWwgYmFucXVldCwganVzdCBzbyBtYW55PC9MSU5FPgorPExJTkU+c3RyYW5nZSBkaXNoZXMuIE1heSBJIGJlIHNvIGNvbnZlcnRlZCBhbmQgc2VlIHdpdGg8L0xJTkU+Cis8TElORT50aGVzZSBleWVzPyBJIGNhbm5vdCB0ZWxsOyBJIHRoaW5rIG5vdDogSSB3aWxsIG5vdDwvTElORT4KKzxMSU5FPmJlIHN3b3JuLCBidXQgbG92ZSBtYXkgdHJhbnNmb3JtIG1lIHRvIGFuIG95c3RlcjsgYnV0PC9MSU5FPgorPExJTkU+SSdsbCB0YWtlIG15IG9hdGggb24gaXQsIHRpbGwgaGUgaGF2ZSBtYWRlIGFuIG95c3RlcjwvTElORT4KKzxMSU5FPm9mIG1lLCBoZSBzaGFsbCBuZXZlciBtYWtlIG1lIHN1Y2ggYSBmb29sLiBPbmUgd29tYW48L0xJTkU+Cis8TElORT5pcyBmYWlyLCB5ZXQgSSBhbSB3ZWxsOyBhbm90aGVyIGlzIHdpc2UsIHlldCBJIGFtPC9MSU5FPgorPExJTkU+d2VsbDsgYW5vdGhlciB2aXJ0dW91cywgeWV0IEkgYW0gd2VsbDsgYnV0IHRpbGwgYWxsPC9MSU5FPgorPExJTkU+Z3JhY2VzIGJlIGluIG9uZSB3b21hbiwgb25lIHdvbWFuIHNoYWxsIG5vdCBjb21lIGluPC9MSU5FPgorPExJTkU+bXkgZ3JhY2UuIFJpY2ggc2hlIHNoYWxsIGJlLCB0aGF0J3MgY2VydGFpbjsgd2lzZSw8L0xJTkU+Cis8TElORT5vciBJJ2xsIG5vbmU7IHZpcnR1b3VzLCBvciBJJ2xsIG5ldmVyIGNoZWFwZW4gaGVyOzwvTElORT4KKzxMSU5FPmZhaXIsIG9yIEknbGwgICBuZXZlciBsb29rIG9uIGhlcjsgbWlsZCwgb3IgY29tZSBub3Q8L0xJTkU+Cis8TElORT5uZWFyIG1lOyBub2JsZSwgb3Igbm90IEkgZm9yIGFuIGFuZ2VsOyBvZiBnb29kPC9MSU5FPgorPExJTkU+ZGlzY291cnNlLCBhbiBleGNlbGxlbnQgbXVzaWNpYW4sIGFuZCBoZXIgaGFpciBzaGFsbDwvTElORT4KKzxMSU5FPmJlIG9mIHdoYXQgY29sb3VyIGl0IHBsZWFzZSBHb2QuIEhhISB0aGUgcHJpbmNlIGFuZDwvTElORT4KKzxMSU5FPk1vbnNpZXVyIExvdmUhIEkgd2lsbCBoaWRlIG1lIGluIHRoZSBhcmJvdXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTVEFHRURJUj5XaXRoZHJhd3M8L1NUQUdFRElSPgorPFNUQUdFRElSPkVudGVyIERPTiBQRURSTywgQ0xBVURJTywgYW5kIExFT05BVE88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgc2hhbGwgd2UgaGVhciB0aGlzIG11c2ljPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlllYSwgbXkgZ29vZCBsb3JkLiBIb3cgc3RpbGwgdGhlIGV2ZW5pbmcgaXMsPC9MSU5FPgorPExJTkU+QXMgaHVzaCdkIG9uIHB1cnBvc2UgdG8gZ3JhY2UgaGFybW9ueSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPlNlZSB5b3Ugd2hlcmUgQmVuZWRpY2sgaGF0aCBoaWQgaGltc2VsZj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5PLCB2ZXJ5IHdlbGwsIG15IGxvcmQ6IHRoZSBtdXNpYyBlbmRlZCw8L0xJTkU+Cis8TElORT5XZSdsbCBmaXQgdGhlIGtpZC1mb3ggd2l0aCBhIHBlbm55d29ydGguPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIEJBTFRIQVNBUiB3aXRoIE11c2ljPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkNvbWUsIEJhbHRoYXNhciwgd2UnbGwgaGVhciB0aGF0IHNvbmcgYWdhaW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Cis8TElORT5PLCBnb29kIG15IGxvcmQsIHRheCBub3Qgc28gYmFkIGEgdm9pY2U8L0xJTkU+Cis8TElORT5UbyBzbGFuZGVyIG11c2ljIGFueSBtb3JlIHRoYW4gb25jZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkl0IGlzIHRoZSB3aXRuZXNzIHN0aWxsIG9mIGV4Y2VsbGVuY3k8L0xJTkU+Cis8TElORT5UbyBwdXQgYSBzdHJhbmdlIGZhY2Ugb24gaGlzIG93biBwZXJmZWN0aW9uLjwvTElORT4KKzxMSU5FPkkgcHJheSB0aGVlLCBzaW5nLCBhbmQgbGV0IG1lIHdvbyBubyBtb3JlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+QmVjYXVzZSB5b3UgdGFsayBvZiB3b29pbmcsIEkgd2lsbCBzaW5nOzwvTElORT4KKzxMSU5FPlNpbmNlIG1hbnkgYSB3b29lciBkb3RoIGNvbW1lbmNlIGhpcyBzdWl0PC9MSU5FPgorPExJTkU+VG8gaGVyIGhlIHRoaW5rcyBub3Qgd29ydGh5LCB5ZXQgaGUgd29vZXMsPC9MSU5FPgorPExJTkU+WWV0IHdpbGwgaGUgc3dlYXIgaGUgbG92ZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Ob3csIHByYXkgdGhlZSwgY29tZTs8L0xJTkU+Cis8TElORT5PciwgaWYgdGhvdSB3aWx0IGhvbGQgbG9uZ2VyIGFyZ3VtZW50LDwvTElORT4KKzxMSU5FPkRvIGl0IGluIG5vdGVzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+Tm90ZSB0aGlzIGJlZm9yZSBteSBub3Rlczs8L0xJTkU+Cis8TElORT5UaGVyZSdzIG5vdCBhIG5vdGUgb2YgbWluZSB0aGF0J3Mgd29ydGggdGhlIG5vdGluZy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldoeSwgdGhlc2UgYXJlIHZlcnkgY3JvdGNoZXRzIHRoYXQgaGUgc3BlYWtzOzwvTElORT4KKzxMSU5FPk5vdGUsIG5vdGVzLCBmb3Jzb290aCwgYW5kIG5vdGhpbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkFpcjwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPk5vdywgZGl2aW5lIGFpciEgbm93IGlzIGhpcyBzb3VsIHJhdmlzaGVkISBJcyBpdDwvTElORT4KKzxMSU5FPm5vdCBzdHJhbmdlIHRoYXQgc2hlZXBzJyBndXRzIHNob3VsZCBoYWxlIHNvdWxzIG91dDwvTElORT4KKzxMSU5FPm9mIG1lbidzIGJvZGllcz8gV2VsbCwgYSBob3JuIGZvciBteSBtb25leSwgd2hlbjwvTElORT4KKzxMSU5FPmFsbCdzIGRvbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPlRoZSBTb25nPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJBTFRIQVNBUjwvU1BFQUtFUj4KKzxMSU5FPlNpZ2ggbm8gbW9yZSwgbGFkaWVzLCBzaWdoIG5vIG1vcmUsPC9MSU5FPgorPExJTkU+TWVuIHdlcmUgZGVjZWl2ZXJzIGV2ZXIsPC9MSU5FPgorPExJTkU+T25lIGZvb3QgaW4gc2VhIGFuZCBvbmUgb24gc2hvcmUsPC9MSU5FPgorPExJTkU+VG8gb25lIHRoaW5nIGNvbnN0YW50IG5ldmVyOjwvTElORT4KKzxMSU5FPlRoZW4gc2lnaCBub3Qgc28sIGJ1dCBsZXQgdGhlbSBnbyw8L0xJTkU+Cis8TElORT5BbmQgYmUgeW91IGJsaXRoZSBhbmQgYm9ubnksPC9MSU5FPgorPExJTkU+Q29udmVydGluZyBhbGwgeW91ciBzb3VuZHMgb2Ygd29lPC9MSU5FPgorPExJTkU+SW50byBIZXkgbm9ubnksIG5vbm55LjwvTElORT4KKzxMSU5FPlNpbmcgbm8gbW9yZSBkaXR0aWVzLCBzaW5nIG5vIG1vZSw8L0xJTkU+Cis8TElORT5PZiBkdW1wcyBzbyBkdWxsIGFuZCBoZWF2eTs8L0xJTkU+Cis8TElORT5UaGUgZnJhdWQgb2YgbWVuIHdhcyBldmVyIHNvLDwvTElORT4KKzxMSU5FPlNpbmNlIHN1bW1lciBmaXJzdCB3YXMgbGVhZnk6PC9MSU5FPgorPExJTkU+VGhlbiBzaWdoIG5vdCBzbywgJmFtcDtjLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QnkgbXkgdHJvdGgsIGEgZ29vZCBzb25nLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkFMVEhBU0FSPC9TUEVBS0VSPgorPExJTkU+QW5kIGFuIGlsbCBzaW5nZXIsIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5IYSwgbm8sIG5vLCBmYWl0aDsgdGhvdSBzaW5nZXN0IHdlbGwgZW5vdWdoIGZvciBhIHNoaWZ0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BbiBoZSBoYWQgYmVlbiBhIGRvZyB0aGF0IHNob3VsZCBoYXZlIGhvd2xlZCB0aHVzLDwvTElORT4KKzxMSU5FPnRoZXkgd291bGQgaGF2ZSBoYW5nZWQgaGltOiBhbmQgSSBwcmF5IEdvZCBoaXMgYmFkPC9MSU5FPgorPExJTkU+dm9pY2UgYm9kZSBubyBtaXNjaGllZi4gSSBoYWQgYXMgbGllZiBoYXZlIGhlYXJkIHRoZTwvTElORT4KKzxMSU5FPm5pZ2h0LXJhdmVuLCBjb21lIHdoYXQgcGxhZ3VlIGNvdWxkIGhhdmUgY29tZSBhZnRlcjwvTElORT4KKzxMSU5FPml0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+WWVhLCBtYXJyeSwgZG9zdCB0aG91IGhlYXIsIEJhbHRoYXNhcj8gSSBwcmF5IHRoZWUsPC9MSU5FPgorPExJTkU+Z2V0IHVzIHNvbWUgZXhjZWxsZW50IG11c2ljOyBmb3IgdG8tbW9ycm93IG5pZ2h0IHdlPC9MSU5FPgorPExJTkU+d291bGQgaGF2ZSBpdCBhdCB0aGUgTGFkeSBIZXJvJ3MgY2hhbWJlci13aW5kb3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CQUxUSEFTQVI8L1NQRUFLRVI+Cis8TElORT5UaGUgYmVzdCBJIGNhbiwgbXkgbG9yZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkRvIHNvOiBmYXJld2VsbC48L0xJTkU+Cis8U1RBR0VESVI+RXhpdCBCQUxUSEFTQVI8L1NUQUdFRElSPgorPExJTkU+Q29tZSBoaXRoZXIsIExlb25hdG8uIFdoYXQgd2FzIGl0IHlvdSB0b2xkIG1lIG9mPC9MSU5FPgorPExJTkU+dG8tZGF5LCB0aGF0IHlvdXIgbmllY2UgQmVhdHJpY2Ugd2FzIGluIGxvdmUgd2l0aDwvTElORT4KKzxMSU5FPlNpZ25pb3IgQmVuZWRpY2s/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TywgYXk6IHN0YWxrIG9uLiBzdGFsayBvbjsgdGhlIGZvd2wgc2l0cy4gSSBkaWQ8L0xJTkU+Cis8TElORT5uZXZlciB0aGluayB0aGF0IGxhZHkgd291bGQgaGF2ZSBsb3ZlZCBhbnkgbWFuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk5vLCBub3IgSSBuZWl0aGVyOyBidXQgbW9zdCB3b25kZXJmdWwgdGhhdCBzaGU8L0xJTkU+Cis8TElORT5zaG91bGQgc28gZG90ZSBvbiBTaWduaW9yIEJlbmVkaWNrLCB3aG9tIHNoZSBoYXRoIGluPC9MSU5FPgorPExJTkU+YWxsIG91dHdhcmQgYmVoYXZpb3JzIHNlZW1lZCBldmVyIHRvIGFiaG9yLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Jcyd0IHBvc3NpYmxlPyBTaXRzIHRoZSB3aW5kIGluIHRoYXQgY29ybmVyPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkJ5IG15IHRyb3RoLCBteSBsb3JkLCBJIGNhbm5vdCB0ZWxsIHdoYXQgdG8gdGhpbms8L0xJTkU+Cis8TElORT5vZiBpdCBidXQgdGhhdCBzaGUgbG92ZXMgaGltIHdpdGggYW4gZW5yYWdlZDwvTElORT4KKzxMSU5FPmFmZmVjdGlvbjogaXQgaXMgcGFzdCB0aGUgaW5maW5pdGUgb2YgdGhvdWdodC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk1heSBiZSBzaGUgZG90aCBidXQgY291bnRlcmZlaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+RmFpdGgsIGxpa2UgZW5vdWdoLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk8gR29kLCBjb3VudGVyZmVpdCEgVGhlcmUgd2FzIG5ldmVyIGNvdW50ZXJmZWl0IG9mPC9MSU5FPgorPExJTkU+cGFzc2lvbiBjYW1lIHNvIG5lYXIgdGhlIGxpZmUgb2YgcGFzc2lvbiBhcyBzaGU8L0xJTkU+Cis8TElORT5kaXNjb3ZlcnMgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaHksIHdoYXQgZWZmZWN0cyBvZiBwYXNzaW9uIHNob3dzIHNoZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5CYWl0IHRoZSBob29rIHdlbGw7IHRoaXMgZmlzaCB3aWxsIGJpdGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBlZmZlY3RzLCBteSBsb3JkPyBTaGUgd2lsbCBzaXQgeW91LCB5b3UgaGVhcmQ8L0xJTkU+Cis8TElORT5teSBkYXVnaHRlciB0ZWxsIHlvdSBob3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+U2hlIGRpZCwgaW5kZWVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SG93LCBob3csIHByYXkgeW91PyBZb3UgYW1hemUgbWU6IEkgd291bGQgaGF2ZSBJPC9MSU5FPgorPExJTkU+dGhvdWdodCBoZXIgc3Bpcml0IGhhZCBiZWVuIGludmluY2libGUgYWdhaW5zdCBhbGw8L0xJTkU+Cis8TElORT5hc3NhdWx0cyBvZiBhZmZlY3Rpb24uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+SSB3b3VsZCBoYXZlIHN3b3JuIGl0IGhhZCwgbXkgbG9yZDsgZXNwZWNpYWxseTwvTElORT4KKzxMSU5FPmFnYWluc3QgQmVuZWRpY2suPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkkgc2hvdWxkIHRoaW5rIHRoaXMgYSBndWxsLCBidXQgdGhhdCB0aGU8L0xJTkU+Cis8TElORT53aGl0ZS1iZWFyZGVkIGZlbGxvdyBzcGVha3MgaXQ6IGtuYXZlcnkgY2Fubm90LDwvTElORT4KKzxMSU5FPnN1cmUsIGhpZGUgaGltc2VsZiBpbiBzdWNoIHJldmVyZW5jZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5IZSBoYXRoIHRhJ2VuIHRoZSBpbmZlY3Rpb246IGhvbGQgaXQgdXAuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5IYXRoIHNoZSBtYWRlIGhlciBhZmZlY3Rpb24ga25vd24gdG8gQmVuZWRpY2s/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+Tm87IGFuZCBzd2VhcnMgc2hlIG5ldmVyIHdpbGw6IHRoYXQncyBoZXIgdG9ybWVudC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT4nVGlzIHRydWUsIGluZGVlZDsgc28geW91ciBkYXVnaHRlciBzYXlzOiAnU2hhbGw8L0xJTkU+Cis8TElORT5JLCcgc2F5cyBzaGUsICd0aGF0IGhhdmUgc28gb2Z0IGVuY291bnRlcmVkIGhpbTwvTElORT4KKzxMSU5FPndpdGggc2Nvcm4sIHdyaXRlIHRvIGhpbSB0aGF0IEkgbG92ZSBoaW0/JzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlRoaXMgc2F5cyBzaGUgbm93IHdoZW4gc2hlIGlzIGJlZ2lubmluZyB0byB3cml0ZSB0bzwvTElORT4KKzxMSU5FPmhpbTsgZm9yIHNoZSdsbCBiZSB1cCB0d2VudHkgdGltZXMgYSBuaWdodCwgYW5kPC9MSU5FPgorPExJTkU+dGhlcmUgd2lsbCBzaGUgc2l0IGluIGhlciBzbW9jayB0aWxsIHNoZSBoYXZlIHdyaXQgYTwvTElORT4KKzxMSU5FPnNoZWV0IG9mIHBhcGVyOiBteSBkYXVnaHRlciB0ZWxscyB1cyBhbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+Tm93IHlvdSB0YWxrIG9mIGEgc2hlZXQgb2YgcGFwZXIsIEkgcmVtZW1iZXIgYTwvTElORT4KKzxMSU5FPnByZXR0eSBqZXN0IHlvdXIgZGF1Z2h0ZXIgdG9sZCB1cyBvZi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5PLCB3aGVuIHNoZSBoYWQgd3JpdCBpdCBhbmQgd2FzIHJlYWRpbmcgaXQgb3Zlciwgc2hlPC9MSU5FPgorPExJTkU+Zm91bmQgQmVuZWRpY2sgYW5kIEJlYXRyaWNlIGJldHdlZW4gdGhlIHNoZWV0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+Tywgc2hlIHRvcmUgdGhlIGxldHRlciBpbnRvIGEgdGhvdXNhbmQgaGFsZnBlbmNlOzwvTElORT4KKzxMSU5FPnJhaWxlZCBhdCBoZXJzZWxmLCB0aGF0IHNoZSBzaG91bGQgYmUgc28gaW1tb2Rlc3Q8L0xJTkU+Cis8TElORT50byB3cml0ZSB0byBvbmUgdGhhdCBzaGUga25ldyB3b3VsZCBmbG91dCBoZXI7ICdJPC9MSU5FPgorPExJTkU+bWVhc3VyZSBoaW0sJyBzYXlzIHNoZSwgJ2J5IG15IG93biBzcGlyaXQ7IGZvciBJPC9MSU5FPgorPExJTkU+c2hvdWxkIGZsb3V0IGhpbSwgaWYgaGUgd3JpdCB0byBtZTsgeWVhLCB0aG91Z2ggSTwvTElORT4KKzxMSU5FPmxvdmUgaGltLCBJIHNob3VsZC4nPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VGhlbiBkb3duIHVwb24gaGVyIGtuZWVzIHNoZSBmYWxscywgd2VlcHMsIHNvYnMsPC9MSU5FPgorPExJTkU+YmVhdHMgaGVyIGhlYXJ0LCB0ZWFycyBoZXIgaGFpciwgcHJheXMsIGN1cnNlczsgJ088L0xJTkU+Cis8TElORT5zd2VldCBCZW5lZGljayEgR29kIGdpdmUgbWUgcGF0aWVuY2UhJzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlNoZSBkb3RoIGluZGVlZDsgbXkgZGF1Z2h0ZXIgc2F5cyBzbzogYW5kIHRoZTwvTElORT4KKzxMSU5FPmVjc3Rhc3kgaGF0aCBzbyBtdWNoIG92ZXJib3JuZSBoZXIgdGhhdCBteSBkYXVnaHRlcjwvTElORT4KKzxMSU5FPmlzIHNvbWV0aW1lIGFmZWFyZWQgc2hlIHdpbGwgZG8gYSBkZXNwZXJhdGUgb3V0cmFnZTwvTElORT4KKzxMSU5FPnRvIGhlcnNlbGY6IGl0IGlzIHZlcnkgdHJ1ZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkl0IHdlcmUgZ29vZCB0aGF0IEJlbmVkaWNrIGtuZXcgb2YgaXQgYnkgc29tZTwvTElORT4KKzxMSU5FPm90aGVyLCBpZiBzaGUgd2lsbCBub3QgZGlzY292ZXIgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VG8gd2hhdCBlbmQ/IEhlIHdvdWxkIG1ha2UgYnV0IGEgc3BvcnQgb2YgaXQgYW5kPC9MSU5FPgorPExJTkU+dG9ybWVudCB0aGUgcG9vciBsYWR5IHdvcnNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QW4gaGUgc2hvdWxkLCBpdCB3ZXJlIGFuIGFsbXMgdG8gaGFuZyBoaW0uIFNoZSdzIGFuPC9MSU5FPgorPExJTkU+ZXhjZWxsZW50IHN3ZWV0IGxhZHk7IGFuZCwgb3V0IG9mIGFsbCBzdXNwaWNpb24sPC9MSU5FPgorPExJTkU+c2hlIGlzIHZpcnR1b3VzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBzaGUgaXMgZXhjZWVkaW5nIHdpc2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JbiBldmVyeSB0aGluZyBidXQgaW4gbG92aW5nIEJlbmVkaWNrLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk8sIG15IGxvcmQsIHdpc2RvbSBhbmQgYmxvb2QgY29tYmF0aW5nIGluIHNvIHRlbmRlcjwvTElORT4KKzxMSU5FPmEgYm9keSwgd2UgaGF2ZSB0ZW4gcHJvb2ZzIHRvIG9uZSB0aGF0IGJsb29kIGhhdGg8L0xJTkU+Cis8TElORT50aGUgdmljdG9yeS4gSSBhbSBzb3JyeSBmb3IgaGVyLCBhcyBJIGhhdmUganVzdDwvTElORT4KKzxMSU5FPmNhdXNlLCBiZWluZyBoZXIgdW5jbGUgYW5kIGhlciBndWFyZGlhbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkkgd291bGQgc2hlIGhhZCBiZXN0b3dlZCB0aGlzIGRvdGFnZSBvbiBtZTogSSB3b3VsZDwvTElORT4KKzxMSU5FPmhhdmUgZGFmZmVkIGFsbCBvdGhlciByZXNwZWN0cyBhbmQgbWFkZSBoZXIgaGFsZjwvTElORT4KKzxMSU5FPm15c2VsZi4gSSBwcmF5IHlvdSwgdGVsbCBCZW5lZGljayBvZiBpdCwgYW5kIGhlYXI8L0xJTkU+Cis8TElORT53aGF0IGEnIHdpbGwgc2F5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPldlcmUgaXQgZ29vZCwgdGhpbmsgeW91PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkhlcm8gdGhpbmtzIHN1cmVseSBzaGUgd2lsbCBkaWU7IGZvciBzaGUgc2F5cyBzaGU8L0xJTkU+Cis8TElORT53aWxsIGRpZSwgaWYgaGUgbG92ZSBoZXIgbm90LCBhbmQgc2hlIHdpbGwgZGllLCBlcmU8L0xJTkU+Cis8TElORT5zaGUgbWFrZSBoZXIgbG92ZSBrbm93biwgYW5kIHNoZSB3aWxsIGRpZSwgaWYgaGUgd29vPC9MSU5FPgorPExJTkU+aGVyLCByYXRoZXIgdGhhbiBzaGUgd2lsbCBiYXRlIG9uZSBicmVhdGggb2YgaGVyPC9MSU5FPgorPExJTkU+YWNjdXN0b21lZCBjcm9zc25lc3MuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5TaGUgZG90aCB3ZWxsOiBpZiBzaGUgc2hvdWxkIG1ha2UgdGVuZGVyIG9mIGhlcjwvTElORT4KKzxMSU5FPmxvdmUsICd0aXMgdmVyeSBwb3NzaWJsZSBoZSdsbCBzY29ybiBpdDsgZm9yIHRoZTwvTElORT4KKzxMSU5FPm1hbiwgYXMgeW91IGtub3cgYWxsLCBoYXRoIGEgY29udGVtcHRpYmxlIHNwaXJpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5IZSBpcyBhIHZlcnkgcHJvcGVyIG1hbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhlIGhhdGggaW5kZWVkIGEgZ29vZCBvdXR3YXJkIGhhcHBpbmVzcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5CZWZvcmUgR29kISBhbmQsIGluIG15IG1pbmQsIHZlcnkgd2lzZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhlIGRvdGggaW5kZWVkIHNob3cgc29tZSBzcGFya3MgdGhhdCBhcmUgbGlrZSB3aXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QW5kIEkgdGFrZSBoaW0gdG8gYmUgdmFsaWFudC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkFzIEhlY3RvciwgSSBhc3N1cmUgeW91OiBhbmQgaW4gdGhlIG1hbmFnaW5nIG9mPC9MSU5FPgorPExJTkU+cXVhcnJlbHMgeW91IG1heSBzYXkgaGUgaXMgd2lzZTsgZm9yIGVpdGhlciBoZTwvTElORT4KKzxMSU5FPmF2b2lkcyB0aGVtIHdpdGggZ3JlYXQgZGlzY3JldGlvbiwgb3IgdW5kZXJ0YWtlczwvTElORT4KKzxMSU5FPnRoZW0gd2l0aCBhIG1vc3QgQ2hyaXN0aWFuLWxpa2UgZmVhci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JZiBoZSBkbyBmZWFyIEdvZCwgYScgbXVzdCBuZWNlc3NhcmlseSBrZWVwIHBlYWNlOjwvTElORT4KKzxMSU5FPmlmIGhlIGJyZWFrIHRoZSBwZWFjZSwgaGUgb3VnaHQgdG8gZW50ZXIgaW50byBhPC9MSU5FPgorPExJTkU+cXVhcnJlbCB3aXRoIGZlYXIgYW5kIHRyZW1ibGluZy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBzbyB3aWxsIGhlIGRvOyBmb3IgdGhlIG1hbiBkb3RoIGZlYXIgR29kLDwvTElORT4KKzxMSU5FPmhvd3NvZXZlciBpdCBzZWVtcyBub3QgaW4gaGltIGJ5IHNvbWUgbGFyZ2UgamVzdHM8L0xJTkU+Cis8TElORT5oZSB3aWxsIG1ha2UuIFdlbGwgSSBhbSBzb3JyeSBmb3IgeW91ciBuaWVjZS4gU2hhbGw8L0xJTkU+Cis8TElORT53ZSBnbyBzZWVrIEJlbmVkaWNrLCBhbmQgdGVsbCBoaW0gb2YgaGVyIGxvdmU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TmV2ZXIgdGVsbCBoaW0sIG15IGxvcmQ6IGxldCBoZXIgd2VhciBpdCBvdXQgd2l0aDwvTElORT4KKzxMSU5FPmdvb2QgY291bnNlbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5OYXksIHRoYXQncyBpbXBvc3NpYmxlOiBzaGUgbWF5IHdlYXIgaGVyIGhlYXJ0IG91dCBmaXJzdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldlbGwsIHdlIHdpbGwgaGVhciBmdXJ0aGVyIG9mIGl0IGJ5IHlvdXIgZGF1Z2h0ZXI6PC9MSU5FPgorPExJTkU+bGV0IGl0IGNvb2wgdGhlIHdoaWxlLiBJIGxvdmUgQmVuZWRpY2sgd2VsbDsgYW5kIEk8L0xJTkU+Cis8TElORT5jb3VsZCB3aXNoIGhlIHdvdWxkIG1vZGVzdGx5IGV4YW1pbmUgaGltc2VsZiwgdG8gc2VlPC9MSU5FPgorPExJTkU+aG93IG11Y2ggaGUgaXMgdW53b3J0aHkgc28gZ29vZCBhIGxhZHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+TXkgbG9yZCwgd2lsbCB5b3Ugd2Fsaz8gZGlubmVyIGlzIHJlYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklmIGhlIGRvIG5vdCBkb3RlIG9uIGhlciB1cG9uIHRoaXMsIEkgd2lsbCBuZXZlcjwvTElORT4KKzxMSU5FPnRydXN0IG15IGV4cGVjdGF0aW9uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+TGV0IHRoZXJlIGJlIHRoZSBzYW1lIG5ldCBzcHJlYWQgZm9yIGhlcjsgYW5kIHRoYXQ8L0xJTkU+Cis8TElORT5tdXN0IHlvdXIgZGF1Z2h0ZXIgYW5kIGhlciBnZW50bGV3b21lbiBjYXJyeS4gVGhlPC9MSU5FPgorPExJTkU+c3BvcnQgd2lsbCBiZSwgd2hlbiB0aGV5IGhvbGQgb25lIGFuIG9waW5pb24gb2Y8L0xJTkU+Cis8TElORT5hbm90aGVyJ3MgZG90YWdlLCBhbmQgbm8gc3VjaCBtYXR0ZXI6IHRoYXQncyB0aGU8L0xJTkU+Cis8TElORT5zY2VuZSB0aGF0IEkgd291bGQgc2VlLCB3aGljaCB3aWxsIGJlIG1lcmVseSBhPC9MSU5FPgorPExJTkU+ZHVtYi1zaG93LiBMZXQgdXMgc2VuZCBoZXIgdG8gY2FsbCBoaW0gaW4gdG8gZGlubmVyLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGV1bnQgRE9OIFBFRFJPLCBDTEFVRElPLCBhbmQgTEVPTkFUTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPjxTVEFHRURJUj5Db21pbmcgZm9yd2FyZDwvU1RBR0VESVI+ICBUaGlzIGNhbiBiZSBubyB0cmljazogdGhlPC9MSU5FPgorPExJTkU+Y29uZmVyZW5jZSB3YXMgc2FkbHkgYm9ybmUuIFRoZXkgaGF2ZSB0aGUgdHJ1dGggb2Y8L0xJTkU+Cis8TElORT50aGlzIGZyb20gSGVyby4gVGhleSBzZWVtIHRvIHBpdHkgdGhlIGxhZHk6IGl0PC9MSU5FPgorPExJTkU+c2VlbXMgaGVyIGFmZmVjdGlvbnMgaGF2ZSB0aGVpciBmdWxsIGJlbnQuIExvdmUgbWUhPC9MSU5FPgorPExJTkU+d2h5LCBpdCBtdXN0IGJlIHJlcXVpdGVkLiBJIGhlYXIgaG93IEkgYW0gY2Vuc3VyZWQ6PC9MSU5FPgorPExJTkU+dGhleSBzYXkgSSB3aWxsIGJlYXIgbXlzZWxmIHByb3VkbHksIGlmIEkgcGVyY2VpdmU8L0xJTkU+Cis8TElORT50aGUgbG92ZSBjb21lIGZyb20gaGVyOyB0aGV5IHNheSB0b28gdGhhdCBzaGUgd2lsbDwvTElORT4KKzxMSU5FPnJhdGhlciBkaWUgdGhhbiBnaXZlIGFueSBzaWduIG9mIGFmZmVjdGlvbi4gSSBkaWQ8L0xJTkU+Cis8TElORT5uZXZlciB0aGluayB0byBtYXJyeTogSSBtdXN0IG5vdCBzZWVtIHByb3VkOiBoYXBweTwvTElORT4KKzxMSU5FPmFyZSB0aGV5IHRoYXQgaGVhciB0aGVpciBkZXRyYWN0aW9ucyBhbmQgY2FuIHB1dDwvTElORT4KKzxMSU5FPnRoZW0gdG8gbWVuZGluZy4gVGhleSBzYXkgdGhlIGxhZHkgaXMgZmFpcjsgJ3RpcyBhPC9MSU5FPgorPExJTkU+dHJ1dGgsIEkgY2FuIGJlYXIgdGhlbSB3aXRuZXNzOyBhbmQgdmlydHVvdXM7ICd0aXM8L0xJTkU+Cis8TElORT5zbywgSSBjYW5ub3QgcmVwcm92ZSBpdDsgYW5kIHdpc2UsIGJ1dCBmb3IgbG92aW5nPC9MSU5FPgorPExJTkU+bWU7IGJ5IG15IHRyb3RoLCBpdCBpcyBubyBhZGRpdGlvbiB0byBoZXIgd2l0LCBub3I8L0xJTkU+Cis8TElORT5ubyBncmVhdCBhcmd1bWVudCBvZiBoZXIgZm9sbHksIGZvciBJIHdpbGwgYmU8L0xJTkU+Cis8TElORT5ob3JyaWJseSBpbiBsb3ZlIHdpdGggaGVyLiBJIG1heSBjaGFuY2UgaGF2ZSBzb21lPC9MSU5FPgorPExJTkU+b2RkIHF1aXJrcyBhbmQgcmVtbmFudHMgb2Ygd2l0IGJyb2tlbiBvbiBtZSw8L0xJTkU+Cis8TElORT5iZWNhdXNlIEkgaGF2ZSByYWlsZWQgc28gbG9uZyBhZ2FpbnN0IG1hcnJpYWdlOiBidXQ8L0xJTkU+Cis8TElORT5kb3RoIG5vdCB0aGUgYXBwZXRpdGUgYWx0ZXI/IGEgbWFuIGxvdmVzIHRoZSBtZWF0PC9MSU5FPgorPExJTkU+aW4gaGlzIHlvdXRoIHRoYXQgaGUgY2Fubm90IGVuZHVyZSBpbiBoaXMgYWdlLjwvTElORT4KKzxMSU5FPlNoYWxsIHF1aXBzIGFuZCBzZW50ZW5jZXMgYW5kIHRoZXNlIHBhcGVyIGJ1bGxldHMgb2Y8L0xJTkU+Cis8TElORT50aGUgYnJhaW4gYXdlIGEgbWFuIGZyb20gdGhlIGNhcmVlciBvZiBoaXMgaHVtb3VyPzwvTElORT4KKzxMSU5FPk5vLCB0aGUgd29ybGQgbXVzdCBiZSBwZW9wbGVkLiBXaGVuIEkgc2FpZCBJIHdvdWxkPC9MSU5FPgorPExJTkU+ZGllIGEgYmFjaGVsb3IsIEkgZGlkIG5vdCB0aGluayBJIHNob3VsZCBsaXZlIHRpbGwgSTwvTElORT4KKzxMSU5FPndlcmUgbWFycmllZC4gSGVyZSBjb21lcyBCZWF0cmljZS4gQnkgdGhpcyBkYXkhPC9MSU5FPgorPExJTkU+c2hlJ3MgYSBmYWlyIGxhZHk6IEkgZG8gc3B5IHNvbWUgbWFya3Mgb2YgbG92ZSBpbjwvTElORT4KKzxMSU5FPmhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RW50ZXIgQkVBVFJJQ0U8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5BZ2FpbnN0IG15IHdpbGwgSSBhbSBzZW50IHRvIGJpZCB5b3UgY29tZSBpbiB0byBkaW5uZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkZhaXIgQmVhdHJpY2UsIEkgdGhhbmsgeW91IGZvciB5b3VyIHBhaW5zLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JIHRvb2sgbm8gbW9yZSBwYWlucyBmb3IgdGhvc2UgdGhhbmtzIHRoYW4geW91IHRha2U8L0xJTkU+Cis8TElORT5wYWlucyB0byB0aGFuayBtZTogaWYgaXQgaGFkIGJlZW4gcGFpbmZ1bCwgSSB3b3VsZDwvTElORT4KKzxMSU5FPm5vdCBoYXZlIGNvbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPllvdSB0YWtlIHBsZWFzdXJlIHRoZW4gaW4gdGhlIG1lc3NhZ2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlllYSwganVzdCBzbyBtdWNoIGFzIHlvdSBtYXkgdGFrZSB1cG9uIGEga25pZmUnczwvTElORT4KKzxMSU5FPnBvaW50IGFuZCBjaG9rZSBhIGRhdyB3aXRoYWwuIFlvdSBoYXZlIG5vIHN0b21hY2gsPC9MSU5FPgorPExJTkU+c2lnbmlvcjogZmFyZSB5b3Ugd2VsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkhhISAnQWdhaW5zdCBteSB3aWxsIEkgYW0gc2VudCB0byBiaWQgeW91IGNvbWUgaW48L0xJTkU+Cis8TElORT50byBkaW5uZXI7JyB0aGVyZSdzIGEgZG91YmxlIG1lYW5pbmcgaW4gdGhhdCAnSSB0b29rPC9MSU5FPgorPExJTkU+bm8gbW9yZSBwYWlucyBmb3IgdGhvc2UgdGhhbmtzIHRoYW4geW91IHRvb2sgcGFpbnM8L0xJTkU+Cis8TElORT50byB0aGFuayBtZS4nIHRoYXQncyBhcyBtdWNoIGFzIHRvIHNheSwgQW55IHBhaW5zPC9MSU5FPgorPExJTkU+dGhhdCBJIHRha2UgZm9yIHlvdSBpcyBhcyBlYXN5IGFzIHRoYW5rcy4gSWYgSSBkbzwvTElORT4KKzxMSU5FPm5vdCB0YWtlIHBpdHkgb2YgaGVyLCBJIGFtIGEgdmlsbGFpbjsgaWYgSSBkbyBub3Q8L0xJTkU+Cis8TElORT5sb3ZlIGhlciwgSSBhbSBhIEpldy4gSSB3aWxsIGdvIGdldCBoZXIgcGljdHVyZS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8L0FDVD4KKworPEFDVD48VElUTEU+QUNUIElJSTwvVElUTEU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSS4gIExFT05BVE8nUyBnYXJkZW4uPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBIRVJPLCBNQVJHQVJFVCwgYW5kIFVSU1VMQTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+R29vZCBNYXJnYXJldCwgcnVuIHRoZWUgdG8gdGhlIHBhcmxvcjs8L0xJTkU+Cis8TElORT5UaGVyZSBzaGFsdCB0aG91IGZpbmQgbXkgY291c2luIEJlYXRyaWNlPC9MSU5FPgorPExJTkU+UHJvcG9zaW5nIHdpdGggdGhlIHByaW5jZSBhbmQgQ2xhdWRpbzo8L0xJTkU+Cis8TElORT5XaGlzcGVyIGhlciBlYXIgYW5kIHRlbGwgaGVyLCBJIGFuZCBVcnN1bGE8L0xJTkU+Cis8TElORT5XYWxrIGluIHRoZSBvcmNoYXJkIGFuZCBvdXIgd2hvbGUgZGlzY291cnNlPC9MSU5FPgorPExJTkU+SXMgYWxsIG9mIGhlcjsgc2F5IHRoYXQgdGhvdSBvdmVyaGVhcmQnc3QgdXM7PC9MSU5FPgorPExJTkU+QW5kIGJpZCBoZXIgc3RlYWwgaW50byB0aGUgcGxlYWNoZWQgYm93ZXIsPC9MSU5FPgorPExJTkU+V2hlcmUgaG9uZXlzdWNrbGVzLCByaXBlbidkIGJ5IHRoZSBzdW4sPC9MSU5FPgorPExJTkU+Rm9yYmlkIHRoZSBzdW4gdG8gZW50ZXIsIGxpa2UgZmF2b3VyaXRlcyw8L0xJTkU+Cis8TElORT5NYWRlIHByb3VkIGJ5IHByaW5jZXMsIHRoYXQgYWR2YW5jZSB0aGVpciBwcmlkZTwvTElORT4KKzxMSU5FPkFnYWluc3QgdGhhdCBwb3dlciB0aGF0IGJyZWQgaXQ6IHRoZXJlIHdpbGwgc2hlIGhpZGUgaGVyLDwvTElORT4KKzxMSU5FPlRvIGxpc3RlbiBvdXIgcHVycG9zZS4gIFRoaXMgaXMgdGh5IG9mZmljZTs8L0xJTkU+Cis8TElORT5CZWFyIHRoZWUgd2VsbCBpbiBpdCBhbmQgbGVhdmUgdXMgYWxvbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPkknbGwgbWFrZSBoZXIgY29tZSwgSSB3YXJyYW50IHlvdSwgcHJlc2VudGx5LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5Ob3csIFVyc3VsYSwgd2hlbiBCZWF0cmljZSBkb3RoIGNvbWUsPC9MSU5FPgorPExJTkU+QXMgd2UgZG8gdHJhY2UgdGhpcyBhbGxleSB1cCBhbmQgZG93biw8L0xJTkU+Cis8TElORT5PdXIgdGFsayBtdXN0IG9ubHkgYmUgb2YgQmVuZWRpY2suPC9MSU5FPgorPExJTkU+V2hlbiBJIGRvIG5hbWUgaGltLCBsZXQgaXQgYmUgdGh5IHBhcnQ8L0xJTkU+Cis8TElORT5UbyBwcmFpc2UgaGltIG1vcmUgdGhhbiBldmVyIG1hbiBkaWQgbWVyaXQ6PC9MSU5FPgorPExJTkU+TXkgdGFsayB0byB0aGVlIG11c3QgYmUgaG93IEJlbmVkaWNrPC9MSU5FPgorPExJTkU+SXMgc2ljayBpbiBsb3ZlIHdpdGggQmVhdHJpY2UuIE9mIHRoaXMgbWF0dGVyPC9MSU5FPgorPExJTkU+SXMgbGl0dGxlIEN1cGlkJ3MgY3JhZnR5IGFycm93IG1hZGUsPC9MSU5FPgorPExJTkU+VGhhdCBvbmx5IHdvdW5kcyBieSBoZWFyc2F5LjwvTElORT4KKzxTVEFHRURJUj5FbnRlciBCRUFUUklDRSwgYmVoaW5kPC9TVEFHRURJUj4KKzxMSU5FPk5vdyBiZWdpbjs8L0xJTkU+Cis8TElORT5Gb3IgbG9vayB3aGVyZSBCZWF0cmljZSwgbGlrZSBhIGxhcHdpbmcsIHJ1bnM8L0xJTkU+Cis8TElORT5DbG9zZSBieSB0aGUgZ3JvdW5kLCB0byBoZWFyIG91ciBjb25mZXJlbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+VGhlIHBsZWFzYW50J3N0IGFuZ2xpbmcgaXMgdG8gc2VlIHRoZSBmaXNoPC9MSU5FPgorPExJTkU+Q3V0IHdpdGggaGVyIGdvbGRlbiBvYXJzIHRoZSBzaWx2ZXIgc3RyZWFtLDwvTElORT4KKzxMSU5FPkFuZCBncmVlZGlseSBkZXZvdXIgdGhlIHRyZWFjaGVyb3VzIGJhaXQ6PC9MSU5FPgorPExJTkU+U28gYW5nbGUgd2UgZm9yIEJlYXRyaWNlOyB3aG8gZXZlbiBub3c8L0xJTkU+Cis8TElORT5JcyBjb3VjaGVkIGluIHRoZSB3b29kYmluZSBjb3ZlcnR1cmUuPC9MSU5FPgorPExJTkU+RmVhciB5b3Ugbm90IG15IHBhcnQgb2YgdGhlIGRpYWxvZ3VlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPlRoZW4gZ28gd2UgbmVhciBoZXIsIHRoYXQgaGVyIGVhciBsb3NlIG5vdGhpbmc8L0xJTkU+Cis8TElORT5PZiB0aGUgZmFsc2Ugc3dlZXQgYmFpdCB0aGF0IHdlIGxheSBmb3IgaXQuPC9MSU5FPgorPFNUQUdFRElSPkFwcHJvYWNoaW5nIHRoZSBib3dlcjwvU1RBR0VESVI+Cis8TElORT5ObywgdHJ1bHksIFVyc3VsYSwgc2hlIGlzIHRvbyBkaXNkYWluZnVsOzwvTElORT4KKzxMSU5FPkkga25vdyBoZXIgc3Bpcml0cyBhcmUgYXMgY295IGFuZCB3aWxkPC9MSU5FPgorPExJTkU+QXMgaGFnZ2VyZHMgb2YgdGhlIHJvY2suPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5CdXQgYXJlIHlvdSBzdXJlPC9MSU5FPgorPExJTkU+VGhhdCBCZW5lZGljayBsb3ZlcyBCZWF0cmljZSBzbyBlbnRpcmVseT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5TbyBzYXlzIHRoZSBwcmluY2UgYW5kIG15IG5ldy10cm90aGVkIGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5BbmQgZGlkIHRoZXkgYmlkIHlvdSB0ZWxsIGhlciBvZiBpdCwgbWFkYW0/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+VGhleSBkaWQgZW50cmVhdCBtZSB0byBhY3F1YWludCBoZXIgb2YgaXQ7PC9MSU5FPgorPExJTkU+QnV0IEkgcGVyc3VhZGVkIHRoZW0sIGlmIHRoZXkgbG92ZWQgQmVuZWRpY2ssPC9MSU5FPgorPExJTkU+VG8gd2lzaCBoaW0gd3Jlc3RsZSB3aXRoIGFmZmVjdGlvbiw8L0xJTkU+Cis8TElORT5BbmQgbmV2ZXIgdG8gbGV0IEJlYXRyaWNlIGtub3cgb2YgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5XaHkgZGlkIHlvdSBzbz8gRG90aCBub3QgdGhlIGdlbnRsZW1hbjwvTElORT4KKzxMSU5FPkRlc2VydmUgYXMgZnVsbCBhcyBmb3J0dW5hdGUgYSBiZWQ8L0xJTkU+Cis8TElORT5BcyBldmVyIEJlYXRyaWNlIHNoYWxsIGNvdWNoIHVwb24/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+TyBnb2Qgb2YgbG92ZSEgSSBrbm93IGhlIGRvdGggZGVzZXJ2ZTwvTElORT4KKzxMSU5FPkFzIG11Y2ggYXMgbWF5IGJlIHlpZWxkZWQgdG8gYSBtYW46PC9MSU5FPgorPExJTkU+QnV0IE5hdHVyZSBuZXZlciBmcmFtZWQgYSB3b21hbidzIGhlYXJ0PC9MSU5FPgorPExJTkU+T2YgcHJvdWRlciBzdHVmZiB0aGFuIHRoYXQgb2YgQmVhdHJpY2U7PC9MSU5FPgorPExJTkU+RGlzZGFpbiBhbmQgc2Nvcm4gcmlkZSBzcGFya2xpbmcgaW4gaGVyIGV5ZXMsPC9MSU5FPgorPExJTkU+TWlzcHJpc2luZyB3aGF0IHRoZXkgbG9vayBvbiwgYW5kIGhlciB3aXQ8L0xJTkU+Cis8TElORT5WYWx1ZXMgaXRzZWxmIHNvIGhpZ2hseSB0aGF0IHRvIGhlcjwvTElORT4KKzxMSU5FPkFsbCBtYXR0ZXIgZWxzZSBzZWVtcyB3ZWFrOiBzaGUgY2Fubm90IGxvdmUsPC9MSU5FPgorPExJTkU+Tm9yIHRha2Ugbm8gc2hhcGUgbm9yIHByb2plY3Qgb2YgYWZmZWN0aW9uLDwvTElORT4KKzxMSU5FPlNoZSBpcyBzbyBzZWxmLWVuZGVhcmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+U3VyZSwgSSB0aGluayBzbzs8L0xJTkU+Cis8TElORT5BbmQgdGhlcmVmb3JlIGNlcnRhaW5seSBpdCB3ZXJlIG5vdCBnb29kPC9MSU5FPgorPExJTkU+U2hlIGtuZXcgaGlzIGxvdmUsIGxlc3Qgc2hlIG1ha2Ugc3BvcnQgYXQgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+V2h5LCB5b3Ugc3BlYWsgdHJ1dGguIEkgbmV2ZXIgeWV0IHNhdyBtYW4sPC9MSU5FPgorPExJTkU+SG93IHdpc2UsIGhvdyBub2JsZSwgeW91bmcsIGhvdyByYXJlbHkgZmVhdHVyZWQsPC9MSU5FPgorPExJTkU+QnV0IHNoZSB3b3VsZCBzcGVsbCBoaW0gYmFja3dhcmQ6IGlmIGZhaXItZmFjZWQsPC9MSU5FPgorPExJTkU+U2hlIHdvdWxkIHN3ZWFyIHRoZSBnZW50bGVtYW4gc2hvdWxkIGJlIGhlciBzaXN0ZXI7PC9MSU5FPgorPExJTkU+SWYgYmxhY2ssIHdoeSwgTmF0dXJlLCBkcmF3aW5nIG9mIGFuIGFudGlxdWUsPC9MSU5FPgorPExJTkU+TWFkZSBhIGZvdWwgYmxvdDsgaWYgdGFsbCwgYSBsYW5jZSBpbGwtaGVhZGVkOzwvTElORT4KKzxMSU5FPklmIGxvdywgYW4gYWdhdGUgdmVyeSB2aWxlbHkgY3V0OzwvTElORT4KKzxMSU5FPklmIHNwZWFraW5nLCB3aHksIGEgdmFuZSBibG93biB3aXRoIGFsbCB3aW5kczs8L0xJTkU+Cis8TElORT5JZiBzaWxlbnQsIHdoeSwgYSBibG9jayBtb3ZlZCB3aXRoIG5vbmUuPC9MSU5FPgorPExJTkU+U28gdHVybnMgc2hlIGV2ZXJ5IG1hbiB0aGUgd3Jvbmcgc2lkZSBvdXQ8L0xJTkU+Cis8TElORT5BbmQgbmV2ZXIgZ2l2ZXMgdG8gdHJ1dGggYW5kIHZpcnR1ZSB0aGF0PC9MSU5FPgorPExJTkU+V2hpY2ggc2ltcGxlbmVzcyBhbmQgbWVyaXQgcHVyY2hhc2V0aC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KKzxMSU5FPlN1cmUsIHN1cmUsIHN1Y2ggY2FycGluZyBpcyBub3QgY29tbWVuZGFibGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+Tm8sIG5vdCB0byBiZSBzbyBvZGQgYW5kIGZyb20gYWxsIGZhc2hpb25zPC9MSU5FPgorPExJTkU+QXMgQmVhdHJpY2UgaXMsIGNhbm5vdCBiZSBjb21tZW5kYWJsZTo8L0xJTkU+Cis8TElORT5CdXQgd2hvIGRhcmUgdGVsbCBoZXIgc28/IElmIEkgc2hvdWxkIHNwZWFrLDwvTElORT4KKzxMSU5FPlNoZSB3b3VsZCBtb2NrIG1lIGludG8gYWlyOyBPLCBzaGUgd291bGQgbGF1Z2ggbWU8L0xJTkU+Cis8TElORT5PdXQgb2YgbXlzZWxmLCBwcmVzcyBtZSB0byBkZWF0aCB3aXRoIHdpdC48L0xJTkU+Cis8TElORT5UaGVyZWZvcmUgbGV0IEJlbmVkaWNrLCBsaWtlIGNvdmVyJ2QgZmlyZSw8L0xJTkU+Cis8TElORT5Db25zdW1lIGF3YXkgaW4gc2lnaHMsIHdhc3RlIGlud2FyZGx5OjwvTElORT4KKzxMSU5FPkl0IHdlcmUgYSBiZXR0ZXIgZGVhdGggdGhhbiBkaWUgd2l0aCBtb2Nrcyw8L0xJTkU+Cis8TElORT5XaGljaCBpcyBhcyBiYWQgYXMgZGllIHdpdGggdGlja2xpbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5ZZXQgdGVsbCBoZXIgb2YgaXQ6IGhlYXIgd2hhdCBzaGUgd2lsbCBzYXkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+Tm87IHJhdGhlciBJIHdpbGwgZ28gdG8gQmVuZWRpY2s8L0xJTkU+Cis8TElORT5BbmQgY291bnNlbCBoaW0gdG8gZmlnaHQgYWdhaW5zdCBoaXMgcGFzc2lvbi48L0xJTkU+Cis8TElORT5BbmQsIHRydWx5LCBJJ2xsIGRldmlzZSBzb21lIGhvbmVzdCBzbGFuZGVyczwvTElORT4KKzxMSU5FPlRvIHN0YWluIG15IGNvdXNpbiB3aXRoOiBvbmUgZG90aCBub3Qga25vdzwvTElORT4KKzxMSU5FPkhvdyBtdWNoIGFuIGlsbCB3b3JkIG1heSBlbXBvaXNvbiBsaWtpbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5PLCBkbyBub3QgZG8geW91ciBjb3VzaW4gc3VjaCBhIHdyb25nLjwvTElORT4KKzxMSU5FPlNoZSBjYW5ub3QgYmUgc28gbXVjaCB3aXRob3V0IHRydWUganVkZ21lbnQtLTwvTElORT4KKzxMSU5FPkhhdmluZyBzbyBzd2lmdCBhbmQgZXhjZWxsZW50IGEgd2l0PC9MSU5FPgorPExJTkU+QXMgc2hlIGlzIHByaXplZCB0byBoYXZlLS1hcyB0byByZWZ1c2U8L0xJTkU+Cis8TElORT5TbyByYXJlIGEgZ2VudGxlbWFuIGFzIFNpZ25pb3IgQmVuZWRpY2suPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+SGUgaXMgdGhlIG9ubHkgbWFuIG9mIEl0YWx5LjwvTElORT4KKzxMSU5FPkFsd2F5cyBleGNlcHRlZCBteSBkZWFyIENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5JIHByYXkgeW91LCBiZSBub3QgYW5ncnkgd2l0aCBtZSwgbWFkYW0sPC9MSU5FPgorPExJTkU+U3BlYWtpbmcgbXkgZmFuY3k6IFNpZ25pb3IgQmVuZWRpY2ssPC9MSU5FPgorPExJTkU+Rm9yIHNoYXBlLCBmb3IgYmVhcmluZywgYXJndW1lbnQgYW5kIHZhbG91ciw8L0xJTkU+Cis8TElORT5Hb2VzIGZvcmVtb3N0IGluIHJlcG9ydCB0aHJvdWdoIEl0YWx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkluZGVlZCwgaGUgaGF0aCBhbiBleGNlbGxlbnQgZ29vZCBuYW1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+SGlzIGV4Y2VsbGVuY2UgZGlkIGVhcm4gaXQsIGVyZSBoZSBoYWQgaXQuPC9MSU5FPgorPExJTkU+V2hlbiBhcmUgeW91IG1hcnJpZWQsIG1hZGFtPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPldoeSwgZXZlcnkgZGF5LCB0by1tb3Jyb3cuIENvbWUsIGdvIGluOjwvTElORT4KKzxMSU5FPkknbGwgc2hvdyB0aGVlIHNvbWUgYXR0aXJlcywgYW5kIGhhdmUgdGh5IGNvdW5zZWw8L0xJTkU+Cis8TElORT5XaGljaCBpcyB0aGUgYmVzdCB0byBmdXJuaXNoIG1lIHRvLW1vcnJvdy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlVSU1VMQTwvU1BFQUtFUj4KKzxMSU5FPlNoZSdzIGxpbWVkLCBJIHdhcnJhbnQgeW91OiB3ZSBoYXZlIGNhdWdodCBoZXIsIG1hZGFtLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPklmIGl0IHByb3ZlcyBzbywgdGhlbiBsb3ZpbmcgZ29lcyBieSBoYXBzOjwvTElORT4KKzxMSU5FPlNvbWUgQ3VwaWQga2lsbHMgd2l0aCBhcnJvd3MsIHNvbWUgd2l0aCB0cmFwcy48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50IEhFUk8gYW5kIFVSU1VMQTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPjxTVEFHRURJUj5Db21pbmcgZm9yd2FyZDwvU1RBR0VESVI+PC9MSU5FPgorPExJTkU+V2hhdCBmaXJlIGlzIGluIG1pbmUgZWFycz8gQ2FuIHRoaXMgYmUgdHJ1ZT88L0xJTkU+Cis8TElORT5TdGFuZCBJIGNvbmRlbW4nZCBmb3IgcHJpZGUgYW5kIHNjb3JuIHNvIG11Y2g/PC9MSU5FPgorPExJTkU+Q29udGVtcHQsIGZhcmV3ZWxsISBhbmQgbWFpZGVuIHByaWRlLCBhZGlldSE8L0xJTkU+Cis8TElORT5ObyBnbG9yeSBsaXZlcyBiZWhpbmQgdGhlIGJhY2sgb2Ygc3VjaC48L0xJTkU+Cis8TElORT5BbmQsIEJlbmVkaWNrLCBsb3ZlIG9uOyBJIHdpbGwgcmVxdWl0ZSB0aGVlLDwvTElORT4KKzxMSU5FPlRhbWluZyBteSB3aWxkIGhlYXJ0IHRvIHRoeSBsb3ZpbmcgaGFuZDo8L0xJTkU+Cis8TElORT5JZiB0aG91IGRvc3QgbG92ZSwgbXkga2luZG5lc3Mgc2hhbGwgaW5jaXRlIHRoZWU8L0xJTkU+Cis8TElORT5UbyBiaW5kIG91ciBsb3ZlcyB1cCBpbiBhIGhvbHkgYmFuZDs8L0xJTkU+Cis8TElORT5Gb3Igb3RoZXJzIHNheSB0aG91IGRvc3QgZGVzZXJ2ZSwgYW5kIEk8L0xJTkU+Cis8TElORT5CZWxpZXZlIGl0IGJldHRlciB0aGFuIHJlcG9ydGluZ2x5LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSUkuICBBIHJvb20gaW4gTEVPTkFUTydTIGhvdXNlPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBET04gUEVEUk8sIENMQVVESU8sIEJFTkVESUNLLCBhbmQgTEVPTkFUTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JIGRvIGJ1dCBzdGF5IHRpbGwgeW91ciBtYXJyaWFnZSBiZSBjb25zdW1tYXRlLCBhbmQ8L0xJTkU+Cis8TElORT50aGVuIGdvIEkgdG93YXJkIEFycmFnb24uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SSdsbCBicmluZyB5b3UgdGhpdGhlciwgbXkgbG9yZCwgaWYgeW91J2xsPC9MSU5FPgorPExJTkU+dm91Y2hzYWZlIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+TmF5LCB0aGF0IHdvdWxkIGJlIGFzIGdyZWF0IGEgc29pbCBpbiB0aGUgbmV3IGdsb3NzPC9MSU5FPgorPExJTkU+b2YgeW91ciBtYXJyaWFnZSBhcyB0byBzaG93IGEgY2hpbGQgaGlzIG5ldyBjb2F0PC9MSU5FPgorPExJTkU+YW5kIGZvcmJpZCBoaW0gdG8gd2VhciBpdC4gSSB3aWxsIG9ubHkgYmUgYm9sZDwvTElORT4KKzxMSU5FPndpdGggQmVuZWRpY2sgZm9yIGhpcyBjb21wYW55OyBmb3IsIGZyb20gdGhlIGNyb3duPC9MSU5FPgorPExJTkU+b2YgaGlzIGhlYWQgdG8gdGhlIHNvbGUgb2YgaGlzIGZvb3QsIGhlIGlzIGFsbDwvTElORT4KKzxMSU5FPm1pcnRoOiBoZSBoYXRoIHR3aWNlIG9yIHRocmljZSBjdXQgQ3VwaWQnczwvTElORT4KKzxMSU5FPmJvdy1zdHJpbmcgYW5kIHRoZSBsaXR0bGUgaGFuZ21hbiBkYXJlIG5vdCBzaG9vdCBhdDwvTElORT4KKzxMSU5FPmhpbTsgaGUgaGF0aCBhIGhlYXJ0IGFzIHNvdW5kIGFzIGEgYmVsbCBhbmQgaGlzPC9MSU5FPgorPExJTkU+dG9uZ3VlIGlzIHRoZSBjbGFwcGVyLCBmb3Igd2hhdCBoaXMgaGVhcnQgdGhpbmtzIGhpczwvTElORT4KKzxMSU5FPnRvbmd1ZSBzcGVha3MuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkdhbGxhbnRzLCBJIGFtIG5vdCBhcyBJIGhhdmUgYmVlbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5TbyBzYXkgSSBtZXRoaW5rcyB5b3UgYXJlIHNhZGRlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JIGhvcGUgaGUgYmUgaW4gbG92ZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhhbmcgaGltLCB0cnVhbnQhIHRoZXJlJ3Mgbm8gdHJ1ZSBkcm9wIG9mIGJsb29kIGluPC9MSU5FPgorPExJTkU+aGltLCB0byBiZSB0cnVseSB0b3VjaGVkIHdpdGggbG92ZTogaWYgaGUgYmUgc2FkLDwvTElORT4KKzxMSU5FPmhlIHdhbnRzIG1vbmV5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIGhhdmUgdGhlIHRvb3RoYWNoZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkRyYXcgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkhhbmcgaXQhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+WW91IG11c3QgaGFuZyBpdCBmaXJzdCwgYW5kIGRyYXcgaXQgYWZ0ZXJ3YXJkcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldoYXQhIHNpZ2ggZm9yIHRoZSB0b290aGFjaGU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hlcmUgaXMgYnV0IGEgaHVtb3VyIG9yIGEgd29ybS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+V2VsbCwgZXZlcnkgb25lIGNhbiBtYXN0ZXIgYSBncmllZiBidXQgaGUgdGhhdCBoYXM8L0xJTkU+Cis8TElORT5pdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5ZZXQgc2F5IEksIGhlIGlzIGluIGxvdmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UaGVyZSBpcyBubyBhcHBlYXJhbmNlIG9mIGZhbmN5IGluIGhpbSwgdW5sZXNzIGl0IGJlPC9MSU5FPgorPExJTkU+YSBmYW5jeSB0aGF0IGhlIGhhdGggdG8gc3RyYW5nZSBkaXNndWlzZXM7IGFzLCB0byBiZTwvTElORT4KKzxMSU5FPmEgRHV0Y2htYW4gdG9kYXksIGEgRnJlbmNobWFuIHRvLW1vcnJvdywgb3IgaW4gdGhlPC9MSU5FPgorPExJTkU+c2hhcGUgb2YgdHdvIGNvdW50cmllcyBhdCBvbmNlLCBhcywgYSBHZXJtYW4gZnJvbTwvTElORT4KKzxMSU5FPnRoZSB3YWlzdCBkb3dud2FyZCwgYWxsIHNsb3BzLCBhbmQgYSBTcGFuaWFyZCBmcm9tPC9MSU5FPgorPExJTkU+dGhlIGhpcCB1cHdhcmQsIG5vIGRvdWJsZXQuIFVubGVzcyBoZSBoYXZlIGEgZmFuY3k8L0xJTkU+Cis8TElORT50byB0aGlzIGZvb2xlcnksIGFzIGl0IGFwcGVhcnMgaGUgaGF0aCwgaGUgaXMgbm88L0xJTkU+Cis8TElORT5mb29sIGZvciBmYW5jeSwgYXMgeW91IHdvdWxkIGhhdmUgaXQgYXBwZWFyIGhlIGlzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklmIGhlIGJlIG5vdCBpbiBsb3ZlIHdpdGggc29tZSB3b21hbiwgdGhlcmUgaXMgbm88L0xJTkU+Cis8TElORT5iZWxpZXZpbmcgb2xkIHNpZ25zOiBhJyBicnVzaGVzIGhpcyBoYXQgbyc8L0xJTkU+Cis8TElORT5tb3JuaW5nczsgd2hhdCBzaG91bGQgdGhhdCBib2RlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SGF0aCBhbnkgbWFuIHNlZW4gaGltIGF0IHRoZSBiYXJiZXIncz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5ObywgYnV0IHRoZSBiYXJiZXIncyBtYW4gaGF0aCBiZWVuIHNlZW4gd2l0aCBoaW0sPC9MSU5FPgorPExJTkU+YW5kIHRoZSBvbGQgb3JuYW1lbnQgb2YgaGlzIGNoZWVrIGhhdGggYWxyZWFkeTwvTElORT4KKzxMSU5FPnN0dWZmZWQgdGVubmlzLWJhbGxzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkluZGVlZCwgaGUgbG9va3MgeW91bmdlciB0aGFuIGhlIGRpZCwgYnkgdGhlIGxvc3Mgb2YgYSBiZWFyZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk5heSwgYScgcnVicyBoaW1zZWxmIHdpdGggY2l2ZXQ6IGNhbiB5b3Ugc21lbGwgaGltPC9MSU5FPgorPExJTkU+b3V0IGJ5IHRoYXQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VGhhdCdzIGFzIG11Y2ggYXMgdG8gc2F5LCB0aGUgc3dlZXQgeW91dGgncyBpbiBsb3ZlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+VGhlIGdyZWF0ZXN0IG5vdGUgb2YgaXQgaXMgaGlzIG1lbGFuY2hvbHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QW5kIHdoZW4gd2FzIGhlIHdvbnQgdG8gd2FzaCBoaXMgZmFjZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPlllYSwgb3IgdG8gcGFpbnQgaGltc2VsZj8gZm9yIHRoZSB3aGljaCwgSSBoZWFyPC9MSU5FPgorPExJTkU+d2hhdCB0aGV5IHNheSBvZiBoaW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TmF5LCBidXQgaGlzIGplc3Rpbmcgc3Bpcml0OyB3aGljaCBpcyBub3cgY3JlcHQgaW50bzwvTElORT4KKzxMSU5FPmEgbHV0ZS1zdHJpbmcgYW5kIG5vdyBnb3Zlcm5lZCBieSBzdG9wcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkluZGVlZCwgdGhhdCB0ZWxscyBhIGhlYXZ5IHRhbGUgZm9yIGhpbTogY29uY2x1ZGUsPC9MSU5FPgorPExJTkU+Y29uY2x1ZGUgaGUgaXMgaW4gbG92ZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5OYXksIGJ1dCBJIGtub3cgd2hvIGxvdmVzIGhpbS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQgd291bGQgSSBrbm93IHRvbzogSSB3YXJyYW50LCBvbmUgdGhhdCBrbm93cyBoaW0gbm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlllcywgYW5kIGhpcyBpbGwgY29uZGl0aW9uczsgYW5kLCBpbiBkZXNwaXRlIG9mPC9MSU5FPgorPExJTkU+YWxsLCBkaWVzIGZvciBoaW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5TaGUgc2hhbGwgYmUgYnVyaWVkIHdpdGggaGVyIGZhY2UgdXB3YXJkcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+WWV0IGlzIHRoaXMgbm8gY2hhcm0gZm9yIHRoZSB0b290aGFjaGUuIE9sZDwvTElORT4KKzxMSU5FPnNpZ25pb3IsIHdhbGsgYXNpZGUgd2l0aCBtZTogSSBoYXZlIHN0dWRpZWQgZWlnaHQ8L0xJTkU+Cis8TElORT5vciBuaW5lIHdpc2Ugd29yZHMgdG8gc3BlYWsgdG8geW91LCB3aGljaCB0aGVzZTwvTElORT4KKzxMSU5FPmhvYmJ5LWhvcnNlcyBtdXN0IG5vdCBoZWFyLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGV1bnQgQkVORURJQ0sgYW5kIExFT05BVE88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Rm9yIG15IGxpZmUsIHRvIGJyZWFrIHdpdGggaGltIGFib3V0IEJlYXRyaWNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPidUaXMgZXZlbiBzby4gSGVybyBhbmQgTWFyZ2FyZXQgaGF2ZSBieSB0aGlzPC9MSU5FPgorPExJTkU+cGxheWVkIHRoZWlyIHBhcnRzIHdpdGggQmVhdHJpY2U7IGFuZCB0aGVuIHRoZSB0d288L0xJTkU+Cis8TElORT5iZWFycyB3aWxsIG5vdCBiaXRlIG9uZSBhbm90aGVyIHdoZW4gdGhleSBtZWV0LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FbnRlciBET04gSk9ITjwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPk15IGxvcmQgYW5kIGJyb3RoZXIsIEdvZCBzYXZlIHlvdSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkdvb2QgZGVuLCBicm90aGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5JZiB5b3VyIGxlaXN1cmUgc2VydmVkLCBJIHdvdWxkIHNwZWFrIHdpdGggeW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SW4gcHJpdmF0ZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SWYgaXQgcGxlYXNlIHlvdTogeWV0IENvdW50IENsYXVkaW8gbWF5IGhlYXI7IGZvcjwvTElORT4KKzxMSU5FPndoYXQgSSB3b3VsZCBzcGVhayBvZiBjb25jZXJucyBoaW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaGF0J3MgdGhlIG1hdHRlcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+PFNUQUdFRElSPlRvIENMQVVESU88L1NUQUdFRElSPiAgTWVhbnMgeW91ciBsb3Jkc2hpcCB0byBiZSBtYXJyaWVkPC9MSU5FPgorPExJTkU+dG8tbW9ycm93PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+WW91IGtub3cgaGUgZG9lcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SSBrbm93IG5vdCB0aGF0LCB3aGVuIGhlIGtub3dzIHdoYXQgSSBrbm93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklmIHRoZXJlIGJlIGFueSBpbXBlZGltZW50LCBJIHByYXkgeW91IGRpc2NvdmVyIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5Zb3UgbWF5IHRoaW5rIEkgbG92ZSB5b3Ugbm90OiBsZXQgdGhhdCBhcHBlYXI8L0xJTkU+Cis8TElORT5oZXJlYWZ0ZXIsIGFuZCBhaW0gYmV0dGVyIGF0IG1lIGJ5IHRoYXQgSSBub3cgd2lsbDwvTElORT4KKzxMSU5FPm1hbmlmZXN0LiBGb3IgbXkgYnJvdGhlciwgSSB0aGluayBoZSBob2xkcyB5b3U8L0xJTkU+Cis8TElORT53ZWxsLCBhbmQgaW4gZGVhcm5lc3Mgb2YgaGVhcnQgaGF0aCBob2xwIHRvIGVmZmVjdDwvTElORT4KKzxMSU5FPnlvdXIgZW5zdWluZyBtYXJyaWFnZTstLXN1cmVseSBzdWl0IGlsbCBzcGVudCBhbmQ8L0xJTkU+Cis8TElORT5sYWJvdXIgaWxsIGJlc3Rvd2VkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+V2h5LCB3aGF0J3MgdGhlIG1hdHRlcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SSBjYW1lIGhpdGhlciB0byB0ZWxsIHlvdTsgYW5kLCBjaXJjdW1zdGFuY2VzPC9MSU5FPgorPExJTkU+c2hvcnRlbmVkLCBmb3Igc2hlIGhhcyBiZWVuIHRvbyBsb25nIGEgdGFsa2luZyBvZiw8L0xJTkU+Cis8TElORT50aGUgbGFkeSBpcyBkaXNsb3lhbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5XaG8sIEhlcm8/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5FdmVuIHNoZTsgTGVvbmF0bydzIEhlcm8sIHlvdXIgSGVybywgZXZlcnkgbWFuJ3MgSGVybzo8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5EaXNsb3lhbD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+VGhlIHdvcmQgaXMgdG9vIGdvb2QgdG8gcGFpbnQgb3V0IGhlciB3aWNrZWRuZXNzOyBJPC9MSU5FPgorPExJTkU+Y291bGQgc2F5IHNoZSB3ZXJlIHdvcnNlOiB0aGluayB5b3Ugb2YgYSB3b3JzZTwvTElORT4KKzxMSU5FPnRpdGxlLCBhbmQgSSB3aWxsIGZpdCBoZXIgdG8gaXQuIFdvbmRlciBub3QgdGlsbDwvTElORT4KKzxMSU5FPmZ1cnRoZXIgd2FycmFudDogZ28gYnV0IHdpdGggbWUgdG8tbmlnaHQsIHlvdSBzaGFsbDwvTElORT4KKzxMSU5FPnNlZSBoZXIgY2hhbWJlci13aW5kb3cgZW50ZXJlZCwgZXZlbiB0aGUgbmlnaHQ8L0xJTkU+Cis8TElORT5iZWZvcmUgaGVyIHdlZGRpbmctZGF5OiBpZiB5b3UgbG92ZSBoZXIgdGhlbiw8L0xJTkU+Cis8TElORT50by1tb3Jyb3cgd2VkIGhlcjsgYnV0IGl0IHdvdWxkIGJldHRlciBmaXQgeW91ciBob25vdXI8L0xJTkU+Cis8TElORT50byBjaGFuZ2UgeW91ciBtaW5kLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk1heSB0aGlzIGJlIHNvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SSB3aWxsIG5vdCB0aGluayBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SWYgeW91IGRhcmUgbm90IHRydXN0IHRoYXQgeW91IHNlZSwgY29uZmVzcyBub3Q8L0xJTkU+Cis8TElORT50aGF0IHlvdSBrbm93OiBpZiB5b3Ugd2lsbCBmb2xsb3cgbWUsIEkgd2lsbCBzaG93PC9MSU5FPgorPExJTkU+eW91IGVub3VnaDsgYW5kIHdoZW4geW91IGhhdmUgc2VlbiBtb3JlIGFuZCBoZWFyZDwvTElORT4KKzxMSU5FPm1vcmUsIHByb2NlZWQgYWNjb3JkaW5nbHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SWYgSSBzZWUgYW55IHRoaW5nIHRvLW5pZ2h0IHdoeSBJIHNob3VsZCBub3QgbWFycnk8L0xJTkU+Cis8TElORT5oZXIgdG8tbW9ycm93IGluIHRoZSBjb25ncmVnYXRpb24sIHdoZXJlIEkgc2hvdWxkPC9MSU5FPgorPExJTkU+d2VkLCB0aGVyZSB3aWxsIEkgc2hhbWUgaGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QW5kLCBhcyBJIHdvb2VkIGZvciB0aGVlIHRvIG9idGFpbiBoZXIsIEkgd2lsbCBqb2luPC9MSU5FPgorPExJTkU+d2l0aCB0aGVlIHRvIGRpc2dyYWNlIGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+SSB3aWxsIGRpc3BhcmFnZSBoZXIgbm8gZmFydGhlciB0aWxsIHlvdSBhcmUgbXk8L0xJTkU+Cis8TElORT53aXRuZXNzZXM6IGJlYXIgaXQgY29sZGx5IGJ1dCB0aWxsIG1pZG5pZ2h0LCBhbmQ8L0xJTkU+Cis8TElORT5sZXQgdGhlIGlzc3VlIHNob3cgaXRzZWxmLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+TyBkYXkgdW50b3dhcmRseSB0dXJuZWQhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TyBtaXNjaGllZiBzdHJhbmdlbHkgdGh3YXJ0aW5nITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5PIHBsYWd1ZSByaWdodCB3ZWxsIHByZXZlbnRlZCEgc28gd2lsbCB5b3Ugc2F5IHdoZW48L0xJTkU+Cis8TElORT55b3UgaGF2ZSBzZWVuIHRoZSBzZXF1ZWwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIElJSS4gIEEgc3RyZWV0LjwvVElUTEU+Cis8U1RBR0VESVI+RW50ZXIgRE9HQkVSUlkgYW5kIFZFUkdFUyB3aXRoIHRoZSBXYXRjaDwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkFyZSB5b3UgZ29vZCBtZW4gYW5kIHRydWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5ZZWEsIG9yIGVsc2UgaXQgd2VyZSBwaXR5IGJ1dCB0aGV5IHNob3VsZCBzdWZmZXI8L0xJTkU+Cis8TElORT5zYWx2YXRpb24sIGJvZHkgYW5kIHNvdWwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPk5heSwgdGhhdCB3ZXJlIGEgcHVuaXNobWVudCB0b28gZ29vZCBmb3IgdGhlbSwgaWY8L0xJTkU+Cis8TElORT50aGV5IHNob3VsZCBoYXZlIGFueSBhbGxlZ2lhbmNlIGluIHRoZW0sIGJlaW5nPC9MSU5FPgorPExJTkU+Y2hvc2VuIGZvciB0aGUgcHJpbmNlJ3Mgd2F0Y2guPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5XZWxsLCBnaXZlIHRoZW0gdGhlaXIgY2hhcmdlLCBuZWlnaGJvdXIgRG9nYmVycnkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkZpcnN0LCB3aG8gdGhpbmsgeW91IHRoZSBtb3N0IGRlc2VydGxlc3MgbWFuIHRvIGJlPC9MSU5FPgorPExJTkU+Y29uc3RhYmxlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Rmlyc3QgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5IdWdoIE90ZWNha2UsIHNpciwgb3IgR2VvcmdlIFNlYWNvbGU7IGZvciB0aGV5IGNhbjwvTElORT4KKzxMSU5FPndyaXRlIGFuZCByZWFkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5Db21lIGhpdGhlciwgbmVpZ2hib3VyIFNlYWNvbGUuIEdvZCBoYXRoIGJsZXNzZWQ8L0xJTkU+Cis8TElORT55b3Ugd2l0aCBhIGdvb2QgbmFtZTogdG8gYmUgYSB3ZWxsLWZhdm91cmVkIG1hbiBpczwvTElORT4KKzxMSU5FPnRoZSBnaWZ0IG9mIGZvcnR1bmU7IGJ1dCB0byB3cml0ZSBhbmQgcmVhZCBjb21lcyBieSBuYXR1cmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZWNvbmQgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5Cb3RoIHdoaWNoLCBtYXN0ZXIgY29uc3RhYmxlLC0tPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPllvdSBoYXZlOiBJIGtuZXcgaXQgd291bGQgYmUgeW91ciBhbnN3ZXIuIFdlbGwsPC9MSU5FPgorPExJTkU+Zm9yIHlvdXIgZmF2b3VyLCBzaXIsIHdoeSwgZ2l2ZSBHb2QgdGhhbmtzLCBhbmQgbWFrZTwvTElORT4KKzxMSU5FPm5vIGJvYXN0IG9mIGl0OyBhbmQgZm9yIHlvdXIgd3JpdGluZyBhbmQgcmVhZGluZyw8L0xJTkU+Cis8TElORT5sZXQgdGhhdCBhcHBlYXIgd2hlbiB0aGVyZSBpcyBubyBuZWVkIG9mIHN1Y2g8L0xJTkU+Cis8TElORT52YW5pdHkuIFlvdSBhcmUgdGhvdWdodCBoZXJlIHRvIGJlIHRoZSBtb3N0PC9MSU5FPgorPExJTkU+c2Vuc2VsZXNzIGFuZCBmaXQgbWFuIGZvciB0aGUgY29uc3RhYmxlIG9mIHRoZTwvTElORT4KKzxMSU5FPndhdGNoOyB0aGVyZWZvcmUgYmVhciB5b3UgdGhlIGxhbnRlcm4uIFRoaXMgaXMgeW91cjwvTElORT4KKzxMSU5FPmNoYXJnZTogeW91IHNoYWxsIGNvbXByZWhlbmQgYWxsIHZhZ3JvbSBtZW47IHlvdSBhcmU8L0xJTkU+Cis8TElORT50byBiaWQgYW55IG1hbiBzdGFuZCwgaW4gdGhlIHByaW5jZSdzIG5hbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZWNvbmQgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5Ib3cgaWYgYScgd2lsbCBub3Qgc3RhbmQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPldoeSwgdGhlbiwgdGFrZSBubyBub3RlIG9mIGhpbSwgYnV0IGxldCBoaW0gZ287IGFuZDwvTElORT4KKzxMSU5FPnByZXNlbnRseSBjYWxsIHRoZSByZXN0IG9mIHRoZSB3YXRjaCB0b2dldGhlciBhbmQ8L0xJTkU+Cis8TElORT50aGFuayBHb2QgeW91IGFyZSByaWQgb2YgYSBrbmF2ZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPklmIGhlIHdpbGwgbm90IHN0YW5kIHdoZW4gaGUgaXMgYmlkZGVuLCBoZSBpcyBub25lPC9MSU5FPgorPExJTkU+b2YgdGhlIHByaW5jZSdzIHN1YmplY3RzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5UcnVlLCBhbmQgdGhleSBhcmUgdG8gbWVkZGxlIHdpdGggbm9uZSBidXQgdGhlPC9MSU5FPgorPExJTkU+cHJpbmNlJ3Mgc3ViamVjdHMuIFlvdSBzaGFsbCBhbHNvIG1ha2Ugbm8gbm9pc2UgaW48L0xJTkU+Cis8TElORT50aGUgc3RyZWV0czsgZm9yLCBmb3IgdGhlIHdhdGNoIHRvIGJhYmJsZSBhbmQgdG88L0xJTkU+Cis8TElORT50YWxrIGlzIG1vc3QgdG9sZXJhYmxlIGFuZCBub3QgdG8gYmUgZW5kdXJlZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+V2Ugd2lsbCByYXRoZXIgc2xlZXAgdGhhbiB0YWxrOiB3ZSBrbm93IHdoYXQ8L0xJTkU+Cis8TElORT5iZWxvbmdzIHRvIGEgd2F0Y2guPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPldoeSwgeW91IHNwZWFrIGxpa2UgYW4gYW5jaWVudCBhbmQgbW9zdCBxdWlldDwvTElORT4KKzxMSU5FPndhdGNobWFuOyBmb3IgSSBjYW5ub3Qgc2VlIGhvdyBzbGVlcGluZyBzaG91bGQ8L0xJTkU+Cis8TElORT5vZmZlbmQ6IG9ubHksIGhhdmUgYSBjYXJlIHRoYXQgeW91ciBiaWxscyBiZSBub3Q8L0xJTkU+Cis8TElORT5zdG9sZW4uIFdlbGwsIHlvdSBhcmUgdG8gY2FsbCBhdCBhbGwgdGhlPC9MSU5FPgorPExJTkU+YWxlLWhvdXNlcywgYW5kIGJpZCB0aG9zZSB0aGF0IGFyZSBkcnVuayBnZXQgdGhlbSB0byBiZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5XYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPkhvdyBpZiB0aGV5IHdpbGwgbm90PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5XaHksIHRoZW4sIGxldCB0aGVtIGFsb25lIHRpbGwgdGhleSBhcmUgc29iZXI6IGlmPC9MSU5FPgorPExJTkU+dGhleSBtYWtlIHlvdSBub3QgdGhlbiB0aGUgYmV0dGVyIGFuc3dlciwgeW91IG1heTwvTElORT4KKzxMSU5FPnNheSB0aGV5IGFyZSBub3QgdGhlIG1lbiB5b3UgdG9vayB0aGVtIGZvci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+V2VsbCwgc2lyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5JZiB5b3UgbWVldCBhIHRoaWVmLCB5b3UgbWF5IHN1c3BlY3QgaGltLCBieSB2aXJ0dWU8L0xJTkU+Cis8TElORT5vZiB5b3VyIG9mZmljZSwgdG8gYmUgbm8gdHJ1ZSBtYW47IGFuZCwgZm9yIHN1Y2g8L0xJTkU+Cis8TElORT5raW5kIG9mIG1lbiwgdGhlIGxlc3MgeW91IG1lZGRsZSBvciBtYWtlIHdpdGggdGhlbSw8L0xJTkU+Cis8TElORT53aHkgdGhlIG1vcmUgaXMgZm9yIHlvdXIgaG9uZXN0eS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+SWYgd2Uga25vdyBoaW0gdG8gYmUgYSB0aGllZiwgc2hhbGwgd2Ugbm90IGxheTwvTElORT4KKzxMSU5FPmhhbmRzIG9uIGhpbT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+VHJ1bHksIGJ5IHlvdXIgb2ZmaWNlLCB5b3UgbWF5OyBidXQgSSB0aGluayB0aGV5PC9MSU5FPgorPExJTkU+dGhhdCB0b3VjaCBwaXRjaCB3aWxsIGJlIGRlZmlsZWQ6IHRoZSBtb3N0IHBlYWNlYWJsZTwvTElORT4KKzxMSU5FPndheSBmb3IgeW91LCBpZiB5b3UgZG8gdGFrZSBhIHRoaWVmLCBpcyB0byBsZXQgaGltPC9MSU5FPgorPExJTkU+c2hvdyBoaW1zZWxmIHdoYXQgaGUgaXMgYW5kIHN0ZWFsIG91dCBvZiB5b3VyIGNvbXBhbnkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5Zb3UgaGF2ZSBiZWVuIGFsd2F5cyBjYWxsZWQgYSBtZXJjaWZ1bCBtYW4sIHBhcnRuZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPlRydWx5LCBJIHdvdWxkIG5vdCBoYW5nIGEgZG9nIGJ5IG15IHdpbGwsIG11Y2ggbW9yZTwvTElORT4KKzxMSU5FPmEgbWFuIHdobyBoYXRoIGFueSBob25lc3R5IGluIGhpbS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPklmIHlvdSBoZWFyIGEgY2hpbGQgY3J5IGluIHRoZSBuaWdodCwgeW91IG11c3QgY2FsbDwvTElORT4KKzxMSU5FPnRvIHRoZSBudXJzZSBhbmQgYmlkIGhlciBzdGlsbCBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+SG93IGlmIHRoZSBudXJzZSBiZSBhc2xlZXAgYW5kIHdpbGwgbm90IGhlYXIgdXM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPldoeSwgdGhlbiwgZGVwYXJ0IGluIHBlYWNlLCBhbmQgbGV0IHRoZSBjaGlsZCB3YWtlPC9MSU5FPgorPExJTkU+aGVyIHdpdGggY3J5aW5nOyBmb3IgdGhlIGV3ZSB0aGF0IHdpbGwgbm90IGhlYXIgaGVyPC9MSU5FPgorPExJTkU+bGFtYiB3aGVuIGl0IGJhZXMgd2lsbCBuZXZlciBhbnN3ZXIgYSBjYWxmIHdoZW4gaGUgYmxlYXRzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgorPExJTkU+J1RpcyB2ZXJ5IHRydWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPlRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgY2hhcmdlOi0teW91LCBjb25zdGFibGUsIGFyZTwvTElORT4KKzxMSU5FPnRvIHByZXNlbnQgdGhlIHByaW5jZSdzIG93biBwZXJzb246IGlmIHlvdSBtZWV0IHRoZTwvTElORT4KKzxMSU5FPnByaW5jZSBpbiB0aGUgbmlnaHQsIHlvdSBtYXkgc3RheSBoaW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5OYXksIGJ5J3Igb3VyIGxhZHksIHRoYXQgSSB0aGluayBhJyBjYW5ub3QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkZpdmUgc2hpbGxpbmdzIHRvIG9uZSBvbid0LCB3aXRoIGFueSBtYW4gdGhhdCBrbm93czwvTElORT4KKzxMSU5FPnRoZSBzdGF0dXRlcywgaGUgbWF5IHN0YXkgaGltOiBtYXJyeSwgbm90IHdpdGhvdXQ8L0xJTkU+Cis8TElORT50aGUgcHJpbmNlIGJlIHdpbGxpbmc7IGZvciwgaW5kZWVkLCB0aGUgd2F0Y2ggb3VnaHQ8L0xJTkU+Cis8TElORT50byBvZmZlbmQgbm8gbWFuOyBhbmQgaXQgaXMgYW4gb2ZmZW5jZSB0byBzdGF5IGE8L0xJTkU+Cis8TElORT5tYW4gYWdhaW5zdCBoaXMgd2lsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPkJ5J3IgbGFkeSwgSSB0aGluayBpdCBiZSBzby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+SGEsIGhhLCBoYSEgV2VsbCwgbWFzdGVycywgZ29vZCBuaWdodDogYW4gdGhlcmUgYmU8L0xJTkU+Cis8TElORT5hbnkgbWF0dGVyIG9mIHdlaWdodCBjaGFuY2VzLCBjYWxsIHVwIG1lOiBrZWVwIHlvdXI8L0xJTkU+Cis8TElORT5mZWxsb3dzJyBjb3Vuc2VscyBhbmQgeW91ciBvd247IGFuZCBnb29kIG5pZ2h0LjwvTElORT4KKzxMSU5FPkNvbWUsIG5laWdoYm91ci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPldhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+V2VsbCwgbWFzdGVycywgd2UgaGVhciBvdXIgY2hhcmdlOiBsZXQgdXMgZ28gc2l0IGhlcmU8L0xJTkU+Cis8TElORT51cG9uIHRoZSBjaHVyY2gtYmVuY2ggdGlsbCB0d28sIGFuZCB0aGVuIGFsbCB0byBiZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPk9uZSB3b3JkIG1vcmUsIGhvbmVzdCBuZWlnaGJvdXJzLiBJIHByYXkgeW91IHdhdGNoPC9MSU5FPgorPExJTkU+YWJvdXQgU2lnbmlvciBMZW9uYXRvJ3MgZG9vcjsgZm9yIHRoZSB3ZWRkaW5nIGJlaW5nPC9MSU5FPgorPExJTkU+dGhlcmUgdG8tbW9ycm93LCB0aGVyZSBpcyBhIGdyZWF0IGNvaWwgdG8tbmlnaHQuPC9MSU5FPgorPExJTkU+QWRpZXU6IGJlIHZpZ2l0YW50LCBJIGJlc2VlY2ggeW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1RBR0VESVI+RXhldW50IERPR0JFUlJZIGFuZCBWRVJHRVM8L1NUQUdFRElSPgorPFNUQUdFRElSPkVudGVyIEJPUkFDSElPIGFuZCBDT05SQURFPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBDb25yYWRlITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+V2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT48U1RBR0VESVI+QXNpZGU8L1NUQUdFRElSPiAgUGVhY2UhIHN0aXIgbm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5Db25yYWRlLCBJIHNheSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5IZXJlLCBtYW47IEkgYW0gYXQgdGh5IGVsYm93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5NYXNzLCBhbmQgbXkgZWxib3cgaXRjaGVkOyBJIHRob3VnaHQgdGhlcmUgd291bGQgYTwvTElORT4KKzxMSU5FPnNjYWIgZm9sbG93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KKzxMSU5FPkkgd2lsbCBvd2UgdGhlZSBhbiBhbnN3ZXIgZm9yIHRoYXQ6IGFuZCBub3cgZm9yd2FyZDwvTElORT4KKzxMSU5FPndpdGggdGh5IHRhbGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPlN0YW5kIHRoZWUgY2xvc2UsIHRoZW4sIHVuZGVyIHRoaXMgcGVudC1ob3VzZSwgZm9yPC9MSU5FPgorPExJTkU+aXQgZHJpenpsZXMgcmFpbjsgYW5kIEkgd2lsbCwgbGlrZSBhIHRydWUgZHJ1bmthcmQsPC9MSU5FPgorPExJTkU+dXR0ZXIgYWxsIHRvIHRoZWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5XYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPjxTVEFHRURJUj5Bc2lkZTwvU1RBR0VESVI+ICBTb21lIHRyZWFzb24sIG1hc3RlcnM6IHlldCBzdGFuZCBjbG9zZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+VGhlcmVmb3JlIGtub3cgSSBoYXZlIGVhcm5lZCBvZiBEb24gSm9obiBhIHRob3VzYW5kIGR1Y2F0cy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5JcyBpdCBwb3NzaWJsZSB0aGF0IGFueSB2aWxsYW55IHNob3VsZCBiZSBzbyBkZWFyPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5UaG91IHNob3VsZHN0IHJhdGhlciBhc2sgaWYgaXQgd2VyZSBwb3NzaWJsZSBhbnk8L0xJTkU+Cis8TElORT52aWxsYW55IHNob3VsZCBiZSBzbyByaWNoOyBmb3Igd2hlbiByaWNoIHZpbGxhaW5zPC9MSU5FPgorPExJTkU+aGF2ZSBuZWVkIG9mIHBvb3Igb25lcywgcG9vciBvbmVzIG1heSBtYWtlIHdoYXQ8L0xJTkU+Cis8TElORT5wcmljZSB0aGV5IHdpbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+SSB3b25kZXIgYXQgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPlRoYXQgc2hvd3MgdGhvdSBhcnQgdW5jb25maXJtZWQuIFRob3Uga25vd2VzdCB0aGF0PC9MSU5FPgorPExJTkU+dGhlIGZhc2hpb24gb2YgYSBkb3VibGV0LCBvciBhIGhhdCwgb3IgYSBjbG9haywgaXM8L0xJTkU+Cis8TElORT5ub3RoaW5nIHRvIGEgbWFuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KKzxMSU5FPlllcywgaXQgaXMgYXBwYXJlbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+SSBtZWFuLCB0aGUgZmFzaGlvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5ZZXMsIHRoZSBmYXNoaW9uIGlzIHRoZSBmYXNoaW9uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5UdXNoISBJIG1heSBhcyB3ZWxsIHNheSB0aGUgZm9vbCdzIHRoZSBmb29sLiBCdXQ8L0xJTkU+Cis8TElORT5zZWVzdCB0aG91IG5vdCB3aGF0IGEgZGVmb3JtZWQgdGhpZWYgdGhpcyBmYXNoaW9uPC9MSU5FPgorPExJTkU+aXM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5XYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPjxTVEFHRURJUj5Bc2lkZTwvU1RBR0VESVI+ICBJIGtub3cgdGhhdCBEZWZvcm1lZDsgYScgaGFzIGJlZW4gYSB2aWxlPC9MSU5FPgorPExJTkU+dGhpZWYgdGhpcyBzZXZlbiB5ZWFyOyBhJyBnb2VzIHVwIGFuZCBkb3duIGxpa2UgYTwvTElORT4KKzxMSU5FPmdlbnRsZW1hbjogSSByZW1lbWJlciBoaXMgbmFtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+RGlkc3QgdGhvdSBub3QgaGVhciBzb21lYm9keT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5ObzsgJ3R3YXMgdGhlIHZhbmUgb24gdGhlIGhvdXNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5TZWVzdCB0aG91IG5vdCwgSSBzYXksIHdoYXQgYSBkZWZvcm1lZCB0aGllZiB0aGlzPC9MSU5FPgorPExJTkU+ZmFzaGlvbiBpcz8gaG93IGdpZGRpbHkgYScgdHVybnMgYWJvdXQgYWxsIHRoZSBob3Q8L0xJTkU+Cis8TElORT5ibG9vZHMgYmV0d2VlbiBmb3VydGVlbiBhbmQgZml2ZS1hbmQtdGhpcnR5PzwvTElORT4KKzxMSU5FPnNvbWV0aW1lcyBmYXNoaW9uaW5nIHRoZW0gbGlrZSBQaGFyYW9oJ3Mgc29sZGllcnM8L0xJTkU+Cis8TElORT5pbiB0aGUgcmVla3kgcGFpbnRpbmcsIHNvbWV0aW1lIGxpa2UgZ29kIEJlbCdzPC9MSU5FPgorPExJTkU+cHJpZXN0cyBpbiB0aGUgb2xkIGNodXJjaC13aW5kb3csIHNvbWV0aW1lIGxpa2UgdGhlPC9MSU5FPgorPExJTkU+c2hhdmVuIEhlcmN1bGVzIGluIHRoZSBzbWlyY2hlZCB3b3JtLWVhdGVuIHRhcGVzdHJ5LDwvTElORT4KKzxMSU5FPndoZXJlIGhpcyBjb2RwaWVjZSBzZWVtcyBhcyBtYXNzeSBhcyBoaXMgY2x1Yj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5BbGwgdGhpcyBJIHNlZTsgYW5kIEkgc2VlIHRoYXQgdGhlIGZhc2hpb24gd2VhcnM8L0xJTkU+Cis8TElORT5vdXQgbW9yZSBhcHBhcmVsIHRoYW4gdGhlIG1hbi4gQnV0IGFydCBub3QgdGhvdTwvTElORT4KKzxMSU5FPnRoeXNlbGYgZ2lkZHkgd2l0aCB0aGUgZmFzaGlvbiB0b28sIHRoYXQgdGhvdSBoYXN0PC9MSU5FPgorPExJTkU+c2hpZnRlZCBvdXQgb2YgdGh5IHRhbGUgaW50byB0ZWxsaW5nIG1lIG9mIHRoZSBmYXNoaW9uPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5Ob3Qgc28sIG5laXRoZXI6IGJ1dCBrbm93IHRoYXQgSSBoYXZlIHRvLW5pZ2h0PC9MSU5FPgorPExJTkU+d29vZWQgTWFyZ2FyZXQsIHRoZSBMYWR5IEhlcm8ncyBnZW50bGV3b21hbiwgYnkgdGhlPC9MSU5FPgorPExJTkU+bmFtZSBvZiBIZXJvOiBzaGUgbGVhbnMgbWUgb3V0IGF0IGhlciBtaXN0cmVzcyc8L0xJTkU+Cis8TElORT5jaGFtYmVyLXdpbmRvdywgYmlkcyBtZSBhIHRob3VzYW5kIHRpbWVzIGdvb2Q8L0xJTkU+Cis8TElORT5uaWdodCwtLUkgdGVsbCB0aGlzIHRhbGUgdmlsZWx5Oi0tSSBzaG91bGQgZmlyc3Q8L0xJTkU+Cis8TElORT50ZWxsIHRoZWUgaG93IHRoZSBwcmluY2UsIENsYXVkaW8gYW5kIG15IG1hc3Rlciw8L0xJTkU+Cis8TElORT5wbGFudGVkIGFuZCBwbGFjZWQgYW5kIHBvc3Nlc3NlZCBieSBteSBtYXN0ZXIgRG9uPC9MSU5FPgorPExJTkU+Sm9obiwgc2F3IGFmYXIgb2ZmIGluIHRoZSBvcmNoYXJkIHRoaXMgYW1pYWJsZSBlbmNvdW50ZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+QW5kIHRob3VnaHQgdGhleSBNYXJnYXJldCB3YXMgSGVybz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+VHdvIG9mIHRoZW0gZGlkLCB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvOyBidXQgdGhlPC9MSU5FPgorPExJTkU+ZGV2aWwgbXkgbWFzdGVyIGtuZXcgc2hlIHdhcyBNYXJnYXJldDsgYW5kIHBhcnRseTwvTElORT4KKzxMSU5FPmJ5IGhpcyBvYXRocywgd2hpY2ggZmlyc3QgcG9zc2Vzc2VkIHRoZW0sIHBhcnRseSBieTwvTElORT4KKzxMSU5FPnRoZSBkYXJrIG5pZ2h0LCB3aGljaCBkaWQgZGVjZWl2ZSB0aGVtLCBidXQgY2hpZWZseTwvTElORT4KKzxMSU5FPmJ5IG15IHZpbGxhbnksIHdoaWNoIGRpZCBjb25maXJtIGFueSBzbGFuZGVyIHRoYXQ8L0xJTkU+Cis8TElORT5Eb24gSm9obiBoYWQgbWFkZSwgYXdheSB3ZW50IENsYXVkaW8gZW5yYWdlZDsgc3dvcmU8L0xJTkU+Cis8TElORT5oZSB3b3VsZCBtZWV0IGhlciwgYXMgaGUgd2FzIGFwcG9pbnRlZCwgbmV4dCBtb3JuaW5nPC9MSU5FPgorPExJTkU+YXQgdGhlIHRlbXBsZSwgYW5kIHRoZXJlLCBiZWZvcmUgdGhlIHdob2xlPC9MSU5FPgorPExJTkU+Y29uZ3JlZ2F0aW9uLCBzaGFtZSBoZXIgd2l0aCB3aGF0IGhlIHNhdyBvJ2VyIG5pZ2h0PC9MSU5FPgorPExJTkU+YW5kIHNlbmQgaGVyIGhvbWUgYWdhaW4gd2l0aG91dCBhIGh1c2JhbmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GaXJzdCBXYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPldlIGNoYXJnZSB5b3UsIGluIHRoZSBwcmluY2UncyBuYW1lLCBzdGFuZCE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlNlY29uZCBXYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPkNhbGwgdXAgdGhlIHJpZ2h0IG1hc3RlciBjb25zdGFibGUuIFdlIGhhdmUgaGVyZTwvTElORT4KKzxMSU5FPnJlY292ZXJlZCB0aGUgbW9zdCBkYW5nZXJvdXMgcGllY2Ugb2YgbGVjaGVyeSB0aGF0PC9MSU5FPgorPExJTkU+ZXZlciB3YXMga25vd24gaW4gdGhlIGNvbW1vbndlYWx0aC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZpcnN0IFdhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+QW5kIG9uZSBEZWZvcm1lZCBpcyBvbmUgb2YgdGhlbTogSSBrbm93IGhpbTsgYSc8L0xJTkU+Cis8TElORT53ZWFycyBhIGxvY2suPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+TWFzdGVycywgbWFzdGVycywtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+U2Vjb25kIFdhdGNobWFuPC9TUEVBS0VSPgorPExJTkU+WW91J2xsIGJlIG1hZGUgYnJpbmcgRGVmb3JtZWQgZm9ydGgsIEkgd2FycmFudCB5b3UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+TWFzdGVycywtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Rmlyc3QgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5OZXZlciBzcGVhazogd2UgY2hhcmdlIHlvdSBsZXQgdXMgb2JleSB5b3UgdG8gZ28gd2l0aCB1cy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+V2UgYXJlIGxpa2UgdG8gcHJvdmUgYSBnb29kbHkgY29tbW9kaXR5LCBiZWluZyB0YWtlbjwvTElORT4KKzxMSU5FPnVwIG9mIHRoZXNlIG1lbidzIGJpbGxzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KKzxMSU5FPkEgY29tbW9kaXR5IGluIHF1ZXN0aW9uLCBJIHdhcnJhbnQgeW91LiBDb21lLCB3ZSdsbCBvYmV5IHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSVYuICBIRVJPJ3MgYXBhcnRtZW50LjwvVElUTEU+Cis8U1RBR0VESVI+RW50ZXIgSEVSTywgTUFSR0FSRVQsIGFuZCBVUlNVTEE8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkdvb2QgVXJzdWxhLCB3YWtlIG15IGNvdXNpbiBCZWF0cmljZSwgYW5kIGRlc2lyZTwvTElORT4KKzxMSU5FPmhlciB0byByaXNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+SSB3aWxsLCBsYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBiaWQgaGVyIGNvbWUgaGl0aGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+V2VsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhpdDwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPlRyb3RoLCBJIHRoaW5rIHlvdXIgb3RoZXIgcmFiYXRvIHdlcmUgYmV0dGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPk5vLCBwcmF5IHRoZWUsIGdvb2QgTWVnLCBJJ2xsIHdlYXIgdGhpcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+QnkgbXkgdHJvdGgsICdzIG5vdCBzbyBnb29kOyBhbmQgSSB3YXJyYW50IHlvdXI8L0xJTkU+Cis8TElORT5jb3VzaW4gd2lsbCBzYXkgc28uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+TXkgY291c2luJ3MgYSBmb29sLCBhbmQgdGhvdSBhcnQgYW5vdGhlcjogSSdsbCB3ZWFyPC9MSU5FPgorPExJTkU+bm9uZSBidXQgdGhpcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+SSBsaWtlIHRoZSBuZXcgdGlyZSB3aXRoaW4gZXhjZWxsZW50bHksIGlmIHRoZSBoYWlyPC9MSU5FPgorPExJTkU+d2VyZSBhIHRob3VnaHQgYnJvd25lcjsgYW5kIHlvdXIgZ293bidzIGEgbW9zdCByYXJlPC9MSU5FPgorPExJTkU+ZmFzaGlvbiwgaScgZmFpdGguIEkgc2F3IHRoZSBEdWNoZXNzIG9mIE1pbGFuJ3M8L0xJTkU+Cis8TElORT5nb3duIHRoYXQgdGhleSBwcmFpc2Ugc28uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+TywgdGhhdCBleGNlZWRzLCB0aGV5IHNheS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+QnkgbXkgdHJvdGgsICdzIGJ1dCBhIG5pZ2h0LWdvd24gaW4gcmVzcGVjdCBvZjwvTElORT4KKzxMSU5FPnlvdXJzOiBjbG90aCBvJyBnb2xkLCBhbmQgY3V0cywgYW5kIGxhY2VkIHdpdGg8L0xJTkU+Cis8TElORT5zaWx2ZXIsIHNldCB3aXRoIHBlYXJscywgZG93biBzbGVldmVzLCBzaWRlIHNsZWV2ZXMsPC9MSU5FPgorPExJTkU+YW5kIHNraXJ0cywgcm91bmQgdW5kZXJib3JuZSB3aXRoIGEgYmx1aXNoIHRpbnNlbDo8L0xJTkU+Cis8TElORT5idXQgZm9yIGEgZmluZSwgcXVhaW50LCBncmFjZWZ1bCBhbmQgZXhjZWxsZW50PC9MSU5FPgorPExJTkU+ZmFzaGlvbiwgeW91cnMgaXMgd29ydGggdGVuIG9uICd0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkdvZCBnaXZlIG1lIGpveSB0byB3ZWFyIGl0ISBmb3IgbXkgaGVhcnQgaXM8L0xJTkU+Cis8TElORT5leGNlZWRpbmcgaGVhdnkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPidUd2lsbCBiZSBoZWF2aWVyIHNvb24gYnkgdGhlIHdlaWdodCBvZiBhIG1hbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5GaWUgdXBvbiB0aGVlISBhcnQgbm90IGFzaGFtZWQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPk9mIHdoYXQsIGxhZHk/IG9mIHNwZWFraW5nIGhvbm91cmFibHk/IElzIG5vdDwvTElORT4KKzxMSU5FPm1hcnJpYWdlIGhvbm91cmFibGUgaW4gYSBiZWdnYXI/IElzIG5vdCB5b3VyIGxvcmQ8L0xJTkU+Cis8TElORT5ob25vdXJhYmxlIHdpdGhvdXQgbWFycmlhZ2U/IEkgdGhpbmsgeW91IHdvdWxkIGhhdmU8L0xJTkU+Cis8TElORT5tZSBzYXksICdzYXZpbmcgeW91ciByZXZlcmVuY2UsIGEgaHVzYmFuZDonIGFuZCBiYWQ8L0xJTkU+Cis8TElORT50aGlua2luZyBkbyBub3Qgd3Jlc3QgdHJ1ZSBzcGVha2luZywgSSdsbCBvZmZlbmQ8L0xJTkU+Cis8TElORT5ub2JvZHk6IGlzIHRoZXJlIGFueSBoYXJtIGluICd0aGUgaGVhdmllciBmb3IgYTwvTElORT4KKzxMSU5FPmh1c2JhbmQnPyBOb25lLCBJIHRoaW5rLCBhbmQgaXQgYmUgdGhlIHJpZ2h0IGh1c2JhbmQ8L0xJTkU+Cis8TElORT5hbmQgdGhlIHJpZ2h0IHdpZmU7IG90aGVyd2lzZSAndGlzIGxpZ2h0LCBhbmQgbm90PC9MSU5FPgorPExJTkU+aGVhdnk6IGFzayBteSBMYWR5IEJlYXRyaWNlIGVsc2U7IGhlcmUgc2hlIGNvbWVzLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FbnRlciBCRUFUUklDRTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+R29vZCBtb3Jyb3csIGNvei48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+R29vZCBtb3Jyb3csIHN3ZWV0IEhlcm8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+V2h5IGhvdyBub3c/IGRvIHlvdSBzcGVhayBpbiB0aGUgc2ljayB0dW5lPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JIGFtIG91dCBvZiBhbGwgb3RoZXIgdHVuZSwgbWV0aGlua3MuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPkNsYXAncyBpbnRvICdMaWdodCBvJyBsb3ZlOycgdGhhdCBnb2VzIHdpdGhvdXQgYTwvTElORT4KKzxMSU5FPmJ1cmRlbjogZG8geW91IHNpbmcgaXQsIGFuZCBJJ2xsIGRhbmNlIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5ZZSBsaWdodCBvJyBsb3ZlLCB3aXRoIHlvdXIgaGVlbHMhIHRoZW4sIGlmIHlvdXI8L0xJTkU+Cis8TElORT5odXNiYW5kIGhhdmUgc3RhYmxlcyBlbm91Z2gsIHlvdSdsbCBzZWUgaGUgc2hhbGw8L0xJTkU+Cis8TElORT5sYWNrIG5vIGJhcm5zLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5PIGlsbGVnaXRpbWF0ZSBjb25zdHJ1Y3Rpb24hIEkgc2Nvcm4gdGhhdCB3aXRoIG15IGhlZWxzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT4nVGlzIGFsbW9zdCBmaXZlIG8nY2xvY2ssIGNvdXNpbjsgdGlzIHRpbWUgeW91IHdlcmU8L0xJTkU+Cis8TElORT5yZWFkeS4gQnkgbXkgdHJvdGgsIEkgYW0gZXhjZWVkaW5nIGlsbDogaGVpZ2gtaG8hPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPkZvciBhIGhhd2ssIGEgaG9yc2UsIG9yIGEgaHVzYmFuZD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+Rm9yIHRoZSBsZXR0ZXIgdGhhdCBiZWdpbnMgdGhlbSBhbGwsIEguPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPldlbGwsIGFuZCB5b3UgYmUgbm90IHR1cm5lZCBUdXJrLCB0aGVyZSdzIG5vIG1vcmU8L0xJTkU+Cis8TElORT5zYWlsaW5nIGJ5IHRoZSBzdGFyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5XaGF0IG1lYW5zIHRoZSBmb29sLCB0cm93PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5Ob3RoaW5nIEk7IGJ1dCBHb2Qgc2VuZCBldmVyeSBvbmUgdGhlaXIgaGVhcnQncyBkZXNpcmUhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+VGhlc2UgZ2xvdmVzIHRoZSBjb3VudCBzZW50IG1lOyB0aGV5IGFyZSBhbjwvTElORT4KKzxMSU5FPmV4Y2VsbGVudCBwZXJmdW1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JIGFtIHN0dWZmZWQsIGNvdXNpbjsgSSBjYW5ub3Qgc21lbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NQVJHQVJFVDwvU1BFQUtFUj4KKzxMSU5FPkEgbWFpZCwgYW5kIHN0dWZmZWQhIHRoZXJlJ3MgZ29vZGx5IGNhdGNoaW5nIG9mIGNvbGQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk8sIEdvZCBoZWxwIG1lISBHb2QgaGVscCBtZSEgaG93IGxvbmcgaGF2ZSB5b3U8L0xJTkU+Cis8TElORT5wcm9mZXNzZWQgYXBwcmVoZW5zaW9uPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5FdmVuIHNpbmNlIHlvdSBsZWZ0IGl0LiBEb3RoIG5vdCBteSB3aXQgYmVjb21lIG1lIHJhcmVseT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SXQgaXMgbm90IHNlZW4gZW5vdWdoLCB5b3Ugc2hvdWxkIHdlYXIgaXQgaW4geW91cjwvTElORT4KKzxMSU5FPmNhcC4gQnkgbXkgdHJvdGgsIEkgYW0gc2ljay48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+R2V0IHlvdSBzb21lIG9mIHRoaXMgZGlzdGlsbGVkIENhcmR1dXMgQmVuZWRpY3R1cyw8L0xJTkU+Cis8TElORT5hbmQgbGF5IGl0IHRvIHlvdXIgaGVhcnQ6IGl0IGlzIHRoZSBvbmx5IHRoaW5nIGZvciBhIHF1YWxtLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPlRoZXJlIHRob3UgcHJpY2tlc3QgaGVyIHdpdGggYSB0aGlzdGxlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5CZW5lZGljdHVzISB3aHkgQmVuZWRpY3R1cz8geW91IGhhdmUgc29tZSBtb3JhbCBpbjwvTElORT4KKzxMSU5FPnRoaXMgQmVuZWRpY3R1cy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+TW9yYWwhIG5vLCBieSBteSB0cm90aCwgSSBoYXZlIG5vIG1vcmFsIG1lYW5pbmc7IEk8L0xJTkU+Cis8TElORT5tZWFudCwgcGxhaW4gaG9seS10aGlzdGxlLiBZb3UgbWF5IHRoaW5rIHBlcmNoYW5jZTwvTElORT4KKzxMSU5FPnRoYXQgSSB0aGluayB5b3UgYXJlIGluIGxvdmU6IG5heSwgYnknciBsYWR5LCBJIGFtPC9MSU5FPgorPExJTkU+bm90IHN1Y2ggYSBmb29sIHRvIHRoaW5rIHdoYXQgSSBsaXN0LCBub3IgSSBsaXN0PC9MSU5FPgorPExJTkU+bm90IHRvIHRoaW5rIHdoYXQgSSBjYW4sIG5vciBpbmRlZWQgSSBjYW5ub3QgdGhpbmssPC9MSU5FPgorPExJTkU+aWYgSSB3b3VsZCB0aGluayBteSBoZWFydCBvdXQgb2YgdGhpbmtpbmcsIHRoYXQgeW91PC9MSU5FPgorPExJTkU+YXJlIGluIGxvdmUgb3IgdGhhdCB5b3Ugd2lsbCBiZSBpbiBsb3ZlIG9yIHRoYXQgeW91PC9MSU5FPgorPExJTkU+Y2FuIGJlIGluIGxvdmUuIFlldCBCZW5lZGljayB3YXMgc3VjaCBhbm90aGVyLCBhbmQ8L0xJTkU+Cis8TElORT5ub3cgaXMgaGUgYmVjb21lIGEgbWFuOiBoZSBzd29yZSBoZSB3b3VsZCBuZXZlcjwvTElORT4KKzxMSU5FPm1hcnJ5LCBhbmQgeWV0IG5vdywgaW4gZGVzcGl0ZSBvZiBoaXMgaGVhcnQsIGhlIGVhdHM8L0xJTkU+Cis8TElORT5oaXMgbWVhdCB3aXRob3V0IGdydWRnaW5nOiBhbmQgaG93IHlvdSBtYXkgYmU8L0xJTkU+Cis8TElORT5jb252ZXJ0ZWQgSSBrbm93IG5vdCwgYnV0IG1ldGhpbmtzIHlvdSBsb29rIHdpdGg8L0xJTkU+Cis8TElORT55b3VyIGV5ZXMgYXMgb3RoZXIgd29tZW4gZG8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPldoYXQgcGFjZSBpcyB0aGlzIHRoYXQgdGh5IHRvbmd1ZSBrZWVwcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+Tm90IGEgZmFsc2UgZ2FsbG9wLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5SZS1lbnRlciBVUlNVTEE8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VVJTVUxBPC9TUEVBS0VSPgorPExJTkU+TWFkYW0sIHdpdGhkcmF3OiB0aGUgcHJpbmNlLCB0aGUgY291bnQsIFNpZ25pb3I8L0xJTkU+Cis8TElORT5CZW5lZGljaywgRG9uIEpvaG4sIGFuZCBhbGwgdGhlIGdhbGxhbnRzIG9mIHRoZTwvTElORT4KKzxMSU5FPnRvd24sIGFyZSBjb21lIHRvIGZldGNoIHlvdSB0byBjaHVyY2guPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+SGVscCB0byBkcmVzcyBtZSwgZ29vZCBjb3osIGdvb2QgTWVnLCBnb29kIFVyc3VsYS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgVi4gIEFub3RoZXIgcm9vbSBpbiBMRU9OQVRPJ1MgaG91c2UuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBMRU9OQVRPLCB3aXRoIERPR0JFUlJZIGFuZCBWRVJHRVM8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPldoYXQgd291bGQgeW91IHdpdGggbWUsIGhvbmVzdCBuZWlnaGJvdXI/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPk1hcnJ5LCBzaXIsIEkgd291bGQgaGF2ZSBzb21lIGNvbmZpZGVuY2Ugd2l0aCB5b3U8L0xJTkU+Cis8TElORT50aGF0IGRlY2VybnMgeW91IG5lYXJseS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5CcmllZiwgSSBwcmF5IHlvdTsgZm9yIHlvdSBzZWUgaXQgaXMgYSBidXN5IHRpbWUgd2l0aCBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+TWFycnksIHRoaXMgaXQgaXMsIHNpci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPlllcywgaW4gdHJ1dGggaXQgaXMsIHNpci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5XaGF0IGlzIGl0LCBteSBnb29kIGZyaWVuZHM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkdvb2RtYW4gVmVyZ2VzLCBzaXIsIHNwZWFrcyBhIGxpdHRsZSBvZmYgdGhlPC9MSU5FPgorPExJTkU+bWF0dGVyOiBhbiBvbGQgbWFuLCBzaXIsIGFuZCBoaXMgd2l0cyBhcmUgbm90IHNvPC9MSU5FPgorPExJTkU+Ymx1bnQgYXMsIEdvZCBoZWxwLCBJIHdvdWxkIGRlc2lyZSB0aGV5IHdlcmU7IGJ1dCw8L0xJTkU+Cis8TElORT5pbiBmYWl0aCwgaG9uZXN0IGFzIHRoZSBza2luIGJldHdlZW4gaGlzIGJyb3dzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgorPExJTkU+WWVzLCBJIHRoYW5rIEdvZCBJIGFtIGFzIGhvbmVzdCBhcyBhbnkgbWFuIGxpdmluZzwvTElORT4KKzxMSU5FPnRoYXQgaXMgYW4gb2xkIG1hbiBhbmQgbm8gaG9uZXN0ZXIgdGhhbiBJLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5Db21wYXJpc29ucyBhcmUgb2Rvcm91czogcGFsYWJyYXMsIG5laWdoYm91ciBWZXJnZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+TmVpZ2hib3VycywgeW91IGFyZSB0ZWRpb3VzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5JdCBwbGVhc2VzIHlvdXIgd29yc2hpcCB0byBzYXkgc28sIGJ1dCB3ZSBhcmUgdGhlPC9MSU5FPgorPExJTkU+cG9vciBkdWtlJ3Mgb2ZmaWNlcnM7IGJ1dCB0cnVseSwgZm9yIG1pbmUgb3duIHBhcnQsPC9MSU5FPgorPExJTkU+aWYgSSB3ZXJlIGFzIHRlZGlvdXMgYXMgYSBraW5nLCBJIGNvdWxkIGZpbmQgaXQgaW48L0xJTkU+Cis8TElORT5teSBoZWFydCB0byBiZXN0b3cgaXQgYWxsIG9mIHlvdXIgd29yc2hpcC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5BbGwgdGh5IHRlZGlvdXNuZXNzIG9uIG1lLCBhaD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+WWVhLCBhbiAndHdlcmUgYSB0aG91c2FuZCBwb3VuZCBtb3JlIHRoYW4gJ3RpczsgZm9yPC9MSU5FPgorPExJTkU+SSBoZWFyIGFzIGdvb2QgZXhjbGFtYXRpb24gb24geW91ciB3b3JzaGlwIGFzIG9mIGFueTwvTElORT4KKzxMSU5FPm1hbiBpbiB0aGUgY2l0eTsgYW5kIHRob3VnaCBJIGJlIGJ1dCBhIHBvb3IgbWFuLCBJPC9MSU5FPgorPExJTkU+YW0gZ2xhZCB0byBoZWFyIGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgorPExJTkU+QW5kIHNvIGFtIEkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+SSB3b3VsZCBmYWluIGtub3cgd2hhdCB5b3UgaGF2ZSB0byBzYXkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5NYXJyeSwgc2lyLCBvdXIgd2F0Y2ggdG8tbmlnaHQsIGV4Y2VwdGluZyB5b3VyPC9MSU5FPgorPExJTkU+d29yc2hpcCdzIHByZXNlbmNlLCBoYScgdGEnZW4gYSBjb3VwbGUgb2YgYXMgYXJyYW50PC9MSU5FPgorPExJTkU+a25hdmVzIGFzIGFueSBpbiBNZXNzaW5hLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5BIGdvb2Qgb2xkIG1hbiwgc2lyOyBoZSB3aWxsIGJlIHRhbGtpbmc6IGFzIHRoZXk8L0xJTkU+Cis8TElORT5zYXksIHdoZW4gdGhlIGFnZSBpcyBpbiwgdGhlIHdpdCBpcyBvdXQ6IEdvZCBoZWxwPC9MSU5FPgorPExJTkU+dXMhIGl0IGlzIGEgd29ybGQgdG8gc2VlLiBXZWxsIHNhaWQsIGknIGZhaXRoLDwvTElORT4KKzxMSU5FPm5laWdoYm91ciBWZXJnZXM6IHdlbGwsIEdvZCdzIGEgZ29vZCBtYW47IGFuIHR3byBtZW48L0xJTkU+Cis8TElORT5yaWRlIG9mIGEgaG9yc2UsIG9uZSBtdXN0IHJpZGUgYmVoaW5kLiBBbiBob25lc3Q8L0xJTkU+Cis8TElORT5zb3VsLCBpJyBmYWl0aCwgc2lyOyBieSBteSB0cm90aCBoZSBpcywgYXMgZXZlcjwvTElORT4KKzxMSU5FPmJyb2tlIGJyZWFkOyBidXQgR29kIGlzIHRvIGJlIHdvcnNoaXBwZWQ7IGFsbCBtZW48L0xJTkU+Cis8TElORT5hcmUgbm90IGFsaWtlOyBhbGFzLCBnb29kIG5laWdoYm91ciE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JbmRlZWQsIG5laWdoYm91ciwgaGUgY29tZXMgdG9vIHNob3J0IG9mIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+R2lmdHMgdGhhdCBHb2QgZ2l2ZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+SSBtdXN0IGxlYXZlIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+T25lIHdvcmQsIHNpcjogb3VyIHdhdGNoLCBzaXIsIGhhdmUgaW5kZWVkPC9MSU5FPgorPExJTkU+Y29tcHJlaGVuZGVkIHR3byBhc3BpY2lvdXMgcGVyc29ucywgYW5kIHdlIHdvdWxkPC9MSU5FPgorPExJTkU+aGF2ZSB0aGVtIHRoaXMgbW9ybmluZyBleGFtaW5lZCBiZWZvcmUgeW91ciB3b3JzaGlwLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlRha2UgdGhlaXIgZXhhbWluYXRpb24geW91cnNlbGYgYW5kIGJyaW5nIGl0IG1lOiBJPC9MSU5FPgorPExJTkU+YW0gbm93IGluIGdyZWF0IGhhc3RlLCBhcyBpdCBtYXkgYXBwZWFyIHVudG8geW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5JdCBzaGFsbCBiZSBzdWZmaWdhbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkRyaW5rIHNvbWUgd2luZSBlcmUgeW91IGdvOiBmYXJlIHlvdSB3ZWxsLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FbnRlciBhIE1lc3NlbmdlcjwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5NZXNzZW5nZXI8L1NQRUFLRVI+Cis8TElORT5NeSBsb3JkLCB0aGV5IHN0YXkgZm9yIHlvdSB0byBnaXZlIHlvdXIgZGF1Z2h0ZXIgdG88L0xJTkU+Cis8TElORT5oZXIgaHVzYmFuZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JJ2xsIHdhaXQgdXBvbiB0aGVtOiBJIGFtIHJlYWR5LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGV1bnQgTEVPTkFUTyBhbmQgTWVzc2VuZ2VyPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+R28sIGdvb2QgcGFydG5lciwgZ28sIGdldCB5b3UgdG8gRnJhbmNpcyBTZWFjb2xlOzwvTElORT4KKzxMSU5FPmJpZCBoaW0gYnJpbmcgaGlzIHBlbiBhbmQgaW5raG9ybiB0byB0aGUgZ2FvbDogd2U8L0xJTkU+Cis8TElORT5hcmUgbm93IHRvIGV4YW1pbmF0aW9uIHRoZXNlIG1lbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPkFuZCB3ZSBtdXN0IGRvIGl0IHdpc2VseS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+V2Ugd2lsbCBzcGFyZSBmb3Igbm8gd2l0LCBJIHdhcnJhbnQgeW91OyBoZXJlJ3M8L0xJTkU+Cis8TElORT50aGF0IHNoYWxsIGRyaXZlIHNvbWUgb2YgdGhlbSB0byBhIG5vbi1jb21lOiBvbmx5PC9MSU5FPgorPExJTkU+Z2V0IHRoZSBsZWFybmVkIHdyaXRlciB0byBzZXQgZG93biBvdXI8L0xJTkU+Cis8TElORT5leGNvbW11bmljYXRpb24gYW5kIG1lZXQgbWUgYXQgdGhlIGdhb2wuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8L0FDVD4KKworPEFDVD48VElUTEU+QUNUIElWPC9USVRMRT4KKworPFNDRU5FPjxUSVRMRT5TQ0VORSBJLiAgQSBjaHVyY2guPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBET04gUEVEUk8sIERPTiBKT0hOLCBMRU9OQVRPLCBGUklBUiBGUkFOQ0lTLAorQ0xBVURJTywgQkVORURJQ0ssIEhFUk8sIEJFQVRSSUNFLCBhbmQgQXR0ZW5kYW50czwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgRnJpYXIgRnJhbmNpcywgYmUgYnJpZWY7IG9ubHkgdG8gdGhlIHBsYWluPC9MSU5FPgorPExJTkU+Zm9ybSBvZiBtYXJyaWFnZSwgYW5kIHlvdSBzaGFsbCByZWNvdW50IHRoZWlyPC9MSU5FPgorPExJTkU+cGFydGljdWxhciBkdXRpZXMgYWZ0ZXJ3YXJkcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5Zb3UgY29tZSBoaXRoZXIsIG15IGxvcmQsIHRvIG1hcnJ5IHRoaXMgbGFkeS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Oby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5UbyBiZSBtYXJyaWVkIHRvIGhlcjogZnJpYXIsIHlvdSBjb21lIHRvIG1hcnJ5IGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5MYWR5LCB5b3UgY29tZSBoaXRoZXIgdG8gYmUgbWFycmllZCB0byB0aGlzIGNvdW50LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkkgZG8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgorPExJTkU+SWYgZWl0aGVyIG9mIHlvdSBrbm93IGFueSBpbndhcmQgaW1wZWRpbWVudCB3aHkgeW91PC9MSU5FPgorPExJTkU+c2hvdWxkIG5vdCBiZSBjb25qb2luZWQsIGNoYXJnZSB5b3UsIG9uIHlvdXIgc291bHMsPC9MSU5FPgorPExJTkU+dG8gdXR0ZXIgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+S25vdyB5b3UgYW55LCBIZXJvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPk5vbmUsIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgorPExJTkU+S25vdyB5b3UgYW55LCBjb3VudD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIGRhcmUgbWFrZSBoaXMgYW5zd2VyLCBub25lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk8sIHdoYXQgbWVuIGRhcmUgZG8hIHdoYXQgbWVuIG1heSBkbyEgd2hhdCBtZW4gZGFpbHk8L0xJTkU+Cis8TElORT5kbywgbm90IGtub3dpbmcgd2hhdCB0aGV5IGRvITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Ib3cgbm93ISBpbnRlcmplY3Rpb25zPyBXaHksIHRoZW4sIHNvbWUgYmUgb2Y8L0xJTkU+Cis8TElORT5sYXVnaGluZywgYXMsIGFoLCBoYSwgaGUhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+U3RhbmQgdGhlZSBieSwgZnJpYXIuIEZhdGhlciwgYnkgeW91ciBsZWF2ZTo8L0xJTkU+Cis8TElORT5XaWxsIHlvdSB3aXRoIGZyZWUgYW5kIHVuY29uc3RyYWluZWQgc291bDwvTElORT4KKzxMSU5FPkdpdmUgbWUgdGhpcyBtYWlkLCB5b3VyIGRhdWdodGVyPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkFzIGZyZWVseSwgc29uLCBhcyBHb2QgZGlkIGdpdmUgaGVyIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCB3aGF0IGhhdmUgSSB0byBnaXZlIHlvdSBiYWNrLCB3aG9zZSB3b3J0aDwvTElORT4KKzxMSU5FPk1heSBjb3VudGVycG9pc2UgdGhpcyByaWNoIGFuZCBwcmVjaW91cyBnaWZ0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Tm90aGluZywgdW5sZXNzIHlvdSByZW5kZXIgaGVyIGFnYWluLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlN3ZWV0IHByaW5jZSwgeW91IGxlYXJuIG1lIG5vYmxlIHRoYW5rZnVsbmVzcy48L0xJTkU+Cis8TElORT5UaGVyZSwgTGVvbmF0bywgdGFrZSBoZXIgYmFjayBhZ2Fpbjo8L0xJTkU+Cis8TElORT5HaXZlIG5vdCB0aGlzIHJvdHRlbiBvcmFuZ2UgdG8geW91ciBmcmllbmQ7PC9MSU5FPgorPExJTkU+U2hlJ3MgYnV0IHRoZSBzaWduIGFuZCBzZW1ibGFuY2Ugb2YgaGVyIGhvbm91ci48L0xJTkU+Cis8TElORT5CZWhvbGQgaG93IGxpa2UgYSBtYWlkIHNoZSBibHVzaGVzIGhlcmUhPC9MSU5FPgorPExJTkU+Tywgd2hhdCBhdXRob3JpdHkgYW5kIHNob3cgb2YgdHJ1dGg8L0xJTkU+Cis8TElORT5DYW4gY3VubmluZyBzaW4gY292ZXIgaXRzZWxmIHdpdGhhbCE8L0xJTkU+Cis8TElORT5Db21lcyBub3QgdGhhdCBibG9vZCBhcyBtb2Rlc3QgZXZpZGVuY2U8L0xJTkU+Cis8TElORT5UbyB3aXRuZXNzIHNpbXBsZSB2aXJ0dWU/IFdvdWxkIHlvdSBub3Qgc3dlYXIsPC9MSU5FPgorPExJTkU+QWxsIHlvdSB0aGF0IHNlZSBoZXIsIHRoYXQgc2hlIHdlcmUgYSBtYWlkLDwvTElORT4KKzxMSU5FPkJ5IHRoZXNlIGV4dGVyaW9yIHNob3dzPyBCdXQgc2hlIGlzIG5vbmU6PC9MSU5FPgorPExJTkU+U2hlIGtub3dzIHRoZSBoZWF0IG9mIGEgbHV4dXJpb3VzIGJlZDs8L0xJTkU+Cis8TElORT5IZXIgYmx1c2ggaXMgZ3VpbHRpbmVzcywgbm90IG1vZGVzdHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBkbyB5b3UgbWVhbiwgbXkgbG9yZD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Ob3QgdG8gYmUgbWFycmllZCw8L0xJTkU+Cis8TElORT5Ob3QgdG8ga25pdCBteSBzb3VsIHRvIGFuIGFwcHJvdmVkIHdhbnRvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5EZWFyIG15IGxvcmQsIGlmIHlvdSwgaW4geW91ciBvd24gcHJvb2YsPC9MSU5FPgorPExJTkU+SGF2ZSB2YW5xdWlzaCdkIHRoZSByZXNpc3RhbmNlIG9mIGhlciB5b3V0aCw8L0xJTkU+Cis8TElORT5BbmQgbWFkZSBkZWZlYXQgb2YgaGVyIHZpcmdpbml0eSwtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkkga25vdyB3aGF0IHlvdSB3b3VsZCBzYXk6IGlmIEkgaGF2ZSBrbm93biBoZXIsPC9MSU5FPgorPExJTkU+WW91IHdpbGwgc2F5IHNoZSBkaWQgZW1icmFjZSBtZSBhcyBhIGh1c2JhbmQsPC9MSU5FPgorPExJTkU+QW5kIHNvIGV4dGVudWF0ZSB0aGUgJ2ZvcmVoYW5kIHNpbjo8L0xJTkU+Cis8TElORT5ObywgTGVvbmF0byw8L0xJTkU+Cis8TElORT5JIG5ldmVyIHRlbXB0ZWQgaGVyIHdpdGggd29yZCB0b28gbGFyZ2U7PC9MSU5FPgorPExJTkU+QnV0LCBhcyBhIGJyb3RoZXIgdG8gaGlzIHNpc3Rlciwgc2hvdydkPC9MSU5FPgorPExJTkU+QmFzaGZ1bCBzaW5jZXJpdHkgYW5kIGNvbWVseSBsb3ZlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBzZWVtJ2QgSSBldmVyIG90aGVyd2lzZSB0byB5b3U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+T3V0IG9uIHRoZWUhIFNlZW1pbmchIEkgd2lsbCB3cml0ZSBhZ2FpbnN0IGl0OjwvTElORT4KKzxMSU5FPllvdSBzZWVtIHRvIG1lIGFzIERpYW4gaW4gaGVyIG9yYiw8L0xJTkU+Cis8TElORT5BcyBjaGFzdGUgYXMgaXMgdGhlIGJ1ZCBlcmUgaXQgYmUgYmxvd247PC9MSU5FPgorPExJTkU+QnV0IHlvdSBhcmUgbW9yZSBpbnRlbXBlcmF0ZSBpbiB5b3VyIGJsb29kPC9MSU5FPgorPExJTkU+VGhhbiBWZW51cywgb3IgdGhvc2UgcGFtcGVyJ2QgYW5pbWFsczwvTElORT4KKzxMSU5FPlRoYXQgcmFnZSBpbiBzYXZhZ2Ugc2Vuc3VhbGl0eS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5JcyBteSBsb3JkIHdlbGwsIHRoYXQgaGUgZG90aCBzcGVhayBzbyB3aWRlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlN3ZWV0IHByaW5jZSwgd2h5IHNwZWFrIG5vdCB5b3U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaGF0IHNob3VsZCBJIHNwZWFrPzwvTElORT4KKzxMSU5FPkkgc3RhbmQgZGlzaG9ub3VyJ2QsIHRoYXQgaGF2ZSBnb25lIGFib3V0PC9MSU5FPgorPExJTkU+VG8gbGluayBteSBkZWFyIGZyaWVuZCB0byBhIGNvbW1vbiBzdGFsZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5BcmUgdGhlc2UgdGhpbmdzIHNwb2tlbiwgb3IgZG8gSSBidXQgZHJlYW0/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gSk9ITjwvU1BFQUtFUj4KKzxMSU5FPlNpciwgdGhleSBhcmUgc3Bva2VuLCBhbmQgdGhlc2UgdGhpbmdzIGFyZSB0cnVlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGlzIGxvb2tzIG5vdCBsaWtlIGEgbnVwdGlhbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5UcnVlISBPIEdvZCE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5MZW9uYXRvLCBzdGFuZCBJIGhlcmU/PC9MSU5FPgorPExJTkU+SXMgdGhpcyB0aGUgcHJpbmNlPyBpcyB0aGlzIHRoZSBwcmluY2UncyBicm90aGVyPzwvTElORT4KKzxMSU5FPklzIHRoaXMgZmFjZSBIZXJvJ3M/IGFyZSBvdXIgZXllcyBvdXIgb3duPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkFsbCB0aGlzIGlzIHNvOiBidXQgd2hhdCBvZiB0aGlzLCBteSBsb3JkPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkxldCBtZSBidXQgbW92ZSBvbmUgcXVlc3Rpb24gdG8geW91ciBkYXVnaHRlcjs8L0xJTkU+Cis8TElORT5BbmQsIGJ5IHRoYXQgZmF0aGVybHkgYW5kIGtpbmRseSBwb3dlcjwvTElORT4KKzxMSU5FPlRoYXQgeW91IGhhdmUgaW4gaGVyLCBiaWQgaGVyIGFuc3dlciB0cnVseS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIGNoYXJnZSB0aGVlIGRvIHNvLCBhcyB0aG91IGFydCBteSBjaGlsZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5PLCBHb2QgZGVmZW5kIG1lISBob3cgYW0gSSBiZXNldCE8L0xJTkU+Cis8TElORT5XaGF0IGtpbmQgb2YgY2F0ZWNoaXNpbmcgY2FsbCB5b3UgdGhpcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5UbyBtYWtlIHlvdSBhbnN3ZXIgdHJ1bHkgdG8geW91ciBuYW1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPklzIGl0IG5vdCBIZXJvPyBXaG8gY2FuIGJsb3QgdGhhdCBuYW1lPC9MSU5FPgorPExJTkU+V2l0aCBhbnkganVzdCByZXByb2FjaD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5NYXJyeSwgdGhhdCBjYW4gSGVybzs8L0xJTkU+Cis8TElORT5IZXJvIGl0c2VsZiBjYW4gYmxvdCBvdXQgSGVybydzIHZpcnR1ZS48L0xJTkU+Cis8TElORT5XaGF0IG1hbiB3YXMgaGUgdGFsaydkIHdpdGggeW91IHllc3Rlcm5pZ2h0PC9MSU5FPgorPExJTkU+T3V0IGF0IHlvdXIgd2luZG93IGJldHdpeHQgdHdlbHZlIGFuZCBvbmU/PC9MSU5FPgorPExJTkU+Tm93LCBpZiB5b3UgYXJlIGEgbWFpZCwgYW5zd2VyIHRvIHRoaXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+SSB0YWxrJ2Qgd2l0aCBubyBtYW4gYXQgdGhhdCBob3VyLCBteSBsb3JkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+V2h5LCB0aGVuIGFyZSB5b3Ugbm8gbWFpZGVuLiBMZW9uYXRvLDwvTElORT4KKzxMSU5FPkkgYW0gc29ycnkgeW91IG11c3QgaGVhcjogdXBvbiBtaW5lIGhvbm91ciw8L0xJTkU+Cis8TElORT5NeXNlbGYsIG15IGJyb3RoZXIgYW5kIHRoaXMgZ3JpZXZlZCBjb3VudDwvTElORT4KKzxMSU5FPkRpZCBzZWUgaGVyLCBoZWFyIGhlciwgYXQgdGhhdCBob3VyIGxhc3QgbmlnaHQ8L0xJTkU+Cis8TElORT5UYWxrIHdpdGggYSBydWZmaWFuIGF0IGhlciBjaGFtYmVyLXdpbmRvdzwvTElORT4KKzxMSU5FPldobyBoYXRoIGluZGVlZCwgbW9zdCBsaWtlIGEgbGliZXJhbCB2aWxsYWluLDwvTElORT4KKzxMSU5FPkNvbmZlc3MnZCB0aGUgdmlsZSBlbmNvdW50ZXJzIHRoZXkgaGF2ZSBoYWQ8L0xJTkU+Cis8TElORT5BIHRob3VzYW5kIHRpbWVzIGluIHNlY3JldC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBKT0hOPC9TUEVBS0VSPgorPExJTkU+RmllLCBmaWUhIHRoZXkgYXJlIG5vdCB0byBiZSBuYW1lZCwgbXkgbG9yZCw8L0xJTkU+Cis8TElORT5Ob3QgdG8gYmUgc3Bva2Ugb2Y7PC9MSU5FPgorPExJTkU+VGhlcmUgaXMgbm90IGNoYXN0aXR5IGVub3VnaCBpbiBsYW5ndWFnZTwvTElORT4KKzxMSU5FPldpdGhvdXQgb2ZmZW5jZSB0byB1dHRlciB0aGVtLiBUaHVzLCBwcmV0dHkgbGFkeSw8L0xJTkU+Cis8TElORT5JIGFtIHNvcnJ5IGZvciB0aHkgbXVjaCBtaXNnb3Zlcm5tZW50LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk8gSGVybywgd2hhdCBhIEhlcm8gaGFkc3QgdGhvdSBiZWVuLDwvTElORT4KKzxMSU5FPklmIGhhbGYgdGh5IG91dHdhcmQgZ3JhY2VzIGhhZCBiZWVuIHBsYWNlZDwvTElORT4KKzxMSU5FPkFib3V0IHRoeSB0aG91Z2h0cyBhbmQgY291bnNlbHMgb2YgdGh5IGhlYXJ0ITwvTElORT4KKzxMSU5FPkJ1dCBmYXJlIHRoZWUgd2VsbCwgbW9zdCBmb3VsLCBtb3N0IGZhaXIhIGZhcmV3ZWxsLDwvTElORT4KKzxMSU5FPlRob3UgcHVyZSBpbXBpZXR5IGFuZCBpbXBpb3VzIHB1cml0eSE8L0xJTkU+Cis8TElORT5Gb3IgdGhlZSBJJ2xsIGxvY2sgdXAgYWxsIHRoZSBnYXRlcyBvZiBsb3ZlLDwvTElORT4KKzxMSU5FPkFuZCBvbiBteSBleWVsaWRzIHNoYWxsIGNvbmplY3R1cmUgaGFuZyw8L0xJTkU+Cis8TElORT5UbyB0dXJuIGFsbCBiZWF1dHkgaW50byB0aG91Z2h0cyBvZiBoYXJtLDwvTElORT4KKzxMSU5FPkFuZCBuZXZlciBzaGFsbCBpdCBtb3JlIGJlIGdyYWNpb3VzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkhhdGggbm8gbWFuJ3MgZGFnZ2VyIGhlcmUgYSBwb2ludCBmb3IgbWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkhFUk8gc3dvb25zPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+V2h5LCBob3cgbm93LCBjb3VzaW4hIHdoZXJlZm9yZSBzaW5rIHlvdSBkb3duPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIEpPSE48L1NQRUFLRVI+Cis8TElORT5Db21lLCBsZXQgdXMgZ28uIFRoZXNlIHRoaW5ncywgY29tZSB0aHVzIHRvIGxpZ2h0LDwvTElORT4KKzxMSU5FPlNtb3RoZXIgaGVyIHNwaXJpdHMgdXAuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudCBET04gUEVEUk8sIERPTiBKT0hOLCBhbmQgQ0xBVURJTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkhvdyBkb3RoIHRoZSBsYWR5PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5EZWFkLCBJIHRoaW5rLiBIZWxwLCB1bmNsZSE8L0xJTkU+Cis8TElORT5IZXJvISB3aHksIEhlcm8hIFVuY2xlISBTaWduaW9yIEJlbmVkaWNrISBGcmlhciE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5PIEZhdGUhIHRha2Ugbm90IGF3YXkgdGh5IGhlYXZ5IGhhbmQuPC9MSU5FPgorPExJTkU+RGVhdGggaXMgdGhlIGZhaXJlc3QgY292ZXIgZm9yIGhlciBzaGFtZTwvTElORT4KKzxMSU5FPlRoYXQgbWF5IGJlIHdpc2gnZCBmb3IuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkhvdyBub3csIGNvdXNpbiBIZXJvITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KKzxMSU5FPkhhdmUgY29tZm9ydCwgbGFkeS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Eb3N0IHRob3UgbG9vayB1cD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5ZZWEsIHdoZXJlZm9yZSBzaG91bGQgc2hlIG5vdD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5XaGVyZWZvcmUhIFdoeSwgZG90aCBub3QgZXZlcnkgZWFydGhseSB0aGluZzwvTElORT4KKzxMSU5FPkNyeSBzaGFtZSB1cG9uIGhlcj8gQ291bGQgc2hlIGhlcmUgZGVueTwvTElORT4KKzxMSU5FPlRoZSBzdG9yeSB0aGF0IGlzIHByaW50ZWQgaW4gaGVyIGJsb29kPzwvTElORT4KKzxMSU5FPkRvIG5vdCBsaXZlLCBIZXJvOyBkbyBub3Qgb3BlIHRoaW5lIGV5ZXM6PC9MSU5FPgorPExJTkU+Rm9yLCBkaWQgSSB0aGluayB0aG91IHdvdWxkc3Qgbm90IHF1aWNrbHkgZGllLDwvTElORT4KKzxMSU5FPlRob3VnaHQgSSB0aHkgc3Bpcml0cyB3ZXJlIHN0cm9uZ2VyIHRoYW4gdGh5IHNoYW1lcyw8L0xJTkU+Cis8TElORT5NeXNlbGYgd291bGQsIG9uIHRoZSByZWFyd2FyZCBvZiByZXByb2FjaGVzLDwvTElORT4KKzxMSU5FPlN0cmlrZSBhdCB0aHkgbGlmZS4gR3JpZXZlZCBJLCBJIGhhZCBidXQgb25lPzwvTElORT4KKzxMSU5FPkNoaWQgSSBmb3IgdGhhdCBhdCBmcnVnYWwgbmF0dXJlJ3MgZnJhbWU/PC9MSU5FPgorPExJTkU+Tywgb25lIHRvbyBtdWNoIGJ5IHRoZWUhIFdoeSBoYWQgSSBvbmU/PC9MSU5FPgorPExJTkU+V2h5IGV2ZXIgd2FzdCB0aG91IGxvdmVseSBpbiBteSBleWVzPzwvTElORT4KKzxMSU5FPldoeSBoYWQgSSBub3Qgd2l0aCBjaGFyaXRhYmxlIGhhbmQ8L0xJTkU+Cis8TElORT5Ub29rIHVwIGEgYmVnZ2FyJ3MgaXNzdWUgYXQgbXkgZ2F0ZXMsPC9MSU5FPgorPExJTkU+V2hvIHNtaXJjaCdkIHRodXMgYW5kIG1pcmVkIHdpdGggaW5mYW15LDwvTElORT4KKzxMSU5FPkkgbWlnaHQgaGF2ZSBzYWlkICdObyBwYXJ0IG9mIGl0IGlzIG1pbmU7PC9MSU5FPgorPExJTkU+VGhpcyBzaGFtZSBkZXJpdmVzIGl0c2VsZiBmcm9tIHVua25vd24gbG9pbnMnPzwvTElORT4KKzxMSU5FPkJ1dCBtaW5lIGFuZCBtaW5lIEkgbG92ZWQgYW5kIG1pbmUgSSBwcmFpc2VkPC9MSU5FPgorPExJTkU+QW5kIG1pbmUgdGhhdCBJIHdhcyBwcm91ZCBvbiwgbWluZSBzbyBtdWNoPC9MSU5FPgorPExJTkU+VGhhdCBJIG15c2VsZiB3YXMgdG8gbXlzZWxmIG5vdCBtaW5lLDwvTElORT4KKzxMSU5FPlZhbHVpbmcgb2YgaGVyLC0td2h5LCBzaGUsIE8sIHNoZSBpcyBmYWxsZW48L0xJTkU+Cis8TElORT5JbnRvIGEgcGl0IG9mIGluaywgdGhhdCB0aGUgd2lkZSBzZWE8L0xJTkU+Cis8TElORT5IYXRoIGRyb3BzIHRvbyBmZXcgdG8gd2FzaCBoZXIgY2xlYW4gYWdhaW48L0xJTkU+Cis8TElORT5BbmQgc2FsdCB0b28gbGl0dGxlIHdoaWNoIG1heSBzZWFzb24gZ2l2ZTwvTElORT4KKzxMSU5FPlRvIGhlciBmb3VsLXRhaW50ZWQgZmxlc2ghPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlNpciwgc2lyLCBiZSBwYXRpZW50LjwvTElORT4KKzxMSU5FPkZvciBteSBwYXJ0LCBJIGFtIHNvIGF0dGlyZWQgaW4gd29uZGVyLDwvTElORT4KKzxMSU5FPkkga25vdyBub3Qgd2hhdCB0byBzYXkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPk8sIG9uIG15IHNvdWwsIG15IGNvdXNpbiBpcyBiZWxpZWQhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkxhZHksIHdlcmUgeW91IGhlciBiZWRmZWxsb3cgbGFzdCBuaWdodD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+Tm8sIHRydWx5IG5vdDsgYWx0aG91Z2gsIHVudGlsIGxhc3QgbmlnaHQsPC9MSU5FPgorPExJTkU+SSBoYXZlIHRoaXMgdHdlbHZlbW9udGggYmVlbiBoZXIgYmVkZmVsbG93LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkNvbmZpcm0nZCwgY29uZmlybSdkISBPLCB0aGF0IGlzIHN0cm9uZ2VyIG1hZGU8L0xJTkU+Cis8TElORT5XaGljaCB3YXMgYmVmb3JlIGJhcnInZCB1cCB3aXRoIHJpYnMgb2YgaXJvbiE8L0xJTkU+Cis8TElORT5Xb3VsZCB0aGUgdHdvIHByaW5jZXMgbGllLCBhbmQgQ2xhdWRpbyBsaWUsPC9MSU5FPgorPExJTkU+V2hvIGxvdmVkIGhlciBzbywgdGhhdCwgc3BlYWtpbmcgb2YgaGVyIGZvdWxuZXNzLDwvTElORT4KKzxMSU5FPldhc2gnZCBpdCB3aXRoIHRlYXJzPyBIZW5jZSBmcm9tIGhlciEgbGV0IGhlciBkaWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgorPExJTkU+SGVhciBtZSBhIGxpdHRsZTsgZm9yIEkgaGF2ZSBvbmx5IGJlZW48L0xJTkU+Cis8TElORT5TaWxlbnQgc28gbG9uZyBhbmQgZ2l2ZW4gd2F5IHVudG88L0xJTkU+Cis8TElORT5UaGlzIGNvdXJzZSBvZiBmb3J0dW5lPC9MSU5FPgorPExJTkU+Qnkgbm90aW5nIG9mIHRoZSBsYWR5LiBJIGhhdmUgbWFyaydkPC9MSU5FPgorPExJTkU+QSB0aG91c2FuZCBibHVzaGluZyBhcHBhcml0aW9uczwvTElORT4KKzxMSU5FPlRvIHN0YXJ0IGludG8gaGVyIGZhY2UsIGEgdGhvdXNhbmQgaW5ub2NlbnQgc2hhbWVzPC9MSU5FPgorPExJTkU+SW4gYW5nZWwgd2hpdGVuZXNzIGJlYXQgYXdheSB0aG9zZSBibHVzaGVzOzwvTElORT4KKzxMSU5FPkFuZCBpbiBoZXIgZXllIHRoZXJlIGhhdGggYXBwZWFyJ2QgYSBmaXJlLDwvTElORT4KKzxMSU5FPlRvIGJ1cm4gdGhlIGVycm9ycyB0aGF0IHRoZXNlIHByaW5jZXMgaG9sZDwvTElORT4KKzxMSU5FPkFnYWluc3QgaGVyIG1haWRlbiB0cnV0aC4gQ2FsbCBtZSBhIGZvb2w7PC9MSU5FPgorPExJTkU+VHJ1c3Qgbm90IG15IHJlYWRpbmcgbm9yIG15IG9ic2VydmF0aW9ucyw8L0xJTkU+Cis8TElORT5XaGljaCB3aXRoIGV4cGVyaW1lbnRhbCBzZWFsIGRvdGggd2FycmFudDwvTElORT4KKzxMSU5FPlRoZSB0ZW5vciBvZiBteSBib29rOyB0cnVzdCBub3QgbXkgYWdlLDwvTElORT4KKzxMSU5FPk15IHJldmVyZW5jZSwgY2FsbGluZywgbm9yIGRpdmluaXR5LDwvTElORT4KKzxMSU5FPklmIHRoaXMgc3dlZXQgbGFkeSBsaWUgbm90IGd1aWx0bGVzcyBoZXJlPC9MSU5FPgorPExJTkU+VW5kZXIgc29tZSBiaXRpbmcgZXJyb3IuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+RnJpYXIsIGl0IGNhbm5vdCBiZS48L0xJTkU+Cis8TElORT5UaG91IHNlZXN0IHRoYXQgYWxsIHRoZSBncmFjZSB0aGF0IHNoZSBoYXRoIGxlZnQ8L0xJTkU+Cis8TElORT5JcyB0aGF0IHNoZSB3aWxsIG5vdCBhZGQgdG8gaGVyIGRhbW5hdGlvbjwvTElORT4KKzxMSU5FPkEgc2luIG9mIHBlcmp1cnk7IHNoZSBub3QgZGVuaWVzIGl0OjwvTElORT4KKzxMSU5FPldoeSBzZWVrJ3N0IHRob3UgdGhlbiB0byBjb3ZlciB3aXRoIGV4Y3VzZTwvTElORT4KKzxMSU5FPlRoYXQgd2hpY2ggYXBwZWFycyBpbiBwcm9wZXIgbmFrZWRuZXNzPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KKzxMSU5FPkxhZHksIHdoYXQgbWFuIGlzIGhlIHlvdSBhcmUgYWNjdXNlZCBvZj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5UaGV5IGtub3cgdGhhdCBkbyBhY2N1c2UgbWU7IEkga25vdyBub25lOjwvTElORT4KKzxMSU5FPklmIEkga25vdyBtb3JlIG9mIGFueSBtYW4gYWxpdmU8L0xJTkU+Cis8TElORT5UaGFuIHRoYXQgd2hpY2ggbWFpZGVuIG1vZGVzdHkgZG90aCB3YXJyYW50LDwvTElORT4KKzxMSU5FPkxldCBhbGwgbXkgc2lucyBsYWNrIG1lcmN5ISBPIG15IGZhdGhlciw8L0xJTkU+Cis8TElORT5Qcm92ZSB5b3UgdGhhdCBhbnkgbWFuIHdpdGggbWUgY29udmVyc2VkPC9MSU5FPgorPExJTkU+QXQgaG91cnMgdW5tZWV0LCBvciB0aGF0IEkgeWVzdGVybmlnaHQ8L0xJTkU+Cis8TElORT5NYWludGFpbidkIHRoZSBjaGFuZ2Ugb2Ygd29yZHMgd2l0aCBhbnkgY3JlYXR1cmUsPC9MSU5FPgorPExJTkU+UmVmdXNlIG1lLCBoYXRlIG1lLCB0b3J0dXJlIG1lIHRvIGRlYXRoITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KKzxMSU5FPlRoZXJlIGlzIHNvbWUgc3RyYW5nZSBtaXNwcmlzaW9uIGluIHRoZSBwcmluY2VzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Ud28gb2YgdGhlbSBoYXZlIHRoZSB2ZXJ5IGJlbnQgb2YgaG9ub3VyOzwvTElORT4KKzxMSU5FPkFuZCBpZiB0aGVpciB3aXNkb21zIGJlIG1pc2xlZCBpbiB0aGlzLDwvTElORT4KKzxMSU5FPlRoZSBwcmFjdGlzZSBvZiBpdCBsaXZlcyBpbiBKb2huIHRoZSBiYXN0YXJkLDwvTElORT4KKzxMSU5FPldob3NlIHNwaXJpdHMgdG9pbCBpbiBmcmFtZSBvZiB2aWxsYW5pZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+SSBrbm93IG5vdC4gSWYgdGhleSBzcGVhayBidXQgdHJ1dGggb2YgaGVyLDwvTElORT4KKzxMSU5FPlRoZXNlIGhhbmRzIHNoYWxsIHRlYXIgaGVyOyBpZiB0aGV5IHdyb25nIGhlciBob25vdXIsPC9MSU5FPgorPExJTkU+VGhlIHByb3VkZXN0IG9mIHRoZW0gc2hhbGwgd2VsbCBoZWFyIG9mIGl0LjwvTElORT4KKzxMSU5FPlRpbWUgaGF0aCBub3QgeWV0IHNvIGRyaWVkIHRoaXMgYmxvb2Qgb2YgbWluZSw8L0xJTkU+Cis8TElORT5Ob3IgYWdlIHNvIGVhdCB1cCBteSBpbnZlbnRpb24sPC9MSU5FPgorPExJTkU+Tm9yIGZvcnR1bmUgbWFkZSBzdWNoIGhhdm9jIG9mIG15IG1lYW5zLDwvTElORT4KKzxMSU5FPk5vciBteSBiYWQgbGlmZSByZWZ0IG1lIHNvIG11Y2ggb2YgZnJpZW5kcyw8L0xJTkU+Cis8TElORT5CdXQgdGhleSBzaGFsbCBmaW5kLCBhd2FrZWQgaW4gc3VjaCBhIGtpbmQsPC9MSU5FPgorPExJTkU+Qm90aCBzdHJlbmd0aCBvZiBsaW1iIGFuZCBwb2xpY3kgb2YgbWluZCw8L0xJTkU+Cis8TElORT5BYmlsaXR5IGluIG1lYW5zIGFuZCBjaG9pY2Ugb2YgZnJpZW5kcyw8L0xJTkU+Cis8TElORT5UbyBxdWl0IG1lIG9mIHRoZW0gdGhyb3VnaGx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KKzxMSU5FPlBhdXNlIGF3aGlsZSw8L0xJTkU+Cis8TElORT5BbmQgbGV0IG15IGNvdW5zZWwgc3dheSB5b3UgaW4gdGhpcyBjYXNlLjwvTElORT4KKzxMSU5FPllvdXIgZGF1Z2h0ZXIgaGVyZSB0aGUgcHJpbmNlcyBsZWZ0IGZvciBkZWFkOjwvTElORT4KKzxMSU5FPkxldCBoZXIgYXdoaWxlIGJlIHNlY3JldGx5IGtlcHQgaW4sPC9MSU5FPgorPExJTkU+QW5kIHB1Ymxpc2ggaXQgdGhhdCBzaGUgaXMgZGVhZCBpbmRlZWQ7PC9MSU5FPgorPExJTkU+TWFpbnRhaW4gYSBtb3VybmluZyBvc3RlbnRhdGlvbjwvTElORT4KKzxMSU5FPkFuZCBvbiB5b3VyIGZhbWlseSdzIG9sZCBtb251bWVudDwvTElORT4KKzxMSU5FPkhhbmcgbW91cm5mdWwgZXBpdGFwaHMgYW5kIGRvIGFsbCByaXRlczwvTElORT4KKzxMSU5FPlRoYXQgYXBwZXJ0YWluIHVudG8gYSBidXJpYWwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hhdCBzaGFsbCBiZWNvbWUgb2YgdGhpcz8gd2hhdCB3aWxsIHRoaXMgZG8/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GUklBUiBGUkFOQ0lTPC9TUEVBS0VSPgorPExJTkU+TWFycnksIHRoaXMgd2VsbCBjYXJyaWVkIHNoYWxsIG9uIGhlciBiZWhhbGY8L0xJTkU+Cis8TElORT5DaGFuZ2Ugc2xhbmRlciB0byByZW1vcnNlOyB0aGF0IGlzIHNvbWUgZ29vZDo8L0xJTkU+Cis8TElORT5CdXQgbm90IGZvciB0aGF0IGRyZWFtIEkgb24gdGhpcyBzdHJhbmdlIGNvdXJzZSw8L0xJTkU+Cis8TElORT5CdXQgb24gdGhpcyB0cmF2YWlsIGxvb2sgZm9yIGdyZWF0ZXIgYmlydGguPC9MSU5FPgorPExJTkU+U2hlIGR5aW5nLCBhcyBpdCBtdXN0IHNvIGJlIG1haW50YWluJ2QsPC9MSU5FPgorPExJTkU+VXBvbiB0aGUgaW5zdGFudCB0aGF0IHNoZSB3YXMgYWNjdXNlZCw8L0xJTkU+Cis8TElORT5TaGFsbCBiZSBsYW1lbnRlZCwgcGl0aWVkIGFuZCBleGN1c2VkPC9MSU5FPgorPExJTkU+T2YgZXZlcnkgaGVhcmVyOiBmb3IgaXQgc28gZmFsbHMgb3V0PC9MSU5FPgorPExJTkU+VGhhdCB3aGF0IHdlIGhhdmUgd2UgcHJpemUgbm90IHRvIHRoZSB3b3J0aDwvTElORT4KKzxMSU5FPldoaWxlcyB3ZSBlbmpveSBpdCwgYnV0IGJlaW5nIGxhY2snZCBhbmQgbG9zdCw8L0xJTkU+Cis8TElORT5XaHksIHRoZW4gd2UgcmFjayB0aGUgdmFsdWUsIHRoZW4gd2UgZmluZDwvTElORT4KKzxMSU5FPlRoZSB2aXJ0dWUgdGhhdCBwb3NzZXNzaW9uIHdvdWxkIG5vdCBzaG93IHVzPC9MSU5FPgorPExJTkU+V2hpbGVzIGl0IHdhcyBvdXJzLiBTbyB3aWxsIGl0IGZhcmUgd2l0aCBDbGF1ZGlvOjwvTElORT4KKzxMSU5FPldoZW4gaGUgc2hhbGwgaGVhciBzaGUgZGllZCB1cG9uIGhpcyB3b3Jkcyw8L0xJTkU+Cis8TElORT5UaGUgaWRlYSBvZiBoZXIgbGlmZSBzaGFsbCBzd2VldGx5IGNyZWVwPC9MSU5FPgorPExJTkU+SW50byBoaXMgc3R1ZHkgb2YgaW1hZ2luYXRpb24sPC9MSU5FPgorPExJTkU+QW5kIGV2ZXJ5IGxvdmVseSBvcmdhbiBvZiBoZXIgbGlmZTwvTElORT4KKzxMSU5FPlNoYWxsIGNvbWUgYXBwYXJlbGwnZCBpbiBtb3JlIHByZWNpb3VzIGhhYml0LDwvTElORT4KKzxMSU5FPk1vcmUgbW92aW5nLWRlbGljYXRlIGFuZCBmdWxsIG9mIGxpZmUsPC9MSU5FPgorPExJTkU+SW50byB0aGUgZXllIGFuZCBwcm9zcGVjdCBvZiBoaXMgc291bCw8L0xJTkU+Cis8TElORT5UaGFuIHdoZW4gc2hlIGxpdmVkIGluZGVlZDsgdGhlbiBzaGFsbCBoZSBtb3Vybiw8L0xJTkU+Cis8TElORT5JZiBldmVyIGxvdmUgaGFkIGludGVyZXN0IGluIGhpcyBsaXZlciw8L0xJTkU+Cis8TElORT5BbmQgd2lzaCBoZSBoYWQgbm90IHNvIGFjY3VzZWQgaGVyLDwvTElORT4KKzxMSU5FPk5vLCB0aG91Z2ggaGUgdGhvdWdodCBoaXMgYWNjdXNhdGlvbiB0cnVlLjwvTElORT4KKzxMSU5FPkxldCB0aGlzIGJlIHNvLCBhbmQgZG91YnQgbm90IGJ1dCBzdWNjZXNzPC9MSU5FPgorPExJTkU+V2lsbCBmYXNoaW9uIHRoZSBldmVudCBpbiBiZXR0ZXIgc2hhcGU8L0xJTkU+Cis8TElORT5UaGFuIEkgY2FuIGxheSBpdCBkb3duIGluIGxpa2VsaWhvb2QuPC9MSU5FPgorPExJTkU+QnV0IGlmIGFsbCBhaW0gYnV0IHRoaXMgYmUgbGV2ZWxsJ2QgZmFsc2UsPC9MSU5FPgorPExJTkU+VGhlIHN1cHBvc2l0aW9uIG9mIHRoZSBsYWR5J3MgZGVhdGg8L0xJTkU+Cis8TElORT5XaWxsIHF1ZW5jaCB0aGUgd29uZGVyIG9mIGhlciBpbmZhbXk6PC9MSU5FPgorPExJTkU+QW5kIGlmIGl0IHNvcnQgbm90IHdlbGwsIHlvdSBtYXkgY29uY2VhbCBoZXIsPC9MSU5FPgorPExJTkU+QXMgYmVzdCBiZWZpdHMgaGVyIHdvdW5kZWQgcmVwdXRhdGlvbiw8L0xJTkU+Cis8TElORT5JbiBzb21lIHJlY2x1c2l2ZSBhbmQgcmVsaWdpb3VzIGxpZmUsPC9MSU5FPgorPExJTkU+T3V0IG9mIGFsbCBleWVzLCB0b25ndWVzLCBtaW5kcyBhbmQgaW5qdXJpZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlNpZ25pb3IgTGVvbmF0bywgbGV0IHRoZSBmcmlhciBhZHZpc2UgeW91OjwvTElORT4KKzxMSU5FPkFuZCB0aG91Z2ggeW91IGtub3cgbXkgaW53YXJkbmVzcyBhbmQgbG92ZTwvTElORT4KKzxMSU5FPklzIHZlcnkgbXVjaCB1bnRvIHRoZSBwcmluY2UgYW5kIENsYXVkaW8sPC9MSU5FPgorPExJTkU+WWV0LCBieSBtaW5lIGhvbm91ciwgSSB3aWxsIGRlYWwgaW4gdGhpczwvTElORT4KKzxMSU5FPkFzIHNlY3JldGx5IGFuZCBqdXN0bHkgYXMgeW91ciBzb3VsPC9MSU5FPgorPExJTkU+U2hvdWxkIHdpdGggeW91ciBib2R5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkJlaW5nIHRoYXQgSSBmbG93IGluIGdyaWVmLDwvTElORT4KKzxMSU5FPlRoZSBzbWFsbGVzdCB0d2luZSBtYXkgbGVhZCBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT4nVGlzIHdlbGwgY29uc2VudGVkOiBwcmVzZW50bHkgYXdheTs8L0xJTkU+Cis8TElORT5Gb3IgdG8gc3RyYW5nZSBzb3JlcyBzdHJhbmdlbHkgdGhleSBzdHJhaW4gdGhlIGN1cmUuPC9MSU5FPgorPExJTkU+Q29tZSwgbGFkeSwgZGllIHRvIGxpdmU6IHRoaXMgd2VkZGluZy1kYXk8L0xJTkU+Cis8TElORT5QZXJoYXBzIGlzIGJ1dCBwcm9sb25nJ2Q6IGhhdmUgcGF0aWVuY2UgYW5kIGVuZHVyZS48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50IGFsbCBidXQgQkVORURJQ0sgYW5kIEJFQVRSSUNFPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+TGFkeSBCZWF0cmljZSwgaGF2ZSB5b3Ugd2VwdCBhbGwgdGhpcyB3aGlsZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+WWVhLCBhbmQgSSB3aWxsIHdlZXAgYSB3aGlsZSBsb25nZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkkgd2lsbCBub3QgZGVzaXJlIHRoYXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPllvdSBoYXZlIG5vIHJlYXNvbjsgSSBkbyBpdCBmcmVlbHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlN1cmVseSBJIGRvIGJlbGlldmUgeW91ciBmYWlyIGNvdXNpbiBpcyB3cm9uZ2VkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5BaCwgaG93IG11Y2ggbWlnaHQgdGhlIG1hbiBkZXNlcnZlIG9mIG1lIHRoYXQgd291bGQgcmlnaHQgaGVyITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JcyB0aGVyZSBhbnkgd2F5IHRvIHNob3cgc3VjaCBmcmllbmRzaGlwPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5BIHZlcnkgZXZlbiB3YXksIGJ1dCBubyBzdWNoIGZyaWVuZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+TWF5IGEgbWFuIGRvIGl0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JdCBpcyBhIG1hbidzIG9mZmljZSwgYnV0IG5vdCB5b3Vycy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SSBkbyBsb3ZlIG5vdGhpbmcgaW4gdGhlIHdvcmxkIHNvIHdlbGwgYXMgeW91OiBpczwvTElORT4KKzxMSU5FPm5vdCB0aGF0IHN0cmFuZ2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkFzIHN0cmFuZ2UgYXMgdGhlIHRoaW5nIEkga25vdyBub3QuIEl0IHdlcmUgYXM8L0xJTkU+Cis8TElORT5wb3NzaWJsZSBmb3IgbWUgdG8gc2F5IEkgbG92ZWQgbm90aGluZyBzbyB3ZWxsIGFzPC9MSU5FPgorPExJTkU+eW91OiBidXQgYmVsaWV2ZSBtZSBub3Q7IGFuZCB5ZXQgSSBsaWUgbm90OyBJPC9MSU5FPgorPExJTkU+Y29uZmVzcyBub3RoaW5nLCBub3IgSSBkZW55IG5vdGhpbmcuIEkgYW0gc29ycnkgZm9yIG15IGNvdXNpbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QnkgbXkgc3dvcmQsIEJlYXRyaWNlLCB0aG91IGxvdmVzdCBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+RG8gbm90IHN3ZWFyLCBhbmQgZWF0IGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIHdpbGwgc3dlYXIgYnkgaXQgdGhhdCB5b3UgbG92ZSBtZTsgYW5kIEkgd2lsbCBtYWtlPC9MSU5FPgorPExJTkU+aGltIGVhdCBpdCB0aGF0IHNheXMgSSBsb3ZlIG5vdCB5b3UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPldpbGwgeW91IG5vdCBlYXQgeW91ciB3b3JkPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XaXRoIG5vIHNhdWNlIHRoYXQgY2FuIGJlIGRldmlzZWQgdG8gaXQuIEkgcHJvdGVzdDwvTElORT4KKzxMSU5FPkkgbG92ZSB0aGVlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5XaHksIHRoZW4sIEdvZCBmb3JnaXZlIG1lITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XaGF0IG9mZmVuY2UsIHN3ZWV0IEJlYXRyaWNlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Zb3UgaGF2ZSBzdGF5ZWQgbWUgaW4gYSBoYXBweSBob3VyOiBJIHdhcyBhYm91dCB0bzwvTElORT4KKzxMSU5FPnByb3Rlc3QgSSBsb3ZlZCB5b3UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBkbyBpdCB3aXRoIGFsbCB0aHkgaGVhcnQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkkgbG92ZSB5b3Ugd2l0aCBzbyBtdWNoIG9mIG15IGhlYXJ0IHRoYXQgbm9uZSBpczwvTElORT4KKzxMSU5FPmxlZnQgdG8gcHJvdGVzdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgYmlkIG1lIGRvIGFueSB0aGluZyBmb3IgdGhlZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+S2lsbCBDbGF1ZGlvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5IYSEgbm90IGZvciB0aGUgd2lkZSB3b3JsZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+WW91IGtpbGwgbWUgdG8gZGVueSBpdC4gRmFyZXdlbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRhcnJ5LCBzd2VldCBCZWF0cmljZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SSBhbSBnb25lLCB0aG91Z2ggSSBhbSBoZXJlOiB0aGVyZSBpcyBubyBsb3ZlIGluPC9MSU5FPgorPExJTkU+eW91OiBuYXksIEkgcHJheSB5b3UsIGxldCBtZSBnby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QmVhdHJpY2UsLS08L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SW4gZmFpdGgsIEkgd2lsbCBnby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+V2UnbGwgYmUgZnJpZW5kcyBmaXJzdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+WW91IGRhcmUgZWFzaWVyIGJlIGZyaWVuZHMgd2l0aCBtZSB0aGFuIGZpZ2h0IHdpdGggbWluZSBlbmVteS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SXMgQ2xhdWRpbyB0aGluZSBlbmVteT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+SXMgaGUgbm90IGFwcHJvdmVkIGluIHRoZSBoZWlnaHQgYSB2aWxsYWluLCB0aGF0PC9MSU5FPgorPExJTkU+aGF0aCBzbGFuZGVyZWQsIHNjb3JuZWQsIGRpc2hvbm91cmVkIG15IGtpbnN3b21hbj8gTzwvTElORT4KKzxMSU5FPnRoYXQgSSB3ZXJlIGEgbWFuISBXaGF0LCBiZWFyIGhlciBpbiBoYW5kIHVudGlsIHRoZXk8L0xJTkU+Cis8TElORT5jb21lIHRvIHRha2UgaGFuZHM7IGFuZCB0aGVuLCB3aXRoIHB1YmxpYzwvTElORT4KKzxMSU5FPmFjY3VzYXRpb24sIHVuY292ZXJlZCBzbGFuZGVyLCB1bm1pdGlnYXRlZCByYW5jb3VyLDwvTElORT4KKzxMSU5FPi0tTyBHb2QsIHRoYXQgSSB3ZXJlIGEgbWFuISBJIHdvdWxkIGVhdCBoaXMgaGVhcnQ8L0xJTkU+Cis8TElORT5pbiB0aGUgbWFya2V0LXBsYWNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5IZWFyIG1lLCBCZWF0cmljZSwtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5UYWxrIHdpdGggYSBtYW4gb3V0IGF0IGEgd2luZG93ISBBIHByb3BlciBzYXlpbmchPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPk5heSwgYnV0LCBCZWF0cmljZSwtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5Td2VldCBIZXJvISBTaGUgaXMgd3JvbmdlZCwgc2hlIGlzIHNsYW5kZXJlZCwgc2hlIGlzIHVuZG9uZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QmVhdC0tPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlByaW5jZXMgYW5kIGNvdW50aWVzISBTdXJlbHksIGEgcHJpbmNlbHkgdGVzdGltb255LDwvTElORT4KKzxMSU5FPmEgZ29vZGx5IGNvdW50LCBDb3VudCBDb21mZWN0OyBhIHN3ZWV0IGdhbGxhbnQsPC9MSU5FPgorPExJTkU+c3VyZWx5ISBPIHRoYXQgSSB3ZXJlIGEgbWFuIGZvciBoaXMgc2FrZSEgb3IgdGhhdCBJPC9MSU5FPgorPExJTkU+aGFkIGFueSBmcmllbmQgd291bGQgYmUgYSBtYW4gZm9yIG15IHNha2UhIEJ1dDwvTElORT4KKzxMSU5FPm1hbmhvb2QgaXMgbWVsdGVkIGludG8gY291cnRlc2llcywgdmFsb3VyIGludG88L0xJTkU+Cis8TElORT5jb21wbGltZW50LCBhbmQgbWVuIGFyZSBvbmx5IHR1cm5lZCBpbnRvIHRvbmd1ZSwgYW5kPC9MSU5FPgorPExJTkU+dHJpbSBvbmVzIHRvbzogaGUgaXMgbm93IGFzIHZhbGlhbnQgYXMgSGVyY3VsZXM8L0xJTkU+Cis8TElORT50aGF0IG9ubHkgdGVsbHMgYSBsaWUgYW5kIHN3ZWFycyBpdC4gSSBjYW5ub3QgYmUgYTwvTElORT4KKzxMSU5FPm1hbiB3aXRoIHdpc2hpbmcsIHRoZXJlZm9yZSBJIHdpbGwgZGllIGEgd29tYW4gd2l0aCBncmlldmluZy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+VGFycnksIGdvb2QgQmVhdHJpY2UuIEJ5IHRoaXMgaGFuZCwgSSBsb3ZlIHRoZWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlVzZSBpdCBmb3IgbXkgbG92ZSBzb21lIG90aGVyIHdheSB0aGFuIHN3ZWFyaW5nIGJ5IGl0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGluayB5b3UgaW4geW91ciBzb3VsIHRoZSBDb3VudCBDbGF1ZGlvIGhhdGggd3JvbmdlZCBIZXJvPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5ZZWEsIGFzIHN1cmUgYXMgSSBoYXZlIGEgdGhvdWdodCBvciBhIHNvdWwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkVub3VnaCwgSSBhbSBlbmdhZ2VkOyBJIHdpbGwgY2hhbGxlbmdlIGhpbS4gSSB3aWxsPC9MSU5FPgorPExJTkU+a2lzcyB5b3VyIGhhbmQsIGFuZCBzbyBJIGxlYXZlIHlvdS4gQnkgdGhpcyBoYW5kLDwvTElORT4KKzxMSU5FPkNsYXVkaW8gc2hhbGwgcmVuZGVyIG1lIGEgZGVhciBhY2NvdW50LiBBcyB5b3U8L0xJTkU+Cis8TElORT5oZWFyIG9mIG1lLCBzbyB0aGluayBvZiBtZS4gR28sIGNvbWZvcnQgeW91cjwvTElORT4KKzxMSU5FPmNvdXNpbjogSSBtdXN0IHNheSBzaGUgaXMgZGVhZDogYW5kIHNvLCBmYXJld2VsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSUkuICBBIHByaXNvbi48L1RJVExFPgorPFNUQUdFRElSPkVudGVyIERPR0JFUlJZLCBWRVJHRVMsIGFuZCBTZXh0b24sIGluIGdvd25zOyBhbmQKK3RoZSBXYXRjaCwgd2l0aCBDT05SQURFIGFuZCBCT1JBQ0hJTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPklzIG91ciB3aG9sZSBkaXNzZW1ibHkgYXBwZWFyZWQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5PLCBhIHN0b29sIGFuZCBhIGN1c2hpb24gZm9yIHRoZSBzZXh0b24uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZXh0b248L1NQRUFLRVI+Cis8TElORT5XaGljaCBiZSB0aGUgbWFsZWZhY3RvcnM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPk1hcnJ5LCB0aGF0IGFtIEkgYW5kIG15IHBhcnRuZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5WRVJHRVM8L1NQRUFLRVI+Cis8TElORT5OYXksIHRoYXQncyBjZXJ0YWluOyB3ZSBoYXZlIHRoZSBleGhpYml0aW9uIHRvIGV4YW1pbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZXh0b248L1NQRUFLRVI+Cis8TElORT5CdXQgd2hpY2ggYXJlIHRoZSBvZmZlbmRlcnMgdGhhdCBhcmUgdG8gYmU8L0xJTkU+Cis8TElORT5leGFtaW5lZD8gbGV0IHRoZW0gY29tZSBiZWZvcmUgbWFzdGVyIGNvbnN0YWJsZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+WWVhLCBtYXJyeSwgbGV0IHRoZW0gY29tZSBiZWZvcmUgbWUuIFdoYXQgaXMgeW91cjwvTElORT4KKzxMSU5FPm5hbWUsIGZyaWVuZD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+Qm9yYWNoaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPlByYXksIHdyaXRlIGRvd24sIEJvcmFjaGlvLiBZb3Vycywgc2lycmFoPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q09OUkFERTwvU1BFQUtFUj4KKzxMSU5FPkkgYW0gYSBnZW50bGVtYW4sIHNpciwgYW5kIG15IG5hbWUgaXMgQ29ucmFkZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+V3JpdGUgZG93biwgbWFzdGVyIGdlbnRsZW1hbiBDb25yYWRlLiBNYXN0ZXJzLCBkbzwvTElORT4KKzxMSU5FPnlvdSBzZXJ2ZSBHb2Q/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5ZZWEsIHNpciwgd2UgaG9wZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+V3JpdGUgZG93biwgdGhhdCB0aGV5IGhvcGUgdGhleSBzZXJ2ZSBHb2Q6IGFuZDwvTElORT4KKzxMSU5FPndyaXRlIEdvZCBmaXJzdDsgZm9yIEdvZCBkZWZlbmQgYnV0IEdvZCBzaG91bGQgZ288L0xJTkU+Cis8TElORT5iZWZvcmUgc3VjaCB2aWxsYWlucyEgTWFzdGVycywgaXQgaXMgcHJvdmVkIGFscmVhZHk8L0xJTkU+Cis8TElORT50aGF0IHlvdSBhcmUgbGl0dGxlIGJldHRlciB0aGFuIGZhbHNlIGtuYXZlczsgYW5kIGl0PC9MSU5FPgorPExJTkU+d2lsbCBnbyBuZWFyIHRvIGJlIHRob3VnaHQgc28gc2hvcnRseS4gSG93IGFuc3dlcjwvTElORT4KKzxMSU5FPnlvdSBmb3IgeW91cnNlbHZlcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5NYXJyeSwgc2lyLCB3ZSBzYXkgd2UgYXJlIG5vbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkEgbWFydmVsbG91cyB3aXR0eSBmZWxsb3csIEkgYXNzdXJlIHlvdTogYnV0IEk8L0xJTkU+Cis8TElORT53aWxsIGdvIGFib3V0IHdpdGggaGltLiBDb21lIHlvdSBoaXRoZXIsIHNpcnJhaDsgYTwvTElORT4KKzxMSU5FPndvcmQgaW4geW91ciBlYXI6IHNpciwgSSBzYXkgdG8geW91LCBpdCBpcyB0aG91Z2h0PC9MSU5FPgorPExJTkU+eW91IGFyZSBmYWxzZSBrbmF2ZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPlNpciwgSSBzYXkgdG8geW91IHdlIGFyZSBub25lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5XZWxsLCBzdGFuZCBhc2lkZS4gJ0ZvcmUgR29kLCB0aGV5IGFyZSBib3RoIGluIGE8L0xJTkU+Cis8TElORT50YWxlLiBIYXZlIHlvdSB3cml0IGRvd24sIHRoYXQgdGhleSBhcmUgbm9uZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KKzxMSU5FPk1hc3RlciBjb25zdGFibGUsIHlvdSBnbyBub3QgdGhlIHdheSB0byBleGFtaW5lOjwvTElORT4KKzxMSU5FPnlvdSBtdXN0IGNhbGwgZm9ydGggdGhlIHdhdGNoIHRoYXQgYXJlIHRoZWlyIGFjY3VzZXJzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5ZZWEsIG1hcnJ5LCB0aGF0J3MgdGhlIGVmdGVzdCB3YXkuIExldCB0aGUgd2F0Y2g8L0xJTkU+Cis8TElORT5jb21lIGZvcnRoLiBNYXN0ZXJzLCBJIGNoYXJnZSB5b3UsIGluIHRoZSBwcmluY2UnczwvTElORT4KKzxMSU5FPm5hbWUsIGFjY3VzZSB0aGVzZSBtZW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5GaXJzdCBXYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPlRoaXMgbWFuIHNhaWQsIHNpciwgdGhhdCBEb24gSm9obiwgdGhlIHByaW5jZSdzPC9MSU5FPgorPExJTkU+YnJvdGhlciwgd2FzIGEgdmlsbGFpbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+V3JpdGUgZG93biBQcmluY2UgSm9obiBhIHZpbGxhaW4uIFdoeSwgdGhpcyBpcyBmbGF0PC9MSU5FPgorPExJTkU+cGVyanVyeSwgdG8gY2FsbCBhIHByaW5jZSdzIGJyb3RoZXIgdmlsbGFpbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+TWFzdGVyIGNvbnN0YWJsZSwtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5QcmF5IHRoZWUsIGZlbGxvdywgcGVhY2U6IEkgZG8gbm90IGxpa2UgdGh5IGxvb2ssPC9MSU5FPgorPExJTkU+SSBwcm9taXNlIHRoZWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZXh0b248L1NQRUFLRVI+Cis8TElORT5XaGF0IGhlYXJkIHlvdSBoaW0gc2F5IGVsc2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZWNvbmQgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5NYXJyeSwgdGhhdCBoZSBoYWQgcmVjZWl2ZWQgYSB0aG91c2FuZCBkdWNhdHMgb2Y8L0xJTkU+Cis8TElORT5Eb24gSm9obiBmb3IgYWNjdXNpbmcgdGhlIExhZHkgSGVybyB3cm9uZ2Z1bGx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5GbGF0IGJ1cmdsYXJ5IGFzIGV2ZXIgd2FzIGNvbW1pdHRlZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPlllYSwgYnkgbWFzcywgdGhhdCBpdCBpcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlNleHRvbjwvU1BFQUtFUj4KKzxMSU5FPldoYXQgZWxzZSwgZmVsbG93PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Rmlyc3QgV2F0Y2htYW48L1NQRUFLRVI+Cis8TElORT5BbmQgdGhhdCBDb3VudCBDbGF1ZGlvIGRpZCBtZWFuLCB1cG9uIGhpcyB3b3JkcywgdG88L0xJTkU+Cis8TElORT5kaXNncmFjZSBIZXJvIGJlZm9yZSB0aGUgd2hvbGUgYXNzZW1ibHkuIGFuZCBub3QgbWFycnkgaGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5PIHZpbGxhaW4hIHRob3Ugd2lsdCBiZSBjb25kZW1uZWQgaW50byBldmVybGFzdGluZzwvTElORT4KKzxMSU5FPnJlZGVtcHRpb24gZm9yIHRoaXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5TZXh0b248L1NQRUFLRVI+Cis8TElORT5XaGF0IGVsc2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5XYXRjaG1hbjwvU1BFQUtFUj4KKzxMSU5FPlRoaXMgaXMgYWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+U2V4dG9uPC9TUEVBS0VSPgorPExJTkU+QW5kIHRoaXMgaXMgbW9yZSwgbWFzdGVycywgdGhhbiB5b3UgY2FuIGRlbnkuPC9MSU5FPgorPExJTkU+UHJpbmNlIEpvaG4gaXMgdGhpcyBtb3JuaW5nIHNlY3JldGx5IHN0b2xlbiBhd2F5OzwvTElORT4KKzxMSU5FPkhlcm8gd2FzIGluIHRoaXMgbWFubmVyIGFjY3VzZWQsIGluIHRoaXMgdmVyeSBtYW5uZXI8L0xJTkU+Cis8TElORT5yZWZ1c2VkLCBhbmQgdXBvbiB0aGUgZ3JpZWYgb2YgdGhpcyBzdWRkZW5seSBkaWVkLjwvTElORT4KKzxMSU5FPk1hc3RlciBjb25zdGFibGUsIGxldCB0aGVzZSBtZW4gYmUgYm91bmQsIGFuZDwvTElORT4KKzxMSU5FPmJyb3VnaHQgdG8gTGVvbmF0bydzOiBJIHdpbGwgZ28gYmVmb3JlIGFuZCBzaG93PC9MSU5FPgorPExJTkU+aGltIHRoZWlyIGV4YW1pbmF0aW9uLjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FeGl0PC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgbGV0IHRoZW0gYmUgb3BpbmlvbmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+VkVSR0VTPC9TUEVBS0VSPgorPExJTkU+TGV0IHRoZW0gYmUgaW4gdGhlIGhhbmRzLS08L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNPTlJBREU8L1NQRUFLRVI+Cis8TElORT5PZmYsIGNveGNvbWIhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkdvZCdzIG15IGxpZmUsIHdoZXJlJ3MgdGhlIHNleHRvbj8gbGV0IGhpbSB3cml0ZTwvTElORT4KKzxMSU5FPmRvd24gdGhlIHByaW5jZSdzIG9mZmljZXIgY294Y29tYi4gQ29tZSwgYmluZCB0aGVtLjwvTElORT4KKzxMSU5FPlRob3UgbmF1Z2h0eSB2YXJsZXQhPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DT05SQURFPC9TUEVBS0VSPgorPExJTkU+QXdheSEgeW91IGFyZSBhbiBhc3MsIHlvdSBhcmUgYW4gYXNzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5Eb3N0IHRob3Ugbm90IHN1c3BlY3QgbXkgcGxhY2U/IGRvc3QgdGhvdSBub3Q8L0xJTkU+Cis8TElORT5zdXNwZWN0IG15IHllYXJzPyBPIHRoYXQgaGUgd2VyZSBoZXJlIHRvIHdyaXRlIG1lPC9MSU5FPgorPExJTkU+ZG93biBhbiBhc3MhIEJ1dCwgbWFzdGVycywgcmVtZW1iZXIgdGhhdCBJIGFtIGFuPC9MSU5FPgorPExJTkU+YXNzOyB0aG91Z2ggaXQgYmUgbm90IHdyaXR0ZW4gZG93biwgeWV0IGZvcmdldCBub3Q8L0xJTkU+Cis8TElORT50aGF0IEkgYW0gYW4gYXNzLiBObywgdGhvdSB2aWxsYWluLCB0aG91IGFydCBmdWxsIG9mPC9MSU5FPgorPExJTkU+cGlldHksIGFzIHNoYWxsIGJlIHByb3ZlZCB1cG9uIHRoZWUgYnkgZ29vZCB3aXRuZXNzLjwvTElORT4KKzxMSU5FPkkgYW0gYSB3aXNlIGZlbGxvdywgYW5kLCB3aGljaCBpcyBtb3JlLCBhbiBvZmZpY2VyLDwvTElORT4KKzxMSU5FPmFuZCwgd2hpY2ggaXMgbW9yZSwgYSBob3VzZWhvbGRlciwgYW5kLCB3aGljaCBpczwvTElORT4KKzxMSU5FPm1vcmUsIGFzIHByZXR0eSBhIHBpZWNlIG9mIGZsZXNoIGFzIGFueSBpcyBpbjwvTElORT4KKzxMSU5FPk1lc3NpbmEsIGFuZCBvbmUgdGhhdCBrbm93cyB0aGUgbGF3LCBnbyB0bzsgYW5kIGE8L0xJTkU+Cis8TElORT5yaWNoIGZlbGxvdyBlbm91Z2gsIGdvIHRvOyBhbmQgYSBmZWxsb3cgdGhhdCBoYXRoPC9MSU5FPgorPExJTkU+aGFkIGxvc3NlcywgYW5kIG9uZSB0aGF0IGhhdGggdHdvIGdvd25zIGFuZCBldmVyeTwvTElORT4KKzxMSU5FPnRoaW5nIGhhbmRzb21lIGFib3V0IGhpbS4gQnJpbmcgaGltIGF3YXkuIE8gdGhhdDwvTElORT4KKzxMSU5FPkkgaGFkIGJlZW4gd3JpdCBkb3duIGFuIGFzcyE8L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzwvQUNUPgorCis8QUNUPjxUSVRMRT5BQ1QgVjwvVElUTEU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSS4gIEJlZm9yZSBMRU9OQVRPJ1MgaG91c2UuPC9USVRMRT4KKzxTVEFHRURJUj5FbnRlciBMRU9OQVRPIGFuZCBBTlRPTklPPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5JZiB5b3UgZ28gb24gdGh1cywgeW91IHdpbGwga2lsbCB5b3Vyc2VsZjo8L0xJTkU+Cis8TElORT5BbmQgJ3RpcyBub3Qgd2lzZG9tIHRodXMgdG8gc2Vjb25kIGdyaWVmPC9MSU5FPgorPExJTkU+QWdhaW5zdCB5b3Vyc2VsZi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIHByYXkgdGhlZSwgY2Vhc2UgdGh5IGNvdW5zZWwsPC9MSU5FPgorPExJTkU+V2hpY2ggZmFsbHMgaW50byBtaW5lIGVhcnMgYXMgcHJvZml0bGVzczwvTElORT4KKzxMSU5FPkFzIHdhdGVyIGluIGEgc2lldmU6IGdpdmUgbm90IG1lIGNvdW5zZWw7PC9MSU5FPgorPExJTkU+Tm9yIGxldCBubyBjb21mb3J0ZXIgZGVsaWdodCBtaW5lIGVhcjwvTElORT4KKzxMSU5FPkJ1dCBzdWNoIGEgb25lIHdob3NlIHdyb25ncyBkbyBzdWl0IHdpdGggbWluZS48L0xJTkU+Cis8TElORT5CcmluZyBtZSBhIGZhdGhlciB0aGF0IHNvIGxvdmVkIGhpcyBjaGlsZCw8L0xJTkU+Cis8TElORT5XaG9zZSBqb3kgb2YgaGVyIGlzIG92ZXJ3aGVsbSdkIGxpa2UgbWluZSw8L0xJTkU+Cis8TElORT5BbmQgYmlkIGhpbSBzcGVhayBvZiBwYXRpZW5jZTs8L0xJTkU+Cis8TElORT5NZWFzdXJlIGhpcyB3b2UgdGhlIGxlbmd0aCBhbmQgYnJlYWR0aCBvZiBtaW5lPC9MSU5FPgorPExJTkU+QW5kIGxldCBpdCBhbnN3ZXIgZXZlcnkgc3RyYWluIGZvciBzdHJhaW4sPC9MSU5FPgorPExJTkU+QXMgdGh1cyBmb3IgdGh1cyBhbmQgc3VjaCBhIGdyaWVmIGZvciBzdWNoLDwvTElORT4KKzxMSU5FPkluIGV2ZXJ5IGxpbmVhbWVudCwgYnJhbmNoLCBzaGFwZSwgYW5kIGZvcm06PC9MSU5FPgorPExJTkU+SWYgc3VjaCBhIG9uZSB3aWxsIHNtaWxlIGFuZCBzdHJva2UgaGlzIGJlYXJkLDwvTElORT4KKzxMSU5FPkJpZCBzb3Jyb3cgd2FnLCBjcnkgJ2hlbSEnIHdoZW4gaGUgc2hvdWxkIGdyb2FuLDwvTElORT4KKzxMSU5FPlBhdGNoIGdyaWVmIHdpdGggcHJvdmVyYnMsIG1ha2UgbWlzZm9ydHVuZSBkcnVuazwvTElORT4KKzxMSU5FPldpdGggY2FuZGxlLXdhc3RlcnM7IGJyaW5nIGhpbSB5ZXQgdG8gbWUsPC9MSU5FPgorPExJTkU+QW5kIEkgb2YgaGltIHdpbGwgZ2F0aGVyIHBhdGllbmNlLjwvTElORT4KKzxMSU5FPkJ1dCB0aGVyZSBpcyBubyBzdWNoIG1hbjogZm9yLCBicm90aGVyLCBtZW48L0xJTkU+Cis8TElORT5DYW4gY291bnNlbCBhbmQgc3BlYWsgY29tZm9ydCB0byB0aGF0IGdyaWVmPC9MSU5FPgorPExJTkU+V2hpY2ggdGhleSB0aGVtc2VsdmVzIG5vdCBmZWVsOyBidXQsIHRhc3RpbmcgaXQsPC9MSU5FPgorPExJTkU+VGhlaXIgY291bnNlbCB0dXJucyB0byBwYXNzaW9uLCB3aGljaCBiZWZvcmU8L0xJTkU+Cis8TElORT5Xb3VsZCBnaXZlIHByZWNlcHRpYWwgbWVkaWNpbmUgdG8gcmFnZSw8L0xJTkU+Cis8TElORT5GZXR0ZXIgc3Ryb25nIG1hZG5lc3MgaW4gYSBzaWxrZW4gdGhyZWFkLDwvTElORT4KKzxMSU5FPkNoYXJtIGFjaGUgd2l0aCBhaXIgYW5kIGFnb255IHdpdGggd29yZHM6PC9MSU5FPgorPExJTkU+Tm8sIG5vOyAndGlzIGFsbCBtZW4ncyBvZmZpY2UgdG8gc3BlYWsgcGF0aWVuY2U8L0xJTkU+Cis8TElORT5UbyB0aG9zZSB0aGF0IHdyaW5nIHVuZGVyIHRoZSBsb2FkIG9mIHNvcnJvdyw8L0xJTkU+Cis8TElORT5CdXQgbm8gbWFuJ3MgdmlydHVlIG5vciBzdWZmaWNpZW5jeTwvTElORT4KKzxMSU5FPlRvIGJlIHNvIG1vcmFsIHdoZW4gaGUgc2hhbGwgZW5kdXJlPC9MSU5FPgorPExJTkU+VGhlIGxpa2UgaGltc2VsZi4gVGhlcmVmb3JlIGdpdmUgbWUgbm8gY291bnNlbDo8L0xJTkU+Cis8TElORT5NeSBncmllZnMgY3J5IGxvdWRlciB0aGFuIGFkdmVydGlzZW1lbnQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+VGhlcmVpbiBkbyBtZW4gZnJvbSBjaGlsZHJlbiBub3RoaW5nIGRpZmZlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIHByYXkgdGhlZSwgcGVhY2UuIEkgd2lsbCBiZSBmbGVzaCBhbmQgYmxvb2Q7PC9MSU5FPgorPExJTkU+Rm9yIHRoZXJlIHdhcyBuZXZlciB5ZXQgcGhpbG9zb3BoZXI8L0xJTkU+Cis8TElORT5UaGF0IGNvdWxkIGVuZHVyZSB0aGUgdG9vdGhhY2hlIHBhdGllbnRseSw8L0xJTkU+Cis8TElORT5Ib3dldmVyIHRoZXkgaGF2ZSB3cml0IHRoZSBzdHlsZSBvZiBnb2RzPC9MSU5FPgorPExJTkU+QW5kIG1hZGUgYSBwdXNoIGF0IGNoYW5jZSBhbmQgc3VmZmVyYW5jZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5ZZXQgYmVuZCBub3QgYWxsIHRoZSBoYXJtIHVwb24geW91cnNlbGY7PC9MSU5FPgorPExJTkU+TWFrZSB0aG9zZSB0aGF0IGRvIG9mZmVuZCB5b3Ugc3VmZmVyIHRvby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5UaGVyZSB0aG91IHNwZWFrJ3N0IHJlYXNvbjogbmF5LCBJIHdpbGwgZG8gc28uPC9MSU5FPgorPExJTkU+TXkgc291bCBkb3RoIHRlbGwgbWUgSGVybyBpcyBiZWxpZWQ7PC9MSU5FPgorPExJTkU+QW5kIHRoYXQgc2hhbGwgQ2xhdWRpbyBrbm93OyBzbyBzaGFsbCB0aGUgcHJpbmNlPC9MSU5FPgorPExJTkU+QW5kIGFsbCBvZiB0aGVtIHRoYXQgdGh1cyBkaXNob25vdXIgaGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkhlcmUgY29tZXMgdGhlIHByaW5jZSBhbmQgQ2xhdWRpbyBoYXN0aWx5LjwvTElORT4KKzwvU1BFRUNIPgorCisKKzxTVEFHRURJUj5FbnRlciBET04gUEVEUk8gYW5kIENMQVVESU88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+R29vZCBkZW4sIGdvb2QgZGVuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkdvb2QgZGF5IHRvIGJvdGggb2YgeW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkhlYXIgeW91LiBteSBsb3JkcywtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+V2UgaGF2ZSBzb21lIGhhc3RlLCBMZW9uYXRvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlNvbWUgaGFzdGUsIG15IGxvcmQhIHdlbGwsIGZhcmUgeW91IHdlbGwsIG15IGxvcmQ6PC9MSU5FPgorPExJTkU+QXJlIHlvdSBzbyBoYXN0eSBub3c/IHdlbGwsIGFsbCBpcyBvbmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5OYXksIGRvIG5vdCBxdWFycmVsIHdpdGggdXMsIGdvb2Qgb2xkIG1hbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5JZiBoZSBjb3VsZCByaWdodCBoaW1zZWxmIHdpdGggcXVhcnJlbGluZyw8L0xJTkU+Cis8TElORT5Tb21lIG9mIHVzIHdvdWxkIGxpZSBsb3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+V2hvIHdyb25ncyBoaW0/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+TWFycnksIHRob3UgZG9zdCB3cm9uZyBtZTsgdGhvdSBkaXNzZW1ibGVyLCB0aG91Oi0tPC9MSU5FPgorPExJTkU+TmF5LCBuZXZlciBsYXkgdGh5IGhhbmQgdXBvbiB0aHkgc3dvcmQ7PC9MSU5FPgorPExJTkU+SSBmZWFyIHRoZWUgbm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk1hcnJ5LCBiZXNocmV3IG15IGhhbmQsPC9MSU5FPgorPExJTkU+SWYgaXQgc2hvdWxkIGdpdmUgeW91ciBhZ2Ugc3VjaCBjYXVzZSBvZiBmZWFyOjwvTElORT4KKzxMSU5FPkluIGZhaXRoLCBteSBoYW5kIG1lYW50IG5vdGhpbmcgdG8gbXkgc3dvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+VHVzaCwgdHVzaCwgbWFuOyBuZXZlciBmbGVlciBhbmQgamVzdCBhdCBtZTo8L0xJTkU+Cis8TElORT5JIHNwZWFrIG5vdCBsaWtlIGEgZG90YXJkIG5vciBhIGZvb2wsPC9MSU5FPgorPExJTkU+QXMgdW5kZXIgcHJpdmlsZWdlIG9mIGFnZSB0byBicmFnPC9MSU5FPgorPExJTkU+V2hhdCBJIGhhdmUgZG9uZSBiZWluZyB5b3VuZywgb3Igd2hhdCB3b3VsZCBkbzwvTElORT4KKzxMSU5FPldlcmUgSSBub3Qgb2xkLiBLbm93LCBDbGF1ZGlvLCB0byB0aHkgaGVhZCw8L0xJTkU+Cis8TElORT5UaG91IGhhc3Qgc28gd3JvbmcnZCBtaW5lIGlubm9jZW50IGNoaWxkIGFuZCBtZTwvTElORT4KKzxMSU5FPlRoYXQgSSBhbSBmb3JjZWQgdG8gbGF5IG15IHJldmVyZW5jZSBieTwvTElORT4KKzxMSU5FPkFuZCwgd2l0aCBncmV5IGhhaXJzIGFuZCBicnVpc2Ugb2YgbWFueSBkYXlzLDwvTElORT4KKzxMSU5FPkRvIGNoYWxsZW5nZSB0aGVlIHRvIHRyaWFsIG9mIGEgbWFuLjwvTElORT4KKzxMSU5FPkkgc2F5IHRob3UgaGFzdCBiZWxpZWQgbWluZSBpbm5vY2VudCBjaGlsZDs8L0xJTkU+Cis8TElORT5UaHkgc2xhbmRlciBoYXRoIGdvbmUgdGhyb3VnaCBhbmQgdGhyb3VnaCBoZXIgaGVhcnQsPC9MSU5FPgorPExJTkU+QW5kIHNoZSBsaWVzIGJ1cmllZCB3aXRoIGhlciBhbmNlc3RvcnM7PC9MSU5FPgorPExJTkU+TywgaW4gYSB0b21iIHdoZXJlIG5ldmVyIHNjYW5kYWwgc2xlcHQsPC9MSU5FPgorPExJTkU+U2F2ZSB0aGlzIG9mIGhlcnMsIGZyYW1lZCBieSB0aHkgdmlsbGFueSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5NeSB2aWxsYW55PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlRoaW5lLCBDbGF1ZGlvOyB0aGluZSwgSSBzYXkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Zb3Ugc2F5IG5vdCByaWdodCwgb2xkIG1hbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5NeSBsb3JkLCBteSBsb3JkLDwvTElORT4KKzxMSU5FPkknbGwgcHJvdmUgaXQgb24gaGlzIGJvZHksIGlmIGhlIGRhcmUsPC9MSU5FPgorPExJTkU+RGVzcGl0ZSBoaXMgbmljZSBmZW5jZSBhbmQgaGlzIGFjdGl2ZSBwcmFjdGlzZSw8L0xJTkU+Cis8TElORT5IaXMgTWF5IG9mIHlvdXRoIGFuZCBibG9vbSBvZiBsdXN0aWhvb2QuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QXdheSEgSSB3aWxsIG5vdCBoYXZlIHRvIGRvIHdpdGggeW91LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkNhbnN0IHRob3Ugc28gZGFmZiBtZT8gVGhvdSBoYXN0IGtpbGwnZCBteSBjaGlsZDo8L0xJTkU+Cis8TElORT5JZiB0aG91IGtpbGwnc3QgbWUsIGJveSwgdGhvdSBzaGFsdCBraWxsIGEgbWFuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkhlIHNoYWxsIGtpbGwgdHdvIG9mIHVzLCBhbmQgbWVuIGluZGVlZDo8L0xJTkU+Cis8TElORT5CdXQgdGhhdCdzIG5vIG1hdHRlcjsgbGV0IGhpbSBraWxsIG9uZSBmaXJzdDs8L0xJTkU+Cis8TElORT5XaW4gbWUgYW5kIHdlYXIgbWU7IGxldCBoaW0gYW5zd2VyIG1lLjwvTElORT4KKzxMSU5FPkNvbWUsIGZvbGxvdyBtZSwgYm95OyBjb21lLCBzaXIgYm95LCBjb21lLCBmb2xsb3cgbWU6PC9MSU5FPgorPExJTkU+U2lyIGJveSwgSSdsbCB3aGlwIHlvdSBmcm9tIHlvdXIgZm9pbmluZyBmZW5jZTs8L0xJTkU+Cis8TElORT5OYXksIGFzIEkgYW0gYSBnZW50bGVtYW4sIEkgd2lsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Ccm90aGVyLC0tPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+Q29udGVudCB5b3Vyc2VsZi4gR29kIGtub3dzIEkgbG92ZWQgbXkgbmllY2U7PC9MSU5FPgorPExJTkU+QW5kIHNoZSBpcyBkZWFkLCBzbGFuZGVyJ2QgdG8gZGVhdGggYnkgdmlsbGFpbnMsPC9MSU5FPgorPExJTkU+VGhhdCBkYXJlIGFzIHdlbGwgYW5zd2VyIGEgbWFuIGluZGVlZDwvTElORT4KKzxMSU5FPkFzIEkgZGFyZSB0YWtlIGEgc2VycGVudCBieSB0aGUgdG9uZ3VlOjwvTElORT4KKzxMSU5FPkJveXMsIGFwZXMsIGJyYWdnYXJ0cywgSmFja3MsIG1pbGtzb3BzITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkJyb3RoZXIgQW50b255LC0tPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+SG9sZCB5b3UgY29udGVudC4gV2hhdCwgbWFuISBJIGtub3cgdGhlbSwgeWVhLDwvTElORT4KKzxMSU5FPkFuZCB3aGF0IHRoZXkgd2VpZ2gsIGV2ZW4gdG8gdGhlIHV0bW9zdCBzY3J1cGxlLC0tPC9MSU5FPgorPExJTkU+U2NyYW1ibGluZywgb3V0LWZhY2luZywgZmFzaGlvbi1tb25naW5nIGJveXMsPC9MSU5FPgorPExJTkU+VGhhdCBsaWUgYW5kIGNvZyBhbmQgZmxvdXQsIGRlcHJhdmUgYW5kIHNsYW5kZXIsPC9MSU5FPgorPExJTkU+R28gYW50aWNseSwgc2hvdyBvdXR3YXJkIGhpZGVvdXNuZXNzLDwvTElORT4KKzxMSU5FPkFuZCBzcGVhayBvZmYgaGFsZiBhIGRvemVuIGRhbmdlcm91cyB3b3Jkcyw8L0xJTkU+Cis8TElORT5Ib3cgdGhleSBtaWdodCBodXJ0IHRoZWlyIGVuZW1pZXMsIGlmIHRoZXkgZHVyc3Q7PC9MSU5FPgorPExJTkU+QW5kIHRoaXMgaXMgYWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkJ1dCwgYnJvdGhlciBBbnRvbnksLS08L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkFOVE9OSU88L1NQRUFLRVI+Cis8TElORT5Db21lLCAndGlzIG5vIG1hdHRlcjo8L0xJTkU+Cis8TElORT5EbyBub3QgeW91IG1lZGRsZTsgbGV0IG1lIGRlYWwgaW4gdGhpcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkdlbnRsZW1lbiBib3RoLCB3ZSB3aWxsIG5vdCB3YWtlIHlvdXIgcGF0aWVuY2UuPC9MSU5FPgorPExJTkU+TXkgaGVhcnQgaXMgc29ycnkgZm9yIHlvdXIgZGF1Z2h0ZXIncyBkZWF0aDo8L0xJTkU+Cis8TElORT5CdXQsIG9uIG15IGhvbm91ciwgc2hlIHdhcyBjaGFyZ2VkIHdpdGggbm90aGluZzwvTElORT4KKzxMSU5FPkJ1dCB3aGF0IHdhcyB0cnVlIGFuZCB2ZXJ5IGZ1bGwgb2YgcHJvb2YuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+TXkgbG9yZCwgbXkgbG9yZCwtLTwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SSB3aWxsIG5vdCBoZWFyIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Obz8gQ29tZSwgYnJvdGhlcjsgYXdheSEgSSB3aWxsIGJlIGhlYXJkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBzaGFsbCwgb3Igc29tZSBvZiB1cyB3aWxsIHNtYXJ0IGZvciBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RXhldW50IExFT05BVE8gYW5kIEFOVE9OSU88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+U2VlLCBzZWU7IGhlcmUgY29tZXMgdGhlIG1hbiB3ZSB3ZW50IHRvIHNlZWsuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIEJFTkVESUNLPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Ob3csIHNpZ25pb3IsIHdoYXQgbmV3cz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+R29vZCBkYXksIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XZWxjb21lLCBzaWduaW9yOiB5b3UgYXJlIGFsbW9zdCBjb21lIHRvIHBhcnQ8L0xJTkU+Cis8TElORT5hbG1vc3QgYSBmcmF5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPldlIGhhZCBsaWtlIHRvIGhhdmUgaGFkIG91ciB0d28gbm9zZXMgc25hcHBlZCBvZmY8L0xJTkU+Cis8TElORT53aXRoIHR3byBvbGQgbWVuIHdpdGhvdXQgdGVldGguPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5MZW9uYXRvIGFuZCBoaXMgYnJvdGhlci4gV2hhdCB0aGlua2VzdCB0aG91PyBIYWQ8L0xJTkU+Cis8TElORT53ZSBmb3VnaHQsIEkgZG91YnQgd2Ugc2hvdWxkIGhhdmUgYmVlbiB0b28geW91bmcgZm9yIHRoZW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkluIGEgZmFsc2UgcXVhcnJlbCB0aGVyZSBpcyBubyB0cnVlIHZhbG91ci4gSSBjYW1lPC9MSU5FPgorPExJTkU+dG8gc2VlayB5b3UgYm90aC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5XZSBoYXZlIGJlZW4gdXAgYW5kIGRvd24gdG8gc2VlayB0aGVlOyBmb3Igd2UgYXJlPC9MSU5FPgorPExJTkU+aGlnaC1wcm9vZiBtZWxhbmNob2x5IGFuZCB3b3VsZCBmYWluIGhhdmUgaXQgYmVhdGVuPC9MSU5FPgorPExJTkU+YXdheS4gV2lsdCB0aG91IHVzZSB0aHkgd2l0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JdCBpcyBpbiBteSBzY2FiYmFyZDogc2hhbGwgSSBkcmF3IGl0PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+RG9zdCB0aG91IHdlYXIgdGh5IHdpdCBieSB0aHkgc2lkZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5OZXZlciBhbnkgZGlkIHNvLCB0aG91Z2ggdmVyeSBtYW55IGhhdmUgYmVlbiBiZXNpZGU8L0xJTkU+Cis8TElORT50aGVpciB3aXQuIEkgd2lsbCBiaWQgdGhlZSBkcmF3LCBhcyB3ZSBkbyB0aGU8L0xJTkU+Cis8TElORT5taW5zdHJlbHM7IGRyYXcsIHRvIHBsZWFzdXJlIHVzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QXMgSSBhbSBhbiBob25lc3QgbWFuLCBoZSBsb29rcyBwYWxlLiBBcnQgdGhvdTwvTElORT4KKzxMSU5FPnNpY2ssIG9yIGFuZ3J5PzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPldoYXQsIGNvdXJhZ2UsIG1hbiEgV2hhdCB0aG91Z2ggY2FyZSBraWxsZWQgYSBjYXQsPC9MSU5FPgorPExJTkU+dGhvdSBoYXN0IG1ldHRsZSBlbm91Z2ggaW4gdGhlZSB0byBraWxsIGNhcmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlNpciwgSSBzaGFsbCBtZWV0IHlvdXIgd2l0IGluIHRoZSBjYXJlZXIsIGFuZCB5b3U8L0xJTkU+Cis8TElORT5jaGFyZ2UgaXQgYWdhaW5zdCBtZS4gSSBwcmF5IHlvdSBjaG9vc2UgYW5vdGhlciBzdWJqZWN0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPk5heSwgdGhlbiwgZ2l2ZSBoaW0gYW5vdGhlciBzdGFmZjogdGhpcyBsYXN0IHdhczwvTElORT4KKzxMSU5FPmJyb2tlIGNyb3NzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+QnkgdGhpcyBsaWdodCwgaGUgY2hhbmdlcyBtb3JlIGFuZCBtb3JlOiBJIHRoaW5rPC9MSU5FPgorPExJTkU+aGUgYmUgYW5ncnkgaW5kZWVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklmIGhlIGJlLCBoZSBrbm93cyBob3cgdG8gdHVybiBoaXMgZ2lyZGxlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5TaGFsbCBJIHNwZWFrIGEgd29yZCBpbiB5b3VyIGVhcj88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Hb2QgYmxlc3MgbWUgZnJvbSBhIGNoYWxsZW5nZSE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+PFNUQUdFRElSPkFzaWRlIHRvIENMQVVESU88L1NUQUdFRElSPiAgWW91IGFyZSBhIHZpbGxhaW47IEkgamVzdCBub3Q6PC9MSU5FPgorPExJTkU+SSB3aWxsIG1ha2UgaXQgZ29vZCBob3cgeW91IGRhcmUsIHdpdGggd2hhdCB5b3U8L0xJTkU+Cis8TElORT5kYXJlLCBhbmQgd2hlbiB5b3UgZGFyZS4gRG8gbWUgcmlnaHQsIG9yIEkgd2lsbDwvTElORT4KKzxMSU5FPnByb3Rlc3QgeW91ciBjb3dhcmRpY2UuIFlvdSBoYXZlIGtpbGxlZCBhIHN3ZWV0PC9MSU5FPgorPExJTkU+bGFkeSwgYW5kIGhlciBkZWF0aCBzaGFsbCBmYWxsIGhlYXZ5IG9uIHlvdS4gTGV0IG1lPC9MSU5FPgorPExJTkU+aGVhciBmcm9tIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5XZWxsLCBJIHdpbGwgbWVldCB5b3UsIHNvIEkgbWF5IGhhdmUgZ29vZCBjaGVlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldoYXQsIGEgZmVhc3QsIGEgZmVhc3Q/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SScgZmFpdGgsIEkgdGhhbmsgaGltOyBoZSBoYXRoIGJpZCBtZSB0byBhIGNhbGYnczwvTElORT4KKzxMSU5FPmhlYWQgYW5kIGEgY2Fwb247IHRoZSB3aGljaCBpZiBJIGRvIG5vdCBjYXJ2ZSBtb3N0PC9MSU5FPgorPExJTkU+Y3VyaW91c2x5LCBzYXkgbXkga25pZmUncyBuYXVnaHQuIFNoYWxsIEkgbm90IGZpbmQ8L0xJTkU+Cis8TElORT5hIHdvb2Rjb2NrIHRvbz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+U2lyLCB5b3VyIHdpdCBhbWJsZXMgd2VsbDsgaXQgZ29lcyBlYXNpbHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5JJ2xsIHRlbGwgdGhlZSBob3cgQmVhdHJpY2UgcHJhaXNlZCB0aHkgd2l0IHRoZTwvTElORT4KKzxMSU5FPm90aGVyIGRheS4gSSBzYWlkLCB0aG91IGhhZHN0IGEgZmluZSB3aXQ6ICdUcnVlLCc8L0xJTkU+Cis8TElORT5zYWlkIHNoZSwgJ2EgZmluZSBsaXR0bGUgb25lLicgJ05vLCcgc2FpZCBJLCAnYTwvTElORT4KKzxMSU5FPmdyZWF0IHdpdDonICdSaWdodCwnIHNheXMgc2hlLCAnYSBncmVhdCBncm9zcyBvbmUuJzwvTElORT4KKzxMSU5FPidOYXksJyBzYWlkIEksICdhIGdvb2Qgd2l0OicgJ0p1c3QsJyBzYWlkIHNoZSwgJ2l0PC9MSU5FPgorPExJTkU+aHVydHMgbm9ib2R5LicgJ05heSwnIHNhaWQgSSwgJ3RoZSBnZW50bGVtYW48L0xJTkU+Cis8TElORT5pcyB3aXNlOicgJ0NlcnRhaW4sJyBzYWlkIHNoZSwgJ2Egd2lzZSBnZW50bGVtYW4uJzwvTElORT4KKzxMSU5FPidOYXksJyBzYWlkIEksICdoZSBoYXRoIHRoZSB0b25ndWVzOicgJ1RoYXQgSTwvTElORT4KKzxMSU5FPmJlbGlldmUsJyBzYWlkIHNoZSwgJ2ZvciBoZSBzd29yZSBhIHRoaW5nIHRvIG1lIG9uPC9MSU5FPgorPExJTkU+TW9uZGF5IG5pZ2h0LCB3aGljaCBoZSBmb3Jzd29yZSBvbiBUdWVzZGF5IG1vcm5pbmc7PC9MSU5FPgorPExJTkU+dGhlcmUncyBhIGRvdWJsZSB0b25ndWU7IHRoZXJlJ3MgdHdvIHRvbmd1ZXMuJyBUaHVzPC9MSU5FPgorPExJTkU+ZGlkIHNoZSwgYW4gaG91ciB0b2dldGhlciwgdHJhbnNzaGFwZSB0aHkgcGFydGljdWxhcjwvTElORT4KKzxMSU5FPnZpcnR1ZXM6IHlldCBhdCBsYXN0IHNoZSBjb25jbHVkZWQgd2l0aCBhIHNpZ2gsIHRob3U8L0xJTkU+Cis8TElORT53YXN0IHRoZSBwcm9wZXJlc3QgbWFuIGluIEl0YWx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkZvciB0aGUgd2hpY2ggc2hlIHdlcHQgaGVhcnRpbHkgYW5kIHNhaWQgc2hlIGNhcmVkPC9MSU5FPgorPExJTkU+bm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+WWVhLCB0aGF0IHNoZSBkaWQ6IGJ1dCB5ZXQsIGZvciBhbGwgdGhhdCwgYW4gaWYgc2hlPC9MSU5FPgorPExJTkU+ZGlkIG5vdCBoYXRlIGhpbSBkZWFkbHksIHNoZSB3b3VsZCBsb3ZlIGhpbSBkZWFybHk6PC9MSU5FPgorPExJTkU+dGhlIG9sZCBtYW4ncyBkYXVnaHRlciB0b2xkIHVzIGFsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5BbGwsIGFsbDsgYW5kLCBtb3Jlb3ZlciwgR29kIHNhdyBoaW0gd2hlbiBoZSB3YXM8L0xJTkU+Cis8TElORT5oaWQgaW4gdGhlIGdhcmRlbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkJ1dCB3aGVuIHNoYWxsIHdlIHNldCB0aGUgc2F2YWdlIGJ1bGwncyBob3JucyBvbjwvTElORT4KKzxMSU5FPnRoZSBzZW5zaWJsZSBCZW5lZGljaydzIGhlYWQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+WWVhLCBhbmQgdGV4dCB1bmRlcm5lYXRoLCAnSGVyZSBkd2VsbHMgQmVuZWRpY2sgdGhlPC9MSU5FPgorPExJTkU+bWFycmllZCBtYW4nPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5GYXJlIHlvdSB3ZWxsLCBib3k6IHlvdSBrbm93IG15IG1pbmQuIEkgd2lsbCBsZWF2ZTwvTElORT4KKzxMSU5FPnlvdSBub3cgdG8geW91ciBnb3NzaXAtbGlrZSBodW1vdXI6IHlvdSBicmVhayBqZXN0czwvTElORT4KKzxMSU5FPmFzIGJyYWdnYXJ0cyBkbyB0aGVpciBibGFkZXMsIHdoaWNoIEdvZCBiZSB0aGFua2VkLDwvTElORT4KKzxMSU5FPmh1cnQgbm90LiBNeSBsb3JkLCBmb3IgeW91ciBtYW55IGNvdXJ0ZXNpZXMgSSB0aGFuazwvTElORT4KKzxMSU5FPnlvdTogSSBtdXN0IGRpc2NvbnRpbnVlIHlvdXIgY29tcGFueTogeW91ciBicm90aGVyPC9MSU5FPgorPExJTkU+dGhlIGJhc3RhcmQgaXMgZmxlZCBmcm9tIE1lc3NpbmE6IHlvdSBoYXZlIGFtb25nPC9MSU5FPgorPExJTkU+eW91IGtpbGxlZCBhIHN3ZWV0IGFuZCBpbm5vY2VudCBsYWR5LiBGb3IgbXkgTG9yZDwvTElORT4KKzxMSU5FPkxhY2tiZWFyZCB0aGVyZSwgaGUgYW5kIEkgc2hhbGwgbWVldDogYW5kLCB0aWxsPC9MSU5FPgorPExJTkU+dGhlbiwgcGVhY2UgYmUgd2l0aCBoaW0uPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4aXQ8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SGUgaXMgaW4gZWFybmVzdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JbiBtb3N0IHByb2ZvdW5kIGVhcm5lc3Q7IGFuZCwgSSdsbCB3YXJyYW50IHlvdSwgZm9yPC9MSU5FPgorPExJTkU+dGhlIGxvdmUgb2YgQmVhdHJpY2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5BbmQgaGF0aCBjaGFsbGVuZ2VkIHRoZWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TW9zdCBzaW5jZXJlbHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaGF0IGEgcHJldHR5IHRoaW5nIG1hbiBpcyB3aGVuIGhlIGdvZXMgaW4gaGlzPC9MSU5FPgorPExJTkU+ZG91YmxldCBhbmQgaG9zZSBhbmQgbGVhdmVzIG9mZiBoaXMgd2l0ITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkhlIGlzIHRoZW4gYSBnaWFudCB0byBhbiBhcGU7IGJ1dCB0aGVuIGlzIGFuIGFwZSBhPC9MSU5FPgorPExJTkU+ZG9jdG9yIHRvIHN1Y2ggYSBtYW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5CdXQsIHNvZnQgeW91LCBsZXQgbWUgYmU6IHBsdWNrIHVwLCBteSBoZWFydCwgYW5kPC9MSU5FPgorPExJTkU+YmUgc2FkLiBEaWQgaGUgbm90IHNheSwgbXkgYnJvdGhlciB3YXMgZmxlZD88L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RW50ZXIgRE9HQkVSUlksIFZFUkdFUywgYW5kIHRoZSBXYXRjaCwgd2l0aCBDT05SQURFCithbmQgQk9SQUNISU88L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5Db21lIHlvdSwgc2lyOiBpZiBqdXN0aWNlIGNhbm5vdCB0YW1lIHlvdSwgc2hlPC9MSU5FPgorPExJTkU+c2hhbGwgbmUnZXIgd2VpZ2ggbW9yZSByZWFzb25zIGluIGhlciBiYWxhbmNlOiBuYXksPC9MSU5FPgorPExJTkU+YW4geW91IGJlIGEgY3Vyc2luZyBoeXBvY3JpdGUgb25jZSwgeW91IG11c3QgYmUgbG9va2VkIHRvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+SG93IG5vdz8gdHdvIG9mIG15IGJyb3RoZXIncyBtZW4gYm91bmQhIEJvcmFjaGlvPC9MSU5FPgorPExJTkU+b25lITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkhlYXJrZW4gYWZ0ZXIgdGhlaXIgb2ZmZW5jZSwgbXkgbG9yZC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPk9mZmljZXJzLCB3aGF0IG9mZmVuY2UgaGF2ZSB0aGVzZSBtZW4gZG9uZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+TWFycnksIHNpciwgdGhleSBoYXZlIGNvbW1pdHRlZCBmYWxzZSByZXBvcnQ7PC9MSU5FPgorPExJTkU+bW9yZW92ZXIsIHRoZXkgaGF2ZSBzcG9rZW4gdW50cnV0aHM7IHNlY29uZGFyaWx5LDwvTElORT4KKzxMSU5FPnRoZXkgYXJlIHNsYW5kZXJzOyBzaXh0aCBhbmQgbGFzdGx5LCB0aGV5IGhhdmU8L0xJTkU+Cis8TElORT5iZWxpZWQgYSBsYWR5OyB0aGlyZGx5LCB0aGV5IGhhdmUgdmVyaWZpZWQgdW5qdXN0PC9MSU5FPgorPExJTkU+dGhpbmdzOyBhbmQsIHRvIGNvbmNsdWRlLCB0aGV5IGFyZSBseWluZyBrbmF2ZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5GaXJzdCwgSSBhc2sgdGhlZSB3aGF0IHRoZXkgaGF2ZSBkb25lOyB0aGlyZGx5LCBJPC9MSU5FPgorPExJTkU+YXNrIHRoZWUgd2hhdCdzIHRoZWlyIG9mZmVuY2U7IHNpeHRoIGFuZCBsYXN0bHksIHdoeTwvTElORT4KKzxMSU5FPnRoZXkgYXJlIGNvbW1pdHRlZDsgYW5kLCB0byBjb25jbHVkZSwgd2hhdCB5b3UgbGF5PC9MSU5FPgorPExJTkU+dG8gdGhlaXIgY2hhcmdlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlJpZ2h0bHkgcmVhc29uZWQsIGFuZCBpbiBoaXMgb3duIGRpdmlzaW9uOiBhbmQsIGJ5PC9MSU5FPgorPExJTkU+bXkgdHJvdGgsIHRoZXJlJ3Mgb25lIG1lYW5pbmcgd2VsbCBzdWl0ZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5XaG8gaGF2ZSB5b3Ugb2ZmZW5kZWQsIG1hc3RlcnMsIHRoYXQgeW91IGFyZSB0aHVzPC9MSU5FPgorPExJTkU+Ym91bmQgdG8geW91ciBhbnN3ZXI/IHRoaXMgbGVhcm5lZCBjb25zdGFibGUgaXM8L0xJTkU+Cis8TElORT50b28gY3VubmluZyB0byBiZSB1bmRlcnN0b29kOiB3aGF0J3MgeW91ciBvZmZlbmNlPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5Td2VldCBwcmluY2UsIGxldCBtZSBnbyBubyBmYXJ0aGVyIHRvIG1pbmUgYW5zd2VyOjwvTElORT4KKzxMSU5FPmRvIHlvdSBoZWFyIG1lLCBhbmQgbGV0IHRoaXMgY291bnQga2lsbCBtZS4gSSBoYXZlPC9MSU5FPgorPExJTkU+ZGVjZWl2ZWQgZXZlbiB5b3VyIHZlcnkgZXllczogd2hhdCB5b3VyIHdpc2RvbXM8L0xJTkU+Cis8TElORT5jb3VsZCBub3QgZGlzY292ZXIsIHRoZXNlIHNoYWxsb3cgZm9vbHMgaGF2ZSBicm91Z2h0PC9MSU5FPgorPExJTkU+dG8gbGlnaHQ6IHdobyBpbiB0aGUgbmlnaHQgb3ZlcmhlYXJkIG1lIGNvbmZlc3Npbmc8L0xJTkU+Cis8TElORT50byB0aGlzIG1hbiBob3cgRG9uIEpvaG4geW91ciBicm90aGVyIGluY2Vuc2VkIG1lPC9MSU5FPgorPExJTkU+dG8gc2xhbmRlciB0aGUgTGFkeSBIZXJvLCBob3cgeW91IHdlcmUgYnJvdWdodCBpbnRvPC9MSU5FPgorPExJTkU+dGhlIG9yY2hhcmQgYW5kIHNhdyBtZSBjb3VydCBNYXJnYXJldCBpbiBIZXJvJ3M8L0xJTkU+Cis8TElORT5nYXJtZW50cywgaG93IHlvdSBkaXNncmFjZWQgaGVyLCB3aGVuIHlvdSBzaG91bGQ8L0xJTkU+Cis8TElORT5tYXJyeSBoZXI6IG15IHZpbGxhbnkgdGhleSBoYXZlIHVwb24gcmVjb3JkOyB3aGljaDwvTElORT4KKzxMSU5FPkkgaGFkIHJhdGhlciBzZWFsIHdpdGggbXkgZGVhdGggdGhhbiByZXBlYXQgb3ZlcjwvTElORT4KKzxMSU5FPnRvIG15IHNoYW1lLiBUaGUgbGFkeSBpcyBkZWFkIHVwb24gbWluZSBhbmQgbXk8L0xJTkU+Cis8TElORT5tYXN0ZXIncyBmYWxzZSBhY2N1c2F0aW9uOyBhbmQsIGJyaWVmbHksIEkgZGVzaXJlPC9MSU5FPgorPExJTkU+bm90aGluZyBidXQgdGhlIHJld2FyZCBvZiBhIHZpbGxhaW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5SdW5zIG5vdCB0aGlzIHNwZWVjaCBsaWtlIGlyb24gdGhyb3VnaCB5b3VyIGJsb29kPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkkgaGF2ZSBkcnVuayBwb2lzb24gd2hpbGVzIGhlIHV0dGVyJ2QgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5CdXQgZGlkIG15IGJyb3RoZXIgc2V0IHRoZWUgb24gdG8gdGhpcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+WWVhLCBhbmQgcGFpZCBtZSByaWNobHkgZm9yIHRoZSBwcmFjdGlzZSBvZiBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhlIGlzIGNvbXBvc2VkIGFuZCBmcmFtZWQgb2YgdHJlYWNoZXJ5OjwvTElORT4KKzxMSU5FPkFuZCBmbGVkIGhlIGlzIHVwb24gdGhpcyB2aWxsYW55LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPlN3ZWV0IEhlcm8hIG5vdyB0aHkgaW1hZ2UgZG90aCBhcHBlYXI8L0xJTkU+Cis8TElORT5JbiB0aGUgcmFyZSBzZW1ibGFuY2UgdGhhdCBJIGxvdmVkIGl0IGZpcnN0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9HQkVSUlk8L1NQRUFLRVI+Cis8TElORT5Db21lLCBicmluZyBhd2F5IHRoZSBwbGFpbnRpZmZzOiBieSB0aGlzIHRpbWUgb3VyPC9MSU5FPgorPExJTkU+c2V4dG9uIGhhdGggcmVmb3JtZWQgU2lnbmlvciBMZW9uYXRvIG9mIHRoZSBtYXR0ZXI6PC9MSU5FPgorPExJTkU+YW5kLCBtYXN0ZXJzLCBkbyBub3QgZm9yZ2V0IHRvIHNwZWNpZnksIHdoZW4gdGltZTwvTElORT4KKzxMSU5FPmFuZCBwbGFjZSBzaGFsbCBzZXJ2ZSwgdGhhdCBJIGFtIGFuIGFzcy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPlZFUkdFUzwvU1BFQUtFUj4KKzxMSU5FPkhlcmUsIGhlcmUgY29tZXMgbWFzdGVyIFNpZ25pb3IgTGVvbmF0bywgYW5kIHRoZTwvTElORT4KKzxMSU5FPlNleHRvbiB0b28uPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPlJlLWVudGVyIExFT05BVE8gYW5kIEFOVE9OSU8sIHdpdGggdGhlIFNleHRvbjwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2hpY2ggaXMgdGhlIHZpbGxhaW4/IGxldCBtZSBzZWUgaGlzIGV5ZXMsPC9MSU5FPgorPExJTkU+VGhhdCwgd2hlbiBJIG5vdGUgYW5vdGhlciBtYW4gbGlrZSBoaW0sPC9MSU5FPgorPExJTkU+SSBtYXkgYXZvaWQgaGltOiB3aGljaCBvZiB0aGVzZSBpcyBoZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJPUkFDSElPPC9TUEVBS0VSPgorPExJTkU+SWYgeW91IHdvdWxkIGtub3cgeW91ciB3cm9uZ2VyLCBsb29rIG9uIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkFydCB0aG91IHRoZSBzbGF2ZSB0aGF0IHdpdGggdGh5IGJyZWF0aCBoYXN0IGtpbGwnZDwvTElORT4KKzxMSU5FPk1pbmUgaW5ub2NlbnQgY2hpbGQ/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CT1JBQ0hJTzwvU1BFQUtFUj4KKzxMSU5FPlllYSwgZXZlbiBJIGFsb25lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk5vLCBub3Qgc28sIHZpbGxhaW47IHRob3UgYmVsaWVzdCB0aHlzZWxmOjwvTElORT4KKzxMSU5FPkhlcmUgc3RhbmQgYSBwYWlyIG9mIGhvbm91cmFibGUgbWVuOzwvTElORT4KKzxMSU5FPkEgdGhpcmQgaXMgZmxlZCwgdGhhdCBoYWQgYSBoYW5kIGluIGl0LjwvTElORT4KKzxMSU5FPkkgdGhhbmsgeW91LCBwcmluY2VzLCBmb3IgbXkgZGF1Z2h0ZXIncyBkZWF0aDo8L0xJTkU+Cis8TElORT5SZWNvcmQgaXQgd2l0aCB5b3VyIGhpZ2ggYW5kIHdvcnRoeSBkZWVkczo8L0xJTkU+Cis8TElORT4nVHdhcyBicmF2ZWx5IGRvbmUsIGlmIHlvdSBiZXRoaW5rIHlvdSBvZiBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JIGtub3cgbm90IGhvdyB0byBwcmF5IHlvdXIgcGF0aWVuY2U7PC9MSU5FPgorPExJTkU+WWV0IEkgbXVzdCBzcGVhay4gQ2hvb3NlIHlvdXIgcmV2ZW5nZSB5b3Vyc2VsZjs8L0xJTkU+Cis8TElORT5JbXBvc2UgbWUgdG8gd2hhdCBwZW5hbmNlIHlvdXIgaW52ZW50aW9uPC9MSU5FPgorPExJTkU+Q2FuIGxheSB1cG9uIG15IHNpbjogeWV0IHNpbm4nZCBJIG5vdDwvTElORT4KKzxMSU5FPkJ1dCBpbiBtaXN0YWtpbmcuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5CeSBteSBzb3VsLCBub3IgSTo8L0xJTkU+Cis8TElORT5BbmQgeWV0LCB0byBzYXRpc2Z5IHRoaXMgZ29vZCBvbGQgbWFuLDwvTElORT4KKzxMSU5FPkkgd291bGQgYmVuZCB1bmRlciBhbnkgaGVhdnkgd2VpZ2h0PC9MSU5FPgorPExJTkU+VGhhdCBoZSdsbCBlbmpvaW4gbWUgdG8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+SSBjYW5ub3QgYmlkIHlvdSBiaWQgbXkgZGF1Z2h0ZXIgbGl2ZTs8L0xJTkU+Cis8TElORT5UaGF0IHdlcmUgaW1wb3NzaWJsZTogYnV0LCBJIHByYXkgeW91IGJvdGgsPC9MSU5FPgorPExJTkU+UG9zc2VzcyB0aGUgcGVvcGxlIGluIE1lc3NpbmEgaGVyZTwvTElORT4KKzxMSU5FPkhvdyBpbm5vY2VudCBzaGUgZGllZDsgYW5kIGlmIHlvdXIgbG92ZTwvTElORT4KKzxMSU5FPkNhbiBsYWJvdXIgb3VnaHQgaW4gc2FkIGludmVudGlvbiw8L0xJTkU+Cis8TElORT5IYW5nIGhlciBhbiBlcGl0YXBoIHVwb24gaGVyIHRvbWI8L0xJTkU+Cis8TElORT5BbmQgc2luZyBpdCB0byBoZXIgYm9uZXMsIHNpbmcgaXQgdG8tbmlnaHQ6PC9MSU5FPgorPExJTkU+VG8tbW9ycm93IG1vcm5pbmcgY29tZSB5b3UgdG8gbXkgaG91c2UsPC9MSU5FPgorPExJTkU+QW5kIHNpbmNlIHlvdSBjb3VsZCBub3QgYmUgbXkgc29uLWluLWxhdyw8L0xJTkU+Cis8TElORT5CZSB5ZXQgbXkgbmVwaGV3OiBteSBicm90aGVyIGhhdGggYSBkYXVnaHRlciw8L0xJTkU+Cis8TElORT5BbG1vc3QgdGhlIGNvcHkgb2YgbXkgY2hpbGQgdGhhdCdzIGRlYWQsPC9MSU5FPgorPExJTkU+QW5kIHNoZSBhbG9uZSBpcyBoZWlyIHRvIGJvdGggb2YgdXM6PC9MSU5FPgorPExJTkU+R2l2ZSBoZXIgdGhlIHJpZ2h0IHlvdSBzaG91bGQgaGF2ZSBnaXZlbiBoZXIgY291c2luLDwvTElORT4KKzxMSU5FPkFuZCBzbyBkaWVzIG15IHJldmVuZ2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+TyBub2JsZSBzaXIsPC9MSU5FPgorPExJTkU+WW91ciBvdmVyLWtpbmRuZXNzIGRvdGggd3JpbmcgdGVhcnMgZnJvbSBtZSE8L0xJTkU+Cis8TElORT5JIGRvIGVtYnJhY2UgeW91ciBvZmZlcjsgYW5kIGRpc3Bvc2U8L0xJTkU+Cis8TElORT5Gb3IgaGVuY2Vmb3J0aCBvZiBwb29yIENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+VG8tbW9ycm93IHRoZW4gSSB3aWxsIGV4cGVjdCB5b3VyIGNvbWluZzs8L0xJTkU+Cis8TElORT5Uby1uaWdodCBJIHRha2UgbXkgbGVhdmUuIFRoaXMgbmF1Z2h0eSBtYW48L0xJTkU+Cis8TElORT5TaGFsbCBmYWNlIHRvIGZhY2UgYmUgYnJvdWdodCB0byBNYXJnYXJldCw8L0xJTkU+Cis8TElORT5XaG8gSSBiZWxpZXZlIHdhcyBwYWNrJ2QgaW4gYWxsIHRoaXMgd3JvbmcsPC9MSU5FPgorPExJTkU+SGlyZWQgdG8gaXQgYnkgeW91ciBicm90aGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Qk9SQUNISU88L1NQRUFLRVI+Cis8TElORT5ObywgYnkgbXkgc291bCwgc2hlIHdhcyBub3QsPC9MSU5FPgorPExJTkU+Tm9yIGtuZXcgbm90IHdoYXQgc2hlIGRpZCB3aGVuIHNoZSBzcG9rZSB0byBtZSw8L0xJTkU+Cis8TElORT5CdXQgYWx3YXlzIGhhdGggYmVlbiBqdXN0IGFuZCB2aXJ0dW91czwvTElORT4KKzxMSU5FPkluIGFueSB0aGluZyB0aGF0IEkgZG8ga25vdyBieSBoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPk1vcmVvdmVyLCBzaXIsIHdoaWNoIGluZGVlZCBpcyBub3QgdW5kZXIgd2hpdGUgYW5kPC9MSU5FPgorPExJTkU+YmxhY2ssIHRoaXMgcGxhaW50aWZmIGhlcmUsIHRoZSBvZmZlbmRlciwgZGlkIGNhbGw8L0xJTkU+Cis8TElORT5tZSBhc3M6IEkgYmVzZWVjaCB5b3UsIGxldCBpdCBiZSByZW1lbWJlcmVkIGluIGhpczwvTElORT4KKzxMSU5FPnB1bmlzaG1lbnQuIEFuZCBhbHNvLCB0aGUgd2F0Y2ggaGVhcmQgdGhlbSB0YWxrIG9mPC9MSU5FPgorPExJTkU+b25lIERlZm9ybWVkOiB0aGV5IHNheSBiZSB3ZWFycyBhIGtleSBpbiBoaXMgZWFyIGFuZDwvTElORT4KKzxMSU5FPmEgbG9jayBoYW5naW5nIGJ5IGl0LCBhbmQgYm9ycm93cyBtb25leSBpbiBHb2QnczwvTElORT4KKzxMSU5FPm5hbWUsIHRoZSB3aGljaCBoZSBoYXRoIHVzZWQgc28gbG9uZyBhbmQgbmV2ZXIgcGFpZDwvTElORT4KKzxMSU5FPnRoYXQgbm93IG1lbiBncm93IGhhcmQtaGVhcnRlZCBhbmQgd2lsbCBsZW5kIG5vdGhpbmc8L0xJTkU+Cis8TElORT5mb3IgR29kJ3Mgc2FrZTogcHJheSB5b3UsIGV4YW1pbmUgaGltIHVwb24gdGhhdCBwb2ludC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5JIHRoYW5rIHRoZWUgZm9yIHRoeSBjYXJlIGFuZCBob25lc3QgcGFpbnMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPllvdXIgd29yc2hpcCBzcGVha3MgbGlrZSBhIG1vc3QgdGhhbmtmdWwgYW5kPC9MSU5FPgorPExJTkU+cmV2ZXJlbmQgeW91dGg7IGFuZCBJIHByYWlzZSBHb2QgZm9yIHlvdS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5UaGVyZSdzIGZvciB0aHkgcGFpbnMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET0dCRVJSWTwvU1BFQUtFUj4KKzxMSU5FPkdvZCBzYXZlIHRoZSBmb3VuZGF0aW9uITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPkdvLCBJIGRpc2NoYXJnZSB0aGVlIG9mIHRoeSBwcmlzb25lciwgYW5kIEkgdGhhbmsgdGhlZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPR0JFUlJZPC9TUEVBS0VSPgorPExJTkU+SSBsZWF2ZSBhbiBhcnJhbnQga25hdmUgd2l0aCB5b3VyIHdvcnNoaXA7IHdoaWNoIEk8L0xJTkU+Cis8TElORT5iZXNlZWNoIHlvdXIgd29yc2hpcCB0byBjb3JyZWN0IHlvdXJzZWxmLCBmb3IgdGhlPC9MSU5FPgorPExJTkU+ZXhhbXBsZSBvZiBvdGhlcnMuIEdvZCBrZWVwIHlvdXIgd29yc2hpcCEgSSB3aXNoPC9MSU5FPgorPExJTkU+eW91ciB3b3JzaGlwIHdlbGw7IEdvZCByZXN0b3JlIHlvdSB0byBoZWFsdGghIEk8L0xJTkU+Cis8TElORT5odW1ibHkgZ2l2ZSB5b3UgbGVhdmUgdG8gZGVwYXJ0OyBhbmQgaWYgYSBtZXJyeTwvTElORT4KKzxMSU5FPm1lZXRpbmcgbWF5IGJlIHdpc2hlZCwgR29kIHByb2hpYml0IGl0ISBDb21lLCBuZWlnaGJvdXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudCBET0dCRVJSWSBhbmQgVkVSR0VTPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5VbnRpbCB0by1tb3Jyb3cgbW9ybmluZywgbG9yZHMsIGZhcmV3ZWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPkZhcmV3ZWxsLCBteSBsb3Jkczogd2UgbG9vayBmb3IgeW91IHRvLW1vcnJvdy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPldlIHdpbGwgbm90IGZhaWwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+VG8tbmlnaHQgSSdsbCBtb3VybiB3aXRoIEhlcm8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+PFNUQUdFRElSPlRvIHRoZSBXYXRjaDwvU1RBR0VESVI+ICBCcmluZyB5b3UgdGhlc2UgZmVsbG93cyBvbi4gV2UnbGw8L0xJTkU+Cis8TElORT50YWxrIHdpdGggTWFyZ2FyZXQsPC9MSU5FPgorPExJTkU+SG93IGhlciBhY3F1YWludGFuY2UgZ3JldyB3aXRoIHRoaXMgbGV3ZCBmZWxsb3cuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudCwgc2V2ZXJhbGx5PC9TVEFHRURJUj4KKzwvU0NFTkU+CisKKzxTQ0VORT48VElUTEU+U0NFTkUgSUkuICBMRU9OQVRPJ1MgZ2FyZGVuLjwvVElUTEU+Cis8U1RBR0VESVI+RW50ZXIgQkVORURJQ0sgYW5kIE1BUkdBUkVULCBtZWV0aW5nPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+UHJheSB0aGVlLCBzd2VldCBNaXN0cmVzcyBNYXJnYXJldCwgZGVzZXJ2ZSB3ZWxsIGF0PC9MSU5FPgorPExJTkU+bXkgaGFuZHMgYnkgaGVscGluZyBtZSB0byB0aGUgc3BlZWNoIG9mIEJlYXRyaWNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5XaWxsIHlvdSB0aGVuIHdyaXRlIG1lIGEgc29ubmV0IGluIHByYWlzZSBvZiBteSBiZWF1dHk/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkluIHNvIGhpZ2ggYSBzdHlsZSwgTWFyZ2FyZXQsIHRoYXQgbm8gbWFuIGxpdmluZzwvTElORT4KKzxMSU5FPnNoYWxsIGNvbWUgb3ZlciBpdDsgZm9yLCBpbiBtb3N0IGNvbWVseSB0cnV0aCwgdGhvdTwvTElORT4KKzxMSU5FPmRlc2VydmVzdCBpdC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPk1BUkdBUkVUPC9TUEVBS0VSPgorPExJTkU+VG8gaGF2ZSBubyBtYW4gY29tZSBvdmVyIG1lISB3aHksIHNoYWxsIEkgYWx3YXlzPC9MSU5FPgorPExJTkU+a2VlcCBiZWxvdyBzdGFpcnM/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRoeSB3aXQgaXMgYXMgcXVpY2sgYXMgdGhlIGdyZXlob3VuZCdzIG1vdXRoOyBpdCBjYXRjaGVzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5BbmQgeW91cnMgYXMgYmx1bnQgYXMgdGhlIGZlbmNlcidzIGZvaWxzLCB3aGljaCBoaXQsPC9MSU5FPgorPExJTkU+YnV0IGh1cnQgbm90LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BIG1vc3QgbWFubHkgd2l0LCBNYXJnYXJldDsgaXQgd2lsbCBub3QgaHVydCBhPC9MSU5FPgorPExJTkU+d29tYW46IGFuZCBzbywgSSBwcmF5IHRoZWUsIGNhbGwgQmVhdHJpY2U6IEkgZ2l2ZTwvTElORT4KKzxMSU5FPnRoZWUgdGhlIGJ1Y2tsZXJzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5HaXZlIHVzIHRoZSBzd29yZHM7IHdlIGhhdmUgYnVja2xlcnMgb2Ygb3VyIG93bi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+SWYgeW91IHVzZSB0aGVtLCBNYXJnYXJldCwgeW91IG11c3QgcHV0IGluIHRoZTwvTElORT4KKzxMSU5FPnBpa2VzIHdpdGggYSB2aWNlOyBhbmQgdGhleSBhcmUgZGFuZ2Vyb3VzIHdlYXBvbnMgZm9yIG1haWRzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TUFSR0FSRVQ8L1NQRUFLRVI+Cis8TElORT5XZWxsLCBJIHdpbGwgY2FsbCBCZWF0cmljZSB0byB5b3UsIHdobyBJIHRoaW5rIGhhdGggbGVncy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QW5kIHRoZXJlZm9yZSB3aWxsIGNvbWUuPC9MSU5FPgorPFNUQUdFRElSPkV4aXQgTUFSR0FSRVQ8L1NUQUdFRElSPgorPFNUQUdFRElSPlNpbmdzPC9TVEFHRURJUj4KKzxMSU5FPlRoZSBnb2Qgb2YgbG92ZSw8L0xJTkU+Cis8TElORT5UaGF0IHNpdHMgYWJvdmUsPC9MSU5FPgorPExJTkU+QW5kIGtub3dzIG1lLCBhbmQga25vd3MgbWUsPC9MSU5FPgorPExJTkU+SG93IHBpdGlmdWwgSSBkZXNlcnZlLC0tPC9MSU5FPgorPExJTkU+SSBtZWFuIGluIHNpbmdpbmc7IGJ1dCBpbiBsb3ZpbmcsIExlYW5kZXIgdGhlIGdvb2Q8L0xJTkU+Cis8TElORT5zd2ltbWVyLCBUcm9pbHVzIHRoZSBmaXJzdCBlbXBsb3llciBvZiBwYW5kZXJzLCBhbmQ8L0xJTkU+Cis8TElORT5hIHdob2xlIGJvb2tmdWwgb2YgdGhlc2UgcXVvbmRhbSBjYXJwZXQtbWFuZ2Vycyw8L0xJTkU+Cis8TElORT53aG9zZSBuYW1lcyB5ZXQgcnVuIHNtb290aGx5IGluIHRoZSBldmVuIHJvYWQgb2YgYTwvTElORT4KKzxMSU5FPmJsYW5rIHZlcnNlLCB3aHksIHRoZXkgd2VyZSBuZXZlciBzbyB0cnVseSB0dXJuZWQ8L0xJTkU+Cis8TElORT5vdmVyIGFuZCBvdmVyIGFzIG15IHBvb3Igc2VsZiBpbiBsb3ZlLiBNYXJyeSwgSTwvTElORT4KKzxMSU5FPmNhbm5vdCBzaG93IGl0IGluIHJoeW1lOyBJIGhhdmUgdHJpZWQ6IEkgY2FuIGZpbmQ8L0xJTkU+Cis8TElORT5vdXQgbm8gcmh5bWUgdG8gJ2xhZHknIGJ1dCAnYmFieSwnIGFuIGlubm9jZW50PC9MSU5FPgorPExJTkU+cmh5bWU7IGZvciAnc2Nvcm4sJyAnaG9ybiwnIGEgaGFyZCByaHltZTsgZm9yLDwvTElORT4KKzxMSU5FPidzY2hvb2wsJyAnZm9vbCwnIGEgYmFiYmxpbmcgcmh5bWU7IHZlcnkgb21pbm91czwvTElORT4KKzxMSU5FPmVuZGluZ3M6IG5vLCBJIHdhcyBub3QgYm9ybiB1bmRlciBhIHJoeW1pbmcgcGxhbmV0LDwvTElORT4KKzxMSU5FPm5vciBJIGNhbm5vdCB3b28gaW4gZmVzdGl2YWwgdGVybXMuPC9MSU5FPgorPFNUQUdFRElSPkVudGVyIEJFQVRSSUNFPC9TVEFHRURJUj4KKzxMSU5FPlN3ZWV0IEJlYXRyaWNlLCB3b3VsZHN0IHRob3UgY29tZSB3aGVuIEkgY2FsbGVkIHRoZWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlllYSwgc2lnbmlvciwgYW5kIGRlcGFydCB3aGVuIHlvdSBiaWQgbWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPk8sIHN0YXkgYnV0IHRpbGwgdGhlbiE8L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+J1RoZW4nIGlzIHNwb2tlbjsgZmFyZSB5b3Ugd2VsbCBub3c6IGFuZCB5ZXQsIGVyZTwvTElORT4KKzxMSU5FPkkgZ28sIGxldCBtZSBnbyB3aXRoIHRoYXQgSSBjYW1lOyB3aGljaCBpcywgd2l0aDwvTElORT4KKzxMSU5FPmtub3dpbmcgd2hhdCBoYXRoIHBhc3NlZCBiZXR3ZWVuIHlvdSBhbmQgQ2xhdWRpby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+T25seSBmb3VsIHdvcmRzOyBhbmQgdGhlcmV1cG9uIEkgd2lsbCBraXNzIHRoZWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkZvdWwgd29yZHMgaXMgYnV0IGZvdWwgd2luZCwgYW5kIGZvdWwgd2luZCBpcyBidXQ8L0xJTkU+Cis8TElORT5mb3VsIGJyZWF0aCwgYW5kIGZvdWwgYnJlYXRoIGlzIG5vaXNvbWU7IHRoZXJlZm9yZSBJPC9MSU5FPgorPExJTkU+d2lsbCBkZXBhcnQgdW5raXNzZWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRob3UgaGFzdCBmcmlnaHRlZCB0aGUgd29yZCBvdXQgb2YgaGlzIHJpZ2h0IHNlbnNlLDwvTElORT4KKzxMSU5FPnNvIGZvcmNpYmxlIGlzIHRoeSB3aXQuIEJ1dCBJIG11c3QgdGVsbCB0aGVlPC9MSU5FPgorPExJTkU+cGxhaW5seSwgQ2xhdWRpbyB1bmRlcmdvZXMgbXkgY2hhbGxlbmdlOyBhbmQgZWl0aGVyPC9MSU5FPgorPExJTkU+SSBtdXN0IHNob3J0bHkgaGVhciBmcm9tIGhpbSwgb3IgSSB3aWxsIHN1YnNjcmliZTwvTElORT4KKzxMSU5FPmhpbSBhIGNvd2FyZC4gQW5kLCBJIHByYXkgdGhlZSBub3csIHRlbGwgbWUgZm9yPC9MSU5FPgorPExJTkU+d2hpY2ggb2YgbXkgYmFkIHBhcnRzIGRpZHN0IHRob3UgZmlyc3QgZmFsbCBpbiBsb3ZlIHdpdGggbWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkZvciB0aGVtIGFsbCB0b2dldGhlcjsgd2hpY2ggbWFpbnRhaW5lZCBzbyBwb2xpdGljPC9MSU5FPgorPExJTkU+YSBzdGF0ZSBvZiBldmlsIHRoYXQgdGhleSB3aWxsIG5vdCBhZG1pdCBhbnkgZ29vZDwvTElORT4KKzxMSU5FPnBhcnQgdG8gaW50ZXJtaW5nbGUgd2l0aCB0aGVtLiBCdXQgZm9yIHdoaWNoIG9mIG15PC9MSU5FPgorPExJTkU+Z29vZCBwYXJ0cyBkaWQgeW91IGZpcnN0IHN1ZmZlciBsb3ZlIGZvciBtZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+U3VmZmVyIGxvdmUhIGEgZ29vZCBlcGl0aGV0ISBJIGRvIHN1ZmZlciBsb3ZlPC9MSU5FPgorPExJTkU+aW5kZWVkLCBmb3IgSSBsb3ZlIHRoZWUgYWdhaW5zdCBteSB3aWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5JbiBzcGl0ZSBvZiB5b3VyIGhlYXJ0LCBJIHRoaW5rOyBhbGFzLCBwb29yIGhlYXJ0ITwvTElORT4KKzxMSU5FPklmIHlvdSBzcGl0ZSBpdCBmb3IgbXkgc2FrZSwgSSB3aWxsIHNwaXRlIGl0IGZvcjwvTElORT4KKzxMSU5FPnlvdXJzOyBmb3IgSSB3aWxsIG5ldmVyIGxvdmUgdGhhdCB3aGljaCBteSBmcmllbmQgaGF0ZXMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRob3UgYW5kIEkgYXJlIHRvbyB3aXNlIHRvIHdvbyBwZWFjZWFibHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkl0IGFwcGVhcnMgbm90IGluIHRoaXMgY29uZmVzc2lvbjogdGhlcmUncyBub3Qgb25lPC9MSU5FPgorPExJTkU+d2lzZSBtYW4gYW1vbmcgdHdlbnR5IHRoYXQgd2lsbCBwcmFpc2UgaGltc2VsZi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QW4gb2xkLCBhbiBvbGQgaW5zdGFuY2UsIEJlYXRyaWNlLCB0aGF0IGxpdmVkIGluPC9MSU5FPgorPExJTkU+dGhlIGxpbWUgb2YgZ29vZCBuZWlnaGJvdXJzLiBJZiBhIG1hbiBkbyBub3QgZXJlY3Q8L0xJTkU+Cis8TElORT5pbiB0aGlzIGFnZSBoaXMgb3duIHRvbWIgZXJlIGhlIGRpZXMsIGhlIHNoYWxsIGxpdmU8L0xJTkU+Cis8TElORT5ubyBsb25nZXIgaW4gbW9udW1lbnQgdGhhbiB0aGUgYmVsbCByaW5ncyBhbmQgdGhlPC9MSU5FPgorPExJTkU+d2lkb3cgd2VlcHMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkFuZCBob3cgbG9uZyBpcyB0aGF0LCB0aGluayB5b3U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlF1ZXN0aW9uOiB3aHksIGFuIGhvdXIgaW4gY2xhbW91ciBhbmQgYSBxdWFydGVyIGluPC9MSU5FPgorPExJTkU+cmhldW06IHRoZXJlZm9yZSBpcyBpdCBtb3N0IGV4cGVkaWVudCBmb3IgdGhlPC9MSU5FPgorPExJTkU+d2lzZSwgaWYgRG9uIFdvcm0sIGhpcyBjb25zY2llbmNlLCBmaW5kIG5vPC9MSU5FPgorPExJTkU+aW1wZWRpbWVudCB0byB0aGUgY29udHJhcnksIHRvIGJlIHRoZSB0cnVtcGV0IG9mIGhpczwvTElORT4KKzxMSU5FPm93biB2aXJ0dWVzLCBhcyBJIGFtIHRvIG15c2VsZi4gU28gbXVjaCBmb3I8L0xJTkU+Cis8TElORT5wcmFpc2luZyBteXNlbGYsIHdobywgSSBteXNlbGYgd2lsbCBiZWFyIHdpdG5lc3MsIGlzPC9MSU5FPgorPExJTkU+cHJhaXNld29ydGh5OiBhbmQgbm93IHRlbGwgbWUsIGhvdyBkb3RoIHlvdXIgY291c2luPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5WZXJ5IGlsbC48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+QW5kIGhvdyBkbyB5b3U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPlZlcnkgaWxsIHRvby48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+U2VydmUgR29kLCBsb3ZlIG1lIGFuZCBtZW5kLiBUaGVyZSB3aWxsIEkgbGVhdmU8L0xJTkU+Cis8TElORT55b3UgdG9vLCBmb3IgaGVyZSBjb21lcyBvbmUgaW4gaGFzdGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIFVSU1VMQTwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5VUlNVTEE8L1NQRUFLRVI+Cis8TElORT5NYWRhbSwgeW91IG11c3QgY29tZSB0byB5b3VyIHVuY2xlLiBZb25kZXIncyBvbGQ8L0xJTkU+Cis8TElORT5jb2lsIGF0IGhvbWU6IGl0IGlzIHByb3ZlZCBteSBMYWR5IEhlcm8gaGF0aCBiZWVuPC9MSU5FPgorPExJTkU+ZmFsc2VseSBhY2N1c2VkLCB0aGUgcHJpbmNlIGFuZCBDbGF1ZGlvIG1pZ2h0aWx5PC9MSU5FPgorPExJTkU+YWJ1c2VkOyBhbmQgRG9uIEpvaG4gaXMgdGhlIGF1dGhvciBvZiBhbGwsIHdobyBpczwvTElORT4KKzxMSU5FPmZlZCBhbmQgZ29uZS4gV2lsbCB5b3UgY29tZSBwcmVzZW50bHk/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPldpbGwgeW91IGdvIGhlYXIgdGhpcyBuZXdzLCBzaWduaW9yPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5JIHdpbGwgbGl2ZSBpbiB0aHkgaGVhcnQsIGRpZSBpbiB0aHkgbGFwLCBhbmQgYmU8L0xJTkU+Cis8TElORT5idXJpZWQgaW4gdGh5IGV5ZXM7IGFuZCBtb3Jlb3ZlciBJIHdpbGwgZ28gd2l0aDwvTElORT4KKzxMSU5FPnRoZWUgdG8gdGh5IHVuY2xlJ3MuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIElJSS4gIEEgY2h1cmNoLjwvVElUTEU+Cis8U1RBR0VESVI+RW50ZXIgRE9OIFBFRFJPLCBDTEFVRElPLCBhbmQgdGhyZWUgb3IgZm91cgord2l0aCB0YXBlcnM8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPklzIHRoaXMgdGhlIG1vbnVtZW50IG9mIExlb25hdG8/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5Mb3JkPC9TUEVBS0VSPgorPExJTkU+SXQgaXMsIG15IGxvcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+PFNUQUdFRElSPlJlYWRpbmcgb3V0IG9mIGEgc2Nyb2xsPC9TVEFHRURJUj48L0xJTkU+Cis8TElORT5Eb25lIHRvIGRlYXRoIGJ5IHNsYW5kZXJvdXMgdG9uZ3VlczwvTElORT4KKzxMSU5FPldhcyB0aGUgSGVybyB0aGF0IGhlcmUgbGllczo8L0xJTkU+Cis8TElORT5EZWF0aCwgaW4gZ3VlcmRvbiBvZiBoZXIgd3JvbmdzLDwvTElORT4KKzxMSU5FPkdpdmVzIGhlciBmYW1lIHdoaWNoIG5ldmVyIGRpZXMuPC9MSU5FPgorPExJTkU+U28gdGhlIGxpZmUgdGhhdCBkaWVkIHdpdGggc2hhbWU8L0xJTkU+Cis8TElORT5MaXZlcyBpbiBkZWF0aCB3aXRoIGdsb3Jpb3VzIGZhbWUuPC9MSU5FPgorPExJTkU+SGFuZyB0aG91IHRoZXJlIHVwb24gdGhlIHRvbWIsPC9MSU5FPgorPExJTkU+UHJhaXNpbmcgaGVyIHdoZW4gSSBhbSBkdW1iLjwvTElORT4KKzxMSU5FPk5vdywgbXVzaWMsIHNvdW5kLCBhbmQgc2luZyB5b3VyIHNvbGVtbiBoeW1uLjwvTElORT4KKzxTVUJIRUFEPlNPTkcuPC9TVUJIRUFEPgorPExJTkU+UGFyZG9uLCBnb2RkZXNzIG9mIHRoZSBuaWdodCw8L0xJTkU+Cis8TElORT5UaG9zZSB0aGF0IHNsZXcgdGh5IHZpcmdpbiBrbmlnaHQ7PC9MSU5FPgorPExJTkU+Rm9yIHRoZSB3aGljaCwgd2l0aCBzb25ncyBvZiB3b2UsPC9MSU5FPgorPExJTkU+Um91bmQgYWJvdXQgaGVyIHRvbWIgdGhleSBnby48L0xJTkU+Cis8TElORT5NaWRuaWdodCwgYXNzaXN0IG91ciBtb2FuOzwvTElORT4KKzxMSU5FPkhlbHAgdXMgdG8gc2lnaCBhbmQgZ3JvYW4sPC9MSU5FPgorPExJTkU+SGVhdmlseSwgaGVhdmlseTo8L0xJTkU+Cis8TElORT5HcmF2ZXMsIHlhd24gYW5kIHlpZWxkIHlvdXIgZGVhZCw8L0xJTkU+Cis8TElORT5UaWxsIGRlYXRoIGJlIHV0dGVyZWQsPC9MSU5FPgorPExJTkU+SGVhdmlseSwgaGVhdmlseS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5Ob3csIHVudG8gdGh5IGJvbmVzIGdvb2QgbmlnaHQhPC9MSU5FPgorPExJTkU+WWVhcmx5IHdpbGwgSSBkbyB0aGlzIHJpdGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Hb29kIG1vcnJvdywgbWFzdGVyczsgcHV0IHlvdXIgdG9yY2hlcyBvdXQ6PC9MSU5FPgorPExJTkU+VGhlIHdvbHZlcyBoYXZlIHByZXknZDsgYW5kIGxvb2ssIHRoZSBnZW50bGUgZGF5LDwvTElORT4KKzxMSU5FPkJlZm9yZSB0aGUgd2hlZWxzIG9mIFBob2VidXMsIHJvdW5kIGFib3V0PC9MSU5FPgorPExJTkU+RGFwcGxlcyB0aGUgZHJvd3N5IGVhc3Qgd2l0aCBzcG90cyBvZiBncmV5LjwvTElORT4KKzxMSU5FPlRoYW5rcyB0byB5b3UgYWxsLCBhbmQgbGVhdmUgdXM6IGZhcmUgeW91IHdlbGwuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+R29vZCBtb3Jyb3csIG1hc3RlcnM6IGVhY2ggaGlzIHNldmVyYWwgd2F5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RE9OIFBFRFJPPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgbGV0IHVzIGhlbmNlLCBhbmQgcHV0IG9uIG90aGVyIHdlZWRzOzwvTElORT4KKzxMSU5FPkFuZCB0aGVuIHRvIExlb25hdG8ncyB3ZSB3aWxsIGdvLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBIeW1lbiBub3cgd2l0aCBsdWNraWVyIGlzc3VlIHNwZWVkJ3M8L0xJTkU+Cis8TElORT5UaGFuIHRoaXMgZm9yIHdob20gd2UgcmVuZGVyJ2QgdXAgdGhpcyB3b2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4ZXVudDwvU1RBR0VESVI+Cis8L1NDRU5FPgorCis8U0NFTkU+PFRJVExFPlNDRU5FIElWLiAgQSByb29tIGluIExFT05BVE8nUyBob3VzZS48L1RJVExFPgorPFNUQUdFRElSPkVudGVyIExFT05BVE8sIEFOVE9OSU8sIEJFTkVESUNLLCBCRUFUUklDRSwKK01BUkdBUkVULCBVUlNVTEEsIEZSSUFSIEZSQU5DSVMsIGFuZCBIRVJPPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5EaWQgSSBub3QgdGVsbCB5b3Ugc2hlIHdhcyBpbm5vY2VudD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5TbyBhcmUgdGhlIHByaW5jZSBhbmQgQ2xhdWRpbywgd2hvIGFjY3VzZWQgaGVyPC9MSU5FPgorPExJTkU+VXBvbiB0aGUgZXJyb3IgdGhhdCB5b3UgaGVhcmQgZGViYXRlZDo8L0xJTkU+Cis8TElORT5CdXQgTWFyZ2FyZXQgd2FzIGluIHNvbWUgZmF1bHQgZm9yIHRoaXMsPC9MSU5FPgorPExJTkU+QWx0aG91Z2ggYWdhaW5zdCBoZXIgd2lsbCwgYXMgaXQgYXBwZWFyczwvTElORT4KKzxMSU5FPkluIHRoZSB0cnVlIGNvdXJzZSBvZiBhbGwgdGhlIHF1ZXN0aW9uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPldlbGwsIEkgYW0gZ2xhZCB0aGF0IGFsbCB0aGluZ3Mgc29ydCBzbyB3ZWxsLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BbmQgc28gYW0gSSwgYmVpbmcgZWxzZSBieSBmYWl0aCBlbmZvcmNlZDwvTElORT4KKzxMSU5FPlRvIGNhbGwgeW91bmcgQ2xhdWRpbyB0byBhIHJlY2tvbmluZyBmb3IgaXQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+V2VsbCwgZGF1Z2h0ZXIsIGFuZCB5b3UgZ2VudGxlLXdvbWVuIGFsbCw8L0xJTkU+Cis8TElORT5XaXRoZHJhdyBpbnRvIGEgY2hhbWJlciBieSB5b3Vyc2VsdmVzLDwvTElORT4KKzxMSU5FPkFuZCB3aGVuIEkgc2VuZCBmb3IgeW91LCBjb21lIGhpdGhlciBtYXNrJ2QuPC9MSU5FPgorPFNUQUdFRElSPkV4ZXVudCBMYWRpZXM8L1NUQUdFRElSPgorPExJTkU+VGhlIHByaW5jZSBhbmQgQ2xhdWRpbyBwcm9taXNlZCBieSB0aGlzIGhvdXI8L0xJTkU+Cis8TElORT5UbyB2aXNpdCBtZS4gWW91IGtub3cgeW91ciBvZmZpY2UsIGJyb3RoZXI6PC9MSU5FPgorPExJTkU+WW91IG11c3QgYmUgZmF0aGVyIHRvIHlvdXIgYnJvdGhlcidzIGRhdWdodGVyPC9MSU5FPgorPExJTkU+QW5kIGdpdmUgaGVyIHRvIHlvdW5nIENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5BTlRPTklPPC9TUEVBS0VSPgorPExJTkU+V2hpY2ggSSB3aWxsIGRvIHdpdGggY29uZmlybSdkIGNvdW50ZW5hbmNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5GcmlhciwgSSBtdXN0IGVudHJlYXQgeW91ciBwYWlucywgSSB0aGluay48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5UbyBkbyB3aGF0LCBzaWduaW9yPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UbyBiaW5kIG1lLCBvciB1bmRvIG1lOyBvbmUgb2YgdGhlbS48L0xJTkU+Cis8TElORT5TaWduaW9yIExlb25hdG8sIHRydXRoIGl0IGlzLCBnb29kIHNpZ25pb3IsPC9MSU5FPgorPExJTkU+WW91ciBuaWVjZSByZWdhcmRzIG1lIHdpdGggYW4gZXllIG9mIGZhdm91ci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5UaGF0IGV5ZSBteSBkYXVnaHRlciBsZW50IGhlcjogJ3RpcyBtb3N0IHRydWUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBJIGRvIHdpdGggYW4gZXllIG9mIGxvdmUgcmVxdWl0ZSBoZXIuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+VGhlIHNpZ2h0IHdoZXJlb2YgSSB0aGluayB5b3UgaGFkIGZyb20gbWUsPC9MSU5FPgorPExJTkU+RnJvbSBDbGF1ZGlvIGFuZCB0aGUgcHJpbmNlOiBidXQgd2hhdCdzIHlvdXIgd2lsbD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+WW91ciBhbnN3ZXIsIHNpciwgaXMgZW5pZ21hdGljYWw6PC9MSU5FPgorPExJTkU+QnV0LCBmb3IgbXkgd2lsbCwgbXkgd2lsbCBpcyB5b3VyIGdvb2Qgd2lsbDwvTElORT4KKzxMSU5FPk1heSBzdGFuZCB3aXRoIG91cnMsIHRoaXMgZGF5IHRvIGJlIGNvbmpvaW4nZDwvTElORT4KKzxMSU5FPkluIHRoZSBzdGF0ZSBvZiBob25vdXJhYmxlIG1hcnJpYWdlOjwvTElORT4KKzxMSU5FPkluIHdoaWNoLCBnb29kIGZyaWFyLCBJIHNoYWxsIGRlc2lyZSB5b3VyIGhlbHAuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+TXkgaGVhcnQgaXMgd2l0aCB5b3VyIGxpa2luZy48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkZSSUFSIEZSQU5DSVM8L1NQRUFLRVI+Cis8TElORT5BbmQgbXkgaGVscC48L0xJTkU+Cis8TElORT5IZXJlIGNvbWVzIHRoZSBwcmluY2UgYW5kIENsYXVkaW8uPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkVudGVyIERPTiBQRURSTyBhbmQgQ0xBVURJTywgYW5kIHR3byBvcgordGhyZWUgb3RoZXJzPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkdvb2QgbW9ycm93IHRvIHRoaXMgZmFpciBhc3NlbWJseS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Hb29kIG1vcnJvdywgcHJpbmNlOyBnb29kIG1vcnJvdywgQ2xhdWRpbzo8L0xJTkU+Cis8TElORT5XZSBoZXJlIGF0dGVuZCB5b3UuIEFyZSB5b3UgeWV0IGRldGVybWluZWQ8L0xJTkU+Cis8TElORT5Uby1kYXkgdG8gbWFycnkgd2l0aCBteSBicm90aGVyJ3MgZGF1Z2h0ZXI/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SSdsbCBob2xkIG15IG1pbmQsIHdlcmUgc2hlIGFuIEV0aGlvcGUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5MRU9OQVRPPC9TUEVBS0VSPgorPExJTkU+Q2FsbCBoZXIgZm9ydGgsIGJyb3RoZXI7IGhlcmUncyB0aGUgZnJpYXIgcmVhZHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPkV4aXQgQU5UT05JTzwvU1RBR0VESVI+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5Hb29kIG1vcnJvdywgQmVuZWRpY2suIFdoeSwgd2hhdCdzIHRoZSBtYXR0ZXIsPC9MSU5FPgorPExJTkU+VGhhdCB5b3UgaGF2ZSBzdWNoIGEgRmVicnVhcnkgZmFjZSw8L0xJTkU+Cis8TElORT5TbyBmdWxsIG9mIGZyb3N0LCBvZiBzdG9ybSBhbmQgY2xvdWRpbmVzcz88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5JIHRoaW5rIGhlIHRoaW5rcyB1cG9uIHRoZSBzYXZhZ2UgYnVsbC48L0xJTkU+Cis8TElORT5UdXNoLCBmZWFyIG5vdCwgbWFuOyB3ZSdsbCB0aXAgdGh5IGhvcm5zIHdpdGggZ29sZDwvTElORT4KKzxMSU5FPkFuZCBhbGwgRXVyb3BhIHNoYWxsIHJlam9pY2UgYXQgdGhlZSw8L0xJTkU+Cis8TElORT5BcyBvbmNlIEV1cm9wYSBkaWQgYXQgbHVzdHkgSm92ZSw8L0xJTkU+Cis8TElORT5XaGVuIGhlIHdvdWxkIHBsYXkgdGhlIG5vYmxlIGJlYXN0IGluIGxvdmUuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkJ1bGwgSm92ZSwgc2lyLCBoYWQgYW4gYW1pYWJsZSBsb3c7PC9MSU5FPgorPExJTkU+QW5kIHNvbWUgc3VjaCBzdHJhbmdlIGJ1bGwgbGVhcCdkIHlvdXIgZmF0aGVyJ3MgY293LDwvTElORT4KKzxMSU5FPkFuZCBnb3QgYSBjYWxmIGluIHRoYXQgc2FtZSBub2JsZSBmZWF0PC9MSU5FPgorPExJTkU+TXVjaCBsaWtlIHRvIHlvdSwgZm9yIHlvdSBoYXZlIGp1c3QgaGlzIGJsZWF0LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkZvciB0aGlzIEkgb3dlIHlvdTogaGVyZSBjb21lcyBvdGhlciByZWNrb25pbmdzLjwvTElORT4KKzxTVEFHRURJUj5SZS1lbnRlciBBTlRPTklPLCB3aXRoIHRoZSBMYWRpZXMgbWFza2VkPC9TVEFHRURJUj4KKzxMSU5FPldoaWNoIGlzIHRoZSBsYWR5IEkgbXVzdCBzZWl6ZSB1cG9uPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QU5UT05JTzwvU1BFQUtFUj4KKzxMSU5FPlRoaXMgc2FtZSBpcyBzaGUsIGFuZCBJIGRvIGdpdmUgeW91IGhlci48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkNMQVVESU88L1NQRUFLRVI+Cis8TElORT5XaHksIHRoZW4gc2hlJ3MgbWluZS4gU3dlZXQsIGxldCBtZSBzZWUgeW91ciBmYWNlLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPk5vLCB0aGF0IHlvdSBzaGFsbCBub3QsIHRpbGwgeW91IHRha2UgaGVyIGhhbmQ8L0xJTkU+Cis8TElORT5CZWZvcmUgdGhpcyBmcmlhciBhbmQgc3dlYXIgdG8gbWFycnkgaGVyLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkdpdmUgbWUgeW91ciBoYW5kOiBiZWZvcmUgdGhpcyBob2x5IGZyaWFyLDwvTElORT4KKzxMSU5FPkkgYW0geW91ciBodXNiYW5kLCBpZiB5b3UgbGlrZSBvZiBtZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkhFUk88L1NQRUFLRVI+Cis8TElORT5BbmQgd2hlbiBJIGxpdmVkLCBJIHdhcyB5b3VyIG90aGVyIHdpZmU6PC9MSU5FPgorPFNUQUdFRElSPlVubWFza2luZzwvU1RBR0VESVI+Cis8TElORT5BbmQgd2hlbiB5b3UgbG92ZWQsIHlvdSB3ZXJlIG15IG90aGVyIGh1c2JhbmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+QW5vdGhlciBIZXJvITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+SEVSTzwvU1BFQUtFUj4KKzxMSU5FPk5vdGhpbmcgY2VydGFpbmVyOjwvTElORT4KKzxMSU5FPk9uZSBIZXJvIGRpZWQgZGVmaWxlZCwgYnV0IEkgZG8gbGl2ZSw8L0xJTkU+Cis8TElORT5BbmQgc3VyZWx5IGFzIEkgbGl2ZSwgSSBhbSBhIG1haWQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5ET04gUEVEUk88L1NQRUFLRVI+Cis8TElORT5UaGUgZm9ybWVyIEhlcm8hIEhlcm8gdGhhdCBpcyBkZWFkITwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPlNoZSBkaWVkLCBteSBsb3JkLCBidXQgd2hpbGVzIGhlciBzbGFuZGVyIGxpdmVkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+RlJJQVIgRlJBTkNJUzwvU1BFQUtFUj4KKzxMSU5FPkFsbCB0aGlzIGFtYXplbWVudCBjYW4gSSBxdWFsaWZ5OjwvTElORT4KKzxMSU5FPldoZW4gYWZ0ZXIgdGhhdCB0aGUgaG9seSByaXRlcyBhcmUgZW5kZWQsPC9MSU5FPgorPExJTkU+SSdsbCB0ZWxsIHlvdSBsYXJnZWx5IG9mIGZhaXIgSGVybydzIGRlYXRoOjwvTElORT4KKzxMSU5FPk1lYW50aW1lIGxldCB3b25kZXIgc2VlbSBmYW1pbGlhciw8L0xJTkU+Cis8TElORT5BbmQgdG8gdGhlIGNoYXBlbCBsZXQgdXMgcHJlc2VudGx5LjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5Tb2Z0IGFuZCBmYWlyLCBmcmlhci4gV2hpY2ggaXMgQmVhdHJpY2U/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPjxTVEFHRURJUj5Vbm1hc2tpbmc8L1NUQUdFRElSPiAgSSBhbnN3ZXIgdG8gdGhhdCBuYW1lLiBXaGF0IGlzIHlvdXIgd2lsbD88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+RG8gbm90IHlvdSBsb3ZlIG1lPzwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5XaHksIG5vOyBubyBtb3JlIHRoYW4gcmVhc29uLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5XaHksIHRoZW4geW91ciB1bmNsZSBhbmQgdGhlIHByaW5jZSBhbmQgQ2xhdWRpbzwvTElORT4KKzxMSU5FPkhhdmUgYmVlbiBkZWNlaXZlZDsgdGhleSBzd29yZSB5b3UgZGlkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5EbyBub3QgeW91IGxvdmUgbWU/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPlRyb3RoLCBubzsgbm8gbW9yZSB0aGFuIHJlYXNvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+V2h5LCB0aGVuIG15IGNvdXNpbiBNYXJnYXJldCBhbmQgVXJzdWxhPC9MSU5FPgorPExJTkU+QXJlIG11Y2ggZGVjZWl2ZWQ7IGZvciB0aGV5IGRpZCBzd2VhciB5b3UgZGlkLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5UaGV5IHN3b3JlIHRoYXQgeW91IHdlcmUgYWxtb3N0IHNpY2sgZm9yIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVBVFJJQ0U8L1NQRUFLRVI+Cis8TElORT5UaGV5IHN3b3JlIHRoYXQgeW91IHdlcmUgd2VsbC1uaWdoIGRlYWQgZm9yIG1lLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT4nVGlzIG5vIHN1Y2ggbWF0dGVyLiBUaGVuIHlvdSBkbyBub3QgbG92ZSBtZT88L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFQVRSSUNFPC9TUEVBS0VSPgorPExJTkU+Tm8sIHRydWx5LCBidXQgaW4gZnJpZW5kbHkgcmVjb21wZW5zZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkxFT05BVE88L1NQRUFLRVI+Cis8TElORT5Db21lLCBjb3VzaW4sIEkgYW0gc3VyZSB5b3UgbG92ZSB0aGUgZ2VudGxlbWFuLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+Q0xBVURJTzwvU1BFQUtFUj4KKzxMSU5FPkFuZCBJJ2xsIGJlIHN3b3JuIHVwb24ndCB0aGF0IGhlIGxvdmVzIGhlcjs8L0xJTkU+Cis8TElORT5Gb3IgaGVyZSdzIGEgcGFwZXIgd3JpdHRlbiBpbiBoaXMgaGFuZCw8L0xJTkU+Cis8TElORT5BIGhhbHRpbmcgc29ubmV0IG9mIGhpcyBvd24gcHVyZSBicmFpbiw8L0xJTkU+Cis8TElORT5GYXNoaW9uJ2QgdG8gQmVhdHJpY2UuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5IRVJPPC9TUEVBS0VSPgorPExJTkU+QW5kIGhlcmUncyBhbm90aGVyPC9MSU5FPgorPExJTkU+V3JpdCBpbiBteSBjb3VzaW4ncyBoYW5kLCBzdG9sZW4gZnJvbSBoZXIgcG9ja2V0LDwvTElORT4KKzxMSU5FPkNvbnRhaW5pbmcgaGVyIGFmZmVjdGlvbiB1bnRvIEJlbmVkaWNrLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+QkVORURJQ0s8L1NQRUFLRVI+Cis8TElORT5BIG1pcmFjbGUhIGhlcmUncyBvdXIgb3duIGhhbmRzIGFnYWluc3Qgb3VyIGhlYXJ0cy48L0xJTkU+Cis8TElORT5Db21lLCBJIHdpbGwgaGF2ZSB0aGVlOyBidXQsIGJ5IHRoaXMgbGlnaHQsIEkgdGFrZTwvTElORT4KKzxMSU5FPnRoZWUgZm9yIHBpdHkuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRUFUUklDRTwvU1BFQUtFUj4KKzxMSU5FPkkgd291bGQgbm90IGRlbnkgeW91OyBidXQsIGJ5IHRoaXMgZ29vZCBkYXksIEkgeWllbGQ8L0xJTkU+Cis8TElORT51cG9uIGdyZWF0IHBlcnN1YXNpb247IGFuZCBwYXJ0bHkgdG8gc2F2ZSB5b3VyIGxpZmUsPC9MSU5FPgorPExJTkU+Zm9yIEkgd2FzIHRvbGQgeW91IHdlcmUgaW4gYSBjb25zdW1wdGlvbi48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+UGVhY2UhIEkgd2lsbCBzdG9wIHlvdXIgbW91dGguPC9MSU5FPgorPC9TUEVFQ0g+CisKKworPFNUQUdFRElSPktpc3NpbmcgaGVyPC9TVEFHRURJUj4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkRPTiBQRURSTzwvU1BFQUtFUj4KKzxMSU5FPkhvdyBkb3N0IHRob3UsIEJlbmVkaWNrLCB0aGUgbWFycmllZCBtYW4/PC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkknbGwgdGVsbCB0aGVlIHdoYXQsIHByaW5jZTsgYSBjb2xsZWdlIG9mPC9MSU5FPgorPExJTkU+d2l0LWNyYWNrZXJzIGNhbm5vdCBmbG91dCBtZSBvdXQgb2YgbXkgaHVtb3VyLiBEb3N0PC9MSU5FPgorPExJTkU+dGhvdSB0aGluayBJICBjYXJlIGZvciBhIHNhdGlyZSBvciBhbiBlcGlncmFtPyBObzo8L0xJTkU+Cis8TElORT5pZiBhIG1hbiB3aWxsIGJlIGJlYXRlbiB3aXRoIGJyYWlucywgYScgc2hhbGwgd2VhcjwvTElORT4KKzxMSU5FPm5vdGhpbmcgaGFuZHNvbWUgYWJvdXQgaGltLiBJbiBicmllZiwgc2luY2UgSSBkbzwvTElORT4KKzxMSU5FPnB1cnBvc2UgdG8gbWFycnksIEkgd2lsbCB0aGluayBub3RoaW5nIHRvIGFueTwvTElORT4KKzxMSU5FPnB1cnBvc2UgdGhhdCB0aGUgd29ybGQgY2FuIHNheSBhZ2FpbnN0IGl0OyBhbmQ8L0xJTkU+Cis8TElORT50aGVyZWZvcmUgbmV2ZXIgZmxvdXQgYXQgbWUgZm9yIHdoYXQgSSBoYXZlIHNhaWQ8L0xJTkU+Cis8TElORT5hZ2FpbnN0IGl0OyBmb3IgbWFuIGlzIGEgZ2lkZHkgdGhpbmcsIGFuZCB0aGlzIGlzIG15PC9MSU5FPgorPExJTkU+Y29uY2x1c2lvbi4gRm9yIHRoeSBwYXJ0LCBDbGF1ZGlvLCBJIGRpZCB0aGluayB0bzwvTElORT4KKzxMSU5FPmhhdmUgYmVhdGVuIHRoZWUsIGJ1dCBpbiB0aGF0IHRob3UgYXJ0IGxpa2UgdG8gYmUgbXk8L0xJTkU+Cis8TElORT5raW5zbWFuLCBsaXZlIHVuYnJ1aXNlZCBhbmQgbG92ZSBteSBjb3VzaW4uPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5DTEFVRElPPC9TUEVBS0VSPgorPExJTkU+SSBoYWQgd2VsbCBob3BlZCB0aG91IHdvdWxkc3QgaGF2ZSBkZW5pZWQgQmVhdHJpY2UsPC9MSU5FPgorPExJTkU+dGhhdCBJIG1pZ2h0IGhhdmUgY3VkZ2VsbGVkIHRoZWUgb3V0IG9mIHRoeSBzaW5nbGU8L0xJTkU+Cis8TElORT5saWZlLCB0byBtYWtlIHRoZWUgYSBkb3VibGUtZGVhbGVyOyB3aGljaCwgb3V0IG9mPC9MSU5FPgorPExJTkU+cXVlc3Rpb24sIHRob3Ugd2lsdCBiZSwgaWYgbXkgY291c2luIGRvIG5vdCBsb29rPC9MSU5FPgorPExJTkU+ZXhjZWVkaW5nbHkgbmFycm93bHkgdG8gdGhlZS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+Q29tZSwgY29tZSwgd2UgYXJlIGZyaWVuZHM6IGxldCdzIGhhdmUgYSBkYW5jZSBlcmU8L0xJTkU+Cis8TElORT53ZSBhcmUgbWFycmllZCwgdGhhdCB3ZSBtYXkgbGlnaHRlbiBvdXIgb3duIGhlYXJ0czwvTElORT4KKzxMSU5FPmFuZCBvdXIgd2l2ZXMnIGhlZWxzLjwvTElORT4KKzwvU1BFRUNIPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TEVPTkFUTzwvU1BFQUtFUj4KKzxMSU5FPldlJ2xsIGhhdmUgZGFuY2luZyBhZnRlcndhcmQuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTUEVFQ0g+Cis8U1BFQUtFUj5CRU5FRElDSzwvU1BFQUtFUj4KKzxMSU5FPkZpcnN0LCBvZiBteSB3b3JkOyB0aGVyZWZvcmUgcGxheSwgbXVzaWMuIFByaW5jZSw8L0xJTkU+Cis8TElORT50aG91IGFydCBzYWQ7IGdldCB0aGVlIGEgd2lmZSwgZ2V0IHRoZWUgYSB3aWZlOjwvTElORT4KKzxMSU5FPnRoZXJlIGlzIG5vIHN0YWZmIG1vcmUgcmV2ZXJlbmQgdGhhbiBvbmUgdGlwcGVkIHdpdGggaG9ybi48L0xJTkU+Cis8L1NQRUVDSD4KKworCis8U1RBR0VESVI+RW50ZXIgYSBNZXNzZW5nZXI8L1NUQUdFRElSPgorCis8U1BFRUNIPgorPFNQRUFLRVI+TWVzc2VuZ2VyPC9TUEVBS0VSPgorPExJTkU+TXkgbG9yZCwgeW91ciBicm90aGVyIEpvaG4gaXMgdGEnZW4gaW4gZmxpZ2h0LDwvTElORT4KKzxMSU5FPkFuZCBicm91Z2h0IHdpdGggYXJtZWQgbWVuIGJhY2sgdG8gTWVzc2luYS48L0xJTkU+Cis8L1NQRUVDSD4KKworPFNQRUVDSD4KKzxTUEVBS0VSPkJFTkVESUNLPC9TUEVBS0VSPgorPExJTkU+VGhpbmsgbm90IG9uIGhpbSB0aWxsIHRvLW1vcnJvdzo8L0xJTkU+Cis8TElORT5JJ2xsIGRldmlzZSB0aGVlIGJyYXZlIHB1bmlzaG1lbnRzIGZvciBoaW0uPC9MSU5FPgorPExJTkU+U3RyaWtlIHVwLCBwaXBlcnMuPC9MSU5FPgorPC9TUEVFQ0g+CisKKzxTVEFHRURJUj5EYW5jZTwvU1RBR0VESVI+Cis8U1RBR0VESVI+RXhldW50PC9TVEFHRURJUj4KKzwvU0NFTkU+Cis8L0FDVD4KKzwvUExBWT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3QvY2FzZXMveHBhdGgvdGVzdFhQYXRoLnhtbCBiL3YxL3Rlc3QvY2FzZXMveHBhdGgvdGVzdFhQYXRoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjkyYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9jYXNlcy94cGF0aC90ZXN0WFBhdGgueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8ZG9jIHhtbG5zOmV4dD0iaHR0cDovL3NvbWVib2R5LmVsc2VzLmV4dGVuc2lvbiI+CisgIDxhIHRlc3Q9InRlc3QiIC8+CisgIDxiIGF0dHIxPSJhMSIgYXR0cjI9ImEyIiAgIAorICB4bWxuczpqYXZhPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdC9qYXZhIj4KKyAgICA8YT4KKyAgICA8L2E+IAorICA8L2I+Cis8L2RvYz48IS0tIC0tPiAgICAgICAgIApkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQWxsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTI1NzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0FsbFRlc3RzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKKworcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCisgICAgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVTZXRUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFNtb2tlVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIC8vc3VpdGUuYWRkVGVzdFN1aXRlKEphdmVsaW5UZXN0cy5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Bbm5vdGF0aW9uc1Rlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGM0NDEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQW5ub3RhdGlvbnNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIEFubm90YXRpb25zVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBBbm5vdGF0aW9uc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShBbm5vdGF0aW9uc1Rlc3RzLmNsYXNzKTsgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOworICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCisgICAgeworICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSksIG51bGwpLm5ld0N1cnNvcigpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUZXN0Qm9va21hcmsgZXh0ZW5kcyBYbWxDdXJzb3IuWG1sQm9va21hcmsKKyAgICB7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBCYXNpYyBsb2FkIHVwIGEgZmlsZSBhbmQgaXRlcmF0ZSB0aHJvdWdoIGl0CisgICAgLy8KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1htbCggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGxvYWRDYXNlKCJ0ZXN0LnhtbCIpOworCisgICAgICAgIFRlc3RCb29rbWFyayBhMSA9IG5ldyBUZXN0Qm9va21hcmsoKTsKKworICAgICAgICBjLnNldEJvb2ttYXJrKCBhMSApOworICAgICAgICAKKyAgICAgICAgVGVzdEJvb2ttYXJrIGEyID0gbmV3IFRlc3RCb29rbWFyaygpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICAKKyAgICAgICAgYy5zZXRCb29rbWFyayggYTIgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9QcmV2VG9rZW4oKTsKKyAgICAgICAgYy50b1ByZXZUb2tlbigpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGMuZ2V0Qm9va21hcmsoIFRlc3RCb29rbWFyay5jbGFzcyApLCBhMSApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBjLmdldEJvb2ttYXJrKCBUZXN0Qm9va21hcmsuY2xhc3MgKSwgYTIgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldEJvb2ttYXJrKCBUZXN0Qm9va21hcmsuY2xhc3MgKSA9PSBudWxsICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Fzc29ydGVkVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Bc3NvcnRlZFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMTAwZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Bc3NvcnRlZFRlc3RzLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxUaW1lOworaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbEN1c3RvbWVyQmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbExpbmVJdGVtQmVhbjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudDsKK2ltcG9ydCB4aW50LnRlc3QuUG9zaXRpb25Eb2N1bWVudDsKKworcHVibGljIGNsYXNzIEFzc29ydGVkVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBBc3NvcnRlZFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShBc3NvcnRlZFRlc3RzLmNsYXNzKTsgfQorICAgIAorICAgIC8vIGJ1ZyAyNzQ4OQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0U2F2ZXJDaGFyRXNjYXBpbmcoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiApOworICAgICAgICBYbWxPYmplY3QgeGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCI8dGVzdD5zb21ldGhpbmc8L3Rlc3Q+Iik7CisgICAgICAgIFhtbEN1cnNvciBjdXIgPSB4ZG9jLm5ld0N1cnNvcigpOworICAgICAgICBjdXIudG9GaXJzdENoaWxkKCk7CisgICAgICAgIC8vIHZhbGlkIGNoYXJzCisgICAgICAgIGN1ci5zZXRUZXh0VmFsdWUoIjxzb21ldGhpbmcgb3Igb3RoZXI6XHUwM0MwXHVEN0ZGPiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI8dGVzdD4mbHQ7c29tZXRoaW5nIG9yIG90aGVyOlx1MDNDMFx1RDdGRj48L3Rlc3Q+IiArIG5ld0xpbmUsIHhkb2MudG9TdHJpbmcoKSk7CisgICAgICAgIAorICAgICAgICAvLyBpbnZhbGlkIGNoYXJzIC0gY29udHJvbCBjaGFycywgdW5pY29kZSBzdXJyb2dhdGVzLCBGRkZGL0ZGRkUsIGV0YworICAgICAgICBjdXIuc2V0VGV4dFZhbHVlKCI8c29tZXRoaW5nXDBvclwxb3RoZXI6XHUwMDQ1XHVGRkZFXHVEODAwXHVERkZGXHVEQjgwXHVEQzAwXHUwM0MwXHVEN0ZGXHUwMDFGPiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI8dGVzdD4mbHQ7c29tZXRoaW5nP29yP290aGVyOlx1MDA0NT8/Pz8/XHUwM0MwXHVEN0ZGPz48L3Rlc3Q+IiArIG5ld0xpbmUsIHhkb2MudG9TdHJpbmcoKSk7CisgICAgfQorICAgIAorICAgIC8vIGJ1ZyAyNjE0MC8yNjEwNAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Tm9UeXBlSW52YWxpZCgpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx0ZXN0LW5vLXR5cGU+c29tZXRoaW5nPC90ZXN0LW5vLXR5cGU+Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJVbnR5cGVkIGRvY3VtZW50IHNob3VsZCBiZSBpbnZhbGlkIiwgIXhkb2MudmFsaWRhdGUoKSk7CisgICAgICAgIAorICAgICAgICB4ZG9jID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIjx4OmJsYWggeG1sbnM6eD1cImh0dHA6Ly9uby10eXBlLmNvbS9cIi8+Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJVbnR5cGVkIGRvY3VtZW50IHNob3VsZCBiZSBpbnZhbGlkIiwgIXhkb2MudmFsaWRhdGUoKSk7CisgICAgfQorICAgIAorICAgIC8vIGJ1ZyAyNjc5MAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q29tcGxleFNldHRlcigpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4geGRvYyA9IFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJz4iICsKKyAgICAgICAgICAgICAgICAgIjxjdXN0b21lcj4iICsKKyAgICAgICAgICAgICAgICAgICAiPG5hbWU+RGF2aWQgQmF1PC9uYW1lPiIgKworICAgICAgICAgICAgICAgICAgICI8YWRkcmVzcz4xMDAgTWFpbiBTdHJlZXQ8L2FkZHJlc3M+IiArIAorICAgICAgICAgICAgICAgICAiPC9jdXN0b21lcj4iICsKKyAgICAgICAgICAgICAgICAgIjxkYXRlPjIwMDMtMDUtMThUMTE6NTA6MDA8L2RhdGU+IiArCisgICAgICAgICAgICAgICAgICI8bGluZS1pdGVtPiIgKworICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5SZWQgQ2FuZHk8L2Rlc2NyaXB0aW9uPiIgKworICAgICAgICAgICAgICAgICAgIjxwZXItdW5pdC1vdW5jZXM+MC40MjM8L3Blci11bml0LW91bmNlcz4iICsKKyAgICAgICAgICAgICAgICAgICI8cXVhbnRpdHk+NDwvcXVhbnRpdHk+IiArCisgICAgICAgICAgICAgICAgICI8L2xpbmUtaXRlbT4iICsKKyAgICAgICAgICAgICAgICAgIjxsaW5lLWl0ZW0+IiArCisgICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPkJsdWUgQ2FuZHk8L2Rlc2NyaXB0aW9uPiIgKworICAgICAgICAgICAgICAgICAgIjxwZXItdW5pdC1vdW5jZXM+NS4wPC9wZXItdW5pdC1vdW5jZXM+IiArCisgICAgICAgICAgICAgICAgICAiPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKworICAgICAgICAgICAgICAgICAiPC9saW5lLWl0ZW0+IiArCisgICAgICAgICAgICAgICAgIjwvcHVyY2hhc2Utb3JkZXI+Iik7CisgICAgICAgIC8vIHRlc3QgY29weS13aXRoaW4gZG9jCisgICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdJdGVtID0geGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuYWRkTmV3TGluZUl0ZW0oKTsKKyAgICAgICAgbmV3SXRlbS5zZXQoeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOworICAgICAgICB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5zZXRMaW5lSXRlbUFycmF5KDAsIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgCisgICAgICAgIC8vIHRlc3QgY29weS1iZXR3ZWVuIGRvY3MKKyAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGFub3RoZXJJdGVtID0gWG1sTGluZUl0ZW1CZWFuLkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQgeG1sbnM6ZXA9J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nIHhtbG5zOnhzaT0naHR0cDovL3d3d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6dHlwZT0nbGluZS1pdGVtJz4iICsKKyAgICAgICAgICAgICAgICAgIjxlcDpkZXNjcmlwdGlvbj5ZZWxsb3cgQmFsbG9vbjwvZXA6ZGVzY3JpcHRpb24+IiArCisgICAgICAgICAgICAgICAgICI8ZXA6cGVyLXVuaXQtb3VuY2VzPjAuMDAxPC9lcDpwZXItdW5pdC1vdW5jZXM+IiArCisgICAgICAgICAgICAgICAgICI8ZXA6cXVhbnRpdHk+MjAwPC9lcDpxdWFudGl0eT4iICsKKyAgICAgICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+Iik7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJZZWxsb3cgQmFsbG9vbiIsIGFub3RoZXJJdGVtLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5zZXRMaW5lSXRlbUFycmF5KDEsIGFub3RoZXJJdGVtKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlllbGxvdyBCYWxsb29uIiwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDIwMCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQpLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOworICAgICAgICAKKyAgICAgICAgLy8gdGVzdCBjb3B5LXRvLXNlbGYKKyAgICAgICAgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuc2V0TGluZUl0ZW1BcnJheSgxLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiWWVsbG93IEJhbGxvb24iLCB4ZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMjAwKSwgeGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNCksIHhkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7CisgICAgfQorCisgICAgLy8gYnVnIDQ1MzM4CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb21wbGV4R2V0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiB4ZG9jID0KKyAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJyIgKworICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIiArCisgICAgICAgICAgICAgICAgICAgICIgeHNpOnR5cGU9J2Zvbyc+IiArCisgICAgICAgICAgICAgICAgICI8Y3VzdG9tZXIgeHNpOnR5cGU9J2Jhcic+IiArCisgICAgICAgICAgICAgICAgICAgIjxuYW1lPkRhdmlkIEJhdTwvbmFtZT4iICsKKyAgICAgICAgICAgICAgICAgICAiPGFkZHJlc3M+MTAwIE1haW4gU3RyZWV0PC9hZGRyZXNzPiIgKworICAgICAgICAgICAgICAgICAiPC9jdXN0b21lcj4iICsKKyAgICAgICAgICAgICAgICAgIjxkYXRlPjIwMDMtMDUtMThUMTE6NTA6MDA8L2RhdGU+IiArCisgICAgICAgICAgICAgICAgICI8bGluZS1pdGVtPiIgKworICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5CbHVlIENhbmR5PC9kZXNjcmlwdGlvbj4iICsKKyAgICAgICAgICAgICAgICAgICI8cGVyLXVuaXQtb3VuY2VzPjUuMDwvcGVyLXVuaXQtb3VuY2VzPiIgKworICAgICAgICAgICAgICAgICAgIjxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKKyAgICAgICAgICAgICAgICAgIjwvbGluZS1pdGVtPiIgKworICAgICAgICAgICAgICAgICI8L3B1cmNoYXNlLW9yZGVyPiIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIHhkb2MudmFsaWRhdGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi50eXBlLCB4ZG9jLnNjaGVtYVR5cGUoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdHlwZSBvZiBlbGVtZW50IHdoZW4geHNpOnR5cGUgaXMgYmFkCisgICAgICAgIFhtbE9iamVjdCBjdXN0ID0geGRvYy5nZXRQdXJjaGFzZU9yZGVyKCkuZ2V0Q3VzdG9tZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxDdXN0b21lckJlYW4udHlwZSwgY3VzdC5zY2hlbWFUeXBlKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsICgoWG1sQ3VzdG9tZXJCZWFuKWN1c3QpLmdldE5hbWUoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb250dGVzdFByZXR0eVByaW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgiPHRlc3QgeG1sbnM6eD0nZm9vJz4mbHQ7U0hPVUxETk9UQkVBVEFHJmd0OzxhPnNpbXBsZTxiLz48L2E+Jmx0O0FMU09TSE9VTEROT1RCRUFUQUcmZ3Q7PC90ZXN0PiIpOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oeG9iaik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqLnhtbFRleHQoKSk7CisgICAgICAgIC8qCisgICAgICAgIFhtbEN1cnNvciB4Y3VyID0geG9iai5uZXdDdXJzb3IoKTsKKyAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgeG9iaiA9IHhjdXIuZ2V0T2JqZWN0KCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSB4b2JqLnRvU3RyaW5nKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQpOworICAgICAgICAKKyAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgeGN1ci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgeGN1ci50b0ZpcnN0Q29udGVudFRva2VuKCk7CisgICAgICAgIHhjdXIuaW5zZXJ0Q2hhcnMoIjxodG1sPjxib2R5PnRoaXMgaXMgYSB0ZXN0PC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b2JqKTsKKyAgICAgICAgKi8KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvbnRUZXN0UU5hbWVDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2NoZW1hRG9jdW1lbnQgeG9iaiA9IFNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4iICsKKyAgICAgICAgICAgICAgICAiPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSd4czpzdHJpbmcnLz48L3hzOnNjaGVtYT4iKTsKKyAgICAgICAgU2NoZW1hRG9jdW1lbnQgeG9iajIgPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+Iik7CisgICAgICAgIHhvYmoyLmdldFNjaGVtYSgpLmFkZE5ld0VsZW1lbnQoKS5zZXQoeG9iai5nZXRTY2hlbWEoKS5nZXRFbGVtZW50QXJyYXkoMCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeG9iajIpOworICAgIH0KKyAgICAKKyAgICAvLyBkb24ndCBydW4gb24gbm9ybWFsIGRydCBiZWNhdXNlIGl0J3MgdG9vIHNsb3c6IGFib3V0IDIwLTMwIHNlY3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9udHRlc3RDdXJzb3JGaW5hbGl6ZSgpCisgICAgeworICAgICAgICBYbWxPYmplY3Qgb2JqID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIwMDAgKiAxMDAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGN1ciA9IG9iai5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgICAgICAvLyBjdXIuZGlzcG9zZSgpOyBza2lwcGluZyB0aGlzIGRlcGVuZHMgb24gZmluYWxpemF0aW9uIG9yIGVsc2UgT09NCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEaWQgIiArIGkgKyAiIGl0ZXJhdGlvbnMgYmVmb3JlIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE91dE9mUmFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQb3NpdGlvbkRvY3VtZW50IGRvYyA9IFBvc2l0aW9uRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgiPHBvc2l0aW9uIHhtbG5zPSdqYXZhOmludC50ZXN0Jz48bGF0PjQzPC9sYXQ+PGxvbj4wMzc8L2xvbj48L3Bvc2l0aW9uPiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzcsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLnZhbGlkYXRlKCkpOworICAgICAgICAKKyAgICAgICAgZG9jID0gUG9zaXRpb25Eb2N1bWVudC5GYWN0b3J5LnBhcnNlKCI8cG9zaXRpb24geG1sbnM9J2phdmE6aW50LnRlc3QnPjxsYXQ+NDQzPC9sYXQ+PGxvbj43Mzc8L2xvbj48L3Bvc2l0aW9uPiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0MywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDczNywgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghZG9jLnZhbGlkYXRlKCkpOworICAgICAgICAKKyAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TGF0KChzaG9ydCktMzAwKTsKKyAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TG9uKChzaG9ydCkzMjc2Nyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTMwMCwgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TGF0KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyNzY3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCFkb2MudmFsaWRhdGUoKSk7CisgICAgICAgIAorICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS5zZXRMYXQoKHNob3J0KTQzKTsKKyAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TG9uKChzaG9ydCkxMjcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQzLCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMb24oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy52YWxpZGF0ZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQYXJzZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbFRpbWUgeHQgPSBYbWxUaW1lLkZhY3RvcnkucGFyc2UoIjx4bWwtZnJhZ21lbnQ+MTI6MDA6MDA8L3htbC1mcmFnbWVudD4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI6MDA6MDAiLCB4dC5jYWxlbmRhclZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgCit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ29tcGlsYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NvbXBpbGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I2ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NvbXBpbGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkNvZGVHZW5VdGlsOworaW1wb3J0IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgQ29tcGlsYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29tcGlsYXRpb25UZXN0cy5jbGFzcyk7IH0KKworICAgIHB1YmxpYyB2b2lkIF9fdGVzdEoyRUUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2oyZWUiKSk7CisgICAgICAgIC8vIEZpcnN0LCBjb21waWxlIHNjaGVtYQorICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwvc3JjIik7CisgICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwvY2xhc3NlcyIpOworICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9qMmVlL2oyZWVjb25maWd4bWwuamFyIik7CisgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10geworICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIiksCisgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIpLAorICAgICAgICAgICAgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIiksCisgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvZWpiLWphcl8yXzEueHNkIiksCisgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCisgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvanNwXzJfMC54c2QiKSwKKyAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS93ZWItYXBwXzJfNC54c2QiKSwKKyAgICAgICAgICAgIFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvajJlZS9YTUwueHNkIiksCisgICAgICAgIH0pOworICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7CisgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOworICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7CisgICAgfQorCisKKyAgICAvKiB0ZXN0IG5vdCBuZWVkZWQgYmVjYXVzZSBib290c3RyYXAgYnVpbGQgdGVzdHMgdGhpcyBiZXR0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3QnVpbGQoKQorICAgIHsKKyAgICAgICAgVGVzdEVudi5kZWx0cmVlKFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zNHMiKSk7CisgICAgICAgIEZpbGUgaW5wdXRmaWxlMSA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvczRzL1hNTC54c2QiKTsKKyAgICAgICAgRmlsZSBpbnB1dGZpbGUyID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zNHMvWE1MU2NoZW1hLnhzZCIpOworICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zNHMvczRzdHlwZXMuamFyIik7CisgICAgICAgIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUobmV3IEZpbGVbXSB7IGlucHV0ZmlsZTEsIGlucHV0ZmlsZTIgfSwgbmV3IEZpbGVbMF0sIG5ldyBGaWxlWzBdLCBuZXcgRmlsZVswXSwgbnVsbCwgb3V0cHV0amFyLCAic2NoZW1hLnM0cyIsIG51bGwsIG51bGwsIG51bGwsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKKyAgICB9CisgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIF9fdGVzdFNpbXBsZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvc2ltcGxlIikpOworICAgICAgICAvLyBGaXJzdCwgY29tcGlsZSBzY2hlbWEKKyAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9zaW1wbGUvcGVyc29uLnhzZCIpOworICAgICAgICBGaWxlIGlucHV0ZmlsZTIgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL3NpbXBsZS9zaW1wbGVjLnhzZCIpOworICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMvc3JjIik7CisgICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMvY2xhc3NlcyIpOworICAgICAgICBGaWxlIG91dHB1dGphciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvc2ltcGxldHlwZXMuamFyIik7CisgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFhzZEZpbGVzKG5ldyBGaWxlW10geyBpbnB1dGZpbGUxLCBpbnB1dGZpbGUyIH0pOworICAgICAgICBwYXJhbXMuc2V0U3JjRGlyKHNyY2Rpcik7CisgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOworICAgICAgICBwYXJhbXMuc2V0T3V0cHV0SmFyKG91dHB1dGphcik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJCdWlsZCBmYWlsZWQiLCBTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOworCisgICAgICAgIC8vIFRoZW4sIGNvbXBpbGUgamF2YSBjbGFzc2VzCisgICAgICAgIEZpbGUgamF2YXNyYyA9IFRlc3RFbnYueGJlYW5DYXNlKCJzY2hlbWEvc2ltcGxlL2phdmFzcmMiKTsKKyAgICAgICAgRmlsZSBqYXZhY2xhc3NlcyA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9zaW1wbGUvamF2YWNsYXNzZXMiKTsKKyAgICAgICAgamF2YWNsYXNzZXMubWtkaXJzKCk7CisgICAgICAgIExpc3QgdGVzdGNwID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0ZXN0Y3AuYWRkQWxsKEFycmF5cy5hc0xpc3QoQ29kZUdlblV0aWwuc3lzdGVtQ2xhc3NwYXRoKCkpKTsKKyAgICAgICAgdGVzdGNwLmFkZChvdXRwdXRqYXIpOworICAgICAgICBDb2RlR2VuVXRpbC5leHRlcm5hbENvbXBpbGUoQXJyYXlzLmFzTGlzdChuZXcgRmlsZVtdIHsgamF2YXNyYyB9KSwgamF2YWNsYXNzZXMsIChGaWxlW10pdGVzdGNwLnRvQXJyYXkobmV3IEZpbGVbdGVzdGNwLnNpemUoKV0pLCB0cnVlKTsKKworICAgICAgICAvLyBUaGVuIHJ1biB0aGUgdGVzdAorICAgICAgICB0ZXN0Y3AuYWRkKGphdmFjbGFzc2VzKTsKKyAgICAgICAgVGVzdFJ1blV0aWwucnVuKCJTaW1wbGVQZXJzb25UZXN0IiwgbmV3IEZpbGVbXSB7IG91dHB1dGphciwgamF2YWNsYXNzZXMgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX190ZXN0RG93bmxvYWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBUZXN0RW52LmRlbHRyZWUoVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUiKSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hIHdpdGhvdXQgZG93bmxvYWQgYW5kIHZlcmlmeSBmYWlsdXJlCisgICAgICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZGZhaWwvc3JjIik7CisgICAgICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRmYWlsL2NsYXNzZXMiKTsKKyAgICAgICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkZmFpbC5qYXIiKTsKKyAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsKKyAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOworICAgICAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCIsICFTY2hlbWFDb21waWxlci5jb21waWxlKHBhcmFtcykpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBub3QgaGF2ZSBjcmVhdGVkICIgKyBvdXRwdXRqYXIsICFvdXRwdXRqYXIuZXhpc3RzKCkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm93IHR1cm4gb24gZG93bmxvYWQgYW5kIHZlcmlmeSBzdWNjZXNzCisgICAgICAgICAgICBGaWxlIHNyY2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9pbmNsdWRlL3Nob3VsZHN1Y2NlZWQvc3JjIik7CisgICAgICAgICAgICBGaWxlIGNsYXNzZXNkaXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvaW5jbHVkZS9zaG91bGRzdWNjZWVkL2NsYXNzZXMiKTsKKyAgICAgICAgICAgIEZpbGUgb3V0cHV0amFyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL2luY2x1ZGUvc2hvdWxkc3VjY2VlZC5qYXIiKTsKKyAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFNjaGVtYUNvbXBpbGVyLlBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXREb3dubG9hZCh0cnVlKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsKKyAgICAgICAgICAgICAgICBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2oyZWUvajJlZV8xXzQueHNkIiksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKKyAgICAgICAgICAgIHBhcmFtcy5zZXRDbGFzc2VzRGlyKGNsYXNzZXNkaXIpOworICAgICAgICAgICAgcGFyYW1zLnNldE91dHB1dEphcihvdXRwdXRqYXIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2Fubm91dCBmaW5kICIgKyBvdXRwdXRqYXIsIG91dHB1dGphci5leGlzdHMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpY2VxdW90ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFRlc3RFbnYuZGVsdHJlZShUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvcHJpY2VxdW90ZSIpKTsKKyAgICAgICAgLy8gRmlyc3QsIGNvbXBpbGUgc2NoZW1hCisgICAgICAgIEZpbGUgc3JjZGlyID0gVGVzdEVudi54YmVhbk91dHB1dCgic2NoZW1hL3ByaWNlcXVvdGUvc3JjIik7CisgICAgICAgIEZpbGUgY2xhc3Nlc2RpciA9IFRlc3RFbnYueGJlYW5PdXRwdXQoInNjaGVtYS9wcmljZXF1b3RlL2NsYXNzZXMiKTsKKyAgICAgICAgRmlsZSBvdXRwdXRqYXIgPSBUZXN0RW52LnhiZWFuT3V0cHV0KCJzY2hlbWEvcHJpY2VxdW90ZS9wcmljZXF1b3RlLmphciIpOworICAgICAgICBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBTY2hlbWFDb21waWxlci5QYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRYc2RGaWxlcyhuZXcgRmlsZVtdIHsgVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9wcmljZXF1b3RlL1ByaWNlUXVvdGUueHNkIikgfSk7CisgICAgICAgIHBhcmFtcy5zZXRTcmNEaXIoc3JjZGlyKTsKKyAgICAgICAgcGFyYW1zLnNldENsYXNzZXNEaXIoY2xhc3Nlc2Rpcik7CisgICAgICAgIHBhcmFtcy5zZXRPdXRwdXRKYXIob3V0cHV0amFyKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkJ1aWxkIGZhaWxlZCIsIFNjaGVtYUNvbXBpbGVyLmNvbXBpbGUocGFyYW1zKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDYW5ub3V0IGZpbmQgIiArIG91dHB1dGphciwgb3V0cHV0amFyLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIFtdIGludmFsaWRTY2hlbWFzID0geworICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCisgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBmaW5hbD0nZXh0ZW5zaW9uJy8+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKKyAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKKyAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCisKKyAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKworICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9JyNhbGwnLz5cbiIgKworICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz5cbiIgKworICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJy8+XG4iICsKKyAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKKyAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKKworICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0nI2FsbCc+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnLz5cbiIgKworICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ncmVzdCc+XG4iICsKKyAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKKyAgICAgICAgIiAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSdiYXNlJy8+XG4iICsKKyAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKKyAgICAgICAgIjwveHM6c2NoZW1hPlxuIiwKKworICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIGZpbmFsRGVmYXVsdD0ncmVzdHJpY3Rpb24nPlxuIiArCisgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCisgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCisgICAgfTsKKworICAgIHN0YXRpYyBTdHJpbmcgW10gdmFsaWRTY2hlbWFzID0geworICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCisgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBmaW5hbD0nZXh0ZW5zaW9uJy8+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCisgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCisKKyAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKworICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScgZmluYWw9J3Jlc3RyaWN0aW9uJy8+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2V4dCc+XG4iICsKKyAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+XG4iICsKKyAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCisKKyAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyBmaW5hbERlZmF1bHQ9J3Jlc3RyaWN0aW9uJz5cbiIgKworICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdleHQnPlxuIiArCisgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9J2Jhc2UnLz5cbiIgKworICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKKyAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKworICAgICAgICAiPC94czpzY2hlbWE+XG4iLAorCisgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgZmluYWxEZWZhdWx0PSdleHRlbnNpb24nPlxuIiArCisgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJy8+XG4iICsKKyAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J3Jlc3QnPlxuIiArCisgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICIgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nYmFzZScvPlxuIiArCisgICAgICAgICIgICAgPC94czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICI8L3hzOnNjaGVtYT5cbiIsCisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5hbCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFNjaGVtYURvY3VtZW50W10gc2NoZW1hcyA9IG5ldyBTY2hlbWFEb2N1bWVudFtpbnZhbGlkU2NoZW1hcy5sZW5ndGhdOworCisgICAgICAgIC8vIFBhcnNlIHRoZSBpbnZhbGlkIHNjaGVtYSBmaWxlcworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbnZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpbnZhbGlkU2NoZW1hc1tpXSk7CisKKyAgICAgICAgLy8gTm93IGNvbXBpbGUgdGhlIGludmFsaWQgc2NoZW1hcywgdGVzdCB0aGF0IHRoZXkgZmFpbAorICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7c2NoZW1hc1tpXX0pOworICAgICAgICAgICAgICAgIGZhaWwoIlNjaGVtYSBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gY29tcGlsZTpcbiIgKyBpbnZhbGlkU2NoZW1hc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIHN1Y2Nlc3MpIHt9CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSB0aGUgdmFsaWQgc2NoZW1hIGZpbGVzCisgICAgICAgIHNjaGVtYXMgPSBuZXcgU2NoZW1hRG9jdW1lbnRbdmFsaWRTY2hlbWFzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh2YWxpZFNjaGVtYXNbaV0pOworCisgICAgICAgIC8vIENvbXBpbGUgdGhlIHZhbGlkIHNjaGVtYXMuIFRoZXkgc2hvdWxkIG5vdCBmYWlsCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHNjaGVtYXMubGVuZ3RoIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtde3NjaGVtYXNbaV19KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZmFpbCkgeworICAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBjb21waWxlIHNjaGVtYTpcbiIgKyB2YWxpZFNjaGVtYXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvQ3JlYXRpb25UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NyZWF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJlMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0NyZWF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuOworaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5QdXJjaGFzZU9yZGVyOworaW1wb3J0IGNvbS5lYXN5cG8uWG1sTGluZUl0ZW1CZWFuOworaW1wb3J0IGNvbS5lYXN5cG8uWG1sU2hpcHBlckJlYW47CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworcHVibGljIGNsYXNzIENyZWF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBDcmVhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShDcmVhdGlvblRlc3RzLmNsYXNzKTsgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVBvKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbiBkb2MgPQorICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIAorICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKKyAgICAgICAgb3JkZXIuYWRkTmV3Q3VzdG9tZXIoKS5zZXROYW1lKCJEYXZpZCBCYXUiKTsKKyAgICAgICAgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5zZXRBZGRyZXNzKCJHbGFkd3luZSwgUEEiKTsKKyAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGxpOworICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7CisgICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIpOworICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSk7CisgICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7CisgICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7CisgICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKKyAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIik7CisgICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKKyAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKKyAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKKyAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOworICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiKTsKKyAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IikpOworICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMSkpOworICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOworICAgICAgICBYbWxTaGlwcGVyQmVhbiBzaCA9IG9yZGVyLmFkZE5ld1NoaXBwZXIoKTsKKyAgICAgICAgc2guc2V0TmFtZSgiVVBTIik7CisgICAgICAgIHNoLnNldFBlck91bmNlUmF0ZShuZXcgQmlnRGVjaW1hbCgiMC43NCIpKTsKKworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkb2MueG1sVGV4dCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEYXZpZCBCYXUiLCBvcmRlci5nZXRDdXN0b21lcigpLmdldE5hbWUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdsYWR3eW5lLCBQQSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQcmljZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFF1YW50aXR5KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UGVyVW5pdE91bmNlcygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMiIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UHJpY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFBlclVuaXRPdW5jZXMoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFByaWNlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UXVhbnRpdHkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQZXJVbml0T3VuY2VzKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXIuaXNTZXRTaGlwcGVyKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVUFMiLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC43NCIpLCBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0UGVyT3VuY2VSYXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Eb21UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0RvbVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzYmI2YwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9Eb21UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworcHVibGljIGNsYXNzIERvbVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgRG9tVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKERvbVRlc3RzLmNsYXNzKTsgfQorCisgICAgc3RhdGljIFN0cmluZ1tdIF9hcmdzOworICAgIHN0YXRpYyBTdHJpbmcgX3Rlc3Q7CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2FzZUZpbGUoU3RyaW5nIHRoZUNhc2UpCisgICAgeworICAgICAgICByZXR1cm4gVGVzdEVudi54YmVhbkNhc2UoInN0b3JlLyIgKyB0aGVDYXNlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgWG1sQ3Vyc29yIGxvYWRDYXNlKFN0cmluZyB0aGVDYXNlKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoZ2V0Q2FzZUZpbGUodGhlQ2FzZSksIG51bGwpLm5ld0N1cnNvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvVGVzdERvbUltcG9ydCAoIFN0cmluZyB4bWwgKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIERvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgIERvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCB4bWwgKSApICk7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggZG9jICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZG9UZXN0RG9tRXhwb3J0ICggU3RyaW5nIHhtbCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdEb21Ob2RlKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZG9UZXN0ICggU3RyaW5nIHhtbCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvVGVzdERvbUltcG9ydCggeG1sICk7CisgICAgICAgIGRvVGVzdERvbUV4cG9ydCggeG1sICk7CisgICAgfQorCisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tMiAoICkKKy8vICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisvLyAgICB7CisvLyAgICAgICAgRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKKy8vICAgICAgICAKKy8vICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSApOworLy8gICAgICAgIAorLy8gICAgICAgIHBhcnNlci5wYXJzZSggbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAiPGZvbyBhPSd4XG5cbnknPjwvZm9vPiIgKSApICk7CisvLworLy8gICAgICAgIFhtbE9iamVjdCB4ID0gWG1sTG9hZGVyLkZhY3RvcnkucGFyc2UoIHBhcnNlci5nZXREb2N1bWVudCgpICk7CisvLworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKKy8vICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9tICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBkb1Rlc3QoICI8Zm9vIHhtbG5zPVwieFwiLz4iICk7CisgICAgICAgIGRvVGVzdCggIjxmb28geG1sbnM9XCJ4XCIgeG1sbnM6ZT1cInZcIi8+IiApOworICAgICAgICBkb1Rlc3QoICI8Zm9vPmE8P1g/PmI8L2Zvbz4iICk7CisgICAgICAgIGRvVGVzdCggIjxmb28+YTwhLS1YLS0+YjwvZm9vPiIgKTsKKyAgICAgICAgZG9UZXN0KCAiPCEtLVgtLT48Zm9vLz4iICk7CisgICAgICAgIGRvVGVzdCggIjxmb28vPiIgKTsKKyAgICAgICAgZG9UZXN0KCAiPGZvbyB4PVwieVwiLz4iICk7CisgICAgICAgIGRvVGVzdCggIjxmb28+PGEvPjxiPm1vbzwvYj48L2Zvbz4iICk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgeHggPQorICAgICAgICAgICAgIjwhLS1nZy0tPjw/YSBiPz48Zm9vPnNkc2Q8YS8+c2RzZDxiPm1vbzwvYj5zZDwhLS1hc2FzLS0+c2Q8L2Zvbz48IS0taGgtLT4iOworICAgICAgICAKKyAgICAgICAgZG9UZXN0KCB4eCApOworCisgICAgICAgIFN0cmluZyB4bWwgPQorICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQ+IiArCisgICAgICAgICAgICAiZm9vIiArCisgICAgICAgICAgICAiPC94bWwtZnJhZ21lbnQ+IjsKKworICAgICAgICBkb1Rlc3REb21FeHBvcnQoIHhtbCApOworICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHhtbCA9CisgICAgICAgICAgICAgICAgIjx4bWwtZnJhZ21lbnQgIiArCisgICAgICAgICAgICAgICAgIiAgZm9vPSdiYXInPiIgKworICAgICAgICAgICAgICAgICI8L3htbC1mcmFnbWVudD4iOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZG9UZXN0RG9tRXhwb3J0KCB4bWwgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHh4ICk7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5vZGUgbiA9IGMubmV3RG9tTm9kZSgpOworICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIG4gKTsKKworICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0Vhc3lQb1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0NDhlNAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FYXN5UG9UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IGNvbS5lYXN5cG8uWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uUHVyY2hhc2VPcmRlcjsKKworcHVibGljIGNsYXNzIEVhc3lQb1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgRWFzeVBvVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEVhc3lQb1Rlc3RzLmNsYXNzKTsgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVhc3lQbygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4gZG9jID0gKFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4pCisgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvZWFzeXBvMS54bWwiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIGRvYy5pc05pbCgpKTsKKyAgICAgICAgUHVyY2hhc2VPcmRlciBvcmRlciA9IGRvYy5nZXRQdXJjaGFzZU9yZGVyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkRhdmlkIEJhdSIsIG9yZGVyLmdldEN1c3RvbWVyKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR2xhZHd5bmUsIFBBIiwgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG9yZGVyLnNpemVPZkxpbmVJdGVtQXJyYXkoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDEiLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyMS43OSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFByaWNlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UXVhbnRpdHkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRQZXJVbml0T3VuY2VzKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIiwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQcmljZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMiIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFF1YW50aXR5KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UGVyVW5pdE91bmNlcygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMyIsIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IiksIG9yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UHJpY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjEiKSwgb3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFBlclVuaXRPdW5jZXMoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCBvcmRlci5pc1NldFNoaXBwZXIoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVQUyIsIG9yZGVyLmdldFNoaXBwZXIoKS5nZXROYW1lKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjc0IiksIG9yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBvcmRlci5zaXplT2ZMaW5lSXRlbUFycmF5KCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXV0b1ZhbGlkYWl0b24oKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJy8+IiApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxwdXJjaGFzZS1vcmRlIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvJy8+IiApOworCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPHB1cmNoYXNlLW9yZGVyIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXAnLz4iICk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxmOmZyYWdtZW50IHhtbG5zOmY9J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnLz4iICk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxmOmZyYWdtZW50IHhtbG5zOmY9J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnPjxhLz48L2Y6ZnJhZ21lbnQ+IiApOworCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sUHVyY2hhc2VPcmRlckRvY3VtZW50QmVhbi5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICI8ZjpmcmFnbWVudCB4bWxuczpmPSdodHRwOi8vd3d3Lm9wZW51cmkub3JnL2ZyYWdtZW50Jz48YS8+PGEvPjwvZjpmcmFnbWVudD4iICk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRW51bVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvRW51bVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmMzRkMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9FbnVtVGVzdHMuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IGNvbS5lbnVtdGVzdC5TdGF0dXNyZXBvcnREb2N1bWVudDsKK2ltcG9ydCBjb20uZW51bXRlc3QuU2FsZXNyZXBvcnREb2N1bWVudDsKK2ltcG9ydCBjb20uZW51bXRlc3QuU2FsZXNyZXBvcnREb2N1bWVudC5TYWxlc3JlcG9ydC5Vbml0OworaW1wb3J0IGNvbS5lbnVtdGVzdC5RdWFudGl0eTsKK2ltcG9ydCBjb20uZW51bXRlc3QuRGF0YTsKKworcHVibGljIGNsYXNzIEVudW1UZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIEVudW1UZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRW51bVRlc3RzLmNsYXNzKTsgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQxKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RhdHVzcmVwb3J0RG9jdW1lbnQgZG9jID0gKFN0YXR1c3JlcG9ydERvY3VtZW50KQorICAgICAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgiZW51bXRlc3QvcmVwb3J0MS54bWwiKSk7CisKKyAgICAgICAgUXVhbnRpdHkuRW51bVtdIGNvbnRlbnRzID0gbmV3IFF1YW50aXR5LkVudW1bXQorICAgICAgICB7CisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5GRVcsCisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5NT1NULAorICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKKyAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCisgICAgICAgICAgICBRdWFudGl0eS5OT05FLAorICAgICAgICB9OworICAgICAgICBEYXRhW10gZGF0YSA9IGRvYy5nZXRTdGF0dXNyZXBvcnQoKS5nZXRTdGF0dXNBcnJheSgpOworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmVudW1WYWx1ZSgpKTsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgZGF0YVtpXS5nZXRUYXJnZXQoKSArICIsIHZhbHVlOiAiICsgZGF0YVtpXS5lbnVtVmFsdWUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIGRhdGFbaV0uZ2V0VGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RhdHVzcmVwb3J0RG9jdW1lbnQgZG9jID0gU3RhdHVzcmVwb3J0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBTdGF0dXNyZXBvcnREb2N1bWVudC5TdGF0dXNyZXBvcnQgcmVwb3J0ID0gZG9jLmFkZE5ld1N0YXR1c3JlcG9ydCgpOworCisgICAgICAgIERhdGEgZCA9IHJlcG9ydC5hZGROZXdTdGF0dXMoKTsKKyAgICAgICAgZC5zZXQoUXVhbnRpdHkuQUxMKTsKKyAgICAgICAgZC5zZXRUYXJnZXQoUXVhbnRpdHkuQUxMKTsKKworICAgICAgICBkID0gcmVwb3J0LmFkZE5ld1N0YXR1cygpOworICAgICAgICBkLnNldChRdWFudGl0eS5GRVcpOworICAgICAgICBkLnNldFRhcmdldChRdWFudGl0eS5BTEwpOworCisgICAgICAgIGQgPSByZXBvcnQuYWRkTmV3U3RhdHVzKCk7CisgICAgICAgIGQuc2V0KFF1YW50aXR5Lk1PU1QpOworICAgICAgICBkLnNldFRhcmdldChRdWFudGl0eS5OT05FKTsKKworICAgICAgICBkID0gcmVwb3J0LmFkZE5ld1N0YXR1cygpOworICAgICAgICBkLnNldChRdWFudGl0eS5OT05FKTsKKyAgICAgICAgZC5zZXRUYXJnZXQoUXVhbnRpdHkuTk9ORSk7CisKKyAgICAgICAgUXVhbnRpdHkuRW51bVtdIGNvbnRlbnRzID0gbmV3IFF1YW50aXR5LkVudW1bXQorICAgICAgICB7CisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5GRVcsCisgICAgICAgICAgICBRdWFudGl0eS5BTEwsCisgICAgICAgICAgICBRdWFudGl0eS5NT1NULAorICAgICAgICAgICAgUXVhbnRpdHkuTk9ORSwKKyAgICAgICAgICAgIFF1YW50aXR5Lk5PTkUsCisgICAgICAgICAgICBRdWFudGl0eS5OT05FLAorICAgICAgICB9OworICAgICAgICBEYXRhW10gZGF0YSA9IGRvYy5nZXRTdGF0dXNyZXBvcnQoKS5nZXRTdGF0dXNBcnJheSgpOworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCBkYXRhW2ldLmVudW1WYWx1ZSgpKTsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0OiAiICsgZGF0YVtpXS5nZXRUYXJnZXQoKSArICIsIHZhbHVlOiAiICsgZGF0YVtpXS5lbnVtVmFsdWUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIGRhdGFbaV0uZ2V0VGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXBvcnQzKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2FsZXNyZXBvcnREb2N1bWVudCBkb2MgPSBTYWxlc3JlcG9ydERvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgU2FsZXNyZXBvcnREb2N1bWVudC5TYWxlc3JlcG9ydCByZXBvcnQgPSBkb2MuYWRkTmV3U2FsZXNyZXBvcnQoKTsKKworICAgICAgICByZXBvcnQuYWRkVW5pdChVbml0Lk9ORSk7CisgICAgICAgIHJlcG9ydC5hZGRVbml0KFVuaXQuVFdPKTsKKyAgICAgICAgcmVwb3J0LmFkZFVuaXQoVW5pdC5OSU5FVFlfTklORSk7CisgICAgICAgIHJlcG9ydC5hZGRVbml0KFVuaXQuT05FX0hVTkRSRUQpOworCisgICAgICAgIFVuaXQuRW51bVtdIGNvbnRlbnRzID0gbmV3IFVuaXQuRW51bVtdCisgICAgICAgIHsKKyAgICAgICAgICAgIFVuaXQuT05FLAorICAgICAgICAgICAgVW5pdC5UV08sCisgICAgICAgICAgICBVbml0Lk5JTkVUWV9OSU5FLAorICAgICAgICAgICAgVW5pdC5PTkVfSFVORFJFRCwKKyAgICAgICAgfTsKKworICAgICAgICBVbml0W10geHVuaXRzID0gcmVwb3J0LnhnZXRVbml0QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4dW5pdHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGVudHNbaV0sIHh1bml0c1tpXS5lbnVtVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBVbml0LkVudW1bXSB1bml0cyA9IHJlcG9ydC5nZXRVbml0QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1tpXSwgdW5pdHNbaV0pOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9HRGF0ZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDQyMTAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvR0RhdGVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNTQ1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5HRHVyYXRpb25CdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworCitwdWJsaWMgY2xhc3MgR0RhdGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIEdEYXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKEdEYXRlVGVzdHMuY2xhc3MpOyB9CisKKyAgICBzdGF0aWMgU3RyaW5nW10gdmFsaWREdXJhdGlvbnMgPQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJQVDBTIiwKKyAgICAgICAgICAgICAgICAiUDFZIiwKKyAgICAgICAgICAgICAgICAiUDFNIiwKKyAgICAgICAgICAgICAgICAiUDFEIiwKKyAgICAgICAgICAgICAgICAiUDJZIiwKKyAgICAgICAgICAgICAgICAiUDJNIiwKKyAgICAgICAgICAgICAgICAiUDJEIiwKKyAgICAgICAgICAgICAgICAiUFQxSCIsCisgICAgICAgICAgICAgICAgIlBUMU0iLAorICAgICAgICAgICAgICAgICJQVDFTIiwKKyAgICAgICAgICAgICAgICAiUFQzNjAwUyIsCisgICAgICAgICAgICAgICAgIlAxWTFNMURUMUgxTTFTIiwKKyAgICAgICAgICAgICAgICAiUDFZMU0xRFQxSDFNMS4xUyIsCisgICAgICAgICAgICAgICAgIlAxWTM2NUQiLAorICAgICAgICAgICAgICAgICJQMVkzNjZEIiwKKyAgICAgICAgICAgICAgICAiUFQwLjFTIiwKKyAgICAgICAgICAgICAgICAiUDFZLTM2NEQiLAorICAgICAgICAgICAgICAgICJQMVktMzY1RCIsCisgICAgICAgICAgICAgICAgIlAxWS0zNjZEIiwKKyAgICAgICAgICAgICAgICAiUDFZLTM2N0QiLAorICAgICAgICAgICAgICAgICJQMVktMTJNIiwKKyAgICAgICAgICAgICAgICAiUDFNMjlEIiwKKyAgICAgICAgICAgICAgICAiUDFNLTI3RCIsCisgICAgICAgICAgICAgICAgIlAxTS0yOEQiLAorICAgICAgICAgICAgICAgICJQMU0tMjlEIiwKKyAgICAgICAgICAgICAgICAiUDFNLTMxRCIsCisgICAgICAgICAgICAgICAgIlAxTS0zMkQiLAorICAgICAgICAgICAgICAgICJQMU1ULTY2MEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTY3MEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTY4MEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTY5MEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTcwMEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTcxMEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTcyMEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTczMEgiLAorICAgICAgICAgICAgICAgICJQMU1ULTc0MEgiLAorICAgICAgICAgICAgICAgICJQVDAuMTQxNTkyNlMiLAorICAgICAgICAgICAgICAgICJQVDUyMzMxMzJTIiwKKyAgICAgICAgICAgICAgICAiUFQxNDIzMzJNIiwKKyAgICAgICAgICAgICAgICAiUFQ5ODAyM0giLAorCisgICAgICAgICAgICAgICAgIi1QVDBTIiwKKyAgICAgICAgICAgICAgICAiLVAxWSIsCisgICAgICAgICAgICAgICAgIi1QMU0iLAorICAgICAgICAgICAgICAgICItUDFEIiwKKyAgICAgICAgICAgICAgICAiLVBUMUgiLAorICAgICAgICAgICAgICAgICItUFQxTSIsCisgICAgICAgICAgICAgICAgIi1QVDFTIiwKKyAgICAgICAgICAgICAgICAiLVAxWTFNMURUMUgxTTFTIiwKKyAgICAgICAgICAgICAgICAiLVAxWTFNMURUMUgxTTEuMVMiLAorICAgICAgICAgICAgICAgICItUDI3RCIsCisgICAgICAgICAgICAgICAgIi1QMjhEIiwKKyAgICAgICAgICAgICAgICAiLVAyOUQiLAorICAgICAgICAgICAgICAgICItUDMwRCIsCisgICAgICAgICAgICAgICAgIi1QMzFEIiwKKyAgICAgICAgICAgICAgICAiLVAzNjREIiwKKyAgICAgICAgICAgICAgICAiLVAzNjVEIiwKKyAgICAgICAgICAgICAgICAiLVAzNjZEIiwKKyAgICAgICAgICAgICAgICAiLVBUMC4xUyIsCisgICAgICAgICAgICAgICAgIi1QVDAuMTQxNTkyNlMiLAorICAgICAgICAgICAgICAgICItUFQ1MjMzMTMyUyIsCisgICAgICAgICAgICAgICAgIi1QVDE0MjMzMk0iLAorICAgICAgICAgICAgICAgICItUFQ5ODAyM0giLAorCisgICAgICAgICAgICB9OworCisgICAgc3RhdGljIFN0cmluZ1tdIGludmFsaWREYXRlcyA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIisxNDowMSIsIC8vIHR6CisgICAgICAgICAgICAgICAgIi0xNDowMSIsIC8vIHR6CisgICAgICAgICAgICAgICAgIisxNTowMCIsIC8vIHR6CisgICAgICAgICAgICAgICAgIi0xNTowMCIsIC8vIHR6CisgICAgICAgICAgICAgICAgIlgiLAorICAgICAgICAgICAgICAgICIsIiwKKyAgICAgICAgICAgICAgICAiVCIsCisgICAgICAgICAgICAgICAgIisiLAorICAgICAgICAgICAgICAgICItIiwKKyAgICAgICAgICAgICAgICAiOiIsCisgICAgICAgICAgICAgICAgIjAiLAorICAgICAgICAgICAgICAgICJNYXJjaCAyIiwKKyAgICAgICAgICAgICAgICAiVDAwOjAwOjAwWiIsIC8vIFQgbm90IGFsbG93ZWQKKyAgICAgICAgICAgICAgICAiLTAwOjAwOjAwWiIsIC8vIC0gbm90IGFsbG93ZWQKKyAgICAgICAgICAgICAgICAiOTYtMDItMjhUMDA6MDA6MDBaIiwgLy8geWVhciB3aWR0aAorICAgICAgICAgICAgICAgICIxMDAtMDItMjhUMDA6MDA6MDBaIiwgLy8geWVhciB3aWR0aAorICAgICAgICAgICAgICAgICIxOTAwLTItMjhUMDA6MDA6MDBaIiwgLy8gbW9udGggd2lkdGgKKyAgICAgICAgICAgICAgICAiMTkwMC0wMi04VDAwOjAwOjAwWiIsIC8vIGRheSB3aWR0aAorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDA6MDA6MDBaIiwgLy8gaG91ciB3aWR0aAorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjA6MDBaIiwgLy8gaG91ciB3aWR0aAorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwOjBaIiwgLy8gaG91ciB3aWR0aAorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwWiIsIC8vIHRpbWUgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4IFQwMDowMDowMFoiLCAvLyBzcGFjZQorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VCAwMDowMDowMFoiLCAvLyBzcGFjZQorICAgICAgICAgICAgICAgICIxOTAwLTAyLTA4VDAwOjAwOjAwIFoiLCAvLyBzcGFjZQorICAgICAgICAgICAgICAgICIxOTAwLTAyLTI5VDAwWiIsIC8vIHRpbWUgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICIwMDowMCIsIC8vIHRpbWUgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICIwMCIsIC8vIGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAiMjEwMC0wMi0yOSIsIC8vIG5vdCBsZWFwCisgICAgICAgICAgICAgICAgIi05OTk5OTk5LTAyLTI4VDAwOjAwOjAwWiIsIC8vIHRvbyBsb25nIGFnbworICAgICAgICAgICAgICAgICI5OTk5OTk5LTAyLTI4VDAwOjAwOjAwWiIsIC8vIHRvbyBsb25nIGZyb20gbm93CisgICAgICAgICAgICAgICAgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTktMDItMjhUMDA6MDA6MDBaIiwgLy8gb3ZlcmZsb3c/CisgICAgICAgICAgICAgICAgIjE5OTYtMDAtMjhUMDA6MDA6MDBaIiwgLy8gbW9udGgKKyAgICAgICAgICAgICAgICAiMTk5Ni0xMy0yOFQwMDowMDowMFoiLCAvLyBtb250aAorICAgICAgICAgICAgICAgICIxOTk2LTAyLTAwVDAwOjAwOjAwWiIsIC8vIGRheQorICAgICAgICAgICAgICAgICIyMDAwLTAyLTMwVDAwOjAwOjAwWiIsIC8vIGRheQorICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDI0OjAwOjAwWiIsIC8vIGhyCisgICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6NjA6MDBaIiwgLy8gbWluCisgICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6NjBaIiwgLy8gc2VjCisgICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDArMTQ6MDEiLCAvLyB0egorICAgICAgICAgICAgICAgICIxOTk2LTAyLTI5VDAwOjAwOjAwLTE0OjAxIiwgLy8gdHoKKyAgICAgICAgICAgICAgICAiMTk5Ni0wMi0yOVQwMDowMDowMCsxNTowMCIsIC8vIHR6CisgICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDAtMTU6MDAiLCAvLyB0egorICAgICAgICAgICAgICAgICIxOTk2LTAwLTI5IiwgLy8gbW9udGgKKyAgICAgICAgICAgICAgICAiMTk5Ni0xMy0yOSIsIC8vIG1vbnRoCisgICAgICAgICAgICAgICAgIjE5OTYtMDItMDAiLCAvLyBkYXkKKyAgICAgICAgICAgICAgICAiMjAwMC0wMi0zMCIsIC8vIGRheQorICAgICAgICAgICAgICAgICItLTAwIiwgLy8gbW9udGgKKyAgICAgICAgICAgICAgICAiLS0xMyIsIC8vIG1vbnRoCisgICAgICAgICAgICAgICAgIi0tMDAtMDEiLCAvLyBtb250aAorICAgICAgICAgICAgICAgICItLTEzLTAxIiwgLy8gbW9udGgKKyAgICAgICAgICAgICAgICAiLS0wMi0wMCIsIC8vIGRheQorICAgICAgICAgICAgICAgICItLTAyLTMwIiwgLy8gZGF5CisgICAgICAgICAgICAgICAgIi0tMDEtMzIiLCAvLyBkYXkKKyAgICAgICAgICAgICAgICAiLS0xMS0zMSIsIC8vIGRheQorICAgICAgICAgICAgICAgICItLS0wMCIsIC8vIGRheQorICAgICAgICAgICAgICAgICItLS0zMiIsIC8vIGRheQorICAgICAgICAgICAgICAgICIyNDowMDowMFoiLCAvLyBocgorICAgICAgICAgICAgICAgICIwMDo2MDowMFoiLCAvLyBtaW4KKyAgICAgICAgICAgICAgICAiMDA6MDA6NjBaIiwgLy8gc2VjCisgICAgICAgICAgICAgICAgIjAwOjAwOjAwKzE0OjAxIiwgLy8gdHoKKyAgICAgICAgICAgICAgICAiMDA6MDA6MDAtMTQ6MDEiLCAvLyB0egorICAgICAgICAgICAgICAgICIwMDowMDowMCsxNTowMCIsIC8vIHR6CisgICAgICAgICAgICAgICAgIjAwOjAwOjAwLTE1OjAwIiwgLy8gdHoKKyAgICAgICAgICAgIH07CisKKyAgICBzdGF0aWMgU3RyaW5nW10gdmFsaWREYXRlcyA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgIloiLCAvLyB0aW1lem9uZSBvbmx5CisgICAgICAgICAgICAgICAgIi0xNDowMCIsIC8vIHRpbWV6b25lIG9ubHkKKyAgICAgICAgICAgICAgICAiOTk5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OVoiLAorICAgICAgICAgICAgICAgICIxOTcwLTEyLTMxVDIzOjU5OjU5Ljk5MCsxNDowMCIsCisgICAgICAgICAgICAgICAgIjE5OTYtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAorICAgICAgICAgICAgICAgICIyMDAwLTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKKyAgICAgICAgICAgICAgICAiMjAwNC0wMi0yOVQwMDowMDowMFoiLCAvLyBsZWFwCisgICAgICAgICAgICAgICAgIjIwMDgtMDItMjlUMDA6MDA6MDBaIiwgLy8gbGVhcAorICAgICAgICAgICAgICAgICIyMDEyLTAyLTI5VDAwOjAwOjAwWiIsIC8vIGxlYXAKKyAgICAgICAgICAgICAgICAiMTkwMC0wMi0yOFQwMDowMDowMFoiLCAvLyBub3QgbGVhcAorICAgICAgICAgICAgICAgICIyMTAwLTAyLTI4VDAwOjAwOjAwWiIsIC8vIG5vdCBsZWFwCisgICAgICAgICAgICAgICAgIjE5MDAtMDMtMjhUMDA6MDA6MDBaIiwgLy8gbm90IGxlYXAKKyAgICAgICAgICAgICAgICAiLTQ3MTItMDEtMDFUMDA6MDA6MDBaIiwKKyAgICAgICAgICAgICAgICAiMTk5OS0wMS0wMVQwMDowMDowMCswMTowMCIsCisgICAgICAgICAgICAgICAgIjIwMDEtMTItMzFUMjM6NTk6NTkuMDEwIiwKKyAgICAgICAgICAgICAgICAiMjAwMS0xMi0zMVQyMzo1OTo1OS45OTk5MDEwMDAiLAorICAgICAgICAgICAgICAgICIxOTk5LTEyLTMxVDIzOjU5OjU5LjEyMzQ1Njc4OTAtMTQ6MDAiLAorICAgICAgICAgICAgICAgICIxOTkyLTEyLTMxVDIzOjU5OjU5LjAxLTE0OjAwIiwKKyAgICAgICAgICAgICAgICAiMTk2NS0xMi0zMVQyMzo1OTo1OS4wMDBaIiwKKyAgICAgICAgICAgICAgICAiMDAwMC0xMi0zMVQwNDozNToyMi40NTYiLAorICAgICAgICAgICAgICAgICIxNjk2LTA5LTAxVDAwOjAwOjAwWiIsCisgICAgICAgICAgICAgICAgIjE2OTctMDItMDFUMDA6MDA6MDBaIiwKKyAgICAgICAgICAgICAgICAiMTkwMy0wMy0wMVQwMDowMDowMFoiLAorICAgICAgICAgICAgICAgICIxOTAzLTA3LTAxVDAwOjAwOjAwWiIsCisgICAgICAgICAgICAgICAgIjE2OTYtMDktMDFUMDA6MDA6MDArMDA6MDAiLAorICAgICAgICAgICAgICAgICIxNjk3LTAyLTAxVDAwOjAwOjAwLTAwOjAwIiwKKyAgICAgICAgICAgICAgICAiMjAwMiIsCisgICAgICAgICAgICAgICAgIi0wMDAxIiwKKyAgICAgICAgICAgICAgICAiLS0xMiIsCisgICAgICAgICAgICAgICAgIi0wMDAxLTExIiwKKyAgICAgICAgICAgICAgICAiMjAwMi0wMSIsCisgICAgICAgICAgICAgICAgIi0tLTMxIiwKKyAgICAgICAgICAgICAgICAiMTU1NC0tMzEiLAorICAgICAgICAgICAgICAgICItMDAwNC0tMzEiLAorICAgICAgICAgICAgICAgICItLTAyLTI5IiwKKyAgICAgICAgICAgICAgICAiLS0xMi0zMSIsCisgICAgICAgICAgICAgICAgIjIwMDItMDQtMTgiLAorICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMSIsCisgICAgICAgICAgICAgICAgIjIzOjU5OjU5IiwKKyAgICAgICAgICAgICAgICAiMDA6MDA6MDAiLAorICAgICAgICAgICAgICAgICIyMDEwVDIzOjU5OjU5IiwKKyAgICAgICAgICAgICAgICAiLTAwMDFUMDA6MDA6MDAiLAorICAgICAgICAgICAgICAgICItLTEyVDIzOjU5OjU5IiwKKyAgICAgICAgICAgICAgICAiLTAwMDEtMTFUMDA6MDA6MDAiLAorICAgICAgICAgICAgICAgICIyMDExLTAxVDIzOjU5OjU5IiwKKyAgICAgICAgICAgICAgICAiLS0tMzFUMDA6MDA6MDAiLAorICAgICAgICAgICAgICAgICIyMDAyLS0zMVQyMzo1OTo1OSIsCisgICAgICAgICAgICAgICAgIi0wMDA0LS0zMVQwMDowMDowMCIsCisgICAgICAgICAgICAgICAgIjIwMDItMDItMThUMjM6NTk6NTkiLAorICAgICAgICAgICAgICAgICItMDQyMy0xMi0zMVQwMDowMDowMCIsCisgICAgICAgICAgICAgICAgIjIwMDJaIiwKKyAgICAgICAgICAgICAgICAiLTAwMDErMDE6MzAiLAorICAgICAgICAgICAgICAgICItLTEyLTE0OjAwIiwKKyAgICAgICAgICAgICAgICAiLTAwMDEtMTFaIiwKKyAgICAgICAgICAgICAgICAiMTk3MC0xMi0wMTowMCIsCisgICAgICAgICAgICAgICAgIi0tLTMxKzAxOjMwIiwKKyAgICAgICAgICAgICAgICAiMjAwMi0tMzFaIiwKKyAgICAgICAgICAgICAgICAiLS0wMy0zMS0wMzowMCIsCisgICAgICAgICAgICAgICAgIi0tMDQtMzArMDU6MDAiLAorICAgICAgICAgICAgICAgICItMDAwNC0tMzEtMDE6MDAiLAorICAgICAgICAgICAgICAgICIyMDAyLTA0LTE4LTE0OjAwIiwKKyAgICAgICAgICAgICAgICAiLTA0MjMtMTItMzFaIiwKKyAgICAgICAgICAgICAgICAiMjM6NTk6NTktMDE6MDAiLAorICAgICAgICAgICAgICAgICIwMDowMDowMFoiLAorICAgICAgICAgICAgICAgICIwMDowMDowMCswMTozMCIsCisgICAgICAgICAgICAgICAgIjE3NzZUMjM6NTk6NTktMTQ6MDAiLAorICAgICAgICAgICAgICAgICItMDAwMVQwMDowMDowMFoiLAorICAgICAgICAgICAgICAgICItLTEyVDIzOjU5OjU5KzAxOjMwIiwKKyAgICAgICAgICAgICAgICAiLTAwMDEtMTFUMDA6MDA6MDAtMDE6MDAiLAorICAgICAgICAgICAgICAgICIyMDAyLTAyVDIzOjU5OjU5WiIsCisgICAgICAgICAgICAgICAgIi0tLTMxVDAwOjAwOjAwLTE0OjAwIiwKKyAgICAgICAgICAgICAgICAiMjAwMi0tMzFUMjM6NTk6NTktMDE6MDAiLAorICAgICAgICAgICAgICAgICItMDAwNC0tMzFUMDA6MDA6MDArMDE6MzAiLAorICAgICAgICAgICAgICAgICIyMDAyLTA0LTE4VDIzOjU5OjU5WiIsCisgICAgICAgICAgICAgICAgIi0wNDIzLTEyLTMxVDAwOjAwOjAwLTA1OjAwIiwKKyAgICAgICAgICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1RpbWUoR0R1cmF0aW9uIGdkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdkLmdldEhvdXIoKSAhPSAwIHx8IGdkLmdldE1pbnV0ZSgpICE9IDAgfHwgZ2QuZ2V0U2Vjb25kKCkgIT0gMCB8fCBnZC5nZXRGcmFjdGlvbigpLnNpZ251bSgpICE9IDA7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0R3JlZ29yaWFuQ2FsZW5kYXIoKQorICAgIHsKKyAgICAgICAgLy8gdGhpcyBpcyBhIGNoZWNrIG9mIERTVCBvZmZzZXRzCisgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBHRGF0ZSgiMjAwMi0wNC0xOFQyMzo1OTo1OVoiKS5nZXREYXRlKCk7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBuZXcgWG1sQ2FsZW5kYXIoZGF0ZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOworCisgICAgICAgIC8vIG5vdyBjaGVjayBvdXQgc29tZSB0aGluZ3MKKyAgICAgICAgR0RhdGUgZ2QgPSBuZXcgR0RhdGUoIjIwMDEtMTItMzFUMDc6MDA6NTkuMDEwIik7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gZ2QuZ2V0Q2FsZW5kYXIoKTsKKyAgICAgICAgRGF0ZSBnZGQgPSBnZC5nZXREYXRlKCk7CisgICAgICAgIERhdGUgZ2NkID0gZ2MuZ2V0VGltZSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkZCwgZ2NkKTsKKyAgICAgICAgCisgICAgICAgIC8vIHNldCB1cCAyLzI5LCBhbmQgcmVhZCBvdXQgRmViIDI5IGluIHRoZSB5ZWFyIDEgQkMuCisgICAgICAgIENhbGVuZGFyIGdyZWdjYWwgPSBuZXcgR0RhdGUoIi0tMDItMjkiKS5nZXRDYWxlbmRhcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDI5LCBncmVnY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyIC0gMSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBncmVnY2FsLmdldChDYWxlbmRhci5ZRUFSKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuRVJBKSk7CisgICAgICAgIC8vIHJlcGVhdCBzb21lIHRlc3RzIHRvIG1ha2Ugc3VyZSBpdCdzIHN0YWJsZS4KKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyOSwgZ3JlZ2NhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiAtIDEsIGdyZWdjYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSk7CisKKyAgICAgICAgLy8gbm93IHRyeSBzb21lIHNldHRlcnMKKyAgICAgICAgZ3JlZ2NhbCA9IG5ldyBHRGF0ZSgiLS0wMi0yOSIpLmdldENhbGVuZGFyKCk7CisgICAgICAgIGdyZWdjYWwuc2V0KENhbGVuZGFyLk1PTlRILCAxMCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIi0tMTEtMjkiLCBncmVnY2FsLnRvU3RyaW5nKCkpOworICAgICAgICAvLyByZXBlYXQgdG8gZW5zdXJlIGl0J3Mgc3RhYmxlLgorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCItLTExLTI5IiwgZ3JlZ2NhbC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZhbGlkRHVyYXRpb24oKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZER1cmF0aW9ucy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgR0R1cmF0aW9uIGdkID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzdHIgPSB2YWxpZER1cmF0aW9uc1tpXTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdkID0gbmV3IEdEdXJhdGlvbihzdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9ibGVtIHdpdGggIiArIHN0ciArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0ciwgZ2QudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsaWREdXJhdGlvbnMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR0R1cmF0aW9uIGdkMiA9IG51bGw7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0cjIgPSB2YWxpZER1cmF0aW9uc1tqXTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdkMiA9IG5ldyBHRHVyYXRpb24oc3RyMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9ibGVtIHdpdGggIiArIHN0cjIgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdGluZyB0d28gd2F5cyB3b3JrcworICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBkaWZmID0gZ2Quc3VidHJhY3QoZ2QyKTsKKyAgICAgICAgICAgICAgICBHRHVyYXRpb25CdWlsZGVyIGdkYiA9IG5ldyBHRHVyYXRpb25CdWlsZGVyKGdkMik7CisgICAgICAgICAgICAgICAgZ2RiLnNldFNpZ24oLWdkYi5nZXRTaWduKCkpOworICAgICAgICAgICAgICAgIGdkYi5hZGRHRHVyYXRpb24oZ2QpOworICAgICAgICAgICAgICAgIEdEdXJhdGlvbiBzdW0yID0gZ2RiLnRvR0R1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBkaWZmLmNvbXBhcmVUb0dEdXJhdGlvbihzdW0yKSk7CisgICAgICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZSgpOworICAgICAgICAgICAgICAgIEdEdXJhdGlvbkJ1aWxkZXIgZ2RiMSA9IG5ldyBHRHVyYXRpb25CdWlsZGVyKGRpZmYpOworICAgICAgICAgICAgICAgIGdkYjEubm9ybWFsaXplKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiUHJvYmxlbTogIiArIGdkICsgIiBhbmQgIiArIGdkMiwgZ2RiLnRvU3RyaW5nKCksIGdkYjEudG9TdHJpbmcoKSk7CisKKworICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyBpcyByZXZlcnNpYmxlCisgICAgICAgICAgICAgICAgaW50IGNvbXAxID0gZ2QuY29tcGFyZVRvR0R1cmF0aW9uKGdkMik7CisgICAgICAgICAgICAgICAgaW50IGNvbXAyID0gZ2QyLmNvbXBhcmVUb0dEdXJhdGlvbihnZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXAxID09IDIpCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgY29tcDIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtY29tcDEsIGNvbXAyKTsKKworICAgICAgICAgICAgICAgIC8vIGNvbXBhcmluZyB0cmFuc2xhdGVzIHRvIGFkZGl0aW9uIHRvIGRhdGVzCisgICAgICAgICAgICAgICAgYm9vbGVhbltdIHNlZW4gPSBuZXcgYm9vbGVhblszXTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdmFsaWREYXRlcy5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUgPSBuZXcgR0RhdGUodmFsaWREYXRlc1trXSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZS5oYXNEYXRlKCkgfHwgZGF0ZS5nZXRZZWFyKCkgPiA5OTk5OSB8fCBkYXRlLmdldFllYXIoKSA8IC00MDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaGFzVGltZShnZCkgfHwgaGFzVGltZShnZDIpKSAmJiAhZGF0ZS5oYXNUaW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgIiArIGdkICsgIiBhbmQgIiArIGdkMiArICIgdG8gIiArIGRhdGUgKyAiLCBleHBlY3RpbmcgIiArIGNvbXAxKTsKKyAgICAgICAgICAgICAgICAgICAgR0RhdGUgZGF0ZTEgPSBkYXRlLmFkZChnZCk7CisgICAgICAgICAgICAgICAgICAgIEdEYXRlIGRhdGUyID0gZGF0ZS5hZGQoZ2QyKTsKKworICAgICAgICAgICAgICAgICAgICBjb21wMiA9IGRhdGUxLmNvbXBhcmVUb0dEYXRlKGRhdGUyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAxICE9IDIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkFkZGluZyAiICsgZGF0ZSArICIgKyAiICsgZ2QgKyAiIC0+ICIgKyBkYXRlMSArICIsICIgKyBnZDIgKyAiIC0+ICIgKyBkYXRlMiArICIsIGV4cGVjdGluZyAiICsgY29tcDEsIGNvbXAxLCBjb21wMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb21wMiAhPSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bY29tcDIgKyAxXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdGlvbiBzaG91bGQgeWVpbGQgdGhlIHNhbWUgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wMSAhPSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHRGF0ZSBkYXRlMyA9IGRhdGUuYWRkKGRpZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wMSwgZGF0ZTMuY29tcGFyZVRvR0RhdGUoZGF0ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbXAxID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2VlbmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZWVuLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5ba10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJOb3QgYW1iaWd1b3VzIGFzIGFkdmVydGlzZWQiIC8qICsgZ2QgKyAiLCAiICsgZ2QyICsgIiBkOiAiICsgZGlmZiAqLywgc2VlbmNvdW50ID4gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RPcmRlcigpCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjE5OTgtMDgtMjYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjE5NzAtMTItMjBUMDQ6MTQ6MjJaIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIxOTcxLTA0LTE4VDEyOjUxOjQxWiIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA2WiIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTA4LTA2IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA3KzEwOjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDYiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDEtMDgtMDUtMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiMjAwMS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjAwMS0wMy0wMSsxMDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMDAxLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTAyLTI4LTEwOjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAwLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAwLTAzLTAxKzEwOjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIjIwMDAtMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIwMDAtMDItMjgtMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjIwMDEtMDgtMDZaIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAxLTA4LTA2LTAwOjAxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBuZXcgR0RhdGUoIjAwOjAwOjAwWiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDE6MDArMDA6MDEiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5ldyBHRGF0ZSgiMTI6MDA6MDAtMDU6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjA5OjAwOjAwLTA4OjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwOTowMDowMC0wNTowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDk6MDA6MDAtMDg6MDAiKSkpOyAvLyB0aGUgZWFzdCBjb2FzdCByaXNlcyBiZWZvcmUgdGhlIHdlc3QKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzLTA1LTA1VDA5OjAwOjAwLTA1OjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDAzLTA1LTA1VDA5OjAwOjAwLTA4OjAwIikpKTsgLy8gdGhlIGVhc3QgY29hc3QgcmlzZXMgYmVmb3JlIHRoZSB3ZXN0CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTMxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMzErMTQ6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0zMS0xNDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0zMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDEiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMzEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxKzE0OjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTMxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMS0xNDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMSIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAyWiIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLS0wMiIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDFaIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tLTAyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLS0wMS0xMDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDIrMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0tMDIiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxLTA5OjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLS0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0tMDIrMDk6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5ldyBHRGF0ZSgiLS0tMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tLTAxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDA0IikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTExIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTEyIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIyMDAzLTEyIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMDA0LTAxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTExLTMwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTEyLTAxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI4IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI5IikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCItLTAyLTI5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAzLTAxIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDItMjkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5ldyBHRGF0ZSgiLS0wMi0yOCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMy0wMSsxMDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI4LTEwOjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIi0tMDMtMDEiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDItMjktMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMDk6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIi0tMDItMjgiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIi0tMDMtMDErMDk6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiLS0wMy0wMSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiLS0wMi0yOC0wOTowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCItLTAzLTAxIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCItLTAyLTI5LTA5OjAwIikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygtMSwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTkiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OSswOTo1OSIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoLTEsIG5ldyBHRGF0ZSgiMDA6MDA6MDAiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjIzOjU5OjAxKzA5OjU5IikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTowMCswOTo1OSIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIwMDowMDowMCIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMjM6NTk6NTkrMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC0xLCBuZXcgR0RhdGUoIjAwOjAwOjAwIikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIyMzo1OTo1OS0xNDowMCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6MDAtMDk6NTkiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjU4LTA5OjU5IikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXcgR0RhdGUoIjIzOjU5OjU5IikuY29tcGFyZVRvR0RhdGUobmV3IEdEYXRlKCIwMDowMDo1OS0wOTo1OSIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbmV3IEdEYXRlKCIyMzo1OTo1OSIpLmNvbXBhcmVUb0dEYXRlKG5ldyBHRGF0ZSgiMDA6MDA6MDAtMTA6MDAiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5ldyBHRGF0ZSgiMjM6NTk6NTkiKS5jb21wYXJlVG9HRGF0ZShuZXcgR0RhdGUoIjAwOjAwOjAwKzE0OjAwIikpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RBUEkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBHRGF0ZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBHRGF0ZUJ1aWxkZXIoIjE5NzAtMTItMjBUMDQ6MTQ6MjJaIik7CisgICAgICAgIGJ1aWxkZXIubm9ybWFsaXplVG9UaW1lWm9uZSgxLCAwLCAwKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTk3MC0xMi0yMFQwNDoxNDoyMiswMDowMCIsIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1aWxkZXIuc2V0VGltZVpvbmUoNjE1KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTk3MC0xMi0yMFQwNDoxNDoyMisxMDoxNSIsIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1aWxkZXIuc2V0VGltZVpvbmUoLTM0NSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6MTQ6MjItMDU6NDUiLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICBidWlsZGVyLm5vcm1hbGl6ZVRvVGltZVpvbmUoLTMwMCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE5NzAtMTItMjBUMDQ6NTk6MjItMDU6MDAiLCBidWlsZGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkRGF0ZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBzdHIgPSBpbnZhbGlkRGF0ZXNbaV07CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgR0RhdGUoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJNaXNzaW5nIGV4Y2VwdGlvbiBmb3IgR0RhdGUgIiArIHN0ciwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERhdGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gdmFsaWREYXRlc1tpXTsKKyAgICAgICAgICAgIEdEYXRlIGdkYXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdkYXRlID0gbmV3IEdEYXRlKHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2JsZW0gd2l0aCAiICsgc3RyICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBzdHJpbmcKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RyLCBnZGF0ZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gbXVzdCByb3VuZC10cmlwIHRvIEdyZWdvcmlhbkNhbGVuZGFyIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIDw9MyBkaWdpdHMKKyAgICAgICAgICAgIGlmIChnZGF0ZS5nZXRGcmFjdGlvbigpID09IG51bGwgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCisgICAgICAgICAgICAgICAgaWYgKCFnZGF0ZS50b1N0cmluZygpLmVxdWFscygiLS0wMi0yOSIpKSAvLyBidWcgaW4gZ2NhbCAtPiAwMy0wMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOworICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShnY2FsKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOworCisgICAgICAgICAgICAgICAgLy8gYW5kIGlmIGZyYWN0aW9ucy1vZi1zZWNvbmRzIGlzIDMgZGlnaXRzLCBzdHJpbmdyZXAgbXVzdCByb3VuZC10cmlwCisgICAgICAgICAgICAgICAgaWYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMyB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZS50b1N0cmluZygpLCBnZGF0ZTIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG11c3Qgcm91bmQtdHJpcCB0byBEYXRlIGlmIGFic29sdXRlIHRpbWUrdGltZXpvbmUgKyBmcmFjdGlvbnMtb2Ytc2Vjb25kcyA8PSAzCisgICAgICAgICAgICBpZiAoZ2RhdGUuaGFzVGltZVpvbmUoKSAmJiBnZGF0ZS5nZXRZZWFyKCkgPiAtNDAwMCAmJiBnZGF0ZS5nZXRZZWFyKCkgPCA5OTk5OSAmJiBnZGF0ZS5nZXRCdWlsdGluVHlwZUNvZGUoKSA9PSBTY2hlbWFUeXBlLkJUQ19EQVRFX1RJTUUgJiYgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpIDw9IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gZ2RhdGUuZ2V0RGF0ZSgpOworICAgICAgICAgICAgICAgIEdEYXRlIGdkYXRlMiA9IG5ldyBHRGF0ZShkYXRlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkYXRlLCBnZGF0ZTIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0byBVVEMgZnJhY3Rpb25zLW9mLXNlY29uZHMgaXMgMCBvciAzIGRpZ2l0cyBbbm90IDAwMF0sIHN0cmluZ3JlcCBtdXN0IHJvdW5kLXRyaXAKKyAgICAgICAgICAgICAgICBpZiAoZ2RhdGUuZ2V0VGltZVpvbmVTaWduKCkgPT0gMCAmJiAoKGdkYXRlLmdldEZyYWN0aW9uKCkuc2NhbGUoKSA9PSAzICYmIGdkYXRlLmdldEZyYWN0aW9uKCkuc2lnbnVtKCkgIT0gMCkgfHwgZ2RhdGUuZ2V0RnJhY3Rpb24oKS5zY2FsZSgpID09IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYiA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUyKTsKKyAgICAgICAgICAgICAgICAgICAgZ2RiLm5vcm1hbGl6ZVRvVGltZVpvbmUoMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZ2RhdGUudG9TdHJpbmcoKSwgZ2RiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZworICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGRvdWJsZS1jaGVjayBYbWxDYWxlbmRhciBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgIGdjYWwgPSBuZXcgWG1sQ2FsZW5kYXIoZGF0ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRG9pbmcgIiArIGdkYXRlLCBkYXRlLCBnY2FsLmdldFRpbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChnZGF0ZS5oYXNEYXRlKCkgJiYgKGdkYXRlLmdldEZyYWN0aW9uKCkgPT0gbnVsbCB8fCBnZGF0ZS5nZXRGcmFjdGlvbigpLnNjYWxlKCkgPD0gMykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhYmxlIHRvIGdldCBhIGRhdGUgaWYgdGltZSt0aW1lem9uZSBpcyB1bnNldCAobWlkbmlnaHQsIGx0eiBhcmUgYXNzdW1lZCkKKyAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBnZGF0ZS5nZXREYXRlKCk7CisgICAgICAgICAgICAgICAgR0RhdGVCdWlsZGVyIGdkYXRlMSA9IG5ldyBHRGF0ZUJ1aWxkZXIoZ2RhdGUpOworICAgICAgICAgICAgICAgIGlmICghZ2RhdGUxLmhhc1RpbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgZ2RhdGUxLnNldFRpbWUoMCwgMCwgMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnZGF0ZTEuZ2V0RGF0ZSgpLCBkYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IGdvaW5nIHRocm91Z2ggZ2NhbCBnaXZlcyB1cyB0aGUgc2FtZSB0aGluZworICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjYWwgPSBnZGF0ZS5nZXRDYWxlbmRhcigpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkNvbXBhcmluZyAiICsgZ2RhdGUgKyAiIGFuZCAiICsgZ2NhbCwgZGF0ZSwgZ2NhbC5nZXRUaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0lERUN1cnNvclVzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwM2Y4MjAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSURFQ3Vyc29yVXNhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIFRlc3RzIGEgc2ltcGxlIHVzYWdlIG9mIHRoZSBjdXJzb3IgSSdtIGhhdmluZyB0cm91YmxlIHdpdGggaW4gSURFIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBJREVDdXJzb3JVc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBJREVDdXJzb3JVc2FnZVRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKElERUN1cnNvclVzYWdlVGVzdC5jbGFzcyk7IH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDYXNlRmlsZShTdHJpbmcgdGhlQ2FzZSkKKyAgICB7CisgICAgICAgIHJldHVybiBUZXN0RW52LnhiZWFuQ2FzZSgic3RvcmUvIiArIHRoZUNhc2UpOworICAgIH0KKworICAgIHN0YXRpYyBYbWxDdXJzb3IgbG9hZENhc2UoU3RyaW5nIHRoZUNhc2UpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShnZXRDYXNlRmlsZSh0aGVDYXNlKSkubmV3Q3Vyc29yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNjYW5FbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sQ3Vyc29yIGN1cnNvciA9IGxvYWRDYXNlKCJDb25zb2xpZGF0ZVRlc3QueG1sIik7CisgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKKworICAgICAgICBYbWxDdXJzb3IgY3VyID0gY3Vyc29yLm5ld0N1cnNvcigpOworCisgICAgICAgIC8vIGJhY2sgdXAgdG8gcHJldmlvdXMgc3RhcnQgb3IgZW5kIHRhZworICAgICAgICB3aGlsZSAoIWlzU3RhcnRPckVuZChjdXIudG9QcmV2VG9rZW4oKSkpIHsgU3lzdGVtLm91dC5wcmludGxuKCJCYWNraW5nIHVwOiBhdCAiICsgY3VyLmN1cnJlbnRUb2tlblR5cGUoKSk7IH0KKyAgICAgICAgLy8gdGhlbiBmb3J3YXJkIHRvIGZpcnN0IHN0YXJ0IG9yIGNvbW1lbnQgKG1heSBlbmQgdXAgd2hlcmUgd2Ugc3RhcnRlZCkKKyAgICAgICAgd2hpbGUgKCFpc1N0YXJ0T3JDb21tZW50KGN1ci50b05leHRUb2tlbigpKSkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkFkdmFuY2luZzogYXQgIiArIGN1ci5jdXJyZW50VG9rZW5UeXBlKCkpOyB9CisgICAgICAgIC8vIHRoZW4gZ3JhYiB0aGUgInN0YXJ0IiBqYXZlbGluIGFubm90YXRpb24sIGFuZCBncmFiIHRoZSBzdGFydCB0b2tlbiBhbmQgdGhlIGZpcnN0IGNoYXIKKyAgICAgICAgLy8gX2ZpcnN0VG9rZW4gPSAoKEphdmVsaW5Bbm5vdGF0aW9uKWN1ci5nZXRBbm5vdGF0aW9uKEphdmVsaW5Bbm5vdGF0aW9uLmNsYXNzKSkuZ2V0U3RhcnRUb2tlbigpOworCisgICAgICAgIC8vIG5vdyBwZWVrIGF0IHRoZSBlbmQgdGFnIChpdCBtYXkgYmUgdW5wbGFjZWQgZm9yIHRoZSA8YS8+IGNhc2UsIHNvIHVzZSB0aGUgc3RhcnQgdGFnIGlmIG5lZWRlZAorICAgICAgICBjdXIudG9DdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgLy8gX2xhc3RUb2tlbiA9ICgoSmF2ZWxpbkFubm90YXRpb24pY3VyLmdldEFubm90YXRpb24oSmF2ZWxpbkFubm90YXRpb24uY2xhc3MpKS5nZXRFbmRUb2tlbigpOworICAgICAgICBjdXIudG9FbmRUb2tlbigpOworICAgICAgICAvLyBKYXZlbGluQW5ub3RhdGlvbiBlbmRBbm4gPSAoSmF2ZWxpbkFubm90YXRpb24pY3VyLmdldEFubm90YXRpb24oSmF2ZWxpbkFubm90YXRpb24uY2xhc3MpOworICAgICAgICAvLyBpZiAoZW5kQW5uICE9IG51bGwpCisgICAgICAgIC8vICAgIF9sYXN0VG9rZW4gPSBlbmRBbm4uZ2V0RW5kVG9rZW4oKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzU3RhcnRPckVuZChYbWxDdXJzb3IuVG9rZW5UeXBlIHRva1R5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHRva1R5cGUuaW50VmFsdWUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9FTkQ6CisgICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX0VORERPQzoKKyAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfU1RBUlQ6CisgICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJURE9DOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sZWFuIGlzU3RhcnRPckNvbW1lbnQoWG1sQ3Vyc29yLlRva2VuVHlwZSB0b2tUeXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0b2tUeXBlLmludFZhbHVlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWG1sQ3Vyc29yLlRva2VuVHlwZS5JTlRfU1RBUlQ6CisgICAgICAgICAgICBjYXNlIFhtbEN1cnNvci5Ub2tlblR5cGUuSU5UX1NUQVJURE9DOgorICAgICAgICAgICAgY2FzZSBYbWxDdXJzb3IuVG9rZW5UeXBlLklOVF9DT01NRU5UOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0ludFRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjZWVkNwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9JbnRUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworaW1wb3J0IHhpbnQudGVzdC5Qb3NpdGlvbkRvY3VtZW50OworCitwdWJsaWMgY2xhc3MgSW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBJbnRUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoSW50VGVzdHMuY2xhc3MpOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdExhdExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQb3NpdGlvbkRvY3VtZW50IGRvYyA9IFBvc2l0aW9uRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAiPHA6cG9zaXRpb24geG1sbnM6cD0namF2YTppbnQudGVzdCc+PHA6bGF0PjQzPC9wOmxhdD48cDpsb24+MDIwPC9wOmxvbj48L3A6cG9zaXRpb24+Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDMsIGRvYy5nZXRQb3NpdGlvbigpLmdldExhdCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMCwgZG9jLmdldFBvc2l0aW9uKCkuZ2V0TG9uKCkpOworICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS54Z2V0TGF0KCkuc2V0KCIwNyIpOworICAgICAgICBkb2MuZ2V0UG9zaXRpb24oKS54Z2V0TG9uKCkuc2V0KCIwNDAiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3LCBkb2MuZ2V0UG9zaXRpb24oKS5nZXRMYXQoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAsIGRvYy5nZXRQb3NpdGlvbigpLmdldExvbigpKTsKKyAgICAgICAgZG9jLmdldFBvc2l0aW9uKCkuc2V0TGF0KChzaG9ydCkyMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0pheGVuWFBhdGhUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL0pheGVuWFBhdGhUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmMyOTUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvSmF4ZW5YUGF0aFRlc3RzLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCisgKiBEYXRlOiBPY3QgMTAsIDIwMDMKKyAqLworcHVibGljIGNsYXNzIEpheGVuWFBhdGhUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIEpheGVuWFBhdGhUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmpheGVuLlhQYXRoIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShKYXhlblhQYXRoVGVzdHMuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cbldBUk5JTkchISFcblxuSmF4ZW4uamFyIG5vdCBvbiBjbGFzc3BhdGggc2tpcHBpbmcgSmF4ZW5YUGF0aFRlc3RzLlxuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZm9ybWFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCJ4cGF0aC90ZXN0WFBhdGgueG1sIikpOworCisgICAgICAgICAgICBTdHJpbmdbXSB4cGF0aCA9IG5ldyBTdHJpbmdbMjVdOworICAgICAgICAgICAgeHBhdGhbMF0gPSAiL2RvYy9hL0B0ZXN0IjsKKyAgICAgICAgICAgIHhwYXRoWzFdID0gIi8vLiI7CisgICAgICAgICAgICB4cGF0aFsyXSA9ICIvZG9jIjsKKyAgICAgICAgICAgIHhwYXRoWzNdID0gIi9kb2MvYSI7CisgICAgICAgICAgICB4cGF0aFs0XSA9ICIvL0AqIjsKKyAgICAgICAgICAgIHhwYXRoWzVdID0gIi4iOworICAgICAgICAgICAgeHBhdGhbNl0gPSAiLy9hbmNlc3Rvci1vci1zZWxmOjoqIjsKKyAgICAgICAgICAgIHhwYXRoWzddID0gIi4vY2hpbGQ6OipbMV0iOworICAgICAgICAgICAgeHBhdGhbOF0gPSAiLy9kZXNjZW5kYW50LW9yLXNlbGY6OiovQCpbMV0iOworICAgICAgICAgICAgeHBhdGhbOV0gPSAiLy9AKiB8ICogfCBub2RlKCkiOworICAgICAgICAgICAgeHBhdGhbMTBdID0gIi8vKiI7CisgICAgICAgICAgICB4cGF0aFsxMV0gPSAiL2RvYy9uYW1lc3BhY2U6OioiOworICAgICAgICAgICAgeHBhdGhbMTJdID0gIi8vZGVzY2VuZGFudDo6Y29tbWVudCgpIjsKKyAgICAgICAgICAgIHhwYXRoWzEzXSA9ICIvLypbbG9jYWwtbmFtZSgpPSdhJ10iOworICAgICAgICAgICAgeHBhdGhbMTRdID0gIi8vKi9AKiI7CisgICAgICAgICAgICB4cGF0aFsxNV0gPSAiLy8qW2xhc3QoKV0iOworICAgICAgICAgICAgeHBhdGhbMTZdID0gImRvYy8qW2xhc3QoKV0iOworICAgICAgICAgICAgeHBhdGhbMTddID0gIi9kb2MvYS8qL0AqIjsKKyAgICAgICAgICAgIHhwYXRoWzE4XSA9ICJkb2MvZGVzY2VuZGFudDo6bm9kZSgpIjsKKyAgICAgICAgICAgIHhwYXRoWzE5XSA9ICJkb2MvYS9AKiI7CisgICAgICAgICAgICB4cGF0aFsyMF0gPSAiZG9jL2IvYS9hbmNlc3Rvci1vci1zZWxmOjoqIjsKKyAgICAgICAgICAgIHhwYXRoWzIxXSA9ICJkb2MvYi9hL3ByZWNlZGluZzo6KiI7CisgICAgICAgICAgICB4cGF0aFsyMl0gPSAiZG9jL2EvZm9sbG93aW5nOjoqIjsKKyAgICAgICAgICAgIHhwYXRoWzIzXSA9ICIvZG9jL2IvcHJlY2VkaW5nLXNpYmxpbmc6OioiOworICAgICAgICAgICAgeHBhdGhbMjRdID0gIi9kb2MvYS9mb2xsb3dpbmctc2libGluZzo6KiI7CisKKyAgICAgICAgICAgIHJ1bkFsbChkb2MsIHhwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5BbGwoWG1sT2JqZWN0IGRvYywgU3RyaW5nW10geHBhdGhlcykKKyAgICB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx4cGF0aGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBydW5YcGF0aDIoZG9jLCB4cGF0aGVzW2ldLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworLy8gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5YcGF0aChYbWxPYmplY3QgZG9jLCBTdHJpbmcgeHBhdGhTdHIsIGludCBpKQorLy8gICAgeworLy8gICAgICAgIHRyeQorLy8gICAgICAgIHsKKy8vICAgICAgICAgICAgWG1sQ3Vyc29yIHhjID0gZG9jLm5ld0N1cnNvcigpOworLy8gICAgICAgICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYQmVhbnNYUGF0aCh4cGF0aFN0cik7CisvLyAgICAgICAgICAgIExpc3QgcmVzdWx0cyA9IHhwYXRoLnNlbGVjdE5vZGVzKCB4YyApOworLy8KKy8vICAgICAgICAgICAgSXRlcmF0b3IgcmVzdWx0SXRlciA9IHJlc3VsdHMuaXRlcmF0b3IoKTsKKy8vCisvLyAgICAgICAgICAgIGludCBqID0gMDsKKy8vICAgICAgICAgICAgd2hpbGUgKCByZXN1bHRJdGVyLmhhc05leHQoKSApCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHhjID0gKFhtbEN1cnNvcilyZXN1bHRJdGVyLm5leHQoKTsgIC8vaXQncyB0aGUgc2FtZSBvYmplY3QgYXMgcHJldmlvdXMgeGMKKy8vICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlRXhwZWN0ZWQoaSwgaiwgeGMudG9TdHJpbmcoKSk7CisvLyAgICAgICAgICAgICAgICBjaGVjayhpLCBqLCB4Yyk7CisvLyAgICAgICAgICAgICAgICBqKys7CisvLyAgICAgICAgICAgIH0KKy8vCisvLyAgICAgICAgICAgIHhjLmRpc3Bvc2UoKTsKKy8vICAgICAgICB9CisvLyAgICAgICAgY2F0Y2ggKFhQYXRoU3ludGF4RXhjZXB0aW9uIGUpCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIGUuZ2V0TXVsdGlsaW5lTWVzc2FnZSgpICk7CisvLyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworLy8gICAgICAgIH0KKy8vICAgICAgICBjYXRjaCAoSmF4ZW5FeGNlcHRpb24gZSkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworLy8gICAgICAgIH0KKy8vICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcnVuWHBhdGgyKFhtbE9iamVjdCBkb2MsIFN0cmluZyB4cGF0aFN0ciwgaW50IGkpCisgICAgeworICAgICAgICBYbWxDdXJzb3IgeGMgPSBkb2MubmV3Q3Vyc29yKCk7CisJCXhjLnNlbGVjdFBhdGgoIHhwYXRoU3RyICk7CisKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICB3aGlsZSAoIHhjLnRvTmV4dFNlbGVjdGlvbigpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZ2VuZXJhdGVFeHBlY3RlZChpLCBqLCB4Yy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGNoZWNrKGksIGosIHhjKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisJCXhjLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrKGludCBleHByZXNpb25OdW1iZXIsIGludCByZXN1bHROdW1iZXIsIFhtbEN1cnNvciBhY3R1YWwpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQ3Vyc29yIGV4cGVjdGVkID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInhwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XyIgKyBleHByZXNpb25OdW1iZXIgKworICAgICAgICAgICAgICAgICJfIiArIHJlc3VsdE51bWJlciArICIueG1sIikpLm5ld0N1cnNvcigpOworCisgICAgICAgICAgICBYbWxDb21wYXJhdG9yLkRpYWdub3N0aWMgZGlhZyA9IG5ldyBYbWxDb21wYXJhdG9yLkRpYWdub3N0aWMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBYbWxDb21wYXJhdG9yLmxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKGFjdHVhbC50b1N0cmluZygpLCBleHBlY3RlZC50b1N0cmluZygpLCBkaWFnKTsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIi0tLS0tLS0tLS0tLSAgRm91bmQgZGlmZmVyZW5jZToiICsgZXhwcmVzaW9uTnVtYmVyICsgIiAiICsgcmVzdWx0TnVtYmVyICsKKyAgICAgICAgICAgICAgICAiIGFjdHVhbD1cbiciICsgYWN0dWFsICsgIidcbmV4cGVjdGVkPVxuJyIgKyBleHBlY3RlZCArICInXG5kaWFnbm9zdGljPSIgKyBkaWFnICwgbWF0Y2gpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgdG8gcmVnZW4gdGhlIGV4cGVjdGVkIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVFeHBlY3RlZChpbnQgZXhwcmVzaW9uTnVtYmVyLCBpbnQgcmVzdWx0TnVtYmVyLCBTdHJpbmcgY29udGVudCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoVGVzdEVudi54YmVhbkNhc2UoInhwYXRoL2V4cGVjdGVkL0pheGVuWFBhdGhUZXN0XyIgKyBleHByZXNpb25OdW1iZXIgKworICAgICAgICAgICAgICAgICJfIiArIHJlc3VsdE51bWJlciArICIueG1sIikpOworCisgICAgICAgICAgICBmdy53cml0ZShjb250ZW50KTsKKyAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTGlzdEFuZFVuaW9uVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9MaXN0QW5kVW5pb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDQyNWYKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvTGlzdEFuZFVuaW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IG9yZy5vcGVudXJpLmx1dC5MaXN0c0RvY3VtZW50OworaW1wb3J0IG9yZy5vcGVudXJpLmx1dC5VbmlvbnNEb2N1bWVudDsKK2ltcG9ydCBvcmcub3BlbnVyaS5sdXQuSW5jaWRlbnRSZXBvcnRzRG9jdW1lbnQ7CitpbXBvcnQgb3JnLm9wZW51cmkubHV0LkRhdGVPckRhdGVUaW1lOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2ltcGxlVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGVUaW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ2FsZW5kYXI7CisKK3B1YmxpYyBjbGFzcyBMaXN0QW5kVW5pb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIExpc3RBbmRVbmlvblRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShMaXN0QW5kVW5pb25UZXN0cy5jbGFzcyk7IH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0R2V0dGVycygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3RzRG9jdW1lbnQgbGlzdHMgPSBMaXN0c0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxsdXQ6bGlzdHMgeG1sbnM6bHV0PSdodHRwOi8vb3BlbnVyaS5vcmcvbHV0Jz48bHV0OmludC1saXN0PjIgNCA4IDE2IDMyPC9sdXQ6aW50LWxpc3Q+PGx1dDpubmktbGlzdD51bmJvdW5kZWQgMyB1bmJvdW5kZWQgNjwvbHV0Om5uaS1saXN0PjwvbHV0Omxpc3RzPiIpOworICAgICAgICBMaXN0IGludExpc3QgPSBsaXN0cy5nZXRMaXN0cygpLmdldEludExpc3QoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgaW50TGlzdC5nZXQoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQpLCBpbnRMaXN0LmdldCgxKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoOCksIGludExpc3QuZ2V0KDIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNiksIGludExpc3QuZ2V0KDMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMiksIGludExpc3QuZ2V0KDQpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1LCBpbnRMaXN0LnNpemUoKSk7CisKKyAgICAgICAgTGlzdCBubmlMaXN0ID0gbGlzdHMuZ2V0TGlzdHMoKS5nZXRObmlMaXN0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVuYm91bmRlZCIsIG5uaUxpc3QuZ2V0KDApKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMyksIG5uaUxpc3QuZ2V0KDEpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5ib3VuZGVkIiwgbm5pTGlzdC5nZXQoMikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZig2KSwgbm5pTGlzdC5nZXQoMykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIG5uaUxpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBMaXN0c0RvY3VtZW50IGRvYyA9IExpc3RzRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBMaXN0c0RvY3VtZW50Lkxpc3RzIGxpc3RzID0gZG9jLmFkZE5ld0xpc3RzKCk7CisgICAgICAgIGxpc3RzLnNldEludExpc3QoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcig0KSwgbmV3IEludGVnZXIoMTgpIH0pKTsKKyAgICAgICAgbGlzdHMuc2V0Tm5pTGlzdChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IEJpZ0ludGVnZXIudmFsdWVPZigxKSwgQmlnSW50ZWdlci52YWx1ZU9mKDIpLCAidW5ib3VuZGVkIiB9KSk7CisgICAgICAgIFN0cmluZyB4dGV4dCA9IGRvYy54bWxUZXh0KCk7CisKKyAgICAgICAgTGlzdHNEb2N1bWVudCBkb2NydCA9IExpc3RzRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSh4dGV4dCk7CisgICAgICAgIExpc3QgaW50TGlzdCA9IGRvY3J0LmdldExpc3RzKCkuZ2V0SW50TGlzdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQpLCBpbnRMaXN0LmdldCgwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTgpLCBpbnRMaXN0LmdldCgxKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgaW50TGlzdC5zaXplKCkpOworCisgICAgICAgIExpc3Qgbm5pTGlzdCA9IGRvY3J0LmdldExpc3RzKCkuZ2V0Tm5pTGlzdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxKSwgbm5pTGlzdC5nZXQoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigyKSwgbm5pTGlzdC5nZXQoMSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCBubmlMaXN0LmdldCgyKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgbm5pTGlzdC5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkdldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBVbmlvbnNEb2N1bWVudCB1bmlvbnMgPSBVbmlvbnNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICI8bHV0OnVuaW9ucyB4bWxuczpsdXQ9J2h0dHA6Ly9vcGVudXJpLm9yZy9sdXQnPjxsdXQ6bm5pPnVuYm91bmRlZDwvbHV0Om5uaT48bHV0OnNpemVzPjIgMyA1IDcgMTE8L2x1dDpzaXplcz48L2x1dDp1bmlvbnM+Iik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidW5ib3VuZGVkIiwgdW5pb25zLmdldFVuaW9ucygpLmdldE5uaSgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh1bmlvbnMuZ2V0VW5pb25zKCkuZ2V0U2l6ZXMoKSBpbnN0YW5jZW9mIExpc3QpOworICAgICAgICBMaXN0IHNpemVzID0gKExpc3QpdW5pb25zLmdldFVuaW9ucygpLmdldFNpemVzKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMiksIHNpemVzLmdldCgwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMyksIHNpemVzLmdldCgxKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIHNpemVzLmdldCgyKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHNpemVzLmdldCgzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTEpLCBzaXplcy5nZXQoNCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIHNpemVzLnNpemUoKSk7CisKKyAgICAgICAgVW5pb25zRG9jdW1lbnQgdW5pb25zMiA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxsdXQ6dW5pb25zIHhtbG5zOmx1dD0naHR0cDovL29wZW51cmkub3JnL2x1dCc+PGx1dDpubmk+Mzc8L2x1dDpubmk+PGx1dDpzaXplcz5hbGw8L2x1dDpzaXplcz48L2x1dDp1bmlvbnM+Iik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMzcpLCB1bmlvbnMyLmdldFVuaW9ucygpLmdldE5uaSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWxsIiwgdW5pb25zMi5nZXRVbmlvbnMoKS5nZXRTaXplcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25TZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKworICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudAorICAgICAgICBVbmlvbnNEb2N1bWVudCBkb2MgPSBVbmlvbnNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFVuaW9uc0RvY3VtZW50LlVuaW9ucyB1bmlvbnMgPSBkb2MuYWRkTmV3VW5pb25zKCk7CisgICAgICAgIHVuaW9ucy5zZXRObmkoInVuYm91bmRlZCIpOworICAgICAgICB1bmlvbnMuc2V0U2l6ZXMoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcig1KSwgbmV3IEludGVnZXIoMjIpIH0pKTsKKworICAgICAgICAvLyByb3VuZCB0cmlwIHRvIHMgdGV4dAorICAgICAgICBTdHJpbmcgeHRleHQgPSBkb2MueG1sVGV4dCgpOworICAgICAgICBVbmlvbnNEb2N1bWVudCBkb2NydCA9IFVuaW9uc0RvY3VtZW50LkZhY3RvcnkucGFyc2UoeHRleHQpOworCisgICAgICAgIC8vIHZlcmlmeSBjb250ZW50cworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ1bmJvdW5kZWQiLCBkb2NydC5nZXRVbmlvbnMoKS5nZXRObmkoKSk7CisgICAgICAgIExpc3Qgc2l6ZXMgPSAoTGlzdClkb2NydC5nZXRVbmlvbnMoKS5nZXRTaXplcygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCBzaXplcy5nZXQoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDIyKSwgc2l6ZXMuZ2V0KDEpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBzaXplcy5zaXplKCkpOworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgb3JpZ2luYWwgZG9jdW1lbnQKKyAgICAgICAgdW5pb25zLnNldE5uaShuZXcgSW50ZWdlcigxMSkpOworICAgICAgICB1bmlvbnMuc2V0U2l6ZXMoInVua25vd24iKTsKKworICAgICAgICAvLyByb3VuZCB0cmlwIGl0IGFnYWluCisgICAgICAgIHh0ZXh0ID0gZG9jLnhtbFRleHQoKTsKKyAgICAgICAgZG9jcnQgPSBVbmlvbnNEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHh0ZXh0KTsKKworICAgICAgICAvLyB2ZXJpZnkgY29udGVudHMgYWdhaW4KKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMTEpLCBkb2NydC5nZXRVbmlvbnMoKS5nZXRObmkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInVua25vd24iLCBkb2NydC5nZXRVbmlvbnMoKS5nZXRTaXplcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25BcnJheSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluY2lkZW50UmVwb3J0c0RvY3VtZW50IGRvYyA9IEluY2lkZW50UmVwb3J0c0RvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgICI8bHV0OmluY2lkZW50LXJlcG9ydHMgeG1sbnM6bHV0PSdodHRwOi8vb3BlbnVyaS5vcmcvbHV0Jz48bHV0OndoZW4+MjAwMS0wOC0wNlQwMzozNDowMDwvbHV0OndoZW4+PGx1dDp3aGVuPjIwMDItMDEtMDQ8L2x1dDp3aGVuPjxsdXQ6d2hlbj4yMDAyLTA4LTI2VDIzOjEwOjAwPC9sdXQ6d2hlbj48L2x1dDppbmNpZGVudC1yZXBvcnRzPiIpOworICAgICAgICBJbmNpZGVudFJlcG9ydHNEb2N1bWVudC5JbmNpZGVudFJlcG9ydHMgcmVwb3J0cyA9IGRvYy5nZXRJbmNpZGVudFJlcG9ydHMoKTsKKyAgICAgICAgRGF0ZU9yRGF0ZVRpbWVbXSBkdCA9IHJlcG9ydHMueGdldFdoZW5BcnJheSgpOworICAgICAgICBDYWxlbmRhcltdIGdkID0gcmVwb3J0cy5nZXRXaGVuQXJyYXkoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCBkdC5sZW5ndGgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGdkLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoU2ltcGxlVmFsdWUpZHRbaV0pLmdEYXRlVmFsdWUoKSwgbmV3IEdEYXRlKGdkW2ldKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGdkW2ldLCBkdFtpXS5vYmplY3RWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIyMDAxLTA4LTA2VDAzOjM0OjAwIiksIGdkWzBdKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjIwMDItMDEtMDQiKSwgZ2RbMV0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMi0wOC0yNlQyMzoxMDowMCIpLCBnZFsyXSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhYbWxEYXRlVGltZS50eXBlLCBkdFswXS5pbnN0YW5jZVR5cGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZS50eXBlLCBkdFsxXS5pbnN0YW5jZVR5cGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZVRpbWUudHlwZSwgZHRbMl0uaW5zdGFuY2VUeXBlKCkpOworCisgICAgICAgIHJlcG9ydHMuc2V0V2hlbkFycmF5KDAsIG5ldyBYbWxDYWxlbmRhcigiMTk4MC0wNC0xOCIpKTsKKyAgICAgICAgcmVwb3J0cy5zZXRXaGVuQXJyYXkoMSwgbmV3IFhtbENhbGVuZGFyKCIxOTcwLTEyLTIwVDA0OjMzOjAwIikpOworCisgICAgICAgIGR0ID0gcmVwb3J0cy54Z2V0V2hlbkFycmF5KCk7CisgICAgICAgIGdkID0gcmVwb3J0cy5nZXRXaGVuQXJyYXkoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMTk4MC0wNC0xOCIpLCBnZFswXSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFhtbENhbGVuZGFyKCIxOTcwLTEyLTIwVDA0OjMzOjAwIiksIGdkWzFdKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjIwMDItMDgtMjZUMjM6MTA6MDAiKSwgZ2RbMl0pOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZS50eXBlLCBkdFswXS5pbnN0YW5jZVR5cGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoWG1sRGF0ZVRpbWUudHlwZSwgZHRbMV0uaW5zdGFuY2VUeXBlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFhtbERhdGVUaW1lLnR5cGUsIGR0WzJdLmluc3RhbmNlVHlwZSgpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL05hbWV3b3JsZFRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9OYW1ld29ybGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwZGY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9OYW1ld29ybGRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLk5hbWV3b3JsZERvY3VtZW50OworaW1wb3J0IG9yZy5vcGVudXJpLm5hbWV3b3JsZC5OYW1ld29ybGREb2N1bWVudC5OYW1ld29ybGQ7CitpbXBvcnQgb3JnLm9wZW51cmkubmFtZXdvcmxkLkxvYzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgTmFtZXdvcmxkVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIE5hbWV3b3JsZFRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKE5hbWV3b3JsZFRlc3QuY2xhc3MpOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFdvcmxkMSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE5hbWV3b3JsZERvY3VtZW50IGRvYyA9IChOYW1ld29ybGREb2N1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoIm5hbWV3b3JsZC93b3JsZDEueG1sIikpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IFFOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgIm5hbWV3b3JsZCIpLCBkb2Muc2NoZW1hVHlwZSgpLmdldERvY3VtZW50RWxlbWVudE5hbWUoKSk7CisKKyAgICAgICAgUU5hbWVbXSBjb250ZW50cyA9IG5ldyBRTmFtZVtdCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcmNpdHkiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3Rvd24iKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnRvd24iKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb2NpdHkiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnRvd24iKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3Rvd24iKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Jhci5jb20vIiwgImJhcnZpbGxhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2Zvby5jb20vIiwgImZvb3ZpbGxhZ2UiKSwKKyAgICAgICAgfTsKKyAgICAgICAgaW50IHQgPSAwOworCisgICAgICAgIE5hbWV3b3JsZCB3b3JsZCA9IGRvYy5nZXROYW1ld29ybGQoKTsKKyAgICAgICAgTmFtZXdvcmxkLklzbGFuZFtdIGlzbGFuZHMgPSB3b3JsZC5nZXRJc2xhbmRBcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzbGFuZHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIExvY1tdIGxvY3MgPSBpc2xhbmRzW2ldLmdldExvY2F0aW9uQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2MuUmVmZXJlbmNlW10gcmVmcyA9IGxvY3Nbal0uZ2V0UmVmZXJlbmNlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHJlZnMubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sIHJlZnNba10uZ2V0VG8oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFjY2Vzc0J5TmFtZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE5hbWV3b3JsZERvY3VtZW50IGRvYyA9IChOYW1ld29ybGREb2N1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgWG1sTG9hZGVyLkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoIm5hbWV3b3JsZC93b3JsZDEueG1sIiksCisgICAgICAgICAgICAgICAgICAgIE5hbWV3b3JsZERvY3VtZW50LnR5cGUpOworICAgICAgICBTdHJpbmdbXSBjb250ZW50cyA9IG5ldyBTdHJpbmdbXQorICAgICAgICB7CisgICAgICAgICAgICAiaHR0cDovL2Zvby5jb20vIiwKKyAgICAgICAgICAgICJmb29jaXR5IiwKKyAgICAgICAgICAgICJmb290b3duIiwKKyAgICAgICAgICAgICJmb292aWxsYWdlIiwKKyAgICAgICAgICAgICJodHRwOi8vYmFyLmNvbS8iLAorICAgICAgICAgICAgImJhcmNpdHkiLAorICAgICAgICAgICAgImJhcnRvd24iLAorICAgICAgICAgICAgImJhcnZpbGxhZ2UiLAorICAgICAgICB9OworICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgIE5hbWV3b3JsZCB3b3JsZCA9IChOYW1ld29ybGQpZG9jLmVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibmFtZXdvcmxkIiksIDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmxkLmNvdW50T2ZFbGVtZW50QnlOYW1lKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIiwgImlzbGFuZCIpKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1ld29ybGQuSXNsYW5kIGlzbGFuZCA9IChOYW1ld29ybGQuSXNsYW5kKXdvcmxkLmVsZW1lbnRCeU5hbWUobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAiaXNsYW5kIiksIGkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb250ZW50c1t0KytdLCAoKFNpbXBsZVZhbHVlKWlzbGFuZC5hdHRyaWJ1dGVCeU5hbWUobmV3IE5hbWUoInRhcmdldE5hbWVzcGFjZSIpKSkuc3RyaW5nVmFsdWUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlzbGFuZC5jb3VudE9mRWxlbWVudEJ5TmFtZShuZXcgTmFtZSggImh0dHA6Ly9vcGVudXJpLm9yZy9uYW1ld29ybGQiLCAibG9jYXRpb24iKSk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2MgbG9jID0gKExvYylpc2xhbmQuZWxlbWVudEJ5TmFtZShuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL25hbWV3b3JsZCIsICJsb2NhdGlvbiIpLCBqKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRlbnRzW3QrK10sICgoU2ltcGxlVmFsdWUpbG9jLmF0dHJpYnV0ZUJ5TmFtZShuZXcgTmFtZSgibmFtZSIpKSkuc3RyaW5nVmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKi8KKworfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL051bWVyYWxzVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9OdW1lcmFsc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MWUwYgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9OdW1lcmFsc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBvcmcub3BlbnVyaS50ZXN0TnVtZXJhbHMuRG9jRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnZhbHVlcy5YbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCisgKiBEYXRlOiBOb3YgMjMsIDIwMDMKKyAqLworcHVibGljIGNsYXNzIE51bWVyYWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBOdW1lcmFsc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShOdW1lcmFsc1Rlc3RzLmNsYXNzKTsgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jRG9jdW1lbnQuRG9jIGRvYzsKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIFN0cmluZyBpbnN0ID0KKyAgICAgICAgICAgICI8ZG9jIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvdGVzdE51bWVyYWxzJz5cbiIgKworICAgICAgICAgICAgIiAgPHN0cmluZz4gICAgdGhpcyBpcyBhIGxvbmcgc3RyaW5nIFxuIiArCisgICAgICAgICAgICAiICAuLi4gICA8L3N0cmluZz5cbiIgKworICAgICAgICAgICAgIiAgPGludD5cbiIgKworICAgICAgICAgICAgIiAgCQkrNVxuIiArCisgICAgICAgICAgICAiICA8L2ludD5cbiIgKworICAgICAgICAgICAgIiAgPGludD5cbiIgKworICAgICAgICAgICAgIiAgCQktNlxuIiArCisgICAgICAgICAgICAiICA8L2ludD5cbiIgKworICAgICAgICAgICAgIiAgPGludD5cbiIgKworICAgICAgICAgICAgIiAgCQkrMDAwMDAwMDAwMTVcbiIgKworICAgICAgICAgICAgIiAgPC9pbnQ+XG4iICsKKyAgICAgICAgICAgICIgIDxpbnQ+NzwhLS10aGlzIGhhcyB0byBiZSBhIDc3IGludCB2YWx1ZS0tPjc8L2ludD5cbiIgKworICAgICAgICAgICAgIiAgPGJvb2xlYW4+XG4iICsKKyAgICAgICAgICAgICIgIAkJdHJ1ZVxuIiArCisgICAgICAgICAgICAiICA8L2Jvb2xlYW4+XG4iICsKKyAgICAgICAgICAgICIgIDxib29sZWFuPlxuIiArCisgICAgICAgICAgICAiICAJCWZhbHNlXG4iICsKKyAgICAgICAgICAgICIgIDwvYm9vbGVhbj5cbiIgKworICAgICAgICAgICAgIiAgPGJvb2xlYW4+XG4iICsKKyAgICAgICAgICAgICIgIAkJMFxuIiArCisgICAgICAgICAgICAiICA8L2Jvb2xlYW4+XG4iICsKKyAgICAgICAgICAgICIgIDxib29sZWFuPlxuIiArCisgICAgICAgICAgICAiICAJCTFcbiIgKworICAgICAgICAgICAgIiAgPC9ib29sZWFuPlxuIiArCisgICAgICAgICAgICAiICA8Ym9vbGVhbj5cbiIgKworICAgICAgICAgICAgIiAgCQl0cnVlIGlzIG5vdFxuIiArCisgICAgICAgICAgICAiICA8L2Jvb2xlYW4+XG4iICsKKyAgICAgICAgICAgICIgIDxzaG9ydD5cbiIgKworICAgICAgICAgICAgIiAgCQkrMDNcbiIgKworICAgICAgICAgICAgIiAgPC9zaG9ydD5cbiIgKworICAgICAgICAgICAgIiAgPGJ5dGU+XG4iICsKKyAgICAgICAgICAgICIgIAkJKzAwMVxuIiArCisgICAgICAgICAgICAiICA8L2J5dGU+XG4iICsKKyAgICAgICAgICAgICIgIDxsb25nPi0wNTAwMDAwPC9sb25nPlxuIiArCisgICAgICAgICAgICAiICA8bG9uZz5cbiIgKworICAgICAgICAgICAgIiAgICAwMDFcbiIgKworICAgICAgICAgICAgIiAgPC9sb25nPlxuIiArCisgICAgICAgICAgICAiICA8bG9uZz5cbiIgKworICAgICAgICAgICAgIiAgICArMDAyXG4iICsKKyAgICAgICAgICAgICIgIDwvbG9uZz5cbiIgKworICAgICAgICAgICAgIiAgPGRvdWJsZT5cbiIgKworICAgICAgICAgICAgIiAgICArMDAxXG4iICsKKyAgICAgICAgICAgICIgIDwvZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICA8ZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICAgIC0wMDIuMDA3MDAwXG4iICsKKyAgICAgICAgICAgICIgIDwvZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICA8ZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICAgIElORlxuIiArCisgICAgICAgICAgICAiICA8L2RvdWJsZT5cbiIgKworICAgICAgICAgICAgIiAgPGRvdWJsZT5cbiIgKworICAgICAgICAgICAgIiAgICAtSU5GXG4iICsKKyAgICAgICAgICAgICIgIDwvZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICA8ZG91YmxlPlxuIiArCisgICAgICAgICAgICAiICAgIE5hTlxuIiArCisgICAgICAgICAgICAiICA8L2RvdWJsZT5cbiIgKworICAgICAgICAgICAgIiAgPGZsb2F0PlxuIiArCisgICAgICAgICAgICAiICAgICsxMi4zMjVcbiIgKworICAgICAgICAgICAgIiAgPC9mbG9hdD5cbiIgKworICAgICAgICAgICAgIiAgPGZsb2F0PlxuIiArCisgICAgICAgICAgICAiICAgIE5hTlxuIiArCisgICAgICAgICAgICAiICA8L2Zsb2F0PlxuIiArCisgICAgICAgICAgICAiICA8ZmxvYXQ+XG4iICsKKyAgICAgICAgICAgICIgICAgSU5GXG4iICsKKyAgICAgICAgICAgICIgIDwvZmxvYXQ+XG4iICsKKyAgICAgICAgICAgICIgIDxmbG9hdD5cbiIgKworICAgICAgICAgICAgIiAgICAtSU5GXG4iICsKKyAgICAgICAgICAgICIgIDwvZmxvYXQ+XG4iICsKKyAgICAgICAgICAgICIgIDxkZWNpbWFsPlxuIiArCisgICAgICAgICAgICAiICAgICswMDEuMDAxXG4iICsKKyAgICAgICAgICAgICIgIDwvZGVjaW1hbD5cbiIgKworICAgICAgICAgICAgIiAgPGludGVnZXI+XG4iICsKKyAgICAgICAgICAgICIgICAgKzAwMTwhLS1jb21tZW50cy0tPjAwMDAwMDAwMFxuIiArCisgICAgICAgICAgICAiICA8L2ludGVnZXI+XG4iICsKKyAgICAgICAgICAgICI8L2RvYz4iOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBkb2MgPSBEb2NEb2N1bWVudC5GYWN0b3J5LnBhcnNlKGluc3QpLmdldERvYygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBzID0gIiAgICB0aGlzIGlzIGEgbG9uZyBzdHJpbmcgXG4iICsgIiAgLi4uICAgIjsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlN0cmluZyBleHBlY3RlZDpcbiciICsgcyArICInICAgICAgICAgYWN0dWFsOlxuJyIgKworICAgICAgICAgICAgZG9jLmdldFN0cmluZ0FycmF5KClbMF0gKyAiJyIsIHMuZXF1YWxzKGRvYy5nZXRTdHJpbmdBcnJheSgpWzBdKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiaW50IGV4cGVjdGVkOiIgKyA1ICsgIiBhY3R1YWw6IiArIGRvYy5nZXRJbnRBcnJheSgpWzBdLCBkb2MuZ2V0SW50QXJyYXkoKVswXT09NSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiaW50IGV4cGVjdGVkOiIgKyAoLTYpICsgIiBhY3R1YWw6IiArIGRvYy5nZXRJbnRBcnJheSgpWzFdLCBkb2MuZ2V0SW50QXJyYXkoKVsxXT09LTYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImludCBleHBlY3RlZDoiICsgMTUgKyAiIGFjdHVhbDoiICsgZG9jLmdldEludEFycmF5KClbMl0sIGRvYy5nZXRJbnRBcnJheSgpWzJdPT0xNSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDUoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiaW50IGV4cGVjdGVkOiIgKyA3NyArICIgYWN0dWFsOiIgKyBkb2MuZ2V0SW50QXJyYXkoKVszXSwgZG9jLmdldEludEFycmF5KClbM109PTc3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRvYy5nZXRCb29sZWFuQXJyYXkoMCk9PXRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldEJvb2xlYW5BcnJheSgxKT09ZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldEJvb2xlYW5BcnJheSgyKT09ZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZG9jLmdldEJvb2xlYW5BcnJheSgzKT09dHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDEwKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsgYm9vbGVhbiBiID0gZG9jLmdldEJvb2xlYW5BcnJheSgpWzRdOyBBc3NlcnQuYXNzZXJ0VHJ1ZShmYWxzZSk7IH0KKyAgICAgICAgY2F0Y2goWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgIHsgQXNzZXJ0LmFzc2VydFRydWUodHJ1ZSk7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTEoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0U2hvcnRBcnJheSgpWzBdPT0zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTIoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0Qnl0ZUFycmF5KClbMF09PTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxMygpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJsb25nIGV4cGVjdGVkOiIgKyAoLTUwMDAwKSArICIgYWN0dWFsOiIgKyBkb2MuZ2V0TG9uZ0FycmF5KClbMF0sCisgICAgICAgICAgICBkb2MuZ2V0TG9uZ0FycmF5KClbMF09PS01MDAwMDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJsb25nIGV4cGVjdGVkOiIgKyAxICsgIiBhY3R1YWw6IiArIGRvYy5nZXRMb25nQXJyYXkoKVsxXSwKKyAgICAgICAgICAgIGRvYy5nZXRMb25nQXJyYXkoKVsxXT09MSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDE1KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImxvbmcgZXhwZWN0ZWQ6IiArIDIgKyAiIGFjdHVhbDoiICsgZG9jLmdldExvbmdBcnJheSgpWzJdLAorICAgICAgICAgICAgZG9jLmdldExvbmdBcnJheSgpWzJdPT0yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTYoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MuZ2V0RG91YmxlQXJyYXkoKVswXT09MSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDE3KCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImRvdWJsZSBleHBlY3RlZDoiICsgLTIuMDA3ZCArICIgYWN0dWFsOiIgKyBkb2MuZ2V0RG91YmxlQXJyYXkoKVsxXSwKKyAgICAgICAgICAgIGRvYy5nZXREb3VibGVBcnJheSgpWzFdPT0tMi4wMDdkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTgoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRG91YmxlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkuCisgICAgICAgICAgICBlcXVhbHMobmV3IERvdWJsZShkb2MuZ2V0RG91YmxlQXJyYXkoKVsyXSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTkoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRG91YmxlKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkuCisgICAgICAgICAgICBlcXVhbHMobmV3IERvdWJsZShkb2MuZ2V0RG91YmxlQXJyYXkoKVszXSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjAoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRG91YmxlKERvdWJsZS5OYU4pLgorICAgICAgICAgICAgZXF1YWxzKG5ldyBEb3VibGUoZG9jLmdldERvdWJsZUFycmF5KClbNF0pKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIxKCkgdGhyb3dzIFhtbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImZsb2FkIGV4cGVjdGVkOiIgKyAxMi4zMjVmICsgIiBhY3R1YWw6IiArIGRvYy5nZXRGbG9hdEFycmF5KClbMF0sCisgICAgICAgICAgICBkb2MuZ2V0RmxvYXRBcnJheSgpWzBdPT0xMi4zMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjIoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmxvYXQoRmxvYXQuTmFOKS4KKyAgICAgICAgICAgIGVxdWFscyhuZXcgRmxvYXQoZG9jLmdldEZsb2F0QXJyYXkoKVsxXSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjMoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZmxvYWQgZXhwZWN0ZWQ6IiArIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZICsgIiBhY3R1YWw6IiArIGRvYy5nZXRGbG9hdEFycmF5KClbMl0sCisgICAgICAgICAgICBuZXcgRmxvYXQoRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkpLmVxdWFscyhuZXcgRmxvYXQoZG9jLmdldEZsb2F0QXJyYXkoKVsyXSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjQoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmxvYXQoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpLgorICAgICAgICAgICAgZXF1YWxzKG5ldyBGbG9hdChkb2MuZ2V0RmxvYXRBcnJheSgpWzNdKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QyNSgpIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG5ldyBCaWdEZWNpbWFsKCIxLjAwMSIpLmVxdWFscyhkb2MuZ2V0RGVjaW1hbEFycmF5KClbMF0pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MjYoKSB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgQmlnSW50ZWdlcigiMTAwMDAwMDAwMCIpLmVxdWFscyhkb2MuZ2V0SW50ZWdlckFycmF5KDApKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lU2V0VGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lU2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWU4NTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUU5hbWVTZXRUZXN0LmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldEJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5RTmFtZVNldFNwZWNpZmljYXRpb247CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIFFOYW1lU2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIFFOYW1lU2V0VGVzdChTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUU5hbWVTZXRUZXN0LmNsYXNzKTsgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGludCBpbmRlbnQsIGludCBpdGVyLCBTdHJpbmcgcCwgUU5hbWVTZXRCdWlsZGVyIHNldCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgIFN5c3RlbS5lcnIucHJpbnQobmV3IERlY2ltYWxGb3JtYXQoIjAwMDAwICIpLmZvcm1hdChpdGVyKSk7CisgICAgICAgIHdoaWxlIChpbmRlbnQtLSA+IDApCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50KCcgJyk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnQocCk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIiA9ICIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2V0LmR1bXAoKSk7CisgICAgICAgICovCisKKyAgICAgICAgcmV0dXJuICJjYXNlIyAiICsgaXRlciArICIgIiArIHAgKyAiICIgKyBzZXQudG9TdHJpbmcoKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdFFOYW1lU2V0cygpCisgICAgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IDEwMDAwOworICAgICAgICBpbnQgc2VlZCA9IDA7CisgICAgICAgIGludCBzdG9wYXQgPSAtMTsKKworICAgICAgICBSYW5kb20gcm5kID0gbmV3IFJhbmRvbShzZWVkKTsKKyAgICAgICAgU3RyaW5nW10gbG9jYWxuYW1lID0geyJhIiwgImIiLCAiYyIsICJkIiwgImUifTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlID0geyJuMSIsICJuMiIsICJuMyIsICJuNCIsICJuNSJ9OworICAgICAgICBpbnQgd2lkdGggPSBsb2NhbG5hbWUubGVuZ3RoOworCisgICAgICAgIFFOYW1lW10gbmFtZSA9IG5ldyBRTmFtZVt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmFtZXNwYWNlLmxlbmd0aDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWVbaSArIHdpZHRoICogal0gPSBuZXcgUU5hbWUobmFtZXNwYWNlW2pdLCBsb2NhbG5hbWVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RhY2sgdGVzdHN0YWNrID0gbmV3IFN0YWNrKCk7IC8vIHN0YWNrIG9mIHNldHMKKyAgICAgICAgU3RhY2sgdHJhY2tzdGFjayA9IG5ldyBTdGFjaygpOyAvLyBzdGFjayBvZiBib29sZWFuIGFycmF5cworCisgICAgICAgIFFOYW1lU2V0QnVpbGRlciBjdXJyZW50ID0gbmV3IFFOYW1lU2V0QnVpbGRlcigpOworICAgICAgICBib29sZWFuW10gY29udGVudHMgPSBuZXcgYm9vbGVhblt3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGhdOworICAgICAgICBib29sZWFuW10gdGVtcDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgaiA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBpdGVyYXRpb25zOyBsKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZvciBkZWJ1Z2dpbmcKKworICAgICAgICAgICAgaWYgKGwgPT0gc3RvcGF0KQorICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV2UncmUgaGVyZSIpOworCisgICAgICAgICAgICAvLyBhcHBseSBhIHJhbmRvbSBvcGVyYXRpb24KKworICAgICAgICAgICAgaWYgKHJuZC5uZXh0SW50KDMpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IHJuZC5uZXh0SW50KHdpZHRoIC0gMSk7IC8vIGRvbid0IGRvIHRoZSBsYXN0IG9uZSBmb3IgaXNBbGwgdGVzdAorICAgICAgICAgICAgICAgIGogPSBybmQubmV4dEludChuYW1lc3BhY2UubGVuZ3RoIC0gMSk7IC8vIGRvbid0IGRvIHRoZSBsYXN0IG9uZSBmb3IgaXNBbGwgdGVzdAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbGFiZWw7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGVzdHN0YWNrLnNpemUoKSA8IDEgPyAyNCA6IHJuZC5uZXh0SW50KGl0ZXJhdGlvbnMgLSBsID4gdGVzdHN0YWNrLnNpemUoKSA/IDI0IDogNSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdHN0YWNrLnB1c2goY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrc3RhY2sucHVzaChjb250ZW50cyk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gbmV3IGJvb2xlYW5bd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibmV3IjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgdGVzdHN0YWNrLnB1c2goY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrc3RhY2sucHVzaChjb250ZW50cyk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gbmV3IGJvb2xlYW5bd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocm5kLm5leHRJbnQoMikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5pbnZlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trICsgd2lkdGggKiAobmFtZXNwYWNlLmxlbmd0aCAtIDEpXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBoID0gMDsgaCA8IG5hbWVzcGFjZS5sZW5ndGggLSAxOyBoKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChybmQubmV4dEludCgyKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlTmFtZXNwYWNlKG5hbWVzcGFjZVtoXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGROYW1lc3BhY2UobmFtZXNwYWNlW2hdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1t3aWR0aCAtIDEgKyB3aWR0aCAqIGhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggLSAxOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJuZC5uZXh0SW50KDIpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlKG5hbWVbayArIHdpZHRoICogaF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkKG5hbWVbayArIHdpZHRoICogaF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trICsgd2lkdGggKiBoXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInJhbmRvbSI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZEFsbCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wb3AoKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImFkZCBzZXQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVBbGwoKFFOYW1lU2V0U3BlY2lmaWNhdGlvbil0ZXN0c3RhY2sucG9wKCkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGJvb2xlYW5bXSl0cmFja3N0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBba10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmVtb3ZlIHNldCI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlc3RyaWN0KChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChib29sZWFuW10pdHJhY2tzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVtcFtrXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJyZXN0cmljdCBzZXQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAidW5pb24iOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IFFOYW1lU2V0QnVpbGRlcihjdXJyZW50LnVuaW9uKChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1trXSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInVuaW9uIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImludGVyc2VjdCI7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQuaW50ZXJzZWN0KChRTmFtZVNldFNwZWNpZmljYXRpb24pdGVzdHN0YWNrLnBvcCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXBba10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNba10gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiaW50ZXJzZWN0IjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJjb3B5IjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGQobmFtZVtpICsgd2lkdGggKiBqXSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2kgKyB3aWR0aCAqIGpdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiYWRkIG9uZSAiICsgbmFtZVtpICsgd2lkdGggKiBqXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZShuYW1lW2kgKyB3aWR0aCAqIGpdKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudHNbaSArIHdpZHRoICogal0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmVtb3ZlIG9uZSAiICsgbmFtZVtpICsgd2lkdGggKiBqXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkTmFtZXNwYWNlKG5hbWVzcGFjZVtqXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2sgKyB3aWR0aCAqIGpdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiYWRkIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlW2pdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVOYW1lc3BhY2UobmFtZXNwYWNlW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aDsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbayArIHdpZHRoICogal0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAicmVtb3ZlIG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlW2pdOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5pbnZlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gIWNvbnRlbnRzW2tdOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJpbnZlcnQiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgUU5hbWVTZXRCdWlsZGVyKGN1cnJlbnQuaW52ZXJzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2tdID0gIWNvbnRlbnRzW2tdOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJpbnZlcnNlIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKGZvcm1hdCh0ZXN0c3RhY2suc2l6ZSgpLCBsLCBsYWJlbCwgY3VycmVudCkpOworCisgICAgICAgICAgICAvLyB0aGVuLCB2ZXJpZnkgY3VycmVudCBtYXRjaGVzIGNvbnRlbnRzCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkNvbnRlbnQgbWlzbWF0Y2ggIiArIG5hbWVba10sIGN1cnJlbnQpLCAoY3VycmVudC5jb250YWlucyhuYW1lW2tdKSA9PSBjb250ZW50c1trXSkpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJFUlJPUiBPTiAiICsgbmFtZVtrXSwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiZXhwZWN0ZWQgIiArIGNvbnRlbnRzW2tdICsgIiwgZ290ICIgKyAhY29udGVudHNba10sIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzW2tdKQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmb3JtYXQoMCwgbCwgIkVSUk9SOiBpc0VtcHR5IGlzIHdyb25nIiwgY3VycmVudCksICgoY291bnQgPT0gMCkgPT0gY3VycmVudC5pc0VtcHR5KCkpKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgIkVSUk9SOiBpc0VtcHR5IGlzIHdyb25nIiwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgLy8gdGVzdHByaW50KDAsIGwsICJleHBlY3RlZCAiICsgKGNvdW50ID09IDApICsgIiwgZ290ICIgKyAhKGNvdW50ID09IDApLCBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZm9ybWF0KDAsIGwsICJFUlJPUjogaXNBbGwgaXMgd3JvbmciLCBjdXJyZW50KSwgKGNvdW50ID09IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aCkgPT0gY3VycmVudC5pc0FsbCgpKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0cHJpbnQoMCwgbCwgIkVSUk9SOiBpc0FsbCBpcyB3cm9uZyIsIGN1cnJlbnQpOworICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiZXhwZWN0ZWQgIiArIChjb3VudCA9PSB3aWR0aCAqIG5hbWVzcGFjZS5sZW5ndGgpICsgIiwgZ290ICIgKyAhKGNvdW50ID09IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aCksIGN1cnJlbnQpOworICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZXN0IGlzRGlzam9pbnQgYW5kIGNvbnRhaW5zQWxsCisgICAgICAgICAgICBpZiAodGVzdHN0YWNrLnNpemUoKSA+PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzam9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRlbXAgPSAoYm9vbGVhbltdKXRyYWNrc3RhY2sucGVlaygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd2lkdGggKiBuYW1lc3BhY2UubGVuZ3RoOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtrXSAmJiBjb250ZW50c1trXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlzam9pbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZvcm1hdCgwLCBsLCAiRVJST1I6IGRpc2pvaW50IGlzIHdyb25nIiwgY3VycmVudCksIGRpc2pvaW50ID09IGN1cnJlbnQuaXNEaXNqb2ludCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wZWVrKCkpKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiRVJST1I6IGRpc2pvaW50IGlzIHdyb25nIiwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RwcmludCgwLCBsLCAiZXhwZWN0ZWQgIiArIGRpc2pvaW50ICsgIiwgZ290ICIgKyAhZGlzam9pbnQsIChRTmFtZVNldEJ1aWxkZXIpdGVzdHN0YWNrLnBlZWsoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zQWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHdpZHRoICogbmFtZXNwYWNlLmxlbmd0aDsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBba10gJiYgIWNvbnRlbnRzW2tdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0FsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZm9ybWF0KDAsIGwsICJFUlJPUjogY29udGFpbnNBbGwgaXMgd3JvbmciLCBjdXJyZW50KSwgY29udGFpbnNBbGwgPT0gY3VycmVudC5jb250YWluc0FsbCgoUU5hbWVTZXRTcGVjaWZpY2F0aW9uKXRlc3RzdGFjay5wZWVrKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1FOYW1lVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9RTmFtZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5NThlNAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9RTmFtZVRlc3RzLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxRTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxBbnlTaW1wbGVUeXBlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBRTmFtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgUU5hbWVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUU5hbWVUZXN0cy5jbGFzcyk7IH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKKyAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OworCisgICAgcHVibGljIHZvaWQgdGVzdFFOYW1lICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2FueSc+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCisgICAgICAgICAgICAiIjsKKworICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9CisgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKCBuZXcgWG1sT2JqZWN0W10geworICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNjaGVtYSkgfSApOworCisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAvLyBUZXN0IHRoZSBzZXRfWE1MTmFtZSBmdW5jdGlvbiBvbiBYbWxRTmFtZUltcGwKKyAgICAgICAgLy8KKworICAgICAgICBTdHJpbmcgbnMgPQorICAgICAgICAgICAgInhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnICIgKworICAgICAgICAgICAgICAgICJ4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnIjsKKyAgICAgICAgCisgICAgICAgIFhtbE9iamVjdCBzb3VyY2VEb2N1bWVudCA9CisgICAgICAgICAgICBzdGwucGFyc2UoCisgICAgICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6UU5hbWUnIHhtbG5zOnh4eD0neHh4LmNvbSc+IiArCisgICAgICAgICAgICAgICAgICAgICJ4eHg6YWJjPC9hbnk+IiwgbnVsbCwgbnVsbCApOworCisgICAgICAgIFhtbEN1cnNvciBzb3VyY2VDdXJzb3IgPSBzb3VyY2VEb2N1bWVudC5uZXdDdXJzb3IoKTsKKworICAgICAgICBzb3VyY2VDdXJzb3IudG9GaXJzdENoaWxkKCk7CisKKyAgICAgICAgWG1sUU5hbWUgc291cmNlUU5hbWUgPSAoWG1sUU5hbWUpIHNvdXJjZUN1cnNvci5nZXRPYmplY3QoKTsKKworICAgICAgICBYbWxPYmplY3QgdGFyZ2V0RG9jdW1lbnQgPQorICAgICAgICAgICAgc3RsLnBhcnNlKAorICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJz4iICsKKyAgICAgICAgICAgICAgICAgICAgIjwvYW55PiIsIG51bGwsIG51bGwgKTsKKworICAgICAgICBYbWxDdXJzb3IgdGFyZ2V0Q3Vyc29yID0gdGFyZ2V0RG9jdW1lbnQubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgdGFyZ2V0Q3Vyc29yLnRvRmlyc3RDaGlsZCgpOworCisgICAgICAgIFhtbFFOYW1lIHRhcmdldFFOYW1lID0gKFhtbFFOYW1lKSB0YXJnZXRDdXJzb3IuZ2V0T2JqZWN0KCk7CisKKyAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCBzb3VyY2VRTmFtZSApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgdGFyZ2V0UU5hbWUucU5hbWVWYWx1ZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggInh4eC5jb20iICkgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUZXN0IHRoZSBzZXRfdGV4dCBmdW5jdGlvbiBvbiBYbWxRTmFtZUltcGwKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHRhcmdldERvY3VtZW50ID0KKyAgICAgICAgICAgIHN0bC5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpRTmFtZScgeG1sbnM6eHh4PSd4eHguY29tJz4iICsKKyAgICAgICAgICAgICAgICAgICAgIjwvYW55PiIsIG51bGwsIG51bGwgKTsKKworICAgICAgICB0YXJnZXRDdXJzb3IgPSB0YXJnZXREb2N1bWVudC5uZXdDdXJzb3IoKTsKKworICAgICAgICB0YXJnZXRDdXJzb3IudG9GaXJzdENoaWxkKCk7CisKKyAgICAgICAgdGFyZ2V0UU5hbWUgPSAoWG1sUU5hbWUpIHRhcmdldEN1cnNvci5nZXRPYmplY3QoKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGFyZ2V0UU5hbWUuc2V0KCAienp6OmFiYyIgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7IC8vIE11c3QgZmFpbAorICAgICAgICB9CisgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIHQgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRhcmdldFFOYW1lLnNldCggInh4eDphYmMiICk7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHRhcmdldFFOYW1lLnFOYW1lVmFsdWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJ4eHguY29tIiApICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1J1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvUnVudGltZVNjaGVtYUxvYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYyYjgwCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1J1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LlNjaGVtYTsKKworcHVibGljIGNsYXNzIFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgUnVudGltZVNjaGVtYUxvYWRlclRlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LmNsYXNzKTsgfQorCisgICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNMb2FkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgRmlsZSBpbnB1dGZpbGUxID0gVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9keW5hbWljL2R5bnRlc3QueHNkIik7CisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKKyAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdC54bWwiKSwgbnVsbCwgbnVsbCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkQ9d3JhcHBlZGluc3RhbmNlQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL29wZW51cmkub3JnL3Rlc3QvZHludGVzdCIsICJ3cmFwcGVkaW5zdGFuY2UiICkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTG9hZDIoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBGaWxlIGlucHV0ZmlsZTEgPSBUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueHNkIik7CisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgbG9hZGVyID0gWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10geyBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShpbnB1dGZpbGUxKSB9KTsKKyAgICAgICAgWG1sT2JqZWN0IHJlc3VsdCA9IGxvYWRlci5wYXJzZShUZXN0RW52LnhiZWFuQ2FzZSgic2NoZW1hL2R5bmFtaWMvZHludGVzdDIueG1sIiksIG51bGwsIG51bGwpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJEPXdyYXBwZWR3aWxkY2FyZEBodHRwOi8vb3BlbnVyaS5vcmcvdGVzdC9keW50ZXN0IiwgcmVzdWx0LnNjaGVtYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsb2FkZXIuZmluZERvY3VtZW50VHlwZShuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zY2hlbWFUeXBlKCkpOworICAgICAgICBYbWxDdXJzb3IgY3VyID0gcmVzdWx0Lm5ld0N1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYSByb290IGVsZW1lbnQiLCBjdXIudG9GaXJzdENoaWxkKCkpOworICAgICAgICByZXN1bHQgPSBjdXIuZ2V0T2JqZWN0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkU9d3JhcHBlZHdpbGRjYXJkfEQ9d3JhcHBlZHdpbGRjYXJkQGh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCByZXN1bHQuc2NoZW1hVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy90ZXN0L2R5bnRlc3QiLCAid3JhcHBlZHdpbGRjYXJkIikpLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2NoZW1hVHlwZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNob3VsZCBoYXZlIGEgZmlyc3QgY2hpbGQiLCBjdXIudG9GaXJzdENoaWxkKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAic2NoZW1hIiksIGN1ci5nZXROYW1lKCkpOworICAgICAgICBYbWxPYmplY3Qgb2JqID0gY3VyLmdldE9iamVjdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNjaGVtYS50eXBlLCBvYmouc2NoZW1hVHlwZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU2NoZW1hVHlwZXNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEyY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NjaGVtYVR5cGVzVGVzdHMuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbENhbGVuZGFyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcub3BlbnVyaS54c3R5cGVzLnRlc3QuKjsKK2ltcG9ydCBvcmcub3BlbnVyaS5kZWYuRGVmYXVsdHNEb2N1bWVudDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworcHVibGljIGNsYXNzIFNjaGVtYVR5cGVzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBTY2hlbWFUeXBlc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTY2hlbWFUeXBlc1Rlc3RzLmNsYXNzKTsgfQorCisgICAgcHJpdmF0ZSBDdXN0b21lckRvY3VtZW50IGRvYzsKKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVEb2MoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiggZG9jPT1udWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZG9jID0gKEN1c3RvbWVyRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKFRlc3RFbnYueGJlYW5DYXNlKCIuLi9zcmMveHN0eXBlcy94c3R5cGVzLnhtbCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIERlZmF1bHRzRG9jdW1lbnQgZG9jID0gRGVmYXVsdHNEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIERlZmF1bHRzRG9jdW1lbnQuRGVmYXVsdHMgZGVmcyA9IGRvYy5hZGROZXdEZWZhdWx0cygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDc4MywgZGVmcy5nZXRDb29sKCkpOyAvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNvdXJjZU5hbWUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZSA9IERlZmF1bHRzRG9jdW1lbnQudHlwZS5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImRlZmF1bHRzLnhzZCIsIG5hbWUpOworICAgICAgICBJbnB1dFN0cmVhbSBzdHIgPSBYbWxCZWFucy5nZXRDb250ZXh0VHlwZUxvYWRlcigpLmdldFNvdXJjZUFzU3RyZWFtKCJkZWZhdWx0cy54c2QiKTsKKyAgICAgICAgU2NoZW1hRG9jdW1lbnQgZG9jID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShzdHIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkb2MudmFsaWRhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBlbnN1cmVEb2MoKTsKKworICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAorICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhvd2R5IiwgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCAgIHBlcnNvbi5zaXplT2ZOdW1iZXJBcnJheSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MzYsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTIzLCBwZXJzb24uZ2V0TnVtYmVyQXJyYXkoMSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQ0LCAgcGVyc29uLmdldE51bWJlckFycmF5KDIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5MzMsIHBlcnNvbi5nZXROdW1iZXJBcnJheSgzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgICBwZXJzb24uc2l6ZU9mQmlydGhkYXlBcnJheSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgWG1sQ2FsZW5kYXIoIjE5OTgtMDgtMjZaIiksCisgICAgICAgICAgICAgcGVyc29uLmdldEJpcnRoZGF5QXJyYXkoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBYbWxDYWxlbmRhcigiMjAwMC0wOC0wNi0wODowMCIpLAorICAgICAgICAgICAgIHBlcnNvbi5nZXRCaXJ0aGRheUFycmF5KDEpKTsKKworICAgICAgICBQZXJzb24uR2VuZGVyLkVudW0gZyA9IHBlcnNvbi5nZXRHZW5kZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhQZXJzb24uR2VuZGVyLk1BTEUsIGcpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkVHSVFUV1laSiIsIG5ldyBTdHJpbmcocGVyc29uLmdldEhleCgpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlRoaXMgc3RyaW5nIGlzIGJhc2U2NEJpbmFyeSBlbmNvZGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwZXJzb24uZ2V0QmFzZTY0KCkpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHR0lRVFdZR0ciLCBuZXcgU3RyaW5nKHBlcnNvbi5nZXRIZXhBdHQoKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGlzIHN0cmluZyBpcyBiYXNlNjRCaW5hcnkgZW5jb2RlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEJhc2U2NEF0dCgpKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygie3NvbWVfdXJpfWxvY2FsbmFtZSIsIHBlcnNvbi5nZXRRbmFtZUF0dCgpLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7aHR0cDovL29wZW51cmkub3JnL3hzdHlwZXMvdGVzdH1vcGVudXJpX29yZ19sb2NhbG5hbWUiLCBwZXJzb24uZ2V0UW5hbWUoKS50b1N0cmluZygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vZG1vei5vcmcvV29ybGQvRnJhblx1MDBlN2Fpcy8iLCBwZXJzb24uZ2V0QW55dXJpQXR0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly8zc3BhY2Uub3JnL3NwYWNlJTIwc3BhY2UvIiwgcGVyc29uLmdldEFueXVyaSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vUnVudGltZUV4Y2VwdGlvbjogc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9TcGxheS5qYXZhKDE1MzcpOiBucyAhPSBudWxsICYmIG5zLmxlbmd0aCgpID4gMCBmYWlsZWQKKyAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJKUEVHIiwgcGVyc29uLmdldE5vdGF0aW9uQXR0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiR0lGIiwgcGVyc29uLmdldE5vdGF0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlUmVhZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGVuc3VyZURvYygpOworICAgICAgICAvLyBNb3ZlIGZyb20gdGhlIHJvb3QgdG8gdGhlIHJvb3QgY3VzdG9tZXIgZWxlbWVudAorICAgICAgICBQZXJzb24gcGVyc29uID0gZG9jLmdldEN1c3RvbWVyKCk7CisKKyAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdlb3JnZSIsIHBlcnNvbi5nZXRGaXJzdG5hbWUoKSk7CisKKyAgICAgICAgcGVyc29uLnNldEhleCgiaGV4IGVuY29kaW5nIi5nZXRCeXRlcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGV4IGVuY29kaW5nIiwgbmV3IFN0cmluZyhwZXJzb24uZ2V0SGV4KCkpKTsKKworICAgICAgICBwZXJzb24uc2V0QmFzZTY0KCJiYXNlNjQgZW5jb2RlZCIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhc2U2NCBlbmNvZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjQoKSkpOworCisgICAgICAgIHBlcnNvbi5zZXRIZXhBdHQoImhleCBlbmNvZGluZyBpbiBhdHRyaWJ1dGVzIi5nZXRCeXRlcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGV4IGVuY29kaW5nIGluIGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocGVyc29uLmdldEhleEF0dCgpKSk7CisKKyAgICAgICAgcGVyc29uLnNldEJhc2U2NEF0dCgiVGhpcyBzdHJpbmcgaXMgYmFzZTY0QmluYXJ5IGVuY29kZWQhIi5nZXRCeXRlcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVGhpcyBzdHJpbmcgaXMgYmFzZTY0QmluYXJ5IGVuY29kZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHBlcnNvbi5nZXRCYXNlNjRBdHQoKSkpOworCisgICAgICAgIHBlcnNvbi5zZXRBbnl1cmkoImEuYzo3MDAxIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImEuYzo3MDAxIiwgcGVyc29uLmdldEFueXVyaSgpKTsKKworICAgICAgICBwZXJzb24uc2V0QW55dXJpQXR0KCJiLmQ6NzAwMiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiLmQ6NzAwMiIsIHBlcnNvbi5nZXRBbnl1cmlBdHQoKSk7CisKKyAgICAgICAgcGVyc29uLnNldFFuYW1lQXR0KG5ldyBRTmFtZSgiYWFhIiwiYmJiIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7YWFhfWJiYiIsIHBlcnNvbi5nZXRRbmFtZUF0dCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHBlcnNvbi5zZXRRbmFtZShuZXcgUU5hbWUoImRkZCIsImVlZSIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygie2RkZH1lZWUiLCBwZXJzb24uZ2V0UW5hbWUoKS50b1N0cmluZygpKTsKKworICAgICAgICAvL0V4Y2VwdGlvbjogc3JjL3htbHN0b3JlL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC9zdG9yZS9UeXBlLmphdmEoMTg5KTogdXNlciA9PSBfdXNlciBmYWlsZWQKKy8vICAgICAgICBwZXJzb24uc2V0QW55dXJpQXR0KFVSSS5jcmVhdGUoImIuZDo3MDAyIikpOworLy8gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImIuZDo3MDAyIiwgcGVyc29uLmdldEFueXVyaUF0dCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vWG1sTk9UQVRJT04gbm90YXRpb24gPSAoWG1sTk9UQVRJT04pUGVyc29uLk5vdGF0aW9uLnR5cGUuY3JlYXRlTm9kZSgpOworICAgICAgICAvL25vdGF0aW9uLnNldFZhbHVlKCJKUEVHIik7CisgICAgICAgIC8vcGVyc29uLnNldE5vdGF0aW9uKCBub3RhdGlvbiApOworICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkpQRUciLCBwZXJzb24uZ2V0Tm90YXRpb24oKS50b1N0cmluZygpKTsKKworICAgICAgICAvL1htbE5PVEFUSU9OIG5vdGF0aW9uQXR0ID0gKFhtbE5PVEFUSU9OKVBlcnNvbi5Ob3RhdGlvbkF0dC50eXBlLmNyZWF0ZU5vZGUoKTsKKyAgICAgICAgLy9ub3RhdGlvbkF0dC5zZXRWYWx1ZSgiR0lGIik7CisgICAgICAgIC8vcGVyc29uLnNldE5vdGF0aW9uQXR0KCBub3RhdGlvbkF0dCApOworICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbkF0dChub3RhdGlvbik7CisgICAgICAgIC8vQXNzZXJ0LmFzc2VydEVxdWFscygiR0lGIiwgcGVyc29uLmdldE5vdGF0aW9uQXR0KCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlV3JpdGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBlbnN1cmVEb2MoKTsKKyAgICAgICAgLy8gTW92ZSBmcm9tIHRoZSByb290IHRvIHRoZSByb290IGN1c3RvbWVyIGVsZW1lbnQKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IGRvYy5nZXRDdXN0b21lcigpOworCisgICAgICAgIFhtbE9iamVjdCB4bWxvYmo7CisgICAgICAgIFhtbEN1cnNvciB4bWxjdXJzOworCisgICAgICAgIHBlcnNvbi5zZXRGaXJzdG5hbWUoIkdlb3JnZSIpOworICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldEZpcnN0bmFtZSgpOworICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7CisKKyAgICAgICAgcGVyc29uLnNldFFuYW1lQXR0KCBuZXcgUU5hbWUoImh0dHA6Ly9nZ2cuY29tIiwiaGhoIikgKTsKKyAgICAgICAgeG1sb2JqID0gcGVyc29uLnhnZXRRbmFtZUF0dCgpOworICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZ2c6aGhoIiwgeG1sY3Vycy5nZXRUZXh0VmFsdWUoKSApOworCisgICAgICAgIHBlcnNvbi5zZXRRbmFtZSggbmV3IFFOYW1lKCJodHRwOi8vZ2dnLmNvbS9nZ2dBZ2FpbiIsImtrayIpICk7CisgICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0UW5hbWUoKTsKKyAgICAgICAgeG1sY3VycyA9IHhtbG9iai5uZXdDdXJzb3IoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2dnMTpra2siLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7CisKKyAgICAgICAgcGVyc29uLnNldEFueXVyaSggImNyb3NzZ2Fpbi5jb20iICk7CisgICAgICAgIHhtbG9iaiA9IHBlcnNvbi54Z2V0QW55dXJpKCk7CisgICAgICAgIHhtbGN1cnMgPSB4bWxvYmoubmV3Q3Vyc29yKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNyb3NzZ2Fpbi5jb20iLCB4bWxjdXJzLmdldFRleHRWYWx1ZSgpICk7CisKKyAgICAgICAgcGVyc29uLnNldEFueXVyaUF0dCggInd3dy5jcm9zc2dhaW4uY29tIiApOworICAgICAgICB4bWxvYmogPSBwZXJzb24ueGdldEFueXVyaUF0dCgpOworICAgICAgICB4bWxjdXJzID0geG1sb2JqLm5ld0N1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ3d3cuY3Jvc3NnYWluLmNvbSIsIHhtbGN1cnMuZ2V0VGV4dFZhbHVlKCkgKTsKKworICAgICAgICAvL3BlcnNvbi5zZXROb3RhdGlvbigiR0lGIik7CisgICAgICAgIC8veG1sb2JqID0gcGVyc29uLmdldE5vdGF0aW9uKCk7CisgICAgICAgIC8veG1sY3VycyA9IHhtbG9iai5uZXdYbWxDdXJzb3IoKTsKKyAgICAgICAgLy9Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJHSUYiLCB4bWxjdXJzLmdldFRleHQoKSApOworCisgICAgICAgIC8vcGVyc29uLnNldE5vdGF0aW9uQXR0KCJKUEVHdSIpOworICAgICAgICAvL3htbG9iaiA9IHBlcnNvbi54Z2V0Tm90YXRpb25BdHQoKTsKKyAgICAgICAgLy94bWxjdXJzID0geG1sb2JqLm5ld1htbEN1cnNvcigpOworICAgICAgICAvL0Fzc2VydC5hc3NlcnRFcXVhbHMoIkpQRUciLCB4bWxjdXJzLmdldFRleHQoKSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TZXJpYWxpemF0aW9uVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TZXJpYWxpemF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWE1ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1NlcmlhbGl6YXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgY29tLmVhc3lwby5YbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuLlB1cmNoYXNlT3JkZXI7CitpbXBvcnQgY29tLmVhc3lwby5YbWxMaW5lSXRlbUJlYW47CitpbXBvcnQgY29tLmVhc3lwby5YbWxTaGlwcGVyQmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBTZXJpYWxpemF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uVGVzdHMgKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXJpYWxpemF0aW9uVGVzdHMuY2xhc3MpOyB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sT2JqZWN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBzaW1wbGVEb2N1bWVudCA9ICI8c2ltcGxlRG9jPjxuZXN0ZWRUYWcgYXR0cj1cInNhbXBsZVwiPjQzPC9uZXN0ZWRUYWc+PC9zaW1wbGVEb2M+IjsKKyAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHNpbXBsZURvY3VtZW50KTsKKworICAgICAgICAvLyBiYXNlbGluZSB0ZXN0CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2ltcGxlRG9jdW1lbnQsIGRvYy54bWxUZXh0KCkpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7CisgICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MpOworICAgICAgICBvb3MuY2xvc2UoKTsKKworICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSk7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpbik7CisgICAgICAgIFhtbE9iamVjdCBuZXdkb2MgPSAoWG1sT2JqZWN0KW9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIG9pcy5jbG9zZSgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2ltcGxlRG9jdW1lbnQsIG5ld2RvYy54bWxUZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RYQmVhblNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxQdXJjaGFzZU9yZGVyRG9jdW1lbnRCZWFuIGRvYyA9IFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBQdXJjaGFzZU9yZGVyIG9yZGVyID0gZG9jLmFkZE5ld1B1cmNoYXNlT3JkZXIoKTsKKyAgICAgICAgb3JkZXIuYWRkTmV3Q3VzdG9tZXIoKS5zZXROYW1lKCJEYXZpZCBCYXUiKTsKKyAgICAgICAgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5zZXRBZGRyZXNzKCJHbGFkd3luZSwgUEEiKTsKKyAgICAgICAgWG1sTGluZUl0ZW1CZWFuIGxpOworICAgICAgICBsaSA9IG9yZGVyLmFkZE5ld0xpbmVJdGVtKCk7CisgICAgICAgIGxpLnNldERlc2NyaXB0aW9uKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIpOworICAgICAgICBsaS5zZXRQcmljZShuZXcgQmlnRGVjaW1hbCgiMjEuNzkiKSk7CisgICAgICAgIGxpLnNldFF1YW50aXR5KEJpZ0ludGVnZXIudmFsdWVPZigyKSk7CisgICAgICAgIGxpLnNldFBlclVuaXRPdW5jZXMobmV3IEJpZ0RlY2ltYWwoIjUiKSk7CisgICAgICAgIGxpID0gb3JkZXIuYWRkTmV3TGluZUl0ZW0oKTsKKyAgICAgICAgbGkuc2V0RGVzY3JpcHRpb24oIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAyIik7CisgICAgICAgIGxpLnNldFByaWNlKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpKTsKKyAgICAgICAgbGkuc2V0UXVhbnRpdHkoQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKKyAgICAgICAgbGkuc2V0UGVyVW5pdE91bmNlcyhuZXcgQmlnRGVjaW1hbCgiNSIpKTsKKyAgICAgICAgbGkgPSBvcmRlci5hZGROZXdMaW5lSXRlbSgpOworICAgICAgICBsaS5zZXREZXNjcmlwdGlvbigiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDMiKTsKKyAgICAgICAgbGkuc2V0UHJpY2UobmV3IEJpZ0RlY2ltYWwoIjE5Ljg5IikpOworICAgICAgICBsaS5zZXRRdWFudGl0eShCaWdJbnRlZ2VyLnZhbHVlT2YoMSkpOworICAgICAgICBsaS5zZXRQZXJVbml0T3VuY2VzKG5ldyBCaWdEZWNpbWFsKCI1IikpOworICAgICAgICBYbWxTaGlwcGVyQmVhbiBzaCA9IG9yZGVyLmFkZE5ld1NoaXBwZXIoKTsKKyAgICAgICAgc2guc2V0TmFtZSgiVVBTIik7CisgICAgICAgIHNoLnNldFBlck91bmNlUmF0ZShuZXcgQmlnRGVjaW1hbCgiMC43NCIpKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXQpOworICAgICAgICBvb3Mud3JpdGVPYmplY3QoZG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRMaW5lSXRlbUFycmF5KDEpKTsKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KGRvYyk7CisgICAgICAgIG9vcy53cml0ZU9iamVjdChkb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldExpbmVJdGVtQXJyYXkoMikpOworICAgICAgICBvb3MuY2xvc2UoKTsKKworICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSk7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpbik7CisgICAgICAgIFhtbExpbmVJdGVtQmVhbiBuZXdsaTEgPSAoWG1sTGluZUl0ZW1CZWFuKW9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgIFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4gbmV3ZG9jID0gKFhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4pb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgWG1sTGluZUl0ZW1CZWFuIG5ld2xpMiA9IChYbWxMaW5lSXRlbUJlYW4pb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgb2lzLmNsb3NlKCk7CisKKyAgICAgICAgUHVyY2hhc2VPcmRlciBuZXdvcmRlciA9IG5ld2RvYy5nZXRQdXJjaGFzZU9yZGVyKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXdsaTEsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ld2xpMiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRGF2aWQgQmF1IiwgbmV3b3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXROYW1lKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHbGFkd3luZSwgUEEiLCBuZXdvcmRlci5nZXRDdXN0b21lcigpLmdldEFkZHJlc3MoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmV3b3JkZXIuc2l6ZU9mTGluZUl0ZW1BcnJheSgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJCdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMSIsIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjIxLjc5IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMCkuZ2V0UHJpY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0ludGVnZXIoIjIiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgwKS5nZXRRdWFudGl0eSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiNSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDApLmdldFBlclVuaXRPdW5jZXMoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDIiLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxOS44OSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDEpLmdldFByaWNlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIyIiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMSkuZ2V0UXVhbnRpdHkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjUiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgxKS5nZXRQZXJVbml0T3VuY2VzKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAzIiwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMTkuODkiKSwgbmV3b3JkZXIuZ2V0TGluZUl0ZW1BcnJheSgyKS5nZXRQcmljZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMSIpLCBuZXdvcmRlci5nZXRMaW5lSXRlbUFycmF5KDIpLmdldFF1YW50aXR5KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI1IiksIG5ld29yZGVyLmdldExpbmVJdGVtQXJyYXkoMikuZ2V0UGVyVW5pdE91bmNlcygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUsIG5ld29yZGVyLmlzU2V0U2hpcHBlcigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVVBTIiwgbmV3b3JkZXIuZ2V0U2hpcHBlcigpLmdldE5hbWUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjAuNzQiKSwgbmV3b3JkZXIuZ2V0U2hpcHBlcigpLmdldFBlck91bmNlUmF0ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU21va2VUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Ntb2tlVGVzdHMuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU21va2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgU21va2VUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKyAgICB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoU21va2VUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEFzc29ydGVkVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoSW50VGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUnVudGltZVNjaGVtYUxvYWRlclRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU3RvcmVUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChRTmFtZVRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFZhbGlkYXRpb25UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChDb21waWxhdGlvblRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEFubm90YXRpb25zVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoRWFzeVBvVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoTmFtZXdvcmxkVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChTY2hlbWFUeXBlc1Rlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEVudW1UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChDcmVhdGlvblRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFRocmVhZGluZ1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2VyaWFsaXphdGlvblRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KERvbVRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEdEYXRlVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU3Vic3RHcm91cFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEpheGVuWFBhdGhUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChOdW1lcmFsc1Rlc3RzLnN1aXRlKCkpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N0YW5kYWxvbmVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RhbmRhbG9uZVRlc3RzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgU3RhbmRhbG9uZVRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShTdGFuZGFsb25lVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBc3NvcnRlZFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEludFRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFJ1bnRpbWVTY2hlbWFMb2FkZXJUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFN0b3JlVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUU5hbWVUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoQ29tcGlsYXRpb25UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBbm5vdGF0aW9uc1Rlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEVhc3lQb1Rlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KE5hbWV3b3JsZFRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2NoZW1hVHlwZXNUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChFbnVtVGVzdHMuc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChUaHJlYWRpbmdUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFNlcmlhbGl6YXRpb25UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChEb21UZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChHRGF0ZVRlc3RzLnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFN1YnN0R3JvdXBUZXN0cy5zdWl0ZSgpKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdG9yZVRlc3RzLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGQ2YTgKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvU3RvcmVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjYxMCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5Ub2tlblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3IuWG1sQm9va21hcms7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxTYXhIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sTGluZU51bWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29tbW9uLlhtbE5hbWVJbXBsOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5BdHRyaWJ1dGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhbmdlUHJlZml4TWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ2hhcmFjdGVyRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uQ29tbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uRW5kRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZEVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLkVuZFByZWZpeE1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RG9jdW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlN0YXJ0RWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uU3RhcnRQcmVmaXhNYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CisgICAKK3B1YmxpYyBjbGFzcyBTdG9yZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgU3RvcmVUZXN0cyhTdHJpbmcgbmFtZSkgeyBzdXBlcihuYW1lKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RvcmVUZXN0cy5jbGFzcyk7IH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKKyAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OworCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7CisgICAgfQorCisgICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGdldENhc2VGaWxlKHRoZUNhc2UpLCBudWxsKS5uZXdDdXJzb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUNvbnRlbnRzICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFhtbE9iamVjdCB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7CisgICAgICAgIFhtbE9iamVjdCBuZXdEc3QgPSB4RHN0LnNldCggeFNyYyApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmV3RHN0LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vLz4iICkgKTsKKyAgICAgICAgCisgICAgICAgIHhEc3QgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIvPiIgKTsKKyAgICAgICAgeFNyYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvby8+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHhEc3QubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgeERzdCA9IGMuZ2V0T2JqZWN0KCk7CisgICAgICAgIHhEc3Quc2V0KCB4U3JjICk7CisgICAgICAgIGMudG9TdGFydERvYygpOworICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhEc3QueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvby8+PC9iYXI+IiApICk7CisKKyAgICAgICAgeERzdCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jy8+IiApOworICAgICAgICB4U3JjID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPm1vbzwvZm9vPiIgKTsKKyAgICAgICAgYyA9IHhEc3QubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICB4RHN0ID0gYy5nZXRPYmplY3QoKTsKKyAgICAgICAgeERzdC5zZXQoIHhTcmMgKTsKKyAgICAgICAgYy50b1N0YXJ0RG9jKCk7CisgICAgICAgIHhEc3QgPSBjLmdldE9iamVjdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeERzdC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB4PVwibW9vXCIvPiIgKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25pZmZpbmcgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4OworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHhvby8+IiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgPT0gWG1sQmVhbnMuTk9fVFlQRSApOworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOworCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICI8c2NoZW1hIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS9tb28nLz4iICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnNjaGVtYVR5cGUoKSA9PSBYbWxCZWFucy5OT19UWVBFICk7CisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOworCisgICAgICAgIHggPSBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJy8+IiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHguc2NoZW1hVHlwZSgpID09IG9yZy53My54MjAwMS54bWxTY2hlbWEuU2NoZW1hRG9jdW1lbnQudHlwZSApOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4ID0gCisgICAgICAgICAgICAgICAgb3JnLnczLngyMDAxLnhtbFNjaGVtYS5TY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICAgICAiPHNjaGVtYSB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEvbW9vJy8+IiApOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApIHsgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yU3RhY2sgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHg9J3knLz4iICk7CisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgYy5wdXNoKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy5wdXNoKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNBdHRyKCkgKTsKKyAgICAgICAgYy5wb3AoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuaXNTdGFydCgpICk7CisgICAgICAgIGMucG9wKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmlzU3RhcnRkb2MoKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXROYW1lc3BhY2VzICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG5hbWVzcGFjZXMucHV0KCAiZm9vIiwgImZvby5jb20iICk7CisgICAgICAgIG5hbWVzcGFjZXMucHV0KCAiYmFyIiwgImJhci5jb20iICk7CisgICAgICAgIG5hbWVzcGFjZXMucHV0KCAiIiwgImRlZmF1bHQuY29tIiApOworCisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLlNBVkVfSU1QTElDSVRfTkFNRVNQQUNFUywgbmFtZXNwYWNlcyApOworCisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKworICAgICAgICBjLmJlZ2luRWxlbWVudCggImEiLCAiZm9vLmNvbSIgKTsKKyAgICAgICAgYy5iZWdpbkVsZW1lbnQoICJiIiwgImRlZmF1bHQuY29tIiApOworICAgICAgICBjLmJlZ2luRWxlbWVudCggImMiLCAiYmFyLmNvbSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxmb286YT48Yj48YmFyOmMvPjwvYj48L2ZvbzphPiIgKSApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRlbnQgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIlNUQVJUX0RPQ1VNRU5UIiApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQgKCApIHRocm93cyBTQVhFeGNlcHRpb24gCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIkVORF9ET0NVTUVOVCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCAoCisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHMgKQorICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCAiU1RBUlRfRUxFTUVOVCIgKTsKKyAgICAgICAgICAgIGFkZCggIiAgbmFtZXNwYWNlVVJJOiAiICsgbmFtZXNwYWNlVVJJICk7CisgICAgICAgICAgICBhZGQoICIgIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSApOworLy8gICAgICAgICAgICBhZGQoICIgIHFOYW1lOiAiICsgcU5hbWUgKTsgCisKKyAgICAgICAgICAgIFRyZWVTZXQgc29ydGVkQXR0cnMgPSBuZXcgVHJlZVNldCgpOworCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXR0cy5nZXRMZW5ndGgoKSA7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxuID0gYXR0cy5nZXRMb2NhbE5hbWUoIGkgKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYXR0cy5nZXRVUkkoIGkgKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWUgPSBhdHRzLmdldFFOYW1lKCBpICk7CisKKyAgICAgICAgICAgICAgICBpZiAobG4uZXF1YWxzKCJ4bWxucyIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAocW5hbWUuc3RhcnRzV2l0aCgieG1sbnMiKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKy8vICAgICAgICAgICAgICAgIGlmIChsbi5lcXVhbHMoICJ4bWxucyIgKSkKKy8vICAgICAgICAgICAgICAgICAgICBsbiA9ICIiOworLy8KKy8vICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCAieG1sbnMiICkpCisvLyAgICAgICAgICAgICAgICAgICAgdXJpID0gIiI7CisKKyAgICAgICAgICAgICAgICBzb3J0ZWRBdHRycy5hZGQoCisgICAgICAgICAgICAgICAgICAgIHVyaSArICItIiArIGxuICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHMuZ2V0UU5hbWUoIGkgKSArICItIiArIGF0dHMuZ2V0VHlwZSggaSApICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKCBpICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICggSXRlcmF0b3IgaSA9IHNvcnRlZEF0dHJzLml0ZXJhdG9yKCkgOyBpLmhhc05leHQoKSA7ICkKKyAgICAgICAgICAgICAgICBhZGQoICIgIEF0dHI6ICIgKyBpLm5leHQoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudCAoCisgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUgKQorICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCAiRU5EX0VMRU1FTlQiICk7CisgICAgICAgICAgICBhZGQoICIgIG5hbWVzcGFjZVVSSTogIiArIG5hbWVzcGFjZVVSSSApOworICAgICAgICAgICAgYWRkKCAiICBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUgKTsKKy8vICAgICAgICAgICAgYWRkKCAiICBxTmFtZTogIiArIHFOYW1lICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzICggY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoICJDSEFSQUNURVJTIiApOworICAgICAgICAgICAgICAgIGFkZCggY2gsIHN0YXJ0LCBsZW5ndGggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKCBjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCApIAorICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiAKKyAgICAgICAgeyAKKyAgICAgICAgICAgIGFkZCggIkNPTU1FTlQiICk7CisgICAgICAgICAgICBhZGQoICIgIENvbW1lbnQ6ICIsIGNoLCBzdGFydCwgbGVuZ3RoICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gKCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSApCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIlBST0NFU1NJTkdfSU5TVFJVQ1RJT04iICk7CisgICAgICAgICAgICBhZGQoICAgInRhcmdldDogIiArIHRhcmdldCApOworICAgICAgICAgICAgYWRkKCAgICJkYXRhOiAiICsgZGF0YSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZSAoIGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoICkKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKCAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiICk7CisgICAgICAgICAgICAgICAgYWRkKCAiICB3aGl0ZXNwYWNlOiAiLCBjaCwgc3RhcnQsIGxlbmd0aCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcgKCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpICkKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCAiU1RBUlRfUFJFRklYX01BUFBJTkciICk7CisvLyAgICAgICAgICAgIGFkZCggIiAgcHJlZml4OiAiICsgcHJlZml4ICk7CisgICAgICAgICAgICBhZGQoICIgIHVyaTogIiArIHVyaSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBlbmRQcmVmaXhNYXBwaW5nICggU3RyaW5nIHByZWZpeCApIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCAiRU5EX1BSRUZJWF9NQVBQSU5HIiApOworLy8gICAgICAgICAgICBhZGQoICIgIHByZWZpeDogIiArIHByZWZpeCApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIlNUQVJUX0NEQVRBIiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSAoICkgdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBhZGQoICJFTkRfQ0RBVEEiICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RFREICggU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkICkKKyAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCAiU1RBUlRfRFREIiApOworICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOworICAgICAgICAgICAgYWRkKCAiICBwdWJsaWNJZDogIiArIHB1YmxpY0lkICk7CisgICAgICAgICAgICBhZGQoICIgIHN5c3RlbUlkOiAiICsgc3lzdGVtSWQgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgZW5kRFREICggKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIkVORF9EVEQiICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIlNUQVJUX0VOVElUWSIgKTsKKyAgICAgICAgICAgIGFkZCggIiAgbmFtZTogIiArIG5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgZW5kRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIkVORF9FTlRJVFkiICk7CisgICAgICAgICAgICBhZGQoICIgIG5hbWU6ICIgKyBuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvciAoIExvY2F0b3IgbG9jYXRvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFkZCggIlNUQVJUX0RPQ1VNRU5UX0xPQ0FUT1IiICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5ICggU3RyaW5nIG5hbWUgKSB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZCggIlNLSVBQRURfRU5USVRZIiApOworICAgICAgICAgICAgYWRkKCAiICBuYW1lOiAiICsgbmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZCAoIFN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgX3NiLmFwcGVuZCggcyApOworICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgYWRkICggU3RyaW5nIHMsIGNoYXJbXSBidWYsIGludCBvZmYsIGludCBjY2ggKQorICAgICAgICB7CisgICAgICAgICAgICBfc2IuYXBwZW5kKCBzICk7CisgICAgICAgICAgICBfc2IuYXBwZW5kKCBidWYsIG9mZiwgY2NoICk7CisgICAgICAgICAgICBfc2IuYXBwZW5kKCAiXG4iICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgdm9pZCBhZGQgKCBjaGFyW10gYnVmLCBpbnQgb2ZmLCBpbnQgY2NoICkKKyAgICAgICAgeworICAgICAgICAgICAgX3NiLmFwcGVuZCggYnVmLCBvZmYsIGNjaCApOworICAgICAgICAgICAgX3NiLmFwcGVuZCggIlxuIiApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMgKCBPYmplY3QgdGhhdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpLmVxdWFscyggdGhhdC50b1N0cmluZygpICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICggKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBfc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRvVGVzdFNheFNhdmVyICggU3RyaW5nIHhtbCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE1FCisgICAgICAgIAorICAgICAgICBDb250ZW50IGNvbnRlbnQyID0gbmV3IENvbnRlbnQoKTsKKworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKKworICAgICAgICB4LnNhdmUoIGNvbnRlbnQyLCBjb250ZW50MiApOworCisgICAgICAgIC8vIFRIRU0KKworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNwZiA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgU0FYUGFyc2VyIHNwID0gc3BmLm5ld1NBWFBhcnNlcigpOworICAgICAgICAKKyAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgIAorICAgICAgICBDb250ZW50IGNvbnRlbnQxID0gbmV3IENvbnRlbnQoKTsKKyAgICAgICAgCisgICAgICAgIHhyLnNldFByb3BlcnR5KCAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgY29udGVudDEgKTsKKyAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlICk7CisgICAgICAgIHhyLnNldEZlYXR1cmUoICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKKyAgICAgICAgeHIuc2V0RmVhdHVyZSggImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKKworICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggY29udGVudDEgKTsKKyAgICAgICAgCisgICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKKworICAgICAgICB4ci5wYXJzZSggaXMgKTsKKworCisgICAgICAgIGlmICghY29udGVudDEuZXF1YWxzKCBjb250ZW50MiApKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJTQVggc2F2ZSBmYWlsdXJlOiAiICk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHhtbCApOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlNBWDogIiApOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBjb250ZW50MS50b1N0cmluZygpICk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiTUU6ICIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggY29udGVudDIudG9TdHJpbmcoKSApOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXhTYXZlciAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4bWxucz0nbm5uJz48L2E+IiApOworICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhIHg9J3knPjwhLS0tLT54PGIvPjxjIHA9J3EnPno8L2M+PC9hPiIgKTsKKyAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8YSB4PSd5Jz48IS0tLS0+PGI+bW9vPC9iPjxjIHA9J3EnPjwvYz48L2E+IiApOworICAgICAgICBkb1Rlc3RTYXhTYXZlciggIjxhPmFzYTxiLz5zZHNkPGM+YWF6PC9jPmFkc2FzZDwvYT4iICk7CisgICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPGE+PD90YXJnZXQgdmFsdWU/PjwvYT4iICk7CisgICAgICAgIGRvVGVzdFNheFNhdmVyKCAiPG46YSB4bWxuczpuPSdubm4nPjwvbjphPiIgKTsKKyAgICAgICAgZG9UZXN0U2F4U2F2ZXIoICI8ajphIHg9J3knIHA9J3EnIHhtbG5zOmo9J2snPjwvajphPiIgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgX190ZXN0UGFyc2luZyAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCAxICk7CisgICAgICAgIAorICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgMTAwMDAwIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOworCisvLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOworLy8KKy8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIHBhcnNlIHRlc3Q6IiApOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKKworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKCAiYzpcXGVlLnhtbCIgKTsKKyAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSggb3MgKTsKKyAgICAgICAgICAgICAgICBwcy5wcmludGxuKCB4bWwgKTsKKyAgICAgICAgICAgICAgICBwcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJGaW5pc2hlZC4uLiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvVGVzdExpbmVOdW1iZXJzICggU3RyaW5nIHhtbCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBsaW5lID0gMTsKKyAgICAgICAgaW50IGNvbCA9IDE7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPQorICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgeG1sLCBuZXcgWG1sT3B0aW9ucygpLnNldExvYWRMaW5lTnVtYmVycygpICkuCisgICAgICAgICAgICAgICAgICAgIG5ld0N1cnNvcigpOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB4bWwubGVuZ3RoKCkgOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGNoID0geG1sLmNoYXJBdCggaSApOworCisgICAgICAgICAgICBpZiAoY2ggPT0gJzwnICYmIENoYXJhY3Rlci5pc0xldHRlciggeG1sLmNoYXJBdCggaSArIDEgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuY3VycmVudFRva2VuVHlwZSgpLmlzU3RhcnQoKSApOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBYbWxMaW5lTnVtYmVyIGxuID0KKyAgICAgICAgICAgICAgICAgICAgKFhtbExpbmVOdW1iZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldEJvb2ttYXJrKCBYbWxMaW5lTnVtYmVyLmNsYXNzICk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbG4gIT0gbnVsbCApOworCisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldExpbmUoKSAgID09IC0xIHx8IGxuLmdldExpbmUoKSA9PSBsaW5lICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGxuLmdldENvbHVtbigpID09IC0xIHx8IGxuLmdldENvbHVtbigpID09IGNvbCApOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsbi5nZXRPZmZzZXQoKSA9PSAtMSB8fCBsbi5nZXRPZmZzZXQoKSA9PSBpICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsaW5lKys7CisgICAgICAgICAgICAgICAgY29sPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbCsrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIF9fdGVzdExpbmVOdW1iZXJzICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBSYW5kb20gciA9IG5ldyBSYW5kb20oIDEgKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG1ha2VSYW5kb21Eb2N1bWVudCggciApOworCisvLyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIlN0YXJ0aW5nLi4uIiApOworLy8KKy8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCB4bWwgKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG9UZXN0TGluZU51bWJlcnMoIHhtbCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKCBUaHJvd2FibGUgZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmFpbGVkIGxpbmUgbnVtYmVyIHRlc3Q6IiApOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeG1sICk7CisKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggImM6XFxlZS54bWwiICk7CisgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oIG9zICk7CisgICAgICAgICAgICAgICAgcHMucHJpbnRsbiggeG1sICk7CisgICAgICAgICAgICAgICAgcHMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKy8vICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRmluaXNoZWQuLi4iICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb2NCdWlsZGVyCisgICAgeworICAgICAgICBSYW5kb20gcjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiOworICAgICAgICAKKyAgICAgICAgRG9jQnVpbGRlciAoIFJhbmRvbSBfciwgU3RyaW5nQnVmZmVyIF9zYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHIgPSBfcjsKKyAgICAgICAgICAgIHNiID0gX3NiOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcHBlbmQgKCBjaGFyIGNoICkKKyAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGFwcGVuZCAoIFN0cmluZyBzICkKKyAgICAgICAgeworICAgICAgICAgICAgc2IuYXBwZW5kKCBzICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZXNwYWNlICggKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcCA9IHIubmV4dEludCggMTAwICk7CisKKyAgICAgICAgICAgIGlmIChwIDwgMjApCisgICAgICAgICAgICAgICAgYXBwZW5kKCAnXHQnICk7CisgICAgICAgICAgICBlbHNlIGlmIChwIDwgNDApCisgICAgICAgICAgICAgICAgYXBwZW5kKCAnXG4nICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXBwZW5kKCAnICcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdoaXRlc3BhY2VzICggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggOCApIDsgaSA+IDAgOyBpLS0gKQorICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjaGFyIG1ha2VMZXR0ZXIgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgKCgoaW50KSAnYScpICsgci5uZXh0SW50KCAyNiApKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgbGV0dGVyICggKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBlbmQoIG1ha2VMZXR0ZXIoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hhckVudGl0eSAoICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICggci5uZXh0SW50KCA1ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwIDogYXBwZW5kKCAiJmx0OyIgKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEgOiBhcHBlbmQoICImZ3Q7IiApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6IGFwcGVuZCggIiZhbXA7IiApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6IGFwcGVuZCggIiZhcG9zOyIgKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOiBhcHBlbmQoICImcXVvdDsiICk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHRleHQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gci5uZXh0SW50KCAyMCApIDsgaSA+IDAgOyBpLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwID0gci5uZXh0SW50KCAxMDAgKTsKKworICAgICAgICAgICAgICAgIGlmIChwIDwgNzApCisgICAgICAgICAgICAgICAgICAgIGxldHRlcigpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3NCkKKyAgICAgICAgICAgICAgICAgICAgY2hhckVudGl0eSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBtYWtlTmNOYW1lICggKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gbWFrZUxldHRlcigpOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIGNoICk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDIwICkgOyBpID4gMCA7IGktLSApCisgICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQoIG1ha2VMZXR0ZXIoKSApOworCisgICAgICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbmNOYW1lICggKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBlbmQoIG1ha2VOY05hbWUoKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29tbWVudCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwZW5kKCAiPCEtLSIgKTsKKyAgICAgICAgICAgIHRleHQoKTsKKyAgICAgICAgICAgIGFwcGVuZCggIi0tPiIgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2luc3QgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwcGVuZCggIjw/IiApOworICAgICAgICAgICAgbmNOYW1lKCk7CisKKyAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApIDwgOTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpdGVzcGFjZSgpOworICAgICAgICAgICAgICAgIHRleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXBwZW5kKCAiPz4iICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aGl0ZUNvbnRlbnQgKCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHAgPSByLm5leHRJbnQoIDEwMCApOworCisgICAgICAgICAgICAgICAgaWYgKHAgPCAyMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocCA8IDUwKQorICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPCA3MCkKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvY2luc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgeG1sRGVjbCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwZW5kKCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQgKCBpbnQgZGVwdGggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IHIubmV4dEludCggMTAgKSA7IGkgPiAwIDsgaS0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCByLm5leHRJbnQoIDQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDb250ZW50KCBkZXB0aCArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMSA6IHRleHQoKTsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6IGNvbW1lbnQoKTsgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6IHByb2NpbnN0KCk7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgYXR0cmlidXRlICggKQorICAgICAgICB7CisgICAgICAgICAgICBuY05hbWUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAwICkgPT0gMCkKKyAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOworCisgICAgICAgICAgICBhcHBlbmQoICc9JyApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQorICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7CisKKyAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOworCisgICAgICAgICAgICBhcHBlbmQoIHEgKTsKKworICAgICAgICAgICAgdGV4dCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhcHBlbmQoIHEgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnQgKCBpbnQgZGVwdGggKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBkZXB0aCA9PSAwLCBndWFyYW50ZWUgYW4gZWxlbWVudCwgb3RoZXJ3aXNlLCBhcyBkZXB0aAorICAgICAgICAgICAgLy8gaW5jcmVhc2VzLCB0aGUgcHJvYmFibGlsaXR5IHdlJ2xsIHNwaXQgb3V0IGFuIGVsZW1lbnQKKyAgICAgICAgICAgIC8vIGdldHMgc21hbGxlci4KKworICAgICAgICAgICAgaWYgKHIubmV4dEludCggZGVwdGggKyAxICkgPD0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ha2VOY05hbWUoKTsKKworICAgICAgICAgICAgICAgIGFwcGVuZCggJzwnICk7CisgICAgICAgICAgICAgICAgYXBwZW5kKCBuYW1lICk7CisKKyAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOworCisgICAgICAgICAgICAgICAgSGFzaE1hcCBhdHRycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSByLm5leHRJbnQoIDMgKSA7IGkgPiAwIDsgaS0tICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCggJyAnICk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYW5hbWUgPSBtYWtlTmNOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJzLmNvbnRhaW5zS2V5KCBhbmFtZSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMucHV0KCBhbmFtZSwgbnVsbCApOworCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCggYW5hbWUgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoci5uZXh0SW50KCAxMDAgKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKKworICAgICAgICAgICAgICAgICAgICBhcHBlbmQoICc9JyApOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlcygpOworCisgICAgICAgICAgICAgICAgICAgIGNoYXIgcSA9IHIubmV4dEludCggMiApID09IDAgPyAnXCcnIDogJyInOworCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCggcSApOworCisgICAgICAgICAgICAgICAgICAgIHRleHQoKTsKKworICAgICAgICAgICAgICAgICAgICBhcHBlbmQoIHEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIubmV4dEludCggMTAgKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOworCisgICAgICAgICAgICAgICAgY29udGVudCggZGVwdGggKTsKKworICAgICAgICAgICAgICAgIGFwcGVuZCggIjwvIiApOworICAgICAgICAgICAgICAgIGFwcGVuZCggbmFtZSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChyLm5leHRJbnQoIDEwMCApID09IDApCisgICAgICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VzKCk7CisKKyAgICAgICAgICAgICAgICBhcHBlbmQoICc+JyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudCAoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHIubmV4dEludCggMiApID09IDApCisgICAgICAgICAgICAgICAgeG1sRGVjbCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGl0ZUNvbnRlbnQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZWxlbWVudENvbnRlbnQoIDAgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpdGVDb250ZW50KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBtYWtlUmFuZG9tRG9jdW1lbnQgKCBSYW5kb20gciApCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgRG9jQnVpbGRlciBkYiA9IG5ldyBEb2NCdWlsZGVyKCByLCBzYiApOworCisgICAgICAgIGRiLmRvY3VtZW50KCk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGF0QXNzZXJ0SXNPbiAoICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgICAgICAKKyAgICBzdGF0aWMgY2xhc3MgTXlNYXJrIGV4dGVuZHMgWG1sQm9va21hcmsKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvb2ttYXJrcyAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geD0neSc+YWJjZGVmZzwhLS0tLT54eTwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgTXlNYXJrIG0xID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtMSApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBNeU1hcmsgbTIgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG0yICk7CisgICAgICAgIAorICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIE15TWFyayBtMyA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTMgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgTXlNYXJrIG00ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNCApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRDaGFyKCAxICk7CisgICAgICAgIE15TWFyayBtNSA9IG5ldyBNeU1hcmsoKTsgYy5zZXRCb29rbWFyayggbTUgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9OZXh0Q2hhciggMyApOworICAgICAgICBNeU1hcmsgbTYgPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG02ICk7CisKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgTXlNYXJrIG03ID0gbmV3IE15TWFyaygpOyBjLnNldEJvb2ttYXJrKCBtNyApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBNeU1hcmsgbTggPSBuZXcgTXlNYXJrKCk7IGMuc2V0Qm9va21hcmsoIG04ICk7CisKKyAgICAgICAgYy50b1N0YXJ0RG9jKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG0xICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG00ICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG03ICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dEJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtOCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOworICAgICAgICAKKyAgICAgICAgYy50b0VuZERvYygpOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Qm9va21hcmsgICAoIE15TWFyay5jbGFzcyApID09IG04ICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNyApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTYgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG01ICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtNCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbTMgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2Qm9va21hcmsoIE15TWFyay5jbGFzcyApID09IG0yICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldkJvb2ttYXJrKCBNeU1hcmsuY2xhc3MgKSA9PSBtMSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZCb29rbWFyayggTXlNYXJrLmNsYXNzICkgPT0gbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSdhJy8+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy5zZXROYW1lKCBuZXcgUU5hbWUoICJiYXIiICkgKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnNldE5hbWUoIG5ldyBRTmFtZSggInkiICkgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhciB5PVwiYVwiLz4iICkgKTsKKyAgICB9CisgICAgCisgICAgLy8KKyAgICAvLyBCYXNpYyBsb2FkIHVwIGEgZmlsZSBhbmQgaXRlcmF0ZSB0aHJvdWdoIGl0CisgICAgLy8KKworICAgCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljWG1sKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7CisKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICAKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW5UeXBlIHQgPSBjLnRvTmV4dFRva2VuKCk7CisKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHQgPT0gVG9rZW5UeXBlLk5PTkUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDYgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdG9rZW5zIGdvaW5nIGZvcndhcmQgdGhlIHRoZSByZXZlcnNlIG9mIHRoZSB0b2tlbnMKKyAgICAvLyBnb2luZyBiYWNrd2FyZAorICAgIC8vCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc2lzdGVudFRva2VuT3JkZXIoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSBsb2FkQ2FzZSgidGVzdC54bWwiKTsKKworICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOworICAgICAgICAgICAgbC5hZGQoYy5jdXJyZW50VG9rZW5UeXBlKCkpOworCisgICAgICAgICAgICBpZiAoYy50b05leHRUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYy50b0VuZERvYygpOworICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oIlJldmVyc2luZyIpOworCisgICAgICAgIGZvciAoIGludCBpID0gbC5zaXplKCkgLSAxIDsgOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oYy5jdXJyZW50VG9rZW5UeXBlKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhsLmdldChpKSwgYy5jdXJyZW50VG9rZW5UeXBlKCkpOworCisgICAgICAgICAgICBpZiAoYy50b1ByZXZUb2tlbigpID09IFRva2VuVHlwZS5OT05FKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNYWtlIHN1cmUgeW91IGNhbid0IGluc2VydCB0ZXh0IGJlZm9yZSB0aGUgZG9jIGJlZ2luCisgICAgLy8gZ29pbmcgYmFja3dhcmQKKyAgICAvLworCisgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxUZXh0SW5zZXJ0KCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJIbyBobyBobyIgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJEaWQgbm90IGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE1ha2Ugc3VyZSBnZXRUZXh0IHdvcmtzIGluIGEgYmFzaWMgd2F5CisgICAgLy8KKworICAgIHB1YmxpYyB2b2lkIHRlc3RnZXRUZXh0KCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gbG9hZENhc2UoInRlc3QueG1sIik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0VGV4dFZhbHVlKCkuZXF1YWxzKCAiYWIiICkgKTsgLy8gRG9jIG5vZGUKKworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldFRleHRWYWx1ZSgpLmVxdWFscyggImFiIiApICk7IC8vIERvYyBlbGVtCisKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7IC8vIEF0dHIgeAorCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5lcXVhbHMoICJhYiIgKSApOyAvLyBUZXh0CisKKyAgICAgICAgYy50b05leHRDaGFyKCAxICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldENoYXJzKCkuZXF1YWxzKCAiYiIgKSApOyAvLyBUZXh0CisKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRDaGFycygpLmxlbmd0aCgpID09IDAgKTsgICAgICAgLy8gRW5kIHRhZworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0Q2hhcnMoKS5sZW5ndGgoKSA9PSAwICk7ICAgICAgIC8vIEVuZCBkb2MKKyAgICB9CisKKyAgICAvLworICAgIC8vIFRleHQgWE1MSW5wdXRTdHJlYW0gc3VwcG9ydAorICAgIC8vCisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmFtZSAoCisgICAgICAgIFhNTE5hbWUgbmFtZSwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsLCBTdHJpbmcgcHJlZml4ICkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBsb2NhbCAhPSBudWxsICk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgbmFtZVVyaSA9IG5hbWUuZ2V0TmFtZXNwYWNlVXJpKCk7CisgICAgICAgIFN0cmluZyBuYW1lTG9jYWwgPSBuYW1lLmdldExvY2FsTmFtZSgpOworICAgICAgICBTdHJpbmcgbmFtZVByZWZpeCA9IG5hbWUuZ2V0UHJlZml4KCk7CisKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVVcmkgPT0gbnVsbCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVVyaS5lcXVhbHMoIHVyaSApICk7CisgICAgICAgIAorICAgICAgICBpZiAobG9jYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lTG9jYWwgPT0gbnVsbCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZUxvY2FsLmVxdWFscyggbG9jYWwgKSApOworICAgICAgICAKKyAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG5hbWVQcmVmaXggPT0gbnVsbCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZVByZWZpeC5lcXVhbHMoIHByZWZpeCApICk7CisKKyAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcU5hbWUgPSBwcmVmaXggKyAiOiIgKyBsb2NhbDsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuYW1lLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoIHFOYW1lICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbmFtZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKCBsb2NhbCApICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvWG1sU3RyZWFtVGVzdCAoIFN0cmluZyB4bWwgKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKS5uZXdDdXJzb3IoKTsKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0geG1sU3RyZWFtID0gYy5uZXdYTUxJbnB1dFN0cmVhbSgpOworICAgICAgICBYbWxPYmplY3QgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWxTdHJlYW0gKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG8ueG1sVGV4dCgpLmVxdWFscyggeG1sICkgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9TYXZlclRlc3QgKCBTdHJpbmcgeG1sICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICkubmV3Q3Vyc29yKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoIHhtbCApICk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBkb1NhdmVUZXN0ICggU3RyaW5nIHhtbCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvWG1sU3RyZWFtVGVzdCggeG1sICk7CisgICAgICAgIGRvU2F2ZXJUZXN0KCB4bWwgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2aW5nICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBkb1NhdmVUZXN0KCAiPGZvbyB4bWxucz1cImZvby5jb21cIj48YmFyPjE8L2Jhcj48L2Zvbz4iICk7CisgICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPjwhLS1jb21tZW50LS0+PD90YXJnZXQgZm9vPz48L2Zvbz4iICk7CisgICAgICAgIGRvU2F2ZVRlc3QoICI8Zm9vPmE8YmFyPmI8L2Jhcj5jPGJhcj5kPC9iYXI+ZTwvZm9vPiIgKTsKKyAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKKyAgICAgICAgZG9TYXZlVGVzdCggIjxmb28geD1cInlcIiBwPVwiclwiLz4iICk7CisKKyAgICAgICAgU3RyaW5nIHMgPSAiPGZvbz5hYWE8L2Zvbz5iYmIiOworICAgICAgICBzID0gcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzICsgcyArIHMgKyBzOworICAgICAgICBzID0gIjxiYXI+eHh4eCIgKyBzICsgIjwvYmFyPiI7CisgICAgICAgIAorICAgICAgICBkb1NhdmVUZXN0KCBzICk7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPQorICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vIHhtbG5zOmE9J2EuY29tJz48YmFyIHhtbG5zOmE9J2IuY29tJy8+PC9mb28+IiApOworCisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKworICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJiLmNvbVwiLz4iICkgKTsKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6YT0nYS5jb20nPjxiYXIvPjwvZm9vPiIgKTsKKworICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKKworICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyIHhtbG5zOmE9XCJhLmNvbVwiLz4iICkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MU3RyZWFtICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgbyA9CisgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPGZvbyB4PVwieVwiIHhtbG5zPVwiZGVmYXVsdC5jb21cIj4iICsKKyAgICAgICAgICAgICAgICAgICAgIjwhLS0geCAtLT5iYXI8L2Zvbz4iICk7CisgICAgICAgIAorICAgICAgICBYbWxDdXJzb3IgYyA9IG8ubmV3Q3Vyc29yKCk7CisgICAgICAgIAorICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIAorICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiYXIiLCAiYmFyLmNvbSIgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9TdGFydERvYygpOworCisgICAgICAgIFhNTElucHV0U3RyZWFtIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKKworICAgICAgICBYTUxFdmVudCB4ZXY7CisgICAgICAgIFN0YXJ0RG9jdW1lbnQgc3RhcnREb2N1bWVudDsKKyAgICAgICAgRW5kRG9jdW1lbnQgZW5kRG9jdW1lbnQ7CisgICAgICAgIFN0YXJ0RWxlbWVudCBzdGFydEVsZW1lbnQ7CisgICAgICAgIEF0dHJpYnV0ZUl0ZXJhdG9yIGF0dHJpYnV0ZUl0ZXJhdG9yOworICAgICAgICBTdGFydFByZWZpeE1hcHBpbmcgc3RhcnRQcmVmaXhNYXBwaW5nOworICAgICAgICBFbmRQcmVmaXhNYXBwaW5nIGVuZFByZWZpeE1hcHBpbmc7CisgICAgICAgIENoYW5nZVByZWZpeE1hcHBpbmcgY3BtOworICAgICAgICBFbmRFbGVtZW50IGVuZEVsZW1lbnQ7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisgICAgICAgIENvbW1lbnQgY29tbWVudDsKKyAgICAgICAgQ2hhcmFjdGVyRGF0YSBjaGFyYWN0ZXJEYXRhOworICAgICAgICBYTUxOYW1lIG5hbWU7CisgICAgICAgIFN0cmluZyBzdHI7CisgICAgICAgIE1hcCBtYXA7CisgICAgICAgIAorICAgICAgICB4ZXYgPSBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0RPQ1VNRU5UICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnREb2N1bWVudC5pc1N0YXJ0RG9jdW1lbnQoKSApOworICAgICAgICAKKyAgICAgICAgeGV2ID0gc3RhcnRQcmVmaXhNYXBwaW5nID0gKFN0YXJ0UHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuU1RBUlRfUFJFRklYX01BUFBJTkcgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydFByZWZpeE1hcHBpbmcoKSApOworICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5sZW5ndGgoKSA9PSAwICk7CisgICAgICAgIAorICAgICAgICB4ZXYgPSBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNTdGFydEVsZW1lbnQoKSApOworICAgICAgICBhc3NlcnROYW1lKCBzdGFydEVsZW1lbnQuZ2V0TmFtZSgpLCAiZGVmYXVsdC5jb20iLCAiZm9vIiwgbnVsbCApOworICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgIngiLCBudWxsICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKS5lcXVhbHMoICJ5IiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOworICAgICAgICBhdHRyaWJ1dGVJdGVyYXRvciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VzKCk7CisgICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0TmFtZSggYXR0cmlidXRlLmdldE5hbWUoKSwgbnVsbCwgInhtbG5zIiwgbnVsbCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiZGVmYXVsdC5jb20iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7CisgICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXNBbmROYW1lc3BhY2VzKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgIT0gbnVsbCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpICE9IG51bGwgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7CisgICAgICAgIG5hbWUgPSBuZXcgWG1sTmFtZUltcGwoIG51bGwsICJ4IiwgbnVsbCApOworICAgICAgICBhdHRyaWJ1dGUgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlQnlOYW1lKCBuYW1lICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGUgIT0gbnVsbCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAieSIgKSApOworICAgICAgICBuYW1lID0gbmV3IFhtbE5hbWVJbXBsKCBudWxsLCAieG1sbnMiLCBudWxsICk7CisgICAgICAgIGF0dHJpYnV0ZSA9IHN0YXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGVCeU5hbWUoIG5hbWUgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZSA9PSBudWxsICk7CisgICAgICAgIHN0ciA9IHN0YXJ0RWxlbWVudC5nZXROYW1lc3BhY2VVcmkoIG51bGwgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJkZWZhdWx0LmNvbSIgKSApOworCisgICAgICAgIHhldiA9IHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX1BSRUZJWF9NQVBQSU5HICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzU3RhcnRQcmVmaXhNYXBwaW5nKCkgKTsKKyAgICAgICAgc3RyID0gc3RhcnRQcmVmaXhNYXBwaW5nLmdldE5hbWVzcGFjZVVyaSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0YXJ0UHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJiYXIiICkgKTsKKyAgICAgICAgCisgICAgICAgIHhldiA9IHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LlNUQVJUX0VMRU1FTlQgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc1N0YXJ0RWxlbWVudCgpICk7CisgICAgICAgIGFzc2VydE5hbWUoIHN0YXJ0RWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7CisgICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSA9PSBudWxsICk7CisgICAgICAgIGF0dHJpYnV0ZUl0ZXJhdG9yID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZXMoKTsKKyAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpOworICAgICAgICBhc3NlcnROYW1lKCBhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBudWxsLCAiYmFyIiwgInhtbG5zIiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKCAiYmFyLmNvbSIgKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYXR0cmlidXRlSXRlcmF0b3IubmV4dCgpID09IG51bGwgKTsKKyAgICAgICAgYXR0cmlidXRlSXRlcmF0b3IgPSBzdGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlc0FuZE5hbWVzcGFjZXMoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGF0dHJpYnV0ZUl0ZXJhdG9yLm5leHQoKSAhPSBudWxsICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhdHRyaWJ1dGVJdGVyYXRvci5uZXh0KCkgPT0gbnVsbCApOworICAgICAgICBzdHIgPSBzdGFydEVsZW1lbnQuZ2V0TmFtZXNwYWNlVXJpKCAiYmFyIiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RyLmVxdWFscyggImJhci5jb20iICkgKTsKKyAgICAgICAgbWFwID0gc3RhcnRFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggbWFwLmdldCggImJhciIgKS5lcXVhbHMoICJiYXIuY29tIiApICk7CisgICAgICAgIAorICAgICAgICB4ZXYgPSBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9FTEVNRU5UICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaGFzTmFtZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRFbGVtZW50KCkgKTsKKyAgICAgICAgYXNzZXJ0TmFtZSggZW5kRWxlbWVudC5nZXROYW1lKCksICJiYXIuY29tIiwgImJhciIsICJiYXIiICk7CisKKyAgICAgICAgeGV2ID0gZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5FTkRfUFJFRklYX01BUFBJTkcgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICF4ZXYuaGFzTmFtZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuaXNFbmRQcmVmaXhNYXBwaW5nKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGVuZFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAiYmFyIiApICk7CisKKyAgICAgICAgeGV2ID0gY29tbWVudCA9IChDb21tZW50KSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DT01NRU5UICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY29tbWVudC5oYXNDb250ZW50KCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNvbW1lbnQuZ2V0Q29udGVudCgpLmVxdWFscyggIiB4ICIgKSApOworICAgICAgICAKKyAgICAgICAgeGV2ID0gY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmdldFR5cGUoKSA9PSBYTUxFdmVudC5DSEFSQUNURVJfREFUQSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0NoYXJhY3RlckRhdGEoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImJhciIgKSApOworCisgICAgICAgIHhldiA9IGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuRU5EX0VMRU1FTlQgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5oYXNOYW1lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZEVsZW1lbnQoKSApOworICAgICAgICBhc3NlcnROYW1lKCBlbmRFbGVtZW50LmdldE5hbWUoKSwgImRlZmF1bHQuY29tIiwgImZvbyIsIG51bGwgKTsKKworICAgICAgICB4ZXYgPSBjcG0gPSAoQ2hhbmdlUHJlZml4TWFwcGluZykgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5nZXRUeXBlKCkgPT0gWE1MRXZlbnQuQ0hBTkdFX1BSRUZJWF9NQVBQSU5HICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheGV2Lmhhc05hbWUoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2LmlzQ2hhbmdlUHJlZml4TWFwcGluZygpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0UHJlZml4KCkubGVuZ3RoKCkgPT0gMCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY3BtLmdldE9sZE5hbWVzcGFjZVVyaSgpLmVxdWFscyggImRlZmF1bHQuY29tIiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjcG0uZ2V0TmV3TmFtZXNwYWNlVXJpKCkuZXF1YWxzKCAiIiApICk7CisKKyAgICAgICAgeGV2ID0gZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYuZ2V0VHlwZSgpID09IFhNTEV2ZW50LkVORF9ET0NVTUVOVCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIXhldi5oYXNOYW1lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldi5pc0VuZERvY3VtZW50KCkgKTsKKyAgICAgICAgCisgICAgICAgIHhldiA9IHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4ZXYgPT0gbnVsbCApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRlc3QgQ2hhbmdlUHJlZml4TWFwcGluZyBldmVudAorICAgICAgICAvLworCisgICAgICAgIG8gPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28geG1sbnM6eD1cInlcIj48YmFyIHhtbG5zOng9XCJ6XCIvPjwvZm9vPiIgKTsKKyAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7CisgICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgCisgICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgIHN0YXJ0UHJlZml4TWFwcGluZyA9IChTdGFydFByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7CisgICAgICAgIHN0ciA9IHN0YXJ0UHJlZml4TWFwcGluZy5nZXROYW1lc3BhY2VVcmkoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdGFydFByZWZpeE1hcHBpbmcuZ2V0UHJlZml4KCkuZXF1YWxzKCAieCIgKSApOworICAgICAgICAKKyAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKKworICAgICAgICBzdGFydFByZWZpeE1hcHBpbmcgPSAoU3RhcnRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOworICAgICAgICBzdHIgPSBzdGFydFByZWZpeE1hcHBpbmcuZ2V0TmFtZXNwYWNlVXJpKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBzdHIuZXF1YWxzKCAieiIgKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggc3RhcnRQcmVmaXhNYXBwaW5nLmdldFByZWZpeCgpLmVxdWFscyggIngiICkgKTsKKyAgICAgICAgCisgICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICBlbmRFbGVtZW50ID0gKEVuZEVsZW1lbnQpIHhpcy5uZXh0KCk7CisKKyAgICAgICAgY3BtID0gKENoYW5nZVByZWZpeE1hcHBpbmcpIHhpcy5uZXh0KCk7CisgICAgICAgIHN0ciA9IGNwbS5nZXRPbGROYW1lc3BhY2VVcmkoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ6IiApICk7CisgICAgICAgIHN0ciA9IGNwbS5nZXROZXdOYW1lc3BhY2VVcmkoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ5IiApICk7CisgICAgICAgIHN0ciA9IGNwbS5nZXRQcmVmaXgoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHN0ci5lcXVhbHMoICJ4IiApICk7CisKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworICAgICAgICAKKyAgICAgICAgZW5kUHJlZml4TWFwcGluZyA9IChFbmRQcmVmaXhNYXBwaW5nKSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZW5kUHJlZml4TWFwcGluZy5nZXRQcmVmaXgoKS5lcXVhbHMoICJ4IiApICk7CisKKyAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUZXN0IENoYXJhY3RlckRhdGEgZXZlbnRzCisgICAgICAgIC8vCisKKyAgICAgICAgbyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hPGJhcj5iPGJhej5jPC9iYXo+ZDwvYmFyPmU8L2Zvbz4iICk7CisgICAgICAgIGMgPSBvLm5ld0N1cnNvcigpOworICAgICAgICB4aXMgPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7CisgICAgICAgIAorICAgICAgICBzdGFydERvY3VtZW50ID0gKFN0YXJ0RG9jdW1lbnQpIHhpcy5uZXh0KCk7CisKKyAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKKworICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYSIgKSApOworCisgICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYiIgKSApOworCisgICAgICAgIHN0YXJ0RWxlbWVudCA9IChTdGFydEVsZW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICBjaGFyYWN0ZXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHhpcy5uZXh0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmhhc0NvbnRlbnQoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5nZXRDb250ZW50KCkuZXF1YWxzKCAiYyIgKSApOworCisgICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJkIiApICk7CisKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7CisKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworICAgICAgICAKKyAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUZXN0IFN1YlN0cmVhbXMKKyAgICAgICAgLy8KKworICAgICAgICBvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmE8YmFyPmI8YmF6PmM8L2Jhej5kPC9iYXI+ZTwvZm9vPiIgKTsKKyAgICAgICAgYyA9IG8ubmV3Q3Vyc29yKCk7CisgICAgICAgIHhpcyA9IGMubmV3WE1MSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgCisgICAgICAgIHN0YXJ0RG9jdW1lbnQgPSAoU3RhcnREb2N1bWVudCkgeGlzLm5leHQoKTsKKworICAgICAgICBzdGFydEVsZW1lbnQgPSAoU3RhcnRFbGVtZW50KSB4aXMubmV4dCgpOworCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJhIiApICk7CisKKyAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJiIiApICk7CisKKyAgICAgICAgICAgIFhNTElucHV0U3RyZWFtIHhpczIgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7CisKKyAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7CisKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworICAgICAgICAKKyAgICAgICAgY2hhcmFjdGVyRGF0YSA9IChDaGFyYWN0ZXJEYXRhKSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuZ2V0Q29udGVudCgpLmVxdWFscyggImQiICkgKTsKKworICAgICAgICAgICAgc3RhcnRFbGVtZW50ID0gKFN0YXJ0RWxlbWVudCkgeGlzMi5uZXh0KCk7CisKKyAgICAgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzMi5uZXh0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY2hhcmFjdGVyRGF0YS5oYXNDb250ZW50KCkgKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJjIiApICk7CisKKyAgICAgICAgICAgIGVuZEVsZW1lbnQgPSAoRW5kRWxlbWVudCkgeGlzMi5uZXh0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHhldiA9IHhpczIubmV4dCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHhldiA9PSBudWxsICk7CisgICAgICAgICAgICAKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworCisgICAgICAgIGNoYXJhY3RlckRhdGEgPSAoQ2hhcmFjdGVyRGF0YSkgeGlzLm5leHQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNoYXJhY3RlckRhdGEuaGFzQ29udGVudCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjaGFyYWN0ZXJEYXRhLmdldENvbnRlbnQoKS5lcXVhbHMoICJlIiApICk7CisKKyAgICAgICAgZW5kRWxlbWVudCA9IChFbmRFbGVtZW50KSB4aXMubmV4dCgpOworICAgICAgICAKKyAgICAgICAgZW5kRG9jdW1lbnQgPSAoRW5kRG9jdW1lbnQpIHhpcy5uZXh0KCk7CisgICAgICAgIAorICAgICAgICB4ZXYgPSB4aXMubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeGV2ID09IG51bGwgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2RG9jICggWG1sT2JqZWN0IHgsIFN0cmluZyBkaXJzICkKKyAgICB7CisgICAgICAgIHJldHVybiBuYXZDdXJzb3IoIHgubmV3Q3Vyc29yKCksIGRpcnMgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2TmV3Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKKyAgICB7CisgICAgICAgIHJldHVybiBuYXZDdXJzb3IoIGMubmV3Q3Vyc29yKCksIGRpcnMgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZvcm1hdDoKKyAgICAvLworICAgIC8vICAgICggWy1dW05dIHR5cGUgKSAqCisgICAgLy8KKyAgICAvLyAgICB0eXBlOgorICAgIC8vCisgICAgLy8gICAgICBjIC0gY2hhcmFjdGVyCisgICAgLy8gICAgICB0IC0gdG9rZW4KKyAgICAvLyAgICAgIHAgLSBwYXJlbnQgZWxlbWVudAorICAgIC8vICAgICAgcyAtIHNpYmxpbmcgZWxlbWVudAorICAgIC8vICAgICAgZCAtIGRlc2NlbmRlbnQgKGNoaWxkKSBlbGVtZW50CisgICAgLy8gICAgICByIC0gZW5kIG9mIHRoZSBkb2MgKHJvb3QpCisgICAgLy8gICAgICBiIC0gYmVnaW4gb2YgdGhlIGRvYworICAgIC8vCisgICAgCisgICAgcHJpdmF0ZSBYbWxDdXJzb3IgbmF2Q3Vyc29yICggWG1sQ3Vyc29yIGMsIFN0cmluZyBkaXJzICkKKyAgICB7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgYm9vbGVhbiBwcmV2ID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZGlycy5sZW5ndGgoKSA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkaXJzLmNoYXJBdCggaSApOworCisgICAgICAgICAgICBpZiAoY2ggPT0gJy0nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXYgPSAhIHByZXY7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG4gPSBuICogMTAgKyAoY2ggLSAnMCcpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoY2ggPT0gJ2MnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZDaGFyKCBuICkgPT0gbiApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0Q2hhciggbiApID09IG4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICd0JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG4tLSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZUb2tlbigpICE9IFRva2VuVHlwZS5OT05FICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvTmV4dFRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAncCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdyJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGMudG9FbmREb2MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdiJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISBwcmV2ICk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIG4gPT0gMSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGMudG9TdGFydERvYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ3MnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUHJldlNpYmxpbmcoKSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAnZCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgcHJldiApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHdoaWxlICggbi0tID4gMCApCisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RDaGlsZCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgcHJldiA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcHMgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4LCB4MiwgeTsKKyAgICAgICAgWG1sQ3Vyc29yIGNGcm9tLCBjVG8sIGNUZW1wLCBjVGVtcDIsIGMsIGQ7CisgICAgICAgIFhtbEJvb2ttYXJrIGFubm87CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7CisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKKyAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIiIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAKKyAgICAgICAgb3B0aW9ucy5wdXQoCisgICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCisgICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dW1RPXTxmb28+YWJjZGVmPC9mb28+PC9iYXI+IiApIHx8CisgICAgICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj5bVE9dW0ZST01dPGZvbz5hYmNkZWY8L2Zvbz48L2Jhcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZCIgKTsKKyAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgInR0dCIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCggb3B0aW9ucyApLmVxdWFscyggIjxiYXI+W0ZST01dPGZvbz5hYmNkZWY8L2Zvbz5bVE9dPC9iYXI+IiApICk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5hYmNkZWY8L2Zvbz4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImQiICk7CisgICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJ0M2MiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoIG9wdGlvbnMgKS5lcXVhbHMoICI8YmFyPltGUk9NXTxmb28+YWJjW1RPXWRlZjwvZm9vPjwvYmFyPiIgKSApOworICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+PC9yPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7CisgICAgICAgIGNUbyA9IG5hdk5ld0N1cnNvciggY0Zyb20sICJyLTF0IiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wcXI8L2I+PGE+eHl6PC9hPltUT108L3I+IiApICk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOworICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAici0xdC0xYyIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7CisgICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGI+cHFyPC9iPkE8YT54eXo8L2E+W1RPXUI8L3I+IiApICk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGE+eHl6PC9hPjxiPnBxcjwvYj5BQjwvcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOworICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAic3RjIiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20ubW92ZVhtbCggY1RvICkgKTsKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV08Yj5wPGE+eHl6PC9hPltUT11xcjwvYj5BQjwvcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PGI+cHFyPC9iPkFCPC9yPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImQiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICB0ZXN0VGV4dEZyYWcoIHgueG1sVGV4dCgpLCAiPGE+eHl6PC9hPltUT108cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+IiApOworICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48Yj5wcXI8L2I+QUI8L3I+IiApOworICAgICAgICAKKyAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICJkZCIgKTsKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7CisgICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgeC54bWxUZXh0KCBvcHRpb25zICkuZXF1YWxzKCAiPGJhcj48cj5bRlJPTV08Yj5wcXI8L2I+QUI8L3I+PGE+eHl6PC9hPltUT108L2Jhcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT54eXo8L2E+PC9yPiIgKTsKKyAgICAgICAgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxzPjwvcz4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgImRkIiApOworICAgICAgICBjVG8gPSBuYXZEb2MoIHgyLCAiZHQiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIHgueG1sVGV4dCgpLmVxdWFscyggIjxyPltGUk9NXTwvcj4iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8cj48YT5wcTwvYT48Yj48L2I+PC9yPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImRkc3QiICk7CisgICAgICAgIGNUZW1wID0gbmF2RG9jKCB4LCAiZGR0MWMiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5tb3ZlWG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKyAgICAgICAgY1RlbXAuaW5zZXJ0Q2hhcnMoICJbVEVNUF0iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8cj5bRlJPTV1bVEVNUF08Yj48YT5wcTwvYT5bVE9dPC9iPjwvcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKKyAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIi0xYyIgKTsKKyAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFjZFtUT11iW0ZST01dZWY8L2Zvbz4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMnQyYyIgKTsKKyAgICAgICAgY1RvID0gbmF2TmV3Q3Vyc29yKCBjRnJvbSwgIjNjIiApOworICAgICAgICBjRnJvbS5tb3ZlQ2hhcnMoIDIsIGNUbyApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscyggIjxmb28+YWJbRlJPTV1lY2RbVE9dZjwvZm9vPiIgKSApOworICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOworICAgICAgICAKKyAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIzdDJjIiApOworICAgICAgICBjVG8gPSBuYXZOZXdDdXJzb3IoIGNGcm9tLCAiM3QzYyIgKTsKKyAgICAgICAgY0Zyb20ubW92ZUNoYXJzKCAyLCBjVG8gKTsKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgIjxiYXI+PGZvbz5hYltGUk9NXWVmPC9mb28+PGZvbz4xMjNjZFtUT100NTY8L2Zvbz48L2Jhcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjxmb28+YWJjZGVmPC9mb28+PGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkIiApOworICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIyZHN0MmMiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAiPGJhcj5bRlJPTV08Zm9vPmFiY2RlZjwvZm9vPjxmb28+MTIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxyPjxhPnh5ejwvYT48L3I+IiApOworICAgICAgICB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHM+PC9zPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiZGQiICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeDIsICJkdCIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7CisgICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHI+W0ZST01dPGE+eHl6PC9hPjwvcj4iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgyLnhtbFRleHQoKS5lcXVhbHMoICI8cz48YT54eXo8L2E+W1RPXTwvcz4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAiPGJhcj48Zm9vPmFiY2RlZjwvZm9vPmJsYWg8Zm9vPjEyMzQ1NjwvZm9vPjwvYmFyPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiMmQiICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIjJkc3QyYyIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLmNvcHlYbWwoIGNUbyApICk7CisgICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICI8YmFyPltGUk9NXTxmb28+YWJjZGVmPC9mb28+YmxhaDxmb28+MTIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Zm9vPmFiY2RlZjwvZm9vPltUT10zNDU2PC9mb28+PC9iYXI+IiApICk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgIjxiYXI+PGZvbyB4PSd5Jz5hYmNkZWY8L2Zvbz48Zm9vPjEyMzQ1NjwvZm9vPjc4OTA8L2Jhcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkdCIgKTsKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzdCIgKTsKKyAgICAgICAgY1RlbXAgPSBuYXZEb2MoIHgsICIyZHN0M2MiICk7CisgICAgICAgIGNUZW1wMiA9IG5hdkRvYyggeCwgIjJkczN0MmMiICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjRnJvbS5jb3B5WG1sKCBjVG8gKSApOworICAgICAgICBjVGVtcC5pbnNlcnRDaGFycyggIltURU1QXSIgKTsKKyAgICAgICAgY1RlbXAyLmluc2VydENoYXJzKCAiW1RFTVAyXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAiPGJhcj48Zm9vIHg9XCJ5XCI+YWJjZGVmPC9mb28+IiArCisgICAgICAgICAgICAgICAgICAgICI8Zm9vIHg9XCJ5XCI+MTIzW1RFTVBdNDU2PC9mb28+NzhbVEVNUDJdOTA8L2Jhcj4iICkgKTsKKworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgIjxiYXI+eHk8Zm9vIHg9J3knPmFiY2RlZjwvZm9vPnBxcjxmb28+MTIzNDU2PC9mb28+PC9iYXI+IiApOworICAgICAgICAKKyAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIyZCIgKTsKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmRzLTJjIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7CisKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICB4LnhtbFRleHQoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgIjxiYXI+eHlbRlJPTV1wW1RPXXFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAiPGJhcj54eTxmb28geD0neSc+YWJjZGVmPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgIjJkMnQyYyIgKTsKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiMmQydDVjIiApOworICAgICAgICAKKyAgICAgICAgY0Zyb20ucmVtb3ZlQ2hhcnMoIDIgKTsKKworICAgICAgICBjRnJvbS5pbnNlcnRDaGFycyggIltGUk9NXSIgKTsKKyAgICAgICAgY1RvLmluc2VydENoYXJzKCAiW1RPXSIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAiPGJhcj54eTxmb28geD1cInlcIj5hYltGUk9NXWVbVE9dZiIgKworICAgICAgICAgICAgICAgICAgICAiPC9mb28+cHFyPGZvbz4xMjM0NTY8L2Zvbz48L2Jhcj4iICkgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyPjwhLS0tLT5hYmM8L2Jhcj4iICk7CisgICAgICAgIAorICAgICAgICBjRnJvbSA9IG5hdkRvYyggeCwgInR0IiApOworICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0dHRjIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLnJlbW92ZVhtbCgpICk7CisKKyAgICAgICAgY0Zyb20uaW5zZXJ0Q2hhcnMoICJbRlJPTV0iICk7CisgICAgICAgIGNUby5pbnNlcnRDaGFycyggIltUT10iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+W0ZST01dYVtUT11iYzwvYmFyPiIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJ0IiApOworICAgICAgICBjVG8uaW5zZXJ0RWxlbWVudCggImJvbyIgKTsKKyAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7CisgICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAibW9vIiApOworICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKKyAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJnb28iICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICI8Ym9vPjxtb28+PGdvby8+PC9tb28+PC9ib28+IiApICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInQiICk7CisgICAgICAgIGNUby5pbnNlcnRFbGVtZW50KCAiYm9vIiApOworICAgICAgICBjVG8udG9QcmV2VG9rZW4oKTsKKyAgICAgICAgY1RvLmluc2VydEVsZW1lbnQoICJtb28iICk7CisgICAgICAgIGNUby50b1ByZXZUb2tlbigpOworICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAieCIsICJ5IiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoCisgICAgICAgICAgICAiPGJvbz48bW9vIHg9XCJ5XCIvPjwvYm9vPiIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhciB4PSd5Jz5hYmM8L2Jhcj4iICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgInR0IiApOworICAgICAgICBjVG8uaW5zZXJ0QXR0cmlidXRlV2l0aFZhbHVlKCAicCIsICJxIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICI8YmFyIHA9XCJxXCIgeD1cInlcIj5hYmM8L2Jhcj4iICkgKTsKKworICAgICAgICAvLyBUZXh0IFhtbEJvb2ttYXJrCisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHI+PGZvbz5hYmM8L2Zvbz48YmFyPjwvYmFyPjwvcj4iICk7CisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAidHQiICk7CisgICAgICAgIGFubm8gPSBuZXcgQW5ubygpOworICAgICAgICBjRnJvbS5zZXRCb29rbWFyayggYW5ubyApOworICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICI2dCIgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNGcm9tLm1vdmVYbWwoIGNUbyApICk7CisgICAgICAgIGNGcm9tLmluc2VydENoYXJzKCAiW0ZST01dIiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICJbVE9dIiApOworICAgICAgICBhbm5vLmNyZWF0ZUN1cnNvcigpLmluc2VydENoYXJzKCAiW0FOTk9dIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgueG1sVGV4dCgpLmVxdWFscygKKyAgICAgICAgICAgICI8cj5bRlJPTV08YmFyPltBTk5PXTxmb28+YWJjPC9mb28+W1RPXTwvYmFyPjwvcj4iICkgKTsKKworICAgICAgICAvLyBUZXN0IGNvbnRlbnQgb3BzCisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7CisgICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKKyAgICAgICAgZC50b05leHRUb2tlbigpOworICAgICAgICB4Lm5ld0N1cnNvcigpLm1vdmVYbWxDb250ZW50cyggZCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKKyAgICAgICAgeSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGQgPSB5Lm5ld0N1cnNvcigpOworICAgICAgICBkLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMubW92ZVhtbENvbnRlbnRzKCBkICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB5LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vIHg9XCJ5XCI+YWJjPC9mb28+IiApICk7CisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJhcj48Zm9vIHg9J3knPmFiYzwvZm9vPjwvYmFyPiIgKTsKKyAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy5yZW1vdmVYbWxDb250ZW50cygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGJhci8+IiApICk7CisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hYmM8L2Zvbz4iICk7CisgICAgICAgIHkgPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkID0geS5uZXdDdXJzb3IoKTsKKyAgICAgICAgZC50b05leHRUb2tlbigpOworICAgICAgICB4Lm5ld0N1cnNvcigpLmNvcHlYbWxDb250ZW50cyggZCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeS54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwieVwiPmFiYzwvZm9vPiIgKSApOworICAgIH0gICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKKyAgICB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgWG1sQ3Vyc29yIGNUbzsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmFiY2RlZjwvZm9vPiIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPmEmbHQ7YiZhbXA7YzwvZm9vPiIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOworICAgICAgICBjVG8uaW5zZXJ0Q2hhcnMoICImPCIgKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Zm9vPiZhbXA7Jmx0OzwvZm9vPiIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28+YmFyPC9ib28+PC9mb28+IiApOworICAgICAgICAKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiZHQiICk7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8Ym9vPmJhcjwvYm9vPiIgKSApOworCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPjxib28geD1cInlcIj5iYXI8L2Jvbz48L2Zvbz4iICk7CisgICAgICAgIAorICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkdCIgKTsKKyAgICAgICAgCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxib28geD1cInlcIj5iYXI8L2Jvbz4iICkgKTsKKworICAgICAgICAvLyBUZXN0cyBmcmFnbWVudCBzYXZpbmcgYW5kIGxvYWRpbmcKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28+RXJpYzwvZm9vPiIgKTsKKyAgICAgICAgCisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgImR0IiApOworCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoKSApOworICAgICAgICAKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGNUby5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJFcmljIiApICk7CisKKyAgICAgICAgLy8gdGVzdCBzYXZlIHdoZXJlIEkgcmVwbGFjZSB0aGUgbmFtZSBvZiBhbiBlbGVtZW50CisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPkVyaWM8L2Zvbz4iICk7CisgICAgICAgIAorICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICJkIiApOworCisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIAorICAgICAgICBvcHRpb25zLnB1dCgKKyAgICAgICAgICAgIFhtbE9wdGlvbnMuU0FWRV9TWU5USEVUSUNfRE9DVU1FTlRfRUxFTUVOVCwKKyAgICAgICAgICAgIG5ldyBRTmFtZSggbnVsbCwgImJhciIgKSApOworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBjVG8ueG1sVGV4dCggb3B0aW9ucyApICk7CisgICAgICAgIAorICAgICAgICBjVG8gPSBuYXZEb2MoIHgsICIiICk7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLnhtbFRleHQoKS5lcXVhbHMoICI8YmFyPkVyaWM8L2Jhcj4iICkgKTsKKworICAgICAgICAvLyB0ZXN0IHNhdmUgd2hlcmUgSSByZXBsYWNlIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudAorICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5FcmljPC9mb28+IiApOworICAgICAgICAKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOworCisgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICAKKyAgICAgICAgb3B0aW9ucy5wdXQoCisgICAgICAgICAgICBYbWxPcHRpb25zLlNBVkVfU1lOVEhFVElDX0RPQ1VNRU5UX0VMRU1FTlQsCisgICAgICAgICAgICBuZXcgUU5hbWUoIG51bGwsICJiYXIiICkgKTsKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggY1RvLnhtbFRleHQoIG9wdGlvbnMgKSApOworICAgICAgICAKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICBjVG8ueG1sVGV4dCgpLmVxdWFscyggIjxiYXI+PGZvbz5FcmljPC9mb28+PC9iYXI+IiApICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8KKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhIHhtbG5zPSdmb28nLz4iICk7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOworICAgICAgICBjLnRvRmlyc3RDb250ZW50VG9rZW4oKTsKKworICAgICAgICBjLmluc2VydEVsZW1lbnQoICJiIiApOworICAgICAgICBjLnRvUHJldlNpYmxpbmcoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImIiICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeC54bWxUZXh0KCkgKTsKKyAgICAgICAgCisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICAKKyAgICAgICAgYy50b0ZpcnN0Q29udGVudFRva2VuKCk7CisgICAgICAgIGMudG9GaXJzdENvbnRlbnRUb2tlbigpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJiIiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RUZXh0RnJhZyAoIFN0cmluZyBhY3R1YWwsIFN0cmluZyBleHBlY3RlZCApCisgICAgeworICAgICAgICBTdHJpbmcgcHJlID0gIjx4bWwtZnJhZ21lbnQ+IjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBwb3N0ID0gIjwveG1sLWZyYWdtZW50PiI7CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYWN0dWFsLnN0YXJ0c1dpdGgoIHByZSApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhY3R1YWwuZW5kc1dpdGgoIHBvc3QgKSApOworICAgICAgICAKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICBleHBlY3RlZC5lcXVhbHMoCisgICAgICAgICAgICAgICAgYWN0dWFsLnN1YnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcHJlLmxlbmd0aCgpLCBhY3R1YWwubGVuZ3RoKCkgLSBwb3N0Lmxlbmd0aCgpICkgKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZyYWcgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4OworICAgICAgICBYbWxDdXJzb3IgYzsKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICAKKyAgICAgICAgYy5pbnNlcnRDaGFycyggIkVyaWMiICk7CisKKyAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIkVyaWMiICk7CisKKyAgICAgICAgLy8KKworICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKKworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisKKyAgICAgICAgYy5pbnNlcnRDb21tZW50KCAiIiApOworICAgICAgICBjLmluc2VydENoYXJzKCAieCIgKTsKKyAgICAgICAgCisgICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8IS0tLS0+eCIgKTsKKworICAgICAgICAvLworCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKworICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7CisgICAgICAgIGMuaW5zZXJ0Q2hhcnMoICJ4IiApOworICAgICAgICAKKyAgICAgICAgdGVzdFRleHRGcmFnKCB4LnhtbFRleHQoKSwgIjxmb28vPngiICk7CisgICAgICAgIAorICAgICAgICAvLworCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKworICAgICAgICBjLmluc2VydEVsZW1lbnQoICJmb28iICk7CisgICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKKyAgICAgICAgCisgICAgICAgIHRlc3RUZXh0RnJhZyggeC54bWxUZXh0KCksICI8Zm9vLz48YmFyLz4iICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgCisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIAorICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5MT0FEX1JFUExBQ0VfRE9DVU1FTlRfRUxFTUVOVCwgbnVsbCApOworICAgICAgICAKKyAgICAgICAgeCA9CisgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPGJhciBwPSdxJyB4PSd5Jz5hYjxmb28+eHk8L2Zvbz5jZDwvYmFyPiIsIG9wdGlvbnMgKTsKKyAgICAgICAgCisgICAgICAgIFhtbEN1cnNvciBjID0gbmF2RG9jKCB4LCAidCIgKTsKKworICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOworCisgICAgICAgIFN0cmluZyBvcGVuID0gInhtbG5zOm9wZW49J2h0dHA6Ly93d3cub3BlbnVyaS5vcmcvZnJhZ21lbnQnIjsKKyAgICAgICAgCisgICAgICAgIHggPQorICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxvcGVuOmZyYWdtZW50IHA9J3EnIHg9J3knICIgKyBvcGVuICsKKyAgICAgICAgICAgICAgICAgICAgIj5hYjxmb28+eHk8L2Zvbz5jZDwvb3BlbjpmcmFnbWVudD4iICk7CisgICAgICAgIAorICAgICAgICBjID0gbmF2RG9jKCB4LCAidCIgKTsKKworICAgICAgICBhc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKSA9PSBUb2tlblR5cGUuQVRUUiApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHg7CisgICAgICAgIFhtbEN1cnNvciBjRnJvbSwgY1RvOworCisgICAgICAgIC8vIEZvcndhcmQgbmF2aWdhdGlvbiAKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+Y2Q8L2Jhcj4iICk7CisKKyAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7CisgICAgICAgIGNUbyA9IG5hdkRvYyggeCwgIiIgKTsKKyAgICAgICAgICAgIAorICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOworCisgICAgICAgICAgICBUb2tlblR5cGUgdHQgPSBjRnJvbS5jdXJyZW50VG9rZW5UeXBlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0dCA9PSBUb2tlblR5cGUuRU5ERE9DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHQgPT0gVG9rZW5UeXBlLlRFWFQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0Q2hhciggMSApOworICAgICAgICAgICAgICAgIGNUby50b05leHRDaGFyKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY0Zyb20udG9OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICBjVG8udG9OZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJhY2t3YXJkIG5hdmlnYXRpb24gCisgICAgICAgIAorICAgICAgICB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YmFyIHA9J3EnIHg9J3knPmFiPGZvbz54eTwvZm9vPmNkPC9iYXI+IiApOworCisgICAgICAgIGNGcm9tID0gbmF2RG9jKCB4LCAiciIgKTsKKyAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiciIgKTsKKyAgICAgICAgICAgIAorICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uY29tcGFyZVBvc2l0aW9uKCBjVG8gKSA9PSAwICk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY0Zyb20uaXNBdFNhbWVQb3NpdGlvbkFzKCBjVG8gKSApOworCisgICAgICAgICAgICBpZiAoY0Zyb20udG9QcmV2Q2hhciggMSApID09IDEpCisgICAgICAgICAgICAgICAgY1RvLnRvUHJldkNoYXIoIDEgKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNGcm9tLnRvUHJldlRva2VuKCkgIT0gVG9rZW5UeXBlLk5PTkUpCisgICAgICAgICAgICAgICAgY1RvLnRvUHJldlRva2VuKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgIjxiYXIgcD0ncScgeD0neSc+YWI8Zm9vPnh5PC9mb28+YzxmIHk9J3gnPnh5PC9mPmQ8L2Jhcj4iICk7CisKKyAgICAgICAgY0Zyb20gPSBuYXZEb2MoIHgsICIiICk7CisKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY1RvID0gbmF2RG9jKCB4LCAiIiApOworCisgICAgICAgICAgICBmb3IgKCA7IDsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjVG8uaXNBdFNhbWVQb3NpdGlvbkFzKCBjRnJvbSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY1RvLmlzTGVmdE9mKCBjRnJvbSApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFwYXNzZWQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHBhc3NlZCApOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggY1RvLmlzUmlnaHRPZiggY0Zyb20gKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dENoYXIoIDEgKSAhPSAxKQorICAgICAgICAgICAgICAgICAgICBpZiAoY1RvLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoY0Zyb20udG9OZXh0Q2hhciggMSApICE9IDEpCisgICAgICAgICAgICAgICAgaWYgKGNGcm9tLnRvTmV4dFRva2VuKCkgPT0gVG9rZW5UeXBlLkVORERPQykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTXlBbm5vIGV4dGVuZHMgWG1sQm9va21hcmsKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24gKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vLz4iICk7CisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBNeUFubm8gYSA9IG5ldyBNeUFubm8oKTsKKyAgICAgICAgYy5zZXRCb29rbWFyayggYSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5yZW1vdmVYbWwoKSApOworICAgICAgICBYbWxDdXJzb3IgYzIgPSBhLmNyZWF0ZUN1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYzIgPT0gbnVsbCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0clNldHRlciAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxmb28vPiIgKTsKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMuc2V0QXR0cmlidXRlVGV4dCggbmV3IFFOYW1lKCBudWxsLCAieCIgKSwgImhhcmRlaGFyIiApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGZvbyB4PVwiaGFyZGVoYXJcIi8+IiApICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+PHgvPjx5Lz48ei8+PC9hPiIgKTsKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gZmFsc2UgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvRmlyc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b0xhc3RBdHRyaWJ1dGUoKSA9PSBmYWxzZSApOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInkiICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IHRydWUgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggInoiICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0U2libGluZygpID09IGZhbHNlICk7CisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGEgcD0ncScgbT0nbic+PHgvPjx5Lz48ei8+PC9hPiIgKTsKKyAgICAgICAgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5jdXJyZW50VG9rZW5UeXBlKCkuaXNBdHRyKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QcmV2U2libGluZygpID09IGZhbHNlICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc0F0dHIoKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b05leHRTaWJsaW5nKCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOworCisgICAgICAgIGMudG9FbmREb2MoKTsKKyAgICAgICAgYy50b1ByZXZUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieiIgKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieSIgKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAieCIgKSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1ByZXZTaWJsaW5nKCkgPT0gZmFsc2UgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9FbmREb2MoKTsKKyAgICAgICAgYy50b1ByZXZUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy50b1BhcmVudCgpID09IHRydWUgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyggImEiICkgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9FbmREb2MoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmN1cnJlbnRUb2tlblR5cGUoKS5pc1N0YXJ0ZG9jKCkgKTsKKyAgICAgICAgCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggIjxhPm1vbzwhLS0tLT5mb288L2E+IiApOworICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgYy50b1N0YXJ0RG9jKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOworICAgICAgICAKKyAgICAgICAgYy50b1N0YXJ0RG9jKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9QYXJlbnQoKSA9PSB0cnVlICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7CisKKyAgICAgICAgYy50b1N0YXJ0RG9jKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRDaGFyKCAyICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLnRvUGFyZW50KCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCAiYSIgKSApOworICAgICAgICAKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbz5lYXJseTxiYXI+dGV4dDxjaGFyPnphcDwvY2hhcj48L2Jhcj48L2Zvbz4iICk7CisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9GaXJzdENoaWxkKCkgPT0gdHJ1ZSApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXRUZXh0VmFsdWUoKS5lcXVhbHMoICJ6YXAiICkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldE5hbWUgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YSB4PSd5Jz5lcmljPCEtLS0tPjw/bW9vPz48L2E+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJhIiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJ4IiApICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5sZW5ndGgoKSA9PSAwICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKSA9PSBudWxsICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhYy50b05leHRUb2tlbigpLmlzTm9uZSgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoICJtb28iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDAgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICFjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpID09IG51bGwgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhcnMgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8Zm9vPmFiY2RlZmdoaWprbDwvZm9vPiIgKTsKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRDaGFyKCAyICk7CisgICAgICAgIAorICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbIDMgXTsKKyAgICAgICAgaW50IG4gPSBjLmdldENoYXJzKCBidWYsIDAsIDQwMCApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBuID09IDMgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlswXSA9PSAnYycgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsxXSA9PSAnZCcgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGJ1ZlsyXSA9PSAnZScgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZVN1YnN0aXR1dGlvbiAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSGFzaE1hcCBzdWJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgc3Vicy5wdXQoICJmb28iLCAibW9vIiApOworICAgICAgICBzdWJzLnB1dCggImEiLCAiYiIgKTsKKyAgICAgICAgCisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkxPQURfU1VCU1RJVFVURV9OQU1FU1BBQ0VTLCBzdWJzICk7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgWG1sT2JqZWN0IHggPQorICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgIjxhIHhtbG5zPSdmb28nIHhtbG5zOmE9J2EnIGE6eD0neScvPiIsCisgICAgICAgICAgICAgICAgb3B0aW9ucyApOworCisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBjLmdldE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoICJtb28iICkgKTsKKyAgICAgICAgCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIGMuZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyggIm1vbyIgKSApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOworICAgICAgICAKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCAiYiIgKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZXNwYWNlSW5zZXJ0aW9uICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiZm9vIiwgImh0dHA6Ly9wLmNvbSIgKTsKKyAgICAgICAgYy50b1ByZXZUb2tlbigpOworICAgICAgICBjLmluc2VydE5hbWVzcGFjZSggInAiLCAiaHR0cDovL3AuY29tIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgeC54bWxUZXh0KCkuZXF1YWxzKCAiPHA6Zm9vIHhtbG5zOnA9XCJodHRwOi8vcC5jb21cIi8+IiApICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlciAoIFN0cmluZyB4bWwsIFN0cmluZyB4bWxSZXN1bHQgKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHgueG1sVGV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeG1sUmVzdWx0LmVxdWFscyggcmVzdWx0ICkgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGRvdGVzdFBhcnNlckVycm9ycyAoIFN0cmluZyB4bWwgKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFRocm93YWJsZSB0ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmlsICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IG5vTmFtZXNwYWNlLkNhbkJlTmlsRG9jdW1lbnQuRmFjdG9yeS5wYXJzZSggIjxjYW5CZU5pbC8+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIGMudG9GaXJzdENoaWxkKCk7CisgICAgICAgIFhtbE9iamVjdCBmYyA9IGMuZ2V0T2JqZWN0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAhIGZjLmlzTmlsKCkgKTsKKyAgICAgICAgZmMuc2V0TmlsKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYy5pc05pbCgpICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8Y2FuQmVOaWwgeHNpOm5pbD1cInRydWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiLz4iICkgKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYy5pc0F0dHIoKSApOworICAgICAgICBjLnJlbW92ZVhtbCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPGNhbkJlTmlsLz4iICkgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgZmMuaXNOaWwoKSApOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8aGVlIHllZT0nZml2ZSc+PGhhdz42NjwvaGF3PjwvYW55PiIgKTsKKyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48L21vbz4iICk7CisgICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhPjxmb28+PC9tb28+PC9hPiIgKTsKKyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiIiApOworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICIgICAgIiApOworICAgICAgICAKKyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiaGFyIiApOworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8IS0tIGNvbW1lbnQgLS0+IiApOworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P21vbz8+IiApOworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz4iICk7CisgICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxhJC8+IiApOworICAgICAgICBkb3Rlc3RQYXJzZXJFcnJvcnMoICI8Zm9vIGE9JzwnPjwvZm9vPiIgKTsKKyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbyBhPjwvZm9vPiIgKTsKKyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz4iICk7CisgICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjwvZm9vPiIgKTsKKy8vIEZpeCB0aGUgcGFyc2VyIHRvIG1ha2UgdGhlc2Ugd29yaworLy8gICAgICAgIGRvdGVzdFBhcnNlckVycm9ycyggIjxmb28+PCEtLSAtLSAtLT48L2Zvbz4iICk7CisvLyAgICAgICAgZG90ZXN0UGFyc2VyRXJyb3JzKCAiPGZvbz48IS0tIC0tLT48L2Zvbz4iICk7CisKKyAgICAgICAgZG90ZXN0UGFyc2VyKCAiPGEgYj1cInhcblxueVwiLz4iLCAiPGEgYj1cInggIHlcIi8+IiApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2F4UGFyc2VyICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgeG1sID0gICI8YSB4PSd5Jz48IS0tLS0+eDxiLz48YyBwPSdxJz56PC9jPjwvYT4iOworICAgICAgICAKKyAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFNBWFBhcnNlciBzcCA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgWE1MUmVhZGVyIHhyID0gc3AuZ2V0WE1MUmVhZGVyKCk7CisgICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKCBuZXcgU3RyaW5nUmVhZGVyKCAgeG1sICkgKTsKKyAgICAgICAgWG1sU2F4SGFuZGxlciBzaCA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld1htbFNheEhhbmRsZXIoKTsKKyAgICAgICAgCisgICAgICAgIHhyLnNldEZlYXR1cmUoCisgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCisgICAgICAgICAgICB0cnVlICk7CisKKyAgICAgICAgeHIuc2V0RmVhdHVyZSgKKyAgICAgICAgICAgICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUgKTsKKworICAgICAgICB4ci5zZXRGZWF0dXJlKAorICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UgKTsKKworICAgICAgICB4ci5zZXRDb250ZW50SGFuZGxlciggc2guZ2V0Q29udGVudEhhbmRsZXIoKSApOworICAgICAgICAKKyAgICAgICAgeHIuc2V0UHJvcGVydHkoCisgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwKKyAgICAgICAgICAgIHNoLmdldExleGljYWxIYW5kbGVyKCkgKTsKKworICAgICAgICB4ci5wYXJzZSggaXMgKTsKKworICAgICAgICBYbWxPYmplY3QgeDEgPSBzaC5nZXRPYmplY3QoKTsKKworICAgICAgICBYbWxPYmplY3QgeDIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggeG1sICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgxLnhtbFRleHQoKS5lcXVhbHMoIHgyLnhtbFRleHQoKSApICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxOYW1lc3BhY2VzKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHhtbCA9ICI8YSB4bWxuczphPSdhTlMnPjxhOmIvPjwvYT4iOworCisgICAgICAgIE1hcCBtYXAgPSBuZXcgamF2YS51dGlsLkxpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgbWFwLnB1dCgiYiIsICJiTlMiKTsKKyAgICAgICAgbWFwLnB1dCgiYyIsICJjTlMiKTsKKyAgICAgICAgbWFwLnB1dCgiYSIsICJub3QtYU5TIik7CisKKyAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgb3B0aW9ucy5zZXRMb2FkQWRkaXRpb25hbE5hbWVzcGFjZXMobWFwKTsKKworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhtbCwgb3B0aW9ucyk7CisKKyAgICAgICAgLy8gJ2EnIHByZWZpeCBuYW1lc3BhY2UgaXMgbm90IHJlbWFwcGVkCisgICAgICAgIFN0cmluZyBleHBlY3QgPSAiPGEgeG1sbnM6Yz1cImNOU1wiIHhtbG5zOmI9XCJiTlNcIiB4bWxuczphPVwiYU5TXCI+PGE6Yi8+PC9hPiI7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdCwgeC54bWxUZXh0KCkgKTsKKworICAgICAgICB4bWwgPSAiPGEgeG1sbnM9J2FOUyc+PGIvPjwvYT4iOworCisgICAgICAgIG1hcCA9IG5ldyBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJiIiwgImJOUyIpOworICAgICAgICBtYXAucHV0KCJjIiwgImNOUyIpOworICAgICAgICBtYXAucHV0KCIiLCAibm90LWFOUyIpOworCisgICAgICAgIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcyhtYXApOworCisgICAgICAgIHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh4bWwsIG9wdGlvbnMpOworCisgICAgICAgIC8vIGRlZmF1bHQgbmFtZXNwYWNlIGlzIG5vdCByZW1hcHBlZAorICAgICAgICBleHBlY3QgPSAiPGEgeG1sbnM6Yz1cImNOU1wiIHhtbG5zOmI9XCJiTlNcIiB4bWxucz1cImFOU1wiPjxiLz48L2E+IjsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggZXhwZWN0LCB4LnhtbFRleHQoKSApOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENSMTM1MTkzKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHhtbCA9ICI8YSB4bWxucz0nYU5TJyB4bWxuczpiPSdiTlMnPjxiPjxjLz48L2I+PC9hPiI7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSh4bWwpOworCisgICAgICAgIC8vIGdldCBhbiBYTUxJbnB1dFN0cmVhbSBhbmQgbW92ZSB0byBYTUxFdmVudC5TVEFSVF9FTEVNRU5UIGZvciAnYicKKyAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICBYTUxJbnB1dFN0cmVhbSB4aXMgPSBjLm5ld1hNTElucHV0U3RyZWFtKCk7CisgICAgICAgIGMuZGlzcG9zZSgpOworICAgICAgICB3aGlsZSAoeGlzLmhhc05leHQoKSAmJiB4aXMubmV4dCgpLmdldFR5cGUoKSAhPSBYTUxFdmVudC5TVEFSVF9FTEVNRU5UKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXBhcnNlIGZyb20gJ2InIGVsZW1lbnQgdXNpbmcgYW4gc3ViLVhNTElucHV0U3RyZWFtCisgICAgICAgIFhNTElucHV0U3RyZWFtIHhpczEgPSB4aXMuZ2V0U3ViU3RyZWFtKCk7CisgICAgICAgIFhtbE9iamVjdCB4MSA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhpczEpOworCisgICAgICAgIC8vIENSMTM1MTkzOiBuYW1lc3BhY2VzIGluY2x1ZGluZyBkZWZhdWx0IGFyZSBzZXQgb24gdGhlICdiJyBjaGlsZAorICAgICAgICBTdHJpbmcgZXhwZWN0ID0gIjxiIHhtbG5zPVwiYU5TXCIgeG1sbnM6Yj1cImJOU1wiPjxjLz48L2I+IjsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggZXhwZWN0LCB4MS54bWxUZXh0KCkgKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdWJzdEdyb3VwVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9TdWJzdEdyb3VwVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ5OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1N1YnN0R3JvdXBUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxOb3JtYWxpemVkU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU3RyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sVG9rZW47CitpbXBvcnQgb3JnLm9wZW51cmkuc2dzLkFEb2N1bWVudDsKK2ltcG9ydCBvcmcub3BlbnVyaS5zZ3MuQkRvY3VtZW50OworaW1wb3J0IG9yZy5vcGVudXJpLnNncy5DRG9jdW1lbnQ7CitpbXBvcnQgb3JnLm9wZW51cmkuc2dzLlJvb3REb2N1bWVudDsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLlNjaGVtYURvY3VtZW50OworCitwdWJsaWMgY2xhc3MgU3Vic3RHcm91cFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgU3Vic3RHcm91cFRlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShTdWJzdEdyb3VwVGVzdHMuY2xhc3MpOyB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgeG1sMSA9ICI8cm9vdCB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+IiArCisgICAgICAgICAgICAiPEE+XHRhXHRhXHQ8L0E+IiArCisgICAgICAgICAgICAiPEI+XHRiXHRiXHQ8L0I+IiArCisgICAgICAgICAgICAiPEM+XHRjXHRjXHQ8L0M+IiArCisgICAgICAgICAgICAiPC9yb290PiI7CisKKworICAgICAgICBSb290RG9jdW1lbnQgZG9jMSA9IFJvb3REb2N1bWVudC5GYWN0b3J5LnBhcnNlKHhtbDEpOworICAgICAgICBSb290RG9jdW1lbnQuUm9vdCByb290ID0gZG9jMS5nZXRSb290KCk7CisgICAgICAgIGFzc2VydFRydWUoZG9jMS52YWxpZGF0ZSgpKTsKKworICAgICAgICBYbWxTdHJpbmcgYSA9IHJvb3QueGdldEFBcnJheSgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sU3RyaW5nLnR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdGFcdGFcdCIsIGEuc3RyaW5nVmFsdWUoKSk7CisKKyAgICAgICAgWG1sU3RyaW5nIGIgPSByb290LnhnZXRBQXJyYXkoMSk7CisgICAgICAgIGFzc2VydFRydWUoYi5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbE5vcm1hbGl6ZWRTdHJpbmcudHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiBiIGIgIiwgYi5zdHJpbmdWYWx1ZSgpKTsKKworICAgICAgICBYbWxTdHJpbmcgYyA9IHJvb3QueGdldEFBcnJheSgyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjLnNjaGVtYVR5cGUoKS5lcXVhbHMoWG1sVG9rZW4udHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMgYyIsIGMuc3RyaW5nVmFsdWUoKSk7CisKKyAgICAgICAgcm9vdC5pbnNlcnRBKDIsICJkIGQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIGQiLCByb290LmdldEFBcnJheSgyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCByb290LnNpemVPZkFBcnJheSgpKTsKKyAgICAgICAgcm9vdC5yZW1vdmVBKDIpOworCisgICAgICAgIHJvb3QucmVtb3ZlQSgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIGMiLCByb290LmdldEFBcnJheSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByb290LnNpemVPZkFBcnJheSgpKTsKKworICAgICAgICByb290LmFkZEEoImYgZiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcm9vdC5zaXplT2ZBQXJyYXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZiBmIiwgcm9vdC5nZXRBQXJyYXkoMikpOworCisgICAgICAgIC8vIFRlc3QgYXJyYXkgc2V0dGVycworCisgICAgICAgIC8vIHRlc3QgbSA8IG4gY2FzZQorICAgICAgICBTdHJpbmdbXSBzbWFsbGVyID0gbmV3IFN0cmluZ1tdeyAieCIsICJ5IiB9OworICAgICAgICByb290LnNldEFBcnJheShzbWFsbGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJvb3Quc2l6ZU9mQUFycmF5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInkiLCByb290LmdldEFBcnJheSgxKSk7CisKKyAgICAgICAgLy8gdGVzdCBtID4gbiBjYXNlCisgICAgICAgIFN0cmluZ1tdIGxhcmdlciA9IG5ldyBTdHJpbmdbXSB7ICJwIiwgInEiLCAiciIsICJzIiB9OworICAgICAgICByb290LnNldEFBcnJheShsYXJnZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcm9vdC5zaXplT2ZBQXJyYXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiciIsIHJvb3QuZ2V0QUFycmF5KDIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgeG1sMSA9ICI8QSB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+XHRhXHRhXHQ8L0E+IjsKKyAgICAgICAgU3RyaW5nIHhtbDIgPSAiPEIgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9zZ3MnPlx0Ylx0Ylx0PC9CPiI7CisgICAgICAgIFN0cmluZyB4bWwzID0gIjxDIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz5cdGNcdGNcdDwvQz4iOworCisgICAgICAgIEFEb2N1bWVudCBkMSA9IEFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHhtbDEpOworICAgICAgICBYbWxTdHJpbmcgYSA9IGQxLnhnZXRBKCk7CisgICAgICAgIGFzc2VydFRydWUoYS5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFN0cmluZy50eXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHRhXHRhXHQiLCBhLnN0cmluZ1ZhbHVlKCkpOworCisgICAgICAgIEFEb2N1bWVudCBkMiA9IEFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHhtbDIpOworICAgICAgICBYbWxTdHJpbmcgYiA9IGQyLnhnZXRBKCk7CisgICAgICAgIGFzc2VydFRydWUoZDIuc2NoZW1hVHlwZSgpLmVxdWFscyhCRG9jdW1lbnQudHlwZSkpOworICAgICAgICBhc3NlcnRUcnVlKGIuc2NoZW1hVHlwZSgpLmVxdWFscyhYbWxOb3JtYWxpemVkU3RyaW5nLnR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgYiBiICIsIGIuc3RyaW5nVmFsdWUoKSk7CisKKyAgICAgICAgQURvY3VtZW50IGQzID0gQURvY3VtZW50LkZhY3RvcnkucGFyc2UoeG1sMyk7CisgICAgICAgIFhtbFN0cmluZyBjID0gZDMueGdldEEoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkMy5zY2hlbWFUeXBlKCkuZXF1YWxzKENEb2N1bWVudC50eXBlKSk7CisgICAgICAgIGFzc2VydFRydWUoYy5zY2hlbWFUeXBlKCkuZXF1YWxzKFhtbFRva2VuLnR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIGMiLCBjLnN0cmluZ1ZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gaW52YWxpZFNjaGVtYXMgPSAKKyAgICB7CisgICAgICAgICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz4gIiArCisgICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdBJyB0eXBlPSd4c2Q6c3RyaW5nJy8+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOmludCcgc3Vic3RpdHV0aW9uR3JvdXA9J0EnLz4gIiArCisgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKKyAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiAiICsKKyAgICAgICAgIiAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdmb28nPiAiICsKKyAgICAgICAgIiAgICA8eHNkOnNlcXVlbmNlPiAiICsKKyAgICAgICAgIiAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdiYXInIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+IiArCisgICAgICAgICIgICAgPC94c2Q6c2VxdWVuY2U+ICIgKworICAgICAgICAiICA8L3hzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycgZmluYWw9JyNhbGwnLz4gIiArCisgICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycgZmluYWw9J3Jlc3RyaWN0aW9uJy8+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQicgdHlwZT0neHNkOnRva2VuJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0InLz4gIiArCisgICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdCJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQycvPiAiICsKKyAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0MnIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdEJy8+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nRCcgdHlwZT0neHNkOnN0cmluZycgc3Vic3RpdHV0aW9uR3JvdXA9J0UnLz4gIiArCisgICAgICAgICIgIDx4c2Q6ZWxlbWVudCBuYW1lPSdFJyB0eXBlPSd4c2Q6c3RyaW5nJyBzdWJzdGl0dXRpb25Hcm91cD0nQScvPiAiICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnRva2VuJyBzdWJzdGl0dXRpb25Hcm91cD0nQicvPiAiICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQScgdHlwZT0neHNkOnN0cmluZycvPiAiICsKKyAgICAgICAgIiAgPHhzZDplbGVtZW50IG5hbWU9J0InIHR5cGU9J3hzZDpzdHJpbmcnIHN1YnN0aXR1dGlvbkdyb3VwPSdBJy8+ICIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0nQ29tcGxleCc+ICIgKworICAgICAgICAiICAgIDx4c2Q6Y29tcGxleFR5cGU+ICIgKworICAgICAgICAiICAgICAgPHhzZDpjaG9pY2U+ICIgKworICAgICAgICAiICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdBJy8+IiArCisgICAgICAgICIgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J0InLz4iICsKKyAgICAgICAgIiAgICAgIDwveHNkOmNob2ljZT4gIiArCisgICAgICAgICIgICAgPC94c2Q6Y29tcGxleFR5cGU+ICIgKworICAgICAgICAiICA8L3hzZDplbGVtZW50PiAiICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgIH07CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkU2NoZW1hcyA9IAorICAgIHsKKyAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKworICAgICAgICAiICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnPiIgKworICAgICAgICAiICAgIDx4c2Q6YWxsPiIgKworICAgICAgICAiICAgICAgPHhzZDplbGVtZW50IHJlZj0naGVhZCcvPiIgKworICAgICAgICAiICAgIDwveHNkOmFsbD4iICsKKyAgICAgICAgIiAgPC94c2Q6Y29tcGxleFR5cGU+IiArCisgICAgICAgICIgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ncmVzdHInPiIgKworICAgICAgICAiICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+IiArCisgICAgICAgICIgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSdiYXNlJz4iICsKKyAgICAgICAgIiAgICAgICAgIDx4c2Q6YWxsPiIgKworICAgICAgICAiICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSd0YWlsJy8+IiArCisgICAgICAgICIgICAgICAgICA8L3hzZDphbGw+IiArCisgICAgICAgICIgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+IiArCisgICAgICAgICIgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+IiArCisgICAgICAgICIgIDwveHNkOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0naGVhZCcgdHlwZT0neHNkOnN0cmluZycvPiIgKworICAgICAgICAiICA8eHNkOmVsZW1lbnQgbmFtZT0ndGFpbCcgc3Vic3RpdHV0aW9uR3JvdXA9J2hlYWQnLz4iICsKKyAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorICAgIH07CisgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNjaGVtYURvY3VtZW50W10gc2NoZW1hcyA9IG5ldyBTY2hlbWFEb2N1bWVudFtpbnZhbGlkU2NoZW1hcy5sZW5ndGhdOworCisgICAgICAgIC8vIFBhcnNlIHRoZSBpbnZhbGlkIHNjaGVtYSBmaWxlcworICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBpbnZhbGlkU2NoZW1hcy5sZW5ndGggOyBpKyspCisgICAgICAgICAgICBzY2hlbWFzW2ldID0gU2NoZW1hRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShpbnZhbGlkU2NoZW1hc1tpXSk7CisKKyAgICAgICAgLy8gTm93IGNvbXBpbGUgdGhlIGludmFsaWQgc2NoZW1hcywgdGVzdCB0aGF0IHRoZXkgZmFpbAorICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBYbWxCZWFucy5sb2FkWHNkKG5ldyBYbWxPYmplY3RbXSB7c2NoZW1hc1tpXX0pOworICAgICAgICAgICAgICAgIGZhaWwoIlNjaGVtYSBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gY29tcGlsZTpcbiIgKyBpbnZhbGlkU2NoZW1hc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIHN1Y2Nlc3MpIHsgLyogU3lzdGVtLm91dC5wcmludGxuKHN1Y2Nlc3MpOyAqLyB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vIFBhcnNlIHRoZSB2YWxpZCBzY2hlbWEgZmlsZXMKKyAgICAgICAgc2NoZW1hcyA9IG5ldyBTY2hlbWFEb2N1bWVudFt2YWxpZFNjaGVtYXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsaWRTY2hlbWFzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgICAgIHNjaGVtYXNbaV0gPSBTY2hlbWFEb2N1bWVudC5GYWN0b3J5LnBhcnNlKHZhbGlkU2NoZW1hc1tpXSk7CisKKyAgICAgICAgLy8gTm93IGNvbXBpbGUgdGhlIHZhbGlkIHNjaGVtYXMsIHRlc3QgdGhhdCB0aGV5IHN1Y2NlZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sQmVhbnMubG9hZFhzZChuZXcgWG1sT2JqZWN0W10ge3NjaGVtYXNbaV19KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZmFpbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGZhaWwoIkZhaWxlZCB0byBjb21waWxlIHNjaGVtYTogIiArIHNjaGVtYXNbaV0gKyAiIHdpdGggZXJyb3I6ICIgKyBmYWlsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW52YWxpZERvY3MgPSAKKyAgICB7CisgICAgICAgICI8YWJzdHJhY3RUZXN0IHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvc2dzJz4iICsKKyAgICAgICAgIiAgICA8YWJzdHJhY3Q+Y29udGVudDwvYWJzdHJhY3Q+ICIgKworICAgICAgICAiPC9hYnN0cmFjdFRlc3Q+ICIsCisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdmFsaWREb2NzID0gCisgICAgeworICAgICAgICAiPGFic3RyYWN0VGVzdCB4bWxucz0naHR0cDovL29wZW51cmkub3JnL3Nncyc+IiArCisgICAgICAgICIgICAgPGNvbmNyZXRlPmNvbnRlbnQ8L2NvbmNyZXRlPiAiICsKKyAgICAgICAgIjwvYWJzdHJhY3RUZXN0PiAiLAorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHRocm93cyBFeGNlcHRpb24gCisgICAgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGludmFsaWREb2NzLmxlbmd0aCA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IHhvID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoaW52YWxpZERvY3NbaV0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRG9jIHdhcyB2YWxpZC4gU2hvdWxkIGJlIGludmFsaWQ6ICIgKyBpbnZhbGlkRG9jc1tpXSwgCisgICAgICAgICAgICAgICAgISB4by52YWxpZGF0ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHZhbGlkRG9jcy5sZW5ndGggOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdCB4byA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHZhbGlkRG9jc1tpXSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEb2Mgd2FzIGludmFsaWQuIFNob3VsZCBiZSB2YWxpZDogIiArIHZhbGlkRG9jc1tpXSwKKyAgICAgICAgICAgICAgICB4by52YWxpZGF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1Rlc3RFbnYuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0RW52LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFRlc3RFbnYKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGZ3cm9vdCA9IGdldFJvb3RGaWxlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBjYXNlcm9vdCA9IG5ldyBGaWxlKGZ3cm9vdCwgInRlc3QvY2FzZXMiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG91dHB1dHJvb3QgPSBuZXcgRmlsZShmd3Jvb3QsICJidWlsZC90ZXN0L291dHB1dCIpOworCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldFJvb3RGaWxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZSggU3lzdGVtLmdldFByb3BlcnR5KCAieGJlYW4ucm9vdGRpciIgKSApLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSB4YmVhbkNhc2UoU3RyaW5nIHN0cikKKyAgICB7CisgICAgICAgIHJldHVybiAobmV3IEZpbGUoY2FzZXJvb3QsIHN0cikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSB4YmVhbk91dHB1dChTdHJpbmcgc3RyKQorICAgIHsKKyAgICAgICAgRmlsZSByZXN1bHQgPSAobmV3IEZpbGUob3V0cHV0cm9vdCwgc3RyKSk7CisgICAgICAgIEZpbGUgcGFyZW50ZGlyID0gcmVzdWx0LmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgcGFyZW50ZGlyLm1rZGlycygpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWx0cmVlKEZpbGUgZGlyKQorICAgIHsKKyAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBkaXIubGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZGVsdHJlZShuZXcgRmlsZShkaXIsIGxpc3RbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGlyLmRlbGV0ZSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBkZWxldGUgIiArIGRpcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdFJ1blV0aWwuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UZXN0UnVuVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhY2Y3MzgKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGVzdFJ1blV0aWwuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdFJ1blV0aWwKK3sKKyAgICAvKioKKyAgICAgKiBSdW5zIG1ldGhvZCB0aGF0IG11c3QgYmUgZGVjbGFyZWQgInN0YXRpYyB2b2lkIHRlc3QoKSIgb24gdGhlIGdpdmVuCisgICAgICogY2xhc3MsIHdpdGggdGhlIGdpdmVuIGFkZGl0aW9uYWwgamFycyBvciBkaXJlY3RvcmllcyBvbiB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU3RyaW5nIGNsYXNzbmFtZSwgRmlsZVtdIGNsYXNzcGF0aCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJSdW5uaW5nICIgKyBjbGFzc25hbWUgKyAiIHdpdGggY2xhc3NwYXRoOiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKGNsYXNzcGF0aFtpXSk7CisgICAgICAgICAgICBpZiAoIWNsYXNzcGF0aFtpXS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzc3BhdGggY29tcG9uZW50ICIgKyBjbGFzc3BhdGggKyAiIGNhbm5vdCBiZSBmb3VuZCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIFVSTFtdIGV4dHJhY3AgPSBuZXcgVVJMW2NsYXNzcGF0aC5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXh0cmFjcFtpXSA9IGNsYXNzcGF0aFtpXS50b1VSTCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1hbGZvcm1lZCBjbGFzc3BhdGggZmlsZW5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENsYXNzTG9hZGVyIGN1cmNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2hpbGRjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihleHRyYWNwKTsKKyAgICAgICAgICAgIENsYXNzIGphdmFDbGFzcyA9IGNoaWxkY2wubG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBjaGlsZGNsLmxvYWRDbGFzcygib3JnLm9wZW51cmkubXl0ZXN0LkN1c3RvbWVyRG9jdW1lbnQiKTsKKyAgICAgICAgICAgIGlmICh0ZXN0Q2xhc3MgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBNZXRob2QgbWV0aCA9IGphdmFDbGFzcy5nZXRNZXRob2QoInRlc3QiLCBuZXcgQ2xhc3NbMF0pOyAvLyBzaG91bGQgYmUgc3RhdGljCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjaGlsZGNsKTsKKyAgICAgICAgICAgIG1ldGguaW52b2tlKG51bGwsIG5ldyBPYmplY3RbMF0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNsYXNzIG5vdCBmb3VuZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gdGVzdCgpIG1ldGhvZCBmb3VuZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdWxkIG5vdCBpbnZva2Ugc3RhdGljIHB1YmxpYyB0ZXN0IG1ldGhvZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cmNsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UaHJlYWRpbmdUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTZlYzIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvVGhyZWFkaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitwdWJsaWMgY2xhc3MgVGhyZWFkaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIFRocmVhZGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFRocmVhZGluZ1Rlc3QuY2xhc3MpOyB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSFJFQURfQ09VTlQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElURVJBVElPTl9DT1VOVCA9IDE7CisKKyAgICBwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQKKyAgICB7CisgICAgICAgIHByaXZhdGUgVGhyb3dhYmxlIF90aHJvd2FibGU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBfcmVzdWx0OworCisgICAgICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF90aHJvd2FibGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXN1bHQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSVRFUkFUSU9OX0NPVU5UOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIGxvYWRlciA9IFhtbEJlYW5zLmxvYWRYc2QobmV3IFhtbE9iamVjdFtdIHsgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9YbWxTaWduYXR1cmUveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiKSkgfSk7CisgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdCByZXN1bHQgPSBsb2FkZXIucGFyc2UoVGVzdEVudi54YmVhbkNhc2UoInNjaGVtYS9YbWxTaWduYXR1cmUvc2lnbmF0dXJlLWV4YW1wbGUueG1sIiksIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGxvYWRlci5maW5kRG9jdW1lbnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIsICJTaWduYXR1cmUiKSksIHJlc3VsdC5zY2hlbWFUeXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfdGhyb3dhYmxlID0gdDsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRocmVhZGVkQ29tcGlsYXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBDb21waWxhdGlvblRocmVhZFtdIHRocmVhZHMgPSBuZXcgQ29tcGlsYXRpb25UaHJlYWRbVEhSRUFEX0NPVU5UXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJlYWRzW2ldID0gbmV3IENvbXBpbGF0aW9uVGhyZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNbaV0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc1tpXS5qb2luKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRocmVhZHNbaV0uZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlRocmVhZCAiICsgaSArICIgZGlkbid0IHN1Y2NlZWQiLCB0aHJlYWRzW2ldLmdldFJlc3VsdCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1R5cGVkU2V0dGVyc1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxZDBlMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9UeXBlZFNldHRlcnNUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbFNheEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxMaW5lTnVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sSW50OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuQ29tcGFyYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisgICAKK3B1YmxpYyBjbGFzcyBUeXBlZFNldHRlcnNUZXN0cyBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIFR5cGVkU2V0dGVyc1Rlc3RzKFN0cmluZyBuYW1lKSB7IHN1cGVyKG5hbWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeyByZXR1cm4gbmV3IFRlc3RTdWl0ZShUeXBlZFNldHRlcnNUZXN0cy5jbGFzcyk7IH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzY2hlbWFOcyA9InhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbnN0YW5jZU5zID0gInhtbG5zOnhzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZm10ICggU3RyaW5nIHMgKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzLmxlbmd0aCgpIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KCBpICk7CisKKyAgICAgICAgICAgIGlmIChjaCAhPSAnJCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBjaCApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKKworICAgICAgICAgICAgU3RyaW5nIGlkID0gIiI7CisKKyAgICAgICAgICAgIHdoaWxlICggKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZCA9IGlkICsgY2g7CisgICAgICAgICAgICAgICAgY2ggPSBzLmNoYXJBdCggKytpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhcmcgPSAiIjsKKworICAgICAgICAgICAgaWYgKGNoID09ICcoJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KCArK2kgKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICggY2ggIT0gJyknICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFyZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBzLmNoYXJBdCggKytpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGktLTsKKworICAgICAgICAgICAgaWYgKGlkLmVxdWFscyggInNjaGVtYSIgKSkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIHNjaGVtYU5zICk7CisgICAgICAgICAgICBlbHNlIGlmIChpZC5lcXVhbHMoICJ4c2kiICkpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBpbnN0YW5jZU5zICk7CisgICAgICAgICAgICBlbHNlIGlmIChpZC5lcXVhbHMoICJ0eXBlIiApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBhcmcubGVuZ3RoKCkgPiAwICk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCAieHNpOnR5cGU9XCIiICsgYXJnICsgIlwiIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5zZXMgPSBzY2hlbWFOcyArICIgIiArIGluc3RhbmNlTnM7CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEphdmFOb1R5cGVTaW5nbGV0b25FbGVtZW50ICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHh5enp5Lz4iICk7CisgICAgICAgIFhtbE9iamVjdCB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGJ1YmJhPm1vbzwvYnViYmE+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIFhtbEN1cnNvciBjMiA9IHgyLm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYzIudG9OZXh0VG9rZW4oKTsKKworICAgICAgICBjLmdldE9iamVjdCgpLnNldCggYzIuZ2V0T2JqZWN0KCkgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCAiPHh5enp5Pm1vbzwveHl6enk+IiApICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhTm9UeXBlU2luZ2xldG9uQXR0cmlidXRlICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPHh5enp5IGE9JycvPiIgKTsKKyAgICAgICAgWG1sT2JqZWN0IHgyID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8YnViYmEgYj0nbW9vJy8+IiApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIFhtbEN1cnNvciBjMiA9IHgyLm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjMi50b05leHRUb2tlbigpOworICAgICAgICBjMi50b05leHRUb2tlbigpOworCisgICAgICAgIGMuZ2V0T2JqZWN0KCkuc2V0KCBjMi5nZXRPYmplY3QoKSApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCB4LnhtbFRleHQoKS5lcXVhbHMoICI8eHl6enkgYT1cIm1vb1wiLz4iICkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEphdmFOb1R5cGVTaW5nbGV0b25FbGVtZW50V2l0aFhzaVR5cGUgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoICI8eHl6enkvPiIsIG5ldyBYbWxPcHRpb25zKCkuc2V0RG9jdW1lbnRUeXBlKCBYbWxPYmplY3QudHlwZSApICk7CisgICAgICAgIFhtbE9iamVjdCB4MiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCBmbXQoICI8YnViYmEgJHR5cGUoeHM6aW50KSAkeHNpICRzY2hlbWE+Njk8L2J1YmJhPiIgKSApOworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgIFhtbEN1cnNvciBjMiA9IHgyLm5ld0N1cnNvcigpOworCisgICAgICAgIGMudG9OZXh0VG9rZW4oKTsKKyAgICAgICAgYzIudG9OZXh0VG9rZW4oKTsKKworICAgICAgICBYbWxPYmplY3QgeHl6enkgPSBjLmdldE9iamVjdCgpOworICAgICAgICBYbWxPYmplY3QgYnViYmEgPSBjMi5nZXRPYmplY3QoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggYnViYmEuc2NoZW1hVHlwZSgpID09IFhtbEludC50eXBlICk7CisKKy8vICAgICAgICB4eXp6eS5zZXQoIGJ1YmJhICk7CisKKy8vICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC54bWxUZXh0KCkuZXF1YWxzKCBmbXQoICI8eHl6enkgJHR5cGUoeHM6aW50KSAkeHNpICRzY2hlbWE+bW9vPC94eXp6eT4iICkgKSApOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9WYWxpZGF0aW9uVGVzdHMuamF2YSBiL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9WYWxpZGF0aW9uVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjMwZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZHJ0L2RydGNhc2VzL1ZhbGlkYXRpb25UZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTYwMiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5zdG9yZS5Sb290OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGVMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRGVjaW1hbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudmFsdWVzLlhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBWYWxpZGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsgc3VwZXIobmFtZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7IHJldHVybiBuZXcgVGVzdFN1aXRlKFZhbGlkYXRpb25UZXN0cy5jbGFzcyk7IH0KKworICAgIHN0YXRpYyBTdHJpbmdbXSBfYXJnczsKKyAgICBzdGF0aWMgU3RyaW5nIF90ZXN0OworCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENhc2VGaWxlKFN0cmluZyB0aGVDYXNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRlc3RFbnYueGJlYW5DYXNlKCJzdG9yZS8iICsgdGhlQ2FzZSk7CisgICAgfQorCisgICAgc3RhdGljIFhtbEN1cnNvciBsb2FkQ2FzZShTdHJpbmcgdGhlQ2FzZSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSgKKyAgICAgICAgICAgICAgICBnZXRDYXNlRmlsZSggdGhlQ2FzZSApICkubmV3Q3Vyc29yKCk7CisgICAgfQorCisgICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBTdHJpbmdbXSBzY2hlbWFzICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWG1sT2JqZWN0W10gc2NoZW1hRG9jcyA9IG5ldyBYbWxPYmplY3QgWyBzY2hlbWFzLmxlbmd0aCBdOworCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBzY2hlbWFzLmxlbmd0aCA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaGVtYURvY3NbIGkgXSA9CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgIHNjaGVtYXNbIGkgXSApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFhtbEJlYW5zLmxvYWRYc2QoIHNjaGVtYURvY3MgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNjaGVtYVR5cGVMb2FkZXIgbWFrZVNjaGVtYVR5cGVMb2FkZXIgKCBGaWxlW10gc2NoZW1hcyApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdFtdIHNjaGVtYURvY3MgPSBuZXcgWG1sT2JqZWN0IFsgc2NoZW1hcy5sZW5ndGggXTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgc2NoZW1hcy5sZW5ndGggOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBzY2hlbWFEb2NzWyBpIF0gPQorICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAorICAgICAgICAgICAgICAgICAgICBzY2hlbWFzWyBpIF0sIG5ldyBYbWxPcHRpb25zKCkuc2V0TG9hZExpbmVOdW1iZXJzKCkuc2V0TG9hZE1lc3NhZ2VEaWdlc3QoKSApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gWG1sQmVhbnMubG9hZFhzZCggc2NoZW1hRG9jcyApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2ICggU3RyaW5nIHhtbCApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFhtbE9iamVjdCB4ID0gWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoIHhtbCApOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC5zY2hlbWFUeXBlKCkgIT0gWG1sT2JqZWN0LnR5cGUgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBudiAoIFN0cmluZyB4bWwgKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCB4bWwgKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHguc2NoZW1hVHlwZSgpICE9IFhtbE9iamVjdC50eXBlICk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheC52YWxpZGF0ZSgpICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIF9fX3Rlc3REZWZhdWx0ICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBEZWZhdWx0CisgICAgICAgIAorLy8gICAgICAgIHYoICI8dmFsaWRFbGVtRGVmYXVsdC8+IiApOworLy8gICAgICAgIHYoICI8dmFsaWRBdHRyRGVmYXVsdC8+IiApOworLy8gICAgICAgIAorLy8gICAgICAgIG52KCAiPGludmFsaWRFbGVtRGVmYXVsdC8+IiApOworICAgICAgICBudiggIjxpbnZhbGlkQXR0ckRlZmF1bHQvPiIgKTsKKworICAgICAgICB2KCAiPGludmFsaWRFbGVtRGVmYXVsdD4xMTxpbnZhbGlkRWxlbURlZmF1bHQ+IiApOworICAgICAgICB2KCAiPGludmFsaWRBdHRyRGVmYXVsdCBhdHRyPScyMic+IiApOworICAgICAgICAKKyAgICAgICAgLy8gRml4ZWQKKworICAgICAgICB2KCAiPHZhbGlkRWxlbUZpeGVkLz4iICk7CisgICAgICAgIHYoICI8dmFsaWRBdHRyRml4ZWQvPiIgKTsKKyAgICAgICAgCisgICAgICAgIG52KCAiPGludmFsaWRFbGVtRml4ZWQvPiIgKTsKKyAgICAgICAgbnYoICI8aW52YWxpZEF0dHJGaXhlZC8+IiApOworICAgICAgICAKKyAgICAgICAgdiggIjxpbnZhbGlkRWxlbUZpeGVkPjMzPGludmFsaWRFbGVtRml4ZWQ+IiApOworICAgICAgICB2KCAiPGludmFsaWRBdHRyRml4ZWQgYXR0cj0nNDQnLz4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9UZXN0ICgKKyAgICAgICAgU3RyaW5nW10gc2NoZW1hcywgUU5hbWUgZG9jVHlwZSwKKyAgICAgICAgU3RyaW5nW10gdmFsaWRJbnN0YW5jZXMsIFN0cmluZ1tdIGludmFsaWRJbnN0YW5jZXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgZG9jVHlwZSwgdmFsaWRJbnN0YW5jZXMsIGludmFsaWRJbnN0YW5jZXMsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvVGVzdCAoCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMsIFFOYW1lIGRvY1R5cGUsCisgICAgICAgIFN0cmluZ1tdIHZhbGlkSW5zdGFuY2VzLCBTdHJpbmdbXSBpbnZhbGlkSW5zdGFuY2VzLCBib29sZWFuIHN0YXJ0T25Eb2N1bWVudCApCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7CisKKyAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKworICAgICAgICBpZiAoZG9jVHlwZSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIGRvY1NjaGVtYSA9IHN0bC5maW5kRG9jdW1lbnRUeXBlKCBkb2NUeXBlICk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBkb2NTY2hlbWEgIT0gbnVsbCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBvcHRpb25zLnB1dCggWG1sT3B0aW9ucy5ET0NVTUVOVF9UWVBFLCBkb2NTY2hlbWEgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGludCBpID0gMCA7IGkgPCB2YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxPYmplY3QgeCA9CisgICAgICAgICAgICAgICAgc3RsLnBhcnNlKCAoU3RyaW5nKSB2YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgIGlmICghc3RhcnRPbkRvY3VtZW50KSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICAgICAgYy50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBjLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgTGlzdCB4ZWwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wdGlvbnMucHV0KCBYbWxPcHRpb25zLkVSUk9SX0xJU1RFTkVSLCB4ZWwgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSggb3B0aW9ucyApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWlzVmFsaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW52YWxpZCBkb2MsIGV4cGVjdGVkIGEgdmFsaWQgZG9jOiAiICk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeC54bWxUZXh0KCkgKTsKKyAgICAgICAgICAgICAgICBSb290LmR1bXAoIHggKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvcnM6ICIgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaiA9IDAgOyBqIDwgeGVsLnNpemUoKSA7IGorKyApCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggeGVsLmdldCggaiApICk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBpc1ZhbGlkICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgaW52YWxpZEluc3RhbmNlcy5sZW5ndGggOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxPYmplY3QgeDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeCA9IHN0bC5wYXJzZSggKFN0cmluZykgaW52YWxpZEluc3RhbmNlc1sgaSBdLCBudWxsLCBvcHRpb25zICk7CisKKyAgICAgICAgICAgICAgICBpZiAoISBzdGFydE9uRG9jdW1lbnQpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIGMgPSB4Lm5ld0N1cnNvcigpOworICAgICAgICAgICAgICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgICAgICAgICB4ID0gYy5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0geC52YWxpZGF0ZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJWYWxpZCBkb2MsIGV4cGVjdGVkIGEgaW52YWxpZCBkb2M6ICIgKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiSW5zdGFuY2UoIiArIGkgKyAiKTogIiApOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIHgueG1sVGV4dCgpICk7CisgICAgICAgICAgICAgICAgICAgIFJvb3QuZHVtcCggeCApOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggIWlzVmFsaWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSnVzdCBjb21waWxlIGEgc2NoZW1hLCBnb29kIGFuZCBiYWQKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUwICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbW9zdCBiYXNpYyBzY2hlbWEKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzY2hlbWEgPQorICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKworICAgICAgICAgICAgIiI7CisgICAgICAgIAorICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKKyAgICAgICAgCisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uZSB3aGljaCB1c2VzICMjdGFyZ2V0TmFtZXNwYWNlIG9uIGEgd2lsZGNhcmQKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHNjaGVtYSA9CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6c2VxdWVuY2U+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6YW55IG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnNlcXVlbmNlPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCisgICAgICAgICAgICAiIjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXM5OSA9IHsgc2NoZW1hIH07CisgICAgICAgIAorICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczk5ICk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAvLyBBIGJpZywgbmFzdHkgc2NoZW1hIDotKQorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgRmlsZSBmaWxlID0gVGVzdEVudi5nZXRSb290RmlsZSgpOworICAgICAgICBGaWxlIHNjaGVtZUZpbGUgPSBuZXcgRmlsZSggZmlsZSwgInNyYy94c2RzY2hlbWEvc2NoZW1hL1hNTFNjaGVtYS54c2QiICk7CisgICAgICAgIEZpbGUgeG1sRmlsZSA9IG5ldyBGaWxlKCBmaWxlLCAic3JjL3htbHNjaGVtYS9zY2hlbWEvWE1MLnhzZCIgKTsKKworICAgICAgICBGaWxlW10gc2NoZW1hc0YgPSB7IHNjaGVtZUZpbGUsIHhtbEZpbGUgfTsKKworICAgICAgICBSb290LmRpc2FibGVTdG9yZVZhbGlkYXRpb24oKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzRiApOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vdC5lbmFibGVTdG9yZVZhbGlkYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVtYVR5cGUgdHlwZSA9CisgICAgICAgICAgICBzdGwuZmluZERvY3VtZW50VHlwZSgKKyAgICAgICAgICAgICAgICBuZXcgUU5hbWUoICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJzY2hlbWEiICkgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggdHlwZSAhPSBudWxsICk7CisKKworICAgICAgICAvLworICAgICAgICAvLyBBIGdvb2QgcGllY2UgZnJvbSBhIEoyRUUgc2NoZW1hCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBzY2hlbWEgPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+XG4iICsgCisgICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJ1xuIiArIAorICAgICAgICAgICAgIiAgICAgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKyAKKyAgICAgICAgICAgICIgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJ1xuIiArIAorICAgICAgICAgICAgIiAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9J3VucXVhbGlmaWVkJz5cbiIgKyAKKyAgICAgICAgICAgICI8eHNkOmFubm90YXRpb24+XG4iICsgCisgICAgICAgICAgICAiPHhzZDpkb2N1bWVudGF0aW9uPlxuIiArIAorICAgICAgICAgICAgIkAoIylhcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZHMJMS43IDA3LzA4LzAyXG4iICsgCisgICAgICAgICAgICAiPC94c2Q6ZG9jdW1lbnRhdGlvbj5cbiIgKyAKKyAgICAgICAgICAgICI8L3hzZDphbm5vdGF0aW9uPlxuIiArIAorICAgICAgICAgICAgIjwveHNkOnNjaGVtYT5cbiI7CisgICAgICAgICAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXM1ID0geyBzY2hlbWEgfTsKKworICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczUgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBIGJhZCBzY2hlbWEKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHNjaGVtYSA9ICI8Zm9vLz4iOworICAgICAgICAKKyAgICAgICAgU3RyaW5nW10gc2NoZW1hczIgPSB7IHNjaGVtYSB9OworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hczIgKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBBIGJhZCBzY2hlbWEKKyAgICAgICAgLy8KKyAgICAgICAgc2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKKyAgICAgICAgICAgICIgIDxmb28vPlxuIiArCisgICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCisgICAgICAgICAgICAiIjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMzID0geyBzY2hlbWEgfTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMzICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBmYWxzZSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggWG1sRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMSAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGVyaWNTY2hlbWEgPQorICAgICAgICAgICAgIjx4czpzY2hlbWFcbiIgKworICAgICAgICAgICAgIiAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKworICAgICAgICAgICAgIiAgIHhtbG5zOm53PSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSdcbiIgKworICAgICAgICAgICAgIiAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Zvbyc+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSdudzpmb28nPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZXJpYyc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOnNlcXVlbmNlPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdhJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdiJyAvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0neWF5YScgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9JzEnIHByb2Nlc3NDb250ZW50cz0nbGF4Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2MnIC8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4czphbnkgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgcHJvY2Vzc0NvbnRlbnRzPSdzdHJpY3QnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J3gnIHVzZT0nb3B0aW9uYWwnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neScgdXNlPSdyZXF1aXJlZCcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSd6JyB1c2U9J3Byb2hpYml0ZWQnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7CisKKyAgICAgICAgU3RyaW5nIGVyaWMyU2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hXG4iICsKKyAgICAgICAgICAgICIgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICB4bWxuczpudz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJ1xuIiArCisgICAgICAgICAgICAiICAgeG1sbnM6ZXJpYz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMidcbiIgKworICAgICAgICAgICAgIiAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz5cbiIgKworICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXJpYzInPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpjb21wbGV4Q29udGVudD5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nZXJpYzpmb28nPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6c2VxdWVuY2U+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYScgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgICAgPC94czpzZXF1ZW5jZT5cbiIgKworICAgICAgICAgICAgIiAgICAgIDwveHM6ZXh0ZW5zaW9uPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6Y29tcGxleFR5cGU+XG4iICsKKyAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7CisKKyAgICAgICAgU3RyaW5nIGVyaWMgPSAiPGVyaWMgeT0nWScgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hJz4iOworICAgICAgICBTdHJpbmcgZXJpYzIgPSAiPGVyaWMgeG1sbnM9J2h0dHA6Ly9vcGVudXJpLm9yZy9lcmljc2NoZW1hMic+IjsKKyAgICAgICAgU3RyaW5nIHhzaSA9ICJ4bWxuczplcmljMj0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyJyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyI7CisKKyAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7CisgICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGMvPjxmb28geHNpOnR5cGU9J2VyaWMyOmVyaWMyJyAiICsKKyAgICAgICAgICAgICAgICB4c2kgKyAiPjxhIHhtbG5zPVwiaHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEyXCIvPjwvZm9vPjwvZXJpYz4iLAorICAgICAgICAgICAgZXJpYyArICI8YS8+PGIvPjxib28geG1sbnM9J3lheWEnLz48Yy8+PC9lcmljPiIsCisgICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGMvPjwvZXJpYz4iLAorICAgICAgICAgICAgZXJpYyArICI8YSB4PSd5Jy8+PGIvPjxjLz48L2VyaWM+IiwKKyAgICAgICAgICAgICI8ZXJpYyB5PSdZJyB4PSdYJyB4bWxucz0naHR0cDovL29wZW51cmkub3JnL2VyaWNzY2hlbWEnPiIgKworICAgICAgICAgICAgICAgICI8YS8+PGIvPjxjLz48L2VyaWM+IgorICAgICAgICB9OworCisgICAgICAgIFN0cmluZyBlcmljU2Fuc1kgPQorICAgICAgICAgICAgIjxlcmljIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IjsKKworICAgICAgICBTdHJpbmdbXSBpbnZhbGlkID0geworICAgICAgICAgICAgIjxmb28vPiIsCisgICAgICAgICAgICAiPGVyaWM+PGEvPjxmb28vPjxjLz48L2VyaWM+IiwKKyAgICAgICAgICAgIGVyaWMgKyAidGV4dDxhLz48Yi8+PGMvPjwvZXJpYz4iLAorICAgICAgICAgICAgZXJpYyArICI8YS8+dGV4dDxiLz48Yy8+PC9lcmljPiIsCisgICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+dGV4dDxjLz48L2VyaWM+IiwKKyAgICAgICAgICAgIGVyaWMgKyAiPGEvPjxiLz48Yy8+dGV4dDwvZXJpYz4iLAorICAgICAgICAgICAgZXJpYyArICI8YSB4PSd5Jy8+PGIvPjxjLz50ZXh0PC9lcmljPiIsCisgICAgICAgICAgICBlcmljICsgIjxhLz48Yi8+PGJvbyB4bWxucz0neWF5YScvPjxtb28geG1sbnM9J3lheWEnLz48Yy8+PC9lcmljPiIsCisgICAgICAgICAgICBlcmljU2Fuc1kgKyAiPGEvPjxiLz48Yy8+PC9lcmljPiIsCisgICAgICAgICAgICAiPGVyaWMgeT0nJyB6PScnIHhtbG5zPSdodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSc+IiArCisgICAgICAgICAgICAgICAgIjxhLz48Yi8+PGMvPjwvZXJpYz4iCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgZXJpY1NjaGVtYSwgZXJpYzJTY2hlbWEgfTsKKyAgICAgICAgCisgICAgICAgIGRvVGVzdCgKKyAgICAgICAgICAgIHNjaGVtYXMsCisgICAgICAgICAgICBuZXcgUU5hbWUoICJodHRwOi8vb3BlbnVyaS5vcmcvZXJpY3NjaGVtYSIsICJlcmljIiApLAorICAgICAgICAgICAgdmFsaWQsIGludmFsaWQgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUyICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgYm9iU2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hXG4iICsKKyAgICAgICAgICAgICIgICB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICB0YXJnZXROYW1lc3BhY2U9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnXG4iICsKKyAgICAgICAgICAgICIgICBlbGVtZW50Rm9ybURlZmF1bHQ9J3F1YWxpZmllZCc+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2JpZmYnPlxuIiArCisgICAgICAgICAgICAiICAgPHhzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpleHRlbnNpb24gYmFzZT0nYm9iOmZvbyc+XG4iICsKKyAgICAgICAgICAgICIgICAgIDx4czpzZXF1ZW5jZT5cbiIgKworICAgICAgICAgICAgIiAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdhJyBtaW5PY2N1cnM9JzAnIG1heE9jY3Vycz0ndW5ib3VuZGVkJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgIDwveHM6c2VxdWVuY2U+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpleHRlbnNpb24+XG4iICsKKyAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhDb250ZW50PlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZm9vJz5cbiIgKworICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJyB0eXBlPSdib2I6Zm9vJz5cbiIgKworICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiPC94czpzY2hlbWE+XG4iOworCisgICAgICAgIFN0cmluZyB4c2lUeXBlID0gInhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIjsKKworICAgICAgICBTdHJpbmdbXSB2YWxpZCA9IHsKKyAgICAgICAgICAgICI8Ym9iOmZvbyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnICIgKworICAgICAgICAgICAgICAgICJ4c2k6dHlwZT0nYm9iOmJpZmYnPjxib2I6YS8+PGJvYjphLz48Ym9iOmEvPjwvYm9iOmZvbz4iCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKKyAgICAgICAgICAgICI8Ym9iOmZvbyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpib2I9J2h0dHA6Ly9vcGVudXJpLm9yZy9ib2JzY2hlbWEnICIgKworICAgICAgICAgICAgICAgICJ4c2k6dHlwZT0nYm9iOmJpZmYnPjxib2I6cS8+PC9ib2I6Zm9vPiIsCisgICAgICAgICAgICAiPGJvYjpmb28gYT0nYicgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeG1sbnM6Ym9iPSdodHRwOi8vb3BlbnVyaS5vcmcvYm9ic2NoZW1hJyAiICsKKyAgICAgICAgICAgICAgICAieHNpOnR5cGU9J2JvYjpiaWZmJz48Ym9iOmEvPjxib2I6YS8+PGJvYjphLz48L2JvYjpmb28+IgorICAgICAgICB9OworCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IGJvYlNjaGVtYSB9OworICAgICAgICAKKyAgICAgICAgZG9UZXN0KCBzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCApOworICAgIH0KKyAgICAKKyAgICBTdHJpbmcgbnMgPQorICAgICAgICAieG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIiArCisgICAgICAgICAgICAieG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyI7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUzICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgPHhzOnNpbXBsZVR5cGUgbmFtZT0nYWxsTk5JJz5cbiIgKyAKKyAgICAgICAgICAgICIgIDx4czphbm5vdGF0aW9uPjx4czpkb2N1bWVudGF0aW9uPlxuIiArIAorICAgICAgICAgICAgIiAgIGZvciBtYXhPY2N1cnM8L3hzOmRvY3VtZW50YXRpb24+PC94czphbm5vdGF0aW9uPlxuIiArIAorICAgICAgICAgICAgIiAgPHhzOnVuaW9uIG1lbWJlclR5cGVzPSd4czpub25OZWdhdGl2ZUludGVnZXInPlxuIiArIAorICAgICAgICAgICAgIiAgIDx4czpzaW1wbGVUeXBlPlxuIiArIAorICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Tk1UT0tFTic+XG4iICsgCisgICAgICAgICAgICAiICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J3VuYm91bmRlZCcvPlxuIiArIAorICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArIAorICAgICAgICAgICAgIiAgIDwveHM6c2ltcGxlVHlwZT5cbiIgKyAKKyAgICAgICAgICAgICIgIDwveHM6dW5pb24+XG4iICsgCisgICAgICAgICAgICAiIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0Jhc2U2NEJpbmFyeSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmJhc2U2NEJpbmFyeSc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0VyaWMnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2FiY2RIZXhCaW5hcnknPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpoZXhCaW5hcnknPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdhYmNkJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd6ZXJvTnVtYmVyJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0nbnVtYmVyJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nWmVybycvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScwJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdudW1iZXInPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czp1bmlvbj5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSdjb2xsYXBzZScvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nWmVybycvPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nT25lJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUd28nLz5cbiIgKworICAgICAgICAgICAgIiAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1RocmVlJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdNYW55Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czp1bmlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0T2ZJbnQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpsaXN0IGl0ZW1UeXBlPSd4czppbnQnLz5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0T2ZQcmltZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOmxpc3QgaXRlbVR5cGU9J3ByaW1lJy8+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZXJpY0Jyb3RoZXInPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9J2NvbGxhcHNlJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0JyaWFuJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J0tldmluJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQnJvdGhlcnMnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpsaXN0IGl0ZW1UeXBlPSdlcmljQnJvdGhlcicvPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3dlZWtTdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9J2NvbGxhcHNlJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J01vbmRheScvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUdWVzZGF5Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9J1dlZG5lc2RheScvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdUaHVyc2RheScvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdGcmlkYXknLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nU2F0dXJkYXknLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nU3VuZGF5Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdhWWVhcic+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmR1cmF0aW9uJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nUDFZJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdlcmljQkRheSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRhdGUnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPScxOTY1LTA2LTEwJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd5b3VuZ2VyVGhhbkVyaWMnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkYXRlJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9JzE5NjUtMDYtMTAnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2ZpdmVDaGFyUW5hbWUnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpRTmFtZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc1Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd3YWNreVFuYW1lJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6UU5hbWUnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0nMTAnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbeHM6YWJjZGVdKicvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSd4czphYmMnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0neHM6YmNkJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmaXZlQ2hhckFueVVSSSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmFueVVSSSc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc1Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd3YWNreUFueVVSSSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmFueVVSSSc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSczJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSdmb28nLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nYmFyJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdiaXQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpib29sZWFuJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPScxfDAnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J2V2ZW5JbnRlZ2VyJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0nWzAtOV0qWzAyNDY4XScvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ncHJpbWUnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSdbMC05XSpbMTM1NzldJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzMnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nNScvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc3Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzExJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzEzJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE3Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzE5Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdmb3VyQ2hhclN0cmluZyc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOnN0cmluZyc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSc0Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0aHJlZU9yTW9yZUNoYXJTdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0nMycvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZU9yTGVzc0NoYXJTdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpzdHJpbmcnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1heExlbmd0aCB2YWx1ZT0nNScvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0nZml2ZVRvdGFsRGlnaXRzJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6dG90YWxEaWdpdHMgdmFsdWU9JzUnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3RocmVlRnJhY3Rpb25EaWdpdHMnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkZWNpbWFsJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpmcmFjdGlvbkRpZ2l0cyB2YWx1ZT0nMycvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluRXhjbHVzaXZlJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4RXhjbHVzaXZlJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluSW5jbHVzaXZlJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4RXhjbHVzaXZlRmxvYXQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlRmxvYXQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4SW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpmbG9hdCc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1pbkV4Y2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpzaW1wbGVUeXBlIG5hbWU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRvdWJsZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6bWF4RXhjbHVzaXZlIHZhbHVlPScxMCcvPlxuIiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6c2ltcGxlVHlwZT5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZG91YmxlJz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9JzEwJy8+XG4iICsKKyAgICAgICAgICAgICIgICAgPC94czpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIiAgPC94czpzaW1wbGVUeXBlPlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPlxuIiArCisgICAgICAgICAgICAiICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSd4czpkb3VibGUnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0nMTAnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYW55Jz5cbiIgKworICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdkZWZhdWx0XzEyMzQ1JyBkZWZhdWx0PScxMjM0NSc+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nZGVmYXVsdF8xMjM0JyBkZWZhdWx0PScxMjM0Jz5cbiIgKworICAgICAgICAgICAgIiAgPC94czplbGVtZW50PlxuIiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdkZWZhdWx0X2VyaWMnIGRlZmF1bHQ9J2VyaWMnPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICI8L3hzOnNjaGVtYT5cbiI7CisKKyAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7CisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTI8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGhyZWVGcmFjdGlvbkRpZ2l0cyc+LjEyMzwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+dW5ib3VuZGVkPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FsbE5OSSc+MDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPjE8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpiYXNlNjRCaW5hcnknPkNBRkVCQUJFPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FiY2RIZXhCaW5hcnknPmFiY2Q8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpiYXNlNjRCaW5hcnknPmFiY2RlZmdoPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCYXNlNjRCaW5hcnknPkVyaWM8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz4gWmVybzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd6ZXJvTnVtYmVyJz5aZXJvPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPjA8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdudW1iZXInPjE8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz4gMSA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz5Ud288L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz4gVGhyZWUgPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz48L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5CcmlhbjwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPktldmluPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCcm90aGVycyc+S2V2aW4gQnJpYW48L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5CcmlhbiBLZXZpbjwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+ICAxICAyMiAgMzMzICA0NDQ0ICA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz48L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz41OTk5PC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nYVllYXInPlAxWTwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyQW55VVJJJz5hYmNkZTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czphbnlVUkknPmZvbzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3YWNreUFueVVSSSc+Zm9vPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neW91bmdlclRoYW5FcmljJz4xOTY1LTA2LTExPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2VyaWNCRGF5Jz4xOTY1LTA2LTEwPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmRhdGVUaW1lJz4xOTk5LTA1LTMxVDEzOjIwOjAwLTA1OjAwPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjAwOjAwOjAwPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOnRpbWUnPjEzOjIwOjAwLTA1OjAwPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6YWJjPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPmFiY2RlPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPnhzOmFiPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz4zPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3ByaW1lJz4xMTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4rNDU8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+MTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czppbnRlZ2VyJz4wPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi0xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi0xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPjQ4OTc0MzU3OTgzNzU4OTc0MzQzNDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz48L2RlZmF1bHRfMTIzND4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjEyPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+MTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPjA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6Ym9vbGVhbic+ZmFsc2U8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Vla1N0cmluZyc+TW9uZGF5PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dlZWtTdHJpbmcnPlN1bmRheTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz4gIFRodXJzZGF5ICA8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmUnPjEwLjE8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlJz45Ljk8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlJz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmUnPjEwLjE8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlJz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmUnPjkuOTwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz45Ljk8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRmxvYXQnPjEwPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+OS45PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluSW5jbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4SW5jbHVzaXZlRG91YmxlJz45Ljk8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmb3VyQ2hhclN0cmluZyc+ZXJpYzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZU9yTW9yZUNoYXJTdHJpbmcnPjEyMzQ1PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVPckxlc3NDaGFyU3RyaW5nJz4xMjM0PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVUb3RhbERpZ2l0cyc+MTIzNDU8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZVRvdGFsRGlnaXRzJz4xMjM0PC9hbnk+IiwKKyAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz5cblxuPC9kZWZhdWx0XzEyMzQ+IgorICAgICAgICB9OworCisgICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7CisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhbGxOTkknPmZvbzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpoZXhCaW5hcnknPlA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aGV4QmluYXJ5Jz5DQUZFQkFCUDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdhYmNkSGV4QmluYXJ5Jz5hYmNlPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6YmFzZTY0QmluYXJ5Jz5hYmNkZTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQmFzZTY0QmluYXJ5Jz5FcmlrPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nemVyb051bWJlcic+T25lPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3plcm9OdW1iZXInPlR3ZW50eTwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J251bWJlcic+U2V2ZW48L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz5Cb2I8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbnVtYmVyJz48L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdlcmljQnJvdGhlcnMnPjE8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5Cb2I8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0Jyb3RoZXJzJz5SYWxwaCBGcmFuazwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+ICAxICAyMiAgMzMzICBFcmljICA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nbGlzdE9mSW50Jz5FcmljPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2xpc3RPZkludCc+LTwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2FZZWFyJz5QMlk8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd5b3VuZ2VyVGhhbkVyaWMnPjE5NjUtMDYtMTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXJpY0JEYXknPjE5ODUtMDYtMTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6ZGF0ZVRpbWUnPnh4MTk5OS0wNS0zMVQxMzoyMDowMC0wNTowMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpkYXRlVGltZSc+ZXJpYzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz45OTo5OTowMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czp0aW1lJz4xMzoyMDowMC05OTowMDwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3dhY2t5QW55VVJJJz5tb288L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZml2ZUNoYXJBbnlVUkknPmFiPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6YWJjZGVmZ2hpams8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nd2Fja3lRbmFtZSc+eHM6cHFyPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOlFOYW1lJz5mb286YmFyPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVDaGFyUW5hbWUnPnhzOmFiYzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdwcmltZSc+MTI8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ncHJpbWUnPjY8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0neHM6aW50ZWdlcic+Zm9vPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3hzOmludGVnZXInPi4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+dHJ1ZTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdiaXQnPmZhbHNlPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+bmliYmxlPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2JpdCc+MjwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz5ibHVyZjwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd4czpib29sZWFuJz48L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0nZXZlbkludGVnZXInPjwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd3ZWVrU3RyaW5nJz5Nb25kYXkgU3Vja3M8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhFeGNsdXNpdmUnPjEwLjE8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlJz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmUnPjEwPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkV4Y2x1c2l2ZSc+OS45PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1pbkluY2x1c2l2ZSc+OS45PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZSc+MTAuMTwvYW55PiIsCisKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZUZsb2F0Jz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVGbG9hdCc+MTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRmxvYXQnPjkuOTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVGbG9hdCc+OS45PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEluY2x1c2l2ZUZsb2F0Jz4xMC4xPC9hbnk+IiwKKworICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWF4RXhjbHVzaXZlRG91YmxlJz4xMC4xPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3Rlbk1heEV4Y2x1c2l2ZURvdWJsZSc+MTA8L2FueT4iLAorICAgICAgICAgICAgIjxhbnkgIiArIG5zICsgIiB4c2k6dHlwZT0ndGVuTWluRXhjbHVzaXZlRG91YmxlJz4xMDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5FeGNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NaW5JbmNsdXNpdmVEb3VibGUnPjkuOTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0ZW5NYXhJbmNsdXNpdmVEb3VibGUnPjEwLjE8L2FueT4iLAorCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+IDEyMzQgPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZpdmVUb3RhbERpZ2l0cyc+MTIzNDU2PC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2ZvdXJDaGFyU3RyaW5nJz52YXNpbGlrPC9hbnk+IiwKKyAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J3RocmVlT3JNb3JlQ2hhclN0cmluZyc+MTwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmaXZlT3JMZXNzQ2hhclN0cmluZyc+MTIzNDU2NzwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSd0aHJlZUZyYWN0aW9uRGlnaXRzJz4uMTIzNDwvYW55PiIsCisgICAgICAgICAgICAiPGFueSAiICsgbnMgKyAiIHhzaTp0eXBlPSdmb3VyQ2hhclN0cmluZyc+IGVyaWMgPC9hbnk+IiwKKworICAgICAgICAgICAgIjxkZWZhdWx0XzEyMzQ1ICIgKyBucyArICIgeHNpOnR5cGU9J2V2ZW5JbnRlZ2VyJz48L2RlZmF1bHRfMTIzNDU+IiwKKyAgICAgICAgICAgICI8ZGVmYXVsdF8xMjM0NSAiICsgbnMgKyAiIHhzaTp0eXBlPSdldmVuSW50ZWdlcic+XG5cbjwvZGVmYXVsdF8xMjM0NT4iCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nW10gc2NoZW1hcyA9IHsgc2NoZW1hIH07CisKKyAgICAgICAgZG9UZXN0KCBzY2hlbWFzLCBudWxsLCB2YWxpZCwgaW52YWxpZCApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTQgKCApCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBzY2hlbWEgPQorICAgICAgICAgICAgIjx4czpzY2hlbWEgeG1sbnM6eHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJz5cbiIgKworICAgICAgICAgICAgIlxuIiArCisgICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdhbnknPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0na2luZGFQcmltZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlsxMzU3OV0nLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMycvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc1Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzcnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTEnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTMnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTcnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTknLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCisgICAgICAgICAgICAiIjsKKworICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKKworICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPQorICAgICAgICAgICAgc3RsLnBhcnNlKAorICAgICAgICAgICAgICAgICI8YW55ICIgKyBucyArICIgeHNpOnR5cGU9J2tpbmRhUHJpbWUnPjEwMDwvYW55PiIsCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCApOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdW52YWxpZGF0ZWQgc3RyZWFtIGlzIE9LCisKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzID0geC5uZXdYTUxJbnB1dFN0cmVhbSgpOworCisgICAgICAgIHdoaWxlICggeGlzLmhhc05leHQoKSApCisgICAgICAgICAgICB4aXMubmV4dCgpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdmFsaWRhdGVkIHN0cmVhbSBmYWlscworCisgICAgICAgIGJvb2xlYW4gYmxld0NodW5rcyA9IGZhbHNlOworCisgICAgICAgIHhpcyA9CisgICAgICAgICAgICBzdGwubmV3VmFsaWRhdGluZ1hNTElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIHgubmV3WE1MSW5wdXRTdHJlYW0oKSwgbnVsbCwgbnVsbCApOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoIHhpcy5oYXNOZXh0KCkgKQorICAgICAgICAgICAgICAgIHhpcy5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBYTUxTdHJlYW1WYWxpZGF0aW9uRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBibGV3Q2h1bmtzID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCBibGV3Q2h1bmtzICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNSAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHNjaGVtYSA9CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCisgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2hlZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOnNlcXVlbmNlPlxuIiArCisgICAgICAgICAgICAiICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdoYXcnIHR5cGU9J3hzOmludCcvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPC94czpzZXF1ZW5jZT5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0neWVlJyB0eXBlPSd4czppbnQnLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhUeXBlPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOmVsZW1lbnQ+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIiAgPHhzOnNpbXBsZVR5cGUgbmFtZT0na2luZGFQcmltZSc+XG4iICsKKyAgICAgICAgICAgICIgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmRlY2ltYWwnPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9J1swLTldKlsxMzU3OV0nLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMycvPlxuIiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSc1Jy8+XG4iICsKKyAgICAgICAgICAgICIgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9JzcnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTEnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTMnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTcnLz5cbiIgKworICAgICAgICAgICAgIiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0nMTknLz5cbiIgKworICAgICAgICAgICAgIiAgICA8L3hzOnJlc3RyaWN0aW9uPlxuIiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICJcbiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCisgICAgICAgICAgICAiIjsKKworICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEgfTsKKworICAgICAgICBTY2hlbWFUeXBlTG9hZGVyIHN0bCA9IG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7CisKKyAgICAgICAgWG1sT2JqZWN0IHggPQorICAgICAgICAgICAgc3RsLnBhcnNlKAorICAgICAgICAgICAgICAgICI8aGVlIHllZT0nMyc+PGhhdz42NjwvaGF3PjwvaGVlPiIsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwgKTsKKworICAgICAgICBYbWxDdXJzb3IgYyA9IHgubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgZm9yICggOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IG9iaiA9IGMuZ2V0T2JqZWN0KCk7CisKKyAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBvYmoudmFsaWRhdGUoKTsKKworICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGludmFsaWQKKworICAgICAgICB4ID0KKyAgICAgICAgICAgIHN0bC5wYXJzZSgKKyAgICAgICAgICAgICAgICAiPGhlZSB5ZWU9J2ZpdmUnPjxoYXc+NjY8L2hhdz48L2hlZT4iLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggISB4LnZhbGlkYXRlKCkgKTsKKworICAgICAgICBjID0geC5uZXdDdXJzb3IoKTsKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICBjLnRvTmV4dFRva2VuKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoICEgYy5nZXRPYmplY3QoKS52YWxpZGF0ZSgpICk7CisKKyAgICAgICAgLy8gTm8gc2NoZW1hCisKKyAgICAgICAgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGZvbyB4PSd5Jz5hc2FzPGJhcj5hc2FzPC9iYXI+PC9mb28+IiApOworCisgICAgICAgIGMgPSB4Lm5ld0N1cnNvcigpOworCisgICAgICAgIGZvciAoIDsgOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdCBvYmogPSBjLmdldE9iamVjdCgpOworCisgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpCisgICAgICAgICAgICAgICAgb2JqLnZhbGlkYXRlKCk7CisKKyAgICAgICAgICAgIGlmIChjLnRvTmV4dFRva2VuKCkuaXNOb25lKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGU2ICggKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgc2NoZW1hID0KKyAgICAgICAgICAgICI8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKKyAgICAgICAgICAgICIgIDx4czplbGVtZW50IG5hbWU9J2hlZSc+XG4iICsKKyAgICAgICAgICAgICIgIDwveHM6ZWxlbWVudD5cbiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPlxuIiArCisgICAgICAgICAgICAiIjsKKworICAgICAgICBTdHJpbmdbXSBzY2hlbWFzID0geyBzY2hlbWEsIHNjaGVtYSB9OworCisKKyAgICAgICAgLy8gU2hvdWxkIGdldCBhIHNjaGVtYSBjb21waWxlIGVycm9yCisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ha2VTY2hlbWFUeXBlTG9hZGVyKCBzY2hlbWFzICk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggZmFsc2UgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIFhtbEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlNyAoICkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHNjaGVtYSA9CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYmFzZScgdHlwZT0nYmFzZScvPiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Jhc2UnPiIgKworICAgICAgICAgICAgIiAgICA8eHM6c2VxdWVuY2U+IiArCisgICAgICAgICAgICAiICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZm9vJy8+IiArCisgICAgICAgICAgICAiICAgIDwveHM6c2VxdWVuY2U+IiArCisgICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9J2Rlcml2ZWQnPiIgKworICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCisgICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdiYXNlJz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYmFyJy8+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3hzOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgIDwveHM6ZXh0ZW5zaW9uPiIgKworICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKworICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICI8L3hzOnNjaGVtYT4iICsKKyAgICAgICAgICAgICIiOworCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OworCisgICAgICAgIFNjaGVtYVR5cGVMb2FkZXIgc3RsID0gbWFrZVNjaGVtYVR5cGVMb2FkZXIoIHNjaGVtYXMgKTsKKworICAgICAgICBYbWxPYmplY3QgeCA9CisgICAgICAgICAgICBzdGwucGFyc2UoCisgICAgICAgICAgICAgICAgIjxiYXNlPjxmb28vPjwvYmFzZT4iLCBudWxsLCBudWxsICk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIHgudmFsaWRhdGUoKSApOworCisgICAgICAgIFhtbEN1cnNvciBjID0geC5uZXdDdXJzb3IoKTsKKworICAgICAgICBjLnRvRmlyc3RDaGlsZCgpOworCisgICAgICAgIFhtbE9iamVjdCBiYXNlID0gYy5nZXRPYmplY3QoKTsKKworICAgICAgICBjLnRvRW5kVG9rZW4oKTsKKyAgICAgICAgYy5pbnNlcnRFbGVtZW50KCAiYmFyIiApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCAheC52YWxpZGF0ZSgpICk7CisKKyAgICAgICAgYy50b1ByZXZTaWJsaW5nKCk7CisKKyAgICAgICAgYy5yZW1vdmVYbWwoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7CisKKyAgICAgICAgYmFzZS5jaGFuZ2VUeXBlKCBzdGwuZmluZFR5cGUoIG5ldyBRTmFtZSggImRlcml2ZWQiICkgKSApOworCisgICAgICAgIGMuaW5zZXJ0RWxlbWVudCggImJhciIgKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSggeC52YWxpZGF0ZSgpICk7CisgICAgfQorCisgICAgLy8gVGVzdHMgYWJzdHJhY3QgJiBibG9jayBhdHRyaWJ1dGVzIG9uIENvbXBsZXhUeXBlCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlOCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIiAgPHhzOmVsZW1lbnQgbmFtZT0nYWJzdHJhY3QnIHR5cGU9J2Fic3RyYWN0Jy8+IiArCisgICAgICAgICAgICAiICA8eHM6ZWxlbWVudCBuYW1lPSdiYXNlJyB0eXBlPSdiYXNlJy8+IiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nYWJzdHJhY3QnIGFic3RyYWN0PSd0cnVlJy8+IiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nY29uY3JldGUnPiIgKworICAgICAgICAgICAgIiAgICA8eHM6Y29tcGxleENvbnRlbnQ+IiArCisgICAgICAgICAgICAiICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSdhYnN0cmFjdCcvPiIgKworICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKworICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdiYXNlJyBibG9jaz0nZXh0ZW5zaW9uJy8+IiArCisgICAgICAgICAgICAiIiArCisgICAgICAgICAgICAiICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nZXh0Jz4iICsKKyAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0nYmFzZScvPiIgKworICAgICAgICAgICAgIiAgICA8L3hzOmNvbXBsZXhDb250ZW50PiIgKworICAgICAgICAgICAgIiAgPC94czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIiICsKKyAgICAgICAgICAgICIgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdyZXN0Jz4iICsKKyAgICAgICAgICAgICIgICAgPHhzOmNvbXBsZXhDb250ZW50PiIgKworICAgICAgICAgICAgIiAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSdiYXNlJy8+IiArCisgICAgICAgICAgICAiICAgIDwveHM6Y29tcGxleENvbnRlbnQ+IiArCisgICAgICAgICAgICAiICA8L3hzOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPiIgKworICAgICAgICAgICAgIiIsCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nIHhzaVR5cGUgPSAiIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnICI7CisKKyAgICAgICAgU3RyaW5nW10gdmFsaWQgPSB7CisgICAgICAgICAgICAiPGFic3RyYWN0IiArIHhzaVR5cGUgKyAieHNpOnR5cGU9J2NvbmNyZXRlJy8+IiwKKyAgICAgICAgICAgICI8YmFzZS8+IiwKKyAgICAgICAgICAgICI8YmFzZSIgKyB4c2lUeXBlICsgInhzaTp0eXBlPSdyZXN0Jy8+IiwKKyAgICAgICAgfTsKKyAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKKyAgICAgICAgICAgICI8YWJzdHJhY3QvPiIsCisgICAgICAgICAgICAiPGJhc2UiICsgeHNpVHlwZSArICJ4c2k6dHlwZT0nZXh0Jy8+IiwKKyAgICAgICAgfTsKKworICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgdmFsaWQsIGludmFsaWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPiIgKworICAgICAgICAgICAgIiAgIDx4czplbGVtZW50IG5hbWU9J29yZGVyJyB0eXBlPSdPcmRlclR5cGUnPiIgKworICAgICAgICAgICAgIiAgICAgICA8eHM6a2V5cmVmIG5hbWU9J3Byb2ROdW1LZXlSZWYnIHJlZmVyPSdwcm9kTnVtS2V5Jz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0naXRlbXMvKicvPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSdAbnVtYmVyJy8+IiArCisgICAgICAgICAgICAiICAgICAgIDwveHM6a2V5cmVmPiIgKworICAgICAgICAgICAgIiAgICAgICA8eHM6a2V5IG5hbWU9J3Byb2ROdW1LZXknPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPScuLy9wcm9kdWN0Jy8+IiArCisgICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZmllbGQgeHBhdGg9J251bWJlcicvPiIgKworICAgICAgICAgICAgIiAgICAgICA8L3hzOmtleT4iICsKKyAgICAgICAgICAgICIgICA8L3hzOmVsZW1lbnQ+IiArCisKKyAgICAgICAgICAgICIgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nT3JkZXJUeXBlJz4iICsKKyAgICAgICAgICAgICIgICAgICAgPHhzOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naXRlbXMnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naXRlbScgdHlwZT0nSXRlbVR5cGUnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPC94czplbGVtZW50PiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncHJvZHVjdHMnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ncHJvZHVjdCcgdHlwZT0nUHJvZHVjdFR5cGUnIG1heE9jY3Vycz0ndW5ib3VuZGVkJyBtaW5PY2N1cnM9JzAnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgPC94czplbGVtZW50PiIgKworICAgICAgICAgICAgIiAgICAgICA8L3hzOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J251bWJlcicgdHlwZT0neHM6c3RyaW5nJy8+IiArCisgICAgICAgICAgICAiICAgPC94czpjb21wbGV4VHlwZT4iICsKKworICAgICAgICAgICAgIiAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSdJdGVtVHlwZSc+IiArCisgICAgICAgICAgICAiICAgICAgIDx4czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3F1YW50aXR5JyB0eXBlPSd4czppbnQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgPC94czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSdudW1iZXInIHR5cGU9J3hzOmludCcvPiIgKworICAgICAgICAgICAgIiAgIDwveHM6Y29tcGxleFR5cGU+IiArCisKKyAgICAgICAgICAgICIgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0nUHJvZHVjdFR5cGUnPiIgKworICAgICAgICAgICAgIiAgICAgICA8eHM6c2VxdWVuY2U+IiArCisgICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdudW1iZXInIHR5cGU9J3hzOmludCcgbWluT2NjdXJzPScwJy8+IiArCisgICAgICAgICAgICAiICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSduYW1lJyB0eXBlPSd4czpzdHJpbmcnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J3ByaWNlJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSd4czpkZWNpbWFsJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9J2N1cnJlbmN5JyB0eXBlPSd4czpzdHJpbmcnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgIDwveHM6ZWxlbWVudD4iICsKKyAgICAgICAgICAgICIgICAgICAgPC94czpzZXF1ZW5jZT4iICsKKyAgICAgICAgICAgICIgICA8L3hzOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIjwveHM6c2NoZW1hPiAiLAorCisgICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+IiArCisKKyAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J3Jvb3QnIHR5cGU9J1Jvb3RUeXBlJz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4c2Q6a2V5IG5hbWU9J0Zvb0lkJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPScuLy9zdHJpbmd8Li8vdG9rZW58Li8vaW50Jy8+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpmaWVsZCB4cGF0aD0nQGlkJy8+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3hzZDprZXk+IiArCisgICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCisKKyAgICAgICAgICAgICIgICAgPHhzZDpncm91cCBuYW1lPSdncm91cCc+IiArCisgICAgICAgICAgICAiICAgICAgICA8eHNkOmNob2ljZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSdzdHJpbmcnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSd0b2tlbicvPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9J2ludCcvPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y2hvaWNlPiIgKworICAgICAgICAgICAgIiAgICA8L3hzZDpncm91cD4iICsKKworICAgICAgICAgICAgIiAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9J1Jvb3RUeXBlJz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKworICAgICAgICAgICAgIiAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKKworICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0nc3RyaW5nJz4iICsKKyAgICAgICAgICAgICIgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOnN0cmluZycvPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCisgICAgICAgICAgICAiICAgIDwveHNkOmVsZW1lbnQ+IiArCisKKyAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J2ludCc+IiArCisgICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSdncm91cCcgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcvPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9J2lkJyB0eXBlPSd4c2Q6aW50Jy8+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKKworICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0ndG9rZW4nPiIgKworICAgICAgICAgICAgIiAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0nZ3JvdXAnIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSdpZCcgdHlwZT0neHNkOnRva2VuJy8+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKKworICAgICAgICAgICAgIjwveHNkOnNjaGVtYT4iLAorCisgICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgIiArCisgICAgICAgICAgICAiICAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nIHhtbG5zOnRoPSdodHRwOi8vd3d3LnRpbS1oYW5zb24uY29tLycgIiArCisgICAgICAgICAgICAiICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSdxdWFsaWZpZWQnIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz4iICsKKworICAgICAgICAgICAgIiAgICA8eHNkOmVsZW1lbnQgbmFtZT0ncm9vdCc+IiArCisgICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdmb28nIG1heE9jY3Vycz0ndW5ib3VuZGVkJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0naWQnIHR5cGU9J3hzZDppbnQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+IiArCisgICAgICAgICAgICAiICAgICAgICA8eHNkOmtleSBuYW1lPSdpZCc+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0nLi90aDpmb28nLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8eHNkOmZpZWxkIHhwYXRoPSdAdGg6aWQnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwveHNkOmtleT4iICsKKyAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKKyAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKKworICAgICAgICAgICAgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnID4iICsKKyAgICAgICAgICAgICIgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkdGVzdCc+IiArCisgICAgICAgICAgICAiICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2UgbWF4T2NjdXJzPSd1bmJvdW5kZWQnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8eHNkOmNob2ljZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSdpZCcgbWF4T2NjdXJzPSd1bmJvdW5kZWQnIHR5cGU9J3hzZDpJRCcvPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9J2lkcmVmJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgdHlwZT0neHNkOklEUkVGJy8+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0naWRyZWZzJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgdHlwZT0neHNkOklEUkVGUycvPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKKyAgICAgICAgICAgICIgICAgPC94c2Q6ZWxlbWVudD4iICsKKyAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+IiwKKworICAgICAgICB9OworCisgICAgICAgIFN0cmluZ1tdIHZhbGlkID0geworICAgICAgICAgICAgIjxvcmRlcj4iICsKKyAgICAgICAgICAgICIgICAgPGl0ZW1zPiIgKworICAgICAgICAgICAgIiAgICAgIDxpdGVtIG51bWJlcj0nMTI0ICc+IiArCisgICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKKyAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCisgICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPSc1NjMnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICA8cXVhbnRpdHk+MTwvcXVhbnRpdHk+IiArCisgICAgICAgICAgICAiICAgICAgPC9pdGVtPiIgKworICAgICAgICAgICAgIiAgICA8L2l0ZW1zPiIgKworICAgICAgICAgICAgIiAgICA8cHJvZHVjdHM+IiArCisgICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPiAxMjQ8L251bWJlcj4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5TaGlydDwvbmFtZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+MjkuOTk8L3ByaWNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKworICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj41NjM8L251bWJlcj4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5IYXQ8L25hbWU+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjY5Ljk5PC9wcmljZT4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKKyAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+NDQzPC9udW1iZXI+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPG5hbWU+VW1icmVsbGE8L25hbWU+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPHByaWNlIGN1cnJlbmN5PSdVU0QnPjQ5Ljk5PC9wcmljZT4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwvcHJvZHVjdD4iICsKKyAgICAgICAgICAgICIgICAgPC9wcm9kdWN0cz4iICsKKyAgICAgICAgICAgICI8L29yZGVyPiIsCisKKyAgICAgICAgICAgICI8cm9vdD4iICsKKyAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nZm9vMSc+IiArCisgICAgICAgICAgICAiICAgICAgICA8c3RyaW5nIGlkPSdmb28yJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb28zJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNic+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb283Jz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb284Jy8+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC9zdHJpbmc+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPC9zdHJpbmc+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPHN0cmluZyBpZD0nZm9vNCcvPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC9zdHJpbmc+IiArCisgICAgICAgICAgICAiICAgICAgICA8c3RyaW5nIGlkPSdmb285Jy8+IiArCisgICAgICAgICAgICAiICAgIDwvc3RyaW5nPiIgKworICAgICAgICAgICAgIjwvcm9vdD4iLAorCisgICAgICAgICAgICAiPHJvb3Q+IiArCisgICAgICAgICAgICAiICAgIDxpbnQgaWQ9JzEnLz4iICsKKyAgICAgICAgICAgICIgICAgPHN0cmluZyBpZD0nMScvPiIgKworICAgICAgICAgICAgIjwvcm9vdD4iLAorCisgICAgICAgICAgICAiPHh5ejpyb290IHhtbG5zOnh5ej0naHR0cDovL3d3dy50aW0taGFuc29uLmNvbS8nPiIgKworICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScxJy8+IiArCisgICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzInLz4iICsKKyAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMycvPiIgKworICAgICAgICAgICAgIjwveHl6OnJvb3Q+IiwKKworICAgICAgICAgICAgIjxpZHRlc3Q+IiArCisgICAgICAgICAgICAiICA8aWRyZWY+eHl6PC9pZHJlZj4iICsKKyAgICAgICAgICAgICIgIDxpZHJlZnM+YWJjIGRlZjwvaWRyZWZzPiIgKworICAgICAgICAgICAgIiAgPGlkPmFiYzwvaWQ+IiArCisgICAgICAgICAgICAiICA8aWQ+ZGVmPC9pZD4iICsKKyAgICAgICAgICAgICIgIDxpZD54eXo8L2lkPiIgKworICAgICAgICAgICAgIiAgPGlkcmVmPmFiYzwvaWRyZWY+IiArCisgICAgICAgICAgICAiICA8aWRyZWZzPnh5eiBhYmM8L2lkcmVmcz4iICsKKyAgICAgICAgICAgICI8L2lkdGVzdD4iLAorICAgICAgICB9OworCisgICAgICAgIFN0cmluZ1tdIGludmFsaWQgPSB7CisgICAgICAgICAgICAiPG9yZGVyPiIgKworICAgICAgICAgICAgIiAgICA8aXRlbXM+IiArCisgICAgICAgICAgICAiICAgICAgPGl0ZW0gbnVtYmVyPScxMjUgJz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgPHF1YW50aXR5PjE8L3F1YW50aXR5PiIgKworICAgICAgICAgICAgIiAgICAgIDwvaXRlbT4iICsKKyAgICAgICAgICAgICIgICAgICA8aXRlbSBudW1iZXI9JzU2Myc+IiArCisgICAgICAgICAgICAiICAgICAgICAgIDxxdWFudGl0eT4xPC9xdWFudGl0eT4iICsKKyAgICAgICAgICAgICIgICAgICA8L2l0ZW0+IiArCisgICAgICAgICAgICAiICAgIDwvaXRlbXM+IiArCisgICAgICAgICAgICAiICAgIDxwcm9kdWN0cz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDxwcm9kdWN0PiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxudW1iZXI+IDEyNDwvbnVtYmVyPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPlNoaXJ0PC9uYW1lPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxwcmljZSBjdXJyZW5jeT0nVVNEJz4yOS45OTwvcHJpY2U+IiArCisgICAgICAgICAgICAiICAgICAgICA8L3Byb2R1Y3Q+IiArCisgICAgICAgICAgICAiICAgICAgICA8cHJvZHVjdD4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8bnVtYmVyPjU2MzwvbnVtYmVyPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxuYW1lPkhhdDwvbmFtZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NjkuOTk8L3ByaWNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKworICAgICAgICAgICAgIiAgICAgICAgPHByb2R1Y3Q+IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgPG51bWJlcj40NDM8L251bWJlcj4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8bmFtZT5VbWJyZWxsYTwvbmFtZT4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8cHJpY2UgY3VycmVuY3k9J1VTRCc+NDkuOTk8L3ByaWNlPiIgKworICAgICAgICAgICAgIiAgICAgICAgPC9wcm9kdWN0PiIgKworICAgICAgICAgICAgIiAgICA8L3Byb2R1Y3RzPiIgKworICAgICAgICAgICAgIjwvb3JkZXI+IiwKKworICAgICAgICAgICAgIjxyb290PiIgKworICAgICAgICAgICAgIiAgICA8dG9rZW4gdG9rZW49JyAgYmxhaCAgYmxhaCcvPiIgKworICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPSdibGFoIGJsYWgnLz4iICsKKyAgICAgICAgICAgICI8L3Jvb3Q+IiwKKworICAgICAgICAgICAgIjxyb290PiIgKworICAgICAgICAgICAgIiAgICA8c3RyaW5nIGlkPSdmb28xJz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzInPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzMnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8c3RyaW5nIGlkPSdmb282Jz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzcnPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmcgaWQ9J2ZvbzMnLz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDwvc3RyaW5nPiIgKworICAgICAgICAgICAgIiAgICAgICAgICAgICAgICA8L3N0cmluZz4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgICA8L3N0cmluZz4iICsKKyAgICAgICAgICAgICIgICAgICAgIDwvc3RyaW5nPiIgKworICAgICAgICAgICAgIiAgICA8L3N0cmluZz4iICsKKyAgICAgICAgICAgICI8L3Jvb3Q+IiwKKworICAgICAgICAgICAgIjx4eXo6cm9vdCB4bWxuczp4eXo9J2h0dHA6Ly93d3cudGltLWhhbnNvbi5jb20vJz4iICsKKyAgICAgICAgICAgICIgIDx4eXo6Zm9vIHh5ejppZD0nMScvPiIgKworICAgICAgICAgICAgIiAgPHh5ejpmb28geHl6OmlkPScyJy8+IiArCisgICAgICAgICAgICAiICA8eHl6OmZvbyB4eXo6aWQ9JzInLz4iICsKKyAgICAgICAgICAgICI8L3h5ejpyb290PiIsCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nW10gaW52YWxpZE9uRG9jT25seSA9IG5ldyBTdHJpbmdbXQorICAgICAgICB7CisKKyAgICAgICAgICAgICI8aWR0ZXN0PiIgKworICAgICAgICAgICAgIiAgPGlkcmVmPmZvbzwvaWRyZWY+IiArCisgICAgICAgICAgICAiICA8aWQ+YWJjPC9pZD4iICsKKyAgICAgICAgICAgICIgIDxpZD5kZWY8L2lkPiIgKworICAgICAgICAgICAgIiAgPGlkPnh5ejwvaWQ+IiArCisgICAgICAgICAgICAiPC9pZHRlc3Q+IiwKKworICAgICAgICAgICAgIjxpZHRlc3Q+IiArCisgICAgICAgICAgICAiICA8aWRyZWZzPmFiYyBmb288L2lkcmVmcz4iICsKKyAgICAgICAgICAgICIgIDxpZD5hYmM8L2lkPiIgKworICAgICAgICAgICAgIiAgPGlkPmRlZjwvaWQ+IiArCisgICAgICAgICAgICAiICA8aWQ+eHl6PC9pZD4iICsKKyAgICAgICAgICAgICI8L2lkdGVzdD4iLAorICAgICAgICB9OworCisKKyAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkLCB0cnVlKTsKKyAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkLCBmYWxzZSk7CisKKyAgICAgICAgIC8vIElEUmVmcyBhcmUgdmFsaWRhdGVkIG9ubHkgaWYgc3RhcnRpbmcgYXQgdGhlIHZlcnkgcm9vdCBvZiB0aGUgd29ybGQKKyAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIG5ldyBTdHJpbmdbMF0sIGludmFsaWRPbkRvY09ubHksIHRydWUpOworICAgICAgICBkb1Rlc3Qoc2NoZW1hcywgbnVsbCwgaW52YWxpZE9uRG9jT25seSwgbmV3IFN0cmluZ1swXSwgZmFsc2UpOworICAgIH0KKworICAgIC8vIFRlc3QgdmFsaWRhdGlvbiBvZiBzZXR0aW5nIHdpdGggdGhlIFZhbGlkYXRlT25TZXQgb3B0aW9uCisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNjaGVtYSA9CisgICAgICAgICAgICAiPHhzOnNjaGVtYSB4bWxuczp4cz0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnPlxuIiArCisgICAgICAgICAgICAiICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdkZWMtcmVzdHJpY3Rpb24nPiIgKworICAgICAgICAgICAgIiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6ZGVjaW1hbCc+IiArCisgICAgICAgICAgICAiICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0nMTAwJy8+IiArCisgICAgICAgICAgICAiICAgIDwveHM6cmVzdHJpY3Rpb24+IiArCisgICAgICAgICAgICAiICA8L3hzOnNpbXBsZVR5cGU+IiArCisgICAgICAgICAgICAiPC94czpzY2hlbWE+IiArCisgICAgICAgICAgICAiIjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHNjaGVtYXMgPSB7IHNjaGVtYSB9OworICAgICAgICAKKyAgICAgICAgU2NoZW1hVHlwZUxvYWRlciBzdGwgPSBtYWtlU2NoZW1hVHlwZUxvYWRlciggc2NoZW1hcyApOworCisgICAgICAgIFhtbE9wdGlvbnMgdmFsaWRhdGUgPSBuZXcgWG1sT3B0aW9ucygpLnNldFZhbGlkYXRlT25TZXQoKTsKKyAgICAgICAgWG1sT3B0aW9ucyBub1ZhbGlkYXRlID0gbmV3IFhtbE9wdGlvbnMoKTsKKworICAgICAgICBTY2hlbWFUeXBlIHN0ID0gc3RsLmZpbmRUeXBlKG5ldyBRTmFtZSgiIiwgImRlYy1yZXN0cmljdGlvbiIpKTsKKworICAgICAgICBYbWxEZWNpbWFsIGRlYyA9IChYbWxEZWNpbWFsKXN0bC5uZXdJbnN0YW5jZShzdCwgdmFsaWRhdGUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWMuc2V0KCIyMDAiKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFhtbFZhbHVlT3V0T2ZSYW5nZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxWYWx1ZU91dE9mUmFuZ2VFeGNlcHRpb24gZSkge30KKworICAgICAgICBkZWMgPSAoWG1sRGVjaW1hbClzdGwubmV3SW5zdGFuY2Uoc3QsIG5vVmFsaWRhdGUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWMuc2V0KCIyMDAiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sVmFsdWVPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIEJ1Z3ppbGxhIGJ1ZyAjMjYxMDU6IHZhbGlkYXRlIGRlcml2ZWQgdHlwZSBmcm9tIGJhc2UgdHlwZSBlbnVtZXJhdGlvbgorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzY2hlbWFzW10gPSB7CisgICAgICAgICAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSc+XG4iICsKKworICAgICAgICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPSdlbnVtRGVmJyB0eXBlPSdlbnVtRGVmVHlwZScvPlxuIiArCisgICAgICAgICAgICAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPSdlbnVtRGVmVHlwZSc+XG4iICsKKyAgICAgICAgICAgICIgIDx4c2Q6c2ltcGxlQ29udGVudD5cbiIgKworICAgICAgICAgICAgIiAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSdlbnVtVHlwZScvPlxuIiArCisgICAgICAgICAgICAiICA8L3hzZDpzaW1wbGVDb250ZW50PlxuIiArCisgICAgICAgICAgICAiPC94c2Q6Y29tcGxleFR5cGU+XG4iICsKKworICAgICAgICAgICAgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPSdlbnVtVHlwZSc+XG4iICsKKyAgICAgICAgICAgICIgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0neHNkOnRva2VuJz5cbiIgKworICAgICAgICAgICAgIiAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSdlbnVtMScvPlxuIiArCisgICAgICAgICAgICAiICA8L3hzZDpyZXN0cmljdGlvbj5cbiIgKworICAgICAgICAgICAgIjwveHNkOnNpbXBsZVR5cGU+XG4iICsKKyAgICAgICAgICAgICI8L3hzZDpzY2hlbWE+XG4iLAorICAgICAgICB9OworCisgICAgICAgIFN0cmluZ1tdIHZhbGlkID0geworICAgICAgICAgICAgIjxlbnVtRGVmPmVudW0xPC9lbnVtRGVmPiIsCisgICAgICAgIH07CisKKyAgICAgICAgU3RyaW5nW10gaW52YWxpZCA9IHsKKyAgICAgICAgICAgICI8ZW51bURlZj5lbnVtMi9lbnVtRGVmPiIsCisgICAgICAgIH07CisKKyAgICAgICAgZG9UZXN0KHNjaGVtYXMsIG51bGwsIHZhbGlkLCBpbnZhbGlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2RydC9kcnRjYXNlcy9YbWxDb21wYXJhdG9yLmphdmEgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvWG1sQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmY4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9kcnQvZHJ0Y2FzZXMvWG1sQ29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBkcnRjYXNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb21tb24uUU5hbWVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLmNvbW1vbi5YbWxXaGl0ZXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworCisvKioKKyAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpIChjZXphci5hbmRyZWkgYXQgYmVhLmNvbSkKKyAqIERhdGU6IE9jdCAzMCwgMjAwMworICovCitwdWJsaWMgY2xhc3MgWG1sQ29tcGFyYXRvcgoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGlhZ25vc3RpYworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZChTdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1lc3NhZ2U9PW51bGwpCisgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHMpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZSE9bnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKG1lc3NhZ2U9PW51bGwgPyBudWxsIDogbWVzc2FnZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoRGlhZ25vc3RpYyBkaWFnLCBTdHJpbmcgcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBkaWFnIT1udWxsKQorICAgICAgICAgICAgICAgIGRpYWcuYWRkKHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdzQ29sbGFwc2VFcXVhbChTdHJpbmcgczEsIFN0cmluZyBzMikKKyAgICB7CisgICAgICAgIFN0cmluZyBzMWMgPSBYbWxXaGl0ZXNwYWNlLmNvbGxhcHNlKHMxKTsKKyAgICAgICAgU3RyaW5nIHMyYyA9IFhtbFdoaXRlc3BhY2UuY29sbGFwc2UoczIpOworICAgICAgICByZXR1cm4gKHMxYy5lcXVhbHMoczJjKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVOYW1lc0FuZEF0dHJpYnV0ZXMoWG1sQ3Vyc29yIGN1cjEsIFhtbEN1cnNvciBjdXIyLCBEaWFnbm9zdGljIGRpYWcpCisgICAgeworICAgICAgICBpZiAoIWN1cjEuZ2V0TmFtZSgpLmVxdWFscyhjdXIyLmdldE5hbWUoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpYWdub3N0aWMuYWRkKGRpYWcsICJFbGVtZW50IG5hbWVzICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY3VyMS5nZXROYW1lKCkpICsgIiBhbmQgIiArIFFOYW1lSGVscGVyLnByZXR0eShjdXIyLmdldE5hbWUoKSkgKyAiIGRvIG5vdCBtYXRjaCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBtb3JlID0gY3VyMS50b0ZpcnN0QXR0cmlidXRlKCk7CisgICAgICAgIGlmIChtb3JlKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKDsgbW9yZTsgbW9yZSA9IGN1cjEudG9OZXh0QXR0cmlidXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gY3VyMS5nZXRUZXh0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDIgPSBjdXIyLmdldEF0dHJpYnV0ZVRleHQoY3VyMS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0MiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpYy5hZGQoZGlhZywgIkF0dHJpYnV0ZSAiICsgUU5hbWVIZWxwZXIucHJldHR5KGN1cjEuZ2V0TmFtZSgpKSArICIgbm90IHByZXNlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghd3NDb2xsYXBzZUVxdWFsKHRleHQxLCB0ZXh0MikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiQXR0cmlidXRlIHZhbHVlcyBmb3IgIiArIFFOYW1lSGVscGVyLnByZXR0eShjdXIxLmdldE5hbWUoKSkgKyAiIGRvIG5vdCBtYXRjaCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyMS50b1BhcmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgbW9yZSA9IGN1cjIudG9GaXJzdEF0dHJpYnV0ZSgpOworICAgICAgICBpZiAobW9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICg7IG1vcmU7IG1vcmUgPSBjdXIyLnRvTmV4dEF0dHJpYnV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGN1cjEuZ2V0QXR0cmlidXRlVGV4dChjdXIyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRleHQxID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljLmFkZChkaWFnLCAiQXR0cmlidXRlICIgKyBRTmFtZUhlbHBlci5wcmV0dHkoY3VyMi5nZXROYW1lKCkpICsgIiBub3QgcHJlc2VudCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyMi50b1BhcmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEaWFnbm9zdGljIGxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKFN0cmluZyBhY3R1YWwsIFN0cmluZyBleHBlY3QpCisgICAgICAgIHRocm93cyBYbWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERpYWdub3N0aWMgZGlhZyA9IG5ldyBEaWFnbm9zdGljKCk7CisgICAgICAgIGxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKGFjdHVhbCwgZXhwZWN0LCBkaWFnKTsKKyAgICAgICAgcmV0dXJuIGRpYWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgYW4gdXRpbGl0eSB0byBjb21wYXJlIHRoZSB4bWwgaW5zaWRlIHRoZSB0d28gc3RyaW5ncworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGluc2lkZSB0aGUgdHdvIHN0cmluZ3MgaXMgbGVuaWVudGx5IHRoZSBzYW1lCisgICAgICogICBvdGhlcndpc2UgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbGVuaWVudGx5Q29tcGFyZVR3b1htbFN0cmluZ3MoU3RyaW5nIGFjdHVhbCwgU3RyaW5nIGV4cGVjdCwgRGlhZ25vc3RpYyBkaWFnKQorICAgICAgICB0aHJvd3MgWG1sRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxPYmplY3QgeG9iajEgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShhY3R1YWwpOworICAgICAgICBYbWxPYmplY3QgeG9iajIgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShleHBlY3QpOworCisgICAgICAgIFhtbEN1cnNvciBjdXIxID0geG9iajEubmV3Q3Vyc29yKCk7CisgICAgICAgIFhtbEN1cnNvciBjdXIyID0geG9iajIubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgY3VyMS50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgY3VyMi50b0ZpcnN0Q2hpbGQoKTsKKworICAgICAgICByZXR1cm4gbGVuaWVudGx5Q29tcGFyZVR3b1htbFN0cmluZ3MoY3VyMSwgIGN1cjIsIGRpYWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGFuIHV0aWxpdHkgdG8gY29tcGFyZSB0aGUgeG1sIGluc2lkZSB0aGUgdHdvIGN1cnNvcnMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHhtbCBpbnNpZGUgdGhlIHR3byBzdHJpbmdzIGlzIGxlbmllbnRseSB0aGUgc2FtZQorICAgICAqICAgb3RoZXJ3aXNlIGZhbHNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxlbmllbnRseUNvbXBhcmVUd29YbWxTdHJpbmdzKFhtbEN1cnNvciBjdXIxLCBYbWxDdXJzb3IgY3VyMiwgRGlhZ25vc3RpYyBkaWFnKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHRydWU7CisgICAgICAgIGludCBkZXB0aCA9IDA7CisgICAgICAgIHdoaWxlIChjdXIxLmN1cnJlbnRUb2tlblR5cGUoKSAhPSBYbWxDdXJzb3IuVG9rZW5UeXBlLlNUQVJURE9DKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNvbXBhcmVOYW1lc0FuZEF0dHJpYnV0ZXMoY3VyMSwgY3VyMiwgZGlhZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbjEgPSBjdXIxLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNDaGlsZHJlbjIgPSBjdXIyLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbjEgIT0gaGFzQ2hpbGRyZW4yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpYWdub3N0aWMuYWRkKGRpYWcsICJUb3BvbG9neSBkaWZmZXJzOiBvbmUgZG9jdW1lbnQgaGFzIGNoaWxkcmVuIHdoZXJlIHRoZSBvdGhlciBkb2VzIG5vdCAoIiArIFFOYW1lSGVscGVyLnByZXR0eShjdXIxLmdldE5hbWUoKSkgKyAiLCAiICsgUU5hbWVIZWxwZXIucHJldHR5KGN1cjIuZ2V0TmFtZSgpKSArICIpIik7IC8vIFRPRE86IHdoZXJlPworICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cjEudG9QYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4xID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbjIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIyLnRvUGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuMiA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGhhc0NoaWxkcmVuMSA9PSBmYWxzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXdzQ29sbGFwc2VFcXVhbChjdXIxLmdldFRleHRWYWx1ZSgpLCBjdXIyLmdldFRleHRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWMuYWRkKGRpYWcsICJWYWx1ZSAiICsgY3VyMS5nZXRUZXh0VmFsdWUoKSArICIgZGlmZmVycyBmcm9tIHZhbHVlICIgKyBjdXIyLmdldFRleHRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbjEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTaWJsaW5nMSA9IGN1cjEudG9OZXh0U2libGluZygpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzU2libGluZzIgPSBjdXIyLnRvTmV4dFNpYmxpbmcoKTsKKworICAgICAgICAgICAgICAgIGlmIChoYXNTaWJsaW5nMSAhPSBoYXNTaWJsaW5nMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWMuYWRkKGRpYWcsICJUb3BvbG9neSBkaWZmZXJzOiBvbmUgZG9jdW1lbnQgaGFzIHNpYmxpbmdzIHdoZXJlIHRoZSBvdGhlciBkb2VzIG5vdCIpOyAvLyBUT0RPOiB3aGVyZT8KKyAgICAgICAgICAgICAgICAgICAgaGFzU2libGluZzEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaGFzU2libGluZzIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGFzU2libGluZzEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY3VyMS50b1BhcmVudCgpOworICAgICAgICAgICAgICAgIGN1cjIudG9QYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBkZXB0aC0tOworCisgICAgICAgICAgICAgICAgaWYgKGN1cjEuY3VycmVudFRva2VuVHlwZSgpID09IFhtbEN1cnNvci5Ub2tlblR5cGUuU1RBUlRET0MgfHwgZGVwdGg8PTApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhtbCBiL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzA2NjEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8cHVyY2hhc2Utb3JkZXIgeG1sbnM9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgorCTxjdXN0b21lciBhZ2U9IjM0Ij4KKwkJPG5hbWU+R2xhZHlzIEtyYXZpdHo8L25hbWU+CisJCTxhZGRyZXNzPkFueXRvd24sIFBBPC9hZGRyZXNzPgorCTwvY3VzdG9tZXI+CisJPGRhdGU+MjAwMy0wMS0wN1QxNDoxNjowMC0wNTowMDwvZGF0ZT4KKwk8bGluZS1pdGVtPgorCQk8ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDE8L2Rlc2NyaXB0aW9uPgorCQk8cGVyLXVuaXQtb3VuY2VzPjU8L3Blci11bml0LW91bmNlcz4KKwkJPHByaWNlPjIxLjc5PC9wcmljZT4KKwkJPHF1YW50aXR5PjI8L3F1YW50aXR5PgorCTwvbGluZS1pdGVtPgorCTxsaW5lLWl0ZW0+CisJCTxkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMjwvZGVzY3JpcHRpb24+CisJCTxwZXItdW5pdC1vdW5jZXM+NTwvcGVyLXVuaXQtb3VuY2VzPgorCQk8cHJpY2U+MTkuODk8L3ByaWNlPgorCQk8cXVhbnRpdHk+MjwvcXVhbnRpdHk+CisJPC9saW5lLWl0ZW0+CisJPHNoaXBwZXI+CisJCTxuYW1lPlppcFNoaXA8L25hbWU+CisJCTxwZXItb3VuY2UtcmF0ZT4wLjc0PC9wZXItb3VuY2UtcmF0ZT4KKwk8L3NoaXBwZXI+Cis8L3B1cmNoYXNlLW9yZGVyPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2QgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU4MzczCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZWFzeXBvL2Vhc3lwby54c2QKQEAgLTAsMCArMSw1NyBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICB4bWxuczpwbz0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKKyAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2Vhc3lwbyIKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJwdXJjaGFzZS1vcmRlciI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0icG86Y3VzdG9tZXIiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibGluZS1pdGVtIiB0eXBlPSJwbzpsaW5lLWl0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hpcHBlciIgdHlwZT0icG86c2hpcHBlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21lciI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYWdlIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1vbyIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSIxMDAiLz4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBvbyIgdHlwZT0ieHM6aW50IiBmaXhlZD0iMjAwIi8+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImxpbmUtaXRlbSI+CisgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGVyLXVuaXQtb3VuY2VzIiB0eXBlPSJ4czpkZWNpbWFsIi8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludGVnZXIiLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICA8L3hzOmNvbXBsZXhUeXBlPgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaGlwcGVyIj4KKyAgICA8eHM6c2VxdWVuY2U+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9InBlci1vdW5jZS1yYXRlIiB0eXBlPSJ4czpkZWNpbWFsIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgPC94czpjb21wbGV4VHlwZT4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZyBiL3YxL3Rlc3Qvc3JjL2Vhc3lwby9lYXN5cG8ueHNkY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTAyMjAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9lYXN5cG8vZWFzeXBvLnhzZGNvbmZpZwpAQCAtMCwwICsxLDI5IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3hiZWFuL2NvbmZpZyIKKyAgICAgICAgICAgeG1sbnM6ZXA9Imh0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8iPgorCisgIDx4YjpuYW1lc3BhY2UgdXJpPSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeXBvIj4KKyAgICA8eGI6cGFja2FnZT5jb20uZWFzeXBvPC94YjpwYWNrYWdlPgorICA8L3hiOm5hbWVzcGFjZT4KKworICA8eGI6bmFtZXNwYWNlIHVyaXByZWZpeD0iaHR0cDovL29wZW51cmkiPgorICAgIDx4YjpwcmVmaXg+WG1sPC94YjpwcmVmaXg+CisgIDwveGI6bmFtZXNwYWNlPgorCisgIDx4YjpuYW1lc3BhY2UgdXJpcHJlZml4PSJodHRwOi8vb3BlbnVyaS5vcmcvZWFzeSI+CisgICAgPHhiOnN1ZmZpeD5CZWFuPC94YjpzdWZmaXg+CisgIDwveGI6bmFtZXNwYWNlPgorCis8L3hiOmNvbmZpZz4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2Vhc3lwb3VzZS9jb20vYmVhL3Rlc3QvTG9hZEFuZFVzZVBvLmphdmEgYi92MS90ZXN0L3NyYy9lYXN5cG91c2UvY29tL2JlYS90ZXN0L0xvYWRBbmRVc2VQby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZDExOGUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9lYXN5cG91c2UvY29tL2JlYS90ZXN0L0xvYWRBbmRVc2VQby5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5iZWEudGVzdDsKKworaW1wb3J0IHhtbC51dGlsLio7CitpbXBvcnQgb3JnLm9wZW51cmkuZWFzeXBvLio7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBMb2FkQW5kVXNlUG8KK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGZpbGUgIiArIGFyZ3NbaV0pOworICAgICAgICAgICAgc3VtbWFyaXplUG9Eb2N1bWVudChQdXJjaGFzZU9yZGVyRG9jdW1lbnQuRmFjdG9yeS5wYXJzZShuZXcgRmlsZShhcmdzW2ldKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1bW1hcml6ZVBvRG9jdW1lbnQoUHVyY2hhc2VPcmRlckRvY3VtZW50IGRvYykKKyAgICB7CisgICAgICAgIFB1cmNoYXNlT3JkZXIgb3JkZXIgPSBkb2MuZ2V0UHVyY2hhc2VPcmRlcigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1c3RvbWVyOiAiICsgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXROYW1lKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZHJlc3M6ICAiICsgb3JkZXIuZ2V0Q3VzdG9tZXIoKS5nZXRBZGRyZXNzKCkpOworICAgICAgICBMaW5lSXRlbVtdIGl0ZW0gPSBvcmRlci5nZXRMaW5lSXRlbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIGRlc2NyaXB0aW9uOiAiICsgaXRlbVtpXS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBQcmljZTogIiArIGl0ZW1baV0uZ2V0UHJpY2UoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgUXVhbnRpdHk6ICIgKyBpdGVtW2ldLmdldFF1YW50aXR5KCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIE91bmNlczogIiArIGl0ZW1baV0uZ2V0UGVyVW5pdE91bmNlcygpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQW1vdW50OiAiICsgaXRlbVtpXS5nZXRBbW91bnQoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgV2VpZ2h0OiAiICsgaXRlbVtpXS5nZXRMaW5lSXRlbU91bmNlcygpKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgaWYgKG9yZGVyLmlzU2V0U2hpcHBlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaXBwZXI6ICIgKyBvcmRlci5nZXRTaGlwcGVyKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBQZXItb3VuY2UgcmF0ZTogIiArIG9yZGVyLmdldFNoaXBwZXIoKS5nZXRQZXJPdW5jZVJhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgd2VpZ2h0IGluIG91bmNlczogIiArIG9yZGVyLmdldFRvdGFsT3VuY2VzKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNoaXBwaW5nIGFtb3VudDogIiArIG9yZGVyLmdldFNoaXBwaW5nQW1vdW50KCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGFtb3VudDogIiArIG9yZGVyLmdldFRvdGFsQW1vdW50KCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lbnVtdGVzdC9lbnVtdGVzdC54c2QgYi92MS90ZXN0L3NyYy9lbnVtdGVzdC9lbnVtdGVzdC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNjU0NQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2VudW10ZXN0L2VudW10ZXN0LnhzZApAQCAtMCwwICsxLDgwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOmV0PSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bXRlc3QiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9lbnVtdGVzdCIKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJxdWFudGl0eSI+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiLz4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibW9zdCIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb21lIi8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZldyIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFsbE9yTm9uZSI+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9ImV0OnF1YW50aXR5Ij4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJldDpxdWFudGl0eSI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJldDphbGxPck5vbmUiLz4KKyAgICAgIDwveHM6ZXh0ZW5zaW9uPgorICAgIDwveHM6c2ltcGxlQ29udGVudD4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJzdGF0dXNyZXBvcnQiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhdHVzIiB0eXBlPSJldDpkYXRhIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJzYWxlc3JlcG9ydCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ1bml0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgorICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9uZSIvPgorICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InR3byIvPgorICAgICAgICAgICAgICA8IS0tIHNraXAgYSBmZXcgLS0+CisgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibmluZXR5LW5pbmUiLz4KKyAgICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbmUtaHVuZHJlZCIvPgorICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDwhLS0gYnVnIENSMTI4OTA2OiBnZW4nZCBqYXZhIGNvZGUgbXVzdCBxdWFsaWZ5IGphdmEubGFuZy4qIHR5cGVzIC0tPgorICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJvYmplY3QiPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFiYyIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWYiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkY29uZmlnIGIvdjEvdGVzdC9zcmMvZW51bXRlc3QvZW51bXRlc3QueHNkY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwZGU4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9lbnVtdGVzdC9lbnVtdGVzdC54c2Rjb25maWcKQEAgLTAsMCArMSw3IEBACis8eGI6Y29uZmlnIHhtbG5zOnhiPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94YmVhbi9jb25maWciPgorCisgIDx4YjpuYW1lc3BhY2UgdXJpcHJlZml4PSJodHRwOi8vb3BlbnVyaS5vcmcvZW51bSI+CisgICAgPHhiOnBhY2thZ2U+Y29tLmVudW10ZXN0PC94YjpwYWNrYWdlPgorICA8L3hiOm5hbWVzcGFjZT4KKworPC94Yjpjb25maWc+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9lcmljc2NoZW1hL2VyaWNzY2hlbWEueHNkIGIvdjEvdGVzdC9zcmMvZXJpY3NjaGVtYS9lcmljc2NoZW1hLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBlNjYzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXJpY3NjaGVtYS9lcmljc2NoZW1hLnhzZApAQCAtMCwwICsxLDIxIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisJPHhzOmVsZW1lbnQgbmFtZT0iYXNkYXNkIj4KKwkJPHhzOmNvbXBsZXhUeXBlPgorCQkJPHhzOnNlcXVlbmNlPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2VyaWN0ZXN0L0VyaWNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9lcmljdGVzdC9FcmljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDc4YTcKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9lcmljdGVzdC9FcmljVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5Db2RlR2VuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwudG9vbC5TY2hlbWFDb21waWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlNjaGVtYVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yLlRva2VuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvci5YbWxCb29rbWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLkdEYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbERhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxEb2N1bWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEludGVnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxMaW5lTnVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzMueDIwMDEueG1sU2NoZW1hLio7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwueG1sYmVhbnMueDIwMDQueDAyLnhiZWFuLmNvbmZpZy5Db25maWdEb2N1bWVudDsKKworcHVibGljIGNsYXNzIEVyaWNUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSGFzaE1hcCBuc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgbnNlcy5wdXQoICJ4IiwgInguY29tIiApOworICAgICAgICBuc2VzLnB1dCggInkiLCAieS5jb20iICk7CisgICAgICAgIFhtbE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBYbWxPcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMuc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzKCBuc2VzICk7CisgICAgICAgIAorICAgICAgICBYbWxPYmplY3QgeCA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKCAiPGE+PC9hPiIsIG9wdGlvbnMgKTsKKyAgICAgICAgeC5zYXZlKCBTeXN0ZW0ub3V0ICk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlL2V4aXN0aW5nL0Zvb0hhbmRsZXIuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvYXZlcmFnZUNhc2UvZXhpc3RpbmcvRm9vSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmY4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlL2V4aXN0aW5nL0Zvb0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYXZlcmFnZUNhc2UuZXhpc3Rpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4uYXZlcmFnZUNhc2UucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyRG9jdW1lbnQgOworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4uYXZlcmFnZUNhc2UucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyVHlwZTsKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLmF2ZXJhZ2VDYXNlLnB1cmNoYXNlT3JkZXIuSXRlbXMuSXRlbTsKKworcHVibGljIGNsYXNzIEZvb0hhbmRsZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUb3RhbChYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2M9IChQdXJjaGFzZU9yZGVyRG9jdW1lbnQpeG87CisJICAgIGludCBzdW09MDsKKwkgICAgSXRlbVtdIGl0ZW1zPXBvRG9jLmdldFB1cmNoYXNlT3JkZXIoKS5nZXRJdGVtcygpLmdldEl0ZW1BcnJheSgpOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykKKwkJICAgIHN1bSs9aXRlbXNbaV0uZ2V0VVNQcmljZSgpLmludFZhbHVlKCk7CisJICAgIHJldHVybiBzdW07CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvYXZlcmFnZUNhc2UvZXhpc3RpbmcvSUZvby5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9leGlzdGluZy9JRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNmE1YQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvYXZlcmFnZUNhc2UvZXhpc3RpbmcvSUZvby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhdmVyYWdlQ2FzZS5leGlzdGluZzsKKworcHVibGljIGludGVyZmFjZSBJRm9vCit7CisgICAgaW50IGdldFRvdGFsKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9wby54c2QgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlL3BvLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE1OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9wby54c2QKQEAgLTAsMCArMSw2MCBAQAorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKK3htbG5zOnBvPSJodHRwOi8veGJlYW4uaW50ZXJmYWNlX2ZlYXR1cmUvYXZlcmFnZUNhc2UvUHVyY2hhc2VPcmRlciIKK3RhcmdldE5hbWVzcGFjZT0iaHR0cDovL3hiZWFuLmludGVyZmFjZV9mZWF0dXJlL2F2ZXJhZ2VDYXNlL1B1cmNoYXNlT3JkZXIiCitlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCQk8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KKyAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4KKyAgICAgICAgICAgQ29weXJpZ2h0IDIwMDAgRXhhbXBsZS5jb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icHVyY2hhc2VPcmRlciIgdHlwZT0icG86UHVyY2hhc2VPcmRlclR5cGUiLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHVyY2hhc2VPcmRlclR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYmlsbFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InBvOmNvbW1lbnQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Iml0ZW1zIiB0eXBlPSJwbzpJdGVtcyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVVNBZGRyZXNzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9ImNpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InppcCIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvdW50cnkiIHR5cGU9InhzZDpOTVRPS0VOIiBmaXhlZD0iVVMiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiPgorCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KKwkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KKwkJCQkJCQkJCTx4c2Q6bWF4RXhjbHVzaXZlIHZhbHVlPSIxMDAiLz4KKwkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+CisJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KKwkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVVNQcmljZSIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KKwkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9InBvOmNvbW1lbnQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InNoaXBEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJ0TnVtIiB0eXBlPSJwbzpTS1UiIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTwhLS0gU3RvY2sgS2VlcGluZyBVbml0LCBhIGNvZGUgZm9yIGlkZW50aWZ5aW5nIHByb2R1Y3RzIC0tPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTS1UiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfS1bQS1aXXsyfSIvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9wby54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2F2ZXJhZ2VDYXNlL3BvLnhzZGNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Q4YzRhCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9hdmVyYWdlQ2FzZS9wby54c2Rjb25maWcKQEAgLTAsMCArMSwyMiBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eGI6Y29uZmlnIHhtbG5zOnhiPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94YmVhbi9jb25maWciPgorCisJPHhiOmV4dGVuc2lvbiBmb3I9ImludGVyZmFjZUZlYXR1cmUueGJlYW4uYXZlcmFnZUNhc2UucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyRG9jdW1lbnQiPgorICAgICAgICA8eGI6aW50ZXJmYWNlIG5hbWU9ImF2ZXJhZ2VDYXNlLmV4aXN0aW5nLklGb28iPgorICAgICAgICAgICAgPHhiOnN0YXRpY0hhbmRsZXI+YXZlcmFnZUNhc2UuZXhpc3RpbmcuRm9vSGFuZGxlcjwveGI6c3RhdGljSGFuZGxlcj4KKyAgICAgICAgPC94YjppbnRlcmZhY2U+CisgICAgPC94YjpleHRlbnNpb24+CisKKzwveGI6Y29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9leGlzdGluZy9Gb29IYW5kbGVyLmphdmEgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2ZpeGVkQXR0ckJlYW4vZXhpc3RpbmcvRm9vSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2ZpeGVkQXR0ckJlYW4vZXhpc3RpbmcvRm9vSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBmaXhlZEF0dHJCZWFuLmV4aXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLmZpeGVkQXR0ckJlYW4ucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyRG9jdW1lbnQ7CitpbXBvcnQgaW50ZXJmYWNlRmVhdHVyZS54YmVhbi5maXhlZEF0dHJCZWFuLnB1cmNoYXNlT3JkZXIuSXRlbXMuSXRlbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworcHVibGljIGNsYXNzIEZvb0hhbmRsZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJpY2UoWG1sT2JqZWN0IHhvLCBpbnQgcHJpY2UpCisgICAgeworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPSAoUHVyY2hhc2VPcmRlckRvY3VtZW50KSB4bzsKKyAgICAgICAgSXRlbVtdIGl0ZW1zID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldEl0ZW1zKCkuZ2V0SXRlbUFycmF5KCk7CisKKyAgICAgICAgQmlnRGVjaW1hbCBvPW5ldyBCaWdEZWNpbWFsKHByaWNlKyIiKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykKKwkJICAgICAgICBpdGVtc1tpXS5zZXRVU1ByaWNlKG8pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIH0KKyAgICB9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJpY2UoWG1sT2JqZWN0IHhvKQorICAgIHsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9maXhlZEF0dHJCZWFuL2V4aXN0aW5nL0lGb28uamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9leGlzdGluZy9JRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMzlkNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9leGlzdGluZy9JRm9vLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGZpeGVkQXR0ckJlYW4uZXhpc3Rpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUZvbworeworICAgIHZvaWQgc2V0UHJpY2UoaW50IHByaWNlKTsKKyAgICB2b2lkIGdldFByaWNlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9maXhlZEF0dHJCZWFuL3BvLnhzZCBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9wby54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3MGE5YwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9wby54c2QKQEAgLTAsMCArMSw2MCBAQAorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKK3htbG5zOnBvPSJodHRwOi8veGJlYW4uaW50ZXJmYWNlX2ZlYXR1cmUvZml4ZWRBdHRyQmVhbi9QdXJjaGFzZU9yZGVyIgordGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veGJlYW4uaW50ZXJmYWNlX2ZlYXR1cmUvZml4ZWRBdHRyQmVhbi9QdXJjaGFzZU9yZGVyIgorZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+CisgICAgICAgICAgIFB1cmNoYXNlIG9yZGVyIHNjaGVtYSBmb3IgRXhhbXBsZS5jb20uCisgICAgICAgICAgIENvcHlyaWdodCAyMDAwIEV4YW1wbGUuY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisJPHhzZDplbGVtZW50IG5hbWU9InB1cmNoYXNlT3JkZXIiIHR5cGU9InBvOlB1cmNoYXNlT3JkZXJUeXBlIi8+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cmNoYXNlT3JkZXJUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwVG8iIHR5cGU9InBvOlVTQWRkcmVzcyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9ImJpbGxUbyIgdHlwZT0icG86VVNBZGRyZXNzIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJwbzpjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtcyIgdHlwZT0icG86SXRlbXMiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyRGF0ZSIgdHlwZT0ieHNkOmRhdGUiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVTQWRkcmVzcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ6aXAiIHR5cGU9InhzZDpkZWNpbWFsIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3VudHJ5IiB0eXBlPSJ4c2Q6Tk1UT0tFTiIgZml4ZWQ9IlVTIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1YW50aXR5Ij4KKwkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+CisJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciI+CisJCQkJCQkJCQk8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwIi8+CisJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgorCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+CisJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVTUHJpY2UiIHR5cGU9InhzZDpkZWNpbWFsIiBmaXhlZD0iMzAiIC8+CisJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJwbzpjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwRGF0ZSIgdHlwZT0ieHNkOmRhdGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydE51bSIgdHlwZT0icG86U0tVIiB1c2U9InJlcXVpcmVkIi8+CisJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQk8L3hzZDplbGVtZW50PgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8IS0tIFN0b2NrIEtlZXBpbmcgVW5pdCwgYSBjb2RlIGZvciBpZGVudGlmeWluZyBwcm9kdWN0cyAtLT4KKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU0tVIj4KKwkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKwkJCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30tW0EtWl17Mn0iLz4KKwkJPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvZml4ZWRBdHRyQmVhbi9wby54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2ZpeGVkQXR0ckJlYW4vcG8ueHNkY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTljMGIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL2ZpeGVkQXR0ckJlYW4vcG8ueHNkY29uZmlnCkBAIC0wLDAgKzEsMjIgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhiOmNvbmZpZyB4bWxuczp4Yj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIj4KKworICAgIDx4YjpleHRlbnNpb24gZm9yPSJpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLmZpeGVkQXR0ckJlYW4ucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyRG9jdW1lbnQiPgorICAgICAgICA8eGI6aW50ZXJmYWNlIG5hbWU9ImZpeGVkQXR0ckJlYW4uZXhpc3RpbmcuSUZvbyI+CisgICAgICAgICAgICA8eGI6c3RhdGljSGFuZGxlcj5maXhlZEF0dHJCZWFuLmV4aXN0aW5nLkZvb0hhbmRsZXI8L3hiOnN0YXRpY0hhbmRsZXI+CisgICAgICAgIDwveGI6aW50ZXJmYWNlPgorICAgIDwveGI6ZXh0ZW5zaW9uPgorCis8L3hiOmNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL211bHRJbnRlcmZhY2VzL2V4aXN0aW5nL0lSZXBvcnQuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvZXhpc3RpbmcvSVJlcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NmEzMzgKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL211bHRJbnRlcmZhY2VzL2V4aXN0aW5nL0lSZXBvcnQuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgbXVsdEludGVyZmFjZXMuZXhpc3Rpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworcHVibGljIGludGVyZmFjZSBJUmVwb3J0IGV4dGVuZHMgSVN1bQoreworICAgIGludCBnZXRNaW5QcmljZSgpOworCisgICAgWG1sT2JqZWN0IGdldENoZWFwZXN0SXRlbSgpOworCisgICAgdm9pZCBzZXRNaW5QcmljZShkb3VibGUgcHJpY2UpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvZXhpc3RpbmcvSVN1bS5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9leGlzdGluZy9JU3VtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YjdkZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvZXhpc3RpbmcvSVN1bS5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBtdWx0SW50ZXJmYWNlcy5leGlzdGluZzsKKworcHVibGljIGludGVyZmFjZSBJU3VtCit7CisgICAgaW50IGdldFRvdGFsKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9leGlzdGluZy9SZXBvcnRIYW5kbGVyLmphdmEgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL211bHRJbnRlcmZhY2VzL2V4aXN0aW5nL1JlcG9ydEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI4NTBmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9leGlzdGluZy9SZXBvcnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG11bHRJbnRlcmZhY2VzLmV4aXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLm11bHRJbnRlcmZhY2VzLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50OworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4ubXVsdEludGVyZmFjZXMucHVyY2hhc2VPcmRlci5JdGVtcy5JdGVtOworCisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworcHVibGljIGNsYXNzIFJlcG9ydEhhbmRsZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUb3RhbChYbWxPYmplY3QgeG8pCisgICAgeworCisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPSAoUHVyY2hhc2VPcmRlckRvY3VtZW50KSB4bzsKKyAgICAgICAgSXRlbVtdIGl0ZW1zID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldEl0ZW1zKCkuZ2V0SXRlbUFycmF5KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHN1bSArPSBpdGVtc1tpXS5nZXRVU1ByaWNlKCkuaW50VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRNaW5QcmljZShYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPSAoUHVyY2hhc2VPcmRlckRvY3VtZW50KSB4bzsKKyAgICAgICAgSXRlbVtdIGl0ZW1zID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldEl0ZW1zKCkuZ2V0SXRlbUFycmF5KCk7CisKKyAgICAgICAgaW50IG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdG1wID0gaXRlbXNbaV0uZ2V0VVNQcmljZSgpLmludFZhbHVlKCk7CisKKyAgICAgICAgICAgIG1pbiA9IG1pbiA+IHRtcCA/IHRtcCA6IG1pbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWluOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWG1sT2JqZWN0IGdldENoZWFwZXN0SXRlbShYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPSAoUHVyY2hhc2VPcmRlckRvY3VtZW50KSB4bzsKKyAgICAgICAgSXRlbVtdIGl0ZW1zID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldEl0ZW1zKCkuZ2V0SXRlbUFycmF5KCk7CisKKyAgICAgICAgaW50IG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBYbWxPYmplY3QgaXRlbSA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRtcCA9IGl0ZW1zW2ldLmdldFVTUHJpY2UoKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKG1pbiA+IHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtaW4gPSB0bXA7CisgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1zW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNaW5QcmljZShYbWxPYmplY3QgeG8sIGRvdWJsZSBtaW5fcHJpY2UpCisgICAgeworICAgICAgICBQdXJjaGFzZU9yZGVyRG9jdW1lbnQgcG9Eb2MgPSAoUHVyY2hhc2VPcmRlckRvY3VtZW50KSB4bzsKKyAgICAgICAgSXRlbVtdIGl0ZW1zID0gcG9Eb2MuZ2V0UHVyY2hhc2VPcmRlcigpLmdldEl0ZW1zKCkuZ2V0SXRlbUFycmF5KCk7CisKKyAgICAgICAgQmlnRGVjaW1hbCBuZXdQcmljZSA9IG5ldyBCaWdEZWNpbWFsKG1pbl9wcmljZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworCisgICAgICAgICAgICBpbnQgdG1wID0gaXRlbXNbaV0uZ2V0VVNQcmljZSgpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAobWluX3ByaWNlID4gdG1wKQorICAgICAgICAgICAgICAgIGl0ZW1zW2ldLnNldFVTUHJpY2UobmV3UHJpY2UpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvcG8ueHNkIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9wby54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1N2RkMQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvcG8ueHNkCkBAIC0wLDAgKzEsNjAgQEAKKzx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCit4bWxuczpwbz0iaHR0cDovL3hiZWFuLmludGVyZmFjZV9mZWF0dXJlL211bHRJbnRlcmZhY2VzL1B1cmNoYXNlT3JkZXIiCit0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94YmVhbi5pbnRlcmZhY2VfZmVhdHVyZS9tdWx0SW50ZXJmYWNlcy9QdXJjaGFzZU9yZGVyIgorZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpkb2N1bWVudGF0aW9uIHhtbDpsYW5nPSJlbiI+CisgICAgICAgICAgIFB1cmNoYXNlIG9yZGVyIHNjaGVtYSBmb3IgRXhhbXBsZS5jb20uCisgICAgICAgICAgIENvcHlyaWdodCAyMDAwIEV4YW1wbGUuY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisJPHhzZDplbGVtZW50IG5hbWU9InB1cmNoYXNlT3JkZXIiIHR5cGU9InBvOlB1cmNoYXNlT3JkZXJUeXBlIi8+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cmNoYXNlT3JkZXJUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwVG8iIHR5cGU9InBvOlVTQWRkcmVzcyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9ImJpbGxUbyIgdHlwZT0icG86VVNBZGRyZXNzIi8+CisJCQk8eHNkOmVsZW1lbnQgcmVmPSJwbzpjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtcyIgdHlwZT0icG86SXRlbXMiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyRGF0ZSIgdHlwZT0ieHNkOmRhdGUiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlVTQWRkcmVzcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ6aXAiIHR5cGU9InhzZDpkZWNpbWFsIi8+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3VudHJ5IiB0eXBlPSJ4c2Q6Tk1UT0tFTiIgZml4ZWQ9IlVTIi8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1YW50aXR5Ij4KKwkJCQkJCQk8eHNkOnNpbXBsZVR5cGU+CisJCQkJCQkJCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciI+CisJCQkJCQkJCQk8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwIi8+CisJCQkJCQkJCTwveHNkOnJlc3RyaWN0aW9uPgorCQkJCQkJCTwveHNkOnNpbXBsZVR5cGU+CisJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVTUHJpY2UiIHR5cGU9InhzZDpkZWNpbWFsIiBmaXhlZD0iMzAiIC8+CisJCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJwbzpjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwRGF0ZSIgdHlwZT0ieHNkOmRhdGUiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydE51bSIgdHlwZT0icG86U0tVIiB1c2U9InJlcXVpcmVkIi8+CisJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQk8L3hzZDplbGVtZW50PgorCQk8L3hzZDpzZXF1ZW5jZT4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8IS0tIFN0b2NrIEtlZXBpbmcgVW5pdCwgYSBjb2RlIGZvciBpZGVudGlmeWluZyBwcm9kdWN0cyAtLT4KKwk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU0tVIj4KKwkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KKwkJCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30tW0EtWl17Mn0iLz4KKwkJPC94c2Q6cmVzdHJpY3Rpb24+CisJPC94c2Q6c2ltcGxlVHlwZT4KKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvcG8ueHNkY29uZmlnIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9tdWx0SW50ZXJmYWNlcy9wby54c2Rjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ZjkxZQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXVsdEludGVyZmFjZXMvcG8ueHNkY29uZmlnCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhiOmNvbmZpZyB4bWxuczp4Yj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIj4KKworICAgIDwhLS0gZm9yPSJpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLm11bHRJbnRlcmZhY2VzLlB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50Ii0tPgorICAgIDx4YjpleHRlbnNpb24gZm9yPSJpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLm11bHRJbnRlcmZhY2VzLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50Ij4KKyAgICAgICAgPHhiOmludGVyZmFjZSBuYW1lPSJtdWx0SW50ZXJmYWNlcy5leGlzdGluZy5JUmVwb3J0Ij4KKyAgICAgICAgICAgIDx4YjpzdGF0aWNIYW5kbGVyPm11bHRJbnRlcmZhY2VzLmV4aXN0aW5nLlJlcG9ydEhhbmRsZXI8L3hiOnN0YXRpY0hhbmRsZXI+CisgICAgICAgIDwveGI6aW50ZXJmYWNlPgorCisgICAgPC94YjpleHRlbnNpb24+CisKKzwveGI6Y29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlL0Jhci5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvQmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmZmZiOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlL0Jhci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBteVBhY2thZ2U7CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKCBjZXphci5hbmRyZWkgYXQgYmVhLmNvbSApCisgKiBEYXRlOiBBcHIgMjUsIDIwMDQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEJhcgoreworICAgIGJ5dGVbXSBiYXIoU3RyaW5nIHMpIHRocm93cyBNeUV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvQmFySGFuZGxlci5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvQmFySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOGJiZDAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL215UGFja2FnZS9CYXJIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG15UGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworCisvKioKKyAqIEF1dGhvcjogQ2V6YXIgQW5kcmVpICggY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20gKQorICogRGF0ZTogQXByIDI1LCAyMDA0CisgKi8KKworcHVibGljIGNsYXNzIEJhckhhbmRsZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBiYXIoWG1sT2JqZWN0IHhvLCBTdHJpbmcgcykgdGhyb3dzIEJhci5NeUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIG1zZyA9ICJ7aW4gQmFySGFuZGxlci5oYW5kbGVCYXIoczogIiArIHMgKyAiKX0iOworICAgICAgICAKKyAgICAgICAgaWYgKHM9PW51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQmFyLk15RXhjZXB0aW9uKCk7CisKKyAgICAgICAgcmV0dXJuIG1zZy5nZXRCeXRlcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlL0Zvby5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvRm9vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwY2NkOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlL0Zvby5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBteVBhY2thZ2U7CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKCBjZXphci5hbmRyZWkgYXQgYmVhLmNvbSApCisgKiBEYXRlOiBBcHIgMjUsIDIwMDQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEZvbworeworICAgIFN0cmluZyBmb28oU3RyaW5nIHMpOworICAgIFN0cmluZyBnZXROYW1lKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvRm9vSGFuZGxlci5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvRm9vSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjcxZWIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL215UGFja2FnZS9Gb29IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG15UGFja2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoIGNlemFyLmFuZHJlaSBhdCBiZWEuY29tICkKKyAqIERhdGU6IEFwciAyNSwgMjAwNAorICovCisKK3B1YmxpYyBjbGFzcyBGb29IYW5kbGVyCit7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9vKFhtbE9iamVjdCB4bywgU3RyaW5nIHMpCisgICAgeworICAgICAgICByZXR1cm4gIntpbiBGb29IYW5kbGVyLmhhbmRsZUZvbyhzOiAiICsgcyArICIpfSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShYbWxPYmplY3QgeG8pCisgICAgeworICAgICAgICByZXR1cm4gIntuYW1lIGluIEZvb0hhbmRsZXJ9IjsKKyAgICB9CisKKyAgICAvLyBmb3IgdGVzdGluZyBwcmUgYW5kIHBvc3QgY2FsbHMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZUJvb2ttYXJrIGV4dGVuZHMgWG1sQ3Vyc29yLlhtbEJvb2ttYXJrCisgICAgeworICAgICAgICBTdHJpbmcgX21zZzsKKworICAgICAgICBQcmVCb29rbWFyayhTdHJpbmcgbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBfbXNnID0gbXNnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNc2coKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX21zZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdEJvb2ttYXJrIGV4dGVuZHMgWG1sQ3Vyc29yLlhtbEJvb2ttYXJrCisgICAgeworICAgICAgICBTdHJpbmcgX21zZzsKKworICAgICAgICBQb3N0Qm9va21hcmsoU3RyaW5nIG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgX21zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXNnKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9tc2c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlU2V0KGludCBvcFR5cGUsIFhtbE9iamVjdCB4bywgUU5hbWUgcHJvcCwgYm9vbGVhbiBpc0F0dHIsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciB4YyA9IHhvLm5ld0N1cnNvcigpOworICAgICAgICB4Yy5zZXRCb29rbWFyayhuZXcgUHJlQm9va21hcmsoIntwcmVTZXQgaW4gRm9vSGFuZGxlcjogIiArIG9wVHlwZSArICIsICIgKyB4byArICIsICIgKyBwcm9wICsgIiwgIiArIGlzQXR0ciArICIsICIgKyBpbmRleCArICJ9IikpOworICAgICAgICB4Yy5kaXNwb3NlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3N0U2V0KGludCBvcFR5cGUsIFhtbE9iamVjdCB4bywgUU5hbWUgcHJvcCwgYm9vbGVhbiBpc0F0dHIsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciB4YyA9IHhvLm5ld0N1cnNvcigpOworICAgICAgICB4Yy5zZXRCb29rbWFyayhuZXcgUG9zdEJvb2ttYXJrKCJ7cG9zdFNldCBpbiBGb29IYW5kbGVyOiAiICsgb3BUeXBlICsgIiwgIiArIHhvICsgIiwgIiArIHByb3AgKyAiLCAiICsgaXNBdHRyICsgIiwgIiArIGluZGV4ICsgIn0iKSk7CisgICAgICAgIHhjLmRpc3Bvc2UoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvY29tcGFueS54c2QgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL215UGFja2FnZS9jb21wYW55LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFhYmMyCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9teVBhY2thZ2UvY29tcGFueS54c2QKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9ImNvbXBhbnkueHNkIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpjb21wYW55PSJjb21wYW55LnhzZCI+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbXBhbnkiIHR5cGU9ImNvbXBhbnk6Q29tcGFueVR5cGUiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBhbnlUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBhcnRtZW50cyIgdHlwZT0iY29tcGFueTpEZXBhcnRtZW50VHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29uc3VsdGFudE9mVGhlTW9udGgiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBhcnRtZW50IiB0eXBlPSJjb21wYW55OkRlcGFydG1lbnRUeXBlIi8+CisJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXBhcnRtZW50VHlwZSI+CisJCTx4c2Q6c2VxdWVuY2U+CisJCTwveHNkOnNlcXVlbmNlPgorCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlcHRJRCIgdHlwZT0ieHNkOmludCIvPgorCQk8eHNkOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJPC94c2Q6Y29tcGxleFR5cGU+Cis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL215UGFja2FnZS9jb21wYW55LnhzZGNvbmZpZyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvbXlQYWNrYWdlL2NvbXBhbnkueHNkY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDIyODkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL215UGFja2FnZS9jb21wYW55LnhzZGNvbmZpZwpAQCAtMCwwICsxLDMxIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3hiZWFuL2NvbmZpZyI+CisKKyAgICA8eGI6ZXh0ZW5zaW9uIGZvcj0iKiI+CisgICAgICAgIDx4YjppbnRlcmZhY2UgbmFtZT0ibXlQYWNrYWdlLkZvbyI+CisgICAgICAgICAgICA8eGI6c3RhdGljSGFuZGxlcj5teVBhY2thZ2UuRm9vSGFuZGxlcjwveGI6c3RhdGljSGFuZGxlcj4KKyAgICAgICAgPC94YjppbnRlcmZhY2U+CisgICAgICAgIDx4YjpwcmVQb3N0U2V0PgorICAgICAgICAgICAgPHhiOnN0YXRpY0hhbmRsZXI+bXlQYWNrYWdlLkZvb0hhbmRsZXI8L3hiOnN0YXRpY0hhbmRsZXI+CisgICAgICAgIDwveGI6cHJlUG9zdFNldD4KKyAgICA8L3hiOmV4dGVuc2lvbj4KKworICAgIDx4YjpleHRlbnNpb24gZm9yPSJ4c2QuY29tcGFueS5Db21wYW55RG9jdW1lbnQiPgorICAgICAgICA8eGI6aW50ZXJmYWNlIG5hbWU9Im15UGFja2FnZS5CYXIiPgorICAgICAgICAgICAgPHhiOnN0YXRpY0hhbmRsZXI+bXlQYWNrYWdlLkJhckhhbmRsZXI8L3hiOnN0YXRpY0hhbmRsZXI+CisgICAgICAgIDwveGI6aW50ZXJmYWNlPgorICAgIDwveGI6ZXh0ZW5zaW9uPgorCis8L3hiOmNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueS54c2QgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlNTYwOAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbi9jb21wYW55LnhzZApAQCAtMCwwICsxLDUxIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzwhLS10aGlzIGlzIHNjaGVtYSBjb21wYW55LnhzZCBzdHJpcHBlZCBkb3duIGFuZCBtb2RpZmllZCB0byBoYXZlIGEgdmFsdWUgcmVzdHJpY3Rpb24gb24gdGhlIGVtcGxveWVlcyBhZ2UtLT4KKworPHhzZDpzY2hlbWEgCit0YXJnZXROYW1lc3BhY2U9InByZVBvc3RGZWF0dXJlL3hiZWFuL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueSIgCit4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKK3htbG5zOmNvbXBhbnk9InByZVBvc3RGZWF0dXJlL3hiZWFuL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueSI+CisJPHhzZDplbGVtZW50IG5hbWU9ImNvbXBhbnkiIHR5cGU9ImNvbXBhbnk6Q29tcGFueVR5cGUiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBhbnlUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZXBhcnRtZW50cyIgdHlwZT0iY29tcGFueTpEZXBhcnRtZW50VHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCQorCQk8eHNkOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisJPC94c2Q6Y29tcGxleFR5cGU+CisJPHhzZDplbGVtZW50IG5hbWU9ImRlcGFydG1lbnQiIHR5cGU9ImNvbXBhbnk6RGVwYXJ0bWVudFR5cGUiLz4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcGFydG1lbnRUeXBlIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25zdWx0YW50IiB0eXBlPSJjb21wYW55OkNvbnN1bHRhbnRUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3VsdGFudFR5cGUiPgorCQkKKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFnZSIgdHlwZT0iY29tcGFueTphZ2UiLz4KKwkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorCSAgIAorCTwveHNkOmNvbXBsZXhUeXBlPgorCisJCisgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWdlIj4KKyAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludGVnZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMCIvPgorICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueS54c2Rjb25maWcgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueS54c2Rjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxYzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbi9jb21wYW55LnhzZGNvbmZpZwpAQCAtMCwwICsxLDI2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4Yjpjb25maWcgeG1sbnM6eGI9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3hiZWFuL2NvbmZpZyI+CisKKyAgICA8eGI6ZXh0ZW5zaW9uIGZvcj0iKiI+CisgICAgICAgIDx4YjppbnRlcmZhY2UgbmFtZT0icHJlUG9zdEZlYXR1cmUuVmFsdWVSZXN0cmljdGlvbi5leGlzdGluZy5JU2V0dGVyIj4KKyAgICAgICAgICAgIDx4YjpzdGF0aWNIYW5kbGVyPnByZVBvc3RGZWF0dXJlLlZhbHVlUmVzdHJpY3Rpb24uZXhpc3RpbmcuU2V0dGVySGFuZGxlcjwveGI6c3RhdGljSGFuZGxlcj4KKyAgICAgICAgPC94YjppbnRlcmZhY2U+ICAKKyAgICAgICA8eGI6cHJlUG9zdFNldD4gCisgICAgICAgICAgICA8eGI6c3RhdGljSGFuZGxlcj5wcmVQb3N0RmVhdHVyZS5WYWx1ZVJlc3RyaWN0aW9uLmV4aXN0aW5nLlNldHRlckhhbmRsZXI8L3hiOnN0YXRpY0hhbmRsZXI+IAorICAgICAgPC94YjpwcmVQb3N0U2V0PiAKKyAgIDwveGI6ZXh0ZW5zaW9uPiAKKworCis8L3hiOmNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vZXhpc3RpbmcvSVNldHRlci5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL2V4aXN0aW5nL0lTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQyMWZjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL2V4aXN0aW5nL0lTZXR0ZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgcHJlUG9zdEZlYXR1cmUuVmFsdWVSZXN0cmljdGlvbi5leGlzdGluZzsKKworLyoqCisgKiBVc2VyOiB5a2FkaXlzaworICogRGF0ZTogTWF5IDUsIDIwMDQKKyAqLworcHVibGljIGludGVyZmFjZSBJU2V0dGVyCit7CisgICAgcHVibGljIHZvaWQgc2V0RW1wbG95ZWVBZ2UoaW50IGFnZSk7Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL1ZhbHVlUmVzdHJpY3Rpb24vZXhpc3RpbmcvU2V0dGVySGFuZGxlci5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL2V4aXN0aW5nL1NldHRlckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJkNmEzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL2V4aXN0aW5nL1NldHRlckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgcHJlUG9zdEZlYXR1cmUuVmFsdWVSZXN0cmljdGlvbi5leGlzdGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OworaW1wb3J0IHByZVBvc3RGZWF0dXJlLnhiZWFuLnZhbHVlUmVzdHJpY3Rpb24uY29tcGFueS5Db25zdWx0YW50VHlwZTsKKworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKworLyoqCisgKiBAYXV0aG9yIHlrYWRpeXNrCisgKi8KK3B1YmxpYyBjbGFzcyBTZXR0ZXJIYW5kbGVyCit7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYlJlYWR5ID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW1wbG95ZWVBZ2UoWG1sT2JqZWN0IHhvLCBpbnQgYWdlKQorICAgIHsKKyAgICAgICAgKChDb25zdWx0YW50VHlwZSkgeG8pLnNldEFnZShhZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhtbE9iamVjdCBvcmlnVmFsdWU7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJlU2V0KGludCBvcFR5cGUsIFhtbE9iamVjdCB4bywgUU5hbWUgcHJvcCwgYm9vbGVhbiBpc0F0dHIsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIG9yaWdWYWx1ZSA9IHhvLmNvcHkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHBvc3RTZXQoaW50IG9wVHlwZSwgWG1sT2JqZWN0IHhvLCBRTmFtZSBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gaXNBdHRyLCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBpZiAoIXhvLnZhbGlkYXRlKCkgJiYgKG9wVHlwZSA9PSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnLlByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1NFVCkgJiYgYlJlYWR5KQorICAgICAgICAgICAgeG8uc2V0KG9yaWdWYWx1ZSk7CisgICAgICAgIHhvLnZhbGlkYXRlKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL2V4aXN0aW5nL0Zvb0hhbmRsZXIuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL2V4aXN0aW5nL0Zvb0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTczM2IzCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9yZWFkT25seUJlYW4vZXhpc3RpbmcvRm9vSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBwcmVQb3N0RmVhdHVyZS5yZWFkT25seUJlYW4uZXhpc3Rpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworCitpbXBvcnQgcHJlUG9zdEZlYXR1cmUueGJlYW4ucmVhZE9ubHlCZWFuLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50OworaW1wb3J0IHByZVBvc3RGZWF0dXJlLnhiZWFuLnJlYWRPbmx5QmVhbi5wdXJjaGFzZU9yZGVyLkl0ZW1zLkl0ZW07CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCitwdWJsaWMgY2xhc3MgRm9vSGFuZGxlcgoreworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVTZXQoaW50IG9wVHlwZSwgWG1sT2JqZWN0IHhvLCBRTmFtZSBwcm9wLCBib29sZWFuIGlzQXR0ciwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgaWYgKG9wVHlwZSA9PSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuY29uZmlnLlByZVBvc3RFeHRlbnNpb24uT1BFUkFUSU9OX1NFVCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHBvc3RTZXQoaW50IG9wVHlwZSwgWG1sT2JqZWN0IHhvLCBRTmFtZSBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gaXNBdHRyLCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBpZiAob3BUeXBlID09IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC5jb25maWcuUHJlUG9zdEV4dGVuc2lvbi5PUEVSQVRJT05fU0VUKQorICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJObyBzZXR0ZXJzIGFyZSBhbGxvd2VkIGZvciB0aGlzIGJlYW46IiArICIgdmFsdWUgdW5jaGFuZ2VkIiArIHByb3BlcnR5TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByaWNlKFhtbE9iamVjdCB4bywgaW50IHByaWNlKQorICAgIHsKKyAgICAgICAgSXRlbSBpdCA9IChJdGVtKSB4bzsKKyAgICAgICAgQmlnRGVjaW1hbCBvID0gbmV3IEJpZ0RlY2ltYWwocHJpY2UgKyAiIik7CisgICAgICAgIGl0LnNldFVTUHJpY2Uobyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0UHJpY2UoWG1sT2JqZWN0IHhvKQorICAgIHsKKyAgICAgICAgSXRlbSBpdCA9IChJdGVtKSB4bzsKKyAgICAgICAgcmV0dXJuIGl0LmdldFVTUHJpY2UoKS5kb3VibGVWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL2V4aXN0aW5nL0lGb28uamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL2V4aXN0aW5nL0lGb28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M0ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9yZWFkT25seUJlYW4vZXhpc3RpbmcvSUZvby5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBwcmVQb3N0RmVhdHVyZS5yZWFkT25seUJlYW4uZXhpc3Rpbmc7CisKKy8qKgorICogVXNlcjogeWthZGl5c2sKKyAqIERhdGU6IE1heSA0LCAyMDA0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUZvbworeworICAgIHZvaWQgc2V0UHJpY2UoaW50IHByaWNlKTsKKworICAgIGRvdWJsZSBnZXRQcmljZSgpOworfQorCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9wby54c2QgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9wby54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZDZlNQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL3BvLnhzZApAQCAtMCwwICsxLDYwIEBACis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgoreG1sbnM6cG89Imh0dHA6Ly94YmVhbi5wcmVQb3N0X2ZlYXR1cmUvcmVhZE9ubHlCZWFuL1B1cmNoYXNlT3JkZXIiCit0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94YmVhbi5wcmVQb3N0X2ZlYXR1cmUvcmVhZE9ubHlCZWFuL1B1cmNoYXNlT3JkZXIiCitlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCQk8eHNkOmRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KKyAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4KKyAgICAgICAgICAgQ29weXJpZ2h0IDIwMDAgRXhhbXBsZS5jb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmVsZW1lbnQgbmFtZT0icHVyY2hhc2VPcmRlciIgdHlwZT0icG86UHVyY2hhc2VPcmRlclR5cGUiLz4KKwk8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHVyY2hhc2VPcmRlclR5cGUiPgorCQk8eHNkOnNlcXVlbmNlPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIi8+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYmlsbFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiLz4KKwkJCTx4c2Q6ZWxlbWVudCByZWY9InBvOmNvbW1lbnQiIG1pbk9jY3Vycz0iMCIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Iml0ZW1zIiB0eXBlPSJwbzpJdGVtcyIvPgorCQk8L3hzZDpzZXF1ZW5jZT4KKwkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JkZXJEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVVNBZGRyZXNzIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9ImNpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorCQkJPHhzZDplbGVtZW50IG5hbWU9InppcCIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KKwkJPC94c2Q6c2VxdWVuY2U+CisJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvdW50cnkiIHR5cGU9InhzZDpOTVRPS0VOIiBmaXhlZD0iVVMiLz4KKwk8L3hzZDpjb21wbGV4VHlwZT4KKwk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1zIj4KKwkJPHhzZDpzZXF1ZW5jZT4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQk8eHNkOnNlcXVlbmNlPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiPgorCQkJCQkJCTx4c2Q6c2ltcGxlVHlwZT4KKwkJCQkJCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KKwkJCQkJCQkJCTx4c2Q6bWF4RXhjbHVzaXZlIHZhbHVlPSIxMDAiLz4KKwkJCQkJCQkJPC94c2Q6cmVzdHJpY3Rpb24+CisJCQkJCQkJPC94c2Q6c2ltcGxlVHlwZT4KKwkJCQkJCTwveHNkOmVsZW1lbnQ+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVVNQcmljZSIgdHlwZT0ieHNkOmRlY2ltYWwiIGZpeGVkPSIzMCIgLz4KKwkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9InBvOmNvbW1lbnQiIG1pbk9jY3Vycz0iMCIvPgorCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InNoaXBEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZSIgbWluT2NjdXJzPSIwIi8+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJ0TnVtIiB0eXBlPSJwbzpTS1UiIHVzZT0icmVxdWlyZWQiLz4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCTwveHNkOnNlcXVlbmNlPgorCTwveHNkOmNvbXBsZXhUeXBlPgorCTwhLS0gU3RvY2sgS2VlcGluZyBVbml0LCBhIGNvZGUgZm9yIGlkZW50aWZ5aW5nIHByb2R1Y3RzIC0tPgorCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTS1UiPgorCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorCQkJPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfS1bQS1aXXsyfSIvPgorCQk8L3hzZDpyZXN0cmljdGlvbj4KKwk8L3hzZDpzaW1wbGVUeXBlPgorPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9yZWFkT25seUJlYW4vcG8ueHNkY29uZmlnIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9ucy9wcmVQb3N0RmVhdHVyZS9yZWFkT25seUJlYW4vcG8ueHNkY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NjRmY2IKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9wby54c2Rjb25maWcKQEAgLTAsMCArMSwyNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eGI6Y29uZmlnIHhtbG5zOnhiPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94YmVhbi9jb25maWciPgorCisgICAgPHhiOmV4dGVuc2lvbiBmb3I9IioiPgorICAgICAgICA8eGI6aW50ZXJmYWNlIG5hbWU9InByZVBvc3RGZWF0dXJlLnJlYWRPbmx5QmVhbi5leGlzdGluZy5JRm9vIj4KKyAgICAgICAgICAgIDx4YjpzdGF0aWNIYW5kbGVyPnByZVBvc3RGZWF0dXJlLnJlYWRPbmx5QmVhbi5leGlzdGluZy5Gb29IYW5kbGVyPC94YjpzdGF0aWNIYW5kbGVyPgorICAgICAgICA8L3hiOmludGVyZmFjZT4gIAorICAgICAgIDx4YjpwcmVQb3N0U2V0PiAKKyAgICAgICAgICAgIDx4YjpzdGF0aWNIYW5kbGVyPnByZVBvc3RGZWF0dXJlLnJlYWRPbmx5QmVhbi5leGlzdGluZy5Gb29IYW5kbGVyPC94YjpzdGF0aWNIYW5kbGVyPiAKKyAgICAgIDwveGI6cHJlUG9zdFNldD4gCisgICA8L3hiOmV4dGVuc2lvbj4gCisKKzwveGI6Y29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvQXZlcmFnZUNhc2VUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0F2ZXJhZ2VDYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjFlNmUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0F2ZXJhZ2VDYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLmF2ZXJhZ2VDYXNlLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50OworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4uYXZlcmFnZUNhc2UucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyVHlwZTsKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLmF2ZXJhZ2VDYXNlLnB1cmNoYXNlT3JkZXIuSXRlbXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCisKK3B1YmxpYyBjbGFzcyBBdmVyYWdlQ2FzZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBBdmVyYWdlQ2FzZVRlc3QoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQXZlcmFnZUNhc2VUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkKKyAgICB7CisgICAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudCBwb0RvYzsKKworICAgICAgICBwb0RvYyA9IFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFB1cmNoYXNlT3JkZXJUeXBlIHBvID0gcG9Eb2MuYWRkTmV3UHVyY2hhc2VPcmRlcigpOworICAgICAgICBpbnQgTEVOID0gMjA7CisKKyAgICAgICAgSXRlbXMuSXRlbVtdIGl0ID0gbmV3IEl0ZW1zLkl0ZW1bTEVOXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRbaV0gPSBJdGVtcy5JdGVtLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGl0W2ldLnNldFVTUHJpY2UobmV3IEJpZ0RlY2ltYWwoIiIgKyAyKSk7CisgICAgICAgIH0KKyAgICAgICAgSXRlbXMgaXRlbXMgPSBJdGVtcy5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGl0ZW1zLnNldEl0ZW1BcnJheShpdCk7CisgICAgICAgIHBvLnNldEl0ZW1zKGl0ZW1zKTsKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJwb0RvYzogIiArIHBvRG9jKTsKKworICAgICAgICBpbnQgaSA9IHBvRG9jLmdldFRvdGFsKCk7CisvLzIwIGl0ZW1zIEAgJDIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwLCBpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0V4dGVuc2lvbnNUZXN0LmphdmEgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0V4dGVuc2lvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhZGUxOQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvRXh0ZW5zaW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZHJ0Y2FzZXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBkcnRjYXNlcy5wcmVQb3N0RmVhdHVyZS5yZWFkT25seUJlYW4uUmVhZE9ubHlUZXN0OworaW1wb3J0IGRydGNhc2VzLnByZVBvc3RGZWF0dXJlLlZhbHVlUmVzdHJpY3Rpb24uVmFsdWVSZXN0cmljdGlvblRlc3Q7CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKCBjZXphci5hbmRyZWkgYXQgYmVhLmNvbSApCisgKiBEYXRlOiBNYXIgMjgsIDIwMDQKKyAqLworcHVibGljIGNsYXNzIEV4dGVuc2lvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgRXh0ZW5zaW9uc1Rlc3QoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworCisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2ltcGxlVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChBdmVyYWdlQ2FzZVRlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoRml4ZWRBdHRyVGVzdC5zdWl0ZSgpKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdChNdWx0SW50ZXJmYWNlc1Rlc3Quc3VpdGUoKSk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QoUmVhZE9ubHlUZXN0LnN1aXRlKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KFZhbHVlUmVzdHJpY3Rpb25UZXN0LnN1aXRlKCkpOworCisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0ZpeGVkQXR0clRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvRml4ZWRBdHRyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL0ZpeGVkQXR0clRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgaW50ZXJmYWNlRmVhdHVyZS54YmVhbi5maXhlZEF0dHJCZWFuLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlckRvY3VtZW50OworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4uZml4ZWRBdHRyQmVhbi5wdXJjaGFzZU9yZGVyLlB1cmNoYXNlT3JkZXJUeXBlOworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4uZml4ZWRBdHRyQmVhbi5wdXJjaGFzZU9yZGVyLkl0ZW1zOworCisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworCitwdWJsaWMgY2xhc3MgRml4ZWRBdHRyVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIEZpeGVkQXR0clRlc3QoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRml4ZWRBdHRyVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdCgpCisgICAgeworCisgICAgICAgIFB1cmNoYXNlT3JkZXJEb2N1bWVudCBwb0RvYzsKKworICAgICAgICBwb0RvYyA9IFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFB1cmNoYXNlT3JkZXJUeXBlIHBvID0gcG9Eb2MuYWRkTmV3UHVyY2hhc2VPcmRlcigpOworICAgICAgICBpbnQgTEVOID0gMjA7CisKKyAgICAgICAgSXRlbXMuSXRlbVtdIGl0ID0gbmV3IEl0ZW1zLkl0ZW1bTEVOXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRbaV0gPSBJdGVtcy5JdGVtLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGl0W2ldLnNldFVTUHJpY2UobmV3IEJpZ0RlY2ltYWwoIiIgKyA0KSk7CisgICAgICAgIH0KKyAgICAgICAgSXRlbXMgaXRlbXMgPSBJdGVtcy5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGl0ZW1zLnNldEl0ZW1BcnJheShpdCk7CisgICAgICAgIHBvLnNldEl0ZW1zKGl0ZW1zKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPHB1cjpwdXJjaGFzZU9yZGVyIHhtbG5zOnB1cj1cImh0dHA6Ly94YmVhbi5pbnRlcmZhY2VfZmVhdHVyZS9maXhlZEF0dHJCZWFuL1B1cmNoYXNlT3JkZXJcIj4iKTsKKworICAgICAgICBzYi5hcHBlbmQoIjxwdXI6aXRlbXM+Iik7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgICAgIHNiQ29udGVudC5hcHBlbmQoIjxwdXI6aXRlbT48cHVyOlVTUHJpY2U+NDwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKKworICAgICAgICBpbnQgcG9zID0gc2IubGVuZ3RoKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPC9wdXI6aXRlbXM+PC9wdXI6cHVyY2hhc2VPcmRlcj4iKTsKKworICAgICAgICBTdHJpbmcgc0V4cGVjdGVkID0gc2Iuc3ViU2VxdWVuY2UoMCwgcG9zKSArIHNiQ29udGVudC50b1N0cmluZygpICsgc2Iuc3ViU2VxdWVuY2UocG9zLCBzYi5sZW5ndGgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNFeHBlY3RlZCwgcG9Eb2MueG1sVGV4dCgpKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcG9Eb2Muc2V0UHJpY2UoMTApOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB0KQorICAgICAgICB7CisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcG9Eb2MudmFsaWRhdGUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL011bHRJbnRlcmZhY2VzVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9uc3VzZS9kcnRjYXNlcy9NdWx0SW50ZXJmYWNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ4MzRkCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9uc3VzZS9kcnRjYXNlcy9NdWx0SW50ZXJmYWNlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDg4IEBACitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQgaW50ZXJmYWNlRmVhdHVyZS54YmVhbi5tdWx0SW50ZXJmYWNlcy5wdXJjaGFzZU9yZGVyLlB1cmNoYXNlT3JkZXJEb2N1bWVudDsKK2ltcG9ydCBpbnRlcmZhY2VGZWF0dXJlLnhiZWFuLm11bHRJbnRlcmZhY2VzLnB1cmNoYXNlT3JkZXIuUHVyY2hhc2VPcmRlclR5cGU7CitpbXBvcnQgaW50ZXJmYWNlRmVhdHVyZS54YmVhbi5tdWx0SW50ZXJmYWNlcy5wdXJjaGFzZU9yZGVyLkl0ZW1zOworaW1wb3J0IGludGVyZmFjZUZlYXR1cmUueGJlYW4ubXVsdEludGVyZmFjZXMucHVyY2hhc2VPcmRlci5JdGVtcy5JdGVtOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOworCitwdWJsaWMgY2xhc3MgTXVsdEludGVyZmFjZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgTXVsdEludGVyZmFjZXNUZXN0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKE11bHRJbnRlcmZhY2VzVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdCgpCisgICAgeworCisKKyAgICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50IHBvRG9jID0gbnVsbDsKKworICAgICAgICBwb0RvYyA9IFB1cmNoYXNlT3JkZXJEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFB1cmNoYXNlT3JkZXJUeXBlIHBvID0gcG9Eb2MuYWRkTmV3UHVyY2hhc2VPcmRlcigpOworICAgICAgICBpbnQgTEVOID0gMjA7CisKKyAgICAgICAgSXRlbXMuSXRlbVtdIGl0ID0gbmV3IEl0ZW1zLkl0ZW1bTEVOXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRbaV0gPSBJdGVtcy5JdGVtLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGl0W2ldLnNldFVTUHJpY2UobmV3IEJpZ0RlY2ltYWwoIiIgKyBpKSk7CisgICAgICAgIH0KKyAgICAgICAgSXRlbXMgaXRlbXMgPSBJdGVtcy5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGl0ZW1zLnNldEl0ZW1BcnJheShpdCk7CisgICAgICAgIHBvLnNldEl0ZW1zKGl0ZW1zKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPHB1cjpwdXJjaGFzZU9yZGVyIHhtbG5zOnB1cj1cImh0dHA6Ly94YmVhbi5pbnRlcmZhY2VfZmVhdHVyZS9tdWx0SW50ZXJmYWNlcy9QdXJjaGFzZU9yZGVyXCI+Iik7CisKKyAgICAgICAgc2IuYXBwZW5kKCI8cHVyOml0ZW1zPiIpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYkNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEVOOyBpKyspCisgICAgICAgICAgICBzYkNvbnRlbnQuYXBwZW5kKCI8cHVyOml0ZW0+PHB1cjpVU1ByaWNlPiIgKyBpICsgIjwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKKworICAgICAgICBpbnQgcG9zID0gc2IubGVuZ3RoKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPC9wdXI6aXRlbXM+PC9wdXI6cHVyY2hhc2VPcmRlcj4iKTsKKworICAgICAgICBTdHJpbmcgc0V4cGVjdGVkID0gc2Iuc3ViU2VxdWVuY2UoMCwgcG9zKSArIHNiQ29udGVudC50b1N0cmluZygpICsgc2Iuc3ViU2VxdWVuY2UocG9zLCBzYi5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzRXhwZWN0ZWQsIHBvRG9jLnhtbFRleHQoKSk7CisKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcG9Eb2MuZ2V0TWluUHJpY2UoKSk7CisgICAgICAgIGludCBwcmljZSA9IDEwOworCisgICAgICAgIHBvRG9jLnNldE1pblByaWNlKChkb3VibGUpIHByaWNlKTsKKworICAgICAgICBzYkNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEVOOyBpKyspCisgICAgICAgICAgICBpZiAoaSA8IHByaWNlKQorICAgICAgICAgICAgICAgIHNiQ29udGVudC5hcHBlbmQoIjxwdXI6aXRlbT48cHVyOlVTUHJpY2U+IiArIHByaWNlICsgIjwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzYkNvbnRlbnQuYXBwZW5kKCI8cHVyOml0ZW0+PHB1cjpVU1ByaWNlPiIgKyBpICsgIjwvcHVyOlVTUHJpY2U+PC9wdXI6aXRlbT4iKTsKKyAgICAgICAgc0V4cGVjdGVkID0gc2Iuc3ViU2VxdWVuY2UoMCwgcG9zKSArIHNiQ29udGVudC50b1N0cmluZygpICsgc2Iuc3ViU2VxdWVuY2UocG9zLCBzYi5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzRXhwZWN0ZWQsIHBvRG9jLnhtbFRleHQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByaWNlLCBwb0RvYy5nZXRNaW5QcmljZSgpKTsKKworICAgICAgICBpbnQgZXhwVG90YWwgPSAocHJpY2UgLSAxKSAqIHByaWNlICsgKHByaWNlICsgMSArIExFTikgKiAoTEVOIC0gcHJpY2UpIC8gMjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFRvdGFsLCBwb0RvYy5nZXRUb3RhbCgpKTsKKworICAgICAgICBYbWxPYmplY3QgaXRlbSA9IHBvRG9jLmdldENoZWFwZXN0SXRlbSgpOworCisgICAgICAgIEl0ZW0gZXhwZWN0ZWQgPSBpdFswXTsKKyAgICAgICAgZXhwZWN0ZWQuc2V0VVNQcmljZShuZXcgQmlnRGVjaW1hbCgzMGQpKTsKKyAgICAgICAgLy8gICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBpdGVtICk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL1NpbXBsZVRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvU2ltcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmYxZmIKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL1NpbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGRydGNhc2VzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKK2ltcG9ydCB4c2QuY29tcGFueS5Db21wYW55RG9jdW1lbnQ7CitpbXBvcnQgeHNkLmNvbXBhbnkuQ29tcGFueVR5cGU7CitpbXBvcnQgbXlQYWNrYWdlLkZvbzsKK2ltcG9ydCBteVBhY2thZ2UuQmFyOworaW1wb3J0IG15UGFja2FnZS5Gb29IYW5kbGVyOworaW1wb3J0IG15UGFja2FnZS5Gb29IYW5kbGVyLlByZUJvb2ttYXJrOworaW1wb3J0IG15UGFja2FnZS5Gb29IYW5kbGVyLlBvc3RCb29rbWFyazsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoIGNlemFyLmFuZHJlaSBhdCBiZWEuY29tICkKKyAqIERhdGU6IE1hciAyOCwgMjAwNAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIFNpbXBsZVRlc3QoU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2ltcGxlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZXMoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkOworICAgICAgICBTdHJpbmcgYWN0dWFsOworCisgICAgICAgIENvbXBhbnlEb2N1bWVudCBjRG9jID0gQ29tcGFueURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBDb21wYW55VHlwZSBjbyA9IGNEb2MuYWRkTmV3Q29tcGFueSgpOworICAgICAgICBjby5zZXROYW1lMigieGJlYW4gbmFtZSIpOworCisgICAgICAgIGV4cGVjdGVkID0gInhiZWFuIG5hbWUiOworICAgICAgICBhY3R1YWwgPSBjby5nZXROYW1lMigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICJcbiAgYWN0dWFsOiAiICsgYWN0dWFsLCBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSk7CisKKyAgICAgICAgZXhwZWN0ZWQgPSAie25hbWUgaW4gRm9vSGFuZGxlcn0iOworICAgICAgICBhY3R1YWwgPSBjby5nZXROYW1lKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZDogIiArIGV4cGVjdGVkICsgIlxuICBhY3R1YWw6ICIgKyBhY3R1YWwsIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKTsKKworICAgICAgICBGb28gZm9vID0gY0RvYzsKKworICAgICAgICBleHBlY3RlZCA9ICJ7aW4gRm9vSGFuZGxlci5oYW5kbGVGb28oczogcGFyYW0pfSI7CisgICAgICAgIGFjdHVhbCA9IGZvby5mb28oInBhcmFtIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZDogJyIgKyBleHBlY3RlZCArICInXG4gIGFjdHVhbDogJyIgKyBhY3R1YWwgKyAiJyIsIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKTsKKworCisgICAgICAgIEJhciBiYXIgPSBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBiYXIgPSBjRG9jOworICAgICAgICAgICAgYnl0ZVtdIGJhID0gYmFyLmJhcigicGFyYW0gZm9yIGJhciIpOworCisgICAgICAgICAgICBleHBlY3RlZCA9ICJ7aW4gQmFySGFuZGxlci5oYW5kbGVCYXIoczogcGFyYW0gZm9yIGJhcil9IjsKKyAgICAgICAgICAgIGFjdHVhbCA9IG5ldyBTdHJpbmcoYmFyLmJhcigicGFyYW0gZm9yIGJhciIpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZDogIiArIGV4cGVjdGVkICsgIlxuICBhY3R1YWw6ICIgKyBhY3R1YWwsIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQmFyLk15RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBiYXIuYmFyKG51bGwpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChCYXIuTXlFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlUG9zdCgpCisgICAgeworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQ7CisgICAgICAgIFN0cmluZyBhY3R1YWw7CisgICAgICAgIFhtbEN1cnNvciB4YzsKKworICAgICAgICBDb21wYW55RG9jdW1lbnQgY0RvYyA9IENvbXBhbnlEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgLy8gYWRkIG5ldworICAgICAgICBDb21wYW55VHlwZSBjbyA9IGNEb2MuYWRkTmV3Q29tcGFueSgpOworCisgICAgICAgIHhjID0gY0RvYy5uZXdDdXJzb3IoKTsKKyAgICAgICAgUHJlQm9va21hcmsgcHJlYmsgPSAoUHJlQm9va21hcmspIHhjLmdldEJvb2ttYXJrKFByZUJvb2ttYXJrLmNsYXNzKTsKKworICAgICAgICBleHBlY3RlZCA9ICJ7cHJlU2V0IGluIEZvb0hhbmRsZXI6IDIsIDx4bWwtZnJhZ21lbnQ+PC94bWwtZnJhZ21lbnQ+LCB7Y29tcGFueS54c2R9Y29tcGFueSwgZmFsc2UsIC0xfSI7CisgICAgICAgIGFjdHVhbCA9IHByZWJrLmdldE1zZygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICJcbiAgYWN0dWFsOiAiICsgYWN0dWFsLCBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSk7CisKKworICAgICAgICBQb3N0Qm9va21hcmsgcG9zdGJrID0gKFBvc3RCb29rbWFyaykgeGMuZ2V0Qm9va21hcmsoUG9zdEJvb2ttYXJrLmNsYXNzKTsKKworICAgICAgICBleHBlY3RlZCA9ICJ7cG9zdFNldCBpbiBGb29IYW5kbGVyOiAyLCAiICsgY0RvYyArICIsIHtjb21wYW55LnhzZH1jb21wYW55LCBmYWxzZSwgLTF9IjsKKyAgICAgICAgYWN0dWFsID0gcG9zdGJrLmdldE1zZygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICJcbiAgYWN0dWFsOiAiICsgYWN0dWFsLCBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSk7CisKKyAgICAgICAgeGMuZGlzcG9zZSgpOworCisKKyAgICAgICAgLy8gc2V0CisgICAgICAgIGNvLnNldE5hbWUyKCJ4YmVhbiBuYW1lIik7CisKKyAgICAgICAgeGMgPSBjby5uZXdDdXJzb3IoKTsKKyAgICAgICAgcHJlYmsgPSAoUHJlQm9va21hcmspIHhjLmdldEJvb2ttYXJrKFByZUJvb2ttYXJrLmNsYXNzKTsKKworICAgICAgICBleHBlY3RlZCA9ICJ7cHJlU2V0IGluIEZvb0hhbmRsZXI6IDEsIDx4bWwtZnJhZ21lbnQvPiwgbmFtZSwgdHJ1ZSwgLTF9IjsKKyAgICAgICAgYWN0dWFsID0gcHJlYmsuZ2V0TXNnKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZDogIiArIGV4cGVjdGVkICsgIlxuICBhY3R1YWw6ICIgKyBhY3R1YWwsIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKTsKKworCisgICAgICAgIHBvc3RiayA9IChQb3N0Qm9va21hcmspIHhjLmdldEJvb2ttYXJrKFBvc3RCb29rbWFyay5jbGFzcyk7CisKKyAgICAgICAgZXhwZWN0ZWQgPSAie3Bvc3RTZXQgaW4gRm9vSGFuZGxlcjogMSwgIiArIGNvICsgIiwgbmFtZSwgdHJ1ZSwgLTF9IjsKKyAgICAgICAgYWN0dWFsID0gcG9zdGJrLmdldE1zZygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICJcbiAgYWN0dWFsOiAiICsgYWN0dWFsLCBleHBlY3RlZC5lcXVhbHMoYWN0dWFsKSk7CisKKyAgICAgICAgeGMuZGlzcG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbi9WYWx1ZVJlc3RyaWN0aW9uVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvZXh0ZW5zaW9uc3VzZS9kcnRjYXNlcy9wcmVQb3N0RmVhdHVyZS9WYWx1ZVJlc3RyaWN0aW9uL1ZhbHVlUmVzdHJpY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjMTgzNgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvcHJlUG9zdEZlYXR1cmUvVmFsdWVSZXN0cmljdGlvbi9WYWx1ZVJlc3RyaWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2UgZHJ0Y2FzZXMucHJlUG9zdEZlYXR1cmUuVmFsdWVSZXN0cmljdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IHByZVBvc3RGZWF0dXJlLnhiZWFuLnZhbHVlUmVzdHJpY3Rpb24uY29tcGFueS4qOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sU3RyaW5nOworCisvKioKKyAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KKyAqIFVzZXI6IHlrYWRpeXNrCisgKiBEYXRlOiBNYXkgNSwgMjAwNAorICogVGltZTogMTE6MjM6MzUgQU0KKyAqIFRvIGNoYW5nZSB0aGlzIHRlbXBsYXRlIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KKyAqLworcHVibGljIGNsYXNzIFZhbHVlUmVzdHJpY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgVmFsdWVSZXN0cmljdGlvblRlc3QoU3RyaW5nIHMpCisgICAgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsdWVSZXN0cmljdGlvblRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYW55RG9jdW1lbnQgcG9Eb2M7CisKKyAgICAgICAgcG9Eb2MgPSBDb21wYW55RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBDb21wYW55VHlwZSBwbyA9IHBvRG9jLmFkZE5ld0NvbXBhbnkoKTsKKworICAgICAgICBpbnQgTEVOID0gMjA7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNFeHBlY3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc0V4cGVjdGVkLmFwcGVuZCgiPGNvbTpjb21wYW55IHhtbG5zOmNvbT1cInByZVBvc3RGZWF0dXJlL3hiZWFuL1ZhbHVlUmVzdHJpY3Rpb24vY29tcGFueVwiPjxkZXBhcnRtZW50cz4iKTsKKyAgICAgICAgRGVwYXJ0bWVudFR5cGUgZGVwdCA9IHBvLmFkZE5ld0RlcGFydG1lbnRzKCk7CisgICAgICAgIENvbnN1bHRhbnRUeXBlW10gaXQgPSBuZXcgQ29uc3VsdGFudFR5cGVbTEVOXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRbaV0gPSBkZXB0LmFkZE5ld0NvbnN1bHRhbnQoKTsKKyAgICAgICAgICAgIFhtbFN0cmluZyBzID0gWG1sU3RyaW5nLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGl0W2ldLnNldEFnZSg1MCk7CisgICAgICAgICAgICBzRXhwZWN0ZWQuYXBwZW5kKCI8Y29uc3VsdGFudCBhZ2U9XCI1MFwiLz4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHNFeHBlY3RlZC5hcHBlbmQoIjwvZGVwYXJ0bWVudHM+PC9jb206Y29tcGFueT4iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc0V4cGVjdGVkLnRvU3RyaW5nKCksIHBvRG9jLnhtbFRleHQoKSk7CisgICAgICAgIGFzc2VydFRydWUocG9Eb2MudmFsaWRhdGUoKSk7CisKKworICAgICAgICBwcmVQb3N0RmVhdHVyZS5WYWx1ZVJlc3RyaWN0aW9uLmV4aXN0aW5nLlNldHRlckhhbmRsZXIuYlJlYWR5ID0gdHJ1ZTsKKworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEVOOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0W2ldLnNldEFnZSgxNTApOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNFeHBlY3RlZC50b1N0cmluZygpLCBwb0RvYy54bWxUZXh0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHBvRG9jLnZhbGlkYXRlKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEVOOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0W2ldLnNldEVtcGxveWVlQWdlKDE1MCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShzRXhwZWN0ZWQudG9TdHJpbmcoKS5lcXVhbHMocG9Eb2MueG1sVGV4dCgpKSk7CisgICAgICAgIGFzc2VydFRydWUocG9Eb2MudmFsaWRhdGUoKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9SZWFkT25seVRlc3QuamF2YSBiL3YxL3Rlc3Qvc3JjL2V4dGVuc2lvbnN1c2UvZHJ0Y2FzZXMvcHJlUG9zdEZlYXR1cmUvcmVhZE9ubHlCZWFuL1JlYWRPbmx5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MmM4YWMKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9leHRlbnNpb25zdXNlL2RydGNhc2VzL3ByZVBvc3RGZWF0dXJlL3JlYWRPbmx5QmVhbi9SZWFkT25seVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIGRydGNhc2VzLnByZVBvc3RGZWF0dXJlLnJlYWRPbmx5QmVhbjsKKworaW1wb3J0IHByZVBvc3RGZWF0dXJlLnhiZWFuLnJlYWRPbmx5QmVhbi5wdXJjaGFzZU9yZGVyLlB1cmNoYXNlT3JkZXJEb2N1bWVudDsKK2ltcG9ydCBwcmVQb3N0RmVhdHVyZS54YmVhbi5yZWFkT25seUJlYW4ucHVyY2hhc2VPcmRlci5QdXJjaGFzZU9yZGVyVHlwZTsKK2ltcG9ydCBwcmVQb3N0RmVhdHVyZS54YmVhbi5yZWFkT25seUJlYW4ucHVyY2hhc2VPcmRlci5JdGVtczsKKworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKK2ltcG9ydCBkcnRjYXNlcy5GaXhlZEF0dHJUZXN0OworCitwdWJsaWMgY2xhc3MgUmVhZE9ubHlUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgUmVhZE9ubHlUZXN0KFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEZpeGVkQXR0clRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QoKQorICAgIHsKKyAgICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50IHBvRG9jOworCisgICAgICAgIHBvRG9jID0gUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgUHVyY2hhc2VPcmRlclR5cGUgcG8gPSBwb0RvYy5hZGROZXdQdXJjaGFzZU9yZGVyKCk7CisKKworICAgICAgICBpbnQgTEVOID0gMjA7CisKKyAgICAgICAgSXRlbXMuSXRlbVtdIGl0ID0gbmV3IEl0ZW1zLkl0ZW1bTEVOXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaXRbaV0gPSBJdGVtcy5JdGVtLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGl0W2ldLnNldFVTUHJpY2UobmV3IEJpZ0RlY2ltYWwoIiIgKyA0KSk7CisgICAgICAgIH0KKyAgICAgICAgSXRlbXMgaXRlbXMgPSBJdGVtcy5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGl0ZW1zLnNldEl0ZW1BcnJheShpdCk7CisgICAgICAgIHBvLnNldEl0ZW1zKGl0ZW1zKTsKKworCisgICAgICAgIFN0cmluZyBzRXhwZWN0ZWQgPSAiPHB1cjpwdXJjaGFzZU9yZGVyIHhtbG5zOnB1cj1cImh0dHA6Ly94YmVhbi5wcmVQb3N0X2ZlYXR1cmUvcmVhZE9ubHlCZWFuL1B1cmNoYXNlT3JkZXJcIi8+IjsKKworCisgICAgICAgIGl0WzBdLnNldFByaWNlKDEwKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc0V4cGVjdGVkLCBwb0RvYy54bWxUZXh0KCkpOworCisgICAgICAgIGFzc2VydFRydWUoIXBvRG9jLnZhbGlkYXRlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL25hbWV3b3JsZHVzZS9jb20vYmVhL3Rlc3QvRHVtcE5hbWV3b3JsZC5qYXZhIGIvdjEvdGVzdC9zcmMvbmFtZXdvcmxkdXNlL2NvbS9iZWEvdGVzdC9EdW1wTmFtZXdvcmxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMjE5NwotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL25hbWV3b3JsZHVzZS9jb20vYmVhL3Rlc3QvRHVtcE5hbWV3b3JsZC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5iZWEudGVzdDsKKworaW1wb3J0IG9yZy5vcGVudXJpLm5hbWV3b3JsZC4qOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKKworcHVibGljIGNsYXNzIER1bXBOYW1ld29ybGQKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGZpbGUgIiArIGFyZ3NbaV0pOworICAgICAgICAgICAgZHVtcERvY3VtZW50KE5hbWV3b3JsZERvY3VtZW50LkZhY3RvcnkucGFyc2UobmV3IEZpbGUoYXJnc1tpXSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wRG9jdW1lbnQoTmFtZXdvcmxkRG9jdW1lbnQgZG9jKQorICAgIHsKKyAgICAgICAgTmFtZXdvcmxkIHdvcmxkID0gZG9jLmdldE5hbWV3b3JsZCgpOworICAgICAgICBOYW1ld29ybGQuSXNsYW5kW10gaXNsYW5kcyA9IHdvcmxkLmdldElzbGFuZCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlzbGFuZHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJc2xhbmQgdGFyZ2V0IG5hbWVzcGFjZTogIiArIGlzbGFuZHNbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOworICAgICAgICAgICAgTG9jW10gbG9jcyA9IGlzbGFuZHNbaV0uZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jcy5sZW5ndGg7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTG9jYXRpb246ICIgKyBsb2NzW2pdLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgTG9jLlJlZmVyZW5jZVtdIHJlZnMgPSBsb2NzW2pdLmdldFJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmVmcy5sZW5ndGg7IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBSZWZlcmVuY2U6ICIgKyByZWZzW2tdLmdldFRvKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9udW1lcmFscy9udW1lcmFscy54c2QgYi92MS90ZXN0L3NyYy9udW1lcmFscy9udW1lcmFscy54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0NzA1OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL251bWVyYWxzL251bWVyYWxzLnhzZApAQCAtMCwwICsxLDQzIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScKKyAgIHRhcmdldE5hbWVzcGFjZT0naHR0cDovL29wZW51cmkub3JnL3Rlc3ROdW1lcmFscycKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0ncXVhbGlmaWVkJz4KKyAgPHhzOmVsZW1lbnQgbmFtZT0nZG9jJz4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPScwJyBtYXhPY2N1cnM9J3VuYm91bmRlZCc+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naW50JyB0eXBlPSd4czppbnQnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nc2hvcnQnIHR5cGU9J3hzOnNob3J0JyAvPgorICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2J5dGUnIHR5cGU9J3hzOmJ5dGUnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZG91YmxlJyB0eXBlPSd4czpkb3VibGUnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZmxvYXQnIHR5cGU9J3hzOmZsb2F0JyAvPgorICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2Jvb2xlYW4nIHR5cGU9J3hzOmJvb2xlYW4nIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nc3RyaW5nJyB0eXBlPSd4czpzdHJpbmcnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZGVjaW1hbCcgdHlwZT0neHM6ZGVjaW1hbCcgLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdpbnRlZ2VyJyB0eXBlPSd4czppbnRlZ2VyJyAvPgorICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9J2xvbmcnIHR5cGU9J3hzOmxvbmcnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0naGV4QmluYXJ5JyB0eXBlPSd4czpoZXhCaW5hcnknIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nYmFzZTY0QmluYXJ5JyB0eXBlPSd4czpiYXNlNjRCaW5hcnknIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZGF0ZScgdHlwZT0neHM6ZGF0ZScgLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdkYXRlVGltZScgdHlwZT0neHM6ZGF0ZVRpbWUnIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nZ1llYXJNb250aCcgdHlwZT0neHM6Z1llYXJNb250aCcgLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSdkdXJhdGlvbicgdHlwZT0neHM6ZHVyYXRpb24nIC8+CisgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0nUU5hbWUnIHR5cGU9J3hzOlFOYW1lJyAvPgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvcmFuZG9tL1JhbmRvbS5qYXZhIGIvdjEvdGVzdC9zcmMvcmFuZG9tL1JhbmRvbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmNiNDAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9yYW5kb20vUmFuZG9tLmphdmEKQEAgLTAsMCArMSw4NjQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLkNvbW1hbmRMaW5lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC52YWx1ZXMuWG1sVmFsdWVEaXNjb25uZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnN0b3JlLkN1cnNvcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CisKK2ltcG9ydCBjb20uZWFzeXBvLlhtbFB1cmNoYXNlT3JkZXJEb2N1bWVudEJlYW4uUHVyY2hhc2VPcmRlcjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbEN1c3RvbWVyQmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbExpbmVJdGVtQmVhbjsKK2ltcG9ydCBjb20uZWFzeXBvLlhtbFNoaXBwZXJCZWFuOworCitwdWJsaWMgY2xhc3MgUmFuZG9tIGltcGxlbWVudHMgUnVubmFibGUKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoIFN0cmluZ1tdIGFyZ3MgKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJzZWVkIiwgImkiLCAidCIsICJkb2NzIiwgIj8iLCAiaGVscCIgfSkpOworICAgICAgICBsb25nIHNlZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgaW50IHRocmVhZHMgPSAxOworICAgICAgICBpbnQgZG9jcyA9IDEwOworICAgICAgICAKKyAgICAgICAgaWYgKGNsLmdldE9wdCgiPyIpICE9IG51bGwgfHwgY2wuZ2V0T3B0KCJoZWxwIikgIT0gbnVsbCB8fCBjbC5hcmdzKCkubGVuZ3RoICE9IDApCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiByYW5kb20gWy1zZWVkICNdIFstaSBpdGVyYXRpb25zXSBbLXQgdGhyZWFkc10gWy1kb2NzIGRvY3NdIFstcmVhZG9ubHldIFstbm9zYXZlXSIpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVhZG9ubHkgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbm9zYXZlID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG5vcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNsLmdldE9wdCgic2VlZCIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VlZCA9IExvbmcucGFyc2VMb25nKGNsLmdldE9wdCgic2VlZCIpKTsKKyAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImkiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgiaSIpKTsKKyAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoInQiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocmVhZHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgidCIpKTsKKyAgICAgICAgICAgIGlmIChjbC5nZXRPcHQoImRvY3MiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRvY3MgPSBJbnRlZ2VyLnBhcnNlSW50KGNsLmdldE9wdCgiZG9jcyIpKTsKKyAgICAgICAgICAgIG5vcXVlcnkgPSAoY2wuZ2V0T3B0KCJub3F1ZXJ5IikgIT0gbnVsbCk7CisgICAgICAgICAgICByZWFkb25seSA9IChjbC5nZXRPcHQoInJlYWRvbmx5IikgIT0gbnVsbCk7CisgICAgICAgICAgICBub3NhdmUgPSAoY2wuZ2V0T3B0KCJub3NhdmUiKSAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VlZD0iICsgc2VlZCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIml0ZXJhdGlvbnM9IiArIGl0ZXJhdGlvbnMgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGhyZWFkcz0iICsgdGhyZWFkcyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvY3M9IiArIGRvY3MgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZWFkb25seSA/ICJyZWFkb25seSIgOiAicmVhZC93cml0ZSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vc2F2ZSA/ICJub3NhdmUiIDogIndpdGggc2F2ZSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5vcXVlcnkgPyAibm9xdWVyeSIgOiAid2l0aCBxdWVyeSIpOworICAgICAgICAgICAgZG9UZXN0cyhzZWVkLCBpdGVyYXRpb25zLCB0aHJlYWRzLCBkb2NzLCByZWFkb25seSwgbm9zYXZlLCBub3F1ZXJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRvVGVzdHMobG9uZyBzZWVkLCBpbnQgaXRlcmF0aW9ucywgaW50IHRocmVhZENvdW50LCBpbnQgZG9jQ291bnQsIGJvb2xlYW4gcmVhZG9ubHksIGJvb2xlYW4gbm9zYXZlLCBib29sZWFuIG5vcXVlcnkpCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIAorICAgICAgICBYbWxPYmplY3RbXSBzaGFyZWREb2NzID0gbmV3IFhtbE9iamVjdCBbZG9jQ291bnRdOworICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFt0aHJlYWRDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgaXRlcmF0aW9ucyA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGhyZWFkQ291bnQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSYW5kb20gcnVubmFibGUgPSBuZXcgUmFuZG9tKHNlZWQsIHNoYXJlZERvY3MsIHJlYWRvbmx5LCBub3NhdmUsIG5vcXVlcnksIHRocmVhZENvdW50ID4gMSk7CisgICAgICAgICAgICAgICAgdGhyZWFkc1tqXSA9IG5ldyBUaHJlYWQocnVubmFibGUpOworICAgICAgICAgICAgICAgIHRocmVhZHNbal0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzZWVkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRocmVhZENvdW50OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW2pdLmpvaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRocmVhZCBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKKyAgICAgICAgICAgICJTZWNvbmRzIHRvIHJ1biByYW5kb20gdGVzdHM6ICIgKyAoZW5kIC0gc3RhcnQpIC8gMTAwMCApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludCggIlxyU2VlZDogIiArIF9zZWVkICk7CisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaW50IGQgPSAwIDsgZCA8IF9kb2NzLmxlbmd0aCA7IGQrKyApCisgICAgICAgICAgICAgICAgX2RvY3NbIGQgXSA9IFhtbE9iamVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgCisgICAgICAgICAgICBfY3Vyc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAKKyAgICAgICAgICAgIGludCBuSXRlcmF0aW9ucyA9IHJuZCggNjAwMDAgKSArIDUwMDA7CisgICAgCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbkl0ZXJhdGlvbnMgOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZ29vZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2l0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBnb29kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb29kKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIkVycm9yIG9uIGl0ZXJhdGlvbiAiICsgX2l0ZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoICggVGhyb3dhYmxlIGUgKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJFcnJvciBvbiBzZWVkICIgKyBfc2VlZCApOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoIFN5c3RlbS5lcnIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgamF2YS51dGlsLlJhbmRvbSBfcm5kOworICAgIAorICAgIHByaXZhdGUgWG1sT2JqZWN0W10gX2RvY3M7IC8vIHNoYXJlZCBhbW9uZyB0aHJlYWRzISEKKyAgICBwcml2YXRlIEFycmF5TGlzdCAgIF9jdXJzb3JzOworICAgIHByaXZhdGUgbG9uZyAgICAgICAgX3NlZWQ7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICBfaXRlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9yZWFkb25seTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9ub3NhdmU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICBfbm9xdWVyeTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgIF9pbnRlcmZlcmVuY2U7CisKKworICAgIHByaXZhdGUgaW50IHJuZCAoIGludCBuICkKKyAgICB7CisgICAgICAgIHJldHVybiBfcm5kLm5leHRJbnQoIG4gKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcm5kICggaW50IG1pbiwgaW50IG1heFBsdXNPbmUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIF9ybmQubmV4dEludChtYXhQbHVzT25lIC0gbWluKSArIG1pbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFhtbEN1cnNvciBnZXRDdXJzb3IgKCApCisgICAgeworICAgICAgICBpbnQgbiA9IF9jdXJzb3JzLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChuID09IDAgfHwgKG4gPCBfZG9jcy5sZW5ndGggKiAzKSAmJiBybmQoIDQgKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxDdXJzb3IgYyA9IF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0ubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICBfY3Vyc29ycy5hZGQoIGMgKTsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChYbWxDdXJzb3IpIF9jdXJzb3JzLmdldCggcm5kKCBuICkgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaXRlcmF0ZSAoICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoIHJuZCAoIDYgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICAwIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICAxIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICAyIDogaW50ZXJhdGVIaWdoKCk7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICAzIDogaW50ZXJhdGVNZWRpdW0oKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA0IDogaW50ZXJhdGVNZWRpdW0oKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA1IDogaW50ZXJhdGVMb3coKTsgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pbnRlcmZlcmVuY2UpCisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2ludGVyZmVyZW5jZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxWYWx1ZURpc2Nvbm5lY3RlZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnRlcmF0ZUhpZ2ggKCApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN3aXRjaCAoIHJuZCAoIDIgKSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAgMCA6IG1vdmVDdXJzb3JSaWdodE9uZVRva2VuKCk7IGJyZWFrOworICAgICAgICBjYXNlICAxIDogbW92ZUN1cnNvckxlZnRPbmVUb2tlbigpOyAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGludGVyYXRlTWVkaXVtICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBzd2l0Y2ggKCBfcmVhZG9ubHkgPyBybmQgKCA0ICkgOiBybmQgKDI0KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgIDAgOiBnZXRDaGFycygpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDEgOiBnZXRUZXh0VmFsdWUoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDIgOiBjb21wYXJlVmFsdWUoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDMgOiBwcmV2VG9rZW5UeXBlKCk7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgIDQgOiBpbnNlcnRUZXh0KCk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDUgOiBtb3ZlQ2hhcnNSaWdodCgpOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDYgOiBtb3ZlQ2hhcnNMZWZ0KCk7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDcgOiBpbnNlcnRFbGVtKCk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDggOiBpbnNlcnRBdHRyKCk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDkgOiByZW1vdmVYbWwoKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAgOiByZW1vdmVYbWxDb250ZW50cygpOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOiBjb3B5WG1sKCk7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOiBjb3B5WG1sQ29udGVudHMoKTsgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMgOiBtb3ZlWG1sKCk7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOiBtb3ZlWG1sQ29udGVudHMoKTsgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOiByZW1vdmVUZXh0KCk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOiBtb3ZlVGV4dCgpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcgOiBjb3B5VGV4dCgpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTggOiBpbnNlcnRDb21tZW50KCk7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkgOiBpbnNlcnRQcm9jaW5zdCgpOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAgOiBzZXRUZXh0VmFsdWUoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEgOiBzZXRTdHJvbmcoKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIgOiBvYmplY3RTZXQoKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMgOiBzZXROYW1lKCk7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW50ZXJhdGVMb3cgKCApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN3aXRjaCAoIHJuZCAoX3JlYWRvbmx5ID8gMSA6IDAsIF9ub3NhdmUgPyA4IDogMTcpICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAgMCA6IGNoYW5nZVR5cGUoKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgMSA6IGNyZWF0ZUJvb2ttYXJrKCk7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgMiA6IGNsZWFyQm9va21hcmsoKTsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlICAzIDogbG9hZERvYygpOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA0IDogbG9hZFNjaGVtYWREb2MoKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA1IDogY29tcGFyZUN1cnNvcnMoKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA2IDogZ2V0T2JqZWN0KCk7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA3IDogbmV3Q3Vyc29yKCk7ICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgIDggOiB2YWxpZGF0ZSgpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDkgOiBleGVjUXVlcnkoKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAgOiB4bWxJbnB1dFN0cmVhbSgpOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOiBkb2NCeXRlcygpOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOiBjdXJzb3JCeXRlcygpOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMgOiBuZXdEb21Ob2RlKCk7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOiBvYmplY3RTdHJpbmcoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOiBjdXJzb3JTdHJpbmcoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOiBwcmV0dHlPYmplY3QoKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgWG1sT2JqZWN0IGZpbmRPYmplY3QgKCApCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOworICAgICAgICBjLnB1c2goKTsKKyAgICAgICAgCisgICAgICAgIHdoaWxlICggIShjLmlzQ29udGFpbmVyKCkgfHwgYy5pc0F0dHIoKSkgKQorICAgICAgICAgICAgaWYgKGMudG9OZXh0VG9rZW4oKS5pc05vbmUoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWMuaXNFbmRkb2MoKSkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IHggPSBjLmdldE9iamVjdCgpOworICAgICAgICAgICAgYy5wb3AoKTsKKyAgICAgICAgICAgIGlmICh4ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0T2JqZWN0IHJldHVybmVkIG51bGwgLSBjb250ZW50IG11c3QgaGF2ZSBjaGFuZ2VkIik7CisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfQorCisgICAgICAgIGMucG9wKCk7CisgICAgICAgIGMucHVzaCgpOworICAgICAgICAKKyAgICAgICAgd2hpbGUgKCAhKGMuaXNDb250YWluZXIoKSB8fCBjLmlzQXR0cigpKSApCisgICAgICAgICAgICBpZiAoYy50b1ByZXZUb2tlbigpLmlzTm9uZSgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIFhtbE9iamVjdCB4ID0gYy5nZXRPYmplY3QoKTsKKyAgICAgICAgYy5wb3AoKTsKKyAgICAgICAgaWYgKHggPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldE9iamVjdCByZXR1cm5lZCBudWxsIC0gY29udGVudCBtdXN0IGhhdmUgY2hhbmdlZCIpOworICAgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJldHR5T2JqZWN0ICggKQorICAgIHsKKyAgICAgICAgWG1sT3B0aW9ucyBvcHRpb25zID0gbmV3IFhtbE9wdGlvbnMoKTsKKyAgICAgICAgb3B0aW9ucy5zZXRTYXZlUHJldHR5UHJpbnQoKTsKKyAgICAgICAgZmluZE9iamVjdCgpLnhtbFRleHQoIG9wdGlvbnMgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG9iamVjdFN0cmluZyAoICkKKyAgICB7CisgICAgICAgIGZpbmRPYmplY3QoKS50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY3Vyc29yU3RyaW5nICggKQorICAgIHsKKyAgICAgICAgZ2V0Q3Vyc29yKCkudG9TdHJpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVR5cGUgKCApCisgICAgeworICAgICAgICBYbWxPYmplY3QgbywgbjsKKyAgICAgICAgCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBvID0gZmluZE9iamVjdCgpOworICAgICAgICAgICAgU2NoZW1hVHlwZSB0eXBlID0gZmluZE9iamVjdCgpLnNjaGVtYVR5cGUoKTsKKyAgICAgICAgICAgIG4gPSBvLmNoYW5nZVR5cGUoIHR5cGUgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgX2RvY3MubGVuZ3RoIDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG8gPT0gX2RvY3NbIGkgXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfZG9jc1sgaSBdID0gbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcHJldlRva2VuVHlwZSAoICkKKyAgICB7CisgICAgICAgIGdldEN1cnNvcigpLnByZXZUb2tlblR5cGUoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG5ld0N1cnNvciAoICkKKyAgICB7CisgICAgICAgIGZpbmRPYmplY3QoKS5uZXdDdXJzb3IoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHNldE5hbWUgKCApCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGZpbmRPYmplY3QoKS5uZXdDdXJzb3IoKTsKKworICAgICAgICBpZiAoIWMuaXNTdGFydGRvYygpKQorICAgICAgICAgICAgYy5zZXROYW1lKCBnZXRRTmFtZSgpICk7CisKKyAgICAgICAgYy5kaXNwb3NlKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBuZXdEb21Ob2RlICggKQorICAgIHsKKyAgICAgICAgaWYgKHJuZCggNSApICE9IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubmV3RG9tTm9kZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgeG1sSW5wdXRTdHJlYW0gKCApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChybmQoIDUgKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0geGlzOworICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHhpcyA9IGdldEN1cnNvcigpLm5ld1hNTElucHV0U3RyZWFtKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICggeGlzLm5leHQoKSAhPSBudWxsICkKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb2JqZWN0U2V0ICggKQorICAgIHsKKyAgICAgICAgZmluZE9iamVjdCgpLnNldCggZmluZE9iamVjdCgpICk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBzZXRTdHJvbmcgKCApCisgICAgeworICAgICAgICBYbWxPYmplY3QgeCA9IGZpbmRPYmplY3QoKTsKKworICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIFB1cmNoYXNlT3JkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB1cmNoYXNlT3JkZXIgbyA9IChQdXJjaGFzZU9yZGVyKSB4OworICAgICAgICAgICAgby5zZXREYXRlKCBDYWxlbmRhci5nZXRJbnN0YW5jZSgpICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFhtbEN1c3RvbWVyQmVhbikKKyAgICAgICAgeworICAgICAgICAgICAgWG1sQ3VzdG9tZXJCZWFuIG8gPSAoWG1sQ3VzdG9tZXJCZWFuKSB4OworICAgICAgICAgICAgby5zZXROYW1lKCAiQm9iIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocm5kKCAyICkgPT0gMCkKKyAgICAgICAgICAgICAgICBvLnNldEFnZSggMjMgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHJuZCggMiApID09IDApCisgICAgICAgICAgICAgICAgby5zZXRNb28oIDI0ICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChybmQoIDIgKSA9PSAwKQorICAgICAgICAgICAgICAgIG8uc2V0UG9vKCAyMDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgWG1sTGluZUl0ZW1CZWFuKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxMaW5lSXRlbUJlYW4gbyA9IChYbWxMaW5lSXRlbUJlYW4pIHg7CisgICAgICAgICAgICBvLnNldFBlclVuaXRPdW5jZXMoIG5ldyBCaWdEZWNpbWFsKCAxMjIuNDQgKSApOworICAgICAgICAgICAgby5zZXRQcmljZSggbmV3IEJpZ0RlY2ltYWwoIDU1NS4zMyApICk7CisgICAgICAgICAgICBvLnNldFF1YW50aXR5KCBCaWdJbnRlZ2VyLnZhbHVlT2YoIDExMSApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoeCBpbnN0YW5jZW9mIFhtbFNoaXBwZXJCZWFuKQorICAgICAgICB7CisgICAgICAgICAgICBYbWxTaGlwcGVyQmVhbiBvID0gKFhtbFNoaXBwZXJCZWFuKSB4OworICAgICAgICAgICAgby5zZXRQZXJPdW5jZVJhdGUoIG5ldyBCaWdEZWNpbWFsKCAzLjE0MTU5ICkgKTsKKyAgICAgICAgICAgIG8uc2V0TmFtZSggIkVyaWMiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tcGFyZVZhbHVlICggKQorICAgIHsKKyAgICAgICAgZmluZE9iamVjdCgpLmNvbXBhcmVWYWx1ZSggZmluZE9iamVjdCgpICk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSAoICkKKyAgICB7CisgICAgICAgIGZpbmRPYmplY3QoKS52YWxpZGF0ZSgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZXhlY1F1ZXJ5ICggKQorICAgIHsKKyAgICAgICAgaWYgKF9ub3F1ZXJ5KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHJuZCggMjAgKSA+IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBRTmFtZSBuYW1lID0gZ2V0UU5hbWUoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBxdWVyeSA9CisgICAgICAgICAgICAiZGVjbGFyZSBuYW1lc3BhY2UgeHh4PSciICsgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSArICInICIgKworICAgICAgICAgICAgICAgICIuLy94eHg6IiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgIAorICAgICAgICBYbWxPYmplY3QgeCA9IGdldEN1cnNvcigpLmV4ZWNRdWVyeSggcXVlcnkgKS5nZXRPYmplY3QoKTsKKworICAgICAgICBpZiAocm5kKCAzICkgPT0gMCkKKyAgICAgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0gPSB4OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRPYmplY3QgKCApCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS5nZXRPYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGdldENoYXJzICggKQorICAgIHsKKyAgICAgICAgZ2V0Q3Vyc29yKCkuZ2V0Q2hhcnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tcGFyZUN1cnNvcnMgKCApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaXNJblNhbWVEb2N1bWVudCggZ2V0Q3Vyc29yKCkgKTsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLmNvbXBhcmVQb3NpdGlvbiggZ2V0Q3Vyc29yKCkgKTsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLmlzQXRTYW1lUG9zaXRpb25BcyggZ2V0Q3Vyc29yKCkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBfeG1scyA9CisgICAgeworICAgICAgICAiPGEvPiIsCisgICAgfTsKKworICAgIHByaXZhdGUgU3RyaW5nW10gX3NjaGVtYV94bWxzID0KKyAgICB7CisgICAgICAgICI8cG86cHVyY2hhc2Utb3JkZXIgeG1sbnM6cG89J2h0dHA6Ly9vcGVudXJpLm9yZy9lYXN5cG8nPlxuIiArIAorICAgICAgICAiPHBvOmN1c3RvbWVyIGFnZT0nMzEnIHBvbz0nMjAwJz5cbiIgKyAKKyAgICAgICAgICAgICI8cG86bmFtZT5EYXZpZCBCYXU8L3BvOm5hbWU+XG4iICsgCisgICAgICAgICAgICAiPHBvOmFkZHJlc3M+R2xhZHd5bmUsIFBBPC9wbzphZGRyZXNzPlxuIiArIAorICAgICAgICAiPC9wbzpjdXN0b21lcj5cbiIgKyAKKyAgICAgICAgIjxwbzpjdXN0b21lciBhZ2U9JzM3Jz5cbiIgKyAKKyAgICAgICAgICAgICI8cG86bmFtZT5FcmljIFZhc2lsaWs8L3BvOm5hbWU+XG4iICsgCisgICAgICAgICAgICAiPHBvOmFkZHJlc3M+UmVkbW9uZCwgV0E8L3BvOmFkZHJlc3M+XG4iICsgCisgICAgICAgICI8L3BvOmN1c3RvbWVyPlxuIiArIAorICAgICAgICAiPHBvOmRhdGU+MjAwMi0wOS0zMFQxNDoxNjowMC0wNTowMDwvcG86ZGF0ZT5cbiIgKyAKKyAgICAgICAgIjxwbzpsaW5lLWl0ZW0+XG4iICsgCisgICAgICAgICAgICAiPHBvOmRlc2NyaXB0aW9uPkJ1cm5oYW0ncyBDZWxlc3RpYWwgSGFuZGJvb2ssIFZvbCAxPC9wbzpkZXNjcmlwdGlvbj5cbiIgKyAKKyAgICAgICAgICAgICI8cG86cGVyLXVuaXQtb3VuY2VzPjU8L3BvOnBlci11bml0LW91bmNlcz5cbiIgKyAKKyAgICAgICAgICAgICI8cG86cHJpY2U+MjEuNzk8L3BvOnByaWNlPlxuIiArIAorICAgICAgICAgICAgIjxwbzpxdWFudGl0eT4yPC9wbzpxdWFudGl0eT5cbiIgKyAKKyAgICAgICAgIjwvcG86bGluZS1pdGVtPlxuIiArIAorICAgICAgICAiPHBvOmxpbmUtaXRlbT5cbiIgKyAKKyAgICAgICAgICAgICI8cG86ZGVzY3JpcHRpb24+QnVybmhhbSdzIENlbGVzdGlhbCBIYW5kYm9vaywgVm9sIDI8L3BvOmRlc2NyaXB0aW9uPlxuIiArIAorICAgICAgICAgICAgIjxwbzpwZXItdW5pdC1vdW5jZXM+NTwvcG86cGVyLXVuaXQtb3VuY2VzPlxuIiArIAorICAgICAgICAgICAgIjxwbzpwcmljZT4xOS44OTwvcG86cHJpY2U+XG4iICsgCisgICAgICAgICAgICAiPHBvOnF1YW50aXR5PjI8L3BvOnF1YW50aXR5PlxuIiArIAorICAgICAgICAiPC9wbzpsaW5lLWl0ZW0+XG4iICsgCisgICAgICAgICI8cG86bGluZS1pdGVtPlxuIiArIAorICAgICAgICAgICAgIjxwbzpkZXNjcmlwdGlvbj5CdXJuaGFtJ3MgQ2VsZXN0aWFsIEhhbmRib29rLCBWb2wgMzwvcG86ZGVzY3JpcHRpb24+XG4iICsgCisgICAgICAgICAgICAiPHBvOnBlci11bml0LW91bmNlcz41PC9wbzpwZXItdW5pdC1vdW5jZXM+XG4iICsgCisgICAgICAgICAgICAiPHBvOnByaWNlPjE5Ljg5PC9wbzpwcmljZT5cbiIgKyAKKyAgICAgICAgICAgICI8cG86cXVhbnRpdHk+MTwvcG86cXVhbnRpdHk+XG4iICsgCisgICAgICAgICI8L3BvOmxpbmUtaXRlbT5cbiIgKyAKKyAgICAgICAgIjxwbzpzaGlwcGVyPlxuIiArIAorICAgICAgICAgICAgIjxwbzpuYW1lPlVQUzwvcG86bmFtZT5cbiIgKyAKKyAgICAgICAgICAgICI8cG86cGVyLW91bmNlLXJhdGU+MC43NDwvcG86cGVyLW91bmNlLXJhdGU+XG4iICsgCisgICAgICAgICI8L3BvOnNoaXBwZXI+XG4iICsgCisgICAgICAgICI8L3BvOnB1cmNoYXNlLW9yZGVyPlxuIiArCisgICAgICAgICIiLAorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZERvYyAoICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHJuZCggMTUgKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBfZG9jc1sgcm5kKCBfZG9jcy5sZW5ndGggKSBdID0KKyAgICAgICAgICAgICAgICBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZSggX3htbHNbIHJuZCggX3htbHMubGVuZ3RoICkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRTY2hlbWFkRG9jICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAocm5kKCA0ICkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgX2RvY3NbIHJuZCggX2RvY3MubGVuZ3RoICkgXSA9CisgICAgICAgICAgICAgICAgWG1sT2JqZWN0LkZhY3RvcnkucGFyc2UoCisgICAgICAgICAgICAgICAgICAgIF9zY2hlbWFfeG1sc1sgcm5kKCBfc2NoZW1hX3htbHMubGVuZ3RoICkgXSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JMZWZ0T25lVG9rZW4gKCApCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS50b1ByZXZUb2tlbigpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclJpZ2h0T25lVG9rZW4gKCApCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS50b05leHRUb2tlbigpOworICAgIH0KKworICAgIHByaXZhdGUgY2hhcltdIF9jaGFycyA9CisgICAgeworICAgICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywKKyAgICAgICAgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgCisgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKKyAgICAgICAgJyAnLCAnPCcsICc+JywgJyYnLCAnLScsICc/JworICAgIH07CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGdldFRleHRWYWx1ZSAoICkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7CisKKyAgICAgICAgaWYgKGMuaXNGaW5pc2goKSB8fCBjLmlzTmFtZXNwYWNlKCkgfHwgYy5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGMuZ2V0VGV4dFZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRleHRWYWx1ZSAoICkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7CisKKyAgICAgICAgaWYgKGMuaXNGaW5pc2goKSB8fCBjLmlzTmFtZXNwYWNlKCkgfHwgYy5pc1RleHQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKCBpbnQgaSA9IHJuZCggMTAgKSA7IGkgPj0gMCA7IGktLSApCisgICAgICAgICAgICBzYi5hcHBlbmQoIF9jaGFyc1sgcm5kKCBfY2hhcnMubGVuZ3RoICkgXSApOworCisgICAgICAgIGMuc2V0VGV4dFZhbHVlKCBzYi50b1N0cmluZygpICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVUZXh0ICggKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLm1vdmVDaGFycyggcm5kKCAxMCApLCBnZXRDdXJzb3IoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY29weVRleHQgKCApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuY29weUNoYXJzKCBybmQoIDEwICksIGdldEN1cnNvcigpICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCByZW1vdmVUZXh0ICggKQorICAgIHsKKyAgICAgICAgZ2V0Q3Vyc29yKCkucmVtb3ZlQ2hhcnMoIHJuZCggNiApICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnQgKCApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0Q3Vyc29yKCkuaW5zZXJ0Q29tbWVudCggInBvbyIgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydFByb2NpbnN0ICggKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLmluc2VydFByb2NJbnN0KCAidGFyZ2V0IiwgInZhbCIgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluc2VydFRleHQgKCApCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOworCisgICAgICAgIGlmIChjLmlzQW55QXR0cigpIHx8IGMuaXNTdGFydGRvYygpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGZvciAoIGludCBpID0gcm5kKCAxMCApIDsgaSA+PSAwIDsgaS0tICkKKyAgICAgICAgICAgIHNiLmFwcGVuZCggX2NoYXJzWyBybmQoIF9jaGFycy5sZW5ndGggKSBdICk7CisKKyAgICAgICAgYy5pbnNlcnRDaGFycyggc2IudG9TdHJpbmcoKSApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb2NDaGFycyAoICkKKyAgICB7CisgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0ueG1sVGV4dCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjdXJzb3JDaGFycyAoICkKKyAgICB7CisgICAgICAgIGdldEN1cnNvcigpLnhtbFRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9jQnl0ZXMgKCApIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIF9kb2NzWyBybmQoIF9kb2NzLmxlbmd0aCApIF0uc2F2ZSggbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpICk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGN1cnNvckJ5dGVzICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS5zYXZlKCBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVDaGFyc1JpZ2h0ICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS50b05leHRDaGFyKCBybmQoIDEwICkgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbW92ZUNoYXJzTGVmdCAoICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZ2V0Q3Vyc29yKCkudG9QcmV2Q2hhciggcm5kKCAxMCApICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBRTmFtZSBnZXRRTmFtZSAoICkKKyAgICB7CisgICAgICAgIFFOYW1lIG5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgc3dpdGNoICggcm5kKCAzICkgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMCA6IG5hbWUgPSBYbWxCZWFucy5nZXRRTmFtZSggImZvby5jb20iLCAiZm9vIiApOyBicmVhazsKKyAgICAgICAgY2FzZSAxIDogbmFtZSA9IFhtbEJlYW5zLmdldFFOYW1lKCAiYmFyLmNvbSIsICJiYXIiICk7IGJyZWFrOworICAgICAgICBjYXNlIDIgOiBuYW1lID0gWG1sQmVhbnMuZ2V0UU5hbWUoICJtb28iICk7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbnNlcnRFbGVtICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOworCisgICAgICAgIGlmIChjLmlzQW55QXR0cigpIHx8IGMuaXNTdGFydGRvYygpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgYy5pbnNlcnRFbGVtZW50KCBnZXRRTmFtZSgpICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QXR0ciAoICkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7CisKKyAgICAgICAgd2hpbGUgKCAhYy5pc0VuZGRvYygpICYmICFjLmlzQ29udGFpbmVyKCkgKQorICAgICAgICAgICAgYy50b05leHRUb2tlbigpOworCisgICAgICAgIGlmIChjLmlzRW5kZG9jKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYy50b05leHRUb2tlbigpOworICAgICAgICAKKyAgICAgICAgYy5pbnNlcnRBdHRyaWJ1dGUoIGdldFFOYW1lKCkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29udGVudHMgKCApCisgICAgeworICAgICAgICBYbWxDdXJzb3IgYyA9IGdldEN1cnNvcigpOworCisgICAgICAgIGMucmVtb3ZlWG1sQ29udGVudHMoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY29weVhtbENvbnRlbnRzICggKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLmNvcHlYbWxDb250ZW50cyggZ2V0Q3Vyc29yKCkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY29weVhtbCAoICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBnZXRDdXJzb3IoKS5jb3B5WG1sKCBnZXRDdXJzb3IoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtb3ZlWG1sQ29udGVudHMgKCApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0Q3Vyc29yKCkubW92ZVhtbENvbnRlbnRzKCBnZXRDdXJzb3IoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBtb3ZlWG1sICggKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnNvcigpLm1vdmVYbWwoIGdldEN1cnNvcigpICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVhtbCAoICkKKyAgICB7CisgICAgICAgIFhtbEN1cnNvciBjID0gZ2V0Q3Vyc29yKCk7CisKKyAgICAgICAgaWYgKCFjLmlzU3RhcnRkb2MoKSAmJiAhYy5pc0ZpbmlzaCgpKQorICAgICAgICAgICAgYy5yZW1vdmVYbWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2ttYXJrIGV4dGVuZHMgWG1sQ3Vyc29yLlhtbEJvb2ttYXJrCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUJvb2ttYXJrICggKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBnZXRDdXJzb3IoKS5zZXRCb29rbWFyayggbmV3IEJvb2ttYXJrKCkgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY2xlYXJCb29rbWFyayAoICkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZ2V0Q3Vyc29yKCkuY2xlYXJCb29rbWFyayggQm9va21hcmsuY2xhc3MgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmFuZG9tKGxvbmcgc2VlZCwgWG1sT2JqZWN0W10gc2hhcmVkRG9jcywgYm9vbGVhbiByZWFkb25seSwgYm9vbGVhbiBub3NhdmUsIGJvb2xlYW4gbm9xdWVyeSwgYm9vbGVhbiBpbnRlcmZlcmVuY2UpCisgICAgeworICAgICAgICBfc2VlZCA9IHNlZWQ7CisgICAgICAgIF9ybmQgPSBuZXcgamF2YS51dGlsLlJhbmRvbShzZWVkKTsKKyAgICAgICAgX2RvY3MgPSBzaGFyZWREb2NzOworICAgICAgICBfcmVhZG9ubHkgPSByZWFkb25seTsKKyAgICAgICAgX25vc2F2ZSA9IG5vc2F2ZTsKKyAgICAgICAgX25vcXVlcnkgPSBub3F1ZXJ5OworICAgICAgICBfaW50ZXJmZXJlbmNlID0gaW50ZXJmZXJlbmNlOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2RlZmF1bHRzLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvZGVmYXVsdHMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDg2N2MKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2RlZmF1bHRzLnhzZApAQCAtMCwwICsxLDMwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKKyAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2RlZiIKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJkZWZhdWx0cyI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ0bnM6Y29vbCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvb2wiIHR5cGU9InhzOmludCIgZGVmYXVsdD0iNzgzIi8+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlZC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVkLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjkzYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlZC54c2QKQEAgLTAsMCArMSwzNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iY2hhaW4iIHR5cGU9ImNoYWlubGluayIvPgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJjaGFpbmxpbmsiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IHJlZj0iY2hhaW4iLz4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgcmVmPSJuYW1lIi8+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idG9rZW4iPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0idG9rZW4iLz4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMS54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2luY2x1ZGVyMS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1NTM0MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIxLnhzZApAQCAtMCwwICsxLDMwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOnRucz0iaHR0cDovL29wZW51cmkub3JnL2luY2x1ZGVyMSIKKyAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wZW51cmkub3JnL2luY2x1ZGVyMSIKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8eHM6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iaW5jbHVkZWQueHNkIi8+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ib25lY2hhaW4iPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Y2hhaW4iLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIyLnhzZCBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvaW5jbHVkZXIyLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk1ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbmNsdWRlcjIueHNkCkBAIC0wLDAgKzEsMzAgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYQorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6dG5zPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgorICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvaW5jbHVkZXIyIgorICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDx4czppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJpbmNsdWRlZC54c2QiLz4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJ0d29jaGFpbnMiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Y2hhaW4iIG1pbk9jY3Vycz0iMiIgbWF4T2NjdXJzPSIyIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL2ludHRlc3QueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbnR0ZXN0LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY2ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9pbnR0ZXN0LnhzZApAQCAtMCwwICsxLDYwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorICAgdGFyZ2V0TmFtZXNwYWNlPSJqYXZhOmludC50ZXN0IgorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6dG5zPSJqYXZhOmludC50ZXN0Ij4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJMYXRpdHVkZURlZ3JlZXNUeXBlIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8ZGVmaW5pdGlvbj5EZWdyZWVzIG9mIExhdGl0dWRlPC9kZWZpbml0aW9uPgorICAgICAgICA8VVNNVEZyZWY+U2VlIFVTTVRGIGZpZWxkIGxhdGl0dWRlLmRlZ3JlZXMuMTcuMTwvVVNNVEZyZWY+CisgICAgICAgIDxEb0RYTUxyZWY+VEJEPC9Eb0RYTUxyZWY+CisgICAgICA8L3hzOmRvY3VtZW50YXRpb24+CisgICAgPC94czphbm5vdGF0aW9uPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzaG9ydCI+CisgICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIwMCIvPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iOTAiLz4KKyAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGRdezJ9Ii8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9IkxvbmdpdHVkZURlZ3JlZXNUeXBlIj4KKyAgICA8eHM6YW5ub3RhdGlvbj4KKyAgICAgIDx4czpkb2N1bWVudGF0aW9uPgorICAgICAgICA8ZGVmaW5pdGlvbj5EZWdyZWVzIG9mIExvbmdpdHVkZTwvZGVmaW5pdGlvbj4KKyAgICAgICAgPFVTTVRGcmVmPlNlZSBVU01URiBmaWVsZCBsb25naXR1ZGUuZGVncmVlcy4xOC4xPC9VU01URnJlZj4KKyAgICAgICAgPERvRFhNTHJlZj5UQkQ8L0RvRFhNTHJlZj4KKyAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzOmFubm90YXRpb24+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnNob3J0Ij4KKyAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAwMCIvPgorICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTgwIi8+CisgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW1xkXXszfSIvPgorICAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJwb3NpdGlvbiI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYXQiIHR5cGU9InRuczpMYXRpdHVkZURlZ3JlZXNUeXBlIi8+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImxvbiIgdHlwZT0idG5zOkxvbmdpdHVkZURlZ3JlZXNUeXBlIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9saXN0YW5kdW5pb24ueHNkIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9saXN0YW5kdW5pb24ueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODEzOTkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zY2hlbWFzL2xpc3RhbmR1bmlvbi54c2QKQEAgLTAsMCArMSw4MSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICB4bWxuczp0bnM9Imh0dHA6Ly9vcGVudXJpLm9yZy9sdXQiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy9sdXQiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0idW5pb25zIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5uaSIgdHlwZT0idG5zOmFsbE5OSSIvPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaXplcyIgdHlwZT0idG5zOmxpc3Qtb3ItYWxsIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSdsaXN0LW9mLWludCc+CisgICAgPHhzOmxpc3QgaXRlbVR5cGU9J3hzOmludCcvPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYWxsTk5JIj4KKyAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czp1bmlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxpc3Qtb3ItYWxsIj4KKyAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InRuczpsaXN0LW9mLWludCI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIi8+CisgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmtub3duIi8+CisgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czp1bmlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czpzaW1wbGVUeXBlIG5hbWU9Imxpc3Qtb2YtYWxsTk5JIj4KKyAgICA8eHM6bGlzdCBpdGVtVHlwZT0idG5zOmFsbE5OSSIvPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibGlzdHMiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50LWxpc3QiIHR5cGU9InRuczpsaXN0LW9mLWludCIvPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJubmktbGlzdCIgdHlwZT0idG5zOmxpc3Qtb2YtYWxsTk5JIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkYXRlLW9yLWRhdGVUaW1lIj4KKyAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InhzOmRhdGUgeHM6ZGF0ZVRpbWUiLz4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czplbGVtZW50IG5hbWU9IndoZW4iIHR5cGU9InRuczpkYXRlLW9yLWRhdGVUaW1lIi8+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iaW5jaWRlbnQtcmVwb3J0cyI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczp3aGVuIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zY2hlbWFzL25hbWV3b3JsZC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL25hbWV3b3JsZC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkZjZiNgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvbmFtZXdvcmxkLnhzZApAQCAtMCwwICsxLDQ2IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOm53PSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgorICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbmFtZXdvcmxkIgorICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDx4czplbGVtZW50IG5hbWU9Im5hbWV3b3JsZCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXNsYW5kIj4KKyAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHM6c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ibnc6bG9jIi8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb2MiPgorICAgIDx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiPgorICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0byIgdHlwZT0ieHM6UU5hbWUiLz4KKyAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICAgIDwveHM6ZWxlbWVudD4KKyAgICA8L3hzOnNlcXVlbmNlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc2NoZW1hcy9ub25hbWVzcGFjZS54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL25vbmFtZXNwYWNlLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ4NGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvc2NoZW1hcy9ub25hbWVzcGFjZS54c2QKQEAgLTAsMCArMSwzNSBAQAorPCEtLSBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Cis8eHM6c2NoZW1hCisgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibmNoYWluIiB0eXBlPSJuY2hhaW5saW5rIi8+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5jaGFpbmxpbmsiPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IHJlZj0ibmNoYWluIi8+CisgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8eHM6YXR0cmlidXRlIHJlZj0ibm5hbWUiLz4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJudG9rZW4iPgorICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp0b2tlbiI+CisgICAgICA8eHM6bWF4TGVuZ3RoIHZhbHVlPSI1Ii8+CisgICAgPC94czpyZXN0cmljdGlvbj4KKyAgPC94czpzaW1wbGVUeXBlPgorCisgIDx4czphdHRyaWJ1dGUgbmFtZT0ibm5hbWUiIHR5cGU9Im50b2tlbiIvPgorCis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3NjaGVtYXMvc3Vic3Rncm91cC54c2QgYi92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWJjNzAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zY2hlbWFzL3N1YnN0Z3JvdXAueHNkCkBAIC0wLDAgKzEsMTAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCisgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvc2dzIiB4bWxuczpzZz0iaHR0cDovL29wZW51cmkub3JnL3NncyI+CisgICAgPHhzZDplbGVtZW50IG5hbWU9IkMiIHR5cGU9InhzZDp0b2tlbiIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkIiLz4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4c2Q6bm9ybWFsaXplZFN0cmluZyIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkEiLz4KKworICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJaIiB0eXBlPSJzZzpFeHQiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpZIiAvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJZIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6WCIgLz4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ic2c6QmFzZSIvPgorCisgICAgPHhzZDplbGVtZW50IG5hbWU9IkFueVR5cGUiLz4KKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW55VHlwZVRhaWwiIHN1YnN0aXR1dGlvbkdyb3VwPSJzZzpBbnlUeXBlIi8+CisKKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQW5vblNpbXBsZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+CisgICAgICAgICAgICAgICAgPHhzZDptYXhFeGNsdXNpdmUgdmFsdWU9IjEwMCIvPgorICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgPC94c2Q6ZWxlbWVudD4KKworICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uU2ltcGxlVGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFub25TaW1wbGUiLz4KKworICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJBbm9uQ29tcGxleCI+CisgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb28iIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgICA8L3hzZDplbGVtZW50PgorCisgICAgPHhzZDplbGVtZW50IG5hbWU9IkFub25Db21wbGV4VGFpbCIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOkFub25Db21wbGV4Ii8+CisKKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdCI+CisgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8eHNkOnNlcXVlbmNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJzZzpBIi8+CisgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgPC94c2Q6ZWxlbWVudD4KKworICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZSI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJVbnJlbGF0ZWQiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0ciIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKworICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXh0Ij4KKyAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KKyAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNnOkJhc2UiPgorICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InhzZDppbnQiLz4KKyAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3RUZXN0Ij4KKwkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCTx4c2Q6YWxsPgorCQkJCTx4c2Q6ZWxlbWVudCByZWY9InNnOmFic3RyYWN0Ii8+CisJCQk8L3hzZDphbGw+CisJCTwveHNkOmNvbXBsZXhUeXBlPgorCTwveHNkOmVsZW1lbnQ+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0iYWJzdHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIGFic3RyYWN0PSJ0cnVlIi8+CisgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmNyZXRlIiBzdWJzdGl0dXRpb25Hcm91cD0ic2c6YWJzdHJhY3QiLz4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJibG9ja1Rlc3QiPgorCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJPHhzZDphbGw+CisJCQkJPHhzZDplbGVtZW50IHJlZj0ic2c6YmxvY2siLz4KKwkJCTwveHNkOmFsbD4KKwkJPC94c2Q6Y29tcGxleFR5cGU+CisJPC94c2Q6ZWxlbWVudD4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJibG9jayIgdHlwZT0ieHNkOnN0cmluZyIgYmxvY2s9InN1YnN0aXR1dGlvbiIvPgorICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWJibG9jayIgc3Vic3RpdHV0aW9uR3JvdXA9InNnOmJsb2NrIi8+CisKKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvSW50ZXJuLmphdmEgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L0ludGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmNmYmEKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L0ludGVybi5qYXZhCkBAIC0wLDAgKzEsMzAzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBzdHJlYW10ZXN0OworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBJbnRlcm4KK3sKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9JVEVSID0gMTAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DUkVBVEUgPSAxMDA7CisgICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ09NUCA9IDEwMDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICBjaGFyW10gY2EgPSB7ICdhJywgJ2EnLCAnYSd9OworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKCJhYWEiKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBuZXcgU3RyaW5nKGNhKS5pbnRlcm4oKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSBTdHJpbmcudmFsdWVPZihjYSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFhYSIgPT0gU3RyaW5nLmNvcHlWYWx1ZU9mKGNhKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIiA9PSAiYWFhIik7CisKKyAgICAgICAgbG9uZyBzdGFydDsKKyAgICAgICAgZG91YmxlIGQxID0gMDsKKyAgICAgICAgZG91YmxlIGQyID0gMDsKKyAgICAgICAgZG91YmxlIGQzID0gMDsKKworICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBmb3IoIGludCBpID0gMDsgaTxNQVhfSVRFUjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGUoKTsKKyAgICAgICAgICAgIENhY2hlLlFOYW1lIHFuMSA9IGNhY2hlLmNyZWF0ZTEoU3RyaW5nLnZhbHVlT2YoIE1hdGguCisgICAgICAgICAgICAgICAgICAgIHJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLmludGVybigpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqTUFYX0NSRUFURS8xMCkpLgorICAgICAgICAgICAgICAgICAgICBpbnRlcm4oKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocW4xLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7CisgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUxKFN0cmluZy52YWx1ZU9mKCBNYXRoLgorICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OworCisgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOworICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMShTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUxOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKKworICAgICAgICAvL2NyZWF0ZTIKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7CisgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgorICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7CisgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUyKFN0cmluZy52YWx1ZU9mKCBNYXRoLgorICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OworCisgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOworICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMihTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUyOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKKworICAgICAgICAvL2NyZWF0ZTMKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7CisgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgorICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEgPT0gcW4yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGk8TUFYX0lURVI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IENhY2hlKCk7CisgICAgICAgICAgICBDYWNoZS5RTmFtZSBxbjEgPSBjYWNoZS5jcmVhdGUzKFN0cmluZy52YWx1ZU9mKCBNYXRoLgorICAgICAgICAgICAgICAgICAgICByb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS5pbnRlcm4oKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKk1BWF9DUkVBVEUvMTApKS4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuKCkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuaW50ZXJuKCksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkuCisgICAgICAgICAgICAgICAgICAgIGludGVybigpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrPTA7IGs8TUFYX0NPTVA7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGIgPSBxbjEuZXF1YWxJbnRlcm4ocW4yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZDIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OworCisgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpPE1BWF9JVEVSOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOworICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4xID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgZm9yKCBpbnQgaj0wOyBqPE1BWF9DUkVBVEU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FjaGUuUU5hbWUgcW4yID0gY2FjaGUuY3JlYXRlMyhTdHJpbmcudmFsdWVPZiggTWF0aC4KKyAgICAgICAgICAgICAgICAgICAgcm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSpNQVhfQ1JFQVRFLzEwKSkpOworICAgICAgICAgICAgICAgIGZvciggaW50IGs9MDsgazxNQVhfQ09NUDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYiA9IHFuMS5lcXVhbEV4dGVybihxbjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkMyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUzOlx0IiArIGQxICsgIlx0IiArIGQyICsgIlx0IiArIGQzKTsKKyAgICB9Cit9CisKK2NsYXNzIENhY2hlCit7CisgICAgSGFzaE1hcCBoMSA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBRTmFtZSBjcmVhdGUxKFN0cmluZyBsLCBTdHJpbmcgdSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUU5hbWUobCAsdSk7CisgICAgfQorCisgICAgUU5hbWUgY3JlYXRlMihTdHJpbmcgbCwgU3RyaW5nIHUpCisgICAgeworICAgICAgICBpbnQgaGNvZGUgPSBsLmhhc2hDb2RlKCkgKyAzMyp1Lmhhc2hDb2RlKCk7CisgICAgICAgIEludGVnZXIga2V5ID0gbmV3IEludGVnZXIoaGNvZGUpOworCisgICAgICAgIGlmKCBoMS5jb250YWluc0tleSgga2V5ICkgKQorICAgICAgICAgICAgcmV0dXJuIChRTmFtZSloMS5nZXQoa2V5KTsKKworICAgICAgICBRTmFtZSBxbiA9IG5ldyBRTmFtZShsLCB1KTsKKyAgICAgICAgaDEucHV0KGtleSwgcW4pOworICAgICAgICByZXR1cm4gcW47CisgICAgfQorCisgICAgc3luY2hyb25pemVkIFFOYW1lIGNyZWF0ZTMoU3RyaW5nIGwsIFN0cmluZyB1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZTIobCwgdSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFFOYW1lCisgICAgeworICAgICAgICBwcml2YXRlIFN0cmluZyBsb2NhbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworCisgICAgICAgIHByaXZhdGUgUU5hbWUoKQorICAgICAgICB7fQorICAgICAgICBwcml2YXRlIFFOYW1lKFN0cmluZyBsLCBTdHJpbmcgdSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYWwgPSBsOworICAgICAgICAgICAgdXJpID0gdTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZXF1YWxJbnRlcm4oIFFOYW1lIHFuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsPT1xbi5sb2NhbCAmJiB1cmk9PXFuLnVyaTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZXF1YWxFeHRlcm4oIFFOYW1lIHFuICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsLmVxdWFscyhxbi5sb2NhbCkgJiYgdXJpLmVxdWFscyhxbi51cmkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbCArICIsIiArIHVyaTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvc3RyZWFtdGVzdC9TdWJTdHJlYW1zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZGE0N2IKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1N1YlN0cmVhbXNUZXN0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHN0cmVhbXRlc3Q7CisKKy8qCisqIENyZWF0ZWQgYnkgY2V6YXJAYmVhLmNvbQorKi8KKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbUZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwuc3RyZWFtLlhtbFN0cmVhbVNvdXJjZTsKK2ltcG9ydCBvcmcueG1scHVsbC5zdHJlYW0uWHBwWG1sU3RyZWFtSW1wbDsKK2ltcG9ydCBvcmcueG1scHVsbC5zdHJlYW0uWG1sU3RyZWFtRmFjdG9yeTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBTdWJTdHJlYW1zVGVzdAoreworICAgIHB1YmxpYyBTdWJTdHJlYW1zVGVzdChTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIC8vc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN1YlN0cmVhbSgpCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0IHdvcmtzLiIpOworCisgICAgICAgIC8vdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktldmluJ3MgZXhjZXB0aW9uIik7CisKKyAgICAgICAgLy9hc3NlcnRUcnVlKCB0cnVlICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByZWFkZXIxOworICAgICAgICBSZWFkZXIgcmVhZGVyMjsKKyAgICAgICAgaWYoIGFyZ3MubGVuZ3RoPT0wICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiPGE+PGI+PGMgYTE9J2ExdicgYTI9J2EydicgLz48L2I+PHgvPiIgKworICAgICAgICAgICAgICAgICI8eT5Tb21lIHRleHQ8L3k+PC9hPiI7CisgICAgICAgICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKKyAgICAgICAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBGaWxlUmVhZGVyKGFyZ3NbMF0pOworICAgICAgICAgICAgcmVhZGVyMiA9IG5ldyBGaWxlUmVhZGVyKGFyZ3NbMF0pOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkZXIgLi4uIik7CisgICAgICAgIFhtbFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyZWFkZXIxKTsKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlTdHJlYW0gPSBYbWxTdHJlYW1GYWN0b3J5LgorICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKCBzb3VyY2UgKTsKKworICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYWJlbFN0cmVhbSA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpLgorICAgICAgICAgICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyMik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteVN0cmVhbSAuLi4iKTsKKyAgICAgICAgZm9yKGludCBpPTA7IG15U3RyZWFtLmhhc05leHQoKSAmJiBpPDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyBteVN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKKyAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyBiYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKKyAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MgPSBteVN0cmVhbS5nZXRTdWJTdHJlYW0oKTsKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzcyA9IGJhYmVsU3RyZWFtLmdldFN1YlN0cmVhbSgpOworCisgICAgICAgIGZvcihpbnQgaT0wOyAobXlzcy5oYXNOZXh0KCkgfHwgYmJzcy5oYXNOZXh0KCkpICYmIGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyBteXNzLmhhc05leHQoKSArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYiBTVUJTdHJlYW06ICIgKyBiYnNzLmhhc05leHQoKSArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBiYnNzLm5leHQoKSArICInIik7CisgICAgICAgIH0KKworICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzMiA9IG15c3MuZ2V0U3ViU3RyZWFtKCk7CisgICAgICAgIFhNTElucHV0U3RyZWFtIGJic3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKKyAgICAgICAgZm9yKDsgbXlzczIuaGFzTmV4dCgpIHx8IGJic3MyLmhhc05leHQoKSA7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTdWJTVUJTdHJlYW0gMjogIiArIG15c3MyLmhhc05leHQoKSArCisgICAgICAgICAgICAgICAgICAgICIgJyIgKyBteXNzMi5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU3ViU1VCU3RyZWFtIDI6ICIgKyBiYnNzMi5oYXNOZXh0KCkgKworICAgICAgICAgICAgICAgICAgICAiICciICsgYmJzczIubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBteXNzMi5jbG9zZSgpOworICAgICAgICBiYnNzMi5jbG9zZSgpOworCisgICAgICAgIGZvcig7IG15c3MuaGFzTmV4dCgpIHx8IGJic3MuaGFzTmV4dCgpIDspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArIG15c3MuaGFzTmV4dCgpICsgIiAnIiArCisgICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArIGJic3MuaGFzTmV4dCgpICsgIiAnIiArCisgICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSB8fCBiYWJlbFN0cmVhbS5oYXNOZXh0KCk7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArIG15U3RyZWFtLmhhc05leHQoKSArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKyBiYWJlbFN0cmVhbS5oYXNOZXh0KCkgKyAiICciICsKKyAgICAgICAgICAgICAgICAgICAgYmFiZWxTdHJlYW0ubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIG1haW4yKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4yKCkKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlYWRlciByZWFkZXIxOworICAgICAgICBSZWFkZXIgcmVhZGVyMjsKKyAgICAgICAgICAgIFN0cmluZyBzID0gIjxhPjxiPjxjIGExPSdhMXYnIGEyPSdhMnYnIC8+PC9iPjx4Lz4iICsKKyAgICAgICAgICAgICAgICAiPHk+U29tZSB0ZXh0PC95PjwvYT4iOworICAgICAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIocyk7CisgICAgICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRlciAuLi4iKTsKKyAgICAgICAgWG1sU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBYcHBYbWxTdHJlYW1JbXBsKHJlYWRlcjEpOworICAgICAgICBYTUxJbnB1dFN0cmVhbSBteVN0cmVhbSA9IFhtbFN0cmVhbUZhY3RvcnkuCisgICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0oIHNvdXJjZSApOworCisgICAgICAgIFhNTElucHV0U3RyZWFtIGJhYmVsU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCisgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyZWFkZXIyKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm15U3RyZWFtIC4uLiIpOworICAgICAgICBmb3IoaW50IGk9MDsgbXlTdHJlYW0uaGFzTmV4dCgpICYmIGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKworICAgICAgICAgICAgICAgIG15U3RyZWFtLm5leHQoKSArICInIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzcyA9IG15U3RyZWFtLmdldFN1YlN0cmVhbSgpOworICAgICAgICBYTUxJbnB1dFN0cmVhbSBiYnNzID0gYmFiZWxTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7CisKKyAgICAgICAgZm9yKGludCBpPTA7IG15c3MuaGFzTmV4dCgpICYmIGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKKyAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCisgICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIFhNTElucHV0U3RyZWFtIG15c3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmJzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOworICAgICAgICBmb3IoOyBteXNzMi5oYXNOZXh0KCkgOykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU3ViU1VCU3RyZWFtIDI6ICIgKworICAgICAgICAgICAgICAgICAgICAiICciICsgbXlzczIubmV4dCgpICsgIiciKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImJiIFN1YlNVQlN0cmVhbSAyOiAiICsKKyAgICAgICAgICAgICAgICAgICAgIiAnIiArIGJic3MyLm5leHQoKSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbXlzczIuY2xvc2UoKTsKKyAgICAgICAgYmJzczIuY2xvc2UoKTsKKworICAgICAgICBmb3IoOyBteXNzLmhhc05leHQoKSB8fCBiYnNzLmhhc05leHQoKSA7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteSBTVUJTdHJlYW06ICIgKyAiICciICsKKyAgICAgICAgICAgICAgICAgICAgbXlzcy5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCisgICAgICAgICAgICAgICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSA7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiYmI6ICIgKworICAgICAgICAgICAgICAgICAgICAvL2JhYmVsU3RyZWFtLmhhc05leHQoKSArICAvL0JBQkVMIGJ1Z2J1ZzogdW4vY29tbWVudCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGluZSB5b3UnbGwgZ2V0IGRpZmZlcmVudCBiZWhhdmlvciBmb3IgbmV4dCgpCisgICAgICAgICAgICAgICAgICAgICIgJyIgKworICAgICAgICAgICAgICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgbWFpbjMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbjMoKQorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUmVhZGVyIHJlYWRlcjE7CisgICAgICAgIFJlYWRlciByZWFkZXIyOworICAgICAgICBTdHJpbmcgcyA9ICI8P3htbCB2ZXJzaW9uPScxLjEuMSc/PjxhPjxiIHhtbG5zPScnIHhtbG5zOmE9J3NkZnNkZic+PGMgYTE9J2EmbHQ7MXYnIGEyPSdhMnYnIC8+PC9iPjx4Lz4iICsKKyAgICAgICAgICAgICI8eT5Tb21lJmx0OyBhbmQgJmd0O3RleHQ8L3k+PC9hPiI7CisgICAgICAgIHJlYWRlcjEgPSBuZXcgU3RyaW5nUmVhZGVyKHMpOworICAgICAgICByZWFkZXIyID0gbmV3IFN0cmluZ1JlYWRlcihzKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRlciAuLi4gaW4gbWFpbjMiKTsKKyAgICAgICAgWG1sU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBYcHBYbWxTdHJlYW1JbXBsKHJlYWRlcjEpOworICAgICAgICBYTUxJbnB1dFN0cmVhbSBteVN0cmVhbSA9IFhtbFN0cmVhbUZhY3RvcnkuCisgICAgICAgICAgICAgICAgY3JlYXRlWG1sSW5wdXRTdHJlYW0oIHNvdXJjZSApOworCisgICAgICAgIC8vWE1MSW5wdXRTdHJlYW0gYmFiZWxTdHJlYW0gPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KKyAgICAgICAgLy8gICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyMik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJteVN0cmVhbSAuLi4iKTsKKyAgICAgICAgZm9yKGludCBpPTA7IG15U3RyZWFtLmhhc05leHQoKSAmJiBpPDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXk6ICIgKyAiICciICsKKyAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArICIgJyIgKworICAgICAgICAgICAgLy8gICAgICAgIGJhYmVsU3RyZWFtLm5leHQoKSArICInIik7CisgICAgICAgIH0KKworICAgICAgICBYTUxJbnB1dFN0cmVhbSBteXNzID0gbXlTdHJlYW0uZ2V0U3ViU3RyZWFtKCk7CisgICAgICAgIC8vWE1MSW5wdXRTdHJlYW0gYmJzcyA9IGJhYmVsU3RyZWFtLmdldFN1YlN0cmVhbSgpOworCisgICAgICAgIGZvcihpbnQgaT0wOyBteXNzLmhhc05leHQoKSAmJiBpPDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibXkgU1VCU3RyZWFtOiAiICsgIiAnIiArCisgICAgICAgICAgICAgICAgICAgIG15c3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCAiYmIgU1VCU3RyZWFtOiAiICsgIiAnIiArCisgICAgICAgICAgICAvLyAgICAgICAgYmJzcy5uZXh0KCkgKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgWE1MSW5wdXRTdHJlYW0gbXlzczIgPSBteXNzLmdldFN1YlN0cmVhbSgpOworICAgICAgICAvL1hNTElucHV0U3RyZWFtIGJic3MyID0gbXlzcy5nZXRTdWJTdHJlYW0oKTsKKyAgICAgICAgZm9yKDsgbXlzczIuaGFzTmV4dCgpIDspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFN1YlNVQlN0cmVhbSAyOiAiICsKKyAgICAgICAgICAgICAgICAgICAgIiAnIiArIG15c3MyLm5leHQoKSArICInIik7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiIFN1YlNVQlN0cmVhbSAyOiAiICsKKyAgICAgICAgICAgIC8vICAgICAgICAiICciICsgYmJzczIubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBteXNzMi5jbG9zZSgpOworICAgICAgICAvL2Jic3MyLmNsb3NlKCk7CisKKyAgICAgICAgZm9yKDsgbXlzcy5oYXNOZXh0KCkgLyp8fCBiYnNzLmhhc05leHQoKSovIDspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIm15IFNVQlN0cmVhbTogIiArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBteXNzLm5leHQoKSArICInIik7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbiggImJiIFNVQlN0cmVhbTogIiArICIgJyIgKworICAgICAgICAgICAgLy8gICAgICAgIGJic3MubmV4dCgpICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcig7IG15U3RyZWFtLmhhc05leHQoKSA7KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJteTogIiArICIgJyIgKworICAgICAgICAgICAgICAgICAgICBteVN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oICJiYjogIiArCisgICAgICAgICAgICAgICAgICAgIC8vYmFiZWxTdHJlYW0uaGFzTmV4dCgpICsgIC8vQkFCRUwgYnVnYnVnOiB1bi9jb21tZW50IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9saW5lIHlvdSdsbCBnZXQgZGlmZmVyZW50IGJlaGF2aW9yIGZvciBuZXh0KCkKKyAgICAgICAgICAgIC8vICAgICAgICAiICciICsKKyAgICAgICAgICAgIC8vICAgICAgICBiYWJlbFN0cmVhbS5uZXh0KCkgKyAiJyIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1htbFN0cmVhbUNvbmZvcm1hbmNlLmphdmEgYi92MS90ZXN0L3NyYy9zdHJlYW10ZXN0L1htbFN0cmVhbUNvbmZvcm1hbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmZmExYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3N0cmVhbXRlc3QvWG1sU3RyZWFtQ29uZm9ybWFuY2UuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugc3RyZWFtdGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBvcmcueG1scHVsbC5teHAxLk1YUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLm14cDEuTVhQYXJzZXJDYWNoaW5nU3RyaW5nczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uWE1MRXZlbnQ7CitpbXBvcnQgeG1sZXh0LnhtbC5YcHBBZGFwdG9yOworaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YcHBYbWxTdHJlYW1JbXBsOworaW1wb3J0IG9yZy54bWxwdWxsLnN0cmVhbS5YbWxTdHJlYW1GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQ3Vyc29yOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKKy8qKgorICogICBUZXN0cyB0aGUgY29uZm9ybWFuY2Ugb2YgdGhlIFhNTElucHV0U3RyZWFtIHByb2R1Y2VkIGJ5IFhwcFhtbFN0cmVhbUltcGwuCisgKiAgIEBhdXRob3IgQ2V6YXIgQW5kcmVpCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxTdHJlYW1Db25mb3JtYW5jZQoreworICAgIGZpbmFsIHN0YXRpYyBpbnQgVElNRVMgPSAzMDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmKCBhcmdzLmxlbmd0aD4wICkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYXJnc1swXSk7CisgICAgICAgICAgICBpZiggZi5pc0RpcmVjdG9yeSgpICkKKyAgICAgICAgICAgICAgICBjb21wYXJlRGlyKGYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vY29tcGFyZUZpbGUoZik7CisgICAgICAgICAgICAgICAgcHJpbnRGaWxlKGYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0VGhpcyBhcHAgdGVzdHMgdGhlIGNvbmZvcm1hbmNlIG9mIHRoZSB0d28gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWE1MSW5wdXRTdHJlYW0gXG5cdHByb2R1Y2VkIGJ5IEJhYmVsIHBhcnNlciBhbmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWHBwMyBwYXJzZXIuIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblx0VVNBR0U6IGphdmEgLi4uIHRlc3QuWG1sU3RyZWFtQ29uZm9ybWFuY2UgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyfGZpbGUiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRkaXJcdFx0TWFrZXMgdGhlIHRlc3QgZm9yIGFsbCB0aGUgZmlsZXMgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGRpci4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0ZmlsZVx0XHRNYWtlcyB0aGUgdGVzdCBvbmx5IGZvciB0aGF0IGZpbGUuIik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgY29tcGFyZUZpbGUoRmlsZSBmaWxlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiIHNpemU6ICIgKyBmaWxlLmxlbmd0aCgpKTsKKworICAgICAgICBpZighZmlsZS5pc0ZpbGUoKSkKKyAgICAgICAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiY29tcGFyZUZpbGU6IGZpbGUgbm90IGEgRmlsZSIpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFJlYWRlciByMSA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOworICAgICAgICBSZWFkZXIgcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKworICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSBYbWxTdHJlYW1GYWN0b3J5LgorICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIyKSk7CisgICAgICAgIFhNTElucHV0U3RyZWFtIGJhYmVsID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCisgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyMSk7CisKKyAgICAgICAgd2hpbGUoIHhwcC5oYXNOZXh0KCkgfHwgYmFiZWwuaGFzTmV4dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgWE1MRXZlbnQgeHBwZXZlbnQgPSB4cHAucGVlaygpOworICAgICAgICAgICAgWE1MRXZlbnQgYmFiZWxldmVudCA9IGJhYmVsLnBlZWsoKTsKKworICAgICAgICAgICAgaWYoICEoIiIreHBwZXZlbnQpLmVxdWFscygoIiIrYmFiZWxldmVudCkpICkKKyAgICAgICAgICAgICAgICBwcmludEVycm9yKHhwcGV2ZW50LCBiYWJlbGV2ZW50KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiICAgYCIgKyB4cHBldmVudCArICInXG4gICBgIiArIGJhYmVsZXZlbnQgKworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICInIik7IFN5c3RlbS5vdXQuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeHBwZXZlbnQgPSB4cHAubmV4dCgpOworICAgICAgICAgICAgYmFiZWxldmVudCA9IGJhYmVsLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICB4cHAgICBvdmVybGltaXQ6ICIgKyB4cHAubmV4dCgpICk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIgICBiYWJlbCBvdmVybGltaXQ6ICIgKyBiYWJlbC5uZXh0KCkgKTsKKworICAgICAgICByMS5jbG9zZSgpOworICAgICAgICByMi5jbG9zZSgpOworCisgICAgICAgIC8vY29tcGFyZVBlcmYoZmlsZSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJpbnRGaWxlKEZpbGUgZmlsZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIiBzaXplOiAiICsgZmlsZS5sZW5ndGgoKSk7CisKKyAgICAgICAgaWYoIWZpbGUuaXNGaWxlKCkpCisgICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oImNvbXBhcmVGaWxlOiBmaWxlIG5vdCBhIEZpbGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBSZWFkZXIgcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKworICAgICAgICBYTUxJbnB1dFN0cmVhbSB4cHAgPSBYbWxTdHJlYW1GYWN0b3J5LgorICAgICAgICAgICAgICAgIGNyZWF0ZVhtbElucHV0U3RyZWFtKG5ldyBYcHBYbWxTdHJlYW1JbXBsKHIyKSk7CisgICAgICAgIFhNTElucHV0U3RyZWFtIG1vcnBoZWRTdHJlYW07CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHhxdWVyeSIpOworICAgICAgICAgICAgWG1sT2JqZWN0IHhtbE9iaiA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhwcCk7CisgICAgICAgICAgICBYbWxDdXJzb3IgY3JzID0geG1sT2JqLm5ld0N1cnNvcigpOworICAgICAgICAgICAgWG1sQ3Vyc29yIHJlc0NycyA9IGNycy5leGVjUXVlcnkoIiR0aGlzIik7CisgICAgICAgICAgICAvLyBub3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgICAgICAvL21vcnBoZWRTdHJlYW0gPSByZXNDcnMubmV3WE1MSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSByZXNDcnMubmV3UmVhZGVyKCk7CisgICAgICAgICAgICByZWFkZXIgPSByZXNDcnMubmV3UmVhZGVyKCk7CisgICAgICAgICAgICBtb3JwaGVkU3RyZWFtID0gWE1MSW5wdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKCkuCisgICAgICAgICAgICAgICAgbmV3SW5wdXRTdHJlYW0ocmVhZGVyKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi4uLiIpOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIG1vcnBoZWRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgeHBwID0gbW9ycGhlZFN0cmVhbTsKKworICAgICAgICB3aGlsZSggeHBwLmhhc05leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhNTEV2ZW50IHhwcGV2ZW50ID0geHBwLnBlZWsoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBgIiArIHhwcGV2ZW50ICsgIiciKTsgU3lzdGVtLm91dC5mbHVzaCgpOworICAgICAgICAgICAgeHBwZXZlbnQgPSB4cHAubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcjIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBwcmludEVycm9yKFhNTEV2ZW50IHhwcGV2ZW50LCBYTUxFdmVudCBiYWJlbGV2ZW50KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHN4cHAgPSAiIit4cHBldmVudDsKKyAgICAgICAgU3RyaW5nIHNiYWIgPSAiIitiYWJlbGV2ZW50OworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRVJST1ItLS0tLSIpOworICAgICAgICBpZiggIXN4cHAudHJpbSgpLmVxdWFscyhzYmFiLnRyaW0oKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInhwcCAgIDpgIiArIHN4cHAgKyAiJyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiYmFiZWwgOmAiICsgc2JhYiArICInIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ4cHAgICA6Iik7CisgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxzeHBwLmxlbmd0aCgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpc3hwcC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICMiICsgYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJcbmJhYmVsIDoiKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHNiYWIubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSlzYmFiLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIyIgKyBiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuLS0tLS0tLS0tLSIpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNvbXBhcmVEaXIoRmlsZSBkaXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmKCFkaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNvbXBhcmVEaXI6IGRpciBub3QgYSBEaXJlY3RvcnkiKTsKKworICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxmaWxlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGNvbXBhcmVGaWxlKGZpbGVzW2ldKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjb21wYXJlUGVyZihGaWxlIGZpbGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgc3RhcnQ7CisgICAgICAgIGRvdWJsZSB4c3RpbWUgPSAwOworICAgICAgICBkb3VibGUgeHJ0aW1lID0gMDsKKyAgICAgICAgZG91YmxlIGJhYmVsdGltZSA9IDA7CisKKyAgICAgICAgLy9iYWJlbAorICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICAgICAgWE1MSW5wdXRTdHJlYW0gYmFiZWwgPSBYTUxJbnB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KKyAgICAgICAgICAgICAgICBuZXdJbnB1dFN0cmVhbShyKTsKKyAgICAgICAgICAgIHdoaWxlKCBiYWJlbC5oYXNOZXh0KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhNTEV2ZW50IGJhYmVsZXZlbnQgPSBiYWJlbC5wZWVrKCk7CisgICAgICAgICAgICAgICAgYmFiZWxldmVudCA9IGJhYmVsLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhYmVsdGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OworICAgICAgICAgICAgci5jbG9zZSgpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCIuIik7CisgICAgICAgIH0KKworICAgICAgICAvL3hwcCB3aXRoIGRpcmVjdCBhY2NlcyB0byB0aGUgeHBwIHBhcnNlcgorICAgICAgICBmb3IoIGludCBpPTA7IGk8VElNRVM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICAgICAgTVhQYXJzZXIgeHBwID0gKE1YUGFyc2VyKSBuZXcgTVhQYXJzZXJDYWNoaW5nU3RyaW5ncygpOworICAgICAgICAgICAgeHBwLnNldEZlYXR1cmUoIE1YUGFyc2VyLkZFQVRVUkVfUFJPQ0VTU19OQU1FU1BBQ0VTLCB0cnVlKTsKKyAgICAgICAgICAgIHhwcC5zZXRJbnB1dCggciApOworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IHhwcC5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlICggZXZlbnRUeXBlICE9IHhwcC5FTkRfRE9DVU1FTlQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHhwcC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhydGltZSArPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0OworICAgICAgICAgICAgci5jbG9zZSgpOworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50KCInIik7CisgICAgICAgIH0KKworICAgICAgICAvL3hwcCB3aXRoIFhwcFhtbFN0cmVhbUltcGwKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPFRJTUVTOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IEZpbGVSZWFkZXIoZmlsZSkpOworICAgICAgICAgICAgLy9YTUxJbnB1dFN0cmVhbSB4cHAgPSBuZXcgWHBwQWRhcHRvcigpLmdldFN0cmVhbShyMik7CisgICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICAgICAgWE1MSW5wdXRTdHJlYW0geHBwID0gKFhNTElucHV0U3RyZWFtKSBuZXcgWHBwWG1sU3RyZWFtSW1wbChyKTsKKworICAgICAgICAgICAgd2hpbGUoIHhwcC5oYXNOZXh0KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhNTEV2ZW50IHhwcGV2ZW50ID0geHBwLnBlZWsoKTsKKyAgICAgICAgICAgICAgICB4cHBldmVudCA9IHhwcC5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4c3RpbWUgKz0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydDsKKyAgICAgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludCgiYCIpOworICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQRVJGOiAgYmFiZWwveHBwSVMgPSAiICsgZGVjKGJhYmVsdGltZS94c3RpbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXHRiYWJlbC94cHBSYXcgPSAiICsgZGVjKGJhYmVsdGltZS94cnRpbWUpICk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBkZWMoIGRvdWJsZSBmKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgKChkb3VibGUpTWF0aC5yb3VuZChmKjEwMCkpLzEwMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy9zdHNzY2hlbWEvc3RzLnhzZCBiL3YxL3Rlc3Qvc3JjL3N0c3NjaGVtYS9zdHMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWNlMzAKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy9zdHNzY2hlbWEvc3RzLnhzZApAQCAtMCwwICsxLDYyIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICB4bWxuczpzdHM9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8yMDA0LzAyL3htbGJlYW4vaW50ZXJuYWwvc29hcC10ZXN0LXNjcmlwdCIKKyAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvMjAwNC8wMi94bWxiZWFuL2ludGVybmFsL3NvYXAtdGVzdC1zY3JpcHQiCisgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICBibG9ja0RlZmF1bHQ9IiNhbGwiPgorICAKKworPHhzOmVsZW1lbnQgbmFtZT0ic29hcC10ZXN0LXNjcmlwdCI+CisgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InN0czpyZXF1ZXN0U3BlYyIvPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJldmVudCIgdHlwZT0ic3RzOmV2ZW50U3BlYyIvPgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbGwiIHR5cGU9InN0czpzZXRPZkV2ZW50cyIvPgorICAgICAgPC94czpjaG9pY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzOmludCIvPgorICA8L3hzOmNvbXBsZXhUeXBlPgorPC94czplbGVtZW50PgorCis8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2V0T2ZFdmVudHMiPgorICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgIDx4czplbGVtZW50IG5hbWU9ImV2ZW50IiB0eXBlPSJzdHM6ZXZlbnRTcGVjIi8+CisgIDwveHM6Y2hvaWNlPgorPC94czpjb21wbGV4VHlwZT4KKworPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVlc3RTcGVjIj4KKyAgPHhzOnNlcXVlbmNlPgorICAgIDx4czplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHM6YW55VVJJIi8+CisgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RhcnQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY29udGludWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y2hvaWNlPgorICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDx4czplbGVtZW50IG5hbWU9ImV4cGVjdCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KKyAgPC94czpzZXF1ZW5jZT4KKzwveHM6Y29tcGxleFR5cGU+CisKKzx4czpjb21wbGV4VHlwZSBuYW1lPSJldmVudFNwZWMiPgorICA8eHM6c2VxdWVuY2U+CisgICAgPHhzOmNob2ljZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpbmlzaCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjaG9pY2U+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iZXhwZWN0IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgorICAgIDx4czplbGVtZW50IG5hbWU9InNlbmQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+CisgIDwveHM6c2VxdWVuY2U+Cis8L3hzOmNvbXBsZXhUeXBlPgorCisKKzwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2Zjc0MgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3Rlc3RzdG9yZS9jb20vYmVhL3Rlc3QvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYmVhLnRlc3Q7CisKK2ltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLnBhcnNlci5YU0RQYXJzZXJGYWN0b3J5OworaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwucGFyc2VyLlhTRFBhcnNlcjsKK2ltcG9ydCB3ZWJsb2dpYy54bWwuc2NoZW1hLm1vZGVsLlNjaGVtYURvY3VtZW50OworaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwuWFNEU2NoZW1hOworaW1wb3J0IHdlYmxvZ2ljLnhtbC5zY2hlbWEubW9kZWwuWFNERXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMueG1sLnN0cmVhbS5YTUxJbnB1dFN0cmVhbUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnhtbC5zdHJlYW0uZXZlbnRzLk5hbWU7CisKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCB4bWwudXRpbC5TY2hlbWFUeXBlOworaW1wb3J0IHhtbC51dGlsLlNjaGVtYVR5cGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zY2hlbWEuU2NoZW1hVHlwZVN5c3RlbUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5zY2hlbWEuU2NoZW1hVHlwZUNvZGVQcmludGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudG9vbC5Db21tYW5kTGluZTsKK2ltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuU2ltcGxpY2l0eTsKK2ltcG9ydCBvcmcub3BlbnVyaS5teXRlc3QuUGVyc29uOworCitwdWJsaWMgY2xhc3MgVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICAvKgorICAgICAgICBDb21tYW5kTGluZSBjbCA9IG5ldyBDb21tYW5kTGluZShhcmdzLCBudWxsKTsKKyAgICAgICAgWFNEUGFyc2VyIHhzZHBhcnNlciA9IFhTRFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYU0RQYXJzZXIoKTsKKyAgICAgICAgWE1MSW5wdXRTdHJlYW1GYWN0b3J5IHhtbHBhcnNlciA9IFhNTElucHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBib29sZWFuIHNpbXBsZXRlc3QgPSBmYWxzZTsKKworICAgICAgICBTY2hlbWFUeXBlU3lzdGVtQnVpbGRlciBidWlsZGVyID0gbmV3IFNjaGVtYVR5cGVTeXN0ZW1CdWlsZGVyKCJ0ZXN0Iik7CisKKyAgICAgICAgYXJncyA9IGNsLmFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWFkZXIgaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICBTY2hlbWFEb2N1bWVudCBzZG9jID0geHNkcGFyc2VyLnBhcnNlU2NoZW1hKHhtbHBhcnNlci5uZXdJbnB1dFN0cmVhbShpbnB1dCkpOworICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzID0gc2RvYy5nZXRTY2hlbWEoKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEFsbENvbXBvbmVudHMocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgIiArIGFyZ3NbaV0gKyAiOlxuIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgcGFyc2luZyBmaWxlICIgKyBhcmdzW2ldICsgIjpcbiIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYU0RFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHBhcnNpbmcgc2NoZW1hIGZpbGUgIiArIGFyZ3NbaV0gKyAiOlxuIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVpbGRlci5yZXNvbHZlQWxsVHlwZXMoKTsKKyAgICAgICAgYnVpbGRlci5qYXZhaXplQWxsVHlwZXMoKTsKKworICAgICAgICAvLyBPSywgaGVyZSB3ZSBnbworCisgICAgICAgIFNjaGVtYVR5cGVbXSBndHlwZXMgPSBidWlsZGVyLmdsb2JhbFR5cGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3R5cGVzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTY2hlbWFUeXBlIHR5cGUgPSBndHlwZXNbaV07CisKKyAgICAgICAgICAgIC8vIHByaW50IG9ubHkgdHlwZXMgaW4gdGhpcyB0eXBlIHN5c3RlbQorICAgICAgICAgICAgaWYgKCF0eXBlLmdldFNjaGVtYVR5cGVTeXN0ZW0oKS5lcXVhbHMoYnVpbGRlcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUHJpbnRpbmcgdHlwZSIpOworICAgICAgICAgICAgICAgIFNjaGVtYVR5cGVDb2RlUHJpbnRlci5wcmludFR5cGUobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSwgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklPIEVycm9yICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIGJvb2xlYW4gc2ltcGxldGVzdCA9IGZhbHNlOworCisgICAgICAgIGlmIChzaW1wbGV0ZXN0KQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0U3RvcmUgc3RvcmUgPSBuZXcgVGVzdFN0b3JlKG9yZy5vcGVudXJpLm15dGVzdC5TaW1wbGVEb2N1bWVudC50eXBlKTsKKyAgICAgICAgICAgIFRlc3RTdG9yZS5DdXJzb3IgY3Vyc29yID0gc3RvcmUubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiR290IHN0b3JlLCBmaWxsaW5nIGl0IGluLi4uIik7CisgICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAic2ltcGxlIikpOworICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgY3Vyc29yLnNldEF0dHJpYnV0ZShuZXcgTmFtZShudWxsLCAibm90ZSIpLCAiYSBzbWFsbGlzaCBudW1iZXIiKTsKKyAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxNDMiKTsKKyAgICAgICAgICAgIGN1cnNvci50b1Jvb3QoKTsKKyAgICAgICAgICAgIGN1cnNvci50b0ZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIFNpbXBsaWNpdHkgc2ltcCA9IChTaW1wbGljaXR5KWN1cnNvci5vYmooKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIHZhbHVlIG9mIHNpbXBsaWNpdHk6ICIgKyBzaW1wLmludFZhbHVlKCkpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJBbmQgYSBub3RlOiAiICsgc2ltcC5nZXROb3RlKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFN0b3JlIHN0b3JlID0gbmV3IFRlc3RTdG9yZShvcmcub3BlbnVyaS5teXRlc3QuQ3VzdG9tZXJEb2N1bWVudC50eXBlKTsKKyAgICAgICAgICAgIFRlc3RTdG9yZS5DdXJzb3IgY3Vyc29yID0gc3RvcmUubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkdvdCBzdG9yZSwgZmlsbGluZyBpdCBpbi4uLiIpOworICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImN1c3RvbWVyIikpOworICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImZpcnN0bmFtZSIpKTsKKyAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7CisgICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAibnVtYmVyIikpOworICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgImJpcnRoZGF5IikpOworICAgICAgICAgICAgY3Vyc29yLmFkZENoaWxkKG5ldyBOYW1lKCJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IiwgIm51bWJlciIpKTsKKyAgICAgICAgICAgIGN1cnNvci5hZGRDaGlsZChuZXcgTmFtZSgiaHR0cDovL29wZW51cmkub3JnL215dGVzdCIsICJudW1iZXIiKSk7CisgICAgICAgICAgICBjdXJzb3IuYWRkQ2hpbGQobmV3IE5hbWUoImh0dHA6Ly9vcGVudXJpLm9yZy9teXRlc3QiLCAiYmlydGhkYXkiKSk7CisgICAgICAgICAgICBjdXJzb3IudG9GaXJzdENoaWxkKCk7CisgICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiSG93ZHkiKTsKKyAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKKyAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCI0MzYiKTsKKyAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKKyAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxMjMiKTsKKyAgICAgICAgICAgIGN1cnNvci50b05leHQoKTsKKyAgICAgICAgICAgIGN1cnNvci5zZXRUZXh0KCIxOTk4LTA4LTI2WiIpOworICAgICAgICAgICAgY3Vyc29yLnRvTmV4dCgpOworICAgICAgICAgICAgY3Vyc29yLnNldFRleHQoIjQ0Iik7CisgICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7CisgICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiOTMzIik7CisgICAgICAgICAgICBjdXJzb3IudG9OZXh0KCk7CisgICAgICAgICAgICBjdXJzb3Iuc2V0VGV4dCgiMjAwMC0wOC0wNi0wODowMCIpOworICAgICAgICAgICAgY3Vyc29yLnRvUm9vdCgpOworICAgICAgICAgICAgY3Vyc29yLnRvRmlyc3RDaGlsZCgpOworICAgICAgICAgICAgUGVyc29uIHBlcnNvbiA9IChQZXJzb24pY3Vyc29yLm9iaigpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0Rmlyc3RuYW1lKCkgPSAiICsgcGVyc29uLmdldEZpcnN0bmFtZSgpKTsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJzb24uY291bnRPZk51bWJlcigpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0TnVtYmVyKCIgKyBpICsiKSA9ICIgKyBwZXJzb24uZ2V0TnVtYmVyKGkpKTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gcGVyc29uLmdldE51bWJlcihpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigic3VtIG9mIG51bWJlcnMgPSAiICsgc3VtKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc29uLmNvdW50T2ZCaXJ0aGRheSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24uZ2V0QmlydGhkYXkoIiArIGkgKyIpID0gIiArIHBlcnNvbi5nZXRCaXJ0aGRheShpKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQZXJzb24ueGdldEJpcnRoZGF5KCIgKyBpICsiKSA9ICIgKyBwZXJzb24ueGdldEJpcnRoZGF5KGkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBlcnNvbi54Z2V0QmlydGhkYXkoIiArIGkgKyIpLmdEYXRlVmFsdWUoKS5nZXREYXkoKSA9ICIgKyBwZXJzb24ueGdldEJpcnRoZGF5KGkpLmdEYXRlVmFsdWUoKS5nZXREYXkoKSk7CisgICAgICAgICAgICAgICAgc3VtICs9IHBlcnNvbi5nZXROdW1iZXIoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNldHRpbmcgZmlyc3RuYW1lIHRvIEdlb3JnZSIpOworICAgICAgICAgICAgcGVyc29uLnNldEZpcnN0bmFtZSgiR2VvcmdlIik7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBlcnNvbi5nZXRGaXJzdG5hbWUoKSA9ICIgKyBwZXJzb24uZ2V0Rmlyc3RuYW1lKCkpOworICAgICAgICAgICAgU3lzdGVtLmVyci5mbHVzaCgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RTdG9yZS5qYXZhIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM3MjliCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0U3RvcmUuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmJlYS50ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy52YWx1ZXMuVHlwZVN0b3JlVXNlckZhY3Rvcnk7CitpbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZVN5c3RlbTsKK2ltcG9ydCB4bWwudXRpbC5YbWxPYmplY3Q7CitpbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgVGVzdFN0b3JlCit7CisgICAgVGVzdFR5cGVTdG9yZSBfcm9vdDsKKworICAgIHB1YmxpYyBUZXN0U3RvcmUoU2NoZW1hVHlwZSByb290VHlwZSkKKyAgICB7CisgICAgICAgIF9yb290ID0gbWFrZVJvb3RTdG9yZShyb290VHlwZSk7CisgICAgfQorCisgICAgQ3Vyc29yIG5ld0N1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEN1cnNvcigpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDdXJzb3IKKyAgICB7CisgICAgICAgIFRlc3RUeXBlU3RvcmUgX2N1cnBvcyA9IF9yb290OworICAgICAgICBpbnQgX2N1ckluZGV4ID0gMDsKKworICAgICAgICBwdWJsaWMgWG1sT2JqZWN0IG9iaigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoWG1sT2JqZWN0KV9jdXJwb3MuX3VzZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2N1cnBvcy5fcGFyZW50ICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b1Jvb3QoKQorICAgICAgICB7CisgICAgICAgICAgICBfY3VycG9zID0gX3Jvb3Q7CisgICAgICAgICAgICBfY3VySW5kZXggPSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b1BhcmVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzUGFyZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgX2N1cnBvcyA9IF9jdXJwb3MuX3BhcmVudDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3VycG9zLl9wYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX2N1ckluZGV4ICsgMSA8IF9jdXJwb3MuX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b05leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBfY3VySW5kZXgrKzsKKyAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9wYXJlbnQuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KF9jdXJJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRvUHJldigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzUHJldigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIF9jdXJJbmRleC0tOworICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoX2N1ckluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3VycG9zLl9wYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoX2N1ckluZGV4IC0gMSA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSA+IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b0ZpcnN0Q2hpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc0NoaWxkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgX2N1ckluZGV4ID0gMDsKKyAgICAgICAgICAgIF9jdXJwb3MgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChfY3VySW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0b0xhc3RDaGlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBfY3VySW5kZXggPSBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSAtIDE7CisgICAgICAgICAgICBfY3VycG9zID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5nZXQoX2N1ckluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdG9DaGlsZE5hbWVkKFhNTE5hbWUgbmFtZSwgaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc0NoaWxkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaW50IHRhcmdldGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJJbmRleCA9IHRhcmdldGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnBvcyA9IHN0b3JlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFyZ2V0aW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHRvQ2hpbGRBdChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIF9jdXJJbmRleCA9IGluZGV4OworICAgICAgICAgICAgX2N1cnBvcyA9IChUZXN0VHlwZVN0b3JlKV9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRBdChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzQ2hpbGQoKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSB0YXJnZXQgPSAoVGVzdFR5cGVTdG9yZSlfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChpbmRleCk7CisgICAgICAgICAgICB0YXJnZXQuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5yZW1vdmUoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGRBdChpbnQgaW5kZXgsIFhNTE5hbWUgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9PSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPiAwIDogaW5kZXggPiBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLnNpemUoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgX2N1cnBvcy5fdGV4dExlYWZDb250ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCisgICAgICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuYWRkKGluZGV4LCBfY3VycG9zLm1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoWE1MTmFtZSBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBfY3VycG9zLl90ZXh0TGVhZkNvbnRlbnQgPSBudWxsOworICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5hZGQoX2N1cnBvcy5tYWtlTmV3Q2hpbGQobmFtZSwgZmFsc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY291bnRDaGlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShYTUxOYW1lIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfY3VycG9zLl9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBhdHRyID0gKFRlc3RUeXBlU3RvcmUpX2N1cnBvcy5fY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBhdHRyLl90ZXh0TGVhZkNvbnRlbnQ7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAiIiA6IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQXR0cmlidXRlKFhNTE5hbWUgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShYTUxOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgYXR0ciA9IF9jdXJwb3MubWFrZU5ld0NoaWxkKG5hbWUsIHRydWUpOworCisgICAgICAgICAgICBhdHRyLl90ZXh0TGVhZkNvbnRlbnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIF9jdXJwb3MuX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5wdXQobmFtZSwgYXR0cik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jdXJwb3MuX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfY3VycG9zLl9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9jdXJwb3MuX3RleHRMZWFmQ29udGVudCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2N1cnBvcy5fY2hpbGRFbGVtZW50VHlwZVN0b3JlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgLy8gaW4gcHJhY3RpY2UgcGVyaGFwcyB3ZSB3YW50IHRvIGNvbmNhdGVuYXRlIGZsYXR0ZW5lZCBzdHJpcHBlZCB0ZXh0CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gX2N1cnBvcy5fdGV4dExlYWZDb250ZW50OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gIiIgOiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBDdXJzb3IgbmV3Q3Vyc29yKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ3Vyc29yIHJlc3VsdCA9IG5ldyBDdXJzb3IoKTsKKyAgICAgICAgICAgIHJlc3VsdC5fY3VySW5kZXggPSBfY3VySW5kZXg7CisgICAgICAgICAgICByZXN1bHQuX2N1cnBvcyA9IF9jdXJwb3M7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXN0VHlwZVN0b3JlIG1ha2VSb290U3RvcmUoU2NoZW1hVHlwZSByb290VHlwZSkKKyAgICB7CisgICAgICAgIFRlc3RUeXBlU3RvcmUgcmVzdWx0ID0gbmV3IFRlc3RUeXBlU3RvcmUoKTsKKyAgICAgICAgcmVzdWx0Ll9wYXJlbnQgPSBudWxsOworICAgICAgICByZXN1bHQuX25hbWUgPSBudWxsOworICAgICAgICByZXN1bHQuX2lzQXR0cmlidXRlID0gZmFsc2U7CisgICAgICAgIHJlc3VsdC5fdXNlciA9ICgoVHlwZVN0b3JlVXNlckZhY3Rvcnkpcm9vdFR5cGUpLmNyZWF0ZVR5cGVTdG9yZVVzZXIoKTsKKyAgICAgICAgaWYgKHJlc3VsdC5fdXNlciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICByZXN1bHQuX3VzZXIuYXR0YWNoX3N0b3JlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0VHlwZVN0b3JlLmphdmEgYi92MS90ZXN0L3NyYy90ZXN0c3RvcmUvY29tL2JlYS90ZXN0L1Rlc3RUeXBlU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQzODVjCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMvdGVzdHN0b3JlL2NvbS9iZWEvdGVzdC9UZXN0VHlwZVN0b3JlLmphdmEKQEAgLTAsMCArMSw0NTQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5iZWEudGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnZhbHVlcy5UeXBlU3RvcmVVc2VyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudmFsdWVzLlR5cGVTdG9yZVZpc2l0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTE5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgeG1sLnV0aWwuU2NoZW1hVHlwZTsKK2ltcG9ydCB4bWwudXRpbC5RTmFtZVNldDsKK2ltcG9ydCB4bWwudXRpbC5YbWxDdXJzb3I7CisKK3B1YmxpYyBjbGFzcyBUZXN0VHlwZVN0b3JlIGltcGxlbWVudHMgVHlwZVN0b3JlCit7CisgICAgVGVzdFR5cGVTdG9yZSBfcGFyZW50OworICAgIFR5cGVTdG9yZVVzZXIgX3VzZXI7CisgICAgWE1MTmFtZSBfbmFtZTsKKyAgICBib29sZWFuIF9pc0F0dHJpYnV0ZTsKKyAgICBib29sZWFuIF9pc05pbDsKKyAgICBTdHJpbmcgX3RleHRMZWFmQ29udGVudDsKKyAgICBMaXN0IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzOworICAgIE1hcCBfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzOworCisgICAgcHVibGljIFhtbEN1cnNvciBuZXdfY3Vyc29yKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlX3RleHQoVHlwZVN0b3JlVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGZldGNoX3RleHQoaW50IHdoaXRlc3BhY2VSdWxlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCFoYXNFbGVtZW50cygpKTsKKyAgICAgICAgcmV0dXJuIF90ZXh0TGVhZkNvbnRlbnQgPT0gbnVsbCA/ICIiIDogYXBwbHlfd3NyKF90ZXh0TGVhZkNvbnRlbnQsIHdoaXRlc3BhY2VSdWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZV90ZXh0KFR5cGVTdG9yZVVzZXIgdXNlciwgU3RyaW5nIHRleHQpCisgICAgeworICAgICAgICBhc3NlcnQoIWhhc0VsZW1lbnRzKCkpOworICAgICAgICBfdGV4dExlYWZDb250ZW50ID0gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZXJlIHRoZSBUeXBlU3RvcmUgaXMgcmVzcG9uc2libGUgZm9yIGxvY2F0aW5nIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAqIFRoaXMgaXMgZG9uZSBhcyBmb2xsb3dzCisgICAgICogKDEpIGdvIHRvIHRoZSBwYXJlbnQgVHlwZVN0b3JlVXNlcgorICAgICAqICgyKSBhc2sgaXQgdG8gZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KHFuYW1lKSAob3IgX2F0dHJpYnV0ZV8pLCBhbmQgcmV0dXJuIGl0IGlmIG5vdCBudWxsLgorICAgICAqICgyKSBvdGhlcndpc2UsIGdyYWIgYSBuZXcgVHlwZVN0b3JlVXNlclZpc2l0b3IgdmlhIHYgPSBwYXJlbnR1c2VyLm5ld192aXNpdG9yKCk7CisgICAgICogKDMpIGNhbGwgdi52aXNpdChuYW1lKSBvbiBfZXZlcnlfIGVsZW1lbnQgcW5hbWUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIG9uZSBpbiBvcmRlcgorICAgICAqICg0KSByZXR1cm4gdGhlIHJlc3VsdCBvZiB2LmdldF9kZWZhdWx0X3RleHQoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXB1dGVfZGVmYXVsdF90ZXh0KCkKKyAgICB7CisgICAgICAgIGlmIChfcGFyZW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIFN0cmluZyBkZWZ0ZXh0ID0KKyAgICAgICAgICAgIF9pc0F0dHJpYnV0ZSA/IF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfYXR0cmlidXRlX3RleHQoX25hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJlbnQuX3VzZXIuZ2V0X2RlZmF1bHRfZWxlbWVudF90ZXh0KF9uYW1lKTsKKyAgICAgICAgaWYgKGRlZnRleHQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yID0gX3BhcmVudC5fdXNlci5uZXdfdmlzaXRvcigpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX3BhcmVudC5fY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc2libGluZyA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOworICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXQoc2libGluZy5fbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IuZ2V0X2RlZmF1bHRfdGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZ0ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcHV0ZV9lbGVtZW50ZmxhZ3MoKQorICAgIHsKKyAgICAgICAgaWYgKF9wYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgIGlmIChfaXNBdHRyaWJ1dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWdzID0gX3BhcmVudC5fdXNlci5nZXRfYXR0cmlidXRlZmxhZ3MoX25hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmxhZ3MgPSBfcGFyZW50Ll91c2VyLmdldF9lbGVtZW50ZmxhZ3MoX25hbWUpOworICAgICAgICAgICAgaWYgKGZsYWdzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFR5cGVTdG9yZVZpc2l0b3IgdmlzaXRvciA9IF9wYXJlbnQuX3VzZXIubmV3X3Zpc2l0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfcGFyZW50Ll9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHNpYmxpbmcgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdChzaWJsaW5nLl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgPT0gdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmdldF9lbGVtZW50ZmxhZ3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKSA6ICJJbnZhcmlhbnQgZXJyb3I6IHBhcmVudCBkb2Vzbid0IGhhdmUgdGhpcyBhcyBjaGlsZC4iOworICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZV9uaWwoVHlwZVN0b3JlVXNlciB1c2VyKQorICAgIHsKKyAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBkb25lIGxhdGVyCisgICAgICAgIF9pc05pbCA9IF91c2VyLmJ1aWxkX25pbCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGZpbmRfbmlsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBfaXNOaWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBmaW5kX3ByZWZpeF9mb3JfbnN1cmkoU3RyaW5nIG5zdXJpLCBTdHJpbmcgc3VnZ2VzdGVkX3ByZWZpeCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgdGVzdCBoYXJuZXNzIGhhcyBubyBuYW1lc3BhY2Ugc3VwcG9ydCIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY291bnRfZWxlbWVudHMoWE1MTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKChUZXN0VHlwZVN0b3JlKWkubmV4dCgpKS5fbmFtZS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2VsZW1lbnRfdXNlcihYTUxOYW1lIG5hbWUsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlc3RUeXBlU3RvcmUgc3RvcmUgPSAoVGVzdFR5cGVTdG9yZSlpLm5leHQoKTsKKworICAgICAgICAgICAgaWYgKHN0b3JlLl9uYW1lLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOworICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsgLy8gbm8gZXhjZXB0aW9uIHBsZWFzZQorICAgIH0KKworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGluc2VydF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lLCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBUeXBlU3RvcmVVc2VyIHRhcmdldCA9IG51bGw7CisgICAgICAgIGludCBpbnNlcnRpbmRleCA9IDA7CisKKyAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxhc3Rmb3VuZGF0ID0gMDsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdGZvdW5kYXQgPSBpbnNlcnRpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnNlcnRpbmRleCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZTsgaW5zZXJ0IHJpZ2h0IGJlZm9yZQorICAgICAgICAgICAgICAgIGluc2VydGluZGV4ID0gbGFzdGZvdW5kYXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpbmRleCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgc2V2ZXJhbDsgdGhhdCdzIGlsbGVnYWwuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGZvdW5kIGFsbCBidXQgbGFzdCBvbmU6IHdlIG11c3QgYmUgYXBwZW5kaW5nLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB3aGVyZSB0byBhcHBlbmQ/CisKKyAgICAgICAgICAgICAgICBRTmFtZVNldCBkZWxpbWl0ZXJzID0gX3BhcmVudC5fdXNlci5nZXRfZWxlbWVudF9lbmRpbmdfZGVsaW1pdGVycyhuYW1lKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW5zZXJ0aW5kZXggPSBsYXN0Zm91bmRhdCArIDE7IGluc2VydGluZGV4IDwgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuc2l6ZSgpOyBpbnNlcnRpbmRleCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKV9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmdldChpbnNlcnRpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJzLmNvbnRhaW5zKHN0b3JlLl9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpbnNlcnRpbmRleCBpcyB3aGVyZXZlciB0aGUgZmlyc3QgZGVsaW1pdGVyIGlzIGZvdW5kCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kLCBpbnNlcnRpbmRleCBpcyBvbmUgcGFzdCB0aGUgZW5kLgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGVzdFR5cGVTdG9yZSBuZXdDaGlsZCA9IG1ha2VOZXdDaGlsZChuYW1lLCBmYWxzZSk7CisgICAgICAgIF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLmFkZChpbnNlcnRpbmRleCwgbmV3Q2hpbGQpOworICAgICAgICByZXR1cm4gbmV3Q2hpbGQuX3VzZXI7CisgICAgfQorCisgICAgVGVzdFR5cGVTdG9yZSBtYWtlTmV3Q2hpbGQoWE1MTmFtZSBuYW1lLCBib29sZWFuIGlzQXR0cmlidXRlKQorICAgIHsKKyAgICAgICAgVGVzdFR5cGVTdG9yZSByZXN1bHQgPSBuZXcgVGVzdFR5cGVTdG9yZSgpOworICAgICAgICByZXN1bHQuX3BhcmVudCA9IHRoaXM7CisgICAgICAgIHJlc3VsdC5fbmFtZSA9IG5hbWU7CisgICAgICAgIHJlc3VsdC5faXNBdHRyaWJ1dGUgPSBpc0F0dHJpYnV0ZTsKKyAgICAgICAgaWYgKGlzQXR0cmlidXRlKQorICAgICAgICAgICAgcmVzdWx0Ll91c2VyID0gX3VzZXIuY3JlYXRlX2F0dHJpYnV0ZV91c2VyKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQuX3VzZXIgPSBfdXNlci5jcmVhdGVfZWxlbWVudF91c2VyKG5hbWUsIG51bGwpOyAvLyBubyB4c2k6dHlwZXMgZm9yIG5vdworICAgICAgICBpZiAocmVzdWx0Ll91c2VyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIHJlc3VsdC5fdXNlci5hdHRhY2hfc3RvcmUocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKQorICAgIHsKKyAgICAgICAgaWYgKF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEVsZW1lbnRUeXBlU3RvcmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOworICAgICAgICAgICAgICAgIHN0b3JlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfY2hpbGRFbGVtZW50VHlwZVN0b3JlcyA9IG51bGw7CisgICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgc3RvcmUuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBudWxsOworICAgICAgICBfdXNlci5kaXNjb25uZWN0X3N0b3JlKCk7CisgICAgICAgIF91c2VyID0gbnVsbDsKKyAgICAgICAgX3BhcmVudCA9IG51bGw7CisgICAgICAgIF9uYW1lID0gbnVsbDsKKyAgICAgICAgX3RleHRMZWFmQ29udGVudCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBmaW5kSW5zZXJ0SW5kZXhCYXNlZE9uT3JkZXIoWE1MTmFtZVtdIG9yZGVyLCBYTUxOYW1lIG5hbWVUb0FkZCkKKyAgICB7CisgICAgICAgIGludCBvcmRlcmluZGV4ID0gMDsKKyAgICAgICAgaW50IGluc2VydGluZGV4ID0gMDsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBfY2hpbGRFbGVtZW50VHlwZVN0b3Jlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpaS5uZXh0KCk7CisgICAgICAgICAgICB3aGlsZSAob3JkZXJpbmRleCA8IG9yZGVyLmxlbmd0aCAmJiAhb3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKHN0b3JlLl9uYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAob3JkZXJbb3JkZXJpbmRleF0uZXF1YWxzKG5hbWVUb0FkZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0aW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9yZGVyaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc2VydGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluc2VydGluZGV4OworICAgIH0KKworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9lbGVtZW50X3VzZXIoWE1MTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc2VydF9lbGVtZW50X3VzZXIobmFtZSwgY291bnRfZWxlbWVudHMobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9lbGVtZW50KFhNTE5hbWUgbmFtZSwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgVHlwZVN0b3JlVXNlciB0YXJnZXQgPSBudWxsOworICAgICAgICBpbnQgcmVtb3ZlaW5kZXggPSAwOworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOworCisgICAgICAgICAgICBpZiAoc3RvcmUuX25hbWUuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMucmVtb3ZlKHJlbW92ZWluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZVN0b3JlVXNlciBmaW5kX2F0dHJpYnV0ZV91c2VyKFhNTE5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIGlmIChfY2hpbGRBdHRyaWJ1dGVUeXBlU3RvcmVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBUZXN0VHlwZVN0b3JlIHN0b3JlID0gKFRlc3RUeXBlU3RvcmUpX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChzdG9yZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIHN0b3JlLl91c2VyOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlU3RvcmVVc2VyIGFkZF9hdHRyaWJ1dGVfdXNlcihYTUxOYW1lIG5hbWUpCisgICAgeworICAgICAgICBpZiAoX2NoaWxkQXR0cmlidXRlVHlwZVN0b3JlcyAhPSBudWxsICYmIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIFRlc3RUeXBlU3RvcmUgbmV3Q2hpbGQgPSBtYWtlTmV3Q2hpbGQobmFtZSwgdHJ1ZSk7CisgICAgICAgIF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMucHV0KG5hbWUsIG5ld0NoaWxkKTsKKyAgICAgICAgcmV0dXJuIG5ld0NoaWxkLl91c2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZV9hdHRyaWJ1dGUoWE1MTmFtZSBuYW1lKQorICAgIHsKKyAgICAgICAgaWYgKF9jaGlsZEF0dHJpYnV0ZVR5cGVTdG9yZXMgPT0gbnVsbCB8fCAhX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgX2NoaWxkQXR0cmlidXRlVHlwZVN0b3Jlcy5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRfZWxlbWVudHMoVHlwZVN0b3JlVmlzaXRvciB2aXNpdG9yKQorICAgIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFR5cGVTdG9yZSBzdG9yZSA9IChUZXN0VHlwZVN0b3JlKWkubmV4dCgpOworICAgICAgICAgICAgdmlzaXRvci52aXNpdChzdG9yZS5fbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlzaXRvci52aXNpdChudWxsKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbGVtZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gX2NoaWxkRWxlbWVudFR5cGVTdG9yZXMgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWxnb3JpdGhtIHVzZWQgYnkgYXBwbHlfd3NjYW5vbjogc29tZXRpbWVzIHVzZWQgaW4gaW1wbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYXBwbHlfd3NyKFN0cmluZyB2LCBpbnQgd3NyKQorICAgIHsKKyAgICAgICAgaWYgKHdzciA9PSBTY2hlbWFUeXBlLldTX1BSRVNFUlZFIHx8IHdzciA9PSBTY2hlbWFUeXBlLldTX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgcmV0dXJuIHY7CisKKyAgICAgICAgaWYgKHYuaW5kZXhPZignXG4nKSA+PSAwKQorICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgnXG4nLCAnICcpOworICAgICAgICBpZiAodi5pbmRleE9mKCdcdCcpID49IDApCisgICAgICAgICAgICB2ID0gdi5yZXBsYWNlKCdcdCcsICcgJyk7CisgICAgICAgIGlmICh2LmluZGV4T2YoJ1xyJykgPj0gMCkKKyAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJ1xyJywgJyAnKTsKKworICAgICAgICBpZiAod3NyID09IFNjaGVtYVR5cGUuV1NfUkVQTEFDRSkKKyAgICAgICAgICAgIHJldHVybiB2OworCisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgaW50IGxlbiA9IHYubGVuZ3RoKCk7CisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB2OworCisgICAgICAgIC8qIGEgdHJpY2s6IGV4YW1pbmUgZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHBhaXJzIG9mIHNwYWNlcyAqLworICAgICAgICBleGFtaW5lOiBpZiAodi5jaGFyQXQoMCkgIT0gJyAnKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAyOyBqIDwgbGVuOyBqICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2LmNoYXJBdChqIC0gMSkgPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gbGVuIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYuY2hhckF0KGopID09ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGV4YW1pbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogPT0gbGVuICYmIHYuY2hhckF0KGogLSAxKSA9PSAnICcpCisgICAgICAgICAgICAgICAgYnJlYWsgZXhhbWluZTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisKKyAgICAgICAgLyogaiBpcyBwb2ludGluZyBhdCB0aGUgZmlyc3Qgd3MgdG8gYmUgcmVtb3ZlZCwgb3IgcGFzdCBlbmQgKi8KKyAgICAgICAgY2hhcltdIGNoID0gdi50b0NoYXJBcnJheSgpOworICAgICAgICBpbnQgaSA9IGo7CisKKyAgICAgICAgc2hpZnRlcjogZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBqIHdhcyB3cyBvciBwYXN0IGVuZCAqLworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7CisgICAgICAgICAgICAgICAgaWYgKGogIT0gJyAnKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaiB3YXMgbm9ud3MgKi8KKyAgICAgICAgICAgICAgICBjaFtpKytdID0gY2hbaisrXTsKKyAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNoaWZ0ZXI7CisgICAgICAgICAgICAgICAgaWYgKGNoW2pdID09ICcgJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoW2krK10gPSBjaFtqKytdOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzaGlmdGVyOworICAgICAgICAgICAgICAgICAgICBpZiAoY2hbal0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2gsIDAsIChpID09IDAgfHwgY2hbaSAtIDFdICE9ICcgJykgPyBpIDogaSAtIDEpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1Rlc3RTdHJ1Y3R1cmUuamF2YSBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVGVzdFN0cnVjdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDA1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy91bm1hcnNoYWwvY29tL2JlYS90ZXN0L1Rlc3RTdHJ1Y3R1cmUuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYmVhLnRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3RydWN0dXJlCit7CisgICAgcHVibGljIGludCB2YXJJbnQ7CisgICAgcHVibGljIGZsb2F0IHZhckZsb2F0OworICAgIHB1YmxpYyBTdHJpbmcgdmFyU3RyaW5nOworfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMvdW5tYXJzaGFsL2NvbS9iZWEvdGVzdC9Vbm1hcnNoYWwuamF2YSBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVW5tYXJzaGFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ZjliNAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3VubWFyc2hhbC9jb20vYmVhL3Rlc3QvVW5tYXJzaGFsLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmJlYS50ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuTWVzc2FnZVBsYW47CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy51bm1hcnNoYWwuVW5tYXJzaGFsUGxhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5TaW1wbGVUeXBlUGxhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLnVubWFyc2hhbC5TdHJ1Y3R1cmVQbGFuOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMudW5tYXJzaGFsLlVubWFyc2hhbENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sQmVhbnM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy54bWwuc3RyZWFtLlhNTElucHV0U3RyZWFtOworCitwdWJsaWMgY2xhc3MgVW5tYXJzaGFsCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWVzc2FnZVBsYW4gbWVzc2FnZVBsYW4gPSBuZXcgTWVzc2FnZVBsYW4oMik7CisKKyAgICAgICAgU2ltcGxlVHlwZVBsYW4gcGFyYW0xUGxhbiA9IG5ldyBTaW1wbGVUeXBlUGxhbihTaW1wbGVUeXBlUGxhbi5KQVZBX0ZMT0FULCB0cnVlLCBTY2hlbWFUeXBlLkJUQ19ET1VCTEUsIG51bGwsIDApOworCisgICAgICAgIFN0cnVjdHVyZVBsYW4gcGFyYW0yUGxhbiA9IG5ldyBTdHJ1Y3R1cmVQbGFuKCk7CisKKyAgICAgICAgcGFyYW0yUGxhbi5zZXRUYXJnZXRDbGFzcyhjb20uYmVhLnRlc3QuVGVzdFN0cnVjdHVyZS5jbGFzcyk7CisgICAgICAgIHBhcmFtMlBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJ2YXJJbnQiKSwgbmV3IFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvKCJ2YXJJbnQiLCBmYWxzZSwgImNvbS5iZWEudGVzdC5UZXN0U3RydWN0dXJlIiwgbnVsbCwgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8uU0lOR0xFVE9OLCBuZXcgU2ltcGxlVHlwZVBsYW4oU2ltcGxlVHlwZVBsYW4uSkFWQV9JTlQsIHRydWUsIFNjaGVtYVR5cGUuQlRDX0lOVEVHRVIsIG51bGwsIDApKSk7CisgICAgICAgIHBhcmFtMlBsYW4uc2V0SW5mb0ZvckVsZW1lbnQobmV3IFFOYW1lKCJ2YXJGbG9hdCIpLCBuZXcgU3RydWN0dXJlUGxhbi5GaWVsZEluZm8oInZhckZsb2F0IiwgZmFsc2UsICJjb20uYmVhLnRlc3QuVGVzdFN0cnVjdHVyZSIsIG51bGwsIFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvLlNJTkdMRVRPTiwgbmV3IFNpbXBsZVR5cGVQbGFuKFNpbXBsZVR5cGVQbGFuLkpBVkFfRkxPQVQsIHRydWUsIFNjaGVtYVR5cGUuQlRDX0ZMT0FULCBudWxsLCAwKSkpOworICAgICAgICBwYXJhbTJQbGFuLnNldEluZm9Gb3JFbGVtZW50KG5ldyBRTmFtZSgidmFyU3RyaW5nIiksIG5ldyBTdHJ1Y3R1cmVQbGFuLkZpZWxkSW5mbygidmFyU3RyaW5nIiwgZmFsc2UsICJjb20uYmVhLnRlc3QuVGVzdFN0cnVjdHVyZSIsIG51bGwsIFN0cnVjdHVyZVBsYW4uRmllbGRJbmZvLlNJTkdMRVRPTiwgbmV3IFNpbXBsZVR5cGVQbGFuKFNpbXBsZVR5cGVQbGFuLkpBVkFfU1RSSU5HLCBmYWxzZSwgU2NoZW1hVHlwZS5CVENfU1RSSU5HLCBudWxsLCAwKSkpOworCisgICAgICAgIG1lc3NhZ2VQbGFuLnNldEluZm9Gb3JFbGVtZW50KG5ldyBRTmFtZSgiTGFzdFRyYWRlUHJpY2UiKSwgbmV3IE1lc3NhZ2VQbGFuLlBhcmFtSW5mbygwLCBNZXNzYWdlUGxhbi5QYXJhbUluZm8uU0lOR0xFVE9OLCBwYXJhbTFQbGFuKSk7CisgICAgICAgIG1lc3NhZ2VQbGFuLnNldEluZm9Gb3JFbGVtZW50KG5ldyBRTmFtZSgiaW5wdXRTdHJ1Y3QiKSwgbmV3IE1lc3NhZ2VQbGFuLlBhcmFtSW5mbygxLCBNZXNzYWdlUGxhbi5QYXJhbUluZm8uU0lOR0xFVE9OLCBwYXJhbTJQbGFuKSk7CisKKyAgICAgICAgWG1sT2JqZWN0IHhvYmogPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZShhcmdzWzBdKSk7CisgICAgICAgIFhNTElucHV0U3RyZWFtIHhpbnB1dCA9IHhvYmoubmV3WE1MSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgd2hpbGUgKHhpbnB1dC5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh4aW5wdXQucGVlaygpLmlzU3RhcnRFbGVtZW50KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB4aW5wdXQuc2tpcCgpOworICAgICAgICB9CisKKyAgICAgICAgVW5tYXJzaGFsQ29udGV4dCBjb250ZXh0ID0gbmV3IFVubWFyc2hhbENvbnRleHQoKTsKKyAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gKE9iamVjdFtdKW1lc3NhZ2VQbGFuLnVubWFyc2hhbCh4aW5wdXQsIGNvbnRleHQpOworICAgICAgICBjb250ZXh0LmNvbXBsZXRlKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0ICIgKyBpICsgIiA9ICIgKyByZXN1bHRbaV0pOworICAgICAgICAgICAgaWYgKHJlc3VsdFtpXSBpbnN0YW5jZW9mIFRlc3RTdHJ1Y3R1cmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFN0cnVjdHVyZSBzID0gKFRlc3RTdHJ1Y3R1cmUpcmVzdWx0W2ldOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB2YXJJbnQgPSAiICsgcy52YXJJbnQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB2YXJGbG9hdCA9ICIgKyBzLnZhckZsb2F0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgdmFyU3RyaW5nID0gIiArIHMudmFyU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3htbHBhZC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveG1scGFkL1htbFBhZC5qYXZhIGIvdjEvdGVzdC9zcmMveG1scGFkL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94bWxwYWQvWG1sUGFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyOTdmYQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3htbHBhZC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveG1scGFkL1htbFBhZC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54bWxwYWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwuc3RvcmUuUm9vdDsKKworcHVibGljIGNsYXNzIFhtbFBhZAoreworICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBtYWluICggU3RyaW5nW10gYXJncyApCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIaSB0aGVyZSEiICk7CisKKyAgICAgICAgbmV3IFhtbFBhZCgpLnJ1bigpOworICAgIH0KKworICAgIHZvaWQgcnVuICggKQorICAgIHsKKy8vICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoIFN5c3RlbS5pbi5yZWFkKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9UZXN0WFBhdGguamF2YSBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9UZXN0WFBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg3MmVmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1Rlc3RYUGF0aC5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKiAgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwueHBhdGguamF4ZW47CisKK2ltcG9ydCBvcmcuamF4ZW4uWFBhdGg7CitpbXBvcnQgb3JnLmpheGVuLlhQYXRoU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQorICogRGF0ZTogT2N0IDEwLCAyMDAzCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0WFBhdGgKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYzsKKworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIT0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdFhQYXRoIHRlc3QvY2FzZXMveHBhdGgvdGVzdFhQYXRoLnhtbCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShuZXcgRmlsZShhcmdzWzBdKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIHhwYXRoID0gbmV3IFN0cmluZ1syNV07CisgICAgICAgICAgICB4cGF0aFswXSA9ICIvZG9jL2EvQHRlc3QiOworICAgICAgICAgICAgeHBhdGhbMV0gPSAiLy8uIjsKKyAgICAgICAgICAgIHhwYXRoWzJdID0gIi9kb2MiOworICAgICAgICAgICAgeHBhdGhbM10gPSAiL2RvYy9hIjsKKyAgICAgICAgICAgIHhwYXRoWzRdID0gIi8vQCoiOworICAgICAgICAgICAgeHBhdGhbNV0gPSAiLiI7CisgICAgICAgICAgICB4cGF0aFs2XSA9ICIvL2FuY2VzdG9yLW9yLXNlbGY6OioiOworICAgICAgICAgICAgeHBhdGhbN10gPSAiLi9jaGlsZDo6KlsxXSI7CisgICAgICAgICAgICB4cGF0aFs4XSA9ICIvL2Rlc2NlbmRhbnQtb3Itc2VsZjo6Ki9AKlsxXSI7CisgICAgICAgICAgICB4cGF0aFs5XSA9ICIvL0AqIHwgKiB8IG5vZGUoKSI7CisgICAgICAgICAgICB4cGF0aFsxMF0gPSAiLy8qIjsKKyAgICAgICAgICAgIHhwYXRoWzExXSA9ICIvZG9jL25hbWVzcGFjZTo6KiI7CisgICAgICAgICAgICB4cGF0aFsxMl0gPSAiLy9kZXNjZW5kYW50Ojpjb21tZW50KCkiOworICAgICAgICAgICAgeHBhdGhbMTNdID0gIi8vKltsb2NhbC1uYW1lKCk9J2EnXSI7CisgICAgICAgICAgICB4cGF0aFsxNF0gPSAiLy8qL0AqIjsgICAgICAgICAvLyAgIi8vKltjdXJyZW50KCldL0AqIjsKKyAgICAgICAgICAgIHhwYXRoWzE1XSA9ICIvLypbbGFzdCgpXSI7CisgICAgICAgICAgICB4cGF0aFsxNl0gPSAiZG9jLypbbGFzdCgpXSI7CisgICAgICAgICAgICB4cGF0aFsxN10gPSAiL2RvYy9hLyovQCoiOyAvLyAiL2RvYy9hLypbY3VycmVudCgpXS9AKiI7CisgICAgICAgICAgICB4cGF0aFsxOF0gPSAiZG9jL2Rlc2NlbmRhbnQ6Om5vZGUoKSI7CisgICAgICAgICAgICB4cGF0aFsxOV0gPSAiZG9jL2EvQCoiOworICAgICAgICAgICAgeHBhdGhbMjBdID0gImRvYy9iL2EvYW5jZXN0b3Itb3Itc2VsZjo6KiI7CisgICAgICAgICAgICB4cGF0aFsyMV0gPSAiZG9jL2IvYS9wcmVjZWRpbmc6OioiOworICAgICAgICAgICAgeHBhdGhbMjJdID0gImRvYy9hL2ZvbGxvd2luZzo6KiI7CisgICAgICAgICAgICB4cGF0aFsyM10gPSAiL2RvYy9iL3ByZWNlZGluZy1zaWJsaW5nOjoqIjsKKyAgICAgICAgICAgIHhwYXRoWzI0XSA9ICIvZG9jL2EvZm9sbG93aW5nLXNpYmxpbmc6OioiOworCisgICAgICAgICAgICB0ZXN0MShkb2MsIHhwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWFBhdGhTeW50YXhFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCBlLmdldE11bHRpbGluZU1lc3NhZ2UoKSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDEoWG1sT2JqZWN0IGRvYywgU3RyaW5nW10geHBhdGhlcykgdGhyb3dzIEpheGVuRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKGludCBpPTA7IGk8eHBhdGhlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcnVuWHBhdGgyKGRvYywgeHBhdGhlc1tpXSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blhwYXRoMShYbWxPYmplY3QgZG9jLCBTdHJpbmcgeHBhdGhTdHIsIGludCBpKQorICAgICAgICB0aHJvd3MgSmF4ZW5FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4+Pj49PT09PT09PT09PT09PT09PSAiICsgaSArICIgIiArIHhwYXRoU3RyICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT08PDwiKTsKKworICAgICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYQmVhbnNYUGF0aCh4cGF0aFN0cik7CisgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKKwkJTGlzdCByZXN1bHRzID0geHBhdGguc2VsZWN0Tm9kZXMoIHhjICk7CisKKyAgICAgICAgSXRlcmF0b3IgcmVzdWx0SXRlciA9IHJlc3VsdHMuaXRlcmF0b3IoKTsKKworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgOjogXG4iICsgZG9jICk7CisgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgd2hpbGUgKCByZXN1bHRJdGVyLmhhc05leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhjID0gKFhtbEN1cnNvcilyZXN1bHRJdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPiAiICsgKGorKykgKyAiID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgIiArIHhjLmN1cnJlbnRUb2tlblR5cGUoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIHhjICk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbj4+PlJlc3VsdHM6ICIgKyBqICsgIiAgICAiICsgeHBhdGhTdHIgKyAiID09PT09PT09PT09PT09PT09PT09PT09PT09PDw8Iik7CisJCXhjLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blhwYXRoMihYbWxPYmplY3QgZG9jLCBTdHJpbmcgeHBhdGhTdHIsIGludCBpKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbj4+Pj09PT09PT09PT09PT09PT09ICIgKyBpICsgIiAiICsgeHBhdGhTdHIgKyAiID09PT09PT09PT09PT09PT09PT09PT09PTw8PCIpOworCisgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKKwkJeGMuc2VsZWN0UGF0aCh4cGF0aFN0cik7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IDo6IFxuIiArIGRvYyApOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIHdoaWxlICggeGMudG9OZXh0U2VsZWN0aW9uKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4gIiArIChqKyspICsgIiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08ICIgKyB4Yy5jdXJyZW50VG9rZW5UeXBlKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB4YyApOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4+Pj5SZXN1bHRzOiAiICsgaiArICIgICAgIiArIHhwYXRoU3RyICsgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PTw8PCIpOworCQl4Yy5kaXNwb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHBhdGgvb3JnL2FwYWNoZS94bWxiZWFucy9pbXBsL3hwYXRoL2pheGVuL1hCZWFuc0RlbW8uamF2YSBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNEZW1vLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3OTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YQmVhbnNEZW1vLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qICAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbjsKKworaW1wb3J0IG9yZy5qYXhlbi5YUGF0aDsKK2ltcG9ydCBvcmcuamF4ZW4uSmF4ZW5FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxDdXJzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxCZWFuczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwueHBhdGguamF4ZW4uWEJlYW5zWFBhdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQXV0aG9yOiBDZXphciBBbmRyZWkgKGNlemFyLmFuZHJlaSBhdCBiZWEuY29tKQorICogRGF0ZTogT2N0IDEwLCAyMDAzCisgKi8KK3B1YmxpYyBjbGFzcyBYQmVhbnNEZW1vCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgeHBhdGhTdHI7CisgICAgICAgICAgICBGaWxlIGZpbGU7CisKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCE9MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBYQmVhbnNEZW1vIGZpbGUueG1sIHhwYXRoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICB4cGF0aFN0ciA9IGFyZ3NbMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlc3QxKHhwYXRoU3RyLCBmaWxlKTsKKworICAgICAgICAgICAgdGVzdDMoeHBhdGhTdHIsIGZpbGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDEoU3RyaW5nIHhwYXRoU3RyLCBGaWxlIGZpbGUpCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIC0tLS0tIHRlc3QxOiAgIFhCZWFuc1hQYXRoLnNlbGVjdE5vZGVzKHhwYXRoU3RyKSBOYXZpZ2F0b3I6IFhtbEJvb2ttYXJrcyArIDEgWG1sQ3Vyc29yIGVtYmVkZWQgaW4gdGhlIGJvb2ttYXJrIC0tLS0tIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgIFhQYXRoIHhwYXRoID0gbmV3IFhCZWFuc1hQYXRoKHhwYXRoU3RyKTsKKyAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKKyAgICAgICAgICAgIExpc3QgcmVzdWx0cyA9IHhwYXRoLnNlbGVjdE5vZGVzKHhjKTsKKworICAgICAgICAgICAgSXRlcmF0b3IgcmVzdWx0SXRlciA9IHJlc3VsdHMuaXRlcmF0b3IoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCA6OiAiICsgZG9jICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIFhQYXRoIDo6ICIgKyB4cGF0aCApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisgICAgICAgICAgICB3aGlsZSAoIHJlc3VsdEl0ZXIuaGFzTmV4dCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4YyA9IChYbWxDdXJzb3IpcmVzdWx0SXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB4YyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0cy5zaXplKCkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QzKFN0cmluZyB4cGF0aFN0ciwgRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAtLS0tLSB0ZXN0MzogICBYbWxDdXJzb3Iuc2VsZWN0UGF0aChjcGF0aCkgIC0tLS0tIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBjcGF0aCA9IFhtbEJlYW5zLmNvbXBpbGVQYXRoKCB4cGF0aFN0ciApOworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOworICAgICAgICAgICAgWG1sQ3Vyc29yIHNwZWFrZXIgPSBkb2MubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisJCQlzcGVha2VyLnRvU3RhcnREb2MoKTsKKwkJCXNwZWFrZXIuc2VsZWN0UGF0aChjcGF0aCk7CisJCQlzcGVha2VyLmdldFNlbGVjdGlvbkNvdW50KCk7CisJCQl3aGlsZSAoIHNwZWFrZXIudG9OZXh0U2VsZWN0aW9uKCkgKQorCQkJeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzcGVha2VyKTsKKwkJCQljb3VudCArPSAoc3BlYWtlciA9PSBudWxsID8gMCA6IDEpOworCQkJfQorCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+PiAiICsgY291bnQgKyAiIHNlbGVjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWFBhdGhQZXJmLmphdmEgYi92MS90ZXN0L3NyYy94cGF0aC9vcmcvYXBhY2hlL3htbGJlYW5zL2ltcGwveHBhdGgvamF4ZW4vWFBhdGhQZXJmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzMjI0OAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3Rlc3Qvc3JjL3hwYXRoL29yZy9hcGFjaGUveG1sYmVhbnMvaW1wbC94cGF0aC9qYXhlbi9YUGF0aFBlcmYuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyogICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWxiZWFucy5pbXBsLnhwYXRoLmpheGVuOworCitpbXBvcnQgb3JnLmpheGVuLlhQYXRoOworaW1wb3J0IG9yZy5qYXhlbi5KYXhlbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEN1cnNvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC54cGF0aC5qYXhlbi5YQmVhbnNYUGF0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBdXRob3I6IENlemFyIEFuZHJlaSAoY2V6YXIuYW5kcmVpIGF0IGJlYS5jb20pCisgKiBEYXRlOiBPY3QgMTAsIDIwMDMKKyAqLworcHVibGljIGNsYXNzIFhQYXRoUGVyZgoreworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHhwYXRoU3RyOworICAgICAgICAgICAgRmlsZSBmaWxlOworCisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGghPTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogWEJlYW5zRGVtbyBmaWxlLnhtbCB4cGF0aCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7CisgICAgICAgICAgICAgICAgeHBhdGhTdHIgPSBhcmdzWzFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3Rlc3QxKHhwYXRoU3RyLCBmaWxlKTsKKyAgICAgICAgICAgIC8vdGVzdDIoeHBhdGhTdHIsIGZpbGUpOworCisvLyAgICAgICAgICAgIHRlc3QzdCh4cGF0aFN0ciwgZmlsZSk7CisvLyAgICAgICAgICAgIHRlc3QzKHhwYXRoU3RyLCBmaWxlKTsKKy8vICAgICAgICAgICAgdGVzdDQoZmlsZSk7CisKKyAgICAgICAgICAgIHRlc3Q1KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MShTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDE6ICAgWEJlYW5zWFBhdGguc2VsZWN0Tm9kZXMoeHBhdGhTdHIpIE5hdmlnYXRvcjogWG1sQm9va21hcmtzICsgMSBYbWxDdXJzb3IgZW1iZWRlZCBpbiBOYXZpZ2F0b3IgLS0tLS0iKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOworICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOworICAgICAgICAgICAgWG1sQ3Vyc29yIHhjID0gZG9jLm5ld0N1cnNvcigpOworICAgICAgICAgICAgTGlzdCByZXN1bHRzID0geHBhdGguc2VsZWN0Tm9kZXMoeGMpOworCisgICAgICAgICAgICBJdGVyYXRvciByZXN1bHRJdGVyID0gcmVzdWx0cy5pdGVyYXRvcigpOworCisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgOjogIiArIGRvYyApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBYUGF0aCA6OiAiICsgeHBhdGggKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdHMiICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworICAgICAgICAgICAgd2hpbGUgKCByZXN1bHRJdGVyLmhhc05leHQoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeGMgPSAoWG1sQ3Vyc29yKXJlc3VsdEl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggeGMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdHMuc2l6ZSgpICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MihTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDI6ICAgWEJlYW5zWFBhdGguc2VsZWN0Tm9kZXMoeHBhdGhTdHIpIE5hdmlnYXRvcjogWG1sQm9va21hcmtzICsgMSBYbWxDdXJzb3IgZW1iZWRlZCBpbiBOYXZpZ2F0b3IgLS0tLS0iKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOworICAgICAgICAgICAgWFBhdGggeHBhdGggPSBuZXcgWEJlYW5zWFBhdGgoeHBhdGhTdHIpOworICAgICAgICAgICAgWG1sQ3Vyc29yIGRvY1hDID0gZG9jLm5ld0N1cnNvcigpOworCisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWG1sQ3Vyc29yIHNwZWFrZXIgPSAoWG1sQ3Vyc29yKXhwYXRoLnNlbGVjdFNpbmdsZU5vZGUoZG9jWEMpOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoc3BlYWtlciA9PSBudWxsID8gMCA6IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigoaioxMDApICsgIiAgICAgICAgICAgICAgICBcdCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnQyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+PiAiICsgY291bnQgKyAiIHNlbGVjdGlvbnMgaW4gIiArIChlbmQgLSBzdGFydCkgKyAiIG1zIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFhtbEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChKYXhlbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0MyhTdHJpbmcgeHBhdGhTdHIsIEZpbGUgZmlsZSkKKyAgICB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4gLS0tLS0gdGVzdDM6ICAgWG1sQ3Vyc29yLnNlbGVjdFBhdGgoY3BhdGgpICAtLS0tLSIpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgY3BhdGggPSBYbWxCZWFucy5jb21waWxlUGF0aCggeHBhdGhTdHIgKTsKKyAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgIFhtbEN1cnNvciBzcGVha2VyID0gZG9jLm5ld0N1cnNvcigpOworCisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcGVha2VyLnRvU3RhcnREb2MoKTsKKyAgICAgICAgICAgICAgICAgICAgc3BlYWtlci5zZWxlY3RQYXRoKGNwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9zcGVha2VyLmdldFNlbGVjdGlvbkNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICggc3BlYWtlci50b05leHRTZWxlY3Rpb24oKSApIDsKKworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoc3BlYWtlciA9PSBudWxsID8gMCA6IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKGoqMTAwKSArICIgICAgICAgICAgICAgICAgXHQiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0MikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gIiArIGNvdW50ICsgIiBzZWxlY3Rpb25zIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtcyIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDN0KFN0cmluZyB4cGF0aFN0ciwgRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAtLS0tLSB0ZXN0MzogICBYbWxDdXJzb3Iuc2VsZWN0UGF0aChjcGF0aCkgIC0tLS0tIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBjcGF0aCA9IFhtbEJlYW5zLmNvbXBpbGVQYXRoKCB4cGF0aFN0ciApOworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKGZpbGUpOworICAgICAgICAgICAgWG1sQ3Vyc29yIHNwZWFrZXIgPSBkb2MubmV3Q3Vyc29yKCk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBzcGVha2VyLnRvU3RhcnREb2MoKTsKKyAgICAgICAgICAgIHNwZWFrZXIuc2VsZWN0UGF0aChjcGF0aCk7CisgICAgICAgICAgICAvL3NwZWFrZXIuZ2V0U2VsZWN0aW9uQ291bnQoKTsKKyAgICAgICAgICAgIHdoaWxlICggc3BlYWtlci50b05leHRTZWxlY3Rpb24oKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNwZWFrZXIpOworICAgICAgICAgICAgICAgIGNvdW50ICs9IChzcGVha2VyID09IG51bGwgPyAwIDogMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+ICIgKyBjb3VudCArICIgc2VsZWN0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDQoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAtLS0tLSB0ZXN0NDogICAxIFhtbEN1cnNvciBoYW5kQ29kZWQgIC0tLS0tIik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFhtbE9iamVjdCBkb2MgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgIFhtbEN1cnNvciB4YyA9IGRvYy5uZXdDdXJzb3IoKTsKKworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7CisgICAgICAgICAgICAgICAgbG9uZyBzdGFydDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeGMudG9TdGFydERvYygpOworCisgICAgICAgICAgICAgICAgICAgIHJlYyhuZXcgU3RyaW5nW10geyJQTEFZIiwiQUNUIiwiU0NFTkUiLCJTUEVFQ0giLCJTUEVBS0VSIn0sIDAsIHhjKTsKKworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoeGMgPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKGoqMTAwKSArICIgICAgICAgICAgICAgICAgXHQiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0MikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gIiArIGNvdW50ICsgIiBzZWxlY3Rpb25zIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtcyIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChYbWxFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVjKFN0cmluZ1tdIHhwLCBpbnQgaSwgWG1sQ3Vyc29yIHhjICkKKyAgICB7CisgICAgICAgIGlmIChpPj14cC5sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHhjKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4Yy50b0NoaWxkKHhwW2ldKSkgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcmVjKHhwLCBpKzEsIHhjKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSh4Yy50b05leHRTaWJsaW5nKHhwW2ldKSk7CisgICAgICAgIHhjLnRvUGFyZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0NSgpCisgICAgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIC0tLS0tIHRlc3Q1OiAgIFhCZWFuc1hQYXRoLnNlbGVjdE5vZGVzKHhwYXRoU3RyKSBOYXZpZ2F0b3I6IFhtbEJvb2ttYXJrcyArIDEgWG1sQ3Vyc29yIGVtYmVkZWQgaW4gTmF2aWdhdG9yIC0tLS0tIik7CisKKyAgICAgICAgLy9TdHJpbmcgeG1sRG9jU3RyID0gIjxBQUE+ICA8QkJCIGlkID0gXCJiMVwiLz4gPEJCQiBuYW1lID0gXCIgYmJiIFwiLz4gPEJCQiBuYW1lID0gXCJiYmJcIi8+ICA8L0FBQT4iOworICAgICAgICAvL1N0cmluZyB4cGF0aFN0ciA9ICIvL0JCQltub3JtYWxpemUtc3BhY2UoQG5hbWUpPSdiYmInXSI7CisKKyAgICAgICAgU3RyaW5nIHhtbERvY1N0ciA9CisgICAgICAgICAgIjxBQUE+XG4iICsKKyAgICAgICAgICAiICA8QkNDPiBcbiIgKworICAgICAgICAgICIgICAgIDxCQkIvPlxuIiArCisgICAgICAgICAgIiAgICAgPEJCQi8+IFxuIiArCisgICAgICAgICAgIiAgICAgPEJCQi8+IFxuIiArCisgICAgICAgICAgIiAgPC9CQ0M+IFxuIiArCisgICAgICAgICAgIiAgPEREQj4gXG4iICsKKyAgICAgICAgICAiICAgICA8QkJCLz5cbiIgKworICAgICAgICAgICIgICAgIDxCQkIvPiBcbiIgKworICAgICAgICAgICIgIDwvRERCPiBcbiIgKworICAgICAgICAgICIgIDxCRUM+IFxuIiArCisgICAgICAgICAgIiAgICAgPENDQy8+XG4iICsKKyAgICAgICAgICAiICAgICA8REJELz4gXG4iICsKKyAgICAgICAgICAiICA8L0JFQz4gXG4iICsKKyAgICAgICAgICAiPC9BQUE+ICI7CisgICAgICAgIFN0cmluZyB4cGF0aFN0ciA9ICIvLypbY29udGFpbnMobmFtZSgpLCdDJyldIjsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgWG1sT2JqZWN0IGRvYyA9IFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKHhtbERvY1N0cik7CisgICAgICAgICAgICBYUGF0aCB4cGF0aCA9IG5ldyBYQmVhbnNYUGF0aCh4cGF0aFN0cik7CisgICAgICAgICAgICBYbWxDdXJzb3IgeGMgPSBkb2MubmV3Q3Vyc29yKCk7CisgICAgICAgICAgICBMaXN0IHJlc3VsdHMgPSB4cGF0aC5zZWxlY3ROb2Rlcyh4Yyk7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3VsdEl0ZXIgPSByZXN1bHRzLml0ZXJhdG9yKCk7CisKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCA6OiAiICsgZG9jICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIFhQYXRoIDo6ICIgKyB4cGF0aCApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0cyIgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisgICAgICAgICAgICB3aGlsZSAoIHJlc3VsdEl0ZXIuaGFzTmV4dCgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4YyA9IChYbWxDdXJzb3IpcmVzdWx0SXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB4YyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0cy5zaXplKCkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoWG1sRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEpheGVuRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL2RlZmF1bHQueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUxZDlmCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9kZWZhdWx0LnhzZApAQCAtMCwwICsxLDU5IEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEVsZW1EZWZhdWx0IiAgIHR5cGU9InhzOmludCIgZGVmYXVsdD0iMSIvPgorPCEtLSBCQVU6IHdlIGNhbid0IGNvbXBpbGUgYW55IG1vcmUgYmVjYXVzZSBpdCdzIGludmFsaWQKKyAgPHhzOmVsZW1lbnQgbmFtZT0iaW52YWxpZEVsZW1EZWZhdWx0IiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9ImEiLz4KKy0tPgorICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEVsZW1GaXhlZCIgICAgIHR5cGU9InhzOmludCIgZml4ZWQ9IjIiLz4KKzwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCisgIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRFbGVtRml4ZWQiICAgdHlwZT0ieHM6aW50IiBmaXhlZD0iYiIvPgorLS0+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0idmFsaWRBdHRyRGVmYXVsdCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyIiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9IjMiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKzwhLS0gQkFVOiB3ZSBjYW4ndCBjb21waWxlIGFueSBtb3JlIGJlY2F1c2UgaXQncyBpbnZhbGlkCisgIDx4czplbGVtZW50IG5hbWU9ImludmFsaWRBdHRyRGVmYXVsdCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyIiB0eXBlPSJ4czppbnQiIGRlZmF1bHQ9ImMiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CistLT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWxpZEF0dHJGaXhlZCI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcmljdHRyIiB0eXBlPSJ4czppbnQiIGZpeGVkPSI0Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCis8IS0tIEJBVTogd2UgY2FuJ3QgY29tcGlsZSBhbnkgbW9yZSBiZWNhdXNlIGl0J3MgaW52YWxpZAorICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZhbGlkQXR0ckZpeGVkIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHIiIHR5cGU9InhzOmludCIgZml4ZWQ9ImQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CistLT4gICAgCisgIDwhLS0gdHlwZXMgdG8gaGVscCB0ZXN0IG5pbCAtLT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJjYW5CZU5pbCIgbmlsbGFibGU9InRydWUiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdjEvdGVzdC9zcmMveHN0eXBlcy9wZXJzb24ueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9wZXJzb24ueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmIwODUKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy94c3R5cGVzL3BlcnNvbi54c2QKQEAgLTAsMCArMSwxMTcgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYQorICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgeG1sbnM6bXQ9Imh0dHA6Ly9vcGVudXJpLm9yZy94c3R5cGVzL3Rlc3QiCisgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGVudXJpLm9yZy94c3R5cGVzL3Rlc3QiCisgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgPgorCisgIDx4czpub3RhdGlvbiBuYW1lPSJqcGVnIiBwdWJsaWM9IkpQRUciIC8+CisgIDx4czpub3RhdGlvbiBuYW1lPSJnaWYiIHB1YmxpYz0iR0lGIiAvPgorCisgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb24iPgorICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpcnN0bmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibnVtYmVyIj4KKyAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgorICAgICAgICAgICAgICAgPHhzOm1pbkluY2x1c2l2ZSB2YWx1ZT0iMSIvPgorICAgICAgICAgICAgICAgPHhzOm1heEluY2x1c2l2ZSB2YWx1ZT0iMTAwMCIvPgorICAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaXJ0aGRheSIgdHlwZT0ieHM6ZGF0ZSIvPgorICAgICAgICA8IS0tIHRlc3QgdGhhdCBpbnQtdmFsdWUgZG9lcyBub3QgY29sbGlkZSB3aXRoIGdldEludFZhbHVlKCkgb24gU2ltcGxlVmFsdWUgLS0+CisgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludC12YWx1ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICA8L3hzOmNob2ljZT4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9ImhleCIgdHlwZT0ieHM6aGV4QmluYXJ5Ii8+CisgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiYXNlNjQiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYW55dXJpIiB0eXBlPSJ4czphbnlVUkkiLz4KKyAgICAgIDx4czplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4czpRTmFtZSIvPgorICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibm90YXRpb24iPgorICAgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk9UQVRJT04iPgorICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJqcGVnIiAvPgorICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJnaWYiIC8+CisgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgICAgPC94czplbGVtZW50PgorICAgIDwveHM6c2VxdWVuY2U+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZW5kZXIiPgorICAgICAgPHhzOnNpbXBsZVR5cGU+CisgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpOTVRPS0VOIj4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbGUiLz4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZlbWFsZSIvPgorICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgIDwveHM6YXR0cmlidXRlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaGV4QXR0Ij4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KKyAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iKFs0NV1bMC05QS1GXSkqIi8+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2U2NEF0dCI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+CisgICAgICAgICAgPHhzOndoaXRlU3BhY2UgdmFsdWU9ImNvbGxhcHNlIi8+CisgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWR2hwY3lCemRISnBibWNnYVhNZ1ltRnpaVFkwUW1sdVlYSjVJR1Z1WTI5a1pXUWgiLz4KKyAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgorICAgICAgPC94czpzaW1wbGVUeXBlPgorICAgIDwveHM6YXR0cmlidXRlPgorICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYW55dXJpQXR0Ij4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YW55VVJJIj4KKyAgICAgICAgICA8eHM6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KKyAgICAgICAgICA8eHM6bGVuZ3RoIHZhbHVlPSIxMDAiLz4KKyAgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgICA8eHM6YXR0cmlidXRlIG5hbWU9InFuYW1lQXR0Ij4KKyAgICAgIDx4czpzaW1wbGVUeXBlPgorICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6UU5hbWUiPgorICAgICAgICAgIDx4czp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgorICAgICAgIDwveHM6cmVzdHJpY3Rpb24+CisgICAgICA8L3hzOnNpbXBsZVR5cGU+CisgICAgPC94czphdHRyaWJ1dGU+CisgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJub3RhdGlvbkF0dCI+CisgICAgICA8eHM6c2ltcGxlVHlwZT4KKyAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5PVEFUSU9OIj4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImpwZWciLz4KKyAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImdpZiIvPgorICAgICAgICAgIDx4czpsZW5ndGggdmFsdWU9IjIwIi8+CisgICAgICAgPC94czpyZXN0cmljdGlvbj4KKyAgICAgIDwveHM6c2ltcGxlVHlwZT4KKyAgICA8L3hzOmF0dHJpYnV0ZT4KKyAgPC94czpjb21wbGV4VHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJjdXN0b21lciIgdHlwZT0ibXQ6cGVyc29uIi8+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZW1wbG95ZWUiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJtdDpwZXJzb24iPgorICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImVpZCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPC94czpleHRlbnNpb24+CisgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMvc2V0dGVycy54c2QgYi92MS90ZXN0L3NyYy94c3R5cGVzL3NldHRlcnMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmQ1ODkKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy94c3R5cGVzL3NldHRlcnMueHNkCkBAIC0wLDAgKzEsMTkgQEAKKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgICAgIHhtbG5zOnRucz0ic2V0dGVycyIgdGFyZ2V0TmFtZXNwYWNlPSJzZXR0ZXJzIgorICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKyAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS92MS90ZXN0L3NyYy94c3R5cGVzL3NpbXBsZWMueHNkIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9zaW1wbGVjLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDJjZGViCi0tLSAvZGV2L251bGwKKysrIGIvdjEvdGVzdC9zcmMveHN0eXBlcy9zaW1wbGVjLnhzZApAQCAtMCwwICsxLDQwIEBACis8IS0tIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KKzx4czpzY2hlbWEKKyAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgIHhtbG5zOm10PSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgorICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BlbnVyaS5vcmcvbXl0ZXN0IgorICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCisgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCis+CisKKyAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNpbXBsaWNpdHkiPgorICAgIDx4czpzaW1wbGVDb250ZW50PgorICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im10OnRob3VzYW5kIj4KKyAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5vdGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICA8L3hzOmV4dGVuc2lvbj4KKyAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+CisgIDwveHM6Y29tcGxleFR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idGhvdXNhbmQiPgorICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgorICAgICA8eHM6bWluSW5jbHVzaXZlIHZhbHVlPSIxIi8+CisgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEwMDAiLz4KKyAgIDwveHM6cmVzdHJpY3Rpb24+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJzaW1wbGUiIHR5cGU9Im10OnNpbXBsaWNpdHkiLz4KKworPC94czpzY2hlbWE+CisKZGlmZiAtLWdpdCBhL3YxL3Rlc3Qvc3JjL3hzdHlwZXMveHN0eXBlcy54bWwgYi92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Y2E5NGMKLS0tIC9kZXYvbnVsbAorKysgYi92MS90ZXN0L3NyYy94c3R5cGVzL3hzdHlwZXMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J0lTTy04ODU5LTEnPz4KKzwhLS0gQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgorPGN1c3RvbWVyIHhtbG5zPSJodHRwOi8vb3BlbnVyaS5vcmcveHN0eXBlcy90ZXN0IgorICAgZ2VuZGVyPSJtYWxlIgorICAgaGV4QXR0PSI0NzQ3NDk1MTU0NTc1OTQ3NDciCisgICBiYXNlNjRBdHQ9IgorCVZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaAorCSIKKyAgIGFueXVyaUF0dD0iaHR0cDovL2Rtb3oub3JnL1dvcmxkL0ZyYW7nYWlzLyIKKyAgIHFuYW1lQXR0PSJwcmVmOmxvY2FsbmFtZSIgeG1sbnM6cHJlZj0ic29tZV91cmkiCisgICBub3RhdGlvbkF0dD0iSlBFRyIKKyAgPgorICA8Zmlyc3RuYW1lPkhvd2R5PC9maXJzdG5hbWU+CisgIDxudW1iZXI+NDM2PC9udW1iZXI+CisgIDxudW1iZXI+MTIzPC9udW1iZXI+CisgIDxiaXJ0aGRheT4xOTk4LTA4LTI2WjwvYmlydGhkYXk+CisgIDxudW1iZXI+NDQ8L251bWJlcj4KKyAgPG51bWJlcj45MzM8L251bWJlcj4KKyAgPGJpcnRoZGF5PjIwMDAtMDgtMDYtMDg6MDA8L2JpcnRoZGF5PgorICA8aGV4PjQ1NDc0OTUxNTQ1NzU5NUE0QTwvaGV4PgorICA8YmFzZTY0PlZHaHBjeUJ6ZEhKcGJtY2dhWE1nWW1GelpUWTBRbWx1WVhKNUlHVnVZMjlrWldRaDwvYmFzZTY0PgorICA8YW55dXJpPmh0dHA6Ly8zc3BhY2Uub3JnL3NwYWNlJTIwc3BhY2UvPC9hbnl1cmk+CisgIDxxbmFtZT5vcGVudXJpX29yZ19sb2NhbG5hbWU8L3FuYW1lPgorICA8bm90YXRpb24+R0lGPC9ub3RhdGlvbj4KKzwvY3VzdG9tZXI+CmRpZmYgLS1naXQgYS92MS94YmVhbmVudi5jbWQgYi92MS94YmVhbmVudi5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkMTUxZgotLS0gL2Rldi9udWxsCisrKyBiL3YxL3hiZWFuZW52LmNtZApAQCAtMCwwICsxIEBACitTRVQgWE1MQkVBTlNfSE9NRT0lfmRwMC4KZGlmZiAtLWdpdCBhL3YxL3hiZWFuZW52LnNoIGIvdjEveGJlYW5lbnYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTNmMmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3YxL3hiZWFuZW52LnNoCkBAIC0wLDAgKzEgQEAKK2V4cG9ydCBYTUxCRUFOU19IT01FPWBwd2RgCmRpZmYgLS1naXQgYS92MS94ZG9jcy9jaGFuZ2VzLnhtbCBiL3YxL3hkb2NzL2NoYW5nZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWMyMWQKLS0tIC9kZXYvbnVsbAorKysgYi92MS94ZG9jcy9jaGFuZ2VzLnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGRvY3VtZW50PgorICA8cHJvcGVydGllcz4KKyAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+CisgICAgPGF1dGhvciBlbWFpbD0icy1kdXR0YUBzYmNnbG9iYWwubmV0Ij5EdXR0YSBTYXRhZGlwPC9hdXRob3I+CisgIDwvcHJvcGVydGllcz4KKworICA8Ym9keT4KKyAgICA8cmVsZWFzZSB2ZXJzaW9uPSIxLjAuMCIgZGF0ZT0iMjAwNC0wNy0yOSI+CisgICAgICA8YWN0aW9uIGRldj0iZHV0dGEiIHR5cGU9ImFkZCI+CisgICAgICAgIGluaXRpYWwgdmVyc2lvbiwgZm9yIHhtbGJlYW5zIDEuMAorICAgICAgPC9hY3Rpb24+CisgICAgPC9yZWxlYXNlPgorICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvdjEveGRvY3MvZ29hbHMueG1sIGIvdjEveGRvY3MvZ29hbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmI2OWUKLS0tIC9kZXYvbnVsbAorKysgYi92MS94ZG9jcy9nb2Fscy54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxkb2N1bWVudD4KKwk8cHJvcGVydGllcz4KKwkJPHRpdGxlPk1hdmVuIFhNTEJlYW5zIFBsdWdpbiBHb2FsczwvdGl0bGU+CisJPC9wcm9wZXJ0aWVzPgorCTxib2R5PgorCQk8Z29hbHM+CisJCQk8Z29hbD4KKwkJCQk8bmFtZT54bWxiZWFuczp4bWxiZWFuczwvbmFtZT4KKwkJCQk8ZGVzY3JpcHRpb24+R2VuZXJhdGVzIFhNTEJlYW5zIGZyb20gWE1MIFNjaGVtYSBmaWxlcy48L2Rlc2NyaXB0aW9uPgorCQkJPC9nb2FsPgorCQk8L2dvYWxzPgorCTwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS92MS94ZG9jcy9pbmRleC54bWwgYi92MS94ZG9jcy9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjMGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3hkb2NzL2luZGV4LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGRvY3VtZW50PgorCTxwcm9wZXJ0aWVzPgorCQk8dGl0bGU+WE1MQmVhbnMgTWF2ZW4gUGx1Zy1pbjwvdGl0bGU+CisJCTxhdXRob3IgZW1haWw9InMtZHV0dGEgYXQgc2JjZ2xvYmFsIGRvdCBuZXQiPkR1dHRhIFNhdGFkaXA8L2F1dGhvcj4KKwkJPGF1dGhvciBlbWFpbD0iamhpbmRzbGV5IGF0IHByb3ZpZGVybGluayBkb3QgY29tIj5Kb3NlcGggSGluZHNsZXk8L2F1dGhvcj4KKwk8L3Byb3BlcnRpZXM+CisJPGJvZHk+CisJCTxzZWN0aW9uIG5hbWU9Ik1hdmVuIFhNTEJlYW5zIFBsdWctaW4iPgorCQkJPHA+VGhpcyBwbHVnaW4gaXMgYSB3cmFwcGVyIHRvIHRoZSB4bWxiZWFuIGFudCB0YXNrIChzZWUgCis8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvIj5odHRwOi8veG1sLmFwYWNoZS5vcmcveG1sYmVhbnMvPC9hPgorZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWE1MQmVhbnMpIHdoaWNoIAorZ2VuZXJhdGVzIGFuZCBjb21waWxlcyBYTUxCZWFucyBmcm9tIFhNTCBTY2hlbWEgKCoueHNkKSBmaWxlcy4KKzwvcD4KKwkJCTxwPkJ5IGRlZmF1bHQgdGhlIHBsdWdpbiBsb29rcyBmb3IgdGhlIFhNTCBTY2hlbWEgZmlsZXMgaW4gdGhlIHNyYy94bWxiZWFucyAKK2RpcmVjdG9yeS4gSmF2YSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBnZW5lcmF0ZWQgWE1MQmVhbnMgYXJlIHB1dCBpbnRvIHRoZSAKK3RhcmdldC94bWxiZWFucy9zcmMgZGlyZWN0b3J5LiBDbGFzcyBmaWxlcyBhbmQgZ2VuZXJhdGVkIHJlc291cmNlIGZpbGVzIGFyZSAKK2NvbXBpbGVkIGludG8gdGhlIHRhcmdldC9jbGFzc2VzIGRpcmVjdG9yeS4gVGhlIHBsdWdpbiBhbHNvIGNyZWF0ZXMgYSBqYXIgCitmaWxlIChjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgY2xhc3MgYW5kIHJlc291cmNlIGZpbGVzKSB3aGljaCBpcyBwdXQgaW50bwordGhlIHRhcmdldC94bWxiZWFucyBkaXJlY3RvcnkuCis8L3A+CisJCQk8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCQkJCTxwPllvdSB3aWxsIG5lZWQgdGhlIFhNTEJlYW4ncyB4YmVhbi5qYXIgZmlsZSB0byB1c2UgdGhpcyBwbHVnaW4uIFlvdSBjYW4gZ2V0IHRoZQoramFyIGZyb20gPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLyI+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzwvYT4uCitUaGUgcHJvamVjdC54bWwgY3VycmVudGx5IHdpbGwgZG93bmxvYWQgdGhlIHhiZWFucy0xLjAtREVWLmphciBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sYmVhbnMvamFycy8iPmh0dHA6Ly93d3cuaWJpYmxpby5vcmcvbWF2ZW4veG1sYmVhbnMvamFycy88L2E+LgorQXMgbmV3IHJlbGVhc2VzIGFyZSBtYWRlIHRoZSBkZXBlbmRlbmN5IHdpbGwgaGF2ZSB0byBjaGFuZ2VkIGluIHRoZSBwcm9qZWN0LnhtbAorPC9wPgorCQkJPC9zZWN0aW9uPgorCQk8L3NlY3Rpb24+CisJPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3YxL3hkb2NzL25hdmlnYXRpb24ueG1sIGIvdjEveGRvY3MvbmF2aWdhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmNWI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3YxL3hkb2NzL25hdmlnYXRpb24ueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJYTUxCZWFucyBNYXZlbiBQbHVnaW4iPgorCTx0aXRsZT5YTUxCZWFucyBNYXZlbiBQbHVnaW48L3RpdGxlPgorCTxib2R5PgorCQk8bGlua3M+CisJCQk8aXRlbSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iIG5hbWU9Ik1hdmVuIj4KKyAgICAgIDwvaXRlbT4KKwkJCTxpdGVtIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWxiZWFucy8iIG5hbWU9IlhNTEJlYW5zIj4KKyAgICAgIDwvaXRlbT4KKwkJPC9saW5rcz4KKwkJPG1lbnUgbmFtZT0iT3ZlcnZpZXciPgorCQkJPGl0ZW0gaHJlZj0iL2dvYWxzLmh0bWwiIG5hbWU9IkdvYWxzIj4KKyAgICAgIDwvaXRlbT4KKwkJCTxpdGVtIGhyZWY9Ii9wcm9wZXJ0aWVzLmh0bWwiIG5hbWU9IlByb3BlcnRpZXMiPgorICAgICAgPC9pdGVtPgorCQk8L21lbnU+CisJPC9ib2R5PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdjEveGRvY3MvcHJvcGVydGllcy54bWwgYi92MS94ZG9jcy9wcm9wZXJ0aWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIwNTFlCi0tLSAvZGV2L251bGwKKysrIGIvdjEveGRvY3MvcHJvcGVydGllcy54bWwKQEAgLTAsMCArMSw4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxkb2N1bWVudD4KKwk8cHJvcGVydGllcz4KKwkJPHRpdGxlPk1hdmVuIFhNTEJlYW5zIFBsdWdpbiBQcm9wZXJ0aWVzPC90aXRsZT4KKwk8L3Byb3BlcnRpZXM+CisJPGJvZHk+CisJCTxzZWN0aW9uIG5hbWU9Ik1hdmVuIFhNTEJlYW5zIFBsdWdpbiBTZXR0aW5ncyI+CisJCQk8dGFibGU+CisJCQkJPHRyPgorCQkJCQk8dGg+UHJvcGVydHk8L3RoPgorCQkJCQk8dGg+T3B0aW9uYWw/PC90aD4KKwkJCQkJPHRoPkRlc2NyaXB0aW9uPC90aD4KKwkJCQk8L3RyPgorCQkJCTx0cj4KKwkJCQkJPHRkPm1hdmVuLnhtbGJlYW5zLnhtbGJlYW4uc2NoZW1hPC90ZD4KKwkJCQkJPHRkPlllczwvdGQ+CisJCQkJCTx0ZD4KKwkJCQkJCTxwPkRlZmF1bHQgdmFsdWUgaXMKKyAgICAgICAgICAgICAgPGNvZGU+c3JjL3htbGJlYW5zPC9jb2RlPi48L3A+CisJCQkJCTwvdGQ+CisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZD5tYXZlbi54bWxiZWFucy54bWxiZWFuLnNyY29ubHk8L3RkPgorCQkJCQk8dGQ+WWVzPC90ZD4KKwkJCQkJPHRkPgorCQkJCQkJPHA+RGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorCQkJCQk8L3RkPgorCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQ+bWF2ZW4ueG1sYmVhbnMueG1sYmVhbi5kZWJ1ZzwvdGQ+CisJCQkJCTx0ZD5ZZXM8L3RkPgorCQkJCQk8dGQ+CisJCQkJCQk8cD5EZWZhdWx0IHZhbHVlIGlzCisgICAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisJCQkJCTwvdGQ+CisJCQkJPC90cj4KKwkJCQk8dHI+CisJCQkJCTx0ZD5tYXZlbi54bWxiZWFucy54bWxiZWFuLmluY2x1ZGVzPC90ZD4KKwkJCQkJPHRkPlllczwvdGQ+CisJCQkJCTx0ZD4KKwkJCQkJCTxwPkRlZmF1bHQgdmFsdWUgaXMKKyAgICAgICAgICAgICAgPGNvZGU+KiovKi54c2Q8L2NvZGU+LjwvcD4KKwkJCQkJPC90ZD4KKwkJCQk8L3RyPgorCQkJCTx0cj4KKwkJCQkJPHRkPm1hdmVuLnhtbGJlYW5zLnhtbGJlYW4uY2xhc3NnZW5kaXI8L3RkPgorCQkJCQk8dGQ+WWVzPC90ZD4KKwkJCQkJPHRkPgorCQkJCQkJPHA+RGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgICAgICA8Y29kZT4ke21hdmVuLmJ1aWxkLmRpcn0vY2xhc3NlczwvY29kZT4uPC9wPgorCQkJCQk8L3RkPgorCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQ+bWF2ZW4ueG1sYmVhbnMueG1sYmVhbi5leGNsdWRlczwvdGQ+CisJCQkJCTx0ZD5ZZXM8L3RkPgorCQkJCQk8dGQ+CisJCQkJCQk8cD5EZWZhdWx0IHZhbHVlIGlzCisgICAgICAgICAgICAgIDxjb2RlPgorICAgICAgICAgICAgICA8L2NvZGU+LjwvcD4KKwkJCQkJPC90ZD4KKwkJCQk8L3RyPgorCQkJCTx0cj4KKwkJCQkJPHRkPm1hdmVuLnhtbGJlYW5zLnhtbGJlYW4uc3JjZ2VuZGlyPC90ZD4KKwkJCQkJPHRkPlllczwvdGQ+CisJCQkJCTx0ZD4KKwkJCQkJCTxwPkRlZmF1bHQgdmFsdWUgaXMKKyAgICAgICAgICAgICAgPGNvZGU+JHttYXZlbi5idWlsZC5kaXJ9L3htbGJlYW5zL3NyYzwvY29kZT4uPC9wPgorCQkJCQk8L3RkPgorCQkJCTwvdHI+CisJCQkJPHRyPgorCQkJCQk8dGQ+bWF2ZW4ueG1sYmVhbnMueG1sYmVhbi5kZXN0ZmlsZTwvdGQ+CisJCQkJCTx0ZD5ZZXM8L3RkPgorCQkJCQk8dGQ+CisJCQkJCQk8cD5EZWZhdWx0IHZhbHVlIGlzCisgICAgICAgICAgICAgIDxjb2RlPiR7bWF2ZW4uYnVpbGQuZGlyfS94bWxiZWFucy8ke21hdmVuLmZpbmFsLm5hbWV9LmphcjwvY29kZT4uPC9wPgorCQkJCQk8L3RkPgorCQkJCTwvdHI+CisJCQk8L3RhYmxlPgorCQk8L3NlY3Rpb24+CisJPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL3YxL3hraXQvUkVBRE1FLnR4dCBiL3YxL3hraXQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EyZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdjEveGtpdC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTU3IEBACitYTUxCZWFucyB2IDEuMC4zIERldmVsb3BtZW50IEtpdAorCisKK1dlbGNvbWUgdG8gWE1MQmVhbnMhCisKKworS2l0IGNvbnRlbnRzOgorCisoMSkgT25lIGNvcHkgb2YgeGJlYW4uamFyLCB3aGljaCBjb250YWlucyBYTUxCZWFucy4KKyAgICBTaG91bGQgd29yayBvbiBhbnkgSkRLIDEuNC54LgorICAgIC4vbGliL3hiZWFuLmphcgorCisoMikgTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgWE1MIEJlYW5zIGFuZCBpbmNsdWRlZCBsaWJyYXJpZXMKKyAgICAuL2xpY2Vuc2UudHh0CisKKygzKSBPbmUgZm9sZGVyIGZ1bGwgb2YgY29tbWFuZC1saW5lIHNjcmlwdHMsIHBvaW50aW5nIHRvIHRoZQorICAgIHVzZWZ1bCBtYWluKCkgZnVuY3Rpb25zIGluIHRoZSBKQVIuCisgICAgLi9iaW4KKworKDQpIE9uZSBiaXQgb2YgYW50IHRhc2sgZG9jdW1lbnRhdGlvbi4KKyAgICAuL2FudHRhc2suaHRtbAorCisoNSkgQSBjb3B5IG9mIHRoZSBwbGFpbiBqYXZhZG9jIHRyZWUgZm9yIG9yZy5hcGFjaGUueG1sYmVhbnMuKgorICAgIC4vZG9jcy9yZWZlcmVuY2UKKworKDYpIEEgcHJlbGltaW5hcnkgY29sbGVjdGlvbiBvZiBuaWNlbHkgZm9ybWF0dGVkIHVzZXItbGV2ZWwKKyAgICBkb2N1bWVudGF0aW9uIEhUTUwgKGluY2x1ZGVzIHJlZm9ybWF0dGVkIGFuZCBuaWNlbHkKKyAgICBvcmdhbml6ZWQgamF2YWRvYyBhcyB3ZWxsKQorICAgIC4vZG9jcy9ndWlkZQorCisoNykgQSBmZXcgc2FtcGxlIHNjaGVtYXMKKyAgICAuL3NjaGVtYXMKKworCitXaGVyZSB0byBzdGFydD8KKworKDEpIFNldHVwLgorCisgICAgMS4gbWFrZSBzdXJlIHlvdSBoYXZlIGEgSkRLIDEuNC54IGluc3RhbGxlZDsgdGhhdCBqYXZhWy5leGVdCisgICAgICAgaXMgb24geW91ciBwYXRoIGFuZCB0aGF0IEpBVkFfSE9NRS9iaW4gY29udGFpbnMgamF2YVsuZXhlXSwKKyAgICAgICBqYXZhY1suZXhlXSwgYW5kIGphclsuZXhlXS4KKworICAgIDIuIHNldCB5b3VyIFhNTEJFQU5TX0hPTUUgZW52IHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBkaXJlY3RvcnkKKyAgICAgICBjb250YWluaW5nIHhiZWFuLmphciAoaS5lLiwgLi9saWIpLgorCisgICAgMy4gcHV0IHRoZSBzY3JpcHRzIGluIC4vYmluIG9uIHlvdXIgcGF0aC4KKworICAgIDQuIHJ1biAic2NvbXAiIHdpdGggbm8gYXJndW1lbnRzLiAgWW91IHNob3VsZCBnZXQgYSAidXNhZ2UiCisgICAgICAgbWVzc2FnZS4KKworKDIpIFRyeSBzb21lIHNjaGVtYSBjb21waWxhdGlvbgorCisgICAgMS4gSW4gdGhlIC4vc2NoZW1hcyBkaXJlY3RvcnkgeW91J2xsIGZpbmQgc29tZSBjb2xsZWN0aW9ucyBvZgorICAgICAgIHNjaGVtYXMgeW91IGNhbiB0cnkgb3V0LgorCisgICAgICAgICAtIGVhc3lwbzogYSBjb250cml2ZWQgc2ltcGxlIHN0YXJ0ZXIgInB1cmNoYXNlIG9yZGVyIgorICAgICAgICAgLSBzNHM6IHRoZSBTY2hlbWEgZm9yIFNjaGVtYQorCisgICAgICAgVG8gY29tcGlsZSB0aGVtLCB5b3UgY2FuIGp1c3Qgc2VuZCB0aGUgd2hvbGUgZGlyZWN0b3J5IHRvCisgICAgICAgc2NvbXAsIGZvciBleGFtcGxlLCAiY2Qgc2FtcGxlcyI7IHRoZW4gInNjb21wIGVhc3lwbyIuCisgICAgICAgWW91IHdpbGwgZ2V0IGFuICJ4bWx0eXBlcy5qYXIiIG91dCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUKKyAgICAgICBjb21waWxlZCBYTUxCZWFucy4gIFRvIHBpY2sgeW91ciBvd24gSkFSIGZpbGVuYW1lIGp1c3Qgc2F5CisKKyAgICAgICBzY29tcCAtb3V0IG15ZWFzeXBvLmphciBlYXN5cG8KKworCisgICAgMi4gRXNwZWNpYWxseSBhcyB5b3UgZ2V0IHN0YXJ0ZWQsIHlvdSB3aWxsIHdhbnQgdG8gc2VlIHRoZQorICAgICAgIC5qYXZhIHNvdXJjZSBjb2RlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBnZXQgdGhhdCwKKyAgICAgICB1c2UgYSBjb21tYW5kLWxpbmUgbGlrZQorCisgICAgICAgc2NvbXAgLXNyYyBteXNyY2RpciAtb3V0IG15ZWFzeXBvLmphciBlYXN5cG8KKworICAgICAgIFRoZSAibXlzcmNkaXIiIHdpbGwgY29udGFpbiBhbGwgdGhlIC5qYXZhIHNvdXJjZSBjb2RlCisgICAgICAgZm9yIHRoZSBnZW5lcmF0ZWQgWE1MQmVhbnMuCisKKygzKSBUcnkgdXNpbmcgeW91ciBjb21waWxlZCBYTUxCZWFucworCisgICAgTm93LCBhcm1lZCB3aXRoIHRoZSBYTUxCZWFucyBzb3VyY2UgY29kZSBhbmQgdGhlIGJhc2ljCisgICAgZG9jcywgeW91J3JlIHJlYWR5IHRvIHByb2dyYW0uICBUaGluZ3MgeW91IG5lZWQgdG8ga25vdzoKKworICAgICogVGhlIG9yZy5hcGFjaGUueG1sYmVhbnMgcGFja2FnZSBoYXMgYWxsIHRoZSBwdWJsaWMgY2xhc3NlcworICAgICAgZm9yIFhNTEJlYW5zLiAgUHJvZ3JhbXMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgYW55dGhpbmcKKyAgICAgIGVsc2UgaW4geGJlYW4uamFyIGRpcmVjdGx5LgorCisgICAgKiBYbWxPYmplY3QgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBYTUxCZWFucy4gIEl0CisgICAgICBjb3JyZXNwb25kcyB0byB4czphbnlUeXBlLgorCisgICAgKiBFdmVyeSBzY2hlbWEgdHlwZSBjb3JyZXNwb25kcyB0byBhbiBYTUxCZWFuIGludGVyZmFjZSwKKyAgICAgIGUuZy4sIFhtbEFueVNpbXBsZVR5cGUgY29ycmVzcG9uZHMgdG8geHM6YW55U2ltcGxlVHlwZSwgYW5kCisgICAgICBYbWxJbnQgY29ycmVzcG9uZHMgdG8geHM6aW50LCBldGMuLiBBbmQgb2YgY291cnNlIHRoaXMKKyAgICAgIGV4dGVuZHMgdG8gdGhlIFhNTEJlYW4gY2xhc3NlcyBjb21waWxlZCBmcm9tIHVzZXItZGVmaW5lZAorICAgICAgc2NoZW1hcy4KKworICAgICogRXZlcnkgWE1MQmVhbiBpbnRlcmZhY2UgaGFzIGFuIGlubmVyIEZhY3RvcnkgY2xhc3MgZm9yCisgICAgICBjcmVhdGluZyBvciBwYXJzaW5nIGluc3RhbmNlcywgZS5nLiwgdG8gbG9hZCBhIGZpbGUgb2YKKyAgICAgIGdlbmVyaWMgdHlwZSwgdXNlIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKG15ZmlsZSk7IHRvCisgICAgICBwYXJzZSBhIHN0cmluZyB5b3UgZXhwZWN0IHRvIGJlIGEgcHVyY2Foc2Utb3JkZXIsIHVzZQorICAgICAgUHVyY2hhc2VPcmRlckRvY3VtZW50LkZhY3RvcnkucGFyc2UoIjxlcDpwdXJjaGFzZS1vLi4uIik7CisKKyAgICAqIFhtbEN1cnNvciBpcyB0aGUgQVBJIGZvciBmdWxsIFhNTCBpbmZvc2V0IHRyZWV3YWxraW5nLgorICAgICAgSXQgaXMgb2J0YWluZWQgdmlhIHhtbG9iamVjdC5uZXdDdXJzb3IoKS4gVXNpbmcgaXQgaXMKKyAgICAgIGxlc3MgY29udmVuaWVudCwgYnV0IGZhc3RlciB0aGFuIHVzaW5nIFhNTCBPYmplY3RzLAorICAgICAgYmVjYXVzZSBpdCBkb2VzIG5vdCBjcmVhdGUgb2JqZWN0cyBhcyBpdCB0cmF2ZXJzZXMKKyAgICAgIHRoZSBYTUwgdHJlZS4KKworICAgICogU2NoZW1hVHlwZSBpcyB0aGUgYmFzaWMgInNjaGVtYSByZWZsZWN0aW9uIiBBUEkgKGp1c3QgbGlrZQorICAgICAgQ2xhc3MsIGJ1dCBmb3IgU2NoZW1hKS4gIEdldCB0aGUgYWN0dWFsIHNjaGVtYSB0eXBlIG9mIGFueQorICAgICAgaW5zdGFuY2UgYnkgc2F5aW5nICJ4b2JqLnNjaGVtYVR5cGUoKTsiIGdldCB0aGUgc3RhdGljCisgICAgICBjb25zdGFudCBzY2hlbWEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIGFueSBYTUxCZWFuIGNsYXNzCisgICAgICBieSBzYXlpbmcgIk15UHVyY2hhc2VPcmRlci50eXBlIiBvciAiWG1sSW50LnR5cGUiLgorICAgICAgKEFuYWxvZ291cyB0byAib2JqLmdldENsYXNzKCkiIGFuZCAiT2JqZWN0LmNsYXNzIi4pCisKKyAgICAqIEEgbnVtYmVyIG9mIHV0aWxpdHkgbWV0aG9kcyBhcmUgYXZhbGlhYmxlIG9uCisgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zLCBpbmNsdWRpbmcgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZQorICAgICAgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIEphdmEgY2xhc3MgaXMgYW4gWG1sQmVhbiBhbmQKKyAgICAgIGZ1bmN0aW9ucyB0byBtYW5hZ2UgcnVudGltZS1sb2FkaW5nIG9mIHNjaGVtYSB0eXBlCisgICAgICBzeXN0ZW1zLgorCisgICAgV2l0aCB0aGF0LCB5b3UncmUgcmVhZHkgdG8gbmF2aWdhdGUgdGhlIGphdmFkb2MgYW5kIHBsYXkKKyAgICB3aXRoIHRoZSBjb2RlLiAgQWxzbywgdHJ5IHJlYWRpbmcgc29tZSBvZiBvdXIgCisgICAgZG9jcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiAuL2RvY3MKKworKDQpIFRyeSBzb21lIG9mIHRoZSBvdGhlciB1dGlsaXRpZXM7IHlvdSBjYW4gYWxzbyBzZWUgYSBmZXcKKyAgICBleGFtcGxlcyBvZiBYTUxCZWFuIHRlY2huaXF1ZXMgaW4gdGhlaXIgc291cmNlIGNvZGUuCisKKyAgICAxLiAieHByZXR0eSBpbnN0YW5jZS54bWwiIHByZXR0eS1wcmludHMgYW4gWE1MIGluc3RhbmNlCisgICAgICAgZG9jdW1lbnQuCisKKyAgICAgICBUaGUgY29kZSBpcyBpbiB4bWwuYXBhY2hlLm9yZy50b29sLlByZXR0eVByaW50ZXIgYW5kIGlzCisgICAgICAgYSByZWFzb25hYmxlIGV4YW1wbGUgb2YgaG93IHRvIGxvYWQgYW5kIHNhdmUgb3V0IGFuCisgICAgICAgYXJiaXRyYXJ5IFhNTCBkb2N1bWVudC4gIFhtbE9wdGlvbnMgYXJlIHVzZWQgdG8gcHJvZHVjZQorICAgICAgIHRoZSBwcmV0dHktcHJpbnRpbmcuCisKKyAgICAyLiAidmFsaWRhdGUgaW5zdGFuY2UueG1sIHNjaGVtYS54c2QiIHdpbGwgdmFsaWRhdGUgdGhlCisgICAgICAgaW5zdGFuY2UgYWdhaW5zdCB0aGUgc2NoZW1hLiAgWE1MQmVhbnMgaXMgaW50ZW5kZWQgdG8KKyAgICAgICBiZSBhIHZlcnkgYWNjdXJhdGUgWE1MIHNjaGVtYSB2YWxpZGF0b3IuCisKKyAgICAgICBUaGUgY29kZSBpcyBpbiB4bWwuYXBhY2hlLm9yZy50b29sLkluc3RhbmNlVmFsaWRhdG9yLgorICAgICAgIEl0IGlzIGFuIGV4Y2VsbGVudCBleGFtcGxlIG9mIGhvdyB0byBsb2FkIGEgc2NoZW1hCisgICAgICAgdHlwZSBzeXN0ZW0gZHluYW1pY2FsbHkgYXQgcnVudGltZSwgbG9hZCBhbmQgdmFsaWRhdGUKKyAgICAgICBhbiBpbnN0YW5jZSB3aXRoaW4gdGhhdCB0eXBlIHN5c3RlbSwgYW5kIGhvdyB0byBvYnRhaW4KKyAgICAgICBsaXN0cyBvZiBhbmQgbG9jYXRpb25zIGZvciB2YWxpZGF0aW9uIGVycm9ycy4KKworICAgIDMuICJ4c2R0cmVlIGVhc3lwbyIgd2lsbCBzaG93IHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAgICAgICBvZiB0aGUgc2NoZW1hIHR5cGVzIGluIHRoYXQgZGlyZWN0b3J5LgorCisgICAgICAgVGhlIGNvZGUgaXMgaW4geG1sLmFwYWNoZS5vcmcudG9vbC5UeXBlSGllcmFyY2h5UHJpbnRlcgorICAgICAgIGFuZCBpcyBhIGdvb2QgaW50cm9kdWN0aW9uIHRvIGhvdyB0byB0cmF2ZXJzZSB0aGUKKyAgICAgICBtZXRhZGF0YSBpbiBhIHNjaGVtYSB0eXBlIHN5c3RlbS4KKworICAgIDQuICJkdW1weHNiIHhiZWFuLmphciIgb3IgImR1bXB4c2IgbXlmaWxlLnhzYiIgd2lsbCBkdW1wCisgICAgICAgdGhlIGNvbnRlbnRzIG9mICJ4c2IiIChiaW5hcnkgc2NoZW1hIG1ldGFkYXRhKSBmaWxlcworICAgICAgIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybS4gIFRoZXNlIC54c2IgZmlsZXMgY29udGFpbgorICAgICAgIHRoZSBjb21waWxlZCBtZXRhZGF0YSByZXN1bHRpbmcgZnJvbSB0aGUgLnhzZCBmaWxlcworICAgICAgIG9mIGEgdHlwZSBzeXN0ZW0uICBUaGV5IGFyZSBhbmFsb2dvdXMgdG8gLmNsYXNzIGZpbGVzCisgICAgICAgZm9yIC5qYXZhLgorCg==